From d5d8091f8d744418f8723fd7c59f60909556b9f2 Mon Sep 17 00:00:00 2001
From: mage2-team <mage2-team@magento.com>
Date: Fri, 21 Feb 2014 09:01:01 -0800
Subject: [PATCH] 2.0.0.0-dev66 * GitHub requests:   * [#134]
 (https://github.com/magento/magento2/pull/134) Fixed a typo in "Vorarlberg"
 region of Austria (was Voralberg) * Fixed bugs:   * Fixed an issue with the
 "Add to Cart" button on the MAP popup of compound products   * Fixed an issue
 where the "Add Address" button for Customer in Admin was broken   * Fixed an
 issue where predefined data are not loaded for a newsletter when it is added
 to a queue * Indexer implementation:   * Implemented a new optimized Catalog
 Category Product Indexer   * Implemented a new optimized Catalog Category
 Flat Indexer   * Implemented a new optimized Catalog Product Flat Indexer *
 Modularity improvements:   * Moved all Configurable Product functionality to
 a newly created ConfigurableProduct module   * Moved the Shortcut Buttons
 abstraction from PayPal to Catalog   * Moved the Recurring profile
 functionality to a separate module   * Moved the Billing Agreements
 functionality to the PayPal module   * Finalized the work on resolving
 dependencies between the Multishipping module, and all other modules. Module
 can be removed without any impact on the system * Customer Service usage:  *
 Updated Customer Group Grid to use Customer Service for data retrieving and
 filtering  * Updated CustomerMetadataService::getAttributeMetadata to throw
 an exception if invalid code is provided * Unified the format of specifying
 arguments for class constructors in DI and in Layout configuration:   * A
 common xsd schema is being used for defining simple types. Layout and DI
 customize common types with their specific ones   * Argument processing is
 unified, and moved to library

---
 CHANGELOG.md                                  |   27 +-
 .../Magento/AdminNotification/Block/Inbox.php |    6 +
 .../Block/System/Messages.php                 |    2 +
 .../System/Messages/UnreadMessagePopup.php    |   14 +-
 .../AdminNotification/Block/ToolbarEntry.php  |    3 +-
 .../Controller/Adminhtml/Notification.php     |   22 +-
 .../Controller/Adminhtml/Survey.php           |    7 +-
 .../Controller/Adminhtml/System/Message.php   |    4 +-
 .../Magento/AdminNotification/Helper/Data.php |   11 +-
 .../Model/Config/Source/Frequency.php         |    7 +-
 .../Magento/AdminNotification/Model/Feed.php  |   12 +-
 .../Magento/AdminNotification/Model/Inbox.php |   33 +-
 .../Model/NotificationService.php             |    4 +-
 .../AdminNotification/Model/Observer.php      |    5 +-
 .../Model/Resource/Inbox.php                  |    8 +-
 .../Resource/Inbox/Collection/Critical.php    |    7 +-
 .../Resource/System/Message/Collection.php    |    9 +-
 .../AdminNotification/Model/Survey.php        |    1 +
 .../Model/System/MessageList.php              |    1 +
 .../AdminNotification/etc/adminhtml/di.xml    |   22 +-
 .../Block/Authorizenet/Form/Cc.php            |    9 +-
 .../Block/Authorizenet/Info/Cc.php            |    8 +-
 .../Authorizenet/Block/Directpost/Form.php    |   11 +-
 .../Authorizenet/Directpost/Payment.php       |    6 +-
 .../Adminhtml/Authorizenet/Payment.php        |   10 +-
 .../Controller/Authorizenet/Payment.php       |    5 +-
 .../Controller/Directpost/Payment.php         |   16 +-
 .../Magento/Authorizenet/Helper/Backend.php   |   10 +-
 app/code/Magento/Authorizenet/Helper/Data.php |   10 +-
 .../Authorizenet/Model/Authorizenet.php       |  136 +-
 .../Authorizenet/Model/Authorizenet/Cards.php |   19 +-
 .../Authorizenet/Model/Authorizenet/Debug.php |    9 +-
 .../Model/Authorizenet/Source/Cctype.php      |   10 +-
 .../Authorizenet/Source/PaymentAction.php     |    8 +-
 .../Magento/Authorizenet/Model/Directpost.php |   69 +-
 .../Model/Directpost/Observer.php             |   13 +-
 .../Authorizenet/Model/Directpost/Request.php |   18 +-
 .../Authorizenet/Model/Directpost/Session.php |    3 +-
 .../Model/Resource/Authorizenet/Debug.php     |    9 +-
 .../Authorizenet/Debug/Collection.php         |    9 +-
 .../Magento/Authorizenet/etc/adminhtml/di.xml |   20 +-
 app/code/Magento/Authorizenet/etc/di.xml      |   24 +-
 .../Magento/Authorizenet/etc/frontend/di.xml  |   30 +-
 .../Magento/Authz/Model/UserIdentifier.php    |   11 +-
 .../Magento/Authz/Model/UserLocator/Admin.php |    5 +-
 .../Magento/Authz/Service/AuthorizationV1.php |   34 +-
 .../Service/AuthorizationV1Interface.php      |    4 +-
 .../Backend/App/Router/DefaultRouter.php      |    7 -
 .../Widget/Grid/Massaction/Additional.php     |   28 +-
 app/code/Magento/Backend/etc/adminhtml/di.xml |  118 +-
 app/code/Magento/Backend/etc/di.xml           |  198 ++-
 .../Magento/Backup/Block/Adminhtml/Backup.php |   16 +-
 .../Backup/Block/Adminhtml/Dialogs.php        |   10 +-
 .../Backup/Controller/Adminhtml/Index.php     |   15 +-
 app/code/Magento/Backup/Helper/Data.php       |   19 +-
 app/code/Magento/Backup/Model/Backup.php      |   31 +-
 .../Backup/Model/Config/Backend/Cron.php      |    5 +-
 .../Backup/Model/Config/Source/Type.php       |    9 +-
 app/code/Magento/Backup/Model/Db.php          |   41 +-
 .../Magento/Backup/Model/Fs/Collection.php    |    5 +-
 app/code/Magento/Backup/Model/Resource/Db.php |   32 +-
 .../Magento/Backup/Model/Resource/Helper.php  |    7 +-
 app/code/Magento/Backup/etc/di.xml            |   14 +-
 .../Product/Attribute/Source/Price/View.php   |   11 +-
 .../Magento/Bundle/Model/Product/Type.php     |    2 +-
 .../Bundle/Model/Resource/Indexer/Price.php   |    2 +-
 .../Bundle/Model/Resource/Indexer/Stock.php   |    2 +-
 app/code/Magento/Bundle/etc/adminhtml/di.xml  |   19 +-
 app/code/Magento/Bundle/etc/di.xml            |   38 +-
 .../sql/bundle_setup/install-1.6.0.0.php      |    5 -
 .../adminhtml/layout/catalog_product_new.xml} |    4 +-
 .../adminhtml/product/stock/disabler.phtml    |   34 +
 .../Captcha/Block/Captcha/DefaultCaptcha.php  |    8 +-
 .../Captcha/Controller/Adminhtml/Refresh.php  |    7 +-
 .../Magento/Captcha/Controller/Refresh.php    |    7 +-
 app/code/Magento/Captcha/Model/Cron.php       |    5 +-
 .../Magento/Captcha/Model/DefaultModel.php    |   19 +-
 .../Magento/Captcha/Model/ModelInterface.php  |    3 +-
 app/code/Magento/Captcha/Model/Observer.php   |   22 +-
 .../Magento/Captcha/Model/Resource/Log.php    |   10 +-
 app/code/Magento/Captcha/etc/adminhtml/di.xml |   18 +-
 app/code/Magento/Captcha/etc/di.xml           |   14 +-
 .../Product/Attribute/Edit/Tab/Advanced.php   |    9 +-
 .../Adminhtml/Product/Attribute/Set/Main.php  |   46 +-
 .../Block/Adminhtml/Product/Created.php       |  194 ---
 .../Catalog/Block/Adminhtml/Product/Edit.php  |   24 -
 .../Adminhtml/Product/Edit/Tab/Crosssell.php  |    6 +-
 .../Adminhtml/Product/Edit/Tab/Inventory.php  |   12 -
 .../Adminhtml/Product/Edit/Tab/Related.php    |    6 +-
 .../Adminhtml/Product/Edit/Tab/Upsell.php     |    6 +-
 .../Block/Adminhtml/Product/Edit/Tabs.php     |    1 -
 .../Catalog/Block/Adminhtml/Product/Grid.php  |    6 +-
 .../Config/Form/Field/Select/Flatproduct.php  |   75 -
 .../Catalog/Block/Product/View/Options.php    |    6 +-
 .../Catalog/Controller/Adminhtml/Product.php  |  343 +---
 .../Adminhtml/Product/Action/Attribute.php    |   19 +-
 .../Adminhtml/Product/Attribute.php           |   14 -
 .../Controller/Adminhtml/Product/Builder.php  |  111 ++
 .../Initialization/Helper/HandlerFactory.php} |   49 +-
 .../Helper/HandlerInterface.php               |   34 +
 .../Helper/Plugin/Handler/Composite.php       |   63 +
 .../Catalog/Helper/Flat/AbstractFlat.php      |   11 +-
 app/code/Magento/Catalog/Helper/Product.php   |   12 -
 .../Catalog/Helper/Product/Configuration.php  |   41 -
 .../Magento/Catalog/Helper/Product/Flat.php   |   40 +-
 .../Catalog/Helper/Product/Flat/Indexer.php   |  490 ++++++
 .../Attribute/LockValidatorComposite.php}     |   58 +-
 .../Attribute/LockValidatorInterface.php      |   41 +
 app/code/Magento/Catalog/Model/Category.php   |   32 +-
 .../Model/Category/Indexer/Product.php        |  267 ---
 .../Catalog/Model/Entity/Attribute.php        |   22 +-
 .../Attribute/Group/AttributeMapper.php       |   69 +
 .../Group/AttributeMapperInterface.php        |   39 +
 app/code/Magento/Catalog/Model/Index.php      |   90 -
 .../Indexer/Category/Flat/Action/Rows.php     |    7 +-
 .../Category/Flat/Plugin/StoreGroup.php       |   58 +-
 .../Category/Flat/Plugin/StoreView.php        |   21 +-
 .../Model/Indexer/Category/Product.php        |  123 ++
 .../Category/Product/AbstractAction.php       |  609 +++++++
 .../Indexer/Category/Product/Action/Full.php  |  108 ++
 .../Indexer/Category/Product/Action/Rows.php  |  126 ++
 .../Category/Product/Action/RowsFactory.php   |   77 +
 .../Category/Product/Plugin/IndexerState.php  |   74 +
 .../Category/Product/Plugin/MviewState.php    |   99 ++
 .../Plugin/StoreGroup.php}                    |   42 +-
 .../Category/Product/Plugin/StoreView.php     |   38 +
 .../Model/Indexer/Product/Category.php        |   46 +
 .../Indexer/Product/Category/Action/Rows.php  |  111 ++
 .../Product/Category/Action/RowsFactory.php   |   44 +
 .../Catalog/Model/Indexer/Product/Flat.php    |   96 ++
 .../Indexer/Product/Flat/AbstractAction.php   | 1215 ++++++++++++++
 .../Indexer/Product/Flat/Action/Full.php      |   54 +
 .../Model/Indexer/Product/Flat/Action/Row.php |   55 +
 .../Indexer/Product/Flat/Action/Rows.php      |   96 ++
 .../Indexer/Product/Flat/Plugin/Import.php    |   56 +
 .../Product/Flat/Plugin/IndexerConfigData.php |   71 +
 .../Indexer/Product/Flat/Plugin/Store.php     |   60 +
 .../Product/Flat/Plugin/StoreGroup.php        |   60 +
 .../Model/Indexer/Product/Flat/Processor.php  |  115 ++
 .../Product/Flat/System/Config/Mode.php}      |   42 +-
 .../Magento/Catalog/Model/Indexer/Url.php     |    6 +-
 app/code/Magento/Catalog/Model/Observer.php   |   26 -
 app/code/Magento/Catalog/Model/Product.php    |   73 +-
 .../Magento/Catalog/Model/Product/Action.php  |   27 +
 .../Catalog/Model/Product/Attribute/Group.php |   20 -
 .../Attribute/Source/Msrp/Type/Enabled.php    |   13 +-
 .../Attribute/Source/Msrp/Type/Price.php      |    9 +-
 .../Model/Product/Attribute/Source/Status.php |  161 ++
 .../Model/Product/CartConfiguration.php       |    2 -
 .../Magento/Catalog/Model/Product/Copier.php  |    2 +-
 .../Catalog/Model/Product/Flat/Flag.php       |  102 --
 .../Catalog/Model/Product/Flat/Indexer.php    |  348 ----
 .../Catalog/Model/Product/Flat/Observer.php   |  325 ----
 .../Catalog/Model/Product/Indexer/Flat.php    |  465 ------
 .../Model/Product/PriceModifier/Composite.php |   70 +
 .../Model/Product/PriceModifierInterface.php  |   40 +
 .../Magento/Catalog/Model/Product/Status.php  |  357 ----
 .../Magento/Catalog/Model/Product/Type.php    |    1 -
 .../Model/Product/Type/AbstractType.php       |    6 +-
 .../Model/Product/TypeTransitionManager.php   |   63 +
 .../Model/Product/Validator.php}              |   30 +-
 .../Catalog/Model/Product/Visibility.php      |   11 +-
 .../Catalog/Model/ProductTypes/Config.php     |   19 +
 .../Model/ProductTypes/ConfigInterface.php    |   10 +
 .../Catalog/Model/Resource/Attribute.php      |   55 +-
 .../Catalog/Model/Resource/Category.php       |    1 +
 .../Resource/Category/Indexer/Product.php     | 1152 -------------
 .../Catalog/Model/Resource/Eav/Attribute.php  |   77 +-
 .../Catalog/Model/Resource/Product.php        |  197 +--
 .../Model/Resource/Product/Collection.php     |    6 +-
 .../Collection/AssociatedProductUpdater.php   |   73 -
 .../Catalog/Model/Resource/Product/Flat.php   |    7 +-
 .../Model/Resource/Product/Flat/Indexer.php   | 1441 -----------------
 .../Resource/Product/Indexer/Eav/Decimal.php  |    2 +-
 .../Resource/Product/Indexer/Eav/Source.php   |    7 +-
 .../Product/Indexer/Price/DefaultPrice.php    |    2 +-
 .../Catalog/Model/Resource/Product/Status.php |  251 ---
 .../Model/Resource/Product/Website.php        |   38 +-
 .../Magento/Catalog/Model/Resource/Setup.php  |   79 +-
 .../Model/Resource/Setup/PropertyMapper.php   |   64 +
 .../data-upgrade-1.6.0.0.19-1.6.0.0.20.php    |    2 +-
 app/code/Magento/Catalog/etc/adminhtml/di.xml |   84 +-
 .../Magento/Catalog/etc/adminhtml/system.xml  |    3 +-
 app/code/Magento/Catalog/etc/config.xml       |    3 +
 app/code/Magento/Catalog/etc/crontab.xml      |    3 +
 app/code/Magento/Catalog/etc/di.xml           |  257 +--
 .../Magento/Catalog/etc/eav_attributes.xml    |    2 -
 app/code/Magento/Catalog/etc/events.xml       |    3 -
 app/code/Magento/Catalog/etc/frontend/di.xml  |   46 +-
 app/code/Magento/Catalog/etc/indexer.xml      |   12 +
 app/code/Magento/Catalog/etc/indexers.xml     |    2 -
 app/code/Magento/Catalog/etc/module.xml       |    5 +-
 app/code/Magento/Catalog/etc/mview.xml        |   27 +
 .../Magento/Catalog/etc/product_types.xml     |    9 +-
 app/code/Magento/Catalog/i18n/de_DE.csv       |   13 -
 app/code/Magento/Catalog/i18n/en_US.csv       |   13 -
 app/code/Magento/Catalog/i18n/es_ES.csv       |   13 -
 app/code/Magento/Catalog/i18n/fr_FR.csv       |   13 -
 app/code/Magento/Catalog/i18n/nl_NL.csv       |   13 -
 app/code/Magento/Catalog/i18n/pt_BR.csv       |   13 -
 app/code/Magento/Catalog/i18n/zh_CN.csv       |   13 -
 .../sql/catalog_setup/install-1.6.0.0.php     |  246 +--
 .../upgrade-1.6.0.0-1.6.0.0.1.php             |    1 -
 .../upgrade-1.6.0.0.1-1.6.0.0.2.php           |    3 +-
 .../upgrade-1.6.0.0.17-1.6.0.0.18.php         |    1 -
 .../upgrade-1.6.0.0.6-1.6.0.0.7.php           |    8 +-
 .../upgrade-1.6.0.0.7-1.6.0.0.8.php           |    2 +-
 .../upgrade-1.6.0.0.9-1.6.0.0.10.php          |    2 +-
 .../upgrade-1.6.0.24-1.6.0.0.25.php           |   31 +
 .../upgrade-1.6.0.25-1.6.0.0.26.php           |   50 +
 .../Catalog/view/adminhtml/catalog/product.js |   11 -
 .../catalog/product/attribute/js.phtml        |   25 +-
 .../catalog/product/attribute/set/main.phtml  |   34 +-
 .../catalog/product/composite/configure.phtml |    2 +-
 .../adminhtml/catalog/product/created.phtml   |   59 -
 .../view/adminhtml/catalog/product/edit.phtml |    3 -
 .../adminhtml/layout/catalog_product_new.xml  |    8 -
 .../layout/catalog_product_set_edit.xml       |   32 +
 .../view/adminhtml/product/product.css        |  295 ----
 .../Magento/Catalog/view/frontend/js/msrp.js  |    2 +-
 .../Block/Adminhtml/Form/Field/Stock.php      |   37 +-
 .../CatalogInventory/Model/Observer.php       |  346 +---
 .../Model/Quote/Item/QuantityValidator.php    |  233 +++
 .../QuantityValidator/Initializer/Option.php  |  112 ++
 .../Initializer/StockItem.php                 |  140 ++
 .../QuantityValidator/QuoteItemQtyList.php    |   60 +
 .../Resource/Indexer/Stock/DefaultStock.php   |    2 +-
 .../Model/Resource/Stock/Status.php           |   88 +-
 .../CatalogInventory/Model/Stock/Status.php   |   58 +-
 .../CatalogInventory/etc/adminhtml/di.xml     |   12 +-
 app/code/Magento/CatalogInventory/etc/di.xml  |   42 +-
 .../Magento/CatalogInventory/etc/events.xml   |    2 +-
 .../CatalogInventory/etc/product_types.xml    |    3 -
 .../catalog_product_superconfig_config.xml    |   57 -
 .../Magento/CatalogRule/Model/Observer.php    |   23 -
 .../Model/Product/PriceModifier.php}          |   56 +-
 .../Magento/CatalogRule/etc/adminhtml/di.xml  |   12 +-
 app/code/Magento/CatalogRule/etc/di.xml       |   39 +-
 app/code/Magento/CatalogRule/etc/events.xml   |    3 -
 .../CatalogSearch/Model/Indexer/Fulltext.php  |    2 +-
 .../CatalogSearch/Model/Resource/Fulltext.php |    6 +-
 .../CatalogSearch/etc/adminhtml/di.xml        |   18 +-
 app/code/Magento/CatalogSearch/etc/di.xml     |    8 +-
 .../Magento/CatalogSearch/etc/frontend/di.xml |   18 +-
 .../Magento/Centinel/etc/adminhtml/di.xml     |   32 +-
 app/code/Magento/Centinel/etc/di.xml          |   18 +-
 app/code/Magento/Centinel/etc/frontend/di.xml |   34 +-
 app/code/Magento/Checkout/Helper/Data.php     |   23 -
 .../Magento/Checkout/Model/Resource/Setup.php |   23 +-
 .../Magento/Checkout/etc/adminhtml/di.xml     |    8 +-
 .../Magento/Checkout/etc/adminhtml/system.xml |    4 -
 app/code/Magento/Checkout/etc/config.xml      |    1 -
 app/code/Magento/Checkout/etc/di.xml          |   24 +-
 app/code/Magento/Checkout/etc/frontend/di.xml |   28 +-
 app/code/Magento/Checkout/i18n/de_DE.csv      |    1 -
 app/code/Magento/Checkout/i18n/en_US.csv      |    1 -
 app/code/Magento/Checkout/i18n/es_ES.csv      |    1 -
 app/code/Magento/Checkout/i18n/fr_FR.csv      |    1 -
 app/code/Magento/Checkout/i18n/nl_NL.csv      |    1 -
 app/code/Magento/Checkout/i18n/pt_BR.csv      |    1 -
 app/code/Magento/Checkout/i18n/zh_CN.csv      |    1 -
 .../layout/checkout_cart_item_renderers.xml   |    1 -
 .../checkout_cart_sidebar_item_renderers.xml  |    1 -
 ...checkout_onepage_review_item_renderers.xml |    1 -
 .../Magento/Cms/Block/Adminhtml/Block.php     |    6 +-
 .../Cms/Block/Adminhtml/Block/Edit.php        |    9 +-
 .../Cms/Block/Adminhtml/Block/Edit/Form.php   |   17 +-
 .../Block/Adminhtml/Block/Widget/Chooser.php  |   10 +-
 app/code/Magento/Cms/Block/Adminhtml/Page.php |    6 +-
 .../Magento/Cms/Block/Adminhtml/Page/Edit.php |    6 +-
 .../Cms/Block/Adminhtml/Page/Edit/Form.php    |    9 +-
 .../Block/Adminhtml/Page/Edit/Tab/Content.php |   10 +-
 .../Block/Adminhtml/Page/Edit/Tab/Design.php  |   12 +-
 .../Block/Adminhtml/Page/Edit/Tab/Main.php    |   16 +-
 .../Block/Adminhtml/Page/Edit/Tab/Meta.php    |   16 +-
 .../Cms/Block/Adminhtml/Page/Edit/Tabs.php    |    6 +-
 .../Magento/Cms/Block/Adminhtml/Page/Grid.php |   31 +-
 .../Adminhtml/Page/Grid/Renderer/Action.php   |    7 +-
 .../Block/Adminhtml/Page/Widget/Chooser.php   |   12 +-
 .../Adminhtml/Wysiwyg/Images/Content.php      |    5 +-
 .../Wysiwyg/Images/Content/Files.php          |    3 +-
 .../Wysiwyg/Images/Content/Newfolder.php      |    3 +-
 .../Wysiwyg/Images/Content/Uploader.php       |    7 +-
 .../Block/Adminhtml/Wysiwyg/Images/Tree.php   |    4 +-
 app/code/Magento/Cms/Block/Page.php           |    8 +-
 app/code/Magento/Cms/Block/Widget/Block.php   |    6 +-
 .../Magento/Cms/Block/Widget/Page/Link.php    |    4 +-
 .../Cms/Controller/Adminhtml/Block.php        |   16 +-
 .../Cms/Controller/Adminhtml/Block/Widget.php |    6 +-
 .../Magento/Cms/Controller/Adminhtml/Page.php |   20 +-
 .../Cms/Controller/Adminhtml/Page/Widget.php  |    6 +-
 .../Cms/Controller/Adminhtml/Wysiwyg.php      |    7 +-
 .../Controller/Adminhtml/Wysiwyg/Images.php   |   38 +-
 app/code/Magento/Cms/Controller/Index.php     |   11 +-
 app/code/Magento/Cms/Controller/Noroute.php   |    2 +
 app/code/Magento/Cms/Controller/Page.php      |    5 +-
 app/code/Magento/Cms/Controller/Router.php    |    4 +-
 app/code/Magento/Cms/Helper/Page.php          |   28 +-
 .../Magento/Cms/Helper/Wysiwyg/Images.php     |   12 +-
 app/code/Magento/Cms/Model/Block.php          |   11 +-
 .../Magento/Cms/Model/Config/Source/Page.php  |    3 +
 .../Model/Config/Source/Wysiwyg/Enabled.php   |    6 +-
 app/code/Magento/Cms/Model/Observer.php       |    8 +-
 app/code/Magento/Cms/Model/Page.php           |   13 +-
 .../Magento/Cms/Model/Page/Urlrewrite.php     |    4 +-
 app/code/Magento/Cms/Model/Resource/Block.php |   13 +-
 .../Cms/Model/Resource/Block/Collection.php   |    9 +-
 app/code/Magento/Cms/Model/Resource/Page.php  |   28 +-
 .../Cms/Model/Resource/Page/Collection.php    |   13 +-
 .../Cms/Model/Resource/Page/Service.php       |    6 +-
 .../Cms/Model/Resource/Page/Urlrewrite.php    |    4 +-
 app/code/Magento/Cms/Model/Resource/Setup.php |   11 +-
 .../Magento/Cms/Model/Template/Filter.php     |    6 +-
 app/code/Magento/Cms/Model/Wysiwyg/Config.php |    3 +-
 .../Cms/Model/Wysiwyg/Images/Storage.php      |   14 +-
 .../Wysiwyg/Images/Storage/Collection.php     |    9 +-
 app/code/Magento/Cms/etc/di.xml               |   92 +-
 app/code/Magento/Cms/etc/frontend/di.xml      |   22 +-
 .../Attribute/Edit/Tab/Advanced/Observer.php  |   61 +
 .../Attribute/Edit/Tab/Variations/Main.php    |   11 +-
 .../NewAttribute/Product/Created.php          |    4 +-
 .../Composite/Fieldset/Configurable.php       |   12 +-
 .../Product/Edit/Tab/Super/Config.php         |   93 +-
 .../Edit/Tab/Super/Config/Attribute.php       |    8 +-
 .../Super/Config/Grid/Filter/Inventory.php    |    6 +-
 .../Super/Config/Grid/Renderer/Checkbox.php   |   28 +-
 .../Super/Config/Grid/Renderer/Inventory.php  |    6 +-
 .../Product/Edit/Tab/Super/Config/Matrix.php  |   13 +-
 .../Product/Edit/Tab/Super/Config/Simple.php  |   22 +-
 .../Product/Edit/Tab/Super/Settings.php       |   15 +-
 .../Product/Edit/Tabs/Configurable.php        |   18 +-
 .../Block/Cart/Item/Renderer/Configurable.php |    6 +-
 .../Backend/Grid/ColumnSet.php                |   23 +-
 .../AssociatedSelector/Renderer/Id.php        |   18 +-
 .../Configurable/AttributeSelector.php        |   57 +
 .../Block/Product/View/Type/Configurable.php  |   36 +-
 .../Block/Stockqty/Type/Configurable.php      |   17 +-
 .../Controller/Adminhtml/Product.php          |   60 +
 .../SuggestConfigurableAttributes.php         |   76 +
 .../Adminhtml/Product/Builder/Plugin.php      |  115 ++
 .../Adminhtml/Product/GenerateVariations.php  |  134 ++
 .../Helper/Plugin/Configurable.php            |   11 +-
 .../Handler/ProductType/Configurable.php      |   79 +
 .../Adminhtml/Product/SuperConfig.php         |   56 +
 .../Helper/Product/Configuration/Plugin.php   |   50 +
 .../Model/Attribute/LockValidator.php         |   79 +
 .../Group/AttributeMapper/Plugin.php          |   79 +
 .../Entity/Product/Type/Configurable.php      |   11 +-
 .../Model/Export/RowCustomizer.php            |  122 ++
 .../Entity/Product/Type/Configurable.php      |   38 +-
 .../Order/Admin/Item/Plugin/Configurable.php  |  104 ++
 .../CartConfiguration/Plugin/Configurable.php |   51 +
 .../Model/Product/Type/Configurable.php       |   79 +-
 .../Product/Type/Configurable/Attribute.php   |   29 +-
 .../Model/Product/Type/Configurable/Price.php |   54 +-
 .../Model/Product/Type/Plugin.php             |   57 +
 .../Plugin/Configurable.php                   |   66 +
 .../Model/Product/Validator/Plugin.php        |  134 ++
 .../Option/Plugin/ConfigurableProduct.php     |   53 +
 .../Resource/Indexer/Stock/Configurable.php   |   37 +-
 .../Product/Collection/AssociatedProduct.php  |   44 +-
 .../Product/Indexer/Price/Configurable.php    |   26 +-
 .../Resource/Product/Type/Configurable.php    |   14 +-
 .../Product/Type/Configurable/Attribute.php   |   26 +-
 .../Configurable/Attribute/Collection.php     |   26 +-
 .../Type/Configurable/Product/Collection.php  |   16 +-
 .../Model/Resource/Setup/PropertyMapper.php   |   46 +
 .../Model/SuggestedAttributeList.php}         |   50 +-
 .../data-install-1.0.0.0.php                  |   55 +
 .../ConfigurableProduct/etc/adminhtml/di.xml  |   48 +
 .../etc/adminhtml/events.xml                  |    9 +-
 .../etc/adminhtml/routes.xml                  |    8 +-
 .../etc/adminhtml/system.xml                  |   37 +
 .../ConfigurableProduct/etc/config.xml        |   34 +
 .../Magento/ConfigurableProduct/etc/di.xml    |   88 +
 .../etc/eav_attributes.xml                    |   35 +
 .../ConfigurableProduct/etc/export.xml        |   28 +
 .../ConfigurableProduct/etc/import.xml        |   28 +
 .../ConfigurableProduct/etc/module.xml        |   52 +
 .../ConfigurableProduct/etc/product_types.xml |   35 +
 .../Magento/ConfigurableProduct/etc/sales.xml |   30 +
 .../ConfigurableProduct/i18n/de_DE.csv        |   16 +
 .../ConfigurableProduct/i18n/en_US.csv        |   17 +
 .../ConfigurableProduct/i18n/es_ES.csv        |   15 +
 .../ConfigurableProduct/i18n/fr_FR.csv        |   16 +
 .../ConfigurableProduct/i18n/nl_NL.csv        |   16 +
 .../ConfigurableProduct/i18n/pt_BR.csv        |   16 +
 .../ConfigurableProduct/i18n/zh_CN.csv        |   16 +
 .../configurable_setup/install-1.0.0.0.php    |  258 +++
 .../adminhtml/catalog/product-variation.js    |    2 -
 .../adminhtml/catalog/product/attribute.js    |   35 +
 .../catalog/product/attribute/js.phtml        |   50 +
 .../product/attribute/new/created.phtml       |    2 +-
 .../catalog/product/attribute/set/js.phtml    |   65 +
 .../composite/fieldset/configurable.phtml     |    4 +-
 .../edit/super/attribute-js-template.phtml    |    0
 .../edit/super/attribute-template.phtml       |    0
 .../catalog/product/edit/super/config.phtml   |    6 +-
 .../product/edit/super/generator.phtml        |    2 +-
 .../catalog/product/edit/super/matrix.phtml   |    2 +-
 .../view/adminhtml/js}/configurable.js        |    2 -
 .../layout/catalog_product_attribute_edit.xml |   30 +
 ...bute_edit_product_tab_variations_popup.xml |    2 +-
 .../layout/catalog_product_configurable.xml   |   10 +-
 .../layout/catalog_product_downloadable.xml}  |   10 +-
 ...alog_product_generatevariations_index.xml} |    8 +-
 .../adminhtml/layout/catalog_product_new.xml  |   47 +
 .../layout/catalog_product_set_edit.xml       |   33 +
 .../layout/catalog_product_simple.xml         |   10 +-
 .../catalog_product_superconfig_config.xml    |   29 +-
 .../catalog_product_superconfig_index.xml}    |    0
 ...catalog_product_view_type_configurable.xml |    2 +-
 .../layout/catalog_product_virtual.xml        |   10 +-
 .../view/adminhtml/layout/default.xml         |   39 +
 .../form.phtml                                |    2 -
 .../affected-attribute-set-selector/js.phtml  |    4 +-
 .../configurable/attribute-selector/js.phtml  |    4 +-
 .../product/configurable/stock/disabler.phtml |   34 +
 .../view/adminhtml/product/product.css        |  317 ++++
 .../view/frontend/js/configurable.js          |    2 -
 ...catalog_product_view_type_configurable.xml |    8 +-
 ...ckout_cart_configure_type_configurable.xml |    0
 .../layout/checkout_cart_item_renderers.xml   |   31 +
 .../checkout_cart_sidebar_item_renderers.xml  |   30 +
 ...checkout_onepage_review_item_renderers.xml |   30 +
 .../view/type/options/configurable.phtml      |    4 +-
 app/code/Magento/Connect/etc/di.xml           |   14 +-
 .../Magento/Contacts/Controller/Index.php     |    3 +
 app/code/Magento/Contacts/Helper/Data.php     |   15 +
 .../Model/System/Config/Backend/Links.php     |    2 +-
 app/code/Magento/Contacts/etc/frontend/di.xml |   12 +-
 app/code/Magento/Core/Model/App.php           |    4 +-
 app/code/Magento/Core/Model/Layout.php        |   46 +-
 .../Model/Layout/Argument/AbstractHandler.php |  137 --
 .../Layout/Argument/Handler/ArrayHandler.php  |  117 --
 .../Model/Layout/Argument/Handler/Helper.php  |  113 --
 .../Model/Layout/Argument/Handler/Object.php  |  107 --
 .../Model/Layout/Argument/Handler/Options.php |  108 --
 .../Model/Layout/Argument/Handler/String.php  |   97 --
 .../Model/Layout/Argument/Handler/Url.php     |  102 --
 .../Core/Model/Layout/Argument/Processor.php  |  108 --
 app/code/Magento/Core/Model/Layout/Merge.php  |    5 +
 .../Magento/Core/Model/Mview/View/State.php   |    5 +-
 .../Core/Model/Option/ArrayInterface.php      |   16 +-
 .../Core/Model/Resource/AbstractResource.php  |    2 +-
 app/code/Magento/Core/etc/di.xml              |  670 ++++----
 app/code/Magento/Core/etc/frontend/di.xml     |   42 +-
 app/code/Magento/Core/etc/layouts.xsd         |   64 +-
 app/code/Magento/Core/etc/types.xsd           |  123 --
 app/code/Magento/Cron/Model/Observer.php      |   25 +-
 .../Magento/Cron/etc/adminhtml/system.xml     |   14 +-
 app/code/Magento/Cron/etc/di.xml              |    8 +-
 .../Block/Adminhtml/System/Currency.php       |   43 +
 .../Adminhtml/System/Currency/Rate/Matrix.php |   19 +
 .../System/Currency/Rate/Services.php         |    2 +-
 .../Block/Adminhtml/System/Currencysymbol.php |    2 +
 .../Controller/Adminhtml/System/Currency.php  |   20 +-
 .../Adminhtml/System/Currencysymbol.php       |    8 +-
 .../Magento/CurrencySymbol/Model/Observer.php |    2 +-
 .../Model/System/Currencysymbol.php           |   20 +-
 .../Customer/Block/Account/Dashboard/Info.php |   25 +-
 .../Magento/Customer/Block/Adminhtml/Edit.php |    2 +-
 .../Block/Adminhtml/Edit/Tab/Addresses.php    |  102 +-
 .../Edit/Tab/View/Grid/Renderer/Item.php      |    2 +-
 .../Customer/Block/Widget/AbstractWidget.php  |    8 +-
 .../Magento/Customer/Block/Widget/Dob.php     |   30 +-
 .../Magento/Customer/Block/Widget/Gender.php  |    4 +-
 .../Magento/Customer/Block/Widget/Name.php    |   40 +-
 .../Magento/Customer/Block/Widget/Taxvat.php  |    4 +-
 .../Resource/Group/Grid/ServiceCollection.php |  126 +-
 .../Magento/Customer/Model/Resource/Setup.php |   45 +-
 .../Model/Resource/Setup/PropertyMapper.php   |   51 +
 .../Service/V1/CustomerGroupService.php       |  100 +-
 .../V1/CustomerGroupServiceInterface.php      |    5 +-
 .../Service/V1/CustomerMetadataService.php    |   44 +-
 .../V1/CustomerMetadataServiceInterface.php   |    5 +
 .../Customer/Service/V1/CustomerService.php   |   29 +-
 .../Customer/Service/V1/Dto/Filter.php        |    2 +-
 .../Customer/Service/V1/Dto/FilterBuilder.php |   22 +-
 .../V1/Dto/Search/AbstractFilterGroup.php     |   68 +
 .../Dto/Search/AbstractFilterGroupBuilder.php |   82 +
 .../Service/V1/Dto/Search/AndGroup.php}       |   24 +-
 .../Service/V1/Dto/Search/AndGroupBuilder.php |   16 +-
 .../V1/Dto/Search/FilterGroupInterface.php    |   53 +
 .../Service/V1/Dto/Search/OrGroup.php         |   41 +
 .../Service/V1/Dto/Search/OrGroupBuilder.php  |   35 +
 .../Service/V1/Dto/SearchCriteria.php         |   11 +-
 .../Service/V1/Dto/SearchCriteriaBuilder.php  |   51 +-
 .../Customer/Service/V1/Dto/SearchResults.php |    2 +-
 .../Magento/Customer/etc/adminhtml/di.xml     |   14 +-
 app/code/Magento/Customer/etc/di.xml          |   55 +-
 app/code/Magento/Customer/etc/frontend/di.xml |   30 +-
 .../adminhtml/layout/customer_index_edit.xml  |    5 -
 .../view/adminhtml/tab/addresses.phtml        |   25 +-
 .../DesignEditor/Model/AreaEmulator.php       |   36 +-
 app/code/Magento/DesignEditor/Model/State.php |   23 +-
 .../Magento/DesignEditor/etc/adminhtml/di.xml |    8 +-
 app/code/Magento/DesignEditor/etc/di.xml      |   24 +-
 .../Magento/DesignEditor/etc/frontend/di.xml  |   20 +-
 .../directory_setup/data-install-1.6.0.0.php  |    2 +-
 app/code/Magento/Directory/etc/di.xml         |   28 +-
 .../Magento/Downloadable/Model/Observer.php   |   28 -
 .../Plugin/Downloadable.php                   |   71 +
 .../Magento/Downloadable/etc/adminhtml/di.xml |   12 +-
 .../Downloadable/etc/adminhtml/events.xml     |    3 -
 app/code/Magento/Downloadable/etc/di.xml      |   32 +-
 .../Magento/Downloadable/etc/frontend/di.xml  |   14 +-
 .../downloadable_setup/install-1.6.0.0.php    |    4 -
 .../layout/catalog_product_downloadable.xml   |   10 -
 .../Eav/Model/Entity/AbstractEntity.php       |    4 -
 .../Entity/Attribute/AbstractAttribute.php    |    7 +-
 .../Model/Entity/Attribute/Config/Reader.php  |    6 +-
 .../Model/Entity/Attribute/Source/Boolean.php |   14 +-
 .../Model/Entity/Attribute/Source/Table.php   |   49 +-
 app/code/Magento/Eav/Model/Entity/Setup.php   |   63 +-
 .../Eav/Model/Entity/Setup/Context.php        |   77 +
 .../Eav/Model/Entity/Setup/PropertyMapper.php |   58 +
 .../Entity/Setup/PropertyMapper/Composite.php |   75 +
 .../Entity/Setup/PropertyMapperAbstract.php   |   45 +
 .../Entity/Setup/PropertyMapperInterface.php  |   38 +
 app/code/Magento/Eav/etc/di.xml               |   26 +-
 app/code/Magento/Eav/i18n/de_DE.csv           |    2 -
 app/code/Magento/Eav/i18n/en_US.csv           |    2 -
 app/code/Magento/Eav/i18n/es_ES.csv           |    2 -
 app/code/Magento/Eav/i18n/fr_FR.csv           |    2 -
 app/code/Magento/Eav/i18n/nl_NL.csv           |    2 -
 app/code/Magento/Eav/i18n/pt_BR.csv           |    2 -
 app/code/Magento/Eav/i18n/zh_CN.csv           |    2 -
 .../GiftMessage/Model/Resource/Setup.php      |   16 +-
 app/code/Magento/GiftMessage/etc/di.xml       |   12 +-
 .../sql/giftmessage_setup/install-1.6.0.0.php |    1 -
 app/code/Magento/GoogleCheckout/etc/di.xml    |   12 +-
 .../GoogleCheckout/etc/frontend/di.xml        |   16 +-
 .../googlecheckout_setup/install-1.6.0.0.php  |    1 -
 app/code/Magento/GoogleShopping/etc/di.xml    |   24 +-
 .../Model/Product/Type/Grouped.php            |   18 +-
 .../Model/Product/Type/Plugin.php             |    8 +-
 .../Model/Resource/Indexer/Stock/Grouped.php  |   30 +-
 .../GroupedProduct/etc/adminhtml/di.xml       |   19 +-
 app/code/Magento/GroupedProduct/etc/di.xml    |   54 +-
 .../GroupedProduct/etc/frontend/di.xml        |   34 +-
 .../GroupedProduct/etc/product_types.xml      |    1 +
 .../adminhtml/layout/catalog_product_new.xml  |   30 +
 .../adminhtml/product/stock/disabler.phtml    |   34 +
 .../Block/Adminhtml/Export/Edit/Form.php      |    2 +-
 .../Block/Adminhtml/Export/Filter.php         |   37 +-
 .../Block/Adminhtml/Import/Edit/Form.php      |    5 +-
 .../Block/Adminhtml/Import/Frame/Result.php   |   23 +-
 .../Controller/Adminhtml/Export.php           |    4 +-
 .../Controller/Adminhtml/Import.php           |   12 +-
 app/code/Magento/ImportExport/Helper/Data.php |    5 +-
 .../ImportExport/Model/AbstractModel.php      |   13 +-
 .../Magento/ImportExport/Model/Export.php     |   15 +-
 .../Model/Export/AbstractEntity.php           |   36 +-
 .../Model/Export/Adapter/AbstractAdapter.php  |   11 +-
 .../ImportExport/Model/Export/Adapter/Csv.php |   11 +-
 .../Model/Export/Entity/AbstractEav.php       |    9 +-
 .../Model/Export/Entity/AbstractEntity.php    |   37 +-
 .../Model/Export/Entity/Eav/Customer.php      |   13 +-
 .../Export/Entity/Eav/Customer/Address.php    |   17 +-
 .../Model/Export/Entity/Product.php           |  107 +-
 .../Entity/Product/Type/AbstractType.php      |   19 +-
 .../Export/Entity/Product/Type/Simple.php     |    5 +-
 .../Model/Export/RowCustomizer/Composite.php  |  110 ++
 .../Model/Export/RowCustomizerInterface.php   |   67 +
 .../Magento/ImportExport/Model/Import.php     |   27 +-
 .../Model/Import/AbstractEntity.php           |   41 +-
 .../Model/Import/AbstractSource.php           |   10 +-
 .../ImportExport/Model/Import/Adapter.php     |   18 +-
 .../Model/Import/Entity/AbstractEav.php       |   13 +-
 .../Model/Import/Entity/AbstractEntity.php    |   37 +-
 .../Model/Import/Entity/CustomerComposite.php |   18 +-
 .../Import/Entity/Eav/AbstractCustomer.php    |    8 +-
 .../Model/Import/Entity/Eav/Customer.php      |   17 +-
 .../Import/Entity/Eav/Customer/Address.php    |   26 +-
 .../Model/Import/Entity/Product.php           |   55 +-
 .../Model/Import/Entity/Product/Option.php    |   85 +-
 .../Entity/Product/Type/AbstractType.php      |   31 +-
 .../Import/Entity/Product/Type/Factory.php    |    3 +-
 .../Import/Entity/Product/Type/Simple.php     |    5 +-
 .../ImportExport/Model/Import/Source/Csv.php  |    5 +-
 .../ImportExport/Model/Import/Uploader.php    |   23 +-
 .../Resource/CollectionByPagesIterator.php    |    4 +-
 .../Model/Resource/Customer/Storage.php       |    8 +-
 .../Import/CustomerComposite/Data.php         |    5 +-
 .../Model/Resource/Import/Data.php            |    8 +-
 .../Model/Source/Export/Entity.php            |    7 +-
 .../Model/Source/Export/Format.php            |    7 +-
 .../Model/Source/Import/AbstractBehavior.php  |    3 +-
 .../Model/Source/Import/Behavior/Basic.php    |   11 +-
 .../Model/Source/Import/Behavior/Custom.php   |   11 +-
 .../Model/Source/Import/Entity.php            |    7 +-
 app/code/Magento/ImportExport/etc/di.xml      |    1 +
 app/code/Magento/ImportExport/etc/export.xml  |    1 -
 app/code/Magento/ImportExport/etc/import.xml  |    1 -
 .../importexport_setup/install-1.6.0.0.php    |   42 -
 .../Magento/Index/App/Shell/ErrorHandler.php  |    1 +
 app/code/Magento/Index/etc/adminhtml/di.xml   |   12 +-
 app/code/Magento/Index/etc/di.xml             |   12 +-
 app/code/Magento/Indexer/App/Indexer.php      |   16 +-
 .../Block/Backend/Grid/ItemsUpdater.php       |    2 +-
 app/code/Magento/Indexer/Model/Config.php     |    8 -
 app/code/Magento/Indexer/Model/Indexer.php    |   25 +-
 .../Magento/Indexer/Model/Indexer/State.php   |   27 +-
 app/code/Magento/Indexer/etc/di.xml           |   22 +-
 app/code/Magento/Install/etc/di.xml           |  166 +-
 app/code/Magento/Install/etc/frontend/di.xml  |   24 +-
 app/code/Magento/Install/etc/install/di.xml   |   20 +-
 .../Block/Adminhtml/Integration.php           |    2 +
 .../Integration/Activate/Permissions/Tabs.php |    6 +
 .../Block/Adminhtml/Integration/Edit.php      |    2 +-
 .../Block/Adminhtml/Integration/Edit/Form.php |    3 +-
 .../Adminhtml/Integration/Edit/Tab/Info.php   |    5 +-
 .../Block/Adminhtml/Integration/Edit/Tabs.php |    2 +-
 .../Block/Adminhtml/Integration/Tokens.php    |    3 +-
 .../Widget/Grid/Column/Renderer/Button.php    |    3 +-
 .../Grid/Column/Renderer/Button/Delete.php    |    1 -
 .../Grid/Column/Renderer/Button/Edit.php      |    1 -
 .../Widget/Grid/Column/Renderer/Link.php      |    1 -
 .../Grid/Column/Renderer/Link/Activate.php    |    1 -
 .../Controller/Adminhtml/Integration.php      |   26 +-
 .../Magento/Integration/Controller/Token.php  |    5 +-
 app/code/Magento/Integration/Helper/Data.php  |    3 +-
 .../Magento/Integration/Helper/Oauth/Data.php |    3 +-
 .../Magento/Integration/Model/Cache/Type.php  |    3 +-
 app/code/Magento/Integration/Model/Config.php |    2 -
 .../Magento/Integration/Model/Integration.php |    5 +-
 .../Integration/Model/Oauth/Consumer.php      |    5 +-
 .../Model/Oauth/Consumer/Factory.php          |    1 -
 .../Oauth/Consumer/Validator/KeyLength.php    |   11 +-
 .../Magento/Integration/Model/Oauth/Nonce.php |    5 +-
 .../Model/Oauth/Nonce/Generator.php           |   17 +-
 .../Magento/Integration/Model/Oauth/Token.php |   43 +-
 .../Model/Oauth/Token/Provider.php            |   17 +-
 .../Model/Resource/Integration/Collection.php |    2 +
 .../Model/Resource/Oauth/Consumer.php         |    5 +-
 .../Resource/Oauth/Consumer/Collection.php    |    3 +-
 .../Model/Resource/Oauth/Nonce.php            |    3 +-
 .../Model/Resource/Oauth/Nonce/Collection.php |    3 +-
 .../Model/Resource/Oauth/Token.php            |    6 +-
 .../Model/Resource/Oauth/Token/Collection.php |   17 +-
 .../Integration/Model/Resource/Setup.php      |   11 +-
 .../Integration/Service/IntegrationV1.php     |   12 +-
 .../Service/IntegrationV1Interface.php        |    2 +-
 .../Magento/Integration/Service/OauthV1.php   |   33 +-
 .../Integration/Service/OauthV1Interface.php  |    1 -
 app/code/Magento/Integration/etc/di.xml       |   14 +-
 app/code/Magento/Log/etc/di.xml               |   22 +-
 .../Multishipping/Block/Checkout/Link.php     |   30 +-
 .../Multishipping/Controller/Checkout.php     |    2 +-
 .../Magento/Multishipping/Helper/Data.php     |  110 ++
 .../Model/Checkout/Type/Multishipping.php     |   10 +-
 .../Multishipping/etc/adminhtml/acl.xml       |   40 +
 .../Multishipping/etc/adminhtml/system.xml    |   45 +
 app/code/Magento/Multishipping/etc/config.xml |   35 +
 .../Magento/Multishipping/etc/frontend/di.xml |   46 +-
 .../Block/Adminhtml/Queue/Edit/Form.php       |   23 +-
 .../Magento/Newsletter/etc/adminhtml/di.xml   |    8 +-
 app/code/Magento/Newsletter/etc/di.xml        |   24 +-
 .../Magento/Newsletter/etc/frontend/di.xml    |   18 +-
 app/code/Magento/Ogone/Block/Form.php         |    6 +-
 app/code/Magento/Ogone/Block/Info.php         |    8 +-
 app/code/Magento/Ogone/Block/Paypage.php      |    5 +-
 app/code/Magento/Ogone/Controller/Api.php     |   72 +-
 app/code/Magento/Ogone/Model/Api.php          |   56 +-
 app/code/Magento/Ogone/Model/Config.php       |   29 +-
 app/code/Magento/Ogone/etc/frontend/di.xml    |   12 +-
 app/code/Magento/Payment/Block/Form.php       |    3 +-
 .../Payment/Block/Form/Banktransfer.php       |    8 +-
 .../Payment/Block/Form/Cashondelivery.php     |    8 +-
 app/code/Magento/Payment/Block/Form/Cc.php    |   24 +-
 .../Magento/Payment/Block/Form/Ccsave.php     |    7 +-
 .../Magento/Payment/Block/Form/Checkmo.php    |    7 +-
 .../Magento/Payment/Block/Form/Container.php  |   28 +-
 .../Payment/Block/Form/Purchaseorder.php      |    8 +-
 app/code/Magento/Payment/Block/Info.php       |    8 +-
 .../Payment/Block/Info/AbstractContainer.php  |   13 +-
 app/code/Magento/Payment/Block/Info/Cc.php    |    3 +-
 .../Magento/Payment/Block/Info/Ccsave.php     |    2 +-
 .../Magento/Payment/Block/Info/Checkmo.php    |   17 +-
 .../Payment/Block/Info/Instructions.php       |    6 +-
 .../Payment/Block/Info/Purchaseorder.php      |    8 +-
 app/code/Magento/Payment/Exception.php        |   14 +-
 app/code/Magento/Payment/Helper/Data.php      |   56 +-
 app/code/Magento/Payment/Model/Cart.php       |   28 +-
 .../Payment/Model/Cart/SalesModel/Factory.php |    3 +-
 .../Payment/Model/Cart/SalesModel/Order.php   |   24 +-
 .../Payment/Model/Cart/SalesModel/Quote.php   |   25 +-
 .../Cart/SalesModel/SalesModelInterface.php   |    3 +-
 app/code/Magento/Payment/Model/Config.php     |   18 +-
 .../Model/Config/Source/Allmethods.php        |    4 +-
 .../Model/Config/Source/Allowedmethods.php    |    6 +-
 .../Config/Source/Allspecificcountries.php    |    5 +-
 .../Payment/Model/Config/Source/Cctype.php    |    4 +-
 app/code/Magento/Payment/Model/Info.php       |   25 +-
 .../Magento/Payment/Model/Info/Exception.php  |    4 +-
 .../Payment/Model/Method/AbstractMethod.php   |  144 +-
 .../Payment/Model/Method/Banktransfer.php     |   10 +-
 .../Payment/Model/Method/Cashondelivery.php   |    9 +-
 app/code/Magento/Payment/Model/Method/Cc.php  |   37 +-
 .../Magento/Payment/Model/Method/Ccsave.php   |   17 +-
 .../Magento/Payment/Model/Method/Checkmo.php  |   23 +-
 .../Magento/Payment/Model/Method/Factory.php  |    3 +-
 .../Magento/Payment/Model/Method/Free.php     |    4 +-
 .../Payment/Model/Method/Purchaseorder.php    |   17 +-
 .../Specification/AbstractSpecification.php   |    2 -
 .../Model/Method/Specification/Composite.php  |    1 -
 app/code/Magento/Payment/Model/Observer.php   |    6 +-
 .../Magento/Payment/Model/Paygate/Result.php  |    2 -
 .../Recurring/Profile/MethodInterface.php     |    3 +-
 .../Magento/Payment/Model/Source/Cctype.php   |   10 +-
 .../Magento/Payment/Model/Source/Invoice.php  |    6 +-
 app/code/Magento/Payment/etc/di.xml           |   32 +-
 .../Model/Billing/Agreement/OrdersUpdater.php |    2 +-
 app/code/Magento/Paypal/etc/adminhtml/di.xml  |   40 +-
 app/code/Magento/Paypal/etc/di.xml            |   12 +-
 app/code/Magento/Paypal/etc/frontend/di.xml   |   56 +-
 .../Persistent/Block/Form/Remember.php        |    4 +-
 .../Persistent/Block/Header/Additional.php    |    6 +-
 .../Magento/Persistent/Controller/Index.php   |   13 +-
 app/code/Magento/Persistent/Helper/Data.php   |    6 +-
 .../Magento/Persistent/Helper/Session.php     |    1 +
 app/code/Magento/Persistent/Model/Factory.php |    3 +-
 .../Magento/Persistent/Model/Observer.php     |   33 +-
 .../Persistent/Model/Observer/Session.php     |   29 +-
 .../Persistent/Model/Persistent/Config.php    |   28 +-
 .../Persistent/Model/Resource/Session.php     |   16 +-
 app/code/Magento/Persistent/Model/Session.php |   24 +-
 app/code/Magento/Persistent/etc/di.xml        |    8 +-
 .../Magento/Persistent/etc/frontend/di.xml    |   12 +-
 app/code/Magento/Rating/etc/adminhtml/di.xml  |    8 +-
 app/code/Magento/RecurringProfile/etc/di.xml  |   12 +-
 app/code/Magento/Reports/etc/adminhtml/di.xml |   14 +-
 app/code/Magento/Reports/etc/di.xml           |   30 +-
 app/code/Magento/Reports/etc/frontend/di.xml  |    8 +-
 .../Review/Block/Adminhtml/Product/Grid.php   |    6 +-
 app/code/Magento/Review/etc/adminhtml/di.xml  |   24 +-
 app/code/Magento/Review/etc/frontend/di.xml   |   50 +-
 .../Magento/Rss/Block/Catalog/NotifyStock.php |    6 +-
 app/code/Magento/Rule/Block/Actions.php       |   12 +-
 app/code/Magento/Rule/Block/Conditions.php    |   12 +-
 app/code/Magento/Rule/Block/Editable.php      |    8 +-
 app/code/Magento/Rule/Block/Newchild.php      |    8 +-
 app/code/Magento/Rule/Model/AbstractModel.php |   51 +-
 .../Rule/Model/Action/AbstractAction.php      |   32 +-
 .../Magento/Rule/Model/Action/Collection.php  |   18 +-
 .../Model/Condition/AbstractCondition.php     |   30 +-
 .../Magento/Rule/Model/Condition/Combine.php  |   13 +-
 .../Condition/Product/AbstractProduct.php     |   13 +-
 .../Magento/Rule/Model/Renderer/Actions.php   |   10 +-
 .../Rule/Model/Renderer/Conditions.php        |   10 +-
 .../Rule/Model/Resource/AbstractResource.php  |   25 +-
 .../Rule/Collection/AbstractCollection.php    |   50 +-
 app/code/Magento/Rule/Model/Rule.php          |    2 +-
 .../Adminhtml/Items/Column/DefaultColumn.php  |    3 -
 .../Sales/Block/Adminhtml/Order/Create.php    |   11 -
 .../Adminhtml/Order/Create/Items/Grid.php     |    4 +-
 .../Sales/Block/Items/AbstractItems.php       |    1 +
 .../Observer/Backend/CatalogProductQuote.php  |   14 +-
 app/code/Magento/Sales/Model/Order.php        |    2 +-
 .../Magento/Sales/Model/Order/Admin/Item.php  |   64 +
 .../Order/Grid/Massaction/ItemsUpdater.php    |   11 +-
 .../Model/Resource/Report/Bestsellers.php     |    4 +-
 .../Magento/Sales/Model/Resource/Setup.php    |    6 +-
 .../Magento/Sales/etc/adminhtml/events.xml    |    3 +
 app/code/Magento/Sales/etc/di.xml             |   54 +-
 app/code/Magento/Sales/etc/frontend/di.xml    |   12 +-
 app/code/Magento/Sales/etc/sales.xml          |    1 -
 app/code/Magento/Sales/i18n/de_DE.csv         |    2 +-
 .../layout/sales_order_create_index.xml       |    5 -
 .../create/items/renderer/configurable.phtml  |  245 ---
 .../view/items/renderer/configurable.phtml    |  232 ---
 .../create/items/renderer/configurable.phtml  |  239 ---
 .../view/items/renderer/configurable.phtml    |  235 ---
 .../Model/Rule/Condition/Product.php          |    9 +-
 .../Magento/SalesRule/etc/adminhtml/di.xml    |   22 +-
 app/code/Magento/SalesRule/etc/di.xml         |   12 +-
 .../Adminhtml/Carrier/Tablerate/Grid.php      |   11 +-
 .../Shipping/Block/Adminhtml/Create.php       |   13 +-
 .../Shipping/Block/Adminhtml/Create/Form.php  |   18 +-
 .../Shipping/Block/Adminhtml/Create/Items.php |    7 +-
 .../Block/Adminhtml/Order/Packaging.php       |   10 +-
 .../Block/Adminhtml/Order/Packaging/Grid.php  |    9 +-
 .../Block/Adminhtml/Order/Tracking.php        |    8 +-
 .../Block/Adminhtml/Order/Tracking/View.php   |   11 +-
 .../Magento/Shipping/Block/Adminhtml/View.php |   24 +-
 .../Magento/Shipping/Block/Order/Shipment.php |    6 +-
 .../Magento/Shipping/Block/Tracking/Popup.php |    7 +-
 .../Controller/Adminhtml/Order/Shipment.php   |   40 +-
 .../Magento/Shipping/Controller/Tracking.php  |    1 +
 .../Model/Carrier/AbstractCarrier.php         |  110 +-
 .../Shipping/Model/Carrier/Flatrate.php       |   14 +-
 .../Shipping/Model/Carrier/Freeshipping.php   |    5 +-
 .../Shipping/Model/Carrier/Tablerate.php      |    5 +-
 .../Magento/Shipping/Model/CarrierFactory.php |    2 +-
 .../Model/Config/Backend/Tablerate.php        |   11 +-
 .../Config/Source/Allspecificcountries.php    |    5 +-
 .../Shipping/Model/Config/Source/Flatrate.php |    5 +-
 app/code/Magento/Shipping/Model/Info.php      |   14 +-
 app/code/Magento/Shipping/Model/Observer.php  |    4 +
 .../Magento/Shipping/Model/Rate/Result.php    |   14 +-
 .../Resource/Carrier/Tablerate/Collection.php |   10 +-
 .../Model/Resource/Order/Track/Collection.php |    5 +-
 .../Shipping/Model/Shipment/Request.php       |    5 +-
 .../Model/Shipment/ReturnShipment.php         |    5 +-
 app/code/Magento/Shipping/Model/Shipping.php  |   18 +-
 .../Shipping/Model/Source/HandlingAction.php  |    3 +
 .../Shipping/Model/Source/HandlingType.php    |    3 +
 .../Shipping/Model/Tracking/Result.php        |   31 +-
 .../Shipping/Model/Tracking/Result/Error.php  |    8 +-
 .../Shipping/Model/Tracking/Result/Status.php |   10 +-
 .../Magento/Shipping/etc/adminhtml/acl.xml    |    4 +-
 .../Magento/Shipping/etc/adminhtml/system.xml |   11 -
 app/code/Magento/Shipping/etc/config.xml      |    4 -
 .../create/items/renderer/configurable.phtml  |   46 -
 .../Magento/Sitemap/Block/Adminhtml/Edit.php  |    7 +-
 .../Sitemap/Block/Adminhtml/Edit/Form.php     |   11 +-
 .../Block/Adminhtml/Grid/Renderer/Action.php  |   10 +-
 .../Sitemap/Block/Adminhtml/Sitemap.php       |    9 +-
 .../Sitemap/Controller/Adminhtml/Sitemap.php  |   23 +-
 .../Sitemap/Model/Config/Backend/Priority.php |   17 +-
 .../Sitemap/Model/Config/Source/Frequency.php |    5 +-
 app/code/Magento/Sitemap/Model/Observer.php   |    8 +-
 .../Model/Resource/Catalog/Category.php       |   11 +-
 .../Model/Resource/Catalog/Product.php        |   32 +-
 .../Sitemap/Model/Resource/Cms/Page.php       |    7 +-
 .../Sitemap/Model/Resource/Sitemap.php        |    7 +-
 .../Model/Resource/Sitemap/Collection.php     |   11 +-
 app/code/Magento/Sitemap/Model/Sitemap.php    |   31 +-
 app/code/Magento/Sitemap/etc/di.xml           |    8 +-
 app/code/Magento/Tax/Model/Resource/Setup.php |   24 +-
 .../Tax/Model/Sales/Total/Quote/Subtotal.php  |    2 +-
 .../Tax/Model/TaxClass/Source/Product.php     |   11 +-
 app/code/Magento/Tax/etc/di.xml               |   24 +-
 .../Tax/sql/tax_setup/install-1.6.0.0.php     |    2 +-
 app/code/Magento/Theme/etc/adminhtml/di.xml   |   20 +-
 app/code/Magento/Theme/etc/di.xml             |   60 +-
 app/code/Magento/Usa/Helper/Data.php          |   17 +-
 app/code/Magento/Usa/Model/Resource/Setup.php |    7 +-
 .../Shipping/Carrier/AbstractCarrier.php      |   56 +-
 .../Usa/Model/Shipping/Carrier/Dhl.php        |   62 +-
 .../Shipping/Carrier/Dhl/AbstractDhl.php      |    2 +-
 .../Shipping/Carrier/Dhl/International.php    |  156 +-
 .../Dhl/International/Source/Contenttype.php  |    9 +-
 .../Source/Method/AbstractMethod.php          |    9 +-
 .../Carrier/Dhl/Source/Freemethod.php         |    5 +-
 .../Dhl/Source/Protection/Rounding.php        |    3 +
 .../Carrier/Dhl/Source/Protection/Value.php   |    3 +
 .../Usa/Model/Shipping/Carrier/Fedex.php      |  128 +-
 .../Carrier/Fedex/Source/Freemethod.php       |    6 +-
 .../Usa/Model/Shipping/Carrier/Ups.php        |  114 +-
 .../Carrier/Ups/Source/Freemethod.php         |    3 +
 .../Shipping/Carrier/Ups/Source/Mode.php      |    2 +-
 .../Carrier/Ups/Source/OriginShipment.php     |    5 +-
 .../Shipping/Carrier/Ups/Source/Pickup.php    |    3 +
 .../Shipping/Carrier/Ups/Source/Type.php      |    3 +
 .../Carrier/Ups/Source/Unitofmeasure.php      |    5 +-
 .../Usa/Model/Shipping/Carrier/Usps.php       |   93 +-
 .../Carrier/Usps/Source/Freemethod.php        |    3 +
 .../Magento/Usa/Model/Simplexml/Element.php   |    8 +-
 app/code/Magento/Usa/etc/di.xml               |   12 +-
 app/code/Magento/User/etc/di.xml              |   38 +-
 app/code/Magento/Webapi/etc/di.xml            |   22 +-
 .../Magento/Webapi/etc/webapi_rest/di.xml     |  118 +-
 .../Magento/Webapi/etc/webapi_soap/di.xml     |   24 +-
 .../Magento/Weee/Block/Renderer/Weee/Tax.php  |   63 +-
 app/code/Magento/Weee/Helper/Data.php         |   65 +-
 .../Weee/Model/Attribute/Backend/Weee/Tax.php |   22 +-
 app/code/Magento/Weee/Model/Observer.php      |   29 +-
 .../Resource/Attribute/Backend/Weee/Tax.php   |    9 +-
 app/code/Magento/Weee/Model/Resource/Tax.php  |   18 +-
 app/code/Magento/Weee/Model/Tax.php           |   43 +-
 .../Weee/Model/Total/Creditmemo/Weee.php      |    8 +-
 .../Magento/Weee/Model/Total/Quote/Weee.php   |   22 +-
 app/code/Magento/Weee/etc/di.xml              |   32 +-
 app/code/Magento/Weee/etc/events.xml          |    2 +-
 .../Magento/Widget/Block/Adminhtml/Widget.php |    3 +
 .../Widget/Block/Adminhtml/Widget/Form.php    |    4 +-
 .../Block/Adminhtml/Widget/Instance.php       |    2 +
 .../Block/Adminhtml/Widget/Instance/Edit.php  |    3 +-
 .../Instance/Edit/Chooser/Container.php       |    5 +-
 .../Edit/Chooser/DesignAbstraction.php        |    1 +
 .../Widget/Instance/Edit/Chooser/Layout.php   |    1 +
 .../Adminhtml/Widget/Instance/Edit/Form.php   |    2 +-
 .../Widget/Instance/Edit/Tab/Main.php         |    7 +-
 .../Widget/Instance/Edit/Tab/Main/Layout.php  |   21 +-
 .../Widget/Instance/Edit/Tab/Properties.php   |    2 +-
 .../Widget/Instance/Edit/Tab/Settings.php     |    5 +-
 .../Adminhtml/Widget/Instance/Edit/Tabs.php   |    1 +
 .../Widget/Block/Adminhtml/Widget/Options.php |   10 +-
 .../Magento/Widget/Block/BlockInterface.php   |    4 +-
 .../Widget/Controller/Adminhtml/Widget.php    |    6 +
 .../Controller/Adminhtml/Widget/Instance.php  |   17 +-
 app/code/Magento/Widget/Model/Config/Data.php |    2 +-
 .../Widget/Model/Config/FileResolver.php      |    2 +-
 .../Magento/Widget/Model/Config/Reader.php    |    5 +-
 .../Magento/Widget/Model/Resource/Widget.php  |    3 +-
 .../Widget/Model/Resource/Widget/Instance.php |   29 +-
 .../Resource/Widget/Instance/Collection.php   |    7 +-
 .../Widget/Instance/Options/ThemeId.php       |    3 +
 .../Widget/Instance/Options/Types.php         |    3 +
 .../Magento/Widget/Model/Template/Filter.php  |    4 +-
 app/code/Magento/Widget/Model/Widget.php      |   16 +-
 .../Magento/Widget/Model/Widget/Config.php    |    4 +-
 .../Magento/Widget/Model/Widget/Instance.php  |   42 +-
 .../Model/Widget/Instance/OptionsFactory.php  |    2 +-
 app/code/Magento/Widget/etc/adminhtml/di.xml  |   14 +-
 app/code/Magento/Widget/etc/di.xml            |   46 +-
 app/code/Magento/Wishlist/Model/Item.php      |    2 +-
 .../Magento/Wishlist/etc/adminhtml/di.xml     |   24 +-
 app/code/Magento/Wishlist/etc/di.xml          |   14 +-
 app/code/Magento/Wishlist/etc/frontend/di.xml |   44 +-
 app/code/Magento/Wishlist/etc/module.xml      |    1 +
 ...list_index_configure_type_configurable.xml |    4 +-
 app/etc/di.xml                                |  365 ++---
 .../TestFramework/App/Arguments/Proxy.php     |  116 ++
 .../Magento/TestFramework/Db/AbstractDb.php   |   24 +
 .../Magento/TestFramework/Db/Mysql.php        |   52 +-
 .../TestFramework/Helper/Bootstrap.php        |   10 +
 .../TestFramework/Indexer/TestCase.php        |   70 +
 .../TestFramework/ObjectManagerFactory.php    |   43 +-
 .../Magento/Test/App/Arguments/ProxyTest.php  |   84 +
 .../Magento/Test/Bootstrap/SettingsTest.php   |    2 +-
 .../Magento/Test/ObjectManagerTest.php        |   10 +-
 .../ConfigLoader/PrimaryTest.php}             |   22 +-
 .../Backend/App/Router/DefaultRouterTest.php  |    1 -
 .../Backend/Block/System/Config/FormTest.php  |   17 +-
 .../Widget/Grid/Massaction/AdditionalTest.php |   68 +
 .../Magento/Bundle/Model/ProductTest.php      |    2 +-
 .../Magento/Bundle/_files/product.php         |    2 +-
 .../Product/Edit/Tab/Options/OptionTest.php   |    2 +-
 .../Adminhtml/Product/AttributeTest.php       |    7 +-
 .../Controller/Adminhtml/ProductTest.php      |   39 -
 .../Catalog/Helper/Product/FlatTest.php       |   21 -
 .../Magento/Catalog/Helper/ProductTest.php    |    2 +-
 .../Model/Indexer/Category/ProductTest.php    |  253 +++
 .../Model/Indexer/Product/CategoryTest.php    |  199 +++
 .../Indexer/Product/Flat/Action/FullTest.php  |   82 +
 .../Indexer/Product/Flat/Action/RowTest.php   |  104 ++
 .../Indexer/Product/Flat/Action/RowsTest.php  |   84 +
 .../Indexer/Product/Flat/ProcessorTest.php    |  134 ++
 .../Filter/Price/_files/products_advanced.php |    2 +-
 .../Filter/Price/_files/products_base.php     |    2 +-
 .../Filter/_files/attribute_with_option.php   |    2 +-
 .../Product/Attribute/Backend/SkuTest.php     |    2 +-
 .../Catalog/Model/Product/TypeTest.php        |   12 -
 .../Catalog/Model/ProductGettersTest.php      |   16 +-
 .../Catalog/Model/ProductPriceTest.php        |    5 -
 .../Magento/Catalog/Model/ProductTest.php     |   41 +-
 .../Model/Resource/_files/url_rewrites.php    |    2 +-
 .../Magento/Catalog/_files/categories.php     |    4 +-
 .../_files/indexer_catalog_category.php       |  138 ++
 .../Catalog/_files/multiple_products.php      |    6 +-
 .../Catalog/_files/product_associated.php     |    2 +-
 .../Magento/Catalog/_files/product_simple.php |    2 +-
 .../_files/product_simple_duplicated.php      |    2 +-
 .../Catalog/_files/product_simple_xss.php     |    2 +-
 .../Catalog/_files/product_special_price.php  |    2 +-
 .../Catalog/_files/product_virtual.php        |    2 +-
 .../Catalog/_files/product_with_image.php     |    2 +-
 .../Catalog/_files/product_with_options.php   |    2 +-
 .../Magento/Catalog/_files/products.php       |    2 +-
 .../Catalog/_files/products_crosssell.php     |    4 +-
 .../Magento/Catalog/_files/products_new.php   |    2 +-
 .../Catalog/_files/products_related.php       |    4 +-
 .../Magento/Catalog/_files/row_fixture.php    |   85 +
 .../Catalog/_files/row_fixture_rollback.php   |   48 +
 .../Magento/Catalog/_files/url_rewrites.php   |    2 +-
 .../attribute_system_with_applyto_data.php    |    2 +-
 .../Catalog/controllers/_files/products.php   |    4 +-
 .../CatalogInventory/Model/Stock/ItemTest.php |    2 +-
 .../Magento/Checkout/Controller/CartTest.php  |   36 -
 .../Checkout/_files/product_bundle.php        |    2 +-
 .../Checkout/_files/simple_product.php        |    2 +-
 .../Edit/Tab/Super/Config/MatrixTest.php      |    9 +-
 .../Product/Edit/Tab/Super/ConfigTest.php     |   15 +-
 .../Product/Edit/Tab/Super/SettingsTest.php   |    9 +-
 .../Backend/Grid/ColumnSetTest.php            |   11 +-
 .../Product/View/Type/ConfigurableTest.php    |   15 +-
 .../Controller/Adminhtml/ProductTest.php      |   70 +
 .../Controller/CartTest.php                   |   86 +
 .../Type/Configurable/AttributeTest.php       |    9 +-
 .../Product/Type/Configurable/PriceTest.php   |   11 +-
 .../Model/Product/Type/ConfigurableTest.php   |   34 +-
 .../Collection/AssociatedProductTest.php      |    9 +-
 .../_files/product_configurable.php           |    9 +-
 .../quote_with_configurable_product.php       |    5 +-
 .../Model/LayoutArgumentObjectUpdater.php     |    9 +-
 .../Model/LayoutArgumentSimpleUpdater.php     |    9 +-
 .../Core/Model/LayoutDirectivesTest.php       |    3 +-
 .../testsuite/Magento/Core/Utility/Layout.php |    3 +-
 .../Block/Adminhtml/Group/Edit/FormTest.php   |   12 +-
 .../Block/Adminhtml/Group/EditTest.php        |   12 +-
 .../Group/Grid/ServiceCollectionTest.php      |  125 ++
 .../Service/V1/CustomerGroupServiceTest.php   |  120 +-
 .../V1/CustomerMetadataServiceTest.php        |   65 +-
 .../Data/Argument/Interpreter/StringTest.php  |  109 ++
 .../Magento/Downloadable/_files/product.php   |    2 +-
 .../_files/product_with_files.php             |    2 +-
 .../GroupedProduct/_files/product_grouped.php |    2 +-
 .../Model/Import/Entity/ProductTest.php       |    2 +-
 .../Magento/ImportExport/_files/product.php   |    2 +-
 .../Multishipping/Controller/CheckoutTest.php |    2 +-
 .../Magento/Mview/View/ChangelogTest.php      |    2 +-
 .../ObjectManager/Config/Reader/DomTest.php   |    3 +-
 .../ObjectManager/ObjectManagerTest.php       |   15 +-
 .../ObjectManager/_files/config_merged.xml    |  117 +-
 .../ObjectManager/_files/config_one.xml       |  111 +-
 .../ObjectManager/_files/config_two.xml       |   60 +-
 .../Paypal/_files/quote_payment_express.php   |    2 +-
 .../Paypal/_files/quote_payment_payflow.php   |    2 +-
 .../Paypal/_files/quote_payment_standard.php  |    2 +-
 .../Magento/Sales/_files/order_info.php       |    2 +-
 .../testsuite/Magento/Sales/_files/quote.php  |    2 +-
 .../Sitemap/_files/sitemap_products.php       |   10 +-
 .../testsuite/Magento/Tax/Model/ClassTest.php |    2 +-
 .../Integrity/Modular/LayoutFilesTest.php     |  108 +-
 .../Modular/RouteConfigFilesTest.php          |    2 +-
 .../Test/Tools/Dependency/CircularTest.php    |   60 +
 .../Dependency/Parser/Config/XmlTest.php      |   71 +
 .../Tools/Dependency/Report/CircularTest.php  |   99 ++
 .../Dependency/Report/DependencyTest.php      |   99 ++
 .../Tools/Dependency/Report/FrameworkTest.php |  114 ++
 .../Magento/FirstModule/Helper/Helper.php     |   35 +
 .../code/Magento/FirstModule/Model/Model.php  |   37 +
 .../FirstModule/Model/WithoutDependencies.php |   34 +
 .../code/Magento/FirstModule/etc/module.xml   |   28 +
 .../FirstModule/view/frontend/template.phtml  |    9 +-
 .../Test/Tools/Dependency/_files/config1.xml  |   34 +
 .../Test/Tools/Dependency/_files/config2.xml  |   33 +
 .../Test/Tools/Dependency/_files/config3.xml  |   29 +
 .../Test/Tools/Dependency/_files/config4.xml  |   32 +
 .../Test/Tools/Dependency/_files/config5.xml  |   32 +
 .../_files/expected/circular-dependencies.csv |    9 +
 .../_files/expected/dependencies.csv          |   12 +
 .../expected/framework-dependencies.csv       |    8 +
 .../without-circular-dependencies.csv         |    2 +
 .../_files/expected/without-dependencies.csv  |    2 +
 .../without-framework-dependencies.csv        |    2 +
 .../Block/Adminhtml/Dhl/UnitofmeasureTest.php |    5 -
 .../Magento/Weee/Model/ObserverTest.php       |    8 +-
 .../Magento/TestFramework/Application.php     |    4 +
 .../Magento/Test/ApplicationTest.php          |    6 +-
 .../Test/Performance/TestsuiteTest.php        |    6 +-
 .../fixtures/catalog_100k_products.php        |    2 +-
 .../catalog_200_categories_80k_products.php   |    2 +-
 .../testsuite/fixtures/catalog_category.php   |    2 +-
 .../catalog_category_flat_enabled.php         |   38 +
 .../testsuite/fixtures/catalog_product.php    |    2 +-
 .../fixtures/catalog_product_flat_enabled.php |   38 +
 .../Test/Integrity/CircularDependencyTest.php |  111 +-
 .../Test/Integrity/Di/CompilerTest.php        |    5 +-
 .../Integrity/_files/blacklist/namespace.txt  |    3 +
 .../Integrity/_files/blacklist/reference.txt  |    3 +-
 .../_files/dependency_test/tables_ce.php      |    9 -
 .../Magento/ObjectManager/DiConfigTest.php    |   72 +
 .../Test/Legacy/_files/obsolete_classes.php   |  150 ++
 .../Test/Legacy/_files/obsolete_constants.php |   14 +-
 .../Test/Legacy/_files/obsolete_methods.php   |   68 +-
 .../Legacy/_files/obsolete_properties.php     |    3 +-
 .../Test/Php/_files/blacklist/common.txt      |    1 +
 .../Test/Php/_files/whitelist/common.txt      |    6 +-
 .../App/Arguments/ArgumentInterpreterTest.php |   73 +
 .../Controller/Adminhtml/DashboardTest.php    |   31 +-
 .../Magento/Backend/Model/ConfigTest.php      |   60 +-
 .../Attribute/Source/Price/ViewTest.php       |   71 +
 .../Adminhtml/Product/BuilderTest.php         |  179 ++
 .../Helper/HandlerFactoryTest.php             |   69 +
 .../Helper/Plugin/Handler/CompositeTest.php   |   54 +
 .../Helper/Product/Flat/IndexerTest.php       |  146 ++
 .../Model/Attribute/Config/XsdTest.php        |    2 +-
 .../Attribute/LockValidatorCompositeTest.php  |   74 +
 .../Product/Plugin/IndexerStateTest.php       |   75 +
 .../Product/Plugin/MviewStateTest.php         |  328 ++++
 .../Product/Plugin/StoreGroupTest.php         |  150 ++
 .../Category/Product/Plugin/StoreViewTest.php |  134 ++
 .../Model/Indexer/Category/ProductTest.php    |  128 ++
 .../Model/Indexer/Product/CategoryTest.php    |  128 ++
 .../Indexer/Product/Flat/Action/RowTest.php   |   51 +
 .../Indexer/Product/Flat/Action/RowsTest.php  |   51 +
 .../Product/Flat/Plugin/ImportTest.php        |   50 +
 .../Flat/Plugin/IndexerConfigDataTest.php     |  142 ++
 .../Product/Flat/Plugin/StoreGroupTest.php    |  128 ++
 .../Indexer/Product/Flat/Plugin/StoreTest.php |  127 ++
 .../Indexer/Product/Flat/ProcessorTest.php    |   60 +
 .../Magento/Catalog/Model/ObserverTest.php    |  126 --
 .../Source/Msrp/Type/EnabledTest.php          |   72 +
 .../Attribute/Source/Msrp/Type/PriceTest.php  |   70 +
 .../Model/Product/CartConfigurationTest.php   |    1 -
 .../Catalog/Model/Product/CopierTest.php      |    2 +-
 .../Model/Product/Indexer/FlatTest.php        |  363 -----
 .../Product/PriceModifier/CompositeTest.php   |   86 +
 .../Product/TypeTransitionManagerTest.php     |   96 ++
 .../Catalog/Model/Product/ValidatorTest.php   |   38 +
 .../Catalog/Model/Product/VisibilityTest.php  |   71 +
 .../Magento/Catalog/Model/ProductTest.php     |  145 ++
 .../Model/Resource/Eav/AttributeTest.php      |  122 ++
 .../AssociatedProductUpdaterTest.php          |   55 -
 .../Model/Resource/Product/FlatTest.php       |   90 +
 .../Initializer/OptionTest.php                |  202 +++
 .../Model/Product/PriceModifierTest.php       |   88 +
 .../Magento/Config/Converter/Dom/FlatTest.php |    9 +-
 .../Config/Dom/ArrayNodeConfigTest.php        |  130 ++
 .../Config/Dom/NodeMergingConfigTest.php      |   85 +
 .../Config/Dom/NodePathMatcherTest.php        |   63 +
 .../unit/testsuite/Magento/Config/DomTest.php |   42 +-
 .../Magento/Config/Reader/FilesystemTest.php  |   25 +-
 .../_files/converter/dom/flat/result.php      |   11 +-
 .../Magento/Config/_files/dom/attributes.xml  |   33 +
 .../Config/_files/dom/attributes_merged.xml   |   33 +
 .../Config/_files/dom/attributes_new.xml      |   32 +
 .../di.xml => Config/_files/dom/types.xml}    |   19 +-
 .../Config/_files/dom/types_merged.xml        |   37 +
 .../Magento/Config/_files/dom/types_new.xml   |   36 +
 .../Edit/Tab/Super/Config/MatrixTest.php      |   10 +-
 .../Cart/Item/Renderer/ConfigurableTest.php   |   23 +-
 .../Configurable/AttributeSelectorTest.php    |   77 +
 .../SuggestConfigurableAttributesTest.php     |   95 ++
 .../Adminhtml/Product/Builder/PluginTest.php  |  242 +++
 .../Helper/Plugin/ConfigurableTest.php        |    8 +-
 .../Handler/ProductType/ConfigurableTest.php  |  146 ++
 .../Product/Configuration/PluginTest.php      |  101 ++
 .../Admin/Item/Plugin/ConfigurableTest.php    |  162 ++
 .../Plugin/ConfigurableTest.php               |   75 +
 .../Model/Product/Type/ConfigurableTest.php   |   53 +-
 .../Plugin/ConfigurableTest.php               |   87 +
 .../Model/Product/Validator/PluginTest.php    |  172 ++
 .../Model/SuggestedAttributeListTest.php      |  129 ++
 .../Layout/Argument/AbstractHandlerTest.php   |  106 --
 .../Layout/Argument/Handler/ArrayTest.php     |  186 ---
 .../Layout/Argument/Handler/BooleanTest.php   |  128 --
 .../Layout/Argument/Handler/HelperTest.php    |  166 --
 .../Layout/Argument/Handler/NumberTest.php    |  128 --
 .../Layout/Argument/Handler/ObjectTest.php    |  162 --
 .../Layout/Argument/Handler/OptionsTest.php   |  159 --
 .../Layout/Argument/Handler/StringTest.php    |  136 --
 .../Model/Layout/Argument/Handler/UrlTest.php |  145 --
 .../Model/Layout/Argument/ProcessorTest.php   |  152 --
 .../Model/Layout/Argument/UpdaterTest.php     |   98 --
 .../Magento/Core/Model/Layout/FactoryTest.php |   87 -
 .../Magento/Core/Model/Layout/XsdTest.php     |   73 +
 .../Handler => }/_files/arguments.xml         |   22 +-
 .../_files/invalidLayoutArgumentsXmlArray.php |  133 ++
 .../Block/Account/Dashboard/InfoTest.php      |   23 +
 .../Magento/Customer/Block/Widget/DobTest.php |   46 +-
 .../Customer/Block/Widget/GenderTest.php      |   20 +
 .../Customer/Block/Widget/NameTest.php        |  126 +-
 .../Customer/Block/Widget/TaxvatTest.php      |   20 +
 .../Customer/Model/Address/Config/XsdTest.php |    2 +-
 .../Group/Grid/ServiceCollectionTest.php      |  207 +++
 .../V1/CustomerMetadataServiceTest.php        |  135 ++
 .../Magento/DB/Adapter/Pdo/MysqlTest.php      |   83 +-
 .../Argument/Interpreter/ArrayTypeTest.php    |   76 +
 .../Data/Argument/Interpreter/BooleanTest.php |   67 +
 .../Argument/Interpreter/CompositeTest.php    |  123 ++
 .../Argument/Interpreter/ConstantTest.php     |   66 +
 .../Argument/Interpreter/NullTypeTest.php}    |   13 +-
 .../Data/Argument/Interpreter/NumberTest.php  |   79 +
 .../Magento/Data/Argument/XsdTest.php         |   74 +
 .../Argument/_files/typesInvalidArray.php     |  110 ++
 .../Data/Argument/_files/types_schema.xsd     |   32 +
 .../Data/Argument/_files/types_valid.xml      |   56 +
 .../DesignEditor/Model/AreaEmulatorTest.php}  |   38 +-
 .../Magento/DesignEditor/Model/StateTest.php  |   16 +-
 .../Plugin/DownloadableTest.php               |  145 ++
 .../Entity/Attribute/Source/BooleanTest.php   |   72 +
 .../Entity/Attribute/Source/TableTest.php     |   82 +
 .../Model/Resource/Entity/AttributeTest.php   |    2 +-
 .../Email/Model/Template/Config/XsdTest.php   |    2 +-
 .../Model/Product/Type/GroupedTest.php        |   10 +-
 .../Http/PhpEnvironment/RemoteAddressTest.php |    2 +-
 .../Magento/Indexer/App/IndexerTest.php       |   16 +-
 .../Magento/Indexer/App/ShellTest.php         |    9 -
 .../Magento/Indexer/Model/IndexerTest.php     |   11 +-
 .../Magento/Indexer/Model/ProcessorTest.php   |    4 +-
 .../Integration/Model/Config/XsdTest.php      |    2 +-
 .../Magento/Integration/Oauth/OauthTest.php   |    1 +
 .../Interception/Config/ConfigTest.php        |   50 +-
 .../Interception/FactoryDecoratorTest.php     |   77 +
 .../PluginList/PluginListTest.php             |   31 +-
 .../Interception/_files/reader_mock_map.php   |   79 +
 .../Magento/Multishipping/Helper/DataTest.php |  153 ++
 .../unit/testsuite/Magento/Mview/ViewTest.php |   17 +-
 .../Argument/Interpreter/ObjectTest.php       |   99 ++
 .../Config/Argument/ObjectFactoryTest.php     |  106 ++
 .../ObjectManager/Config/ConfigTest.php       |   66 +
 .../Config/Mapper/ArgumentParserTest.php      |   58 +
 .../ObjectManager/Config/Mapper/DomTest.php   |   34 +-
 .../Config/Mapper/_files/argument_parser.xml  |   34 +
 .../Mapper/_files/mapped_simple_di_config.php |   58 +-
 .../Config/Mapper/_files/simple_di_config.xml |   84 +-
 .../Magento/ObjectManager/Config/XsdTest.php  |    4 +-
 .../Config/_files/invalidConfigXmlArray.php   |  264 +--
 .../Config/_files/valid_config.xml            |  101 +-
 .../ObjectManager/Factory/FactoryTest.php     |  148 ++
 .../Factory/Fixture/CircularOne.php           |   39 +
 .../Factory/Fixture/CircularThree.php         |   39 +
 .../Factory/Fixture/CircularTwo.php           |   39 +
 .../Factory/Fixture/OneScalar.php             |   52 +
 .../Factory/Fixture/Polymorphous.php          |   50 +
 .../ObjectManager/Factory/Fixture/Two.php     |   67 +
 .../ObjectManager/ObjectManagerTest.php       |  236 +--
 .../Magento/Phrase/Renderer/CompositeTest.php |   54 +-
 .../Magento/Phrase/Renderer/FactoryTest.php   |   73 -
 .../Sales/Block/Items/AbstractTest.php        |   16 +-
 .../Backend/CatalogProductQuoteTest.php       |   13 -
 .../Sales/Model/Order/Pdf/Config/XsdTest.php  |    2 +-
 .../Magento/Stdlib/BooleanUtilsTest.php       |   97 ++
 .../Magento/Tax/Model/Resource/SetupTest.php  |   60 +
 .../Tax/Model/TaxClass/Source/ProductTest.php |   71 +
 .../Test/Tools/Dependency/Parser/CodeTest.php |   87 +
 .../Dependency/Parser/Config/XmlTest.php      |   64 +
 .../Report/Builder/AbstractBuilderTest.php    |  123 ++
 .../Report/Circular/Data/ChainTest.php        |   43 +
 .../Report/Circular/Data/ConfigTest.php       |   66 +
 .../Report/Circular/Data/ModuleTest.php       |   67 +
 .../Report/Data/Config/AbstractConfigTest.php |   40 +
 .../Report/Dependency/Data/ConfigTest.php     |   91 ++
 .../Report/Dependency/Data/DependencyTest.php |   77 +
 .../Report/Dependency/Data/ModuleTest.php     |   96 ++
 .../Report/Framework/BuilderTest.php          |   67 +
 .../Report/Framework/Data/ConfigTest.php      |   66 +
 .../Report/Framework/Data/DependencyTest.php  |   62 +
 .../Report/Framework/Data/ModuleTest.php      |   67 +
 .../Report/Writer/Csv/AbstractWriterTest.php  |   84 +
 .../Tools/Di/Code/Scanner/XmlScannerTest.php  |    2 +
 .../app/code/Magento/SomeModule/etc/di.xml    |   11 +-
 .../Tools/Di/_files/app/etc/di/config.xml     |   10 +-
 .../Magento/Validator/BuilderTest.php         |   74 +-
 .../Magento/Validator/ConfigTest.php          |   21 +-
 .../Magento/Validator/Test/NotEmpty.php       |   11 +
 .../Layout/Argument/HandlerFactoryTest.php    |  116 --
 .../Interpreter/Decorator/UpdaterTest.php     |  126 ++
 .../Argument/Interpreter/HelperMethodTest.php |  110 ++
 .../Argument/Interpreter/NamedParamsTest.php  |   90 +
 .../Argument/Interpreter/ObjectTest.php       |   95 ++
 .../Argument/Interpreter/OptionsTest.php      |   99 ++
 .../Layout/Argument/Interpreter/UrlTest.php   |   82 +
 .../View/Layout/Argument/ParserTest.php       |   68 +
 .../View/Layout/Argument/_files/arguments.xml |   35 +
 .../Model/Config/Integration/XsdTest.php      |    2 +-
 .../Magento/Webapi/Model/Config/XsdTest.php   |    2 +-
 .../Magento/Tools/Dependency/Circular.php     |  154 ++
 .../Magento/Tools/Dependency/Parser/Code.php  |  121 ++
 .../Tools/Dependency/Parser/Config/Xml.php    |  121 ++
 .../Tools/Dependency/ParserInterface.php      |   39 +
 .../Report/Builder/AbstractBuilder.php        |  107 ++
 .../Dependency/Report/BuilderInterface.php    |   38 +
 .../Dependency/Report/Circular/Builder.php    |   96 ++
 .../Dependency/Report/Circular/Data/Chain.php |   51 +
 .../Report/Circular/Data/Config.php           |   47 +
 .../Report/Circular/Data/Module.php           |   87 +
 .../Dependency/Report/Circular/Writer.php     |   65 +
 .../Report/Data/Config/AbstractConfig.php     |   63 +
 .../Report/Data/ConfigInterface.php           |   45 +
 .../Dependency/Report/Dependency/Builder.php  |   52 +
 .../Report/Dependency/Data/Config.php         |   71 +
 .../Report/Dependency/Data/Dependency.php     |  105 ++
 .../Report/Dependency/Data/Module.php         |  119 ++
 .../Dependency/Report/Dependency/Writer.php   |   77 +
 .../Dependency/Report/Framework/Builder.php   |  109 ++
 .../Report/Framework/Data/Config.php          |   47 +
 .../Report/Framework/Data/Dependency.php      |   77 +
 .../Report/Framework/Data/Module.php          |   87 +
 .../Dependency/Report/Framework/Writer.php    |   61 +
 .../Report/Writer/Csv/AbstractWriter.php      |   95 ++
 .../Dependency/Report/WriterInterface.php     |   41 +
 .../Tools/Dependency/ServiceLocator.php       |  171 ++
 .../Tools/Dependency/generate/bootstrap.php   |   32 +
 .../generate/framework-dependencies.php       |   61 +
 .../modules-circular-dependencies.php         |   58 +
 .../generate/modules-dependencies.php         |   58 +
 .../Tools/Di/Code/Scanner/XmlScanner.php      |   11 +-
 .../Di/Definition/Compressor/UniqueList.php   |    4 +-
 .../factory_table_names/replace_ce.php        |    9 -
 .../App/Arguments/ArgumentInterpreter.php     |   71 +
 lib/Magento/App/Arguments/Loader.php          |    5 +-
 lib/Magento/App/Config/Initial/Reader.php     |    3 +-
 lib/Magento/App/Console/Request.php           |    9 +-
 lib/Magento/App/ObjectManager.php             |   11 +-
 .../ObjectManager/ConfigLoader/Primary.php    |   10 +-
 lib/Magento/App/ObjectManagerFactory.php      |   78 +-
 lib/Magento/Config/AbstractXml.php            |   10 +-
 lib/Magento/Config/Converter/Dom.php          |    2 +-
 lib/Magento/Config/Converter/Dom/Flat.php     |  146 +-
 lib/Magento/Config/ConverterInterface.php     |    4 +-
 lib/Magento/Config/Data.php                   |    7 +-
 lib/Magento/Config/Data/Scoped.php            |    8 +-
 lib/Magento/Config/DataInterface.php          |    1 +
 lib/Magento/Config/Dom.php                    |   71 +-
 lib/Magento/Config/Dom/ArrayNodeConfig.php    |   91 ++
 lib/Magento/Config/Dom/NodeMergingConfig.php  |   67 +
 lib/Magento/Config/Dom/NodePathMatcher.php    |   59 +
 lib/Magento/Config/DomFactory.php             |    8 +-
 lib/Magento/Config/FileIterator.php           |   24 +
 lib/Magento/Config/Reader/Filesystem.php      |   38 +-
 lib/Magento/Config/Scope.php                  |    5 +-
 lib/Magento/Config/ScopeInterface.php         |    1 +
 lib/Magento/Config/ScopeListInterface.php     |    2 +-
 lib/Magento/Config/Theme.php                  |    2 +
 lib/Magento/DB/Adapter/AdapterInterface.php   |   49 +-
 lib/Magento/DB/Adapter/Pdo/Mysql.php          |  149 ++
 .../Data/Argument/Interpreter/ArrayType.php   |   49 +-
 .../Data/Argument/Interpreter/Boolean.php     |   61 +
 .../Data/Argument/Interpreter/Composite.php   |  111 ++
 .../Data/Argument/Interpreter/Constant.php    |   47 +
 .../Data/Argument/Interpreter/NullType.php    |   43 +
 .../Data/Argument/Interpreter/Number.php      |   47 +
 .../Data/Argument/Interpreter/String.php      |   69 +
 .../Argument/InterpreterInterface.php}        |   26 +-
 .../MissingOptionalValueException.php         |   33 +
 lib/Magento/Data/Collection.php               |   43 +
 lib/Magento/Data/OptionSourceInterface.php    |   38 +
 lib/Magento/Data/etc/argument/types.xsd       |   92 ++
 .../HTTP/PhpEnvironment/RemoteAddress.php     |   11 +-
 lib/Magento/Interception/FactoryDecorator.php |   23 -
 lib/Magento/Mview/View.php                    |   31 +-
 lib/Magento/Mview/View/AbstractFactory.php    |   58 +
 lib/Magento/Mview/View/Changelog.php          |   13 +-
 lib/Magento/Mview/View/ChangelogInterface.php |    1 +
 lib/Magento/Mview/View/CollectionFactory.php  |   25 +-
 .../Mview/View/State/CollectionFactory.php    |   25 +-
 lib/Magento/Mview/View/StateInterface.php     |    2 +-
 lib/Magento/Mview/View/Subscription.php       |    8 +-
 .../Mview/View/SubscriptionFactory.php        |   25 +-
 lib/Magento/ObjectManager/Config.php          |    3 +-
 .../Config/Argument/Interpreter/Object.php    |   72 +
 .../Config/Argument/ObjectFactory.php         |   93 ++
 lib/Magento/ObjectManager/Config/Config.php   |   16 +-
 .../Config/Mapper/ArgumentParser.php          |   71 +
 .../ObjectManager/Config/Mapper/Dom.php       |  190 +--
 .../ObjectManager/Config/Reader/Dom.php       |   32 +-
 lib/Magento/ObjectManager/Factory.php         |   16 -
 lib/Magento/ObjectManager/Factory/Factory.php |  146 +-
 lib/Magento/ObjectManager/ObjectManager.php   |    7 +-
 lib/Magento/ObjectManager/etc/config.xsd      |   96 +-
 lib/Magento/Phrase/Renderer/Composite.php     |   52 +-
 lib/Magento/Session/Generic.php               |    2 +
 lib/Magento/Session/SaveHandler.php           |    8 +-
 lib/Magento/Session/SaveHandler/DbTable.php   |   13 +-
 lib/Magento/Session/SaveHandlerFactory.php    |    6 +
 lib/Magento/Session/SessionManager.php        |   33 +-
 .../Session/SessionManagerInterface.php       |    5 +
 lib/Magento/Session/SidResolverInterface.php  |    6 +-
 lib/Magento/Session/Storage.php               |    2 +
 lib/Magento/Session/ValidatorInterface.php    |    1 +
 lib/Magento/Stdlib/BooleanUtils.php           |   82 +
 lib/Magento/Validator/Builder.php             |    7 +-
 lib/Magento/View/Asset/Collection.php         |    4 +
 lib/Magento/View/Asset/GroupedCollection.php  |   10 +-
 lib/Magento/View/Asset/MergeService.php       |   14 +-
 .../View/Asset/MergeStrategy/Checksum.php     |    6 +
 .../View/Asset/MergeStrategy/Direct.php       |    6 +
 .../View/Asset/MergeStrategy/FileExists.php   |    6 +
 .../View/Asset/MergeStrategyInterface.php     |    1 +
 lib/Magento/View/Asset/Merged.php             |   14 +
 lib/Magento/View/Asset/Minified.php           |   17 +-
 lib/Magento/View/Asset/MinifyService.php      |   16 +-
 .../View/Asset/PreProcessor/Composite.php     |    8 +
 .../View/Asset/PreProcessorFactory.php        |    2 +
 lib/Magento/View/Asset/PropertyGroup.php      |    6 +-
 .../View/Asset/PropertyGroupFactory.php       |    2 +
 lib/Magento/View/Asset/PublicFile.php         |    7 +
 lib/Magento/View/Asset/Remote.php             |    6 +
 lib/Magento/View/Asset/ViewFile.php           |    8 +
 lib/Magento/View/BlockPool.php                |   11 +-
 lib/Magento/View/Config.php                   |   16 +-
 lib/Magento/View/Context.php                  |   73 +-
 lib/Magento/View/DataSourcePool.php           |   29 +-
 lib/Magento/View/DeployedFilesManager.php     |    4 +
 lib/Magento/View/Design/Fallback/Factory.php  |    2 +
 .../View/Design/Fallback/Rule/Composite.php   |    4 +
 .../Design/Fallback/Rule/ModularSwitch.php    |    6 +
 .../View/Design/Fallback/Rule/Simple.php      |    2 +
 .../View/Design/Fallback/Rule/Theme.php       |    4 +
 .../FileResolution/Strategy/Fallback.php      |   10 +
 .../Strategy/Fallback/CachingProxy.php        |    7 +-
 .../Design/FileResolution/StrategyPool.php    |   10 +-
 .../View/Design/Theme/Customization.php       |   14 +
 .../Theme/Customization/AbstractFile.php      |   15 +
 .../Design/Theme/Customization/File/Css.php   |    4 +
 .../Design/Theme/Customization/File/Js.php    |    4 +
 .../Customization/FileServiceFactory.php      |    8 +-
 .../View/Design/Theme/Customization/Path.php  |   10 +-
 .../View/Design/Theme/Domain/Factory.php      |    6 +
 .../Design/Theme/File/CollectionInterface.php |    4 +-
 lib/Magento/View/Design/Theme/FileFactory.php |    2 +
 .../View/Design/Theme/FileInterface.php       |    2 +-
 .../Design/Theme/FileProviderInterface.php    |    2 +
 .../View/Design/Theme/FlyweightFactory.php    |   10 +-
 lib/Magento/View/Design/Theme/Image.php       |   16 +-
 .../View/Design/Theme/Image/Uploader.php      |    8 +
 .../View/Design/Theme/ImageFactory.php        |    2 +
 lib/Magento/View/Design/Theme/Label.php       |    2 +
 .../Design/Theme/ThemeProviderInterface.php   |    2 +
 lib/Magento/View/Design/Theme/Validator.php   |   14 +-
 lib/Magento/View/Design/ThemeFactory.php      |    8 +-
 lib/Magento/View/Design/ThemeInterface.php    |    3 +-
 lib/Magento/View/DesignInterface.php          |    6 +-
 lib/Magento/View/DesignLoader.php             |   10 +
 lib/Magento/View/Element/AbstractBlock.php    |   74 +-
 lib/Magento/View/Element/BlockFactory.php     |    8 +-
 lib/Magento/View/Element/Context.php          |   76 +
 lib/Magento/View/Element/Html/Calendar.php    |    8 +-
 lib/Magento/View/Element/Html/Link.php        |    4 +-
 .../View/Element/Html/Link/Current.php        |    4 +
 lib/Magento/View/Element/Html/Links.php       |    2 +
 lib/Magento/View/Element/Html/Select.php      |   12 +-
 lib/Magento/View/Element/Js/Components.php    |    2 +
 lib/Magento/View/Element/Js/Cookie.php        |    4 +
 lib/Magento/View/Element/Messages.php         |   30 +-
 lib/Magento/View/Element/Redirect.php         |   10 +-
 lib/Magento/View/Element/Template.php         |   24 +-
 lib/Magento/View/Element/Template/Context.php |   10 +
 lib/Magento/View/Element/Text.php             |    1 +
 .../View/Element/Text/TextList/Item.php       |    2 +
 .../View/Element/Text/TextList/Link.php       |    2 +
 lib/Magento/View/FileSystem.php               |    4 +
 .../View/Layout/Argument/HandlerFactory.php   |  103 --
 .../Interpreter/Decorator/Updater.php         |   92 ++
 .../Argument/Interpreter/HelperMethod.php     |   74 +
 .../Argument/Interpreter/NamedParams.php      |   69 +
 .../Layout/Argument/Interpreter/Object.php    |   75 +
 .../Layout/Argument/Interpreter/Options.php   |   76 +
 .../View/Layout/Argument/Interpreter/Url.php  |   69 +
 lib/Magento/View/Layout/Argument/Parser.php   |   75 +
 .../Layout/Argument/UpdaterInterface.php      |   18 +-
 lib/Magento/View/Layout/Element.php           |   18 +-
 lib/Magento/View/Layout/File.php              |   10 +
 lib/Magento/View/Layout/File/Factory.php      |    6 +-
 lib/Magento/View/Layout/File/FileList.php     |    8 +
 .../View/Layout/File/FileList/Factory.php     |    4 +
 .../View/Layout/File/Source/Aggregated.php    |   12 +
 lib/Magento/View/Layout/File/Source/Base.php  |    6 +
 .../Source/Decorator/ModuleDependency.php     |    6 +
 .../File/Source/Decorator/ModuleOutput.php    |    6 +
 .../View/Layout/File/Source/Override/Base.php |    6 +
 .../Layout/File/Source/Override/Theme.php     |    6 +
 lib/Magento/View/Layout/File/Source/Theme.php |    6 +
 lib/Magento/View/Layout/PageType/Config.php   |   10 +-
 .../Layout/PageType/Config/SchemaLocator.php  |    2 +
 lib/Magento/View/Layout/ProcessorFactory.php  |    2 +
 .../View/Layout/ProcessorInterface.php        |    2 +-
 lib/Magento/View/LayoutFactory.php            |    2 +
 lib/Magento/View/LayoutInterface.php          |    6 +-
 lib/Magento/View/Publisher.php                |   22 +-
 lib/Magento/View/RelatedFile.php              |   10 +-
 lib/Magento/View/Render/RenderFactory.php     |    8 +-
 lib/Magento/View/RenderInterface.php          |    4 +
 lib/Magento/View/Service.php                  |   12 +-
 lib/Magento/View/TemplateEngine/Php.php       |   10 +-
 lib/Magento/View/TemplateEngineFactory.php    |    8 +-
 lib/Magento/View/TemplateEngineInterface.php  |    2 +-
 lib/Magento/View/TemplateEnginePool.php       |    6 +
 lib/Magento/View/Url.php                      |   26 +-
 lib/Magento/View/Url/CssResolver.php          |    8 +-
 pub/lib/varien/product.js                     |  779 ---------
 1457 files changed, 37288 insertions(+), 21230 deletions(-)
 rename app/code/Magento/{CatalogInventory/view/frontend/layout/catalog_product_view_type_configurable.xml => Bundle/view/adminhtml/layout/catalog_product_new.xml} (85%)
 create mode 100644 app/code/Magento/Bundle/view/adminhtml/product/stock/disabler.phtml
 delete mode 100644 app/code/Magento/Catalog/Block/Adminhtml/Product/Created.php
 delete mode 100644 app/code/Magento/Catalog/Block/Adminhtml/System/Config/Form/Field/Select/Flatproduct.php
 create mode 100644 app/code/Magento/Catalog/Controller/Adminhtml/Product/Builder.php
 rename app/code/Magento/{Core/Model/Layout/Factory.php => Catalog/Controller/Adminhtml/Product/Initialization/Helper/HandlerFactory.php} (58%)
 create mode 100644 app/code/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper/HandlerInterface.php
 create mode 100644 app/code/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper/Plugin/Handler/Composite.php
 create mode 100644 app/code/Magento/Catalog/Helper/Product/Flat/Indexer.php
 rename app/code/Magento/{Core/Model/Layout/Argument/Updater.php => Catalog/Model/Attribute/LockValidatorComposite.php} (50%)
 create mode 100644 app/code/Magento/Catalog/Model/Attribute/LockValidatorInterface.php
 delete mode 100644 app/code/Magento/Catalog/Model/Category/Indexer/Product.php
 create mode 100644 app/code/Magento/Catalog/Model/Entity/Product/Attribute/Group/AttributeMapper.php
 create mode 100644 app/code/Magento/Catalog/Model/Entity/Product/Attribute/Group/AttributeMapperInterface.php
 delete mode 100644 app/code/Magento/Catalog/Model/Index.php
 create mode 100644 app/code/Magento/Catalog/Model/Indexer/Category/Product.php
 create mode 100644 app/code/Magento/Catalog/Model/Indexer/Category/Product/AbstractAction.php
 create mode 100644 app/code/Magento/Catalog/Model/Indexer/Category/Product/Action/Full.php
 create mode 100644 app/code/Magento/Catalog/Model/Indexer/Category/Product/Action/Rows.php
 create mode 100644 app/code/Magento/Catalog/Model/Indexer/Category/Product/Action/RowsFactory.php
 create mode 100644 app/code/Magento/Catalog/Model/Indexer/Category/Product/Plugin/IndexerState.php
 create mode 100644 app/code/Magento/Catalog/Model/Indexer/Category/Product/Plugin/MviewState.php
 rename app/code/Magento/Catalog/Model/Indexer/Category/{Flat/Plugin/AbstractStore.php => Product/Plugin/StoreGroup.php} (60%)
 create mode 100644 app/code/Magento/Catalog/Model/Indexer/Category/Product/Plugin/StoreView.php
 create mode 100644 app/code/Magento/Catalog/Model/Indexer/Product/Category.php
 create mode 100644 app/code/Magento/Catalog/Model/Indexer/Product/Category/Action/Rows.php
 create mode 100644 app/code/Magento/Catalog/Model/Indexer/Product/Category/Action/RowsFactory.php
 create mode 100644 app/code/Magento/Catalog/Model/Indexer/Product/Flat.php
 create mode 100644 app/code/Magento/Catalog/Model/Indexer/Product/Flat/AbstractAction.php
 create mode 100644 app/code/Magento/Catalog/Model/Indexer/Product/Flat/Action/Full.php
 create mode 100644 app/code/Magento/Catalog/Model/Indexer/Product/Flat/Action/Row.php
 create mode 100644 app/code/Magento/Catalog/Model/Indexer/Product/Flat/Action/Rows.php
 create mode 100644 app/code/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/Import.php
 create mode 100644 app/code/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/IndexerConfigData.php
 create mode 100644 app/code/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/Store.php
 create mode 100644 app/code/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/StoreGroup.php
 create mode 100644 app/code/Magento/Catalog/Model/Indexer/Product/Flat/Processor.php
 rename app/code/Magento/Catalog/Model/{System/Config/Backend/Catalog/Product/Flat.php => Indexer/Product/Flat/System/Config/Mode.php} (67%)
 create mode 100644 app/code/Magento/Catalog/Model/Product/Attribute/Source/Status.php
 delete mode 100644 app/code/Magento/Catalog/Model/Product/Flat/Flag.php
 delete mode 100644 app/code/Magento/Catalog/Model/Product/Flat/Indexer.php
 delete mode 100644 app/code/Magento/Catalog/Model/Product/Flat/Observer.php
 delete mode 100644 app/code/Magento/Catalog/Model/Product/Indexer/Flat.php
 create mode 100644 app/code/Magento/Catalog/Model/Product/PriceModifier/Composite.php
 create mode 100644 app/code/Magento/Catalog/Model/Product/PriceModifierInterface.php
 delete mode 100644 app/code/Magento/Catalog/Model/Product/Status.php
 create mode 100644 app/code/Magento/Catalog/Model/Product/TypeTransitionManager.php
 rename app/code/Magento/{Sales/Block/Adminhtml/Items/Renderer/Configurable.php => Catalog/Model/Product/Validator.php} (67%)
 delete mode 100644 app/code/Magento/Catalog/Model/Resource/Category/Indexer/Product.php
 delete mode 100644 app/code/Magento/Catalog/Model/Resource/Product/Collection/AssociatedProductUpdater.php
 delete mode 100644 app/code/Magento/Catalog/Model/Resource/Product/Flat/Indexer.php
 delete mode 100644 app/code/Magento/Catalog/Model/Resource/Product/Status.php
 create mode 100644 app/code/Magento/Catalog/Model/Resource/Setup/PropertyMapper.php
 create mode 100644 app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.24-1.6.0.0.25.php
 create mode 100644 app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.25-1.6.0.0.26.php
 delete mode 100644 app/code/Magento/Catalog/view/adminhtml/catalog/product/created.phtml
 create mode 100644 app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_set_edit.xml
 create mode 100644 app/code/Magento/CatalogInventory/Model/Quote/Item/QuantityValidator.php
 create mode 100644 app/code/Magento/CatalogInventory/Model/Quote/Item/QuantityValidator/Initializer/Option.php
 create mode 100644 app/code/Magento/CatalogInventory/Model/Quote/Item/QuantityValidator/Initializer/StockItem.php
 create mode 100644 app/code/Magento/CatalogInventory/Model/Quote/Item/QuantityValidator/QuoteItemQtyList.php
 delete mode 100644 app/code/Magento/CatalogInventory/view/adminhtml/layout/catalog_product_superconfig_config.xml
 rename app/code/Magento/{Core/Model/Layout/Argument/Handler/Number.php => CatalogRule/Model/Product/PriceModifier.php} (52%)
 create mode 100644 app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Attribute/Edit/Tab/Advanced/Observer.php
 rename app/code/Magento/{Catalog => ConfigurableProduct}/Block/Adminhtml/Product/Attribute/Edit/Tab/Variations/Main.php (84%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/Block/Adminhtml/Product/Attribute/NewAttribute/Product/Created.php (96%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/Block/Adminhtml/Product/Composite/Fieldset/Configurable.php (91%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/Block/Adminhtml/Product/Edit/Tab/Super/Config.php (82%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute.php (82%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/Block/Adminhtml/Product/Edit/Tab/Super/Config/Grid/Filter/Inventory.php (88%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/Block/Adminhtml/Product/Edit/Tab/Super/Config/Grid/Renderer/Checkbox.php (79%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/Block/Adminhtml/Product/Edit/Tab/Super/Config/Grid/Renderer/Inventory.php (87%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/Block/Adminhtml/Product/Edit/Tab/Super/Config/Matrix.php (95%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/Block/Adminhtml/Product/Edit/Tab/Super/Config/Simple.php (93%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/Block/Adminhtml/Product/Edit/Tab/Super/Settings.php (91%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/Block/Adminhtml/Product/Edit/Tabs/Configurable.php (73%)
 rename app/code/Magento/{Checkout => ConfigurableProduct}/Block/Cart/Item/Renderer/Configurable.php (95%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/Block/Product/Configurable/AssociatedSelector/Backend/Grid/ColumnSet.php (87%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/Block/Product/Configurable/AssociatedSelector/Renderer/Id.php (84%)
 create mode 100644 app/code/Magento/ConfigurableProduct/Block/Product/Configurable/AttributeSelector.php
 rename app/code/Magento/{Catalog => ConfigurableProduct}/Block/Product/View/Type/Configurable.php (94%)
 rename app/code/Magento/{CatalogInventory => ConfigurableProduct}/Block/Stockqty/Type/Configurable.php (77%)
 create mode 100644 app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product.php
 create mode 100644 app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Attribute/SuggestConfigurableAttributes.php
 create mode 100644 app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Builder/Plugin.php
 create mode 100644 app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/GenerateVariations.php
 rename app/code/Magento/{Catalog => ConfigurableProduct}/Controller/Adminhtml/Product/Initialization/Helper/Plugin/Configurable.php (88%)
 create mode 100644 app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Initialization/Helper/Plugin/Handler/ProductType/Configurable.php
 create mode 100644 app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/SuperConfig.php
 create mode 100644 app/code/Magento/ConfigurableProduct/Helper/Product/Configuration/Plugin.php
 create mode 100644 app/code/Magento/ConfigurableProduct/Model/Attribute/LockValidator.php
 create mode 100644 app/code/Magento/ConfigurableProduct/Model/Entity/Product/Attribute/Group/AttributeMapper/Plugin.php
 rename dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/TestObject.php => app/code/Magento/ConfigurableProduct/Model/Export/Entity/Product/Type/Configurable.php (80%)
 create mode 100644 app/code/Magento/ConfigurableProduct/Model/Export/RowCustomizer.php
 rename app/code/Magento/{ImportExport => ConfigurableProduct}/Model/Import/Entity/Product/Type/Configurable.php (96%)
 create mode 100644 app/code/Magento/ConfigurableProduct/Model/Order/Admin/Item/Plugin/Configurable.php
 create mode 100644 app/code/Magento/ConfigurableProduct/Model/Product/CartConfiguration/Plugin/Configurable.php
 rename app/code/Magento/{Catalog => ConfigurableProduct}/Model/Product/Type/Configurable.php (92%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/Model/Product/Type/Configurable/Attribute.php (77%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/Model/Product/Type/Configurable/Price.php (72%)
 create mode 100644 app/code/Magento/ConfigurableProduct/Model/Product/Type/Plugin.php
 create mode 100644 app/code/Magento/ConfigurableProduct/Model/Product/TypeTransitionManager/Plugin/Configurable.php
 create mode 100644 app/code/Magento/ConfigurableProduct/Model/Product/Validator/Plugin.php
 create mode 100644 app/code/Magento/ConfigurableProduct/Model/Quote/Item/QuantityValidator/Initializer/Option/Plugin/ConfigurableProduct.php
 rename app/code/Magento/{CatalogInventory => ConfigurableProduct}/Model/Resource/Indexer/Stock/Configurable.php (75%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/Model/Resource/Product/Collection/AssociatedProduct.php (81%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/Model/Resource/Product/Indexer/Price/Configurable.php (92%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/Model/Resource/Product/Type/Configurable.php (97%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/Model/Resource/Product/Type/Configurable/Attribute.php (93%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/Model/Resource/Product/Type/Configurable/Attribute/Collection.php (92%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/Model/Resource/Product/Type/Configurable/Product/Collection.php (86%)
 create mode 100644 app/code/Magento/ConfigurableProduct/Model/Resource/Setup/PropertyMapper.php
 rename app/code/Magento/{Catalog/Block/Product/Configurable/AttributeSelector.php => ConfigurableProduct/Model/SuggestedAttributeList.php} (72%)
 create mode 100644 app/code/Magento/ConfigurableProduct/data/configurableproduct_setup/data-install-1.0.0.0.php
 create mode 100644 app/code/Magento/ConfigurableProduct/etc/adminhtml/di.xml
 rename dev/tests/unit/testsuite/Magento/Interception/Custom/Module/etc/frontend/di.xml => app/code/Magento/ConfigurableProduct/etc/adminhtml/events.xml (73%)
 rename dev/tests/unit/testsuite/Magento/Interception/Custom/Module/etc/di.xml => app/code/Magento/ConfigurableProduct/etc/adminhtml/routes.xml (83%)
 create mode 100644 app/code/Magento/ConfigurableProduct/etc/adminhtml/system.xml
 create mode 100644 app/code/Magento/ConfigurableProduct/etc/config.xml
 create mode 100644 app/code/Magento/ConfigurableProduct/etc/di.xml
 create mode 100644 app/code/Magento/ConfigurableProduct/etc/eav_attributes.xml
 create mode 100644 app/code/Magento/ConfigurableProduct/etc/export.xml
 create mode 100644 app/code/Magento/ConfigurableProduct/etc/import.xml
 create mode 100644 app/code/Magento/ConfigurableProduct/etc/module.xml
 create mode 100644 app/code/Magento/ConfigurableProduct/etc/product_types.xml
 create mode 100644 app/code/Magento/ConfigurableProduct/etc/sales.xml
 create mode 100644 app/code/Magento/ConfigurableProduct/i18n/de_DE.csv
 create mode 100644 app/code/Magento/ConfigurableProduct/i18n/en_US.csv
 create mode 100644 app/code/Magento/ConfigurableProduct/i18n/es_ES.csv
 create mode 100644 app/code/Magento/ConfigurableProduct/i18n/fr_FR.csv
 create mode 100644 app/code/Magento/ConfigurableProduct/i18n/nl_NL.csv
 create mode 100644 app/code/Magento/ConfigurableProduct/i18n/pt_BR.csv
 create mode 100644 app/code/Magento/ConfigurableProduct/i18n/zh_CN.csv
 create mode 100644 app/code/Magento/ConfigurableProduct/sql/configurable_setup/install-1.0.0.0.php
 rename app/code/Magento/{Catalog => ConfigurableProduct}/view/adminhtml/catalog/product-variation.js (99%)
 create mode 100644 app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/attribute.js
 create mode 100644 app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/attribute/js.phtml
 rename app/code/Magento/{Catalog => ConfigurableProduct}/view/adminhtml/catalog/product/attribute/new/created.phtml (93%)
 create mode 100644 app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/attribute/set/js.phtml
 rename app/code/Magento/{Catalog => ConfigurableProduct}/view/adminhtml/catalog/product/composite/fieldset/configurable.phtml (94%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/view/adminhtml/catalog/product/edit/super/attribute-js-template.phtml (100%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/view/adminhtml/catalog/product/edit/super/attribute-template.phtml (100%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/view/adminhtml/catalog/product/edit/super/config.phtml (96%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/view/adminhtml/catalog/product/edit/super/generator.phtml (94%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/view/adminhtml/catalog/product/edit/super/matrix.phtml (99%)
 rename {pub/lib/varien => app/code/Magento/ConfigurableProduct/view/adminhtml/js}/configurable.js (99%)
 create mode 100644 app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_attribute_edit.xml
 rename app/code/Magento/{Catalog => ConfigurableProduct}/view/adminhtml/layout/catalog_product_attribute_edit_product_tab_variations_popup.xml (93%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/view/adminhtml/layout/catalog_product_configurable.xml (57%)
 rename app/code/Magento/{Catalog/view/adminhtml/layout/catalog_product_configurable_new.xml => ConfigurableProduct/view/adminhtml/layout/catalog_product_downloadable.xml} (57%)
 rename app/code/Magento/{Catalog/view/adminhtml/layout/catalog_product_generatevariations.xml => ConfigurableProduct/view/adminhtml/layout/catalog_product_generatevariations_index.xml} (55%)
 create mode 100644 app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_new.xml
 create mode 100644 app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_set_edit.xml
 rename app/code/Magento/{Catalog => ConfigurableProduct}/view/adminhtml/layout/catalog_product_simple.xml (57%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/view/adminhtml/layout/catalog_product_superconfig_config.xml (73%)
 rename app/code/Magento/{Catalog/view/adminhtml/layout/catalog_product_superconfig.xml => ConfigurableProduct/view/adminhtml/layout/catalog_product_superconfig_index.xml} (100%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/view/adminhtml/layout/catalog_product_view_type_configurable.xml (80%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/view/adminhtml/layout/catalog_product_virtual.xml (57%)
 create mode 100644 app/code/Magento/ConfigurableProduct/view/adminhtml/layout/default.xml
 rename app/code/Magento/{Catalog => ConfigurableProduct}/view/adminhtml/product/configurable/affected-attribute-set-selector/form.phtml (97%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/view/adminhtml/product/configurable/affected-attribute-set-selector/js.phtml (97%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/view/adminhtml/product/configurable/attribute-selector/js.phtml (92%)
 create mode 100644 app/code/Magento/ConfigurableProduct/view/adminhtml/product/configurable/stock/disabler.phtml
 create mode 100644 app/code/Magento/ConfigurableProduct/view/adminhtml/product/product.css
 rename app/code/Magento/{Catalog => ConfigurableProduct}/view/frontend/js/configurable.js (99%)
 rename app/code/Magento/{Catalog => ConfigurableProduct}/view/frontend/layout/catalog_product_view_type_configurable.xml (70%)
 rename app/code/Magento/{Checkout => ConfigurableProduct}/view/frontend/layout/checkout_cart_configure_type_configurable.xml (100%)
 create mode 100644 app/code/Magento/ConfigurableProduct/view/frontend/layout/checkout_cart_item_renderers.xml
 create mode 100644 app/code/Magento/ConfigurableProduct/view/frontend/layout/checkout_cart_sidebar_item_renderers.xml
 create mode 100644 app/code/Magento/ConfigurableProduct/view/frontend/layout/checkout_onepage_review_item_renderers.xml
 rename app/code/Magento/{Catalog => ConfigurableProduct}/view/frontend/product/view/type/options/configurable.phtml (91%)
 delete mode 100644 app/code/Magento/Core/Model/Layout/Argument/AbstractHandler.php
 delete mode 100644 app/code/Magento/Core/Model/Layout/Argument/Handler/ArrayHandler.php
 delete mode 100644 app/code/Magento/Core/Model/Layout/Argument/Handler/Helper.php
 delete mode 100644 app/code/Magento/Core/Model/Layout/Argument/Handler/Object.php
 delete mode 100644 app/code/Magento/Core/Model/Layout/Argument/Handler/Options.php
 delete mode 100644 app/code/Magento/Core/Model/Layout/Argument/Handler/String.php
 delete mode 100644 app/code/Magento/Core/Model/Layout/Argument/Handler/Url.php
 delete mode 100644 app/code/Magento/Core/Model/Layout/Argument/Processor.php
 delete mode 100644 app/code/Magento/Core/etc/types.xsd
 create mode 100644 app/code/Magento/Customer/Model/Resource/Setup/PropertyMapper.php
 create mode 100644 app/code/Magento/Customer/Service/V1/Dto/Search/AbstractFilterGroup.php
 create mode 100644 app/code/Magento/Customer/Service/V1/Dto/Search/AbstractFilterGroupBuilder.php
 rename app/code/Magento/{ImportExport/Model/Export/Entity/Product/Type/Configurable.php => Customer/Service/V1/Dto/Search/AndGroup.php} (70%)
 rename dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/TestOptions.php => app/code/Magento/Customer/Service/V1/Dto/Search/AndGroupBuilder.php (78%)
 create mode 100644 app/code/Magento/Customer/Service/V1/Dto/Search/FilterGroupInterface.php
 create mode 100644 app/code/Magento/Customer/Service/V1/Dto/Search/OrGroup.php
 create mode 100644 app/code/Magento/Customer/Service/V1/Dto/Search/OrGroupBuilder.php
 rename lib/Magento/Phrase/Renderer/Factory.php => app/code/Magento/DesignEditor/Model/AreaEmulator.php (68%)
 create mode 100644 app/code/Magento/Downloadable/Model/Product/TypeTransitionManager/Plugin/Downloadable.php
 create mode 100644 app/code/Magento/Eav/Model/Entity/Setup/Context.php
 create mode 100644 app/code/Magento/Eav/Model/Entity/Setup/PropertyMapper.php
 create mode 100644 app/code/Magento/Eav/Model/Entity/Setup/PropertyMapper/Composite.php
 create mode 100644 app/code/Magento/Eav/Model/Entity/Setup/PropertyMapperAbstract.php
 create mode 100644 app/code/Magento/Eav/Model/Entity/Setup/PropertyMapperInterface.php
 create mode 100644 app/code/Magento/GroupedProduct/view/adminhtml/layout/catalog_product_new.xml
 create mode 100644 app/code/Magento/GroupedProduct/view/adminhtml/product/stock/disabler.phtml
 create mode 100644 app/code/Magento/ImportExport/Model/Export/RowCustomizer/Composite.php
 create mode 100644 app/code/Magento/ImportExport/Model/Export/RowCustomizerInterface.php
 create mode 100644 app/code/Magento/Multishipping/Helper/Data.php
 create mode 100644 app/code/Magento/Multishipping/etc/adminhtml/acl.xml
 create mode 100644 app/code/Magento/Multishipping/etc/adminhtml/system.xml
 create mode 100644 app/code/Magento/Multishipping/etc/config.xml
 create mode 100644 app/code/Magento/Sales/Model/Order/Admin/Item.php
 delete mode 100644 app/code/Magento/Sales/view/adminhtml/order/creditmemo/create/items/renderer/configurable.phtml
 delete mode 100644 app/code/Magento/Sales/view/adminhtml/order/creditmemo/view/items/renderer/configurable.phtml
 delete mode 100644 app/code/Magento/Sales/view/adminhtml/order/invoice/create/items/renderer/configurable.phtml
 delete mode 100644 app/code/Magento/Sales/view/adminhtml/order/invoice/view/items/renderer/configurable.phtml
 delete mode 100644 app/code/Magento/Shipping/view/adminhtml/create/items/renderer/configurable.phtml
 create mode 100644 dev/tests/integration/framework/Magento/TestFramework/App/Arguments/Proxy.php
 create mode 100644 dev/tests/integration/framework/Magento/TestFramework/Indexer/TestCase.php
 create mode 100644 dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/App/Arguments/ProxyTest.php
 rename dev/tests/{unit/testsuite/Magento/Catalog/Helper/Product/FlatTest.php => integration/testsuite/Magento/App/ObjectManager/ConfigLoader/PrimaryTest.php} (60%)
 create mode 100644 dev/tests/integration/testsuite/Magento/Backend/Block/Widget/Grid/Massaction/AdditionalTest.php
 create mode 100644 dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Category/ProductTest.php
 create mode 100644 dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Product/CategoryTest.php
 create mode 100644 dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Action/FullTest.php
 create mode 100644 dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Action/RowTest.php
 create mode 100644 dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Action/RowsTest.php
 create mode 100644 dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/ProcessorTest.php
 create mode 100644 dev/tests/integration/testsuite/Magento/Catalog/_files/indexer_catalog_category.php
 create mode 100644 dev/tests/integration/testsuite/Magento/Catalog/_files/row_fixture.php
 create mode 100644 dev/tests/integration/testsuite/Magento/Catalog/_files/row_fixture_rollback.php
 rename dev/tests/integration/testsuite/Magento/{Catalog => ConfigurableProduct}/Block/Adminhtml/Product/Edit/Tab/Super/Config/MatrixTest.php (89%)
 rename dev/tests/integration/testsuite/Magento/{Catalog => ConfigurableProduct}/Block/Adminhtml/Product/Edit/Tab/Super/ConfigTest.php (82%)
 rename dev/tests/integration/testsuite/Magento/{Catalog => ConfigurableProduct}/Block/Adminhtml/Product/Edit/Tab/Super/SettingsTest.php (89%)
 rename dev/tests/integration/testsuite/Magento/{Catalog => ConfigurableProduct}/Block/Product/Configurable/AssociatedSelector/Backend/Grid/ColumnSetTest.php (81%)
 rename dev/tests/integration/testsuite/Magento/{Catalog => ConfigurableProduct}/Block/Product/View/Type/ConfigurableTest.php (83%)
 create mode 100644 dev/tests/integration/testsuite/Magento/ConfigurableProduct/Controller/Adminhtml/ProductTest.php
 create mode 100644 dev/tests/integration/testsuite/Magento/ConfigurableProduct/Controller/CartTest.php
 rename dev/tests/integration/testsuite/Magento/{Catalog => ConfigurableProduct}/Model/Product/Type/Configurable/AttributeTest.php (85%)
 rename dev/tests/integration/testsuite/Magento/{Catalog => ConfigurableProduct}/Model/Product/Type/Configurable/PriceTest.php (83%)
 rename dev/tests/integration/testsuite/Magento/{Catalog => ConfigurableProduct}/Model/Product/Type/ConfigurableTest.php (95%)
 rename dev/tests/integration/testsuite/Magento/{Catalog => ConfigurableProduct}/Model/Resource/Product/Collection/AssociatedProductTest.php (89%)
 rename dev/tests/integration/testsuite/Magento/{Catalog => ConfigurableProduct}/_files/product_configurable.php (94%)
 rename dev/tests/integration/testsuite/Magento/{Checkout => ConfigurableProduct}/_files/quote_with_configurable_product.php (92%)
 create mode 100644 dev/tests/integration/testsuite/Magento/Customer/Model/Resource/Group/Grid/ServiceCollectionTest.php
 create mode 100644 dev/tests/integration/testsuite/Magento/Data/Argument/Interpreter/StringTest.php
 create mode 100644 dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/CircularTest.php
 create mode 100644 dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/Parser/Config/XmlTest.php
 create mode 100644 dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/Report/CircularTest.php
 create mode 100644 dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/Report/DependencyTest.php
 create mode 100644 dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/Report/FrameworkTest.php
 create mode 100644 dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/code/Magento/FirstModule/Helper/Helper.php
 create mode 100644 dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/code/Magento/FirstModule/Model/Model.php
 create mode 100644 dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/code/Magento/FirstModule/Model/WithoutDependencies.php
 create mode 100644 dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/code/Magento/FirstModule/etc/module.xml
 rename app/code/Magento/Shipping/view/adminhtml/view/items/renderer/configurable.phtml => dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/code/Magento/FirstModule/view/frontend/template.phtml (78%)
 create mode 100644 dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/config1.xml
 create mode 100644 dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/config2.xml
 create mode 100644 dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/config3.xml
 create mode 100644 dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/config4.xml
 create mode 100644 dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/config5.xml
 create mode 100644 dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/expected/circular-dependencies.csv
 create mode 100644 dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/expected/dependencies.csv
 create mode 100644 dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/expected/framework-dependencies.csv
 create mode 100644 dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/expected/without-circular-dependencies.csv
 create mode 100644 dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/expected/without-dependencies.csv
 create mode 100644 dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/expected/without-framework-dependencies.csv
 create mode 100644 dev/tests/performance/testsuite/fixtures/catalog_category_flat_enabled.php
 create mode 100644 dev/tests/performance/testsuite/fixtures/catalog_product_flat_enabled.php
 create mode 100644 dev/tests/static/testsuite/Magento/Test/Legacy/Magento/ObjectManager/DiConfigTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/App/Arguments/ArgumentInterpreterTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Bundle/Model/Product/Attribute/Source/Price/ViewTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Controller/Adminhtml/Product/BuilderTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper/HandlerFactoryTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper/Plugin/Handler/CompositeTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Helper/Product/Flat/IndexerTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Model/Attribute/LockValidatorCompositeTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Category/Product/Plugin/IndexerStateTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Category/Product/Plugin/MviewStateTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Category/Product/Plugin/StoreGroupTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Category/Product/Plugin/StoreViewTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Category/ProductTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/CategoryTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Action/RowTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Action/RowsTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/ImportTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/IndexerConfigDataTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/StoreGroupTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/StoreTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/ProcessorTest.php
 delete mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Model/ObserverTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Model/Product/Attribute/Source/Msrp/Type/EnabledTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Model/Product/Attribute/Source/Msrp/Type/PriceTest.php
 delete mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Model/Product/Indexer/FlatTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Model/Product/PriceModifier/CompositeTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Model/Product/TypeTransitionManagerTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Model/Product/ValidatorTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Model/Product/VisibilityTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Model/ProductTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Model/Resource/Eav/AttributeTest.php
 delete mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Model/Resource/Product/Collection/AssociatedProductUpdaterTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Catalog/Model/Resource/Product/FlatTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/CatalogInventory/Model/Quote/Item/QuantityValidator/Initializer/OptionTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/CatalogRule/Model/Product/PriceModifierTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Config/Dom/ArrayNodeConfigTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Config/Dom/NodeMergingConfigTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Config/Dom/NodePathMatcherTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Config/_files/dom/attributes.xml
 create mode 100644 dev/tests/unit/testsuite/Magento/Config/_files/dom/attributes_merged.xml
 create mode 100644 dev/tests/unit/testsuite/Magento/Config/_files/dom/attributes_new.xml
 rename dev/tests/unit/testsuite/Magento/{Interception/Custom/Module/etc/backend/di.xml => Config/_files/dom/types.xml} (68%)
 create mode 100644 dev/tests/unit/testsuite/Magento/Config/_files/dom/types_merged.xml
 create mode 100644 dev/tests/unit/testsuite/Magento/Config/_files/dom/types_new.xml
 rename dev/tests/unit/testsuite/Magento/{Catalog => ConfigurableProduct}/Block/Adminhtml/Product/Edit/Tab/Super/Config/MatrixTest.php (85%)
 rename dev/tests/unit/testsuite/Magento/{Checkout => ConfigurableProduct}/Block/Cart/Item/Renderer/ConfigurableTest.php (91%)
 create mode 100644 dev/tests/unit/testsuite/Magento/ConfigurableProduct/Block/Product/Configurable/AttributeSelectorTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Attribute/SuggestConfigurableAttributesTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Builder/PluginTest.php
 rename dev/tests/unit/testsuite/Magento/{Catalog => ConfigurableProduct}/Controller/Adminhtml/Product/Initialization/Helper/Plugin/ConfigurableTest.php (93%)
 create mode 100644 dev/tests/unit/testsuite/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Initialization/Helper/Plugin/Handler/ProductType/ConfigurableTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/ConfigurableProduct/Helper/Product/Configuration/PluginTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/ConfigurableProduct/Model/Order/Admin/Item/Plugin/ConfigurableTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/ConfigurableProduct/Model/Product/CartConfiguration/Plugin/ConfigurableTest.php
 rename dev/tests/unit/testsuite/Magento/{Catalog => ConfigurableProduct}/Model/Product/Type/ConfigurableTest.php (63%)
 create mode 100644 dev/tests/unit/testsuite/Magento/ConfigurableProduct/Model/Product/TypeTransitionManager/Plugin/ConfigurableTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/ConfigurableProduct/Model/Product/Validator/PluginTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/ConfigurableProduct/Model/SuggestedAttributeListTest.php
 delete mode 100644 dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/AbstractHandlerTest.php
 delete mode 100644 dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/ArrayTest.php
 delete mode 100644 dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/BooleanTest.php
 delete mode 100644 dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/HelperTest.php
 delete mode 100644 dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/NumberTest.php
 delete mode 100644 dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/ObjectTest.php
 delete mode 100644 dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/OptionsTest.php
 delete mode 100644 dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/StringTest.php
 delete mode 100644 dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/UrlTest.php
 delete mode 100644 dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/ProcessorTest.php
 delete mode 100644 dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/UpdaterTest.php
 delete mode 100644 dev/tests/unit/testsuite/Magento/Core/Model/Layout/FactoryTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Core/Model/Layout/XsdTest.php
 rename dev/tests/unit/testsuite/Magento/Core/Model/Layout/{Argument/Handler => }/_files/arguments.xml (82%)
 create mode 100644 dev/tests/unit/testsuite/Magento/Core/Model/Layout/_files/invalidLayoutArgumentsXmlArray.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Customer/Model/Resource/Group/Grid/ServiceCollectionTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Data/Argument/Interpreter/ArrayTypeTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Data/Argument/Interpreter/BooleanTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Data/Argument/Interpreter/CompositeTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Data/Argument/Interpreter/ConstantTest.php
 rename dev/tests/unit/testsuite/Magento/{Core/Model/Layout/Argument/Handler/TestHelper.php => Data/Argument/Interpreter/NullTypeTest.php} (79%)
 create mode 100644 dev/tests/unit/testsuite/Magento/Data/Argument/Interpreter/NumberTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Data/Argument/XsdTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Data/Argument/_files/typesInvalidArray.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Data/Argument/_files/types_schema.xsd
 create mode 100644 dev/tests/unit/testsuite/Magento/Data/Argument/_files/types_valid.xml
 rename dev/tests/{integration/testsuite/Magento/Catalog/Model/Resource/Product/Flat/IndexerTest.php => unit/testsuite/Magento/DesignEditor/Model/AreaEmulatorTest.php} (50%)
 create mode 100644 dev/tests/unit/testsuite/Magento/Downloadable/Model/Product/TypeTransitionManager/Plugin/DownloadableTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Eav/Model/Entity/Attribute/Source/BooleanTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Eav/Model/Entity/Attribute/Source/TableTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Interception/FactoryDecoratorTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Interception/_files/reader_mock_map.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Multishipping/Helper/DataTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/ObjectManager/Config/Argument/Interpreter/ObjectTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/ObjectManager/Config/Argument/ObjectFactoryTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/ObjectManager/Config/ConfigTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/ObjectManager/Config/Mapper/ArgumentParserTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/ObjectManager/Config/Mapper/_files/argument_parser.xml
 create mode 100644 dev/tests/unit/testsuite/Magento/ObjectManager/Factory/FactoryTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/ObjectManager/Factory/Fixture/CircularOne.php
 create mode 100644 dev/tests/unit/testsuite/Magento/ObjectManager/Factory/Fixture/CircularThree.php
 create mode 100644 dev/tests/unit/testsuite/Magento/ObjectManager/Factory/Fixture/CircularTwo.php
 create mode 100644 dev/tests/unit/testsuite/Magento/ObjectManager/Factory/Fixture/OneScalar.php
 create mode 100644 dev/tests/unit/testsuite/Magento/ObjectManager/Factory/Fixture/Polymorphous.php
 create mode 100644 dev/tests/unit/testsuite/Magento/ObjectManager/Factory/Fixture/Two.php
 delete mode 100644 dev/tests/unit/testsuite/Magento/Phrase/Renderer/FactoryTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Stdlib/BooleanUtilsTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Tax/Model/Resource/SetupTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Tax/Model/TaxClass/Source/ProductTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Parser/CodeTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Parser/Config/XmlTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Builder/AbstractBuilderTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Circular/Data/ChainTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Circular/Data/ConfigTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Circular/Data/ModuleTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Data/Config/AbstractConfigTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Dependency/Data/ConfigTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Dependency/Data/DependencyTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Dependency/Data/ModuleTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Framework/BuilderTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Framework/Data/ConfigTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Framework/Data/DependencyTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Framework/Data/ModuleTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Writer/Csv/AbstractWriterTest.php
 delete mode 100644 dev/tests/unit/testsuite/Magento/View/Layout/Argument/HandlerFactoryTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/View/Layout/Argument/Interpreter/Decorator/UpdaterTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/View/Layout/Argument/Interpreter/HelperMethodTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/View/Layout/Argument/Interpreter/NamedParamsTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/View/Layout/Argument/Interpreter/ObjectTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/View/Layout/Argument/Interpreter/OptionsTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/View/Layout/Argument/Interpreter/UrlTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/View/Layout/Argument/ParserTest.php
 create mode 100644 dev/tests/unit/testsuite/Magento/View/Layout/Argument/_files/arguments.xml
 create mode 100644 dev/tools/Magento/Tools/Dependency/Circular.php
 create mode 100644 dev/tools/Magento/Tools/Dependency/Parser/Code.php
 create mode 100644 dev/tools/Magento/Tools/Dependency/Parser/Config/Xml.php
 create mode 100644 dev/tools/Magento/Tools/Dependency/ParserInterface.php
 create mode 100644 dev/tools/Magento/Tools/Dependency/Report/Builder/AbstractBuilder.php
 create mode 100644 dev/tools/Magento/Tools/Dependency/Report/BuilderInterface.php
 create mode 100644 dev/tools/Magento/Tools/Dependency/Report/Circular/Builder.php
 create mode 100644 dev/tools/Magento/Tools/Dependency/Report/Circular/Data/Chain.php
 create mode 100644 dev/tools/Magento/Tools/Dependency/Report/Circular/Data/Config.php
 create mode 100644 dev/tools/Magento/Tools/Dependency/Report/Circular/Data/Module.php
 create mode 100644 dev/tools/Magento/Tools/Dependency/Report/Circular/Writer.php
 create mode 100644 dev/tools/Magento/Tools/Dependency/Report/Data/Config/AbstractConfig.php
 create mode 100644 dev/tools/Magento/Tools/Dependency/Report/Data/ConfigInterface.php
 create mode 100644 dev/tools/Magento/Tools/Dependency/Report/Dependency/Builder.php
 create mode 100644 dev/tools/Magento/Tools/Dependency/Report/Dependency/Data/Config.php
 create mode 100644 dev/tools/Magento/Tools/Dependency/Report/Dependency/Data/Dependency.php
 create mode 100644 dev/tools/Magento/Tools/Dependency/Report/Dependency/Data/Module.php
 create mode 100644 dev/tools/Magento/Tools/Dependency/Report/Dependency/Writer.php
 create mode 100644 dev/tools/Magento/Tools/Dependency/Report/Framework/Builder.php
 create mode 100644 dev/tools/Magento/Tools/Dependency/Report/Framework/Data/Config.php
 create mode 100644 dev/tools/Magento/Tools/Dependency/Report/Framework/Data/Dependency.php
 create mode 100644 dev/tools/Magento/Tools/Dependency/Report/Framework/Data/Module.php
 create mode 100644 dev/tools/Magento/Tools/Dependency/Report/Framework/Writer.php
 create mode 100644 dev/tools/Magento/Tools/Dependency/Report/Writer/Csv/AbstractWriter.php
 create mode 100644 dev/tools/Magento/Tools/Dependency/Report/WriterInterface.php
 create mode 100644 dev/tools/Magento/Tools/Dependency/ServiceLocator.php
 create mode 100644 dev/tools/Magento/Tools/Dependency/generate/bootstrap.php
 create mode 100644 dev/tools/Magento/Tools/Dependency/generate/framework-dependencies.php
 create mode 100644 dev/tools/Magento/Tools/Dependency/generate/modules-circular-dependencies.php
 create mode 100644 dev/tools/Magento/Tools/Dependency/generate/modules-dependencies.php
 create mode 100644 lib/Magento/App/Arguments/ArgumentInterpreter.php
 create mode 100644 lib/Magento/Config/Dom/ArrayNodeConfig.php
 create mode 100644 lib/Magento/Config/Dom/NodeMergingConfig.php
 create mode 100644 lib/Magento/Config/Dom/NodePathMatcher.php
 rename app/code/Magento/Core/Model/Layout/Argument/Handler/Boolean.php => lib/Magento/Data/Argument/Interpreter/ArrayType.php (52%)
 create mode 100644 lib/Magento/Data/Argument/Interpreter/Boolean.php
 create mode 100644 lib/Magento/Data/Argument/Interpreter/Composite.php
 create mode 100644 lib/Magento/Data/Argument/Interpreter/Constant.php
 create mode 100644 lib/Magento/Data/Argument/Interpreter/NullType.php
 create mode 100644 lib/Magento/Data/Argument/Interpreter/Number.php
 create mode 100644 lib/Magento/Data/Argument/Interpreter/String.php
 rename lib/Magento/{View/Layout/Argument/HandlerInterface.php => Data/Argument/InterpreterInterface.php} (68%)
 create mode 100644 lib/Magento/Data/Argument/MissingOptionalValueException.php
 create mode 100644 lib/Magento/Data/OptionSourceInterface.php
 create mode 100644 lib/Magento/Data/etc/argument/types.xsd
 create mode 100644 lib/Magento/Mview/View/AbstractFactory.php
 create mode 100644 lib/Magento/ObjectManager/Config/Argument/Interpreter/Object.php
 create mode 100644 lib/Magento/ObjectManager/Config/Argument/ObjectFactory.php
 create mode 100644 lib/Magento/ObjectManager/Config/Mapper/ArgumentParser.php
 create mode 100644 lib/Magento/Stdlib/BooleanUtils.php
 delete mode 100644 lib/Magento/View/Layout/Argument/HandlerFactory.php
 create mode 100644 lib/Magento/View/Layout/Argument/Interpreter/Decorator/Updater.php
 create mode 100644 lib/Magento/View/Layout/Argument/Interpreter/HelperMethod.php
 create mode 100644 lib/Magento/View/Layout/Argument/Interpreter/NamedParams.php
 create mode 100644 lib/Magento/View/Layout/Argument/Interpreter/Object.php
 create mode 100644 lib/Magento/View/Layout/Argument/Interpreter/Options.php
 create mode 100644 lib/Magento/View/Layout/Argument/Interpreter/Url.php
 create mode 100644 lib/Magento/View/Layout/Argument/Parser.php
 rename {app/code/Magento/Core/Model => lib/Magento/View}/Layout/Argument/UpdaterInterface.php (73%)
 delete mode 100644 pub/lib/varien/product.js

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 370a2aca824..9de4035df58 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,28 @@
+2.0.0.0-dev66
+=============
+* GitHub requests:
+  * [#134] (https://github.com/magento/magento2/pull/134) Fixed a typo in "Vorarlberg" region of Austria (was Voralberg)
+* Fixed bugs:
+  * Fixed an issue with the "Add to Cart" button on the MAP popup of compound products
+  * Fixed an issue where the "Add Address" button for Customer in Admin was broken
+  * Fixed an issue where predefined data are not loaded for a newsletter when it is added to a queue
+* Indexer implementation:
+  * Implemented a new optimized Catalog Category Product Indexer
+  * Implemented a new optimized Catalog Category Flat Indexer
+  * Implemented a new optimized Catalog Product Flat Indexer
+* Modularity improvements:
+  * Moved all Configurable Product functionality to a newly created ConfigurableProduct module
+  * Moved the Shortcut Buttons abstraction from PayPal to Catalog
+  * Moved the Recurring profile functionality to a separate module
+  * Moved the Billing Agreements functionality to the PayPal module
+  * Finalized the work on resolving dependencies between the Multishipping module, and all other modules. Module can be removed without any impact on the system
+* Customer Service usage:
+ * Updated Customer Group Grid to use Customer Service for data retrieving and filtering
+ * Updated CustomerMetadataService::getAttributeMetadata to throw an exception if invalid code is provided
+* Unified the format of specifying arguments for class constructors in DI and in Layout configuration:
+  * A common xsd schema is being used for defining simple types. Layout and DI customize common types with their specific ones
+  * Argument processing is unified, and moved to library
+
 2.0.0.0-dev65
 =============
 * Fixed bugs:
@@ -21,7 +46,7 @@
 * Improvements in code coverage calculation:
   * Added code coverage calculation in the clover xml format for unit tests
 * GitHub requests:
- * [#377] (https://github.com/magento/magento2/issues/377) Remove and avoid javascript eval() calls 
+ * [#377] (https://github.com/magento/magento2/issues/377) Remove and avoid javascript eval() calls
  * [#319] (https://github.com/magento/magento2/issues/319) No message was displayed when product added to shopping cart.
  * [#367] (https://github.com/magento/magento2/issues/367) Improve the error message from the contact form
  * [#469] (https://github.com/magento/magento2/issues/469) Can't change prices on different websites for custom options
diff --git a/app/code/Magento/AdminNotification/Block/Inbox.php b/app/code/Magento/AdminNotification/Block/Inbox.php
index 964ca1d0a96..c87c86aaec5 100644
--- a/app/code/Magento/AdminNotification/Block/Inbox.php
+++ b/app/code/Magento/AdminNotification/Block/Inbox.php
@@ -29,6 +29,9 @@ namespace Magento\AdminNotification\Block;
 
 class Inbox extends \Magento\Backend\Block\Widget\Grid\Container
 {
+    /**
+     * @return void
+     */
     protected function _construct()
     {
         $this->_controller = 'adminhtml';
@@ -37,6 +40,9 @@ class Inbox extends \Magento\Backend\Block\Widget\Grid\Container
         parent::_construct();
     }
 
+    /**
+     * @return $this
+     */
     protected function _prepareLayout()
     {
         parent::_prepareLayout();
diff --git a/app/code/Magento/AdminNotification/Block/System/Messages.php b/app/code/Magento/AdminNotification/Block/System/Messages.php
index 5087c8f3e44..b13e6a6d1ec 100644
--- a/app/code/Magento/AdminNotification/Block/System/Messages.php
+++ b/app/code/Magento/AdminNotification/Block/System/Messages.php
@@ -55,6 +55,8 @@ class Messages extends \Magento\Backend\Block\Template
     }
 
     /**
+     * Prepare html output
+     *
      * @return string
      */
     protected function _toHtml()
diff --git a/app/code/Magento/AdminNotification/Block/System/Messages/UnreadMessagePopup.php b/app/code/Magento/AdminNotification/Block/System/Messages/UnreadMessagePopup.php
index 9d62c4888b4..fbc13f17552 100644
--- a/app/code/Magento/AdminNotification/Block/System/Messages/UnreadMessagePopup.php
+++ b/app/code/Magento/AdminNotification/Block/System/Messages/UnreadMessagePopup.php
@@ -23,6 +23,8 @@
  */
 namespace Magento\AdminNotification\Block\System\Messages;
 
+use Magento\AdminNotification\Model\System\MessageInterface;
+
 class UnreadMessagePopup extends \Magento\Backend\Block\Template
 {
     /**
@@ -31,8 +33,8 @@ class UnreadMessagePopup extends \Magento\Backend\Block\Template
      * @var array
      */
     protected $_itemClasses = array(
-        \Magento\AdminNotification\Model\System\MessageInterface::SEVERITY_CRITICAL => 'error',
-        \Magento\AdminNotification\Model\System\MessageInterface::SEVERITY_MAJOR => 'warning'
+        MessageInterface::SEVERITY_CRITICAL => 'error',
+        MessageInterface::SEVERITY_MAJOR => 'warning'
     );
 
     /**
@@ -72,7 +74,7 @@ class UnreadMessagePopup extends \Magento\Backend\Block\Template
     /**
      * Retrieve list of unread messages
      *
-     * @return mixed
+     * @return MessageInterface[]
      */
     public function getUnreadMessages()
     {
@@ -97,10 +99,10 @@ class UnreadMessagePopup extends \Magento\Backend\Block\Template
     /**
      * Retrieve item class by severity
      *
-     * @param \Magento\AdminNotification\Model\System\MessageInterface $message
-     * @return mixed
+     * @param MessageInterface $message
+     * @return string
      */
-    public function getItemClass(\Magento\AdminNotification\Model\System\MessageInterface $message)
+    public function getItemClass(MessageInterface $message)
     {
         return $this->_itemClasses[$message->getSeverity()];
     }
diff --git a/app/code/Magento/AdminNotification/Block/ToolbarEntry.php b/app/code/Magento/AdminNotification/Block/ToolbarEntry.php
index 06c825669aa..e5f26daba64 100644
--- a/app/code/Magento/AdminNotification/Block/ToolbarEntry.php
+++ b/app/code/Magento/AdminNotification/Block/ToolbarEntry.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\AdminNotification\Block;
 
 /**
  * Toolbar entry that shows latest notifications
@@ -31,8 +32,6 @@
  * @package     Magento_AdminNotification
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\AdminNotification\Block;
-
 class ToolbarEntry extends \Magento\Backend\Block\Template
 {
     /**
diff --git a/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification.php b/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification.php
index e66e24284ef..13b6ead1f37 100644
--- a/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification.php
+++ b/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification.php
@@ -29,6 +29,9 @@ namespace Magento\AdminNotification\Controller\Adminhtml;
 
 class Notification extends \Magento\Backend\App\AbstractAction
 {
+    /**
+     * @return void
+     */
     public function indexAction()
     {
         $this->_title->add(__('Notifications'));
@@ -42,6 +45,9 @@ class Notification extends \Magento\Backend\App\AbstractAction
         $this->_view->renderLayout();
     }
 
+    /**
+     * @return void
+     */
     public function markAsReadAction()
     {
         $notificationId = (int)$this->getRequest()->getParam('id');
@@ -67,6 +73,8 @@ class Notification extends \Magento\Backend\App\AbstractAction
 
     /**
      * Mark notification as read (AJAX action)
+     *
+     * @return void
      */
     public function ajaxMarkAsReadAction()
     {
@@ -87,6 +95,9 @@ class Notification extends \Magento\Backend\App\AbstractAction
         );
     }
 
+    /**
+     * @return void
+     */
     public function massMarkAsReadAction()
     {
         $ids = $this->getRequest()->getParam('notification');
@@ -115,6 +126,9 @@ class Notification extends \Magento\Backend\App\AbstractAction
         $this->_redirect('adminhtml/*/');
     }
 
+    /**
+     * @return void
+     */
     public function removeAction()
     {
         if ($id = $this->getRequest()->getParam('id')) {
@@ -123,7 +137,7 @@ class Notification extends \Magento\Backend\App\AbstractAction
 
             if (!$model->getId()) {
                 $this->_redirect('adminhtml/*/');
-                return ;
+                return;
             }
 
             try {
@@ -147,6 +161,9 @@ class Notification extends \Magento\Backend\App\AbstractAction
         $this->_redirect('adminhtml/*/');
     }
 
+    /**
+     * @return void
+     */
     public function massRemoveAction()
     {
         $ids = $this->getRequest()->getParam('notification');
@@ -172,6 +189,9 @@ class Notification extends \Magento\Backend\App\AbstractAction
         $this->getResponse()->setRedirect($this->_redirect->getRedirectUrl($this->getUrl('*')));
     }
 
+    /**
+     * @return bool
+     */
     protected function _isAllowed()
     {
         switch ($this->getRequest()->getActionName()) {
diff --git a/app/code/Magento/AdminNotification/Controller/Adminhtml/Survey.php b/app/code/Magento/AdminNotification/Controller/Adminhtml/Survey.php
index 8903d85e8f1..ae2bfbec8af 100644
--- a/app/code/Magento/AdminNotification/Controller/Adminhtml/Survey.php
+++ b/app/code/Magento/AdminNotification/Controller/Adminhtml/Survey.php
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\AdminNotification\Controller\Adminhtml;
 
 /**
  * Adminhtml Survey Action
@@ -32,13 +32,12 @@
  * @package    Magento_Adminhtml
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\AdminNotification\Controller\Adminhtml;
-
 class Survey extends \Magento\Backend\App\Action
 {
     /**
      * Index Action
      *
+     * @return void
      */
     public function indexAction()
     {
@@ -51,7 +50,7 @@ class Survey extends \Magento\Backend\App\Action
     /**
      * Check if user has enough privileges
      *
-     * @return boolean
+     * @return bool
      */
     protected function _isAllowed()
     {
diff --git a/app/code/Magento/AdminNotification/Controller/Adminhtml/System/Message.php b/app/code/Magento/AdminNotification/Controller/Adminhtml/System/Message.php
index 3f3f2233207..ceca030e901 100644
--- a/app/code/Magento/AdminNotification/Controller/Adminhtml/System/Message.php
+++ b/app/code/Magento/AdminNotification/Controller/Adminhtml/System/Message.php
@@ -21,11 +21,13 @@
  * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\AdminNotification\Controller\Adminhtml\System;
 
 class Message extends \Magento\Backend\App\AbstractAction
 {
+    /**
+     * @return void
+     */
     public function listAction()
     {
         $severity = $this->getRequest()->getParam('severity');
diff --git a/app/code/Magento/AdminNotification/Helper/Data.php b/app/code/Magento/AdminNotification/Helper/Data.php
index 2d0d432db98..c521748e462 100644
--- a/app/code/Magento/AdminNotification/Helper/Data.php
+++ b/app/code/Magento/AdminNotification/Helper/Data.php
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\AdminNotification\Helper;
 
 /**
  * AdminNotification Data helper
@@ -32,8 +32,6 @@
  * @package    Magento_AdminNotification
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\AdminNotification\Helper;
-
 class Data extends \Magento\App\Helper\AbstractHelper
 {
     const XML_PATH_POPUP_URL    = 'system/adminnotification/popup_url';
@@ -60,7 +58,7 @@ class Data extends \Magento\App\Helper\AbstractHelper
     protected $_latestNotice;
 
     /**
-     * count of unread notes by type
+     * Count of unread notes by type
      *
      * @var array
      */
@@ -76,6 +74,11 @@ class Data extends \Magento\App\Helper\AbstractHelper
      */
     protected $_inboxFactory;
 
+    /**
+     * @param \Magento\App\Helper\Context $context
+     * @param \Magento\Core\Model\Store\Config $coreStoreConfig
+     * @param \Magento\AdminNotification\Model\InboxFactory $inboxFactory
+     */
     public function __construct(
         \Magento\App\Helper\Context $context,
         \Magento\Core\Model\Store\Config $coreStoreConfig,
diff --git a/app/code/Magento/AdminNotification/Model/Config/Source/Frequency.php b/app/code/Magento/AdminNotification/Model/Config/Source/Frequency.php
index a261e01ac6e..88c6cb31ee8 100644
--- a/app/code/Magento/AdminNotification/Model/Config/Source/Frequency.php
+++ b/app/code/Magento/AdminNotification/Model/Config/Source/Frequency.php
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\AdminNotification\Model\Config\Source;
 
 /**
  * AdminNotification update frequency source
@@ -32,10 +32,11 @@
  * @package    Magento_AdminNotification
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\AdminNotification\Model\Config\Source;
-
 class Frequency implements \Magento\Core\Model\Option\ArrayInterface
 {
+    /**
+     * @return array
+     */
     public function toOptionArray()
     {
         return array(
diff --git a/app/code/Magento/AdminNotification/Model/Feed.php b/app/code/Magento/AdminNotification/Model/Feed.php
index b99d9b75680..89b351fe4f0 100644
--- a/app/code/Magento/AdminNotification/Model/Feed.php
+++ b/app/code/Magento/AdminNotification/Model/Feed.php
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\AdminNotification\Model;
 
 /**
  * AdminNotification Feed model
@@ -32,8 +32,6 @@
  * @package    Magento_AdminNotification
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\AdminNotification\Model;
-
 class Feed extends \Magento\Core\Model\AbstractModel
 {
     const XML_USE_HTTPS_PATH    = 'system/adminnotification/use_https';
@@ -84,6 +82,7 @@ class Feed extends \Magento\Core\Model\AbstractModel
     /**
      * Init model
      *
+     * @return void
      */
     protected function _construct()
     {
@@ -107,7 +106,7 @@ class Feed extends \Magento\Core\Model\AbstractModel
     /**
      * Check feed for modification
      *
-     * @return \Magento\AdminNotification\Model\Feed
+     * @return $this
      */
     public function checkUpdate()
     {
@@ -174,7 +173,7 @@ class Feed extends \Magento\Core\Model\AbstractModel
     /**
      * Set last update time (now)
      *
-     * @return \Magento\AdminNotification\Model\Feed
+     * @return $this
      */
     public function setLastUpdate()
     {
@@ -212,6 +211,9 @@ class Feed extends \Magento\Core\Model\AbstractModel
         return $xml;
     }
 
+    /**
+     * @return \SimpleXMLElement
+     */
     public function getFeedXml()
     {
         try {
diff --git a/app/code/Magento/AdminNotification/Model/Inbox.php b/app/code/Magento/AdminNotification/Model/Inbox.php
index e7dd53e41ac..acd6d6f5198 100644
--- a/app/code/Magento/AdminNotification/Model/Inbox.php
+++ b/app/code/Magento/AdminNotification/Model/Inbox.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\AdminNotification\Model;
 
 /**
  * AdminNotification Inbox model
@@ -48,8 +49,6 @@
  * @package     Magento_AdminNotification
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\AdminNotification\Model;
-
 class Inbox extends \Magento\Core\Model\AbstractModel
 {
     const SEVERITY_CRITICAL = 1;
@@ -57,6 +56,9 @@ class Inbox extends \Magento\Core\Model\AbstractModel
     const SEVERITY_MINOR    = 3;
     const SEVERITY_NOTICE   = 4;
 
+    /**
+     * @return void
+     */
     protected function _construct()
     {
         $this->_init('Magento\AdminNotification\Model\Resource\Inbox');
@@ -65,7 +67,8 @@ class Inbox extends \Magento\Core\Model\AbstractModel
     /**
      * Retrieve Severity collection array
      *
-     * @return array|string
+     * @param int|null $severity
+     * @return array|string|null
      */
     public function getSeverities($severity = null)
     {
@@ -89,7 +92,7 @@ class Inbox extends \Magento\Core\Model\AbstractModel
     /**
      * Retrieve Latest Notice
      *
-     * @return \Magento\AdminNotification\Model\Inbox
+     * @return $this
      */
     public function loadLatestNotice()
     {
@@ -112,7 +115,7 @@ class Inbox extends \Magento\Core\Model\AbstractModel
      * Parse and save new data
      *
      * @param array $data
-     * @return \Magento\AdminNotification\Model\Inbox
+     * @return $this
      */
     public function parse(array $data)
     {
@@ -124,11 +127,11 @@ class Inbox extends \Magento\Core\Model\AbstractModel
      *
      * @param int $severity
      * @param string $title
-     * @param string|array $description
+     * @param string|string[] $description
      * @param string $url
      * @param bool $isInternal
      * @throws \Magento\Core\Exception
-     * @return \Magento\AdminNotification\Model\Inbox
+     * @return $this
      */
     public function add($severity, $title, $description, $url = '', $isInternal = true)
     {
@@ -154,10 +157,10 @@ class Inbox extends \Magento\Core\Model\AbstractModel
      * Add critical severity message
      *
      * @param string $title
-     * @param string|array $description
+     * @param string|string[] $description
      * @param string $url
      * @param bool $isInternal
-     * @return \Magento\AdminNotification\Model\Inbox
+     * @return $this
      */
     public function addCritical($title, $description, $url = '', $isInternal = true)
     {
@@ -169,10 +172,10 @@ class Inbox extends \Magento\Core\Model\AbstractModel
      * Add major severity message
      *
      * @param string $title
-     * @param string|array $description
+     * @param string|string[] $description
      * @param string $url
      * @param bool $isInternal
-     * @return \Magento\AdminNotification\Model\Inbox
+     * @return $this
      */
     public function addMajor($title, $description, $url = '', $isInternal = true)
     {
@@ -184,10 +187,10 @@ class Inbox extends \Magento\Core\Model\AbstractModel
      * Add minor severity message
      *
      * @param string $title
-     * @param string|array $description
+     * @param string|string[] $description
      * @param string $url
      * @param bool $isInternal
-     * @return \Magento\AdminNotification\Model\Inbox
+     * @return $this
      */
     public function addMinor($title, $description, $url = '', $isInternal = true)
     {
@@ -199,10 +202,10 @@ class Inbox extends \Magento\Core\Model\AbstractModel
      * Add notice
      *
      * @param string $title
-     * @param string|array $description
+     * @param string|string[] $description
      * @param string $url
      * @param bool $isInternal
-     * @return \Magento\AdminNotification\Model\Inbox
+     * @return $this
      */
     public function addNotice($title, $description, $url = '', $isInternal = true)
     {
diff --git a/app/code/Magento/AdminNotification/Model/NotificationService.php b/app/code/Magento/AdminNotification/Model/NotificationService.php
index 117ba8767a6..5de3ce214a4 100644
--- a/app/code/Magento/AdminNotification/Model/NotificationService.php
+++ b/app/code/Magento/AdminNotification/Model/NotificationService.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\AdminNotification\Model;
 
 /**
  * Notification service model
@@ -31,8 +32,6 @@
  * @package     Magento_AdminNotification
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\AdminNotification\Model;
-
 class NotificationService
 {
     /**
@@ -53,6 +52,7 @@ class NotificationService
      * Mark notification as read
      *
      * @param int $notificationId
+     * @return void
      * @throws \Magento\Core\Exception
      */
     public function markAsRead($notificationId)
diff --git a/app/code/Magento/AdminNotification/Model/Observer.php b/app/code/Magento/AdminNotification/Model/Observer.php
index 5c4ce153ac1..bc2031292f4 100644
--- a/app/code/Magento/AdminNotification/Model/Observer.php
+++ b/app/code/Magento/AdminNotification/Model/Observer.php
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\AdminNotification\Model;
 
 /**
  * AdminNotification observer
@@ -32,8 +32,6 @@
  * @package    Magento_AdminNotification
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\AdminNotification\Model;
-
 class Observer
 {
     /**
@@ -62,6 +60,7 @@ class Observer
      * Predispath admin action controller
      *
      * @param \Magento\Event\Observer $observer
+     * @return void
      */
     public function preDispatch(\Magento\Event\Observer $observer)
     {
diff --git a/app/code/Magento/AdminNotification/Model/Resource/Inbox.php b/app/code/Magento/AdminNotification/Model/Resource/Inbox.php
index 5c241d0b67d..b53af2d8bcc 100644
--- a/app/code/Magento/AdminNotification/Model/Resource/Inbox.php
+++ b/app/code/Magento/AdminNotification/Model/Resource/Inbox.php
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\AdminNotification\Model\Resource;
 
 /**
  * AdminNotification Inbox model
@@ -32,13 +32,12 @@
  * @package     Magento_AdminNotification
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\AdminNotification\Model\Resource;
-
 class Inbox extends \Magento\Core\Model\Resource\Db\AbstractDb
 {
     /**
      * AdminNotification Resource initialization
      *
+     * @return void
      */
     protected function _construct()
     {
@@ -49,7 +48,7 @@ class Inbox extends \Magento\Core\Model\Resource\Db\AbstractDb
      * Load latest notice
      *
      * @param \Magento\AdminNotification\Model\Inbox $object
-     * @return \Magento\AdminNotification\Model\Resource\Inbox
+     * @return $this
      */
     public function loadLatestNotice(\Magento\AdminNotification\Model\Inbox $object)
     {
@@ -96,6 +95,7 @@ class Inbox extends \Magento\Core\Model\Resource\Db\AbstractDb
      *
      * @param \Magento\AdminNotification\Model\Inbox $object
      * @param array $data
+     * @return void
      */
     public function parse(\Magento\AdminNotification\Model\Inbox $object, array $data)
     {
diff --git a/app/code/Magento/AdminNotification/Model/Resource/Inbox/Collection/Critical.php b/app/code/Magento/AdminNotification/Model/Resource/Inbox/Collection/Critical.php
index aec2b66c64f..7297f1090b0 100644
--- a/app/code/Magento/AdminNotification/Model/Resource/Inbox/Collection/Critical.php
+++ b/app/code/Magento/AdminNotification/Model/Resource/Inbox/Collection/Critical.php
@@ -25,11 +25,12 @@
  */
 namespace Magento\AdminNotification\Model\Resource\Inbox\Collection;
 
-class Critical
-    extends \Magento\Core\Model\Resource\Db\Collection\AbstractCollection
+class Critical extends \Magento\Core\Model\Resource\Db\Collection\AbstractCollection
 {
     /**
      * Resource collection initialization
+     *
+     * @return void
      */
     protected function _construct()
     {
@@ -37,7 +38,7 @@ class Critical
     }
 
     /**
-     * @return $this|\Magento\Core\Model\Resource\Db\Collection\AbstractCollection
+     * @return $this
      */
     protected function _initSelect()
     {
diff --git a/app/code/Magento/AdminNotification/Model/Resource/System/Message/Collection.php b/app/code/Magento/AdminNotification/Model/Resource/System/Message/Collection.php
index bda650fd4df..73a5898e3ac 100644
--- a/app/code/Magento/AdminNotification/Model/Resource/System/Message/Collection.php
+++ b/app/code/Magento/AdminNotification/Model/Resource/System/Message/Collection.php
@@ -21,7 +21,6 @@
  * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\AdminNotification\Model\Resource\System\Message;
 
 class Collection
@@ -65,6 +64,8 @@ class Collection
 
     /**
      * Resource collection initialization
+     *
+     * @return void
      */
     protected function _construct()
     {
@@ -76,7 +77,7 @@ class Collection
     /**
      * Initialize db query
      *
-     * @return \Magento\Core\Model\Resource\Db\Collection\AbstractCollection|void
+     * @return void
      */
     protected function _initSelect()
     {
@@ -88,7 +89,7 @@ class Collection
     /**
      * Initialize system messages after load
      *
-     * @return \Magento\Core\Model\Resource\Db\AbstractDb
+     * @return void
      */
     protected function _afterLoad()
     {
@@ -111,7 +112,7 @@ class Collection
      * Set message severity filter
      *
      * @param int $severity
-     * @return \Magento\Core\Model\Resource\Db\AbstractDb
+     * @return $this
      */
     public function setSeverity($severity)
     {
diff --git a/app/code/Magento/AdminNotification/Model/Survey.php b/app/code/Magento/AdminNotification/Model/Survey.php
index c545593e822..7bd5e396268 100644
--- a/app/code/Magento/AdminNotification/Model/Survey.php
+++ b/app/code/Magento/AdminNotification/Model/Survey.php
@@ -134,6 +134,7 @@ class Survey
      * Save survey viewed flag in core flag
      *
      * @param boolean $viewed
+     * @return void
      */
     public function saveSurveyViewed($viewed)
     {
diff --git a/app/code/Magento/AdminNotification/Model/System/MessageList.php b/app/code/Magento/AdminNotification/Model/System/MessageList.php
index 1d1112a5ae4..c9630824307 100644
--- a/app/code/Magento/AdminNotification/Model/System/MessageList.php
+++ b/app/code/Magento/AdminNotification/Model/System/MessageList.php
@@ -54,6 +54,7 @@ class MessageList
     /**
      * Load messages to display
      *
+     * @return void
      * @throws \InvalidArgumentException
      */
     protected function _loadMessages()
diff --git a/app/code/Magento/AdminNotification/etc/adminhtml/di.xml b/app/code/Magento/AdminNotification/etc/adminhtml/di.xml
index d633836e3ff..a4197a7af36 100644
--- a/app/code/Magento/AdminNotification/etc/adminhtml/di.xml
+++ b/app/code/Magento/AdminNotification/etc/adminhtml/di.xml
@@ -23,17 +23,17 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\AdminNotification\Model\System\MessageList">
-        <param name="messages">
-            <array>
-                <item key="baseurl"><value>Magento\AdminNotification\Model\System\Message\Baseurl</value></item>
-                <item key="security"><value>Magento\AdminNotification\Model\System\Message\Security</value></item>
-                <item key="cacheOutdated"><value>Magento\AdminNotification\Model\System\Message\CacheOutdated</value></item>
-                <item key="survey"><value>Magento\AdminNotification\Model\System\Message\Survey</value></item>
-                <item key="media_synchronization_error"><value>Magento\AdminNotification\Model\System\Message\Media\Synchronization\Error</value></item>
-                <item key="media_synchronization_success"><value>Magento\AdminNotification\Model\System\Message\Media\Synchronization\Success</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="messages" xsi:type="array">
+                <item name="baseurl" xsi:type="string">Magento\AdminNotification\Model\System\Message\Baseurl</item>
+                <item name="security" xsi:type="string">Magento\AdminNotification\Model\System\Message\Security</item>
+                <item name="cacheOutdated" xsi:type="string">Magento\AdminNotification\Model\System\Message\CacheOutdated</item>
+                <item name="survey" xsi:type="string">Magento\AdminNotification\Model\System\Message\Survey</item>
+                <item name="media_synchronization_error" xsi:type="string">Magento\AdminNotification\Model\System\Message\Media\Synchronization\Error</item>
+                <item name="media_synchronization_success" xsi:type="string">Magento\AdminNotification\Model\System\Message\Media\Synchronization\Success</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Authorizenet/Block/Authorizenet/Form/Cc.php b/app/code/Magento/Authorizenet/Block/Authorizenet/Form/Cc.php
index e4322a42600..adde83f6aaf 100644
--- a/app/code/Magento/Authorizenet/Block/Authorizenet/Form/Cc.php
+++ b/app/code/Magento/Authorizenet/Block/Authorizenet/Form/Cc.php
@@ -23,11 +23,13 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Authorizenet\Block\Authorizenet\Form;
 
 class Cc extends \Magento\Payment\Block\Form
 {
+    /**
+     * @var string
+     */
     protected $_template = 'Magento_Authorizenet::form/cc.phtml';
 
     /**
@@ -90,6 +92,7 @@ class Cc extends \Magento\Payment\Block\Form
     /**
      * Get notice message
      *
+     * @param string $message
      * @return string
      */
     public function showNoticeMessage($message)
@@ -102,7 +105,7 @@ class Cc extends \Magento\Payment\Block\Form
     /**
      * Return partial authorization confirmation message and unset it in payment model
      *
-     * @return string
+     * @return string|false
      */
     public function getPartialAuthorizationConfirmationMessage()
     {
@@ -156,7 +159,7 @@ class Cc extends \Magento\Payment\Block\Form
     /**
      * Return flag - is partial authorization process started
      *
-     * @return string
+     * @return bool
      */
     public function isPartialAuthorization()
     {
diff --git a/app/code/Magento/Authorizenet/Block/Authorizenet/Info/Cc.php b/app/code/Magento/Authorizenet/Block/Authorizenet/Info/Cc.php
index c27e8af2f70..7cf647f11fb 100644
--- a/app/code/Magento/Authorizenet/Block/Authorizenet/Info/Cc.php
+++ b/app/code/Magento/Authorizenet/Block/Authorizenet/Info/Cc.php
@@ -23,7 +23,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Authorizenet\Block\Authorizenet\Info;
 
 use Magento\Payment\Block\Info;
@@ -37,6 +36,9 @@ class Cc extends \Magento\Payment\Block\Info\Cc
      */
     protected $_isCheckoutProgressBlockFlag = true;
 
+    /**
+     * @var string
+     */
     protected $_template = 'Magento_Authorizenet::info/cc.phtml';
 
     /**
@@ -74,7 +76,7 @@ class Cc extends \Magento\Payment\Block\Info\Cc
     /**
      * Retrieve card info object
      *
-     * @return mixed
+     * @return \Magento\Payment\Model\Info
      */
     public function getInfo()
     {
@@ -90,7 +92,7 @@ class Cc extends \Magento\Payment\Block\Info\Cc
      * in Previously used card information block
      *
      * @param bool $flag
-     * @return \Magento\Authorizenet\Block\Authorizenet\Info\Cc
+     * @return $this
      */
     public function setCheckoutProgressBlock($flag)
     {
diff --git a/app/code/Magento/Authorizenet/Block/Directpost/Form.php b/app/code/Magento/Authorizenet/Block/Directpost/Form.php
index f785162d7f0..f71d12a1e9c 100644
--- a/app/code/Magento/Authorizenet/Block/Directpost/Form.php
+++ b/app/code/Magento/Authorizenet/Block/Directpost/Form.php
@@ -23,18 +23,18 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Authorizenet\Block\Directpost;
 
 /**
  * DirectPost form block
  *
- * @category   Magento
- * @package    Magento_Authorizenet
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Authorizenet\Block\Directpost;
-
 class Form extends \Magento\Payment\Block\Form\Cc
 {
+    /**
+     * @var string
+     */
     protected $_template = 'directpost/info.phtml';
 
     /**
@@ -66,7 +66,6 @@ class Form extends \Magento\Payment\Block\Form\Cc
         $this->_checkoutModel = $checkoutModel;
     }
 
-
     /**
      * Render block HTML
      * If method is not directpost - nothing to return
@@ -81,7 +80,7 @@ class Form extends \Magento\Payment\Block\Form\Cc
     /**
      * Set method info
      *
-     * @return \Magento\Authorizenet\Block\Directpost\Form
+     * @return $this
      */
     public function setMethodInfo()
     {
diff --git a/app/code/Magento/Authorizenet/Controller/Adminhtml/Authorizenet/Directpost/Payment.php b/app/code/Magento/Authorizenet/Controller/Adminhtml/Authorizenet/Directpost/Payment.php
index 793087f4348..a9994d45ae2 100644
--- a/app/code/Magento/Authorizenet/Controller/Adminhtml/Authorizenet/Directpost/Payment.php
+++ b/app/code/Magento/Authorizenet/Controller/Adminhtml/Authorizenet/Directpost/Payment.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * Admihtml DirtectPost Payment Controller
+ * Adminhtml DirectPost Payment Controller
  *
  * Magento
  *
@@ -82,6 +82,7 @@ class Payment
     /**
      * Send request to authorize.net
      *
+     * @return void
      */
     public function placeAction()
     {
@@ -178,6 +179,7 @@ class Payment
     /**
      * Retrieve params and put javascript into iframe
      *
+     * @return void
      */
     public function redirectAction()
     {
@@ -222,6 +224,7 @@ class Payment
     /**
      * Return order quote by ajax
      *
+     * @return void
      */
     public function returnQuoteAction()
     {
@@ -235,6 +238,7 @@ class Payment
      *
      * @param bool $cancelOrder
      * @param string $errorMsg
+     * @return void
      */
     protected function _returnQuote($cancelOrder = false, $errorMsg = '')
     {
diff --git a/app/code/Magento/Authorizenet/Controller/Adminhtml/Authorizenet/Payment.php b/app/code/Magento/Authorizenet/Controller/Adminhtml/Authorizenet/Payment.php
index cc02049e6e3..8a3ce906f60 100644
--- a/app/code/Magento/Authorizenet/Controller/Adminhtml/Authorizenet/Payment.php
+++ b/app/code/Magento/Authorizenet/Controller/Adminhtml/Authorizenet/Payment.php
@@ -23,16 +23,13 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Authorizenet\Controller\Adminhtml\Authorizenet;
 
 /**
  * Authorize Payment Controller
  *
- * @category   Magento
- * @package    Magento_Authorizenet
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Authorizenet\Controller\Adminhtml\Authorizenet;
-
 class Payment extends \Magento\Backend\App\Action
 {
     /**
@@ -54,9 +51,10 @@ class Payment extends \Magento\Backend\App\Action
         parent::__construct($context);
     }
 
-
     /**
-     * Cancel active partail authorizations
+     * Cancel active partial authorizations
+     *
+     * @return void
      */
     public function cancelAction()
     {
diff --git a/app/code/Magento/Authorizenet/Controller/Authorizenet/Payment.php b/app/code/Magento/Authorizenet/Controller/Authorizenet/Payment.php
index 0a86c9b7521..a0d1ec324bf 100644
--- a/app/code/Magento/Authorizenet/Controller/Authorizenet/Payment.php
+++ b/app/code/Magento/Authorizenet/Controller/Authorizenet/Payment.php
@@ -23,7 +23,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Authorizenet\Controller\Authorizenet;
 
 class Payment extends \Magento\App\Action\Action
@@ -49,7 +48,9 @@ class Payment extends \Magento\App\Action\Action
 
 
     /**
-     * Cancel active partail authorizations
+     * Cancel active partial authorizations
+     *
+     * @return void
      */
     public function cancelAction()
     {
diff --git a/app/code/Magento/Authorizenet/Controller/Directpost/Payment.php b/app/code/Magento/Authorizenet/Controller/Directpost/Payment.php
index 46d327ef1b6..d563f7c4bbd 100644
--- a/app/code/Magento/Authorizenet/Controller/Directpost/Payment.php
+++ b/app/code/Magento/Authorizenet/Controller/Directpost/Payment.php
@@ -23,16 +23,13 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Authorizenet\Controller\Directpost;
 
 /**
- * DirtectPost Payment Controller
+ * DirectPost Payment Controller
  *
- * @category   Magento
- * @package    Magento_Authorizenet
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Authorizenet\Controller\Directpost;
-
 class Payment extends \Magento\App\Action\Action
 {
     /**
@@ -75,6 +72,8 @@ class Payment extends \Magento\App\Action\Action
     /**
      * Response action.
      * Action for Authorize.net SIM Relay Request.
+     *
+     * @return void
      */
     public function backendResponseAction()
     {
@@ -84,6 +83,8 @@ class Payment extends \Magento\App\Action\Action
     /**
      * Response action.
      * Action for Authorize.net SIM Relay Request.
+     *
+     * @return void
      */
     public function responseAction()
     {
@@ -95,6 +96,7 @@ class Payment extends \Magento\App\Action\Action
      * Action for Authorize.net SIM Relay Request.
      *
      * @param \Magento\Authorizenet\Helper\HelperInterface $helper
+     * @return void
      */
     protected function _responseAction(\Magento\Authorizenet\Helper\HelperInterface $helper)
     {
@@ -143,6 +145,7 @@ class Payment extends \Magento\App\Action\Action
     /**
      * Retrieve params and put javascript into iframe
      *
+     * @return void
      */
     public function redirectAction()
     {
@@ -176,6 +179,7 @@ class Payment extends \Magento\App\Action\Action
     /**
      * Send request to authorize.net
      *
+     * @return void
      */
     public function placeAction()
     {
@@ -203,6 +207,7 @@ class Payment extends \Magento\App\Action\Action
     /**
      * Return customer quote by ajax
      *
+     * @return void
      */
     public function returnQuoteAction()
     {
@@ -216,6 +221,7 @@ class Payment extends \Magento\App\Action\Action
      *
      * @param bool $cancelOrder
      * @param string $errorMsg
+     * @return void
      */
     protected function _returnCustomerQuote($cancelOrder = false, $errorMsg = '')
     {
diff --git a/app/code/Magento/Authorizenet/Helper/Backend.php b/app/code/Magento/Authorizenet/Helper/Backend.php
index 9d95af65de8..e551436e2b5 100644
--- a/app/code/Magento/Authorizenet/Helper/Backend.php
+++ b/app/code/Magento/Authorizenet/Helper/Backend.php
@@ -23,11 +23,10 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Authorizenet\Helper;
 
 /**
- * Authorizenet Backend Data Helper
+ * Authorize.net Backend Data Helper
  */
 class Backend extends Data
 {
@@ -47,7 +46,6 @@ class Backend extends Data
         $this->_urlBuilder = $backendUrl;
     }
 
-
     /**
      * Return URL for admin area
      *
@@ -73,7 +71,7 @@ class Backend extends Data
     /**
      * Retrieve place order url
      *
-     * @param array params
+     * @param array $params
      * @return  string
      */
     public function getSuccessOrderUrl($params)
@@ -86,9 +84,9 @@ class Backend extends Data
     }
 
     /**
-     * Retrieve redirect ifrmae url
+     * Retrieve redirect iframe url
      *
-     * @param array params
+     * @param array $params
      * @return string
      */
     public function getRedirectIframeUrl($params)
diff --git a/app/code/Magento/Authorizenet/Helper/Data.php b/app/code/Magento/Authorizenet/Helper/Data.php
index 4f7ffbe3bc9..38c9b52a07a 100644
--- a/app/code/Magento/Authorizenet/Helper/Data.php
+++ b/app/code/Magento/Authorizenet/Helper/Data.php
@@ -23,11 +23,10 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Authorizenet\Helper;
 
 /**
- * Authorizenet Data Helper
+ * Authorize.net Data Helper
  */
 class Data extends \Magento\App\Helper\AbstractHelper implements HelperInterface
 {
@@ -105,9 +104,9 @@ class Data extends \Magento\App\Helper\AbstractHelper implements HelperInterface
     }
 
     /**
-     * Retrieve redirect ifrmae url
+     * Retrieve redirect iframe url
      *
-     * @param array params
+     * @param array $params
      * @return string
      */
     public function getRedirectIframeUrl($params)
@@ -138,7 +137,7 @@ class Data extends \Magento\App\Helper\AbstractHelper implements HelperInterface
     /**
      * Retrieve place order url
      *
-     * @param array params
+     * @param array $params
      * @return  string
      */
     public function getSuccessOrderUrl($params)
@@ -162,6 +161,7 @@ class Data extends \Magento\App\Helper\AbstractHelper implements HelperInterface
      * Needed for Admin area.
      *
      * @param \Magento\Sales\Model\Order $order
+     * @return void
      */
     public function updateOrderEditIncrements(\Magento\Sales\Model\Order $order)
     {
diff --git a/app/code/Magento/Authorizenet/Model/Authorizenet.php b/app/code/Magento/Authorizenet/Model/Authorizenet.php
index 4e764cb0b4a..cf9d760eb61 100644
--- a/app/code/Magento/Authorizenet/Model/Authorizenet.php
+++ b/app/code/Magento/Authorizenet/Model/Authorizenet.php
@@ -21,7 +21,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Authorizenet\Model;
 
 class Authorizenet extends \Magento\Payment\Model\Method\Cc
@@ -81,20 +80,29 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
 
     const TRANSACTION_STATUS_EXPIRED = 'expired';
 
+    /**
+     * @var string
+     */
     protected $_code  = self::METHOD_CODE;
 
     /**
      * Form block type
+     *
+     * @var string
      */
     protected $_formBlockType = 'Magento\Authorizenet\Block\Authorizenet\Form\Cc';
 
     /**
      * Info block type
+     *
+     * @var string
      */
     protected $_infoBlockType = 'Magento\Authorizenet\Block\Authorizenet\Info\Cc';
 
-    /**
+    /**#@+
      * Availability options
+     *
+     * @var bool
      */
     protected $_isGateway               = true;
     protected $_canAuthorize            = true;
@@ -107,13 +115,17 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
     protected $_canUseCheckout          = true;
     protected $_canSaveCc = false;
     protected $_canFetchTransactionInfo = true;
+    /**#@-*/
 
+    /**
+     * @var string[]
+     */
     protected $_allowCurrencyCode = array('USD');
 
     /**
      * Fields that should be replaced in debug with '***'
      *
-     * @var array
+     * @var string[]
      */
     protected $_debugReplacePrivateDataKeys = array('x_login', 'x_tran_key',
                                                     'x_card_num', 'x_exp_date',
@@ -161,7 +173,7 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
     /**
      * Fields for creating place request checksum
      *
-     * @var array
+     * @var string[]
      */
     protected $_partialAuthorizationChecksumDataKeys = array(
         'x_version', 'x_test_request', 'x_login', 'x_test_request', 'x_allow_partial_auth', 'x_amount',
@@ -175,7 +187,7 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
     /**
      * Centinel cardinal fields map
      *
-     * @var array
+     * @var string[]
      */
     protected $_centinelFieldMap = array(
         'centinel_cavv' => 'x_cardholder_authentication_value',
@@ -188,7 +200,7 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
     protected $_cardsStorage = null;
 
     /**
-     * Authorizenet data
+     * Authorize.net data
      *
      * @var \Magento\Authorizenet\Helper\Data
      */
@@ -288,7 +300,7 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
      * Check method for processing with base currency
      *
      * @param string $currencyCode
-     * @return boolean
+     * @return bool
      */
     public function canUseForCurrency($currencyCode)
     {
@@ -330,7 +342,7 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
         /**
          * If there are not transactions it is placing order and capturing is available
          */
-        foreach($this->getCardsStorage()->getCards() as $card) {
+        foreach ($this->getCardsStorage()->getCards() as $card) {
             $lastTransaction = $this->getInfoInstance()->getTransaction($card->getLastTransId());
             if ($lastTransaction) {
                 return false;
@@ -351,7 +363,7 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
         ) {
             return false;
         }
-        foreach($this->getCardsStorage()->getCards() as $card) {
+        foreach ($this->getCardsStorage()->getCards() as $card) {
             $lastTransaction = $this->getInfoInstance()->getTransaction($card->getLastTransId());
             if ($lastTransaction
                 && $lastTransaction->getTxnType() == \Magento\Sales\Model\Order\Payment\Transaction::TYPE_CAPTURE
@@ -366,7 +378,7 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
     /**
      * Check void availability
      *
-     * @param   \Magento\Object $invoicePayment
+     * @param   \Magento\Object $payment
      * @return  bool
      */
     public function canVoid(\Magento\Object $payment)
@@ -380,8 +392,8 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
     /**
      * Set partial authorization last action state into session
      *
-     * @param string $message
-     * @return \Magento\Authorizenet\Model\Authorizenet
+     * @param string $state
+     * @return $this
      */
     public function setPartialAuthorizationLastActionState($state)
     {
@@ -402,7 +414,7 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
     /**
      * Unset partial authorization last action state in session
      *
-     * @return \Magento\Authorizenet\Model\Authorizenet
+     * @return $this
      */
     public function unsetPartialAuthorizationLastActionState()
     {
@@ -414,8 +426,9 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
      * Send authorize request to gateway
      *
      * @param  \Magento\Payment\Model\Info $payment
-     * @param  decimal $amount
-     * @return \Magento\Authorizenet\Model\Authorizenet
+     * @param  float $amount
+     * @return $this
+     * @throws \Magento\Core\Exception
      */
     public function authorize(\Magento\Object $payment, $amount)
     {
@@ -440,8 +453,9 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
      * Send capture request to gateway
      *
      * @param \Magento\Payment\Model\Info $payment
-     * @param decimal $amount
-     * @return \Magento\Authorizenet\Model\Authorizenet
+     * @param float $amount
+     * @return $this
+     * @throws \Magento\Core\Exception
      */
     public function capture(\Magento\Object $payment, $amount)
     {
@@ -464,7 +478,7 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
      * Void the payment through gateway
      *
      * @param  \Magento\Payment\Model\Info $payment
-     * @return \Magento\Authorizenet\Model\Authorizenet
+     * @return $this
      */
     public function void(\Magento\Object $payment)
     {
@@ -473,7 +487,7 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
         $messages = array();
         $isSuccessful = false;
         $isFiled = false;
-        foreach($cardsStorage->getCards() as $card) {
+        foreach ($cardsStorage->getCards() as $card) {
             try {
                 $newTransaction = $this->_voidCardTransaction($payment, $card);
                 $messages[] = $newTransaction->getMessage();
@@ -498,7 +512,7 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
      * Cancel the payment through gateway
      *
      * @param  \Magento\Payment\Model\Info $payment
-     * @return \Magento\Authorizenet\Model\Authorizenet
+     * @return $this
      */
     public function cancel(\Magento\Object $payment)
     {
@@ -509,8 +523,8 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
      * Refund the amount with transaction id
      *
      * @param \Magento\Payment\Model\Info $payment
-     * @param decimal $amount
-     * @return \Magento\Authorizenet\Model\Authorizenet
+     * @param float $requestedAmount
+     * @return $this
      * @throws \Magento\Core\Exception
      */
     public function refund(\Magento\Object $payment, $requestedAmount)
@@ -527,7 +541,7 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
         $messages = array();
         $isSuccessful = false;
         $isFiled = false;
-        foreach($cardsStorage->getCards() as $card) {
+        foreach ($cardsStorage->getCards() as $card) {
             if ($requestedAmount > 0) {
                 $cardAmountForRefund = $this->_formatAmount($card->getCapturedAmount() - $card->getRefundedAmount());
                 if ($cardAmountForRefund <= 0) {
@@ -566,8 +580,11 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
      * Cancel partial authorizations and flush current split_tender_id record
      *
      * @param \Magento\Payment\Model\Info $payment
+     * @return void
+     * @throws \Magento\Core\Exception
      */
-    public function cancelPartialAuthorization(\Magento\Payment\Model\Info $payment) {
+    public function cancelPartialAuthorization(\Magento\Payment\Model\Info $payment)
+    {
         if (!$payment->getAdditionalInformation($this->_splitTenderIdKey)) {
             throw new \Magento\Core\Exception(__('This is an invalid split tenderId ID.'));
         }
@@ -597,9 +614,9 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
      * Send request with new payment to gateway
      *
      * @param \Magento\Payment\Model\Info $payment
-     * @param decimal $amount
+     * @param float $amount
      * @param string $requestType
-     * @return \Magento\Authorizenet\Model\Authorizenet
+     * @return $this
      * @throws \Magento\Core\Exception
      */
     protected function _place($payment, $amount, $requestType)
@@ -687,9 +704,11 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
      * Send request with new payment to gateway during partial authorization process
      *
      * @param \Magento\Payment\Model\Info $payment
-     * @param decimal $amount
+     * @param float $amount
      * @param string $requestType
-     * @return \Magento\Authorizenet\Model\Authorizenet
+     * @return $this
+     * @throws \Magento\Payment\Model\Info\Exception
+     * @throws \Magento\Core\Exception
      */
     protected function _partialAuthorization($payment, $amount, $requestType)
     {
@@ -764,7 +783,7 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
         if ($this->getCardsStorage()->getCardsCount() <= 0) {
             return false;
         }
-        foreach($this->getCardsStorage()->getCards() as $card) {
+        foreach ($this->getCardsStorage()->getCards() as $card) {
             $lastTransaction = $payment->getTransaction($card->getLastTransId());
             if (!$lastTransaction
                 || $lastTransaction->getTxnType() != \Magento\Sales\Model\Order\Payment\Transaction::TYPE_AUTH
@@ -779,8 +798,9 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
      * Send capture request to gateway for capture authorized transactions
      *
      * @param \Magento\Payment\Model\Info $payment
-     * @param decimal $amount
-     * @return \Magento\Authorizenet\Model\Authorizenet
+     * @param float $requestedAmount
+     * @return $this
+     * @throws \Magento\Core\Exception
      */
     protected function _preauthorizeCapture($payment, $requestedAmount)
     {
@@ -796,7 +816,7 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
         $messages = array();
         $isSuccessful = false;
         $isFiled = false;
-        foreach($cardsStorage->getCards() as $card) {
+        foreach ($cardsStorage->getCards() as $card) {
             if ($requestedAmount > 0) {
                 $cardAmountForCapture = $card->getProcessedAmount();
                 if ($cardAmountForCapture > $requestedAmount) {
@@ -804,7 +824,7 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
                 }
                 try {
                     $newTransaction = $this->_preauthorizeCaptureCardTransaction(
-                        $payment, $cardAmountForCapture , $card
+                        $payment, $cardAmountForCapture, $card
                     );
                     $messages[] = $newTransaction->getMessage();
                     $isSuccessful = true;
@@ -890,6 +910,7 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
      * @param \Magento\Payment\Model\Info $payment
      * @param \Magento\Object $card
      * @return \Magento\Sales\Model\Order\Payment\Transaction
+     * @throws \Magento\Core\Exception
      */
     protected function _voidCardTransaction($payment, $card)
     {
@@ -984,9 +1005,10 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
      * Refund the card transaction through gateway
      *
      * @param \Magento\Payment\Model\Info $payment
-     * @param $amount
+     * @param float $amount
      * @param \Magento\Object $card
      * @return \Magento\Sales\Model\Order\Payment\Transaction
+     * @throws \Magento\Core\Exception
      */
     protected function _refundCardTransaction($payment, $amount, $card)
     {
@@ -1055,6 +1077,7 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
      * Init cards storage model
      *
      * @param \Magento\Payment\Model\Info $payment
+     * @return void
      */
     protected function _initCardsStorage($payment)
     {
@@ -1079,7 +1102,7 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
     }
 
     /**
-     * If parial authorization is started method will returne true
+     * If partial authorization is started method will return true
      *
      * @param \Magento\Payment\Model\Info $payment
      * @return bool
@@ -1097,7 +1120,7 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
      *
      * @param \Magento\Sales\Model\Order\Invoice $invoice
      * @param \Magento\Sales\Model\Order\Payment $payment
-     * @return \Magento\Payment\Model\Method\AbstractMethod
+     * @return $this
      */
     public function processInvoice($invoice, $payment)
     {
@@ -1109,7 +1132,7 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
      * Set transaction ID into creditmemo for informational purposes
      * @param \Magento\Sales\Model\Order\Creditmemo $creditmemo
      * @param \Magento\Sales\Model\Order\Payment $payment
-     * @return \Magento\Payment\Model\Method\AbstractMethod
+     * @return $this
      */
     public function processCreditmemo($creditmemo, $payment)
     {
@@ -1152,10 +1175,10 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
     }
 
     /**
-     * Set split_tender_id to quote payment if neeeded
+     * Set split_tender_id to quote payment if needed
      *
      * @param \Magento\Object $response
-     * @param $orderPayment
+     * @param float $orderPayment
      * @throws \Magento\Payment\Model\Info\Exception
      * @return bool
      */
@@ -1237,9 +1260,9 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
     /**
      * Prepare request to gateway
      *
-     * @link http://www.authorize.net/support/AIM_guide.pdf
      * @param \Magento\Object|\Magento\Payment\Model\Info $payment
      * @return \Magento\Authorizenet\Model\Authorizenet\Request
+     * @link http://www.authorize.net/support/AIM_guide.pdf
      */
     protected function _buildRequest(\Magento\Object $payment)
     {
@@ -1255,8 +1278,8 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
             $request->setXInvoiceNum($order->getIncrementId());
         }
 
-        if($payment->getAmount()){
-            $request->setXAmount($payment->getAmount(),2);
+        if ($payment->getAmount()) {
+            $request->setXAmount($payment->getAmount(), 2);
             $request->setXCurrencyCode($order->getBaseCurrencyCode());
         }
 
@@ -1292,7 +1315,7 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
                 break;
         }
 
-        if ($this->getIsCentinelValidationEnabled()){
+        if ($this->getIsCentinelValidationEnabled()) {
             $params  = $this->getCentinelValidator()->exportCmpiData(array());
             $request = \Magento\Object\Mapper::accumulateByMap($params, $request, $this->_centinelFieldMap);
         }
@@ -1335,7 +1358,7 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
                 ->setXFreight($order->getBaseShippingAmount());
         }
 
-        if($payment->getCcNumber()){
+        if ($payment->getCcNumber()) {
             $request->setXCardNum($payment->getCcNumber())
                 ->setXExpDate(sprintf('%02d-%04d', $payment->getCcExpMonth(), $payment->getCcExpYear()))
                 ->setXCardCode($payment->getCcCid());
@@ -1345,10 +1368,11 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
     }
 
     /**
-     * Post request to gateway and return responce
+     * Post request to gateway and return response
      *
-     * @param \Magento\Authorizenet\Model\Authorizenet\Request $request)
+     * @param \Magento\Authorizenet\Model\Authorizenet\Request $request
      * @return \Magento\Authorizenet\Model\Authorizenet\Result
+     * @throws \Magento\Core\Exception
      */
     protected function _postRequest(\Magento\Object $request)
     {
@@ -1389,9 +1413,9 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
         $r = explode(self::RESPONSE_DELIM_CHAR, $responseBody);
 
         if ($r) {
-            $result->setResponseCode((int)str_replace('"','',$r[0]))
-                ->setResponseSubcode((int)str_replace('"','',$r[1]))
-                ->setResponseReasonCode((int)str_replace('"','',$r[2]))
+            $result->setResponseCode((int)str_replace('"', '', $r[0]))
+                ->setResponseSubcode((int)str_replace('"', '', $r[1]))
+                ->setResponseReasonCode((int)str_replace('"', '', $r[2]))
                 ->setResponseReasonText($r[3])
                 ->setApprovalCode($r[4])
                 ->setAvsResultCode($r[5])
@@ -1410,8 +1434,7 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
                 ->setCardType($r[51])
                 ->setRequestedAmount($r[53])
                 ->setBalanceOnCard($r[54]);
-        }
-        else {
+        } else {
              throw new \Magento\Core\Exception(
                 __('Something went wrong in the payment gateway.')
             );
@@ -1467,8 +1490,8 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
     /**
      * Reset assigned data in payment info model
      *
-     * @param \Magento\Payment\Model\Info
-     * @return \Magento\Authorizenet\Model\Authorizenet
+     * @param \Magento\Payment\Model\Info $payment
+     * @return $this
      */
     private function _clearAssignedData($payment)
     {
@@ -1551,6 +1574,8 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
      * @param  \Magento\Payment\Model\Info $payment
      * @param  string $messages
      * @param  bool $isSuccessfulTransactions
+     * @return void
+     * @throws \Magento\Core\Exception
      */
     protected function _processFailureMultitransactionAction($payment, $messages, $isSuccessfulTransactions)
     {
@@ -1595,10 +1620,11 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
     /**
      * This function returns full transaction details for a specified transaction ID.
      *
-     * @link http://www.authorize.net/support/ReportingGuide_XML.pdf
-     * @link http://developer.authorize.net/api/transaction_details/
      * @param string $transactionId
      * @return \Magento\Object
+     * @throws \Magento\Core\Exception
+     * @link http://www.authorize.net/support/ReportingGuide_XML.pdf
+     * @link http://developer.authorize.net/api/transaction_details/
      */
     protected function _getTransactionDetails($transactionId)
     {
diff --git a/app/code/Magento/Authorizenet/Model/Authorizenet/Cards.php b/app/code/Magento/Authorizenet/Model/Authorizenet/Cards.php
index 0a2a0c71a5d..e31fac5f21c 100644
--- a/app/code/Magento/Authorizenet/Model/Authorizenet/Cards.php
+++ b/app/code/Magento/Authorizenet/Model/Authorizenet/Cards.php
@@ -23,7 +23,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Authorizenet\Model\Authorizenet;
 
 class Cards
@@ -52,7 +51,7 @@ class Cards
      * Set payment instance for storing credit card information and partial authorizations
      *
      * @param \Magento\Payment\Model\Info $payment
-     * @return \Magento\Authorizenet\Model\Authorizenet\Cards
+     * @return $this
      */
     public function setPayment(\Magento\Payment\Model\Info $payment)
     {
@@ -63,6 +62,8 @@ class Cards
 
     /**
      * Init cards data
+     *
+     * @return void
      */
     protected function _initCards()
     {
@@ -99,7 +100,7 @@ class Cards
      * Save data from card object in cards storage
      *
      * @param \Magento\Object $card
-     * @return \Magento\Authorizenet\Model\Authorizenet\Cards
+     * @return $this
      */
     public function updateCard($card)
     {
@@ -115,7 +116,7 @@ class Cards
      * Retrieve card by ID
      *
      * @param string $cardId
-     * @return \Magento\Object|bool
+     * @return \Magento\Object|false
      */
     public function getCard($cardId)
     {
@@ -135,7 +136,7 @@ class Cards
     {
         $this->_isPaymentValid();
         $_cards = array();
-        foreach(array_keys($this->_cards) as $key) {
+        foreach (array_keys($this->_cards) as $key) {
             $_cards[$key] = $this->getCard($key);
         }
         return $_cards;
@@ -185,7 +186,7 @@ class Cards
     /**
      * Remove all cards from payment instance
      *
-     * @return \Magento\Authorizenet\Model\Authorizenet\Cards
+     * @return $this
      */
     public function flushCards()
     {
@@ -195,8 +196,9 @@ class Cards
     }
 
     /**
-     * Check for payment instace present
+     * Check for payment instance present
      *
+     * @return void
      * @throws \Exception
      */
     protected function _isPaymentValid()
@@ -205,10 +207,11 @@ class Cards
             throw new \Exception('Payment instance is not set');
         }
     }
+
     /**
      * Return total for cards data fields
      *
-     * $param string $key
+     * @param string $key
      * @return float
      */
     public function _getAmount($key)
diff --git a/app/code/Magento/Authorizenet/Model/Authorizenet/Debug.php b/app/code/Magento/Authorizenet/Model/Authorizenet/Debug.php
index 6ac976c2157..641942d492c 100644
--- a/app/code/Magento/Authorizenet/Model/Authorizenet/Debug.php
+++ b/app/code/Magento/Authorizenet/Model/Authorizenet/Debug.php
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Authorizenet\Model\Authorizenet;
 
 /**
  * @method \Magento\Authorizenet\Model\Resource\Authorizenet\Debug _getResource()
@@ -41,14 +41,13 @@
  * @method string getResultDump()
  * @method \Magento\Authorizenet\Model\Authorizenet\Debug setResultDump(string $value)
  *
- * @category    Magento
- * @package     Magento_Authorizenet
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Authorizenet\Model\Authorizenet;
-
 class Debug extends \Magento\Core\Model\AbstractModel
 {
+    /**
+     * @return void
+     */
     protected function _construct()
     {
         $this->_init('Magento\Authorizenet\Model\Resource\Authorizenet\Debug');
diff --git a/app/code/Magento/Authorizenet/Model/Authorizenet/Source/Cctype.php b/app/code/Magento/Authorizenet/Model/Authorizenet/Source/Cctype.php
index 07fee5595a2..969ccf78a9b 100644
--- a/app/code/Magento/Authorizenet/Model/Authorizenet/Source/Cctype.php
+++ b/app/code/Magento/Authorizenet/Model/Authorizenet/Source/Cctype.php
@@ -23,18 +23,18 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Authorizenet\Model\Authorizenet\Source;
 
 /**
- * Authorizenet Payment CC Types Source Model
+ * Authorize.net Payment CC Types Source Model
  *
- * @category    Magento
- * @package     Magento_Authorizenet
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Authorizenet\Model\Authorizenet\Source;
-
 class Cctype extends \Magento\Payment\Model\Source\Cctype
 {
+    /**
+     * @return string[]
+     */
     public function getAllowedTypes()
     {
         return array('VI', 'MC', 'AE', 'DI', 'OT');
diff --git a/app/code/Magento/Authorizenet/Model/Authorizenet/Source/PaymentAction.php b/app/code/Magento/Authorizenet/Model/Authorizenet/Source/PaymentAction.php
index 51a577d745f..76c21f7be48 100644
--- a/app/code/Magento/Authorizenet/Model/Authorizenet/Source/PaymentAction.php
+++ b/app/code/Magento/Authorizenet/Model/Authorizenet/Source/PaymentAction.php
@@ -23,17 +23,19 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Authorizenet\Model\Authorizenet\Source;
 
 /**
  *
- * Authorizenet Payment Action Dropdown source
+ * Authorize.net Payment Action Dropdown source
  *
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Authorizenet\Model\Authorizenet\Source;
-
 class PaymentAction implements \Magento\Core\Model\Option\ArrayInterface
 {
+    /**
+     * {@inheritdoc}
+     */
     public function toOptionArray()
     {
         return array(
diff --git a/app/code/Magento/Authorizenet/Model/Directpost.php b/app/code/Magento/Authorizenet/Model/Directpost.php
index aa33c676955..42bf804b6aa 100644
--- a/app/code/Magento/Authorizenet/Model/Directpost.php
+++ b/app/code/Magento/Authorizenet/Model/Directpost.php
@@ -21,20 +21,32 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Authorizenet\Model;
 
 /**
  * Authorize.net DirectPost payment method model.
  */
-namespace Magento\Authorizenet\Model;
-
 class Directpost extends \Magento\Authorizenet\Model\Authorizenet
 {
+    /**
+     * @var string
+     */
     protected $_code  = 'authorizenet_directpost';
+
+    /**
+     * @var string
+     */
     protected $_formBlockType = 'Magento\Authorizenet\Block\Directpost\Form';
-    protected $_infoBlockType = 'Magento\Payment\Block\Info';
 
     /**
+     * @var string
+     */
+    protected $_infoBlockType = 'Magento\Payment\Block\Info';
+
+    /**#@+
      * Availability options
+     *
+     * @var bool
      */
     protected $_canAuthorize            = true;
     protected $_canCapture              = true;
@@ -46,6 +58,7 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet
     protected $_canUseCheckout          = true;
     protected $_canSaveCc               = false;
     protected $_isInitializeNeeded      = true;
+    /**#@-*/
 
     /**
      * @var \Magento\Core\Model\StoreManagerInterface
@@ -151,9 +164,8 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet
      * Send authorize request to gateway
      *
      * @param  \Magento\Object $payment
-     * @param  decimal $amount
-     * @return \Magento\Authorizenet\Model\Authorizenet
-     * @throws \Magento\Core\Exception
+     * @param  float $amount
+     * @return void
      */
     public function authorize(\Magento\Object $payment, $amount)
     {
@@ -164,8 +176,8 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet
      * Send capture request to gateway
      *
      * @param \Magento\Object $payment
-     * @param decimal $amount
-     * @return \Magento\Authorizenet\Model\Directpost
+     * @param float $amount
+     * @return $this
      * @throws \Magento\Core\Exception
      */
     public function capture(\Magento\Object $payment, $amount)
@@ -220,7 +232,7 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet
     /**
      * Check void availability
      *
-     * @param   \Magento\Object $invoicePayment
+     * @param   \Magento\Object $payment
      * @return  bool
      */
     public function canVoid(\Magento\Object $payment)
@@ -232,7 +244,7 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet
      * Void the payment through gateway
      *
      * @param \Magento\Object $payment
-     * @return \Magento\Authorizenet\Model\Directpost
+     * @return $this
      * @throws \Magento\Core\Exception
      */
     public function void(\Magento\Object $payment)
@@ -292,12 +304,12 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet
 
     /**
      * Refund the amount
-     * Need to decode Last 4 digits for request.
+     * Need to decode last 4 digits for request.
      *
      * @param \Magento\Object $payment
-     * @param decimal $amount
-     * @return \Magento\Authorizenet\Model\Directpost
-     * @throws \Magento\Core\Exception
+     * @param float $amount
+     * @return $this
+     * @throws \Exception
      */
     public function refund(\Magento\Object $payment, $amount)
     {
@@ -314,10 +326,11 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet
     }
 
     /**
-     * refund the amount with transaction id
+     * Refund the amount with transaction id
      *
-     * @param string $payment \Magento\Object object
-     * @return \Magento\Authorizenet\Model\Directpost
+     * @param \Magento\Object $payment
+     * @param float $amount
+     * @return $this
      * @throws \Magento\Core\Exception
      */
     protected function _refund(\Magento\Object $payment, $amount)
@@ -398,7 +411,8 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet
      * Instantiate state and set it to state object
      *
      * @param string $paymentAction
-     * @param \Magento\Object
+     * @param \Magento\Object $stateObject
+     * @return void
      */
     public function initialize($paymentAction, $stateObject)
     {
@@ -444,7 +458,7 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet
      * Fill response with data.
      *
      * @param array $postData
-     * @return \Magento\Authorizenet\Model\Directpost
+     * @return $this
      */
     public function setResponseData(array $postData)
     {
@@ -456,7 +470,7 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet
      * Validate response data. Needed in controllers.
      *
      * @return bool true in case of validation success.
-     * @throws \Magento\Core\Exception in case of validation error
+     * @throws \Magento\Core\Exception In case of validation error
      */
     public function validateResponse()
     {
@@ -476,7 +490,8 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet
      * Operate with order using data from $_POST which came from authorize.net by Relay URL.
      *
      * @param array $responseData data from Authorize.net from $_POST
-     * @throws \Magento\Core\Exception in case of validation error or order creation error
+     * @return void
+     * @throws \Magento\Core\Exception In case of validation error or order creation error
      */
     public function process(array $responseData)
     {
@@ -529,6 +544,7 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet
      * Fill payment with credit card data from response from Authorize.net.
      *
      * @param \Magento\Object $payment
+     * @return void
      */
     protected function _fillPaymentByResponse(\Magento\Object $payment)
     {
@@ -545,10 +561,10 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet
     }
 
     /**
-     * Check response code came from authorize.net.
+     * Check response code came from Authorize.net.
      *
      * @return true in case of Approved response
-     * @throws \Magento\Core\Exception in case of Declined or Error response from Authorize.net
+     * @throws \Magento\Core\Exception In case of Declined or Error response from Authorize.net
      */
     public function checkResponseCode()
     {
@@ -567,7 +583,7 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet
      * Check transaction id came from Authorize.net
      *
      * @return true in case of right transaction id
-     * @throws \Magento\Core\Exception in case of bad transaction id.
+     * @throws \Magento\Core\Exception In case of bad transaction id.
      */
     public function checkTransId()
     {
@@ -595,6 +611,9 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet
      * Authorize order or authorize and capture it.
      *
      * @param \Magento\Sales\Model\Order $order
+     * @return void
+     * @throws \Magento\Core\Exception
+     * @throws \Exception
      */
     protected function _authOrder(\Magento\Sales\Model\Order $order)
     {
@@ -660,6 +679,7 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet
      * @param \Magento\Sales\Model\Order $order
      * @param string $message
      * @param bool $voidPayment
+     * @return void
      */
     protected function _declineOrder(\Magento\Sales\Model\Order $order, $message = '', $voidPayment = true)
     {
@@ -686,6 +706,7 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet
      * Capture order's payment using AIM.
      *
      * @param \Magento\Sales\Model\Order $order
+     * @return void
      */
     protected function _captureOrder(\Magento\Sales\Model\Order $order)
     {
diff --git a/app/code/Magento/Authorizenet/Model/Directpost/Observer.php b/app/code/Magento/Authorizenet/Model/Directpost/Observer.php
index bbad9a3f84f..208d052a0fd 100644
--- a/app/code/Magento/Authorizenet/Model/Directpost/Observer.php
+++ b/app/code/Magento/Authorizenet/Model/Directpost/Observer.php
@@ -23,16 +23,13 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Authorizenet\Model\Directpost;
 
 /**
- * Authorizenet directpayment observer
+ * Authorize.net directpayment observer
  *
- * @category    Magento
- * @package     Magento_Authorizenet
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Authorizenet\Model\Directpost;
-
 class Observer
 {
     /**
@@ -99,7 +96,7 @@ class Observer
      * Save order into registry to use it in the overloaded controller.
      *
      * @param \Magento\Event\Observer $observer
-     * @return \Magento\Authorizenet\Model\Directpost\Observer
+     * @return $this
      */
     public function saveOrderAfterSubmit(\Magento\Event\Observer $observer)
     {
@@ -114,7 +111,7 @@ class Observer
      * Set data for response of frontend saveOrder action
      *
      * @param \Magento\Event\Observer $observer
-     * @return \Magento\Authorizenet\Model\Directpost\Observer
+     * @return $this
      */
     public function addAdditionalFieldsToResponseFrontend(\Magento\Event\Observer $observer)
     {
@@ -155,7 +152,7 @@ class Observer
      * Needed for correct work of edit orders in Admin area.
      *
      * @param \Magento\Event\Observer $observer
-     * @return \Magento\Authorizenet\Model\Directpost\Observer
+     * @return $this
      */
     public function updateAllEditIncrements(\Magento\Event\Observer $observer)
     {
diff --git a/app/code/Magento/Authorizenet/Model/Directpost/Request.php b/app/code/Magento/Authorizenet/Model/Directpost/Request.php
index b05a22f85c2..17159d6186b 100644
--- a/app/code/Magento/Authorizenet/Model/Directpost/Request.php
+++ b/app/code/Magento/Authorizenet/Model/Directpost/Request.php
@@ -23,18 +23,18 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Authorizenet\Model\Directpost;
 
 /**
  * Authorize.net request model for DirectPost model.
  *
- * @category   Magento
- * @package    Magento_Authorizenet
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Authorizenet\Model\Directpost;
-
 class Request extends \Magento\Object
 {
+    /**
+     * @var string
+     */
     protected $_transKey = null;
 
     /**
@@ -53,7 +53,7 @@ class Request extends \Magento\Object
      * Needed to generate sign.
      *
      * @param string $transKey
-     * @return \Magento\Authorizenet\Model\Directpost\Request
+     * @return $this
      */
     protected function _setTransactionKey($transKey)
     {
@@ -84,10 +84,10 @@ class Request extends \Magento\Object
     }
 
     /**
-     * Set authorizenet data to request.
+     * Set Authorizenet data to request.
      *
      * @param \Magento\Authorizenet\Model\Directpost $paymentMethod
-     * @return \Magento\Authorizenet\Model\Directpost\Request
+     * @return $this
      */
     public function setConstantData(\Magento\Authorizenet\Model\Directpost $paymentMethod)
     {
@@ -111,7 +111,7 @@ class Request extends \Magento\Object
      *
      * @param \Magento\Sales\Model\Order $order
      * @param \Magento\Authorizenet\Model\Directpost $paymentMethod
-     * @return \Magento\Authorizenet\Model\Directpost\Request
+     * @return $this
      */
     public function setDataFromOrder(\Magento\Sales\Model\Order $order, \Magento\Authorizenet\Model\Directpost $paymentMethod)
     {
@@ -166,7 +166,7 @@ class Request extends \Magento\Object
      * Set sign hash into the request object.
      * All needed fields should be placed in the object fist.
      *
-     * @return \Magento\Authorizenet\Model\Directpost\Request
+     * @return $this
      */
     public function signRequestData()
     {
diff --git a/app/code/Magento/Authorizenet/Model/Directpost/Session.php b/app/code/Magento/Authorizenet/Model/Directpost/Session.php
index ae4e5471c4e..659cab1f0dd 100644
--- a/app/code/Magento/Authorizenet/Model/Directpost/Session.php
+++ b/app/code/Magento/Authorizenet/Model/Directpost/Session.php
@@ -23,7 +23,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Authorizenet\Model\Directpost;
 
 /**
@@ -58,6 +57,7 @@ class Session extends \Magento\Session\SessionManager
      * Add order IncrementId to session
      *
      * @param string $orderIncrementId
+     * @return void
      */
     public function addCheckoutOrderIncrementId($orderIncrementId)
     {
@@ -73,6 +73,7 @@ class Session extends \Magento\Session\SessionManager
      * Remove order IncrementId from session
      *
      * @param string $orderIncrementId
+     * @return void
      */
     public function removeCheckoutOrderIncrementId($orderIncrementId)
     {
diff --git a/app/code/Magento/Authorizenet/Model/Resource/Authorizenet/Debug.php b/app/code/Magento/Authorizenet/Model/Resource/Authorizenet/Debug.php
index 74859b1d65a..645462d2ec8 100644
--- a/app/code/Magento/Authorizenet/Model/Resource/Authorizenet/Debug.php
+++ b/app/code/Magento/Authorizenet/Model/Resource/Authorizenet/Debug.php
@@ -23,22 +23,19 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Authorizenet\Model\Resource\Authorizenet;
 
 /**
- * Resource authorizenet debug model
+ * Resource Authorize.net debug model
  *
- * @category    Magento
- * @package     Magento_Authorizenet
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Authorizenet\Model\Resource\Authorizenet;
-
 class Debug extends \Magento\Core\Model\Resource\Db\AbstractDb
 {
     /**
      * Resource initialization
      *
+     * @return void
      */
     protected function _construct()
     {
diff --git a/app/code/Magento/Authorizenet/Model/Resource/Authorizenet/Debug/Collection.php b/app/code/Magento/Authorizenet/Model/Resource/Authorizenet/Debug/Collection.php
index 4fe8b9a13ae..b3d2e42d383 100644
--- a/app/code/Magento/Authorizenet/Model/Resource/Authorizenet/Debug/Collection.php
+++ b/app/code/Magento/Authorizenet/Model/Resource/Authorizenet/Debug/Collection.php
@@ -23,22 +23,19 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Authorizenet\Model\Resource\Authorizenet\Debug;
 
 /**
- * Resource authorizenet debug collection model
+ * Resource Authorize.net debug collection model
  *
- * @category    Magento
- * @package     Magento_Authorizenet
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Authorizenet\Model\Resource\Authorizenet\Debug;
-
 class Collection extends \Magento\Core\Model\Resource\Db\Collection\AbstractCollection
 {
     /**
      * Resource initialization
      *
+     * @return void
      */
     protected function _construct()
     {
diff --git a/app/code/Magento/Authorizenet/etc/adminhtml/di.xml b/app/code/Magento/Authorizenet/etc/adminhtml/di.xml
index 141029ad7cd..490a5df9f46 100644
--- a/app/code/Magento/Authorizenet/etc/adminhtml/di.xml
+++ b/app/code/Magento/Authorizenet/etc/adminhtml/di.xml
@@ -23,21 +23,21 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <preference for="Magento\Authorizenet\Helper\HelperInterface" type="Magento\Authorizenet\Helper\Backend" />
     <type name="Magento\Authorizenet\Model\Directpost\Session">
-        <param name="sessionName">
-            <value>adminhtml</value>
-        </param>
+        <arguments>
+            <argument name="sessionName" xsi:type="string">adminhtml</argument>
+        </arguments>
     </type>
     <type name="Magento\Authorizenet\Model\Directpost">
-        <param name="session">
-            <instance type="Magento\Backend\Model\Session\Quote" />
-        </param>
+        <arguments>
+            <argument name="session" xsi:type="object">Magento\Backend\Model\Session\Quote</argument>
+        </arguments>
     </type>
     <type name="Magento\Authorizenet\Model\Authorizenet">
-        <param name="session">
-            <instance type="Magento\Backend\Model\Session\Quote" />
-        </param>
+        <arguments>
+            <argument name="session" xsi:type="object">Magento\Backend\Model\Session\Quote</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Authorizenet/etc/di.xml b/app/code/Magento/Authorizenet/etc/di.xml
index 44a81ece174..1bdcdcdd2f4 100644
--- a/app/code/Magento/Authorizenet/etc/di.xml
+++ b/app/code/Magento/Authorizenet/etc/di.xml
@@ -23,23 +23,21 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Authorizenet\Model\Directpost\Observer">
-        <param name="authorizenetData">
-            <instance type="Magento\Authorizenet\Helper\Data\Proxy" />
-        </param>
-        <param name="coreData">
-            <instance type="Magento\Core\Helper\Data\Proxy" />
-        </param>
+        <arguments>
+            <argument name="authorizenetData" xsi:type="object">Magento\Authorizenet\Helper\Data\Proxy</argument>
+            <argument name="coreData" xsi:type="object">Magento\Core\Helper\Data\Proxy</argument>
+        </arguments>
     </type>
     <virtualType name="Magento\Authorizenet\Model\Directpost\Session\Storage" type="Magento\Session\Storage">
-        <param name="namespace">
-            <value>authorizenet_directpost</value>
-        </param>
+        <arguments>
+            <argument name="namespace" xsi:type="string">authorizenet_directpost</argument>
+        </arguments>
     </virtualType>
     <type name="Magento\Authorizenet\Model\Directpost\Session">
-        <param name="storage">
-            <instance type="Magento\Authorizenet\Model\Directpost\Session\Storage" />
-        </param>
+        <arguments>
+            <argument name="storage" xsi:type="object">Magento\Authorizenet\Model\Directpost\Session\Storage</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Authorizenet/etc/frontend/di.xml b/app/code/Magento/Authorizenet/etc/frontend/di.xml
index 693fab6c1b8..854b7856687 100644
--- a/app/code/Magento/Authorizenet/etc/frontend/di.xml
+++ b/app/code/Magento/Authorizenet/etc/frontend/di.xml
@@ -23,28 +23,28 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <preference for="Magento\Authorizenet\Helper\HelperInterface" type="Magento\Authorizenet\Helper\Data" />
     <type name="Magento\Authorizenet\Model\Directpost\Session">
-        <param name="sessionName">
-            <value>frontend</value>
-        </param>
+        <arguments>
+            <argument name="sessionName" xsi:type="string">frontend</argument>
+        </arguments>
     </type>
     <type name="Magento\Authorizenet\Model\Directpost">
-        <param name="session">
-            <instance type="Magento\Checkout\Model\Session" />
-        </param>
+        <arguments>
+            <argument name="session" xsi:type="object">Magento\Checkout\Model\Session</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\Url\SecurityInfo">
-        <param name="secureUrlList">
-            <array>
-                <item key="authorizenet"><value>/authorizenet/payment</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="secureUrlList" xsi:type="array">
+                <item name="authorizenet" xsi:type="string">/authorizenet/payment</item>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Authorizenet\Model\Authorizenet">
-        <param name="session">
-            <instance type="Magento\Checkout\Model\Session" />
-        </param>
+        <arguments>
+            <argument name="session" xsi:type="object">Magento\Checkout\Model\Session</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Authz/Model/UserIdentifier.php b/app/code/Magento/Authz/Model/UserIdentifier.php
index 03b50f9ff95..198a0c5c4f0 100644
--- a/app/code/Magento/Authz/Model/UserIdentifier.php
+++ b/app/code/Magento/Authz/Model/UserIdentifier.php
@@ -21,7 +21,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Authz\Model;
 
 /**
@@ -45,7 +44,9 @@ class UserIdentifier
      */
     protected $_userType;
 
-    /** @var  int */
+    /**
+     * @var  int
+     */
     protected $_userId;
 
     /**
@@ -90,8 +91,8 @@ class UserIdentifier
     /**
      * Set user ID.
      *
-     * @param int
-     * @return UserIdentifier
+     * @param int $userId
+     * @return $this
      * @throws \LogicException
      */
     protected function _setUserId($userId)
@@ -108,7 +109,7 @@ class UserIdentifier
      * Set user type.
      *
      * @param string $userType
-     * @return UserIdentifier
+     * @return $this
      * @throws \LogicException
      */
     protected function _setUserType($userType)
diff --git a/app/code/Magento/Authz/Model/UserLocator/Admin.php b/app/code/Magento/Authz/Model/UserLocator/Admin.php
index 9966bdffd0f..acdc94d2691 100644
--- a/app/code/Magento/Authz/Model/UserLocator/Admin.php
+++ b/app/code/Magento/Authz/Model/UserLocator/Admin.php
@@ -21,7 +21,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Authz\Model\UserLocator;
 
 use Magento\Authz\Model\UserLocatorInterface;
@@ -33,7 +32,9 @@ use Magento\Backend\Model\Auth\Session as AdminSession;
  */
 class Admin implements UserLocatorInterface
 {
-    /** @var AdminSession */
+    /**
+     * @var AdminSession
+     */
     protected $_adminSession;
 
     /**
diff --git a/app/code/Magento/Authz/Service/AuthorizationV1.php b/app/code/Magento/Authz/Service/AuthorizationV1.php
index 37764abb80e..42f51a6942d 100644
--- a/app/code/Magento/Authz/Service/AuthorizationV1.php
+++ b/app/code/Magento/Authz/Service/AuthorizationV1.php
@@ -21,7 +21,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Authz\Service;
 
 use Magento\Acl\Builder as AclBuilder;
@@ -45,28 +44,44 @@ use Magento\Core\Model\Acl\RootResource as RootAclResource;
  */
 class AuthorizationV1 implements AuthorizationV1Interface
 {
-    /** @var AclBuilder */
+    /**
+     * @var AclBuilder
+     */
     protected $_aclBuilder;
 
-    /** @var UserIdentifier */
+    /**
+     * @var UserIdentifier
+     */
     protected $_userIdentifier;
 
-    /** @var RoleFactory */
+    /**
+     * @var RoleFactory
+     */
     protected $_roleFactory;
 
-    /** @var RoleCollectionFactory */
+    /**
+     * @var RoleCollectionFactory
+     */
     protected $_roleCollectionFactory;
 
-    /** @var RulesFactory */
+    /**
+     * @var RulesFactory
+     */
     protected $_rulesFactory;
 
-    /** @var RulesCollectionFactory */
+    /**
+     * @var RulesCollectionFactory
+     */
     protected $_rulesCollectionFactory;
 
-    /** @var Logger */
+    /**
+     * @var Logger
+     */
     protected $_logger;
 
-    /** @var RootAclResource */
+    /**
+     * @var RootAclResource
+     */
     protected $_rootAclResource;
 
     /**
@@ -283,6 +298,7 @@ class AuthorizationV1 implements AuthorizationV1Interface
      *
      * @param Role $role
      * @param string[] $resources
+     * @return void
      */
     protected function _associateResourcesWithRole($role, array $resources)
     {
diff --git a/app/code/Magento/Authz/Service/AuthorizationV1Interface.php b/app/code/Magento/Authz/Service/AuthorizationV1Interface.php
index f6ac8de44d8..dba4b3e1ac7 100644
--- a/app/code/Magento/Authz/Service/AuthorizationV1Interface.php
+++ b/app/code/Magento/Authz/Service/AuthorizationV1Interface.php
@@ -21,7 +21,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Authz\Service;
 
 use Magento\Authz\Model\UserIdentifier;
@@ -37,6 +36,7 @@ interface AuthorizationV1Interface
      *
      * @param UserIdentifier $userIdentifier
      * @param string[] $resources List of resources which should be available to the specified user.
+     * @return void
      * @throws ServiceException
      */
     public function grantPermissions(UserIdentifier $userIdentifier, array $resources);
@@ -45,6 +45,7 @@ interface AuthorizationV1Interface
      * Grant permissions to the user to access all resources available in the system.
      *
      * @param UserIdentifier $userIdentifier
+     * @return void
      * @throws ServiceException
      */
     public function grantAllPermissions(UserIdentifier $userIdentifier);
@@ -74,6 +75,7 @@ interface AuthorizationV1Interface
      * Remove user role and associated permissions.
      *
      * @param UserIdentifier $userIdentifier
+     * @return void
      * @throws ServiceException
      */
     public function removePermissions(UserIdentifier $userIdentifier);
diff --git a/app/code/Magento/Backend/App/Router/DefaultRouter.php b/app/code/Magento/Backend/App/Router/DefaultRouter.php
index 33e9e5ff88d..1c1d83f5a61 100644
--- a/app/code/Magento/Backend/App/Router/DefaultRouter.php
+++ b/app/code/Magento/Backend/App/Router/DefaultRouter.php
@@ -167,13 +167,6 @@ class DefaultRouter extends \Magento\Core\App\Router\Base
      */
     public function getControllerClassName($module, $controller)
     {
-        /**
-         * TODO: Delete these lines after adminhtml module is removed
-         */
-        if ($module == 'Magento_Adminhtml') {
-            return parent::getControllerClassName($module, $controller);
-        }
-
         $parts = explode('_', $module);
         $parts = array_splice($parts, 0, 2);
         $parts[] = 'Controller';
diff --git a/app/code/Magento/Backend/Block/Widget/Grid/Massaction/Additional.php b/app/code/Magento/Backend/Block/Widget/Grid/Massaction/Additional.php
index a26723d96d0..d4f2006b8da 100644
--- a/app/code/Magento/Backend/Block/Widget/Grid/Massaction/Additional.php
+++ b/app/code/Magento/Backend/Block/Widget/Grid/Massaction/Additional.php
@@ -18,46 +18,38 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Backend
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+
 namespace Magento\Backend\Block\Widget\Grid\Massaction;
 
 /**
- * Backend widget grid massaction additional action
- *
- * @category   Magento
- * @package    Magento_Backend
- * @author      Magento Core Team <core@magentocommerce.com>
- *
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class Additional extends \Magento\Backend\Block\Widget\Form\Generic
 {
     /**
-     * @var \Magento\View\Layout\Argument\HandlerFactory
+     * @var \Magento\View\Layout\Argument\Interpreter\Options
      */
-    protected $_handlerFactory;
+    protected $_optionsInterpreter;
 
     /**
      * @param \Magento\Backend\Block\Template\Context $context
      * @param \Magento\Core\Model\Registry $registry
      * @param \Magento\Data\FormFactory $formFactory
-     * @param \Magento\View\Layout\Argument\HandlerFactory $handlerFactory
+     * @param \Magento\View\Layout\Argument\Interpreter\Options $optionsInterpreter
      * @param array $data
      */
     public function __construct(
         \Magento\Backend\Block\Template\Context $context,
         \Magento\Core\Model\Registry $registry,
         \Magento\Data\FormFactory $formFactory,
-        \Magento\View\Layout\Argument\HandlerFactory $handlerFactory,
+        \Magento\View\Layout\Argument\Interpreter\Options $optionsInterpreter,
         array $data = array()
     ) {
         parent::__construct($context, $registry, $formFactory, $data);
-
-        $this->_handlerFactory = $handlerFactory;
+        $this->_optionsInterpreter = $optionsInterpreter;
     }
 
     /**
@@ -86,12 +78,8 @@ class Additional extends \Magento\Backend\Block\Widget\Form\Generic
     protected function _prepareFormItem(array &$item)
     {
         if ($item['type'] == 'select' && is_string($item['values'])) {
-            $argumentHandler = $this->_handlerFactory->getArgumentHandlerByType('options');
-            $item['values'] = $argumentHandler->process(array(
-                'value' => array(
-                    'model' => $item['values']
-                )
-            ));
+            $modelClass = $item['values'];
+            $item['values'] = $this->_optionsInterpreter->evaluate(array('model' => $modelClass));
         }
         $item['class'] = isset($item['class']) ? $item['class'] . ' absolute-advice' : 'absolute-advice';
     }
diff --git a/app/code/Magento/Backend/etc/adminhtml/di.xml b/app/code/Magento/Backend/etc/adminhtml/di.xml
index 14edd9815b9..95980106634 100644
--- a/app/code/Magento/Backend/etc/adminhtml/di.xml
+++ b/app/code/Magento/Backend/etc/adminhtml/di.xml
@@ -23,7 +23,7 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <preference for="Magento\Authorization\RoleLocator" type="Magento\Backend\Model\Authorization\RoleLocator" />
     <preference for="Magento\Core\Model\LocaleInterface" type="Magento\Backend\Model\Locale" />
     <preference for="Magento\App\Action\Context" type="Magento\Backend\App\Action\Context" />
@@ -40,107 +40,101 @@
     <preference for="Magento\App\Response\Http\FileFactory" type="Magento\Backend\App\Response\Http\FileFactory" />
     <preference for="Magento\App\View" type="Magento\Backend\Model\View" />
     <type name="Magento\Backend\Model\Translate\Inline">
-        <param name="url">
-            <instance type="Magento\Backend\Model\UrlInterface" />
-        </param>
-        <param name="templateFileName">
-            <value>Magento_Core::translate_inline.phtml</value>
-        </param>
+        <arguments>
+            <argument name="url" xsi:type="object">Magento\Backend\Model\UrlInterface</argument>
+            <argument name="templateFileName" xsi:type="string">Magento_Core::translate_inline.phtml</argument>
+        </arguments>
     </type>
     <type name="Magento\Backend\App\Action\Context">
-        <param name="helper">
-            <instance type="Magento\Backend\Helper\Data" />
-        </param>
+        <arguments>
+            <argument name="helper" xsi:type="object">Magento\Backend\Helper\Data</argument>
+        </arguments>
     </type>
     <type name="Magento\Backend\Model\Auth\Session">
-        <param name="backendUrl">
-            <instance type="Magento\Backend\Model\UrlInterface\Proxy" />
-        </param>
+        <arguments>
+            <argument name="backendUrl" xsi:type="object">Magento\Backend\Model\UrlInterface\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\Session">
-        <param name="sessionName">
-            <value>adminhtml</value>
-        </param>
+        <arguments>
+            <argument name="sessionName" xsi:type="string">adminhtml</argument>
+        </arguments>
     </type>
     <type name="Magento\Backend\Model\Config\Structure\Data">
-        <param name="cacheId">
-            <value>backend_system_configuration_structure</value>
-        </param>
+        <arguments>
+            <argument name="cacheId" xsi:type="string">backend_system_configuration_structure</argument>
+        </arguments>
     </type>
     <type name="Magento\Backend\Model\Config\Structure\Element\Iterator\Tab" shared="false" />
     <type name="Magento\Backend\Model\Config\Structure\Element\Iterator\Section" shared="false" />
     <type name="Magento\Backend\Model\Config\Structure\Element\Iterator\Group" shared="false" />
     <type name="Magento\Backend\Model\Config\Structure\Element\Iterator\Field" shared="false">
-        <param name="groupFlyweight">
-            <instance type="Magento\Backend\Model\Config\Structure\Element\Group\Proxy" />
-        </param>
+        <arguments>
+            <argument name="groupFlyweight" xsi:type="object">Magento\Backend\Model\Config\Structure\Element\Group\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Backend\Model\Config\Structure\Element\Dependency\Mapper" shared="false">
-        <param name="fieldLocator">
-            <instance type="Magento\Backend\Model\Config\Structure\Search\Proxy" />
-        </param>
+        <arguments>
+            <argument name="fieldLocator" xsi:type="object">Magento\Backend\Model\Config\Structure\Search\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Backend\Model\Config\Structure\Element\Tab" shared="false">
-        <param name="childrenIterator">
-            <instance type="Magento\Backend\Model\Config\Structure\Element\Iterator\Section" />
-        </param>
+        <arguments>
+            <argument name="childrenIterator" xsi:type="object">Magento\Backend\Model\Config\Structure\Element\Iterator\Section</argument>
+        </arguments>
     </type>
     <type name="Magento\Backend\Model\Config\Structure\Element\Section" shared="false">
-        <param name="childrenIterator">
-            <instance type="Magento\Backend\Model\Config\Structure\Element\Iterator\Group" />
-        </param>
+        <arguments>
+            <argument name="childrenIterator" xsi:type="object">Magento\Backend\Model\Config\Structure\Element\Iterator\Group</argument>
+        </arguments>
     </type>
     <type name="Magento\Backend\Model\Config\Structure\Element\Group" shared="false">
-        <param name="childrenIterator">
-            <instance type="Magento\Backend\Model\Config\Structure\Element\Iterator\Field" />
-        </param>
+        <arguments>
+            <argument name="childrenIterator" xsi:type="object">Magento\Backend\Model\Config\Structure\Element\Iterator\Field</argument>
+        </arguments>
     </type>
     <type name="Magento\Backend\Model\Config\Structure\Element\Group\Proxy" shared="false" />
     <type name="Magento\Core\Model\Layout">
-        <param name="area">
-            <value>adminhtml</value>
-        </param>
+        <arguments>
+            <argument name="area" xsi:type="string">adminhtml</argument>
+        </arguments>
     </type>
     <type name="Magento\App\RouterList">
-        <param name="routerList">
-            <array>
-                <item key="admin">
-                    <array>
-                        <item key="instance"><value>Magento\Backend\App\Router\DefaultRouter</value></item>
-                        <item key="disable"><value type="bool">false</value></item>
-                        <item key="sortOrder"><value>10</value></item>
-                    </array>
+        <arguments>
+            <argument name="routerList" xsi:type="array">
+                <item name="admin" xsi:type="array">
+                    <item name="instance" xsi:type="string">Magento\Backend\App\Router\DefaultRouter</item>
+                    <item name="disable" xsi:type="boolean">false</item>
+                    <item name="sortOrder" xsi:type="string">10</item>
                 </item>
-                <item key="default">
-                    <array>
-                        <item key="instance"><value>Magento\App\Router\DefaultRouter</value></item>
-                        <item key="disable"><value type="bool">false</value></item>
-                        <item key="sortOrder"><value>100</value></item>
-                    </array>
+                <item name="default" xsi:type="array">
+                    <item name="instance" xsi:type="string">Magento\App\Router\DefaultRouter</item>
+                    <item name="disable" xsi:type="boolean">false</item>
+                    <item name="sortOrder" xsi:type="string">100</item>
                 </item>
-            </array>
-        </param>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Core\App\Action\Plugin\Session">
-        <param name="sessionNamespace">
-            <value type="const">Magento\Backend\App\AbstractAction::SESSION_NAMESPACE</value>
-        </param>
+        <arguments>
+            <argument name="sessionNamespace" xsi:type="const">Magento\Backend\App\AbstractAction::SESSION_NAMESPACE</argument>
+        </arguments>
     </type>
     <type name="Magento\Backend\App\AbstractAction">
         <plugin name="adminAuthentication" type="Magento\Backend\App\Action\Plugin\Authentication" sortOrder="100" />
         <plugin name="adminMassactionKey" type="Magento\Backend\App\Action\Plugin\MassactionKey" sortOrder="11" />
     </type>
     <type name="Magento\Core\App\Response\Redirect">
-        <param name="canUseSessionIdInParam">
-            <value type="bool">false</value>
-        </param>
+        <arguments>
+            <argument name="canUseSessionIdInParam" xsi:type="boolean">false</argument>
+        </arguments>
     </type>
     <type name="Magento\App\Action\Action">
         <plugin name="storeCheck" disabled="true" />
     </type>
     <type name="Magento\Message\Manager">
-        <param name="defaultGroup">
-            <value>backend</value>
-        </param>
+        <arguments>
+            <argument name="defaultGroup" xsi:type="string">backend</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Backend/etc/di.xml b/app/code/Magento/Backend/etc/di.xml
index 3d1389f18cc..7cb58d42078 100644
--- a/app/code/Magento/Backend/etc/di.xml
+++ b/app/code/Magento/Backend/etc/di.xml
@@ -23,7 +23,7 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <preference for="Magento\App\Config\Storage\WriterInterface" type="Magento\Core\Model\Config\Storage\Db" />
     <preference for="Magento\App\Request\PathInfoProcessorInterface" type="Magento\Backend\App\Request\PathInfoProcessor" />
     <preference for="Magento\Backend\Model\Auth\StorageInterface" type="Magento\Backend\Model\Auth\Session" />
@@ -34,163 +34,151 @@
     <preference for="Magento\Backend\App\ConfigInterface" type="Magento\Backend\App\Config" />
     <preference for="Magento\Backend\Model\UrlInterface" type="Magento\Backend\Model\Url" />
     <type name="Magento\App\AreaList">
-        <param name="areas">
-            <array>
-                <item key="adminhtml">
-                    <array>
-                        <item key="frontNameResolver"><value>Magento\Backend\App\Area\FrontNameResolver</value></item>
-                        <item key="router"><value>admin</value></item>
-                    </array>
+        <arguments>
+            <argument name="areas" xsi:type="array">
+                <item name="adminhtml" xsi:type="array">
+                    <item name="frontNameResolver" xsi:type="string">Magento\Backend\App\Area\FrontNameResolver</item>
+                    <item name="router" xsi:type="string">admin</item>
                 </item>
-            </array>
-        </param>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Backend\App\Router\DefaultRouter">
-        <param name="routerId">
-            <value>admin</value>
-        </param>
+        <arguments>
+            <argument name="routerId" xsi:type="string">admin</argument>
+        </arguments>
     </type>
     <type name="Magento\Backend\Controller\Adminhtml\System\Config\Save">
-        <param name="cache">
-            <instance type="Magento\App\Cache\Type\Layout" />
-        </param>
+        <arguments>
+            <argument name="cache" xsi:type="object">Magento\App\Cache\Type\Layout</argument>
+        </arguments>
     </type>
     <type name="Magento\Backend\Model\Menu\Config">
-        <param name="menuDirector"><instance type="Magento\Backend\Model\Menu\Director\Director"/></param>
+        <arguments>
+            <argument name="menuDirector" xsi:type="object">Magento\Backend\Model\Menu\Director\Director</argument>
+        </arguments>
     </type>
     <type name="Magento\Backend\App\Area\FrontNameResolver">
-        <param name="defaultFrontName">
-            <value type="argument">Magento\Backend\App\Area\FrontNameResolver::PARAM_BACKEND_FRONT_NAME</value>
-        </param>
+        <arguments>
+            <argument name="defaultFrontName" xsi:type="init_parameter">Magento\Backend\App\Area\FrontNameResolver::PARAM_BACKEND_FRONT_NAME</argument>
+        </arguments>
     </type>
     <type name="Magento\Backend\Helper\Data">
-        <param name="backendUrl">
-            <instance type="Magento\Backend\Model\UrlInterface\Proxy" />
-        </param>
-        <param name="auth">
-            <instance type="Magento\Backend\Model\Auth\Proxy" />
-        </param>
+        <arguments>
+            <argument name="backendUrl" xsi:type="object">Magento\Backend\Model\UrlInterface\Proxy</argument>
+            <argument name="auth" xsi:type="object">Magento\Backend\Model\Auth\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\App\Router\NoRouteHandlerList">
-        <param name="handlerClassesList">
-            <array>
-                <item key="backend">
-                    <array>
-                        <item key="instance"><value>Magento\Backend\App\Router\NoRouteHandler</value></item>
-                        <item key="sortOrder"><value>10</value></item>
-                    </array>
+        <arguments>
+            <argument name="handlerClassesList" xsi:type="array">
+                <item name="backend" xsi:type="array">
+                    <item name="instance" xsi:type="string">Magento\Backend\App\Router\NoRouteHandler</item>
+                    <item name="sortOrder" xsi:type="string">10</item>
                 </item>
-            </array>
-        </param>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Backend\Model\Widget\Grid\Row\UrlGenerator">
-        <param name="backendUrl">
-            <instance type="Magento\Backend\Model\UrlInterface\Proxy" />
-        </param>
+        <arguments>
+            <argument name="backendUrl" xsi:type="object">Magento\Backend\Model\UrlInterface\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Backend\Model\Observer">
-        <param name="backendSession">
-            <instance type="Magento\Backend\Model\Session\Proxy" />
-        </param>
+        <arguments>
+            <argument name="backendSession" xsi:type="object">Magento\Backend\Model\Session\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Backend\Model\Url\ScopeResolver">
-        <param name="areaCode">
-            <value>adminhtml</value>
-        </param>
+        <arguments>
+            <argument name="areaCode" xsi:type="string">adminhtml</argument>
+        </arguments>
     </type>
     <type name="Magento\Backend\Model\Url">
-        <param name="authSession">
-            <instance type="Magento\Backend\Model\Auth\Session\Proxy" />
-        </param>
-        <param name="formKey">
-            <instance type="Magento\Data\Form\FormKey\Proxy" />
-        </param>
+        <arguments>
+            <argument name="authSession" xsi:type="object">Magento\Backend\Model\Auth\Session\Proxy</argument>
+            <argument name="formKey" xsi:type="object">Magento\Data\Form\FormKey\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Backend\Helper\Dashboard\Data">
-        <param name="installDate">
-            <value type="argument">Magento\App\State::PARAM_INSTALL_DATE</value>
-        </param>
+        <arguments>
+            <argument name="installDate" xsi:type="init_parameter">Magento\App\State::PARAM_INSTALL_DATE</argument>
+        </arguments>
     </type>
     <preference for="Magento\Authorization\RoleLocator" type="Magento\Backend\Model\Authorization\RoleLocator" />
     <preference for="Magento\Authorization\Policy" type="Magento\Authorization\Policy\Acl"/>
     <preference for="Magento\Acl\Resource\ProviderInterface" type="Magento\Acl\Resource\Provider"/>
     <type name="Magento\Acl\Resource\Config\Reader\Filesystem">
-        <param name="converter">
-            <instance type="Magento\Acl\Resource\Config\Converter\Dom"/>
-        </param>
+        <arguments>
+            <argument name="converter" xsi:type="object">Magento\Acl\Resource\Config\Converter\Dom</argument>
+        </arguments>
     </type>
     <type name="Magento\Acl\Resource\Provider">
-        <param name="configReader">
-            <instance type="Magento\Acl\Resource\Config\Reader\Filesystem"/>
-        </param>
+        <arguments>
+            <argument name="configReader" xsi:type="object">Magento\Acl\Resource\Config\Reader\Filesystem</argument>
+        </arguments>
     </type>
     <type name="Magento\Acl\Builder">
-        <param name="resourceLoader">
-            <instance type="Magento\Acl\Loader\Resource"/>
-        </param>
+        <arguments>
+            <argument name="resourceLoader" xsi:type="object">Magento\Acl\Loader\Resource</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\Acl\Cache">
-        <param name="cacheKey">
-            <value>backend_acl_resources</value>
-        </param>
+        <arguments>
+            <argument name="cacheKey" xsi:type="string">backend_acl_resources</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\Acl\RootResource">
-        <param name="identifier">
-            <value>Magento_Adminhtml::all</value>
-        </param>
+        <arguments>
+            <argument name="identifier" xsi:type="string">Magento_Adminhtml::all</argument>
+        </arguments>
     </type>
     <type name="Magento\Backend\Controller\Adminhtml\Index">
-        <param name="searchModules">
-            <array>
-                <item key="products">
-                    <array>
-                        <item key="class"><value>Magento\Backend\Model\Search\Catalog</value></item>
-                        <item key="acl"><value>Magento_Catalog::catalog</value></item>
-                    </array>
+        <arguments>
+            <argument name="searchModules" xsi:type="array">
+                <item name="products" xsi:type="array">
+                    <item name="class" xsi:type="string">Magento\Backend\Model\Search\Catalog</item>
+                    <item name="acl" xsi:type="string">Magento_Catalog::catalog</item>
                 </item>
-                <item key="customers">
-                    <array>
-                        <item key="class"><value>Magento\Backend\Model\Search\Customer</value></item>
-                        <item key="acl"><value>Magento_Customer::customer</value></item>
-                    </array>
+                <item name="customers" xsi:type="array">
+                    <item name="class" xsi:type="string">Magento\Backend\Model\Search\Customer</item>
+                    <item name="acl" xsi:type="string">Magento_Customer::customer</item>
                 </item>
-                <item key="sales">
-                    <array>
-                        <item key="class"><value>Magento\Backend\Model\Search\Order</value></item>
-                        <item key="acl"><value>Magento_Sales::sales</value></item>
-                    </array>
+                <item name="sales" xsi:type="array">
+                    <item name="class" xsi:type="string">Magento\Backend\Model\Search\Order</item>
+                    <item name="acl" xsi:type="string">Magento_Sales::sales</item>
                 </item>
-            </array>
-        </param>
+            </argument>
+        </arguments>
     </type>
     <virtualType name="Magento\Backend\Model\Auth\Session\Storage" type="Magento\Session\Storage">
-        <param name="namespace">
-            <value>admin</value>
-        </param>
+        <arguments>
+            <argument name="namespace" xsi:type="string">admin</argument>
+        </arguments>
     </virtualType>
     <type name="Magento\Backend\Model\Auth\Session">
-        <param name="storage">
-            <instance type="Magento\Backend\Model\Auth\Session\Storage" />
-        </param>
+        <arguments>
+            <argument name="storage" xsi:type="object">Magento\Backend\Model\Auth\Session\Storage</argument>
+        </arguments>
     </type>
     <virtualType name="Magento\Backend\Model\Session\Storage" type="Magento\Session\Storage">
-        <param name="namespace">
-            <value>adminhtml</value>
-        </param>
+        <arguments>
+            <argument name="namespace" xsi:type="string">adminhtml</argument>
+        </arguments>
     </virtualType>
     <type name="Magento\Backend\Model\Session">
-        <param name="storage">
-            <instance type="Magento\Backend\Model\Session\Storage" />
-        </param>
+        <arguments>
+            <argument name="storage" xsi:type="object">Magento\Backend\Model\Session\Storage</argument>
+        </arguments>
     </type>
     <virtualType name="Magento\Backend\Model\Session\Quote\Storage" type="Magento\Session\Storage">
-        <param name="namespace">
-            <value>adminhtml_quote</value>
-        </param>
+        <arguments>
+            <argument name="namespace" xsi:type="string">adminhtml_quote</argument>
+        </arguments>
     </virtualType>
     <type name="Magento\Backend\Model\Session\Quote">
-        <param name="storage">
-            <instance type="Magento\Backend\Model\Session\Quote\Storage" />
-        </param>
+        <arguments>
+            <argument name="storage" xsi:type="object">Magento\Backend\Model\Session\Quote\Storage</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Backup/Block/Adminhtml/Backup.php b/app/code/Magento/Backup/Block/Adminhtml/Backup.php
index a2a59fc3674..d9e92545989 100644
--- a/app/code/Magento/Backup/Block/Adminhtml/Backup.php
+++ b/app/code/Magento/Backup/Block/Adminhtml/Backup.php
@@ -23,16 +23,15 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Backup\Block\Adminhtml;
+
+use Magento\View\Element\AbstractBlock;
 
 /**
  * Adminhtml backup page content block
  *
- * @category   Magento
- * @package    Magento_Adminhtml
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Backup\Block\Adminhtml;
-
 class Backup extends \Magento\Backend\Block\Template
 {
     /**
@@ -42,6 +41,9 @@ class Backup extends \Magento\Backend\Block\Template
      */
     protected $_template = 'Magento_Backup::backup/list.phtml';
 
+    /**
+     * @return AbstractBlock|void
+     */
     protected function _prepareLayout()
     {
         parent::_prepareLayout();
@@ -64,6 +66,9 @@ class Backup extends \Magento\Backend\Block\Template
         $this->addChild('dialogs', 'Magento\Backup\Block\Adminhtml\Dialogs');
     }
 
+    /**
+     * @return string
+     */
     public function getCreateButtonHtml()
     {
         return $this->getChildHtml('createButton');
@@ -89,6 +94,9 @@ class Backup extends \Magento\Backend\Block\Template
         return $this->getChildHtml('createMediaBackupButton');
     }
 
+    /**
+     * @return string
+     */
     public function getGridHtml()
     {
         return $this->getChildHtml('backupsGrid');
diff --git a/app/code/Magento/Backup/Block/Adminhtml/Dialogs.php b/app/code/Magento/Backup/Block/Adminhtml/Dialogs.php
index 5eec687ee98..85771330559 100644
--- a/app/code/Magento/Backup/Block/Adminhtml/Dialogs.php
+++ b/app/code/Magento/Backup/Block/Adminhtml/Dialogs.php
@@ -23,16 +23,15 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Backup\Block\Adminhtml;
+
+use Magento\View\Element\AbstractBlock;
 
 /**
  * Adminhtml rollback dialogs block
  *
- * @category   Magento
- * @package    Magento_Adminhtml
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Backup\Block\Adminhtml;
-
 class Dialogs extends \Magento\Backend\Block\Template
 {
     /**
@@ -45,7 +44,8 @@ class Dialogs extends \Magento\Backend\Block\Template
     /**
      * Include backup.js file in page before rendering
      *
-     * @see \Magento\View\Element\AbstractBlock::_prepareLayout()
+     * @return AbstractBlock|void
+     * @see AbstractBlock::_prepareLayout()
      */
     protected function _prepareLayout()
     {
diff --git a/app/code/Magento/Backup/Controller/Adminhtml/Index.php b/app/code/Magento/Backup/Controller/Adminhtml/Index.php
index a9ba1fd09d4..28d56779742 100644
--- a/app/code/Magento/Backup/Controller/Adminhtml/Index.php
+++ b/app/code/Magento/Backup/Controller/Adminhtml/Index.php
@@ -23,16 +23,13 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Backup\Controller\Adminhtml;
 
 /**
  * Backup admin controller
  *
- * @category   Magento
- * @package    Magento_Backend
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Backup\Controller\Adminhtml;
-
 class Index extends \Magento\Backend\App\Action
 {
     /**
@@ -80,6 +77,8 @@ class Index extends \Magento\Backend\App\Action
 
     /**
      * Backup list action
+     *
+     * @return void
      */
     public function indexAction()
     {
@@ -101,6 +100,8 @@ class Index extends \Magento\Backend\App\Action
 
     /**
      * Backup list action
+     *
+     * @return void
      */
     public function gridAction()
     {
@@ -111,7 +112,7 @@ class Index extends \Magento\Backend\App\Action
     /**
      * Create backup action
      *
-     * @return \Magento\Backend\App\Action
+     * @return void|\Magento\Backend\App\Action
      */
     public function createAction()
     {
@@ -195,7 +196,7 @@ class Index extends \Magento\Backend\App\Action
     /**
      * Download backup action
      *
-     * @return \Magento\Backend\App\Action
+     * @return void|\Magento\Backend\App\Action
      */
     public function downloadAction()
     {
@@ -229,7 +230,7 @@ class Index extends \Magento\Backend\App\Action
     /**
      * Rollback Action
      *
-     * @return \Magento\Backend\App\Action
+     * @return void|\Magento\Backend\App\Action
      */
     public function rollbackAction()
     {
diff --git a/app/code/Magento/Backup/Helper/Data.php b/app/code/Magento/Backup/Helper/Data.php
index be43df0f45c..091e63fd3cf 100644
--- a/app/code/Magento/Backup/Helper/Data.php
+++ b/app/code/Magento/Backup/Helper/Data.php
@@ -21,12 +21,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Backup\Helper;
 
 /**
  * Backup data helper
  */
-namespace Magento\Backup\Helper;
-
 class Data extends \Magento\App\Helper\AbstractHelper
 {
     /**
@@ -92,7 +91,7 @@ class Data extends \Magento\App\Helper\AbstractHelper
     /**
      * Get all possible backup type values
      *
-     * @return array
+     * @return string[]
      */
     public function getBackupTypesList()
     {
@@ -167,7 +166,7 @@ class Data extends \Magento\App\Helper\AbstractHelper
     /**
      * Check Permission for Rollback
      *
-     * @return boolean
+     * @return bool
      */
     public function isRollbackAllowed()
     {
@@ -177,7 +176,7 @@ class Data extends \Magento\App\Helper\AbstractHelper
     /**
      * Get paths that should be ignored when creating system snapshots
      *
-     * @return array
+     * @return string[]
      */
     public function getBackupIgnorePaths()
     {
@@ -197,7 +196,7 @@ class Data extends \Magento\App\Helper\AbstractHelper
     /**
      * Get paths that should be ignored when rolling back system snapshots
      *
-     * @return array
+     * @return string[]
      */
     public function getRollbackIgnorePaths()
     {
@@ -231,6 +230,8 @@ class Data extends \Magento\App\Helper\AbstractHelper
 
     /**
      * Turn off store maintenance mode
+     *
+     * @return void
      */
     public function turnOffMaintenanceMode()
     {
@@ -242,7 +243,7 @@ class Data extends \Magento\App\Helper\AbstractHelper
      * Get backup create success message by backup type
      *
      * @param string $type
-     * @return string
+     * @return void|string
      */
     public function getCreateSuccessMessageByType($type)
     {
@@ -273,7 +274,7 @@ class Data extends \Magento\App\Helper\AbstractHelper
     /**
      * Invalidate Cache
      *
-     * @return \Magento\Backup\Helper\Data
+     * @return $this
      */
     public function invalidateCache()
     {
@@ -287,7 +288,7 @@ class Data extends \Magento\App\Helper\AbstractHelper
     /**
      * Invalidate Indexer
      *
-     * @return \Magento\Backup\Helper\Data
+     * @return $this
      */
     public function invalidateIndexer()
     {
diff --git a/app/code/Magento/Backup/Model/Backup.php b/app/code/Magento/Backup/Model/Backup.php
index 78faadd67b1..ddd429f01f2 100644
--- a/app/code/Magento/Backup/Model/Backup.php
+++ b/app/code/Magento/Backup/Model/Backup.php
@@ -21,6 +21,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Backup\Model;
 
 /**
  * Backup file item model
@@ -32,8 +33,6 @@
  * @method string getTime()
  * @method \Magento\Backup\Model\Backup setTime() setTime($time)
  */
-namespace Magento\Backup\Model;
-
 class Backup extends \Magento\Object implements \Magento\Backup\Db\BackupInterface
 {
     /* internal constants */
@@ -117,7 +116,7 @@ class Backup extends \Magento\Object implements \Magento\Backup\Db\BackupInterfa
      * Set backup time
      *
      * @param int $time
-     * @return \Magento\Backup\Db\BackupInterface
+     * @return $this
      */
     public function setTime($time)
     {
@@ -129,7 +128,7 @@ class Backup extends \Magento\Object implements \Magento\Backup\Db\BackupInterfa
      * Set backup path
      *
      * @param string $path
-     * @return \Magento\Backup\Db\BackupInterface
+     * @return $this
      */
     public function setPath($path)
     {
@@ -141,7 +140,7 @@ class Backup extends \Magento\Object implements \Magento\Backup\Db\BackupInterfa
      * Set backup name
      *
      * @param string $name
-     * @return \Magento\Backup\Db\BackupInterface
+     * @return $this
      */
     public function setName($name)
     {
@@ -155,7 +154,7 @@ class Backup extends \Magento\Object implements \Magento\Backup\Db\BackupInterfa
      *
      * @param string $fileName
      * @param string $filePath
-     * @return \Magento\Backup\Model\Backup
+     * @return $this
      */
     public function load($fileName, $filePath)
     {
@@ -178,7 +177,7 @@ class Backup extends \Magento\Object implements \Magento\Backup\Db\BackupInterfa
     /**
      * Checks backup file exists.
      *
-     * @return boolean
+     * @return bool
      */
     public function exists()
     {
@@ -208,7 +207,7 @@ class Backup extends \Magento\Object implements \Magento\Backup\Db\BackupInterfa
      * Sets type of file
      *
      * @param string $value
-     * @return \Magento\Backup\Model\Backup
+     * @return $this
      */
     public function setType($value = 'db')
     {
@@ -236,8 +235,8 @@ class Backup extends \Magento\Object implements \Magento\Backup\Db\BackupInterfa
     /**
      * Set the backup file content
      *
-     * @param string $content
-     * @return \Magento\Backup\Model\Backup
+     * @param string &$content
+     * @return $this
      * @throws \Magento\Core\Exception
      */
     public function setFile(&$content)
@@ -268,7 +267,7 @@ class Backup extends \Magento\Object implements \Magento\Backup\Db\BackupInterfa
     /**
      * Delete backup file
      *
-     * @return \Magento\Backup\Model\Backup
+     * @return $this
      * @throws \Magento\Core\Exception
      */
     public function deleteFile()
@@ -285,7 +284,7 @@ class Backup extends \Magento\Object implements \Magento\Backup\Db\BackupInterfa
      * Open backup file (write or read mode)
      *
      * @param bool $write
-     * @return \Magento\Backup\Model\Backup
+     * @return $this
      * @throws \Magento\Backup\Exception
      * @throws \Magento\Backup\Exception\NotEnoughPermissions
      */
@@ -337,7 +336,7 @@ class Backup extends \Magento\Object implements \Magento\Backup\Db\BackupInterfa
     }
 
     /**
-     * Read backup uncomressed data
+     * Read backup uncompressed data
      *
      * @param int $length
      * @return string
@@ -361,7 +360,7 @@ class Backup extends \Magento\Object implements \Magento\Backup\Db\BackupInterfa
      * Write to backup file
      *
      * @param string $string
-     * @return \Magento\Backup\Model\Backup
+     * @return $this
      * @throws \Magento\Backup\Exception
      */
     public function write($string)
@@ -380,7 +379,7 @@ class Backup extends \Magento\Object implements \Magento\Backup\Db\BackupInterfa
     /**
      * Close open backup file
      *
-     * @return \Magento\Backup\Model\Backup
+     * @return $this
      */
     public function close()
     {
@@ -392,6 +391,8 @@ class Backup extends \Magento\Object implements \Magento\Backup\Db\BackupInterfa
 
     /**
      * Print output
+     *
+     * @return void
      */
     public function output()
     {
diff --git a/app/code/Magento/Backup/Model/Config/Backend/Cron.php b/app/code/Magento/Backup/Model/Config/Backend/Cron.php
index a8a625d93e0..62370583bd6 100644
--- a/app/code/Magento/Backup/Model/Config/Backend/Cron.php
+++ b/app/code/Magento/Backup/Model/Config/Backend/Cron.php
@@ -21,12 +21,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Backup\Model\Config\Backend;
 
 /**
  * Backup by cron backend model
  */
-namespace Magento\Backup\Model\Config\Backend;
-
 class Cron extends \Magento\Core\Model\Config\Value
 {
     const CRON_STRING_PATH  = 'crontab/default/jobs/system_backup/schedule/cron_expr';
@@ -78,7 +77,7 @@ class Cron extends \Magento\Core\Model\Config\Value
     /**
      * Cron settings after save
      *
-     * @return \Magento\Backend\Model\Config\Backend\Log\Cron
+     * @return void
      * @throws \Magento\Core\Exception
      */
     protected function _afterSave()
diff --git a/app/code/Magento/Backup/Model/Config/Source/Type.php b/app/code/Magento/Backup/Model/Config/Source/Type.php
index 1f97122e246..ad3f6c6f8b9 100644
--- a/app/code/Magento/Backup/Model/Config/Source/Type.php
+++ b/app/code/Magento/Backup/Model/Config/Source/Type.php
@@ -23,16 +23,13 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Backup\Model\Config\Source;
 
 /**
  * Backups types' source model for system configuration
  *
- * @category   Magento
- * @package    Magento_Backup
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Backup\Model\Config\Source;
-
 class Type implements \Magento\Core\Model\Option\ArrayInterface
 {
     /**
@@ -52,9 +49,7 @@ class Type implements \Magento\Core\Model\Option\ArrayInterface
     }
 
     /**
-     * return possible options
-     *
-     * @return array
+     * {@inheritdoc}
      */
     public function toOptionArray()
     {
diff --git a/app/code/Magento/Backup/Model/Db.php b/app/code/Magento/Backup/Model/Db.php
index 2de0c3c0e40..862f54a63c5 100644
--- a/app/code/Magento/Backup/Model/Db.php
+++ b/app/code/Magento/Backup/Model/Db.php
@@ -23,24 +23,18 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Backup\Model;
 
 /**
  * Database backup model
  *
- * @category    Magento
- * @package     Magento_Backup
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Backup\Model;
-
 class Db implements \Magento\Backup\Db\BackupDbInterface
 {
-
     /**
      * Buffer length for multi rows
      * default 100 Kb
-     *
      */
     const BUFFER_LENGTH = 102400;
 
@@ -87,31 +81,52 @@ class Db implements \Magento\Backup\Db\BackupDbInterface
         return $this->_resourceDb;
     }
 
+    /**
+     * @return array
+     */
     public function getTables()
     {
         return $this->getResource()->getTables();
     }
 
+    /**
+     * @param string $tableName
+     * @param bool $addDropIfExists
+     * @return string
+     */
     public function getTableCreateScript($tableName, $addDropIfExists=false)
     {
         return $this->getResource()->getTableCreateScript($tableName, $addDropIfExists);
     }
 
+    /**
+     * @param string $tableName
+     * @return string
+     */
     public function getTableDataDump($tableName)
     {
         return $this->getResource()->getTableDataDump($tableName);
     }
 
+    /**
+     * @return string
+     */
     public function getHeader()
     {
         return $this->getResource()->getHeader();
     }
 
+    /**
+     * @return string
+     */
     public function getFooter()
     {
         return $this->getResource()->getFooter();
     }
 
+    /**
+     * @return string
+     */
     public function renderSql()
     {
         ini_set('max_execution_time', 0);
@@ -131,7 +146,7 @@ class Db implements \Magento\Backup\Db\BackupDbInterface
      * Create backup and stream write to adapter
      *
      * @param \Magento\Backup\Db\BackupInterface $backup
-     * @return \Magento\Backup\Model\Db
+     * @return $this
      */
     public function createBackup(\Magento\Backup\Db\BackupInterface $backup)
     {
@@ -159,13 +174,11 @@ class Db implements \Magento\Backup\Db\BackupDbInterface
                     if ($tableStatus->getAvgRowLength() < self::BUFFER_LENGTH) {
                         $limit = floor(self::BUFFER_LENGTH / $tableStatus->getAvgRowLength());
                         $multiRowsLength = ceil($tableStatus->getRows() / $limit);
-                    }
-                    else {
+                    } else {
                         $limit = 1;
                         $multiRowsLength = $tableStatus->getRows();
                     }
-                }
-                else {
+                } else {
                     $limit = $tableStatus->getRows();
                     $multiRowsLength = 1;
                 }
@@ -187,10 +200,10 @@ class Db implements \Magento\Backup\Db\BackupDbInterface
         return $this;
     }
 
-    /**.
+    /**
      * Returns the list of tables which data should not be backed up
      *
-     * @return array
+     * @return string[]
      */
     public function getIgnoreDataTablesList()
     {
diff --git a/app/code/Magento/Backup/Model/Fs/Collection.php b/app/code/Magento/Backup/Model/Fs/Collection.php
index b26159bb68d..290db6fe7bd 100644
--- a/app/code/Magento/Backup/Model/Fs/Collection.php
+++ b/app/code/Magento/Backup/Model/Fs/Collection.php
@@ -21,12 +21,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Backup\Model\Fs;
 
 /**
  * Backup data collection
  */
-namespace Magento\Backup\Model\Fs;
-
 class Collection extends \Magento\Data\Collection\Filesystem
 {
     /**
@@ -94,6 +93,8 @@ class Collection extends \Magento\Data\Collection\Filesystem
 
     /**
      * Create .htaccess file and deny backups directory access from web
+     *
+     * @return void
      */
     protected function _hideBackupsForApache()
     {
diff --git a/app/code/Magento/Backup/Model/Resource/Db.php b/app/code/Magento/Backup/Model/Resource/Db.php
index cf9662356c6..64b7a5dee04 100644
--- a/app/code/Magento/Backup/Model/Resource/Db.php
+++ b/app/code/Magento/Backup/Model/Resource/Db.php
@@ -21,12 +21,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Backup\Model\Resource;
 
 /**
  * Database backup resource model
  */
-namespace Magento\Backup\Model\Resource;
-
 class Db
 {
     /**
@@ -37,7 +36,7 @@ class Db
     protected $_write;
 
     /**
-     * tables Foreign key data array
+     * Tables foreign key data array
      * [tbl_name] = array(create foreign key strings)
      *
      * @var array
@@ -68,6 +67,7 @@ class Db
     /**
      * Clear data
      *
+     * @return void
      */
     public function clear()
     {
@@ -118,7 +118,7 @@ class Db
         $fkScript = '';
         if (!$tableName) {
             $tables = $this->getTables();
-            foreach($tables as $table) {
+            foreach ($tables as $table) {
                 $tableFkScript = $this->_resourceHelper->getTableForeignKeysSql($table);
                 if (!empty($tableFkScript)) {
                     $fkScript .= "\n" . $tableFkScript;
@@ -134,7 +134,7 @@ class Db
      * Retrieve table status
      *
      * @param string $tableName
-     * @return \Magento\Object
+     * @return \Magento\Object|bool
      */
     public function getTableStatus($tableName)
     {
@@ -158,11 +158,11 @@ class Db
     }
 
     /**
-     * Retrieve table partical data SQL insert
+     * Retrieve table partial data SQL insert
      *
      * @param string $tableName
-     * @param int $count
-     * @param int $offset
+     * @param null|int $count
+     * @param null|int $offset
      * @return string
      */
     public function getTableDataSql($tableName, $count = null, $offset = null)
@@ -173,19 +173,19 @@ class Db
     /**
      * Enter description here...
      *
-     * @param string|array|Zend_Db_Expr $tableName
+     * @param string|array|\Zend_Db_Expr $tableName
      * @param bool $addDropIfExists
      * @return string
      */
     public function getTableCreateScript($tableName, $addDropIfExists = false)
     {
-        return $this->_resourceHelper->getTableCreateScript($tableName, $addDropIfExists);;
+        return $this->_resourceHelper->getTableCreateScript($tableName, $addDropIfExists);
     }
 
     /**
      * Retrieve table header comment
      *
-     * @param unknown_type $tableName
+     * @param string $tableName
      * @return string
      */
     public function getTableHeader($tableName)
@@ -253,7 +253,7 @@ class Db
     /**
      * Start transaction mode
      *
-     * @return \Magento\Backup\Model\Resource\Db
+     * @return $this
      */
     public function beginTransaction()
     {
@@ -265,7 +265,7 @@ class Db
     /**
      * Commit transaction
      *
-     * @return \Magento\Backup\Model\Resource\Db
+     * @return $this
      */
     public function commitTransaction()
     {
@@ -277,7 +277,7 @@ class Db
     /**
      * Rollback transaction
      *
-     * @return \Magento\Backup\Model\Resource\Db
+     * @return $this
      */
     public function rollBackTransaction()
     {
@@ -289,8 +289,8 @@ class Db
     /**
      * Run sql code
      *
-     * @param $command
-     * @return \Magento\Backup\Model\Resource\Db
+     * @param string $command
+     * @return $this
      */
     public function runCommand($command){
         $this->_write->query($command);
diff --git a/app/code/Magento/Backup/Model/Resource/Helper.php b/app/code/Magento/Backup/Model/Resource/Helper.php
index 087633a7413..41e5fa63f53 100644
--- a/app/code/Magento/Backup/Model/Resource/Helper.php
+++ b/app/code/Magento/Backup/Model/Resource/Helper.php
@@ -23,7 +23,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Backup\Model\Resource;
 
 class Helper extends \Magento\Core\Model\Resource\Helper
@@ -46,7 +45,7 @@ class Helper extends \Magento\Core\Model\Resource\Helper
     /**
      * @param \Magento\App\Resource $resource
      * @param \Magento\Core\Model\Date $coreDate
-     * @param $modulePrefix
+     * @param string $modulePrefix
      */
     public function __construct(
         \Magento\App\Resource $resource,
@@ -331,6 +330,8 @@ class Helper extends \Magento\Core\Model\Resource\Helper
 
     /**
      * Prepare transaction isolation level for backup process
+     *
+     * @return void
      */
     public function prepareTransactionIsolationLevel()
     {
@@ -339,6 +340,8 @@ class Helper extends \Magento\Core\Model\Resource\Helper
 
     /**
      * Restore transaction isolation level after backup
+     *
+     * @return void
      */
     public function restoreTransactionIsolationLevel()
     {
diff --git a/app/code/Magento/Backup/etc/di.xml b/app/code/Magento/Backup/etc/di.xml
index 419a089660b..30da640c12e 100644
--- a/app/code/Magento/Backup/etc/di.xml
+++ b/app/code/Magento/Backup/etc/di.xml
@@ -23,13 +23,11 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Backup\Db\BackupFactory">
-        <param name="backupInstanceName">
-            <value>Magento\Backup\Model\Backup</value>
-        </param>
-        <param name="backupDbInstanceName">
-            <value>Magento\Backup\Model\Db</value>
-        </param>
+        <arguments>
+            <argument name="backupInstanceName" xsi:type="string">Magento\Backup\Model\Backup</argument>
+            <argument name="backupDbInstanceName" xsi:type="string">Magento\Backup\Model\Db</argument>
+        </arguments>
     </type>
-</config>
\ No newline at end of file
+</config>
diff --git a/app/code/Magento/Bundle/Model/Product/Attribute/Source/Price/View.php b/app/code/Magento/Bundle/Model/Product/Attribute/Source/Price/View.php
index 01bb602f9eb..5343b12605a 100644
--- a/app/code/Magento/Bundle/Model/Product/Attribute/Source/Price/View.php
+++ b/app/code/Magento/Bundle/Model/Product/Attribute/Source/Price/View.php
@@ -114,14 +114,9 @@ class View
             'extra'     => null
         );
 
-        if ($this->_coreData->useDbCompatibleMode()) {
-            $column['type']     = 'int';
-            $column['is_null']  = true;
-        } else {
-            $column['type']     = \Magento\DB\Ddl\Table::TYPE_INTEGER;
-            $column['nullable'] = true;
-            $column['comment']  = 'Bundle Price View ' . $attributeCode . ' column';
-        }
+        $column['type']     = \Magento\DB\Ddl\Table::TYPE_INTEGER;
+        $column['nullable'] = true;
+        $column['comment']  = 'Bundle Price View ' . $attributeCode . ' column';
 
         return array($attributeCode => $column);
    }
diff --git a/app/code/Magento/Bundle/Model/Product/Type.php b/app/code/Magento/Bundle/Model/Product/Type.php
index 89c7abe5343..6d1cd960fe6 100644
--- a/app/code/Magento/Bundle/Model/Product/Type.php
+++ b/app/code/Magento/Bundle/Model/Product/Type.php
@@ -85,7 +85,7 @@ class Type extends \Magento\Catalog\Model\Product\Type\AbstractType
     protected $_keyUsedOptionsIds           = '_cache_instance_used_options_ids';
 
     /**
-     * Product is configurable
+     * Product is possible to configure
      *
      * @var bool
      */
diff --git a/app/code/Magento/Bundle/Model/Resource/Indexer/Price.php b/app/code/Magento/Bundle/Model/Resource/Indexer/Price.php
index 83d5a79bee0..d8cd051cff2 100644
--- a/app/code/Magento/Bundle/Model/Resource/Indexer/Price.php
+++ b/app/code/Magento/Bundle/Model/Resource/Indexer/Price.php
@@ -185,7 +185,7 @@ class Price extends \Magento\Catalog\Model\Resource\Product\Indexer\Price\Defaul
             ->where('e.type_id=?', $this->getTypeId());
 
         // add enable products limitation
-        $statusCond = $write->quoteInto('=?', \Magento\Catalog\Model\Product\Status::STATUS_ENABLED);
+        $statusCond = $write->quoteInto('=?', \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED);
         $this->_addAttributeToSelect($select, 'status', 'e.entity_id', 'cs.store_id', $statusCond, true);
         if ($this->_coreData->isModuleEnabled('Magento_Tax')) {
             $taxClassId = $this->_addAttributeToSelect($select, 'tax_class_id', 'e.entity_id', 'cs.store_id');
diff --git a/app/code/Magento/Bundle/Model/Resource/Indexer/Stock.php b/app/code/Magento/Bundle/Model/Resource/Indexer/Stock.php
index 8af8cc4ec07..d8f41266ce7 100644
--- a/app/code/Magento/Bundle/Model/Resource/Indexer/Stock.php
+++ b/app/code/Magento/Bundle/Model/Resource/Indexer/Stock.php
@@ -161,7 +161,7 @@ class Stock extends \Magento\CatalogInventory\Model\Resource\Indexer\Stock\Defau
             ->group(array('e.entity_id', 'cw.website_id', 'cis.stock_id'));
 
         // add limitation of status
-        $condition = $adapter->quoteInto('=?', \Magento\Catalog\Model\Product\Status::STATUS_ENABLED);
+        $condition = $adapter->quoteInto('=?', \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED);
         $this->_addAttributeToSelect($select, 'status', 'e.entity_id', 'cs.store_id', $condition);
 
         if ($this->_isManageStock()) {
diff --git a/app/code/Magento/Bundle/etc/adminhtml/di.xml b/app/code/Magento/Bundle/etc/adminhtml/di.xml
index 5c9770590a6..05acd489ee5 100644
--- a/app/code/Magento/Bundle/etc/adminhtml/di.xml
+++ b/app/code/Magento/Bundle/etc/adminhtml/di.xml
@@ -23,7 +23,7 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Sales\Model\Convert\Quote">
         <plugin name="append_bundle_data_to_order" type="Magento\Bundle\Model\Plugin\QuoteItem"/>
     </type>
@@ -31,17 +31,10 @@
         <plugin name="Bundle" type="Magento\Bundle\Controller\Adminhtml\Product\Initialization\Helper\Plugin\Bundle" sortOrder="60" />
     </type>
     <type name="Magento\Catalog\Model\Product\CopyConstructor\Composite">
-        <param name="constructors">
-            <array>
-                <item key="bundle"><value>Magento\Bundle\Model\Product\CopyConstructor\Bundle</value></item>
-            </array>
-        </param>
-    </type>
-    <type name="Magento\CatalogInventory\Block\Adminhtml\Form\Field\Stock">
-        <param name="complexProductTypes">
-            <array>
-                <item key="bundle"><value type="const">Magento\Catalog\Model\Product\Type::TYPE_BUNDLE</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="constructors" xsi:type="array">
+                <item name="bundle" xsi:type="string">Magento\Bundle\Model\Product\CopyConstructor\Bundle</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Bundle/etc/di.xml b/app/code/Magento/Bundle/etc/di.xml
index 4c3acec63c1..692e85d6d69 100644
--- a/app/code/Magento/Bundle/etc/di.xml
+++ b/app/code/Magento/Bundle/etc/di.xml
@@ -23,29 +23,29 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Bundle\Model\Source\Option\Type">
-        <param name="options">
-            <array>
-                <item key="select"><value>Drop-down</value></item>
-                <item key="radio"><value>Radio Buttons</value></item>
-                <item key="checkbox"><value>Checkbox</value></item>
-                <item key="multi"><value>Multiple Select</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="options" xsi:type="array">
+                <item name="select" xsi:type="string">Drop-down</item>
+                <item name="radio" xsi:type="string">Radio Buttons</item>
+                <item name="checkbox" xsi:type="string">Checkbox</item>
+                <item name="multi" xsi:type="string">Multiple Select</item>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Module\Updater\SetupFactory">
-        <param name="resourceTypes">
-            <array>
-                <item key="bundle_setup"><value>Magento\Catalog\Model\Resource\Setup</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="resourceTypes" xsi:type="array">
+                <item name="bundle_setup" xsi:type="string">Magento\Catalog\Model\Resource\Setup</item>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Catalog\Model\Product\CatalogPrice">
-        <param name="priceModelPool">
-            <array>
-                <item key="bundle"><value>Magento\Bundle\Model\Product\CatalogPrice</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="priceModelPool" xsi:type="array">
+                <item name="bundle" xsi:type="string">Magento\Bundle\Model\Product\CatalogPrice</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Bundle/sql/bundle_setup/install-1.6.0.0.php b/app/code/Magento/Bundle/sql/bundle_setup/install-1.6.0.0.php
index b6dddb5b0b4..a4cd81e0821 100644
--- a/app/code/Magento/Bundle/sql/bundle_setup/install-1.6.0.0.php
+++ b/app/code/Magento/Bundle/sql/bundle_setup/install-1.6.0.0.php
@@ -552,7 +552,6 @@ $installer->addAttribute(\Magento\Catalog\Model\Product::ENTITY, 'price_type', a
         'used_in_product_listing' => true,
         'unique'            => false,
         'apply_to'          => 'bundle',
-        'is_configurable'   => false
     ));
 
 $installer->addAttribute(\Magento\Catalog\Model\Product::ENTITY, 'sku_type', array(
@@ -574,7 +573,6 @@ $installer->addAttribute(\Magento\Catalog\Model\Product::ENTITY, 'sku_type', arr
         'visible_on_front'  => false,
         'unique'            => false,
         'apply_to'          => 'bundle',
-        'is_configurable'   => false
     ));
 
 $installer->addAttribute(\Magento\Catalog\Model\Product::ENTITY, 'weight_type', array(
@@ -597,7 +595,6 @@ $installer->addAttribute(\Magento\Catalog\Model\Product::ENTITY, 'weight_type',
         'used_in_product_listing' => true,
         'unique'            => false,
         'apply_to'          => 'bundle',
-        'is_configurable'   => false
     ));
 
 $installer->addAttribute(\Magento\Catalog\Model\Product::ENTITY, 'price_view', array(
@@ -621,7 +618,6 @@ $installer->addAttribute(\Magento\Catalog\Model\Product::ENTITY, 'price_view', a
         'used_in_product_listing' => true,
         'unique'            => false,
         'apply_to'          => 'bundle',
-        'is_configurable'   => false
     ));
 
 $installer->addAttribute(\Magento\Catalog\Model\Product::ENTITY, 'shipment_type', array(
@@ -644,7 +640,6 @@ $installer->addAttribute(\Magento\Catalog\Model\Product::ENTITY, 'shipment_type'
         'used_in_product_listing' => true,
         'unique'            => false,
         'apply_to'          => 'bundle',
-        'is_configurable'   => false
     ));
 
 $installer->endSetup();
diff --git a/app/code/Magento/CatalogInventory/view/frontend/layout/catalog_product_view_type_configurable.xml b/app/code/Magento/Bundle/view/adminhtml/layout/catalog_product_new.xml
similarity index 85%
rename from app/code/Magento/CatalogInventory/view/frontend/layout/catalog_product_view_type_configurable.xml
rename to app/code/Magento/Bundle/view/adminhtml/layout/catalog_product_new.xml
index dbbf4e12ada..0189dc5fd00 100644
--- a/app/code/Magento/CatalogInventory/view/frontend/layout/catalog_product_view_type_configurable.xml
+++ b/app/code/Magento/Bundle/view/adminhtml/layout/catalog_product_new.xml
@@ -24,7 +24,7 @@
  */
 -->
 <layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-    <referenceContainer name="product.info.configurable.extra">
-        <block class="Magento\CatalogInventory\Block\Stockqty\Type\Configurable" template="stockqty/composite.phtml"/>
+    <referenceContainer name="js">
+        <block class="Magento\View\Element\Template" template="Magento_Bundle::product/stock/disabler.phtml"/>
     </referenceContainer>
 </layout>
diff --git a/app/code/Magento/Bundle/view/adminhtml/product/stock/disabler.phtml b/app/code/Magento/Bundle/view/adminhtml/product/stock/disabler.phtml
new file mode 100644
index 00000000000..0d2880514dd
--- /dev/null
+++ b/app/code/Magento/Bundle/view/adminhtml/product/stock/disabler.phtml
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+?>
+<script type="text/javascript">
+jQuery(function($) {
+    $('#product_info_tabs_product-details_content').on('stockbeforedisable', function(e) {
+        if (e.productType === 'bundle') {
+            e.stopImmediatePropagation();
+            return false;
+        }
+    });
+ });
+</script>
diff --git a/app/code/Magento/Captcha/Block/Captcha/DefaultCaptcha.php b/app/code/Magento/Captcha/Block/Captcha/DefaultCaptcha.php
index 206f11730ac..99cae805bfd 100644
--- a/app/code/Magento/Captcha/Block/Captcha/DefaultCaptcha.php
+++ b/app/code/Magento/Captcha/Block/Captcha/DefaultCaptcha.php
@@ -23,18 +23,18 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Captcha\Block\Captcha;
 
 /**
  * Captcha block
  *
- * @category   Core
- * @package    Magento_Captcha
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Captcha\Block\Captcha;
-
 class DefaultCaptcha extends \Magento\View\Element\Template
 {
+    /**
+     * @var string
+     */
     protected $_template = 'default.phtml';
 
     /**
diff --git a/app/code/Magento/Captcha/Controller/Adminhtml/Refresh.php b/app/code/Magento/Captcha/Controller/Adminhtml/Refresh.php
index 5ef1936e3f4..2873d70d85a 100644
--- a/app/code/Magento/Captcha/Controller/Adminhtml/Refresh.php
+++ b/app/code/Magento/Captcha/Controller/Adminhtml/Refresh.php
@@ -23,23 +23,20 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Captcha\Controller\Adminhtml;
 
 /**
  * Captcha controller
  *
- * @category   Magento
- * @package    Magento_Captcha
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Captcha\Controller\Adminhtml;
-
 class Refresh extends \Magento\Backend\App\Action
 {
     /**
      * Refreshes captcha and returns JSON encoded URL to image (AJAX action)
      * Example: {'imgSrc': 'http://example.com/media/captcha/67842gh187612ngf8s.png'}
      *
-     * @return null
+     * @return void
      */
     public function refreshAction()
     {
diff --git a/app/code/Magento/Captcha/Controller/Refresh.php b/app/code/Magento/Captcha/Controller/Refresh.php
index 316e8a27ac3..a482d9a73a8 100644
--- a/app/code/Magento/Captcha/Controller/Refresh.php
+++ b/app/code/Magento/Captcha/Controller/Refresh.php
@@ -23,23 +23,20 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Captcha\Controller;
 
 /**
  * Captcha controller
  *
- * @category   Magento
- * @package    Magento_Core
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Captcha\Controller;
-
 class Refresh extends \Magento\App\Action\Action
 {
     /**
      * Refreshes captcha and returns JSON encoded URL to image (AJAX action)
      * Example: {'imgSrc': 'http://example.com/media/captcha/67842gh187612ngf8s.png'}
      *
-     * @return null
+     * @return void
      */
     public function indexAction()
     {
diff --git a/app/code/Magento/Captcha/Model/Cron.php b/app/code/Magento/Captcha/Model/Cron.php
index 4c225607f5a..8334534619a 100644
--- a/app/code/Magento/Captcha/Model/Cron.php
+++ b/app/code/Magento/Captcha/Model/Cron.php
@@ -23,7 +23,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Captcha\Model;
 
 /**
@@ -68,7 +67,7 @@ class Cron
      * @param \Magento\Core\Model\StoreManager $storeManager
      */
     public function __construct(
-        \Magento\Captcha\Model\Resource\LogFactory $resLogFactory,
+        Resource\LogFactory $resLogFactory,
         \Magento\Captcha\Helper\Data $helper,
         \Magento\Captcha\Helper\Adminhtml\Data $adminHelper,
         \Magento\App\Filesystem $filesystem,
@@ -112,7 +111,7 @@ class Cron
      * @param \Magento\Captcha\Helper\Data $helper
      * @param \Magento\Core\Model\Website|null $website
      * @param \Magento\Core\Model\Store|null $store
-     * @return \Magento\Captcha\Model\Observer
+     * @return void
      */
     protected function _deleteExpiredImagesForWebsite(
         \Magento\Captcha\Helper\Data $helper,
diff --git a/app/code/Magento/Captcha/Model/DefaultModel.php b/app/code/Magento/Captcha/Model/DefaultModel.php
index 50b53a7f10a..a436a270da6 100644
--- a/app/code/Magento/Captcha/Model/DefaultModel.php
+++ b/app/code/Magento/Captcha/Model/DefaultModel.php
@@ -23,16 +23,13 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Captcha\Model;
 
 /**
  * Implementation of \Zend_Captcha
  *
- * @category   Magento
- * @package    Magento_Captcha
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Captcha\Model;
-
 class DefaultModel extends \Zend_Captcha_Image implements \Magento\Captcha\Model\ModelInterface
 {
     /**
@@ -154,7 +151,7 @@ class DefaultModel extends \Zend_Captcha_Image implements \Magento\Captcha\Model
     /**
      * Check if CAPTCHA has to be shown to logged in user on this form
      *
-     * @return boolean
+     * @return bool
      */
     public function isShownToLoggedInUser()
     {
@@ -168,7 +165,7 @@ class DefaultModel extends \Zend_Captcha_Image implements \Magento\Captcha\Model
     }
 
     /**
-     * Check is overlimit attempts
+     * Check is over limit attempts
      *
      * @param string $login
      * @return bool
@@ -344,10 +341,10 @@ class DefaultModel extends \Zend_Captcha_Image implements \Magento\Captcha\Model
     }
 
     /**
-     * log Attempt
+     * Log attempt
      *
      * @param string $login
-     * @return \Magento\Captcha\Model\DefaultModel
+     * @return $this
      */
     public function logAttempt($login)
     {
@@ -479,7 +476,7 @@ class DefaultModel extends \Zend_Captcha_Image implements \Magento\Captcha\Model
      * Set captcha word
      *
      * @param  string $word
-     * @return \Zend_Captcha_Word
+     * @return $this
      */
     protected function _setWord($word)
     {
@@ -497,7 +494,7 @@ class DefaultModel extends \Zend_Captcha_Image implements \Magento\Captcha\Model
     /**
      * Set captcha word
      *
-     * @return \Magento\Captcha\Model\DefaultModel
+     * @return $this
      */
     protected function _clearWord()
     {
@@ -520,6 +517,8 @@ class DefaultModel extends \Zend_Captcha_Image implements \Magento\Captcha\Model
     /**
      * Overlap of the parent method
      *
+     * @return void
+     *
      * Now deleting old captcha images make crontab script
      * @see \Magento\Captcha\Model\Observer::deleteExpiredImages
      */
diff --git a/app/code/Magento/Captcha/Model/ModelInterface.php b/app/code/Magento/Captcha/Model/ModelInterface.php
index 22bc42e8179..7de4bdfe539 100644
--- a/app/code/Magento/Captcha/Model/ModelInterface.php
+++ b/app/code/Magento/Captcha/Model/ModelInterface.php
@@ -40,13 +40,12 @@ interface ModelInterface
     /**
      * Checks whether word entered by user corresponds to the one generated by generate()
      *
-     * @abstract
      * @param string $word
      * @return bool
+     * @abstract
      */
     public function isCorrect($word);
 
-
     /**
      * Get Block Name
      * @return string
diff --git a/app/code/Magento/Captcha/Model/Observer.php b/app/code/Magento/Captcha/Model/Observer.php
index 1d4ae616c71..f5355fa4906 100644
--- a/app/code/Magento/Captcha/Model/Observer.php
+++ b/app/code/Magento/Captcha/Model/Observer.php
@@ -23,16 +23,13 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Captcha\Model;
 
 /**
  * Captcha Observer
  *
- * @category    Magento
- * @package     Magento_Captcha
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Captcha\Model;
-
 class Observer
 {
     /**
@@ -114,7 +111,7 @@ class Observer
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
-        \Magento\Captcha\Model\Resource\LogFactory $resLogFactory,
+        Resource\LogFactory $resLogFactory,
         \Magento\Session\SessionManagerInterface $session,
         \Magento\Checkout\Model\Type\Onepage $typeOnepage,
         \Magento\Core\Helper\Data $coreData,
@@ -143,7 +140,7 @@ class Observer
      * Check Captcha On Forgot Password Page
      *
      * @param \Magento\Event\Observer $observer
-     * @return \Magento\Captcha\Model\Observer
+     * @return $this
      */
     public function checkForgotpassword($observer)
     {
@@ -165,6 +162,7 @@ class Observer
      * Check CAPTCHA on Contact Us page
      *
      * @param \Magento\Event\Observer $observer
+     * @return void
      */
     public function checkContactUsForm($observer)
     {
@@ -185,7 +183,7 @@ class Observer
      * Check Captcha On User Login Page
      *
      * @param \Magento\Event\Observer $observer
-     * @return \Magento\Captcha\Model\Observer
+     * @return $this
      */
     public function checkUserLogin($observer)
     {
@@ -213,7 +211,7 @@ class Observer
      * Check Captcha On Register User Page
      *
      * @param \Magento\Event\Observer $observer
-     * @return \Magento\Captcha\Model\Observer
+     * @return $this
      */
     public function checkUserCreate($observer)
     {
@@ -237,7 +235,7 @@ class Observer
      * Check Captcha On Checkout as Guest Page
      *
      * @param \Magento\Event\Observer $observer
-     * @return \Magento\Captcha\Model\Observer
+     * @return $this
      */
     public function checkGuestCheckout($observer)
     {
@@ -261,7 +259,7 @@ class Observer
      * Check Captcha On Checkout Register Page
      *
      * @param \Magento\Event\Observer $observer
-     * @return \Magento\Captcha\Model\Observer
+     * @return $this
      */
     public function checkRegisterCheckout($observer)
     {
@@ -286,7 +284,7 @@ class Observer
      *
      * @param \Magento\Event\Observer $observer
      * @throws \Magento\Backend\Model\Auth\Plugin\Exception
-     * @return \Magento\Captcha\Model\Observer
+     * @return $this
      */
     public function checkUserLoginBackend($observer)
     {
@@ -309,7 +307,7 @@ class Observer
      * Check Captcha On User Login Backend Page
      *
      * @param \Magento\Event\Observer $observer
-     * @return \Magento\Captcha\Model\Observer
+     * @return $this
      */
     public function checkUserForgotPasswordBackend($observer)
     {
diff --git a/app/code/Magento/Captcha/Model/Resource/Log.php b/app/code/Magento/Captcha/Model/Resource/Log.php
index 121bfb31763..8aebf8288e5 100644
--- a/app/code/Magento/Captcha/Model/Resource/Log.php
+++ b/app/code/Magento/Captcha/Model/Resource/Log.php
@@ -23,16 +23,13 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Captcha\Model\Resource;
 
 /**
  * Log Attempts resource
  *
- * @category    Magento
- * @package     Magento_Captcha
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Captcha\Model\Resource;
-
 class Log extends \Magento\Core\Model\Resource\Db\AbstractDb
 {
     /**
@@ -75,6 +72,7 @@ class Log extends \Magento\Core\Model\Resource\Db\AbstractDb
     /**
      * Define main table
      *
+     * @return void
      */
     protected function _construct()
     {
@@ -85,7 +83,7 @@ class Log extends \Magento\Core\Model\Resource\Db\AbstractDb
      * Save or Update count Attempts
      *
      * @param string|null $login
-     * @return \Magento\Captcha\Model\Resource\Log
+     * @return $this
      */
     public function logAttempt($login)
     {
@@ -117,7 +115,7 @@ class Log extends \Magento\Core\Model\Resource\Db\AbstractDb
      * Delete User attempts by login
      *
      * @param string $login
-     * @return \Magento\Captcha\Model\Resource\Log
+     * @return $this
      */
     public function deleteUserAttempts($login)
     {
diff --git a/app/code/Magento/Captcha/etc/adminhtml/di.xml b/app/code/Magento/Captcha/etc/adminhtml/di.xml
index bf190fa740f..215edc18766 100644
--- a/app/code/Magento/Captcha/etc/adminhtml/di.xml
+++ b/app/code/Magento/Captcha/etc/adminhtml/di.xml
@@ -23,19 +23,17 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <preference for="Magento\Captcha\Block\Captcha\DefaultCaptcha" type="Magento\Captcha\Block\Adminhtml\Captcha\DefaultCaptcha" />
     <type name="Magento\Captcha\Model\DefaultModel">
-        <param name="session">
-            <instance type="Magento\Backend\Model\Auth\Session" />
-        </param>
-        <param name="captchaData">
-            <instance type="Magento\Captcha\Helper\Adminhtml\Data" />
-        </param>
+        <arguments>
+            <argument name="session" xsi:type="object">Magento\Backend\Model\Auth\Session</argument>
+            <argument name="captchaData" xsi:type="object">Magento\Captcha\Helper\Adminhtml\Data</argument>
+        </arguments>
     </type>
     <type name="Magento\Captcha\Model\Observer">
-        <param name="session">
-            <instance type="Magento\Backend\Model\Session" />
-        </param>
+        <arguments>
+            <argument name="session" xsi:type="object">Magento\Backend\Model\Session</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Captcha/etc/di.xml b/app/code/Magento/Captcha/etc/di.xml
index a2a218ddc08..cf6f06e7c3b 100644
--- a/app/code/Magento/Captcha/etc/di.xml
+++ b/app/code/Magento/Captcha/etc/di.xml
@@ -23,15 +23,15 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Captcha\Model\DefaultModel">
-        <param name="session">
-            <instance type="Magento\Customer\Model\Session" />
-        </param>
+        <arguments>
+            <argument name="session" xsi:type="object">Magento\Customer\Model\Session</argument>
+        </arguments>
     </type>
     <type name="Magento\Captcha\Model\Observer">
-        <param name="session">
-            <instance type="Magento\Customer\Model\Session" />
-        </param>
+        <arguments>
+            <argument name="session" xsi:type="object">Magento\Customer\Model\Session</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit/Tab/Advanced.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit/Tab/Advanced.php
index 8dfeaa9215c..4433d308b7b 100644
--- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit/Tab/Advanced.php
+++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit/Tab/Advanced.php
@@ -197,8 +197,6 @@ class Advanced extends Generic
             }
         }
 
-        $yesnoSource = $this->_yesNo->toOptionArray();
-
         $scopes = array(
             \Magento\Catalog\Model\Resource\Eav\Attribute::SCOPE_STORE =>__('Store View'),
             \Magento\Catalog\Model\Resource\Eav\Attribute::SCOPE_WEBSITE =>__('Website'),
@@ -217,12 +215,7 @@ class Advanced extends Generic
             'values'=> $scopes
         ), 'attribute_code');
 
-
-        $fieldset->addField('is_configurable', 'select', array(
-            'name' => 'is_configurable',
-            'label' => __('Use To Create Configurable Product'),
-            'values' => $yesnoSource,
-        ));
+        $this->_eventManager->dispatch('product_attribute_form_build', array('form' => $form));
         $this->setForm($form);
         return $this;
     }
diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Set/Main.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Set/Main.php
index 079aeeeef88..f122f842058 100644
--- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Set/Main.php
+++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Set/Main.php
@@ -33,11 +33,10 @@
  */
 namespace Magento\Catalog\Block\Adminhtml\Product\Attribute\Set;
 
+use Magento\Catalog\Model\Entity\Product\Attribute\Group\AttributeMapperInterface;
+
 class Main extends \Magento\Backend\Block\Template
 {
-    /**
-     * @var string
-     */
     protected $_template = 'catalog/product/attribute/set/main.phtml';
 
     /**
@@ -70,24 +69,23 @@ class Main extends \Magento\Backend\Block\Template
     protected $_groupFactory;
 
     /**
-     * @var \Magento\Catalog\Model\Resource\Product\Type\Configurable\AttributeFactory
+     * @var \Magento\Json\EncoderInterface
      */
-    protected $_attributeFactory;
+    protected $_jsonEncoder;
 
     /**
-     * @var \Magento\Json\EncoderInterface
+     * @var \Magento\Catalog\Model\Entity\Product\Attribute\Group\AttributeMapperInterface
      */
-    protected $_jsonEncoder;
+    protected $attributeMapper;
 
     /**
      * @param \Magento\Backend\Block\Template\Context $context
      * @param \Magento\Json\EncoderInterface $jsonEncoder
      * @param \Magento\Eav\Model\Entity\TypeFactory $typeFactory
      * @param \Magento\Eav\Model\Entity\Attribute\GroupFactory $groupFactory
-     * @param \Magento\Catalog\Model\Resource\Product\Type\Configurable\AttributeFactory $attributeFactory
      * @param \Magento\Catalog\Model\Resource\Product\Attribute\CollectionFactory $collectionFactory
-     * @param \Magento\Catalog\Helper\Product $catalogProduct
      * @param \Magento\Core\Model\Registry $registry
+     * @param AttributeMapperInterface $attributeMapper
      * @param array $data
      */
     public function __construct(
@@ -95,19 +93,17 @@ class Main extends \Magento\Backend\Block\Template
         \Magento\Json\EncoderInterface $jsonEncoder,
         \Magento\Eav\Model\Entity\TypeFactory $typeFactory,
         \Magento\Eav\Model\Entity\Attribute\GroupFactory $groupFactory,
-        \Magento\Catalog\Model\Resource\Product\Type\Configurable\AttributeFactory $attributeFactory,
         \Magento\Catalog\Model\Resource\Product\Attribute\CollectionFactory $collectionFactory,
-        \Magento\Catalog\Helper\Product $catalogProduct,
         \Magento\Core\Model\Registry $registry,
+        AttributeMapperInterface $attributeMapper,
         array $data = array()
     ) {
         $this->_jsonEncoder = $jsonEncoder;
         $this->_typeFactory = $typeFactory;
         $this->_groupFactory = $groupFactory;
-        $this->_attributeFactory = $attributeFactory;
         $this->_collectionFactory = $collectionFactory;
         $this->_coreRegistry = $registry;
-        $this->_catalogProduct = $catalogProduct;
+        $this->attributeMapper = $attributeMapper;
         parent::__construct($context, $data);
     }
 
@@ -234,10 +230,6 @@ class Main extends \Magento\Backend\Block\Template
             ->setSortOrder()
             ->load();
 
-        $configurable = $this->_attributeFactory->create()->getUsedAttributes($setId);
-
-        $unassignableAttributes = $this->_catalogProduct->getUnassignableAttributes();
-
         /* @var $node \Magento\Eav\Model\Entity\Attribute\Group */
         foreach ($groups as $node) {
             $item = array();
@@ -255,24 +247,7 @@ class Main extends \Magento\Backend\Block\Template
             if ($nodeChildren->getSize() > 0) {
                 $item['children'] = array();
                 foreach ($nodeChildren->getItems() as $child) {
-                    /* @var $child \Magento\Eav\Model\Entity\Attribute */
-
-                    $isUnassignable = !in_array($child->getAttributeCode(), $unassignableAttributes);
-
-                    $attr = array(
-                        'text'              => $child->getAttributeCode(),
-                        'id'                => $child->getAttributeId(),
-                        'cls'               => $isUnassignable ? 'leaf' : 'system-leaf',
-                        'allowDrop'         => false,
-                        'allowDrag'         => true,
-                        'leaf'              => true,
-                        'is_user_defined'   => $child->getIsUserDefined(),
-                        'is_configurable'   => (int)in_array($child->getAttributeId(), $configurable),
-                        'is_unassignable'   => $isUnassignable,
-                        'entity_id'         => $child->getEntityAttributeId()
-                    );
-
-                    $item['children'][] = $attr;
+                    $item['children'][] = $this->attributeMapper->map($child);
                 }
             }
 
@@ -316,7 +291,6 @@ class Main extends \Magento\Backend\Block\Template
                 'allowDrag'         => true,
                 'leaf'              => true,
                 'is_user_defined'   => $child->getIsUserDefined(),
-                'is_configurable'   => false,
                 'entity_id'         => $child->getEntityId()
             );
 
diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Created.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Created.php
deleted file mode 100644
index d619c590abc..00000000000
--- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Created.php
+++ /dev/null
@@ -1,194 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Adminhtml
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-
-/**
- * Product after creation popup window
- *
- * @category   Magento
- * @package    Magento_Catalog
- * @author      Magento Core Team <core@magentocommerce.com>
- */
-namespace Magento\Catalog\Block\Adminhtml\Product;
-
-class Created extends \Magento\Backend\Block\Widget
-{
-    /**
-     * @var \Magento\Catalog\Model\Product
-     */
-    protected $_configurableProduct;
-
-    /**
-     * @var \Magento\Catalog\Model\Product
-     */
-    protected $_product;
-
-    /**
-     * @var string
-     */
-    protected $_template = 'catalog/product/created.phtml';
-
-    /**
-     * @var \Magento\Catalog\Model\ProductFactory
-     */
-    protected $_productFactory;
-
-    /**
-     * @var \Magento\Json\EncoderInterface
-     */
-    protected $_jsonEncoder;
-
-    /**
-     * @param \Magento\Backend\Block\Template\Context $context
-     * @param \Magento\Json\EncoderInterface $jsonEncoder
-     * @param \Magento\Catalog\Model\ProductFactory $productFactory
-     * @param array $data
-     */
-    public function __construct(
-        \Magento\Backend\Block\Template\Context $context,
-        \Magento\Json\EncoderInterface $jsonEncoder,
-        \Magento\Catalog\Model\ProductFactory $productFactory,
-        array $data = array()
-    ) {
-        $this->_jsonEncoder = $jsonEncoder;
-        $this->_productFactory = $productFactory;
-        parent::__construct($context, $data);
-    }
-
-    /**
-     * @return void
-     */
-    protected function _prepareLayout()
-    {
-        $this->addChild('close_button', 'Magento\Backend\Block\Widget\Button', array(
-            'label'   => __('Close Window'),
-            'onclick' => 'addProduct(true)'
-        ));
-    }
-
-    /**
-     * @return string
-     */
-    public function getCloseButtonHtml()
-    {
-        return $this->getChildHtml('close_button');
-    }
-
-    /**
-     * @return int
-     */
-    public function getProductId()
-    {
-        return (int) $this->getRequest()->getParam('id');
-    }
-
-    /**
-     * Identifies edit mode of popup
-     *
-     * @return boolean
-     */
-    public function isEdit()
-    {
-        return (bool)$this->getRequest()->getParam('edit');
-    }
-
-    /**
-     * Retrieve serialized json with configurable attributes values of simple
-     *
-     * @return string
-     */
-    public function getAttributesJson()
-    {
-        $result = array();
-        foreach ($this->getAttributes() as $attribute) {
-            $value = $this->getProduct()->getAttributeText($attribute->getAttributeCode());
-
-            $result[] = array(
-                'label'         => $value,
-                'value_index'   => $this->getProduct()->getData($attribute->getAttributeCode()),
-                'attribute_id'  => $attribute->getId()
-            );
-        }
-
-        return $this->_jsonEncoder->encode($result);
-    }
-
-    /**
-     * Retrieve array of attributes
-     *
-     * @return array
-     */
-    public function getAttributes()
-    {
-        $configurableProduct = $this->getConfigurableProduct();
-        if ($configurableProduct->getId()) {
-            return $configurableProduct
-                ->getTypeInstance()
-                ->getUsedProductAttributes($configurableProduct);
-        }
-
-        $attributes = array();
-        $attributesIds = $this->getRequest()->getParam('required');
-        if ($attributesIds) {
-            $product = $this->getProduct();
-            $typeInstance = $product->getTypeInstance();
-            foreach (explode(',', $attributesIds) as $attributeId) {
-                $attribute = $typeInstance->getAttributeById($attributeId, $product);
-                if ($attribute) {
-                    $attributes[] = $attribute;
-                }
-            }
-        }
-        return $attributes;
-    }
-
-    /**
-     * Retrieve configurable product for created/edited simple
-     *
-     * @return \Magento\Catalog\Model\Product
-     */
-    public function getConfigurableProduct()
-    {
-        if ($this->_configurableProduct === null) {
-            $this->_configurableProduct = $this->_productFactory->create()->setStore(0)
-                ->load($this->getRequest()->getParam('product'));
-        }
-        return $this->_configurableProduct;
-    }
-
-    /**
-     * Retrieve product
-     *
-     * @return \Magento\Catalog\Model\Product
-     */
-    public function getProduct()
-    {
-        if ($this->_product === null) {
-            $this->_product = $this->_productFactory->create()->setStore(0)
-                ->load($this->getRequest()->getParam('id'));
-        }
-        return $this->_product;
-    }
-}
diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit.php
index 9b81ec717d7..7d7a3f7ba41 100644
--- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit.php
+++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit.php
@@ -188,14 +188,6 @@ class Edit extends \Magento\Backend\Block\Widget
         return $this->getChildHtml('delete_button');
     }
 
-    /**
-     * @return string
-     */
-    public function getDuplicateButtonHtml()
-    {
-        return $this->getChildHtml('duplicate_button');
-    }
-
     /**
      * Get Save Split Button html
      *
@@ -288,22 +280,6 @@ class Edit extends \Magento\Backend\Block\Widget
         return '';
     }
 
-    /**
-     * @return bool
-     */
-    public function getIsConfigured()
-    {
-        $result = true;
-
-        $product = $this->getProduct();
-        if ($product->isConfigurable()) {
-            $superAttributes = $product->getTypeInstance()->getUsedProductAttributeIds($product);
-            $result = !empty($superAttributes);
-        }
-
-        return $result;
-    }
-
     /**
      * @return string
      */
diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Crosssell.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Crosssell.php
index ed612c80dd0..543b13dc40b 100644
--- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Crosssell.php
+++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Crosssell.php
@@ -67,7 +67,7 @@ class Crosssell extends Extended
     protected $_type;
 
     /**
-     * @var \Magento\Catalog\Model\Product\Status
+     * @var \Magento\Catalog\Model\Product\Attribute\Source\Status
      */
     protected $_status;
 
@@ -83,7 +83,7 @@ class Crosssell extends Extended
      * @param \Magento\Eav\Model\Resource\Entity\Attribute\Set\CollectionFactory $setsFactory
      * @param \Magento\Catalog\Model\ProductFactory $productFactory
      * @param \Magento\Catalog\Model\Product\Type $type
-     * @param \Magento\Catalog\Model\Product\Status $status
+     * @param \Magento\Catalog\Model\Product\Attribute\Source\Status $status
      * @param \Magento\Catalog\Model\Product\Visibility $visibility
      * @param \Magento\Core\Model\Registry $coreRegistry
      * @param array $data
@@ -97,7 +97,7 @@ class Crosssell extends Extended
         \Magento\Eav\Model\Resource\Entity\Attribute\Set\CollectionFactory $setsFactory,
         \Magento\Catalog\Model\ProductFactory $productFactory,
         \Magento\Catalog\Model\Product\Type $type,
-        \Magento\Catalog\Model\Product\Status $status,
+        \Magento\Catalog\Model\Product\Attribute\Source\Status $status,
         \Magento\Catalog\Model\Product\Visibility $visibility,
         \Magento\Core\Model\Registry $coreRegistry,
         array $data = array()
diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Inventory.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Inventory.php
index 8b8b68f9c85..636587c2dca 100644
--- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Inventory.php
+++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Inventory.php
@@ -131,18 +131,6 @@ class Inventory extends \Magento\Backend\Block\Widget
         return $this->getProduct()->getStockItem();
     }
 
-    /**
-     * @return bool
-     */
-    public function isConfigurable()
-    {
-        return $this->getProduct()->isConfigurable();
-    }
-
-    /**
-     * @param string $field
-     * @return string|null
-     */
     public function getFieldValue($field)
     {
         if ($this->getStockItem()) {
diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Related.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Related.php
index adb8d53dc40..1d46c98fcd0 100644
--- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Related.php
+++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Related.php
@@ -66,7 +66,7 @@ class Related extends Extended
     protected $_type;
 
     /**
-     * @var \Magento\Catalog\Model\Product\Status
+     * @var \Magento\Catalog\Model\Product\Attribute\Source\Status
      */
     protected $_status;
 
@@ -82,7 +82,7 @@ class Related extends Extended
      * @param \Magento\Eav\Model\Resource\Entity\Attribute\Set\CollectionFactory $setsFactory
      * @param \Magento\Catalog\Model\ProductFactory $productFactory
      * @param \Magento\Catalog\Model\Product\Type $type
-     * @param \Magento\Catalog\Model\Product\Status $status
+     * @param \Magento\Catalog\Model\Product\Attribute\Source\Status $status
      * @param \Magento\Catalog\Model\Product\Visibility $visibility
      * @param \Magento\Core\Model\Registry $coreRegistry
      * @param array $data
@@ -96,7 +96,7 @@ class Related extends Extended
         \Magento\Eav\Model\Resource\Entity\Attribute\Set\CollectionFactory $setsFactory,
         \Magento\Catalog\Model\ProductFactory $productFactory,
         \Magento\Catalog\Model\Product\Type $type,
-        \Magento\Catalog\Model\Product\Status $status,
+        \Magento\Catalog\Model\Product\Attribute\Source\Status $status,
         \Magento\Catalog\Model\Product\Visibility $visibility,
         \Magento\Core\Model\Registry $coreRegistry,
         array $data = array()
diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Upsell.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Upsell.php
index 91a4c1eee0c..c54b896284d 100644
--- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Upsell.php
+++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Upsell.php
@@ -63,7 +63,7 @@ class Upsell extends \Magento\Backend\Block\Widget\Grid\Extended
     protected $_type;
 
     /**
-     * @var \Magento\Catalog\Model\Product\Status
+     * @var \Magento\Catalog\Model\Product\Attribute\Source\Status
      */
     protected $_status;
 
@@ -79,7 +79,7 @@ class Upsell extends \Magento\Backend\Block\Widget\Grid\Extended
      * @param \Magento\Eav\Model\Resource\Entity\Attribute\Set\CollectionFactory $setsFactory
      * @param \Magento\Catalog\Model\ProductFactory $productFactory
      * @param \Magento\Catalog\Model\Product\Type $type
-     * @param \Magento\Catalog\Model\Product\Status $status
+     * @param \Magento\Catalog\Model\Product\Attribute\Source\Status $status
      * @param \Magento\Catalog\Model\Product\Visibility $visibility
      * @param \Magento\Core\Model\Registry $coreRegistry
      * @param array $data
@@ -93,7 +93,7 @@ class Upsell extends \Magento\Backend\Block\Widget\Grid\Extended
         \Magento\Eav\Model\Resource\Entity\Attribute\Set\CollectionFactory $setsFactory,
         \Magento\Catalog\Model\ProductFactory $productFactory,
         \Magento\Catalog\Model\Product\Type $type,
-        \Magento\Catalog\Model\Product\Status $status,
+        \Magento\Catalog\Model\Product\Attribute\Source\Status $status,
         \Magento\Catalog\Model\Product\Visibility $visibility,
         \Magento\Core\Model\Registry $coreRegistry,
         array $data = array()
diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tabs.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tabs.php
index 8ad4947ffcf..f6324619bee 100644
--- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tabs.php
+++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tabs.php
@@ -208,7 +208,6 @@ class Tabs extends \Magento\Backend\Block\Widget\Tabs
 
             /**
              * Do not change this tab id
-             * @see \Magento\Catalog\Block\Adminhtml\Product\Edit\Tabs\Configurable
              * @see \Magento\Bundle\Block\Adminhtml\Catalog\Product\Edit\Tabs
              */
             if ($this->getChildBlock('customer_options')) {
diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Grid.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Grid.php
index 4018a54c346..235fa89f8ad 100644
--- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Grid.php
+++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Grid.php
@@ -58,7 +58,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
     protected $_type;
 
     /**
-     * @var \Magento\Catalog\Model\Product\Status
+     * @var \Magento\Catalog\Model\Product\Attribute\Source\Status
      */
     protected $_status;
 
@@ -79,7 +79,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
      * @param \Magento\Eav\Model\Resource\Entity\Attribute\Set\CollectionFactory $setsFactory
      * @param \Magento\Catalog\Model\ProductFactory $productFactory
      * @param \Magento\Catalog\Model\Product\Type $type
-     * @param \Magento\Catalog\Model\Product\Status $status
+     * @param \Magento\Catalog\Model\Product\Attribute\Source\Status $status
      * @param \Magento\Catalog\Model\Product\Visibility $visibility
      * @param \Magento\Catalog\Helper\Data $catalogData
      * @param array $data
@@ -93,7 +93,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
         \Magento\Eav\Model\Resource\Entity\Attribute\Set\CollectionFactory $setsFactory,
         \Magento\Catalog\Model\ProductFactory $productFactory,
         \Magento\Catalog\Model\Product\Type $type,
-        \Magento\Catalog\Model\Product\Status $status,
+        \Magento\Catalog\Model\Product\Attribute\Source\Status $status,
         \Magento\Catalog\Model\Product\Visibility $visibility,
         \Magento\Catalog\Helper\Data $catalogData,
         array $data = array()
diff --git a/app/code/Magento/Catalog/Block/Adminhtml/System/Config/Form/Field/Select/Flatproduct.php b/app/code/Magento/Catalog/Block/Adminhtml/System/Config/Form/Field/Select/Flatproduct.php
deleted file mode 100644
index 5ad34a477ec..00000000000
--- a/app/code/Magento/Catalog/Block/Adminhtml/System/Config/Form/Field/Select/Flatproduct.php
+++ /dev/null
@@ -1,75 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Catalog
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-
-
-/**
- * Catalog Config Field Select Flat Product Block
- *
- * @category   Magento
- * @package    Magento_Catalog
- * @author     Magento Core Team <core@magentocommerce.com>
- */
-namespace Magento\Catalog\Block\Adminhtml\System\Config\Form\Field\Select;
-
-use Magento\Backend\Block\System\Config\Form\Field;
-use Magento\Data\Form\Element\AbstractElement;
-
-class Flatproduct extends Field
-{
-    /**
-     * @var \Magento\Catalog\Helper\Product\Flat
-     */
-    protected $_flatProduct;
-
-    /**
-     * @param \Magento\Backend\Block\Template\Context $context
-     * @param \Magento\Catalog\Helper\Product\Flat $flatProduct
-     * @param array $data
-     */
-    public function __construct(
-        \Magento\Backend\Block\Template\Context $context,
-        \Magento\Catalog\Helper\Product\Flat $flatProduct,
-        array $data = array()
-    ) {
-        $this->_flatProduct = $flatProduct;
-        parent::__construct($context, $data);
-    }
-
-    /**
-     * Retrieve Element HTML
-     *
-     * @param AbstractElement $element
-     * @return string
-     */
-    protected function _getElementHtml(AbstractElement $element) {
-        if (!$this->_flatProduct->isBuilt()) {
-            $element->setDisabled(true)
-                ->setValue(0);
-        }
-        return parent::_getElementHtml($element);
-    }
-
-}
diff --git a/app/code/Magento/Catalog/Block/Product/View/Options.php b/app/code/Magento/Catalog/Block/Product/View/Options.php
index 83928d268d0..817d064fce8 100644
--- a/app/code/Magento/Catalog/Block/Product/View/Options.php
+++ b/app/code/Magento/Catalog/Block/Product/View/Options.php
@@ -85,7 +85,6 @@ class Options extends \Magento\View\Element\Template
      * @param \Magento\View\Element\Template\Context $context
      * @param \Magento\Core\Helper\Data $coreData
      * @param \Magento\Json\EncoderInterface $jsonEncoder
-     * @param Product $catalogProduct
      * @param \Magento\Tax\Helper\Data $taxData
      * @param \Magento\Catalog\Model\Product\Option $option
      * @param \Magento\Core\Model\Registry $registry
@@ -96,7 +95,6 @@ class Options extends \Magento\View\Element\Template
         \Magento\View\Element\Template\Context $context,
         \Magento\Core\Helper\Data $coreData,
         \Magento\Json\EncoderInterface $jsonEncoder,
-        Product $catalogProduct,
         \Magento\Tax\Helper\Data $taxData,
         \Magento\Catalog\Model\Product\Option $option,
         \Magento\Core\Model\Registry $registry,
@@ -105,7 +103,6 @@ class Options extends \Magento\View\Element\Template
     ) {
         $this->_coreData = $coreData;
         $this->_jsonEncoder = $jsonEncoder;
-        $this->_catalogProduct = $catalogProduct;
         $this->_registry = $registry;
         $this->_option = $option;
         $this->_taxData = $taxData;
@@ -117,6 +114,7 @@ class Options extends \Magento\View\Element\Template
      * Retrieve product object
      *
      * @return Product
+     * @throws \LogicExceptions
      */
     public function getProduct()
     {
@@ -124,7 +122,7 @@ class Options extends \Magento\View\Element\Template
             if ($this->_registry->registry('current_product')) {
                 $this->_product = $this->_registry->registry('current_product');
             } else {
-                $this->_product = $this->_catalogProduct;
+                throw new \LogicException('Product is not defined');
             }
         }
         return $this->_product;
diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product.php
index 8dc823c223d..029aab1ec91 100644
--- a/app/code/Magento/Catalog/Controller/Adminhtml/Product.php
+++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product.php
@@ -34,6 +34,7 @@
 namespace Magento\Catalog\Controller\Adminhtml;
 
 use Magento\Backend\App\Action;
+use Magento\Catalog\Model\Product\Validator;
 
 class Product extends \Magento\Backend\App\Action
 {
@@ -71,6 +72,21 @@ class Product extends \Magento\Backend\App\Action
      */
     protected $productCopier;
 
+    /**
+     * @var Product\Builder
+     */
+    protected $productBuilder;
+
+    /**
+     * @var \Magento\Catalog\Model\Product\TypeTransitionManager
+     */
+    protected $productTypeManager;
+
+    /**
+     * @var \Magento\Catalog\Model\Product\Validator
+     */
+    protected $productValidator;
+
     /**
      * @param Action\Context $context
      * @param \Magento\Core\Model\Registry $registry
@@ -78,6 +94,9 @@ class Product extends \Magento\Backend\App\Action
      * @param Product\Initialization\Helper $initializationHelper
      * @param Product\Initialization\StockDataFilter $stockFilter
      * @param \Magento\Catalog\Model\Product\Copier $productCopier
+     * @param Product\Builder $productBuilder
+     * @param Validator $productValidator
+     * @param \Magento\Catalog\Model\Product\TypeTransitionManager $productTypeManager
      */
     public function __construct(
         \Magento\Backend\App\Action\Context $context,
@@ -85,108 +104,22 @@ class Product extends \Magento\Backend\App\Action
         \Magento\Core\Filter\Date $dateFilter,
         \Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper $initializationHelper,
         \Magento\Catalog\Controller\Adminhtml\Product\Initialization\StockDataFilter $stockFilter,
-        \Magento\Catalog\Model\Product\Copier $productCopier
+        \Magento\Catalog\Model\Product\Copier $productCopier,
+        Product\Builder $productBuilder,
+        Validator $productValidator,
+        \Magento\Catalog\Model\Product\TypeTransitionManager $productTypeManager
     ) {
         $this->stockFilter = $stockFilter;
         $this->initializationHelper = $initializationHelper;
         $this->registry = $registry;
         $this->_dateFilter = $dateFilter;
         $this->productCopier = $productCopier;
+        $this->productBuilder = $productBuilder;
+        $this->productValidator = $productValidator;
+        $this->productTypeManager = $productTypeManager;
         parent::__construct($context);
     }
 
-    /**
-     * Initialize product from request parameters
-     *
-     * @return \Magento\Catalog\Model\Product
-     */
-    protected function _initProduct()
-    {
-        $this->_title->add(__('Products'));
-
-        $productId  = (int)$this->getRequest()->getParam('id');
-        /** @var $product \Magento\Catalog\Model\Product */
-        $product    = $this->_objectManager->create('Magento\Catalog\Model\Product')
-            ->setStoreId($this->getRequest()->getParam('store', 0));
-
-        $typeId = $this->getRequest()->getParam('type');
-        if (!$productId && $typeId) {
-            $product->setTypeId($typeId);
-        }
-
-        $product->setData('_edit_mode', true);
-        if ($productId) {
-            try {
-                $product->load($productId);
-            } catch (\Exception $e) {
-                $product->setTypeId(\Magento\Catalog\Model\Product\Type::DEFAULT_TYPE);
-                $this->_objectManager->get('Magento\Logger')->logException($e);
-            }
-        }
-
-        $setId = (int)$this->getRequest()->getParam('set');
-        if ($setId) {
-            $product->setAttributeSetId($setId);
-        }
-
-        if ($this->getRequest()->has('attributes')) {
-            $attributes = $this->getRequest()->getParam('attributes');
-            if (!empty($attributes)) {
-                $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_CONFIGURABLE);
-                $this->_objectManager->get('Magento\Catalog\Model\Product\Type\Configurable')
-                    ->setUsedProductAttributeIds($attributes, $product);
-            } else {
-                $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE);
-            }
-        }
-
-        // Required attributes of simple product for configurable creation
-        if ($this->getRequest()->getParam('popup')
-            && $requiredAttributes = $this->getRequest()->getParam('required')) {
-            $requiredAttributes = explode(",", $requiredAttributes);
-            foreach ($product->getAttributes() as $attribute) {
-                if (in_array($attribute->getId(), $requiredAttributes)) {
-                    $attribute->setIsRequired(1);
-                }
-            }
-        }
-
-        if ($this->getRequest()->getParam('popup')
-            && $this->getRequest()->getParam('product')
-            && !is_array($this->getRequest()->getParam('product'))
-            && $this->getRequest()->getParam('id', false) === false
-        ) {
-
-            $configProduct = $this->_objectManager->create('Magento\Catalog\Model\Product')
-                ->setStoreId(0)
-                ->load($this->getRequest()->getParam('product'))
-                ->setTypeId($this->getRequest()->getParam('type'));
-
-            /* @var $configProduct \Magento\Catalog\Model\Product */
-            $data = array();
-            foreach ($configProduct->getTypeInstance()->getEditableAttributes($configProduct) as $attribute) {
-                /* @var $attribute \Magento\Catalog\Model\Resource\Eav\Attribute */
-                if (!$attribute->getIsUnique()
-                    && $attribute->getFrontend()->getInputType() != 'gallery'
-                    && $attribute->getAttributeCode() != 'required_options'
-                    && $attribute->getAttributeCode() != 'has_options'
-                    && $attribute->getAttributeCode() != $configProduct->getIdFieldName()
-                ) {
-                    $data[$attribute->getAttributeCode()] = $configProduct->getData($attribute->getAttributeCode());
-                }
-            }
-            $product->addData($data)
-                ->setWebsiteIds($configProduct->getWebsiteIds());
-        }
-
-        $this->registry->register('product', $product);
-        $this->registry->register('current_product', $product);
-        $this->_objectManager->get('Magento\Cms\Model\Wysiwyg\Config')->setStoreId(
-            $this->getRequest()->getParam('store')
-        );
-        return $product;
-    }
-
     /**
      * Create serializer block for a grid
      *
@@ -246,8 +179,9 @@ class Product extends \Magento\Backend\App\Action
             $this->_forward('noroute');
             return;
         }
+        $this->_title->add(__('Products'));
 
-        $product = $this->_initProduct();
+        $product = $this->productBuilder->build($this->getRequest());
 
         $productData = $this->getRequest()->getPost('product');
         if ($productData) {
@@ -263,16 +197,10 @@ class Product extends \Magento\Backend\App\Action
         if ($this->getRequest()->getParam('popup')) {
             $this->_view->loadLayout('popup');
         } else {
-            $_additionalLayoutPart = '';
-            if ($product->getTypeId() == \Magento\Catalog\Model\Product\Type::TYPE_CONFIGURABLE
-                && !($product->getTypeInstance()->getUsedProductAttributeIds($product))
-            ) {
-                $_additionalLayoutPart = '_new';
-            }
             $this->_view->loadLayout(array(
                 'default',
                 strtolower($this->_request->getFullActionName()),
-                'catalog_product_' . $product->getTypeId() . $_additionalLayoutPart
+                'catalog_product_' . $product->getTypeId()
             ));
             $this->_setActiveMenu('Magento_Catalog::catalog_products');
         }
@@ -294,8 +222,9 @@ class Product extends \Magento\Backend\App\Action
      */
     public function editAction()
     {
+        $this->_title->add(__('Products'));
         $productId  = (int)$this->getRequest()->getParam('id');
-        $product = $this->_initProduct();
+        $product = $this->productBuilder->build($this->getRequest());
 
         if ($productId && !$product->getId()) {
             $this->messageManager->addError(
@@ -309,17 +238,10 @@ class Product extends \Magento\Backend\App\Action
 
         $this->_eventManager->dispatch('catalog_product_edit_action', array('product' => $product));
 
-        $additionalLayoutPart = '';
-        if ($product->getTypeId() == \Magento\Catalog\Model\Product\Type::TYPE_CONFIGURABLE
-           && !($product->getTypeInstance()->getUsedProductAttributeIds($product))
-        ) {
-            $additionalLayoutPart = '_new';
-        }
-
         $this->_view->loadLayout(array(
             'default',
             strtolower($this->_request->getFullActionName()),
-            'catalog_product_'.$product->getTypeId() . $additionalLayoutPart
+            'catalog_product_'.$product->getTypeId()
         ));
 
         $this->_setActiveMenu('Magento_Catalog::catalog_products');
@@ -393,7 +315,9 @@ class Product extends \Magento\Backend\App\Action
      */
     public function gridOnlyAction()
     {
-        $this->_initProduct();
+        $this->_title->add(__('Products'));
+
+        $this->productBuilder->build($this->getRequest());
         $this->_view->loadLayout();
 
         $block = $this->getRequest()->getParam('gridOnlyBlock');
@@ -406,69 +330,6 @@ class Product extends \Magento\Backend\App\Action
         );
     }
 
-    /**
-     * Generate product variations matrix
-     *
-     * @return void
-     */
-    public function generateVariationsAction()
-    {
-        $this->_saveAttributeOptions();
-        $this->initializationHelper->initialize($this->_initProduct());
-        $this->_view->loadLayout();
-        $this->_view->renderLayout();
-    }
-
-    /**
-     * Save attribute options just created by user
-     *
-     * @TODO Move this logic to configurable product type model
-     *   when full set of operations for attribute options during
-     *   product creation will be implemented: edit labels, remove, reorder.
-     * Currently only addition of options to end and removal of just added option is supported.
-     *
-     * @return void
-     */
-    protected function _saveAttributeOptions()
-    {
-        $productData = (array)$this->getRequest()->getParam('product');
-        if (!isset($productData['configurable_attributes_data'])) {
-            return;
-        }
-
-        foreach ($productData['configurable_attributes_data'] as &$attributeData) {
-            $values = array();
-            foreach ($attributeData['values'] as $valueId => $priceData) {
-                if (isset($priceData['label'])) {
-                    /* @var $attribute \Magento\Catalog\Model\Resource\Eav\Attribute */
-                    $attribute = $this->_objectManager->create('Magento\Catalog\Model\Resource\Eav\Attribute');
-                    $attribute->load($attributeData['attribute_id']);
-                    $optionsBefore = $attribute->getSource()->getAllOptions(false);
-
-                    $attribute->setOption(array(
-                        'value' => array('option_0' => array($priceData['label'])),
-                        'order' => array('option_0' => count($optionsBefore) + 1),
-                    ));
-                    $attribute->save();
-
-                    /* @var $attribute \Magento\Catalog\Model\Resource\Eav\Attribute */
-                    $attribute = $this->_objectManager->create('Magento\Catalog\Model\Resource\Eav\Attribute');
-                    $attribute->load($attributeData['attribute_id']);
-                    $optionsAfter = $attribute->getSource()->getAllOptions(false);
-
-                    $newOption = array_pop($optionsAfter);
-
-                    unset($priceData['label']);
-                    $valueId = $newOption['value'];
-                    $priceData['value_index'] = $valueId;
-                }
-                $values[$valueId] = $priceData;
-            }
-            $attributeData['values'] = $values;
-        }
-
-        $this->getRequest()->setParam('product', $productData);
-    }
 
     /**
      * Get categories fieldset block
@@ -477,7 +338,7 @@ class Product extends \Magento\Backend\App\Action
      */
     public function categoriesAction()
     {
-        $this->_initProduct();
+        $this->productBuilder->build($this->getRequest());
         $this->_view->loadLayout();
         $this->_view->renderLayout();
     }
@@ -489,7 +350,7 @@ class Product extends \Magento\Backend\App\Action
      */
     public function optionsAction()
     {
-        $this->_initProduct();
+        $this->productBuilder->build($this->getRequest());
         $this->_view->loadLayout();
         $this->_view->renderLayout();
     }
@@ -501,7 +362,7 @@ class Product extends \Magento\Backend\App\Action
      */
     public function relatedAction()
     {
-        $this->_initProduct();
+        $this->productBuilder->build($this->getRequest());
         $this->_view->loadLayout();
         $this->_view->getLayout()->getBlock('catalog.product.edit.tab.related')
             ->setProductsRelated($this->getRequest()->getPost('products_related', null));
@@ -515,7 +376,7 @@ class Product extends \Magento\Backend\App\Action
      */
     public function upsellAction()
     {
-        $this->_initProduct();
+        $this->productBuilder->build($this->getRequest());
         $this->_view->loadLayout();
         $this->_view->getLayout()->getBlock('catalog.product.edit.tab.upsell')
             ->setProductsUpsell($this->getRequest()->getPost('products_upsell', null));
@@ -529,7 +390,7 @@ class Product extends \Magento\Backend\App\Action
      */
     public function crosssellAction()
     {
-        $this->_initProduct();
+        $this->productBuilder->build($this->getRequest());
         $this->_view->loadLayout();
         $this->_view->getLayout()->getBlock('catalog.product.edit.tab.crosssell')
             ->setProductsCrossSell($this->getRequest()->getPost('products_crosssell', null));
@@ -543,7 +404,7 @@ class Product extends \Magento\Backend\App\Action
      */
     public function relatedGridAction()
     {
-        $this->_initProduct();
+        $this->productBuilder->build($this->getRequest());
         $this->_view->loadLayout();
         $this->_view->getLayout()->getBlock('catalog.product.edit.tab.related')
             ->setProductsRelated($this->getRequest()->getPost('products_related', null));
@@ -557,7 +418,7 @@ class Product extends \Magento\Backend\App\Action
      */
     public function upsellGridAction()
     {
-        $this->_initProduct();
+        $this->productBuilder->build($this->getRequest());
         $this->_view->loadLayout();
         $this->_view->getLayout()->getBlock('catalog.product.edit.tab.upsell')
             ->setProductsRelated($this->getRequest()->getPost('products_upsell', null));
@@ -571,7 +432,7 @@ class Product extends \Magento\Backend\App\Action
      */
     public function crosssellGridAction()
     {
-        $this->_initProduct();
+        $this->productBuilder->build($this->getRequest());
         $this->_view->loadLayout();
         $this->_view->getLayout()->getBlock('catalog.product.edit.tab.crosssell')
             ->setProductsRelated($this->getRequest()->getPost('products_crosssell', null));
@@ -585,26 +446,14 @@ class Product extends \Magento\Backend\App\Action
      */
     public function reviewsAction()
     {
-        $this->_initProduct();
+        $product = $this->productBuilder->build($this->getRequest());
         $this->_view->loadLayout();
         $this->_view->getLayout()->getBlock('admin.product.reviews')
-            ->setProductId($this->registry->registry('product')->getId())
+            ->setProductId($product->getId())
             ->setUseAjax(true);
         $this->_view->renderLayout();
     }
 
-    /**
-     * Get super config grid
-     *
-     * @return void
-     */
-    public function superConfigAction()
-    {
-        $this->_initProduct();
-        $this->_view->loadLayout(false);
-        $this->_view->renderLayout();
-    }
-
     /**
      * Validate product
      *
@@ -663,16 +512,7 @@ class Product extends \Magento\Backend\App\Action
             $resource->getAttribute('custom_design_from')
                 ->setMaxValue($product->getCustomDesignTo());
 
-            $variationProducts = (array)$this->getRequest()->getPost('variations-matrix');
-            if ($variationProducts) {
-                $validationResult = $this->_validateProductVariations($product, $variationProducts);
-                if (!empty($validationResult)) {
-                    $response->setError(true)
-                        ->setMessage(__('Some product variations fields are not valid.'))
-                        ->setAttributes($validationResult);
-                }
-            }
-            $product->validate();
+            $this->productValidator->validate($product, $this->getRequest(), $response);
         } catch (\Magento\Eav\Model\Entity\Attribute\Exception $e) {
             $response->setError(true);
             $response->setAttribute($e->getAttributeCode());
@@ -690,50 +530,6 @@ class Product extends \Magento\Backend\App\Action
         $this->getResponse()->setBody($response->toJson());
     }
 
-    /**
-     * Product variations attributes validation
-     *
-     * @param \Magento\Catalog\Model\Product $parentProduct
-     * @param array $products
-     * @return array
-     */
-    protected function _validateProductVariations($parentProduct, array $products)
-    {
-        $this->_eventManager->dispatch(
-            'catalog_product_validate_variations_before',
-            array('product' => $parentProduct, 'variations' => $products)
-        );
-        $validationResult = array();
-        foreach ($products as $productData) {
-            /** @var \Magento\Catalog\Model\Product $product */
-            $product = $this->_objectManager->create('Magento\Catalog\Model\Product');
-            $product->setData('_edit_mode', true);
-            $storeId = $this->getRequest()->getParam('store');
-            if ($storeId) {
-                $product->setStoreId($storeId);
-            }
-            $product->setAttributeSetId($parentProduct->getAttributeSetId());
-
-            $product->addData($productData);
-            $product->setCollectExceptionMessages(true);
-            $configurableAttribute = $this->_objectManager->get('Magento\Core\Helper\Data')
-                ->jsonDecode($productData['configurable_attribute']);
-            $configurableAttribute = implode('-', $configurableAttribute);
-
-            $errorAttributes = $product->validate();
-            if (is_array($errorAttributes)) {
-                foreach ($errorAttributes as $attributeCode => $result) {
-                    if (is_string($result)) {
-                        $key = 'variations-matrix-' . $configurableAttribute . '-' . $attributeCode;
-                        $validationResult[$key] = $result;
-                    }
-                }
-            }
-        }
-
-        return $validationResult;
-    }
-
     /**
      * Save product action
      *
@@ -748,11 +544,8 @@ class Product extends \Magento\Backend\App\Action
 
         $data = $this->getRequest()->getPost();
         if ($data) {
-            $product = $this->initializationHelper->initialize($this->_initProduct());
-            $this->_eventManager->dispatch(
-                'catalog_product_transition_product_type',
-                array('product' => $product, 'request' => $this->getRequest())
-            );
+            $product = $this->initializationHelper->initialize($this->productBuilder->build($this->getRequest()));
+            $this->productTypeManager->processProduct($product);
 
             try {
                 if (isset($data['product'][$product->getIdFieldName()])) {
@@ -826,12 +619,6 @@ class Product extends \Magento\Backend\App\Action
                 'id'       => $productId,
                 '_current' => true
             ));
-        } elseif ($this->getRequest()->getParam('popup')) {
-            $this->_redirect('catalog/*/created', array(
-                '_current' => true,
-                'id'       => $productId,
-                'edit'     => $isEdit
-            ));
         } else {
             $this->_redirect('catalog/*/', array('store'=>$storeId));
         }
@@ -844,7 +631,7 @@ class Product extends \Magento\Backend\App\Action
      */
     public function duplicateAction()
     {
-        $product = $this->_initProduct();
+        $product = $this->productBuilder->build($this->getRequest());
         try {
             $newProduct = $this->productCopier->copy($product);
             $this->messageManager->addSuccess(__('You duplicated the product.'));
@@ -878,34 +665,6 @@ class Product extends \Magento\Backend\App\Action
         $this->_view->renderLayout();
     }
 
-    /**
-     * @return void
-     */
-    public function addAttributeAction()
-    {
-        $this->_view->loadLayout('popup');
-        $this->_initProduct();
-        $this->_addContent(
-            $this->_view->getLayout()->createBlock('Magento\Catalog\Block\Adminhtml\Product\Attribute\NewAttribute\Product\Created')
-        );
-        $this->_view->renderLayout();
-    }
-
-    /**
-     * @return void
-     */
-    public function createdAction()
-    {
-        $this->_view->loadLayout('popup');
-        $this->_addContent(
-            $this->_view->getLayout()->createBlock('Magento\Catalog\Block\Adminhtml\Product\Created')
-        );
-        $this->_view->renderLayout();
-    }
-
-    /**
-     * @return void
-     */
     public function massDeleteAction()
     {
         $productIds = $this->getRequest()->getParam('product');
@@ -970,7 +729,7 @@ class Product extends \Magento\Backend\App\Action
      */
     public function _validateMassStatus(array $productIds, $status)
     {
-        if ($status == \Magento\Catalog\Model\Product\Status::STATUS_ENABLED) {
+        if ($status == \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED) {
             if (!$this->_objectManager->create('Magento\Catalog\Model\Product')->isProductsHasSku($productIds)) {
                 throw new \Magento\Core\Exception(
                     __('Please make sure to define SKU values for all processed products.')
@@ -1039,7 +798,7 @@ class Product extends \Magento\Backend\App\Action
      */
     public function suggestProductTemplatesAction()
     {
-        $this->_initProduct();
+        $this->productBuilder->build($this->getRequest());
         $this->getResponse()->setBody($this->_objectManager->get('Magento\Core\Helper\Data')->jsonEncode(
             $this->_view->getLayout()->createBlock('Magento\Catalog\Block\Product\TemplateSelector')
                 ->getSuggestedTemplates($this->getRequest()->getParam('label_part'))
diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Action/Attribute.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Action/Attribute.php
index dec4a3b2242..e2a20429b53 100644
--- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Action/Attribute.php
+++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Action/Attribute.php
@@ -36,16 +36,24 @@ use Magento\Backend\App\Action;
  */
 class Attribute extends Action
 {
+    /**
+     * @var \Magento\Catalog\Model\Indexer\Product\Flat\Processor
+     */
+    protected $_productFlatIndexerProcessor;
+
     /**
      * @param Action\Context $context
      * @param \Magento\Catalog\Helper\Product\Edit\Action\Attribute $helper
+     * @param \Magento\Catalog\Model\Indexer\Product\Flat\Processor $productFlatIndexerProcessor
      */
     public function __construct(
         Action\Context $context,
-        \Magento\Catalog\Helper\Product\Edit\Action\Attribute $helper
+        \Magento\Catalog\Helper\Product\Edit\Action\Attribute $helper,
+        \Magento\Catalog\Model\Indexer\Product\Flat\Processor $productFlatIndexerProcessor
     ) {
         parent::__construct($context);
         $this->_helper = $helper;
+        $this->_productFlatIndexerProcessor = $productFlatIndexerProcessor;
     }
 
     /**
@@ -185,11 +193,12 @@ class Attribute extends Action
             $this->messageManager->addSuccess(
                 __('A total of %1 record(s) were updated.', count($this->_helper->getProductIds()))
             );
-        }
-        catch (\Magento\Core\Exception $e) {
+
+            $this->_productFlatIndexerProcessor->reindexList($this->_helper->getProductIds());
+
+        } catch (\Magento\Core\Exception $e) {
             $this->messageManager->addError($e->getMessage());
-        }
-        catch (\Exception $e) {
+        } catch (\Exception $e) {
             $this->messageManager->addException(
                 $e,
                 __('Something went wrong while updating the product(s) attributes.')
diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute.php
index cf5da02a11f..a0d8791434b 100644
--- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute.php
+++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute.php
@@ -362,7 +362,6 @@ class Attribute extends \Magento\Backend\App\Action
             }
 
             $data += array(
-                'is_configurable' => 0,
                 'is_filterable' => 0,
                 'is_filterable_in_search' => 0,
                 'apply_to' => array(),
@@ -475,19 +474,6 @@ class Attribute extends \Magento\Backend\App\Action
         $this->_redirect('catalog/*/');
     }
 
-    /**
-     * Search for attributes by part of attribute's label in admin store
-     *
-     * @return void
-     */
-    public function suggestConfigurableAttributesAction()
-    {
-        $this->getResponse()->setBody($this->_objectManager->get('Magento\Core\Helper\Data')->jsonEncode(
-            $this->_view->getLayout()->createBlock('Magento\Catalog\Block\Product\Configurable\AttributeSelector')
-                ->getSuggestedAttributes($this->getRequest()->getParam('label_part'))
-        ));
-    }
-
     /**
      * ACL check
      *
diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Builder.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Builder.php
new file mode 100644
index 00000000000..4d6ce38aae0
--- /dev/null
+++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Builder.php
@@ -0,0 +1,111 @@
+<?php
+/**
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Catalog\Controller\Adminhtml\Product;
+
+use Magento\App\RequestInterface;
+use Magento\Catalog\Model\ProductFactory;
+use Magento\Cms\Model\Wysiwyg;
+use Magento\Core\Model\Registry;
+use Magento\Logger;
+
+class Builder
+{
+    /**
+     * @var \Magento\Catalog\Model\ProductFactory
+     */
+    protected $productFactory;
+
+    /**
+     * @var \Magento\Logger
+     */
+    protected $logger;
+
+    /**
+     * @var \Magento\Core\Model\Registry
+     */
+    protected $registry;
+
+    /**
+     * @var \Magento\Cms\Model\Wysiwyg\Config
+     */
+    protected $wysiwygConfig;
+
+    /**
+     * @param ProductFactory $productFactory
+     * @param Logger $logger
+     * @param Registry $registry
+     * @param Wysiwyg\Config $wysiwygConfig
+     */
+    public function __construct(
+        ProductFactory $productFactory,
+        Logger $logger,
+        Registry $registry,
+        Wysiwyg\Config $wysiwygConfig
+    ) {
+        $this->productFactory = $productFactory;
+        $this->logger = $logger;
+        $this->registry = $registry;
+        $this->wysiwygConfig = $wysiwygConfig;
+    }
+
+    /**
+     * Build product based on user request
+     *
+     * @param RequestInterface $request
+     * @return \Magento\Catalog\Model\Product
+     */
+    public function build(RequestInterface $request)
+    {
+        $productId  = (int)$request->getParam('id');
+        /** @var $product \Magento\Catalog\Model\Product */
+        $product    = $this->productFactory->create();
+        $product->setStoreId($request->getParam('store', 0));
+
+        $typeId = $request->getParam('type');
+        if (!$productId && $typeId) {
+            $product->setTypeId($typeId);
+        }
+
+        $product->setData('_edit_mode', true);
+        if ($productId) {
+            try {
+                $product->load($productId);
+            } catch (\Exception $e) {
+                $product->setTypeId(\Magento\Catalog\Model\Product\Type::DEFAULT_TYPE);
+                $this->logger->logException($e);
+            }
+        }
+
+        $setId = (int)$request->getParam('set');
+        if ($setId) {
+            $product->setAttributeSetId($setId);
+        }
+
+        $this->registry->register('product', $product);
+        $this->registry->register('current_product', $product);
+        $this->wysiwygConfig->setStoreId($request->getParam('store'));
+        return $product;
+    }
+} 
diff --git a/app/code/Magento/Core/Model/Layout/Factory.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper/HandlerFactory.php
similarity index 58%
rename from app/code/Magento/Core/Model/Layout/Factory.php
rename to app/code/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper/HandlerFactory.php
index 14d706ca382..54f9d7e8697 100644
--- a/app/code/Magento/Core/Model/Layout/Factory.php
+++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper/HandlerFactory.php
@@ -18,51 +18,50 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Core
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-namespace Magento\Core\Model\Layout;
 
-class Factory
-{
-    /**
-     * Default layout class name
-     */
-    const CLASS_NAME = 'Magento\Core\Model\Layout';
+namespace Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper;
 
+class HandlerFactory
+{
     /**
+     * Object manager
+     *
      * @var \Magento\ObjectManager
      */
-    protected $_objectManager;
+    protected $objectManager;
 
     /**
      * @param \Magento\ObjectManager $objectManager
      */
     public function __construct(\Magento\ObjectManager $objectManager)
     {
-        $this->_objectManager = $objectManager;
+        $this->objectManager = $objectManager;
     }
 
     /**
+     * Create handler instance
+     *
+     * @param string $instance
      * @param array $arguments
-     * @param string $className
-     * @return $this
+     * @return object
+     * @throws \InvalidArgumentException
      */
-    public function createLayout(array $arguments = array(), $className = self::CLASS_NAME)
+    public function create($instance, array $arguments = array())
     {
-        $configuration = array(
-            $className => array(
-                'parameters' => $arguments
-            )
-        );
-        if ($className != self::CLASS_NAME) {
-            $configuration['preferences'] = array(
-                self::CLASS_NAME => $className,
+
+        if (!is_subclass_of(
+            $instance,
+            '\Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper\HandlerInterface')
+        ) {
+            throw new \InvalidArgumentException(
+                $instance . ' does not implement '
+                 . 'Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper\HandlerInterface'
             );
         }
-        $this->_objectManager->configure($configuration);
-        return $this->_objectManager->get(self::CLASS_NAME);
+
+        return $this->objectManager->create($instance, $arguments);
     }
-}
+} 
diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper/HandlerInterface.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper/HandlerInterface.php
new file mode 100644
index 00000000000..a24295aa11e
--- /dev/null
+++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper/HandlerInterface.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper;
+
+interface HandlerInterface
+{
+    /**
+     * @param \Magento\Catalog\Model\Product $product
+     * @return void
+     */
+    public function handle(\Magento\Catalog\Model\Product $product);
+} 
diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper/Plugin/Handler/Composite.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper/Plugin/Handler/Composite.php
new file mode 100644
index 00000000000..df2184c0356
--- /dev/null
+++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper/Plugin/Handler/Composite.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper\Plugin\Handler;
+
+use Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper\HandlerFactory;
+use Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper\HandlerInterface;
+use Magento\Catalog\Model\Product;
+
+class Composite implements HandlerInterface
+{
+    /**
+     * Array of handler interface objects
+     *
+     * @var HandlerInterface[]
+     */
+    protected $handlers;
+
+    /**
+     * @param HandlerFactory $factory
+     * @param array $handlers
+     */
+    public function __construct(HandlerFactory $factory, array $handlers = array())
+    {
+        foreach ($handlers as $instance) {
+            $this->handlers[] = $factory->create($instance);
+        }
+    }
+
+    /**
+     * Process each of the handler objects
+     *
+     * @param Product $product
+     * @return void
+     */
+    public function handle(Product $product)
+    {
+        foreach ($this->handlers as $handler) {
+            $handler->handle($product);
+        }
+    }
+} 
diff --git a/app/code/Magento/Catalog/Helper/Flat/AbstractFlat.php b/app/code/Magento/Catalog/Helper/Flat/AbstractFlat.php
index ce50f456e36..7157dc49df4 100644
--- a/app/code/Magento/Catalog/Helper/Flat/AbstractFlat.php
+++ b/app/code/Magento/Catalog/Helper/Flat/AbstractFlat.php
@@ -49,21 +49,12 @@ abstract class AbstractFlat extends \Magento\App\Helper\AbstractHelper
      */
     protected $_process = null;
 
-    /**
-     * Check if Catalog Flat Data has been initialized
-     *
-     * @return bool
-     */
-    abstract public function isBuilt();
-
     /**
      * Check if Catalog Category Flat Data is enabled
      *
-     * @param mixed $deprecatedParam this parameter is deprecated and no longer in use
-     *
      * @return bool
      */
-    abstract public function isEnabled($deprecatedParam = false);
+    abstract public function isEnabled();
 
     /**
      * Process factory
diff --git a/app/code/Magento/Catalog/Helper/Product.php b/app/code/Magento/Catalog/Helper/Product.php
index b5c746b4822..3db04544e01 100644
--- a/app/code/Magento/Catalog/Helper/Product.php
+++ b/app/code/Magento/Catalog/Helper/Product.php
@@ -18,8 +18,6 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Catalog
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
@@ -602,16 +600,6 @@ class Product extends \Magento\Core\Helper\Url
             ->getValue(Product::XML_PATH_AUTO_GENERATE_MASK, 'default');
     }
 
-    /**
-     * Retrieve list of attributes that cannot be removed from attribute set
-     *
-     * @return array
-     */
-    public function getUnassignableAttributes()
-    {
-        return $this->_attributeConfig->getAttributeNames('unassignable');
-    }
-
     /**
      * Retrieve list of attributes that allowed for autogeneration
      *
diff --git a/app/code/Magento/Catalog/Helper/Product/Configuration.php b/app/code/Magento/Catalog/Helper/Product/Configuration.php
index 8083343d4c8..8e213a8a163 100644
--- a/app/code/Magento/Catalog/Helper/Product/Configuration.php
+++ b/app/code/Magento/Catalog/Helper/Product/Configuration.php
@@ -34,11 +34,6 @@ namespace Magento\Catalog\Helper\Product;
 class Configuration extends \Magento\App\Helper\AbstractHelper
     implements \Magento\Catalog\Helper\Product\Configuration\ConfigurationInterface
 {
-    /**
-     * @var \Magento\Catalog\Model\ProductTypes\ConfigInterface
-     */
-    protected $_config;
-
     /**
      * Filter manager
      *
@@ -65,19 +60,16 @@ class Configuration extends \Magento\App\Helper\AbstractHelper
      * @param \Magento\App\Helper\Context $context
      * @param \Magento\Catalog\Model\Product\OptionFactory $productOptionFactory
      * @param \Magento\Filter\FilterManager $filter
-     * @param \Magento\Catalog\Model\ProductTypes\ConfigInterface $config
      * @param \Magento\Stdlib\String $string
      */
     public function __construct(
         \Magento\App\Helper\Context $context,
         \Magento\Catalog\Model\Product\OptionFactory $productOptionFactory,
         \Magento\Filter\FilterManager $filter,
-        \Magento\Catalog\Model\ProductTypes\ConfigInterface $config,
         \Magento\Stdlib\String $string
     ) {
         $this->_productOptionFactory = $productOptionFactory;
         $this->filter = $filter;
-        $this->_config = $config;
         $this->string = $string;
         parent::__construct($context);
     }
@@ -138,25 +130,6 @@ class Configuration extends \Magento\App\Helper\AbstractHelper
         return $options;
     }
 
-    /**
-     * Retrieves configuration options for configurable product
-     *
-     * @param \Magento\Catalog\Model\Product\Configuration\Item\ItemInterface $item
-     * @return array
-     * @throws \Magento\Core\Exception
-     */
-    public function getConfigurableOptions(\Magento\Catalog\Model\Product\Configuration\Item\ItemInterface $item)
-    {
-        $product = $item->getProduct();
-        $typeId = $product->getTypeId();
-        if ($typeId != \Magento\Catalog\Model\Product\Type\Configurable::TYPE_CODE) {
-             throw new \Magento\Core\Exception(__('The product type to extract configurable options is incorrect.'));
-        }
-        $attributes = $product->getTypeInstance()
-            ->getSelectedAttributesInfo($product);
-        return array_merge($attributes, $this->getCustomOptions($item));
-    }
-
     /**
      * Retrieves product options list
      *
@@ -165,10 +138,6 @@ class Configuration extends \Magento\App\Helper\AbstractHelper
      */
     public function getOptions(\Magento\Catalog\Model\Product\Configuration\Item\ItemInterface $item)
     {
-        $typeId = $item->getProduct()->getTypeId();
-        if ($typeId == \Magento\Catalog\Model\Product\Type\Configurable::TYPE_CODE) {
-            return $this->getConfigurableOptions($item);
-        }
         return $this->getCustomOptions($item);
     }
 
@@ -258,14 +227,4 @@ class Configuration extends \Magento\App\Helper\AbstractHelper
 
         return $result;
     }
-
-    /**
-     * Get allowed product types for configurable product
-     *
-     * @return array
-     */
-    public function getConfigurableAllowedTypes()
-    {
-        return $this->_config->getComposableTypes();
-    }
 }
diff --git a/app/code/Magento/Catalog/Helper/Product/Flat.php b/app/code/Magento/Catalog/Helper/Product/Flat.php
index 331b260528f..6e4dace1fec 100644
--- a/app/code/Magento/Catalog/Helper/Product/Flat.php
+++ b/app/code/Magento/Catalog/Helper/Product/Flat.php
@@ -49,7 +49,7 @@ class Flat extends \Magento\Catalog\Helper\Flat\AbstractFlat
      * @var int
      */
     protected $_addChildData;
-    
+
     /**
      * Catalog Flat Product index process code
      */
@@ -78,13 +78,6 @@ class Flat extends \Magento\Catalog\Helper\Flat\AbstractFlat
      */
     protected $_isEnabled = array();
 
-    /**
-     * Catalog Product Flat Flag object
-     *
-     * @var \Magento\Catalog\Model\Product\Flat\Flag
-     */
-    protected $_flagObject;
-
     /**
      * Core store config
      *
@@ -96,7 +89,6 @@ class Flat extends \Magento\Catalog\Helper\Flat\AbstractFlat
      * @param \Magento\App\Helper\Context $context
      * @param \Magento\Index\Model\ProcessFactory $processFactory
      * @param \Magento\Core\Model\Store\Config $coreStoreConfig
-     * @param \Magento\Catalog\Model\Product\Flat\Flag $flatFlag
      * @param mixed $addFilterableAttrs
      * @param mixed $addChildData
      * @param bool $isAvailable
@@ -105,50 +97,26 @@ class Flat extends \Magento\Catalog\Helper\Flat\AbstractFlat
         \Magento\App\Helper\Context $context,
         \Magento\Index\Model\ProcessFactory $processFactory,
         \Magento\Core\Model\Store\Config $coreStoreConfig,
-        \Magento\Catalog\Model\Product\Flat\Flag $flatFlag,
-        $addFilterableAttrs,
-        $addChildData,
+        $addFilterableAttrs = 0,
+        $addChildData = 0,
         $isAvailable = true
     ) {
         $this->_coreStoreConfig = $coreStoreConfig;
         parent::__construct($context, $processFactory, $isAvailable);
-        $this->_flagObject = $flatFlag->loadSelf();
         $this->_addFilterableAttrs = intval($addFilterableAttrs);
         $this->_addChildData = intval($addChildData);
     }
 
-    /**
-     * Retrieve Catalog Product Flat Flag object
-     *
-     * @return \Magento\Catalog\Model\Product\Flat\Flag
-     */
-    public function getFlag()
-    {
-        return $this->_flagObject;
-    }
-
     /**
      * Check Catalog Product Flat functionality is enabled
      *
-     * @param int|string|null|\Magento\Core\Model\Store $store this parameter is deprecated and no longer in use
-     *
      * @return bool
      */
-    public function isEnabled($store = null)
+    public function isEnabled()
     {
         return $this->_coreStoreConfig->getConfigFlag(self::XML_PATH_USE_PRODUCT_FLAT);
     }
 
-    /**
-     * Check if Catalog Product Flat Data has been initialized
-     *
-     * @return bool
-     */
-    public function isBuilt()
-    {
-        return $this->getFlag()->getIsBuilt();
-    }
-
     /**
      * Is add filterable attributes to Flat table
      *
diff --git a/app/code/Magento/Catalog/Helper/Product/Flat/Indexer.php b/app/code/Magento/Catalog/Helper/Product/Flat/Indexer.php
new file mode 100644
index 00000000000..f1dc4ce1406
--- /dev/null
+++ b/app/code/Magento/Catalog/Helper/Product/Flat/Indexer.php
@@ -0,0 +1,490 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+/**
+ * Catalog Product Flat Indexer Helper
+ *
+ * @category   Magento
+ * @package    Magento_Catalog
+ */
+namespace Magento\Catalog\Helper\Product\Flat;
+
+class Indexer extends \Magento\App\Helper\AbstractHelper
+{
+    /**
+     * Path to list of attributes used for flat indexer
+     */
+    const XML_NODE_ATTRIBUTE_NODES  = 'global/catalog/product/flat/attribute_groups';
+
+    /**
+     * Size of ids batch for reindex
+     */
+    const BATCH_SIZE = 500;
+
+    /**
+     * @var \Magento\Catalog\Helper\Product\Flat
+     */
+    protected $_flatHelper;
+
+    /**
+     * Resource instance
+     *
+     * @var \Magento\App\Resource
+     */
+    protected $_resource;
+
+    /**
+     * @var array
+     */
+    protected $_columns;
+
+    /**
+     * List of indexes uses in flat product table
+     *
+     * @var null|array
+     */
+    protected $_indexes;
+
+    /**
+     * Retrieve catalog product flat columns array in old format (used before MMDB support)
+     *
+     * @return array
+     */
+    protected $_attributes;
+
+    /**
+     * Required system attributes for preload
+     *
+     * @var array
+     */
+    protected $_systemAttributes = array('status', 'required_options', 'tax_class_id', 'weight');
+
+    /**
+     * EAV Config instance
+     *
+     * @var \Magento\Eav\Model\Config
+     */
+    protected $_eavConfig;
+
+    /**
+     * @var \Magento\Catalog\Model\Attribute\Config
+     */
+    private $_attributeConfig;
+
+    /**
+     * @var array
+     */
+    protected $_attributeCodes;
+
+    /**
+     * @var int
+     */
+    protected $_entityTypeId;
+
+    /**
+     * @var \Magento\Catalog\Model\Resource\Config
+     */
+    protected $_catalogConfig;
+
+    /**
+     * @var array
+     */
+    protected $_flatAttributeGroups = array();
+
+    /**
+     * Config factory
+     *
+     * @var \Magento\Catalog\Model\Resource\ConfigFactory
+     */
+    protected $_configFactory;
+
+    /**
+     * @var \Magento\Eav\Model\Entity\AttributeFactory
+     */
+    protected $_attributeFactory;
+
+    /**
+     * @var \Magento\Core\Model\StoreManagerInterface
+     */
+    protected $_storeManager;
+
+    /**
+     * @param \Magento\App\Helper\Context $context
+     * @param \Magento\App\Resource $resource
+     * @param \Magento\Catalog\Helper\Product\Flat $flatHelper
+     * @param \Magento\Eav\Model\Config $eavConfig
+     * @param \Magento\Catalog\Model\Attribute\Config $attributeConfig
+     * @param \Magento\Catalog\Model\Resource\ConfigFactory $configFactory
+     * @param \Magento\Eav\Model\Entity\AttributeFactory $attributeFactory
+     * @param \Magento\Core\Model\StoreManagerInterface $storeManager
+     * @param array $flatAttributeGroups
+     */
+    public function __construct(
+        \Magento\App\Helper\Context $context,
+        \Magento\App\Resource $resource,
+        \Magento\Catalog\Helper\Product\Flat $flatHelper,
+        \Magento\Eav\Model\Config $eavConfig,
+        \Magento\Catalog\Model\Attribute\Config $attributeConfig,
+        \Magento\Catalog\Model\Resource\ConfigFactory $configFactory,
+        \Magento\Eav\Model\Entity\AttributeFactory $attributeFactory,
+        \Magento\Core\Model\StoreManagerInterface $storeManager,
+        $flatAttributeGroups = array()
+    ) {
+        $this->_configFactory = $configFactory;
+        $this->_flatHelper = $flatHelper;
+        $this->_resource = $resource;
+        $this->_eavConfig = $eavConfig;
+        $this->_attributeConfig = $attributeConfig;
+        $this->_attributeFactory = $attributeFactory;
+        $this->_flatAttributeGroups = $flatAttributeGroups;
+        $this->_storeManager = $storeManager;
+        parent::__construct($context);
+    }
+
+    /**
+     * Retrieve catalog product flat columns array in DDL format
+     *
+     * @return array
+     */
+    public function getFlatColumnsDdlDefinition()
+    {
+        $columns = array();
+        $columns['entity_id'] = array(
+            'type'      => \Magento\DB\Ddl\Table::TYPE_INTEGER,
+            'length'    => null,
+            'unsigned'  => true,
+            'nullable'  => false,
+            'default'   => false,
+            'primary'   => true,
+            'comment'   => 'Entity Id'
+        );
+        if ($this->_flatHelper->isAddChildData()) {
+            $columns['child_id'] = array(
+                'type'      => \Magento\DB\Ddl\Table::TYPE_INTEGER,
+                'length'    => null,
+                'unsigned'  => true,
+                'nullable'  => true,
+                'default'   => null,
+                'primary'   => true,
+                'comment'   => 'Child Id'
+            );
+            $columns['is_child'] = array(
+                'type'      => \Magento\DB\Ddl\Table::TYPE_SMALLINT,
+                'length'    => 1,
+                'unsigned'  => true,
+                'nullable'  => false,
+                'default'   => '0',
+                'comment'   => 'Checks If Entity Is Child'
+            );
+        }
+        $columns['attribute_set_id'] = array(
+            'type'      => \Magento\DB\Ddl\Table::TYPE_SMALLINT,
+            'length'    => 5,
+            'unsigned'  => true,
+            'nullable'  => false,
+            'default'   => '0',
+            'comment'   => 'Attribute Set Id'
+        );
+        $columns['type_id'] = array(
+            'type'      => \Magento\DB\Ddl\Table::TYPE_TEXT,
+            'length'    => 32,
+            'unsigned'  => false,
+            'nullable'  => false,
+            'default'   => \Magento\Catalog\Model\Product\Type::DEFAULT_TYPE,
+            'comment'   => 'Type Id'
+        );
+        return $columns;
+    }
+
+    /**
+     * Retrieve catalog product flat table columns array
+     *
+     * @return array
+     */
+    public function getFlatColumns()
+    {
+        if ($this->_columns === null) {
+            $this->_columns = $this->getFlatColumnsDdlDefinition();
+            foreach ($this->getAttributes() as $attribute) {
+                /** @var $attribute \Magento\Eav\Model\Entity\Attribute\AbstractAttribute */
+                $columns = $attribute
+                    ->setFlatAddFilterableAttributes($this->_flatHelper->isAddFilterableAttributes())
+                    ->setFlatAddChildData($this->_flatHelper->isAddChildData())
+                    ->getFlatColumns();
+                if ($columns !== null) {
+                    $this->_columns = array_merge($this->_columns, $columns);
+                }
+            }
+        }
+        return $this->_columns;
+    }
+
+    /**
+     * Retrieve entity type
+     *
+     * @return string
+     */
+    public function getEntityType()
+    {
+        return \Magento\Catalog\Model\Product::ENTITY;
+    }
+
+    /**
+     * Retrieve Catalog Entity Type Id
+     *
+     * @return int
+     */
+    public function getEntityTypeId()
+    {
+        if ($this->_entityTypeId === null) {
+            $this->_entityTypeId = $this->_configFactory->create()
+                ->getEntityTypeId();
+        }
+        return $this->_entityTypeId;
+    }
+
+    /**
+     * Retrieve attribute objects for flat
+     *
+     * @return array
+     */
+    public function getAttributes()
+    {
+        if ($this->_attributes === null) {
+            $this->_attributes = array();
+            $attributeCodes    = $this->getAttributeCodes();
+            $entity = $this->_eavConfig
+                ->getEntityType($this->getEntityType())
+                ->getEntity();
+
+            foreach ($attributeCodes as $attributeCode) {
+                $attribute = $this->_eavConfig
+                    ->getAttribute($this->getEntityType(), $attributeCode)
+                    ->setEntity($entity);
+                try {
+                    // check if exists source and backend model.
+                    // To prevent exception when some module was disabled
+                    $attribute->usesSource() && $attribute->getSource();
+                    $attribute->getBackend();
+                    $this->_attributes[$attributeCode] = $attribute;
+                } catch (\Exception $e) {
+                    $this->_logger->logException($e);
+                }
+            }
+        }
+        return $this->_attributes;
+    }
+
+    /**
+     * Retrieve attribute codes using for flat
+     *
+     * @return array
+     */
+    public function getAttributeCodes()
+    {
+        if ($this->_attributeCodes === null) {
+            $adapter = $this->_resource->getConnection('read');
+            $this->_attributeCodes = array();
+
+            foreach ($this->_flatAttributeGroups as $attributeGroupName) {
+                $attributes = $this->_attributeConfig->getAttributeNames($attributeGroupName);
+                $this->_systemAttributes = array_unique(array_merge($attributes, $this->_systemAttributes));
+            }
+
+            $bind = array(
+                'backend_type' => \Magento\Eav\Model\Entity\Attribute\AbstractAttribute::TYPE_STATIC,
+                'entity_type_id' => $this->getEntityTypeId()
+            );
+
+            $select = $adapter->select()
+                ->from(array('main_table' => $this->getTable('eav_attribute')))
+                ->join(
+                    array('additional_table' => $this->getTable('catalog_eav_attribute')),
+                    'additional_table.attribute_id = main_table.attribute_id'
+                )
+                ->where('main_table.entity_type_id = :entity_type_id');
+            $whereCondition = array(
+                'main_table.backend_type = :backend_type',
+                $adapter->quoteInto('additional_table.is_used_for_promo_rules = ?', 1),
+                $adapter->quoteInto('additional_table.used_in_product_listing = ?', 1),
+                $adapter->quoteInto('additional_table.used_for_sort_by = ?', 1),
+                $adapter->quoteInto('main_table.attribute_code IN(?)', $this->_systemAttributes)
+            );
+            if ($this->_flatHelper->isAddFilterableAttributes()) {
+                $whereCondition[] = $adapter->quoteInto('additional_table.is_filterable > ?', 0);
+            }
+
+            $select->where(implode(' OR ', $whereCondition));
+            $attributesData = $adapter->fetchAll($select, $bind);
+            $this->_eavConfig->importAttributesData($this->getEntityType(), $attributesData);
+
+            foreach ($attributesData as $data) {
+                $this->_attributeCodes[$data['attribute_id']] = $data['attribute_code'];
+            }
+            unset($attributesData);
+        }
+        return $this->_attributeCodes;
+    }
+
+    /**
+     * Retrieve catalog product flat table indexes array
+     *
+     * @return array
+     */
+    public function getFlatIndexes()
+    {
+        if ($this->_indexes === null) {
+            $this->_indexes = array();
+            if ($this->_flatHelper->isAddChildData()) {
+                $this->_indexes['PRIMARY'] = array(
+                    'type'   => \Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_PRIMARY,
+                    'fields' => array('entity_id', 'child_id')
+                );
+                $this->_indexes['IDX_CHILD'] = array(
+                    'type'   => \Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_INDEX,
+                    'fields' => array('child_id')
+                );
+                $this->_indexes['IDX_IS_CHILD'] = array(
+                    'type'   => \Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_INDEX,
+                    'fields' => array('entity_id', 'is_child')
+                );
+            } else {
+                $this->_indexes['PRIMARY'] = array(
+                    'type'   => \Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_PRIMARY,
+                    'fields' => array('entity_id')
+                );
+            }
+            $this->_indexes['IDX_TYPE_ID'] = array(
+                'type'   => \Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_INDEX,
+                'fields' => array('type_id')
+            );
+            $this->_indexes['IDX_ATTRIBUTE_SET'] = array(
+                'type'   => \Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_INDEX,
+                'fields' => array('attribute_set_id')
+            );
+
+            foreach ($this->getAttributes() as $attribute) {
+                /** @var $attribute \Magento\Eav\Model\Entity\Attribute */
+                $indexes = $attribute
+                    ->setFlatAddFilterableAttributes($this->_flatHelper->isAddFilterableAttributes())
+                    ->setFlatAddChildData($this->_flatHelper->isAddChildData())
+                    ->getFlatIndexes();
+                if ($indexes !== null) {
+                    $this->_indexes = array_merge($this->_indexes, $indexes);
+                }
+            }
+        }
+        return $this->_indexes;
+    }
+
+    /**
+     * Get table structure for temporary eav tables
+     *
+     * @param array $attributes
+     * @return array
+     */
+    public function getTablesStructure(array $attributes)
+    {
+        $eavAttributes   = array();
+        $flatColumnsList = $this->getFlatColumns();
+        /** @var $attribute \Magento\Catalog\Model\Resource\Eav\Attribute */
+        foreach ($attributes as $attribute) {
+            $eavTable = $attribute->getBackend()->getTable();
+            $attributeCode = $attribute->getAttributeCode();
+            if (isset($flatColumnsList[$attributeCode])) {
+                $eavAttributes[$eavTable][$attributeCode] = $attribute;
+            }
+        }
+        return $eavAttributes;
+    }
+
+    /**
+     * Returns table name
+     *
+     * @param string|array $name
+     * @return string
+     */
+    public function getTable($name)
+    {
+        return $this->_resource->getTableName($name);
+    }
+
+    /**
+     * Retrieve Catalog Product Flat Table name
+     *
+     * @param int $storeId
+     * @return string
+     */
+    public function getFlatTableName($storeId)
+    {
+        return sprintf('%s_%s', $this->getTable('catalog_product_flat'), $storeId);
+    }
+
+    /**
+     * Retrieve loaded attribute by code
+     *
+     * @param string $attributeCode
+     * @throws \Magento\Core\Exception
+     * @return \Magento\Eav\Model\Entity\Attribute
+     */
+    public function getAttribute($attributeCode)
+    {
+        $attributes = $this->getAttributes();
+        if (!isset($attributes[$attributeCode])) {
+            $attribute = $this->_attributeFactory->create();
+            $attribute->loadByCode($this->getEntityTypeId(), $attributeCode);
+            if (!$attribute->getId()) {
+                throw new \Magento\Core\Exception(__('Invalid attribute %1', $attributeCode));
+            }
+            $entity = $this->_eavConfig
+                ->getEntityType($this->getEntityType())
+                ->getEntity();
+            $attribute->setEntity($entity);
+            return $attribute;
+        }
+        return $attributes[$attributeCode];
+    }
+
+    /**
+     * Delete all product flat tables for not existing stores
+     */
+    public function deleteAbandonedStoreFlatTables()
+    {
+        $connection = $this->_resource->getConnection('write');
+        $existentTables = $connection->getTables($connection->getTableName('catalog_product_flat_%'));
+
+        $actualStoreTables = array();
+        foreach ($this->_storeManager->getStores() as $store) {
+            $actualStoreTables[] = $this->getFlatTableName($store->getId());
+        }
+
+        $tablesToDelete = array_diff($existentTables, $actualStoreTables);
+
+        foreach ($tablesToDelete as $table) {
+            $connection->dropTable($table);
+        }
+    }
+}
diff --git a/app/code/Magento/Core/Model/Layout/Argument/Updater.php b/app/code/Magento/Catalog/Model/Attribute/LockValidatorComposite.php
similarity index 50%
rename from app/code/Magento/Core/Model/Layout/Argument/Updater.php
rename to app/code/Magento/Catalog/Model/Attribute/LockValidatorComposite.php
index 4893cb098f8..294cd2e0c76 100644
--- a/app/code/Magento/Core/Model/Layout/Argument/Updater.php
+++ b/app/code/Magento/Catalog/Model/Attribute/LockValidatorComposite.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Attribure lock state validator
+ *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -18,56 +20,48 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Core
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-namespace Magento\Core\Model\Layout\Argument;
 
-/**
- * Layout argument updater processor
- *
- * @category    Magento
- * @package     Magento_Core
- * @author      Magento Core Team <core@magentocommerce.com>
- */
+namespace Magento\Catalog\Model\Attribute;
 
-class Updater
+class LockValidatorComposite implements LockValidatorInterface
 {
     /**
-     * @var \Magento\ObjectManager
+     * @var LockValidatorInterface[]
      */
-    protected $_objectManager;
+    protected $validators = array();
 
     /**
      * @param \Magento\ObjectManager $objectManager
+     * @param array $validators
+     * @throws \InvalidArgumentException
      */
-    public function __construct(\Magento\ObjectManager $objectManager)
+    public function __construct(\Magento\ObjectManager $objectManager, array $validators = array())
     {
-        $this->_objectManager = $objectManager;
+        foreach ($validators as $validator) {
+            if (!is_subclass_of($validator, 'Magento\Catalog\Model\Attribute\LockValidatorInterface')) {
+                throw new \InvalidArgumentException($validator . ' does not implements LockValidatorInterface');
+            }
+            $this->validators[] = $objectManager->get($validator);
+        }
     }
 
+
     /**
-     * Apply all updater to value
+     * Check attribute lock state
      *
-     * @param mixed $value
-     * @param array $updaters
-     * @throws \InvalidArgumentException
-     * @return mixed
+     * @param \Magento\Core\Model\AbstractModel $object
+     * @param null $attributeSet
+     * @throws \Magento\Core\Exception
+     *
+     * @return void
      */
-    public function applyUpdaters($value, array $updaters = array())
+    public function validate(\Magento\Core\Model\AbstractModel $object, $attributeSet = null)
     {
-        foreach ($updaters as $updater) {
-            /** @var \Magento\Core\Model\Layout\Argument\UpdaterInterface $updaterInstance */
-            $updaterInstance = $this->_objectManager->create($updater, array());
-            if (false === ($updaterInstance instanceof \Magento\Core\Model\Layout\Argument\UpdaterInterface)) {
-                throw new \InvalidArgumentException($updater
-                        . ' should implement \Magento\Core\Model\Layout\Argument\UpdaterInterface'
-                );
-            }
-            $value = $updaterInstance->update($value);
+        foreach ($this->validators as $validator) {
+            $validator->validate($object, $attributeSet);
         }
-        return $value;
     }
-}
+} 
diff --git a/app/code/Magento/Catalog/Model/Attribute/LockValidatorInterface.php b/app/code/Magento/Catalog/Model/Attribute/LockValidatorInterface.php
new file mode 100644
index 00000000000..dfdf37775a4
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Attribute/LockValidatorInterface.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * Attribure lock state validator interface
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Attribute;
+
+interface LockValidatorInterface
+{
+    /**
+     * Check attribute lock state
+     *
+     * @param \Magento\Core\Model\AbstractModel $object
+     * @param null $attributeSet
+     * @throws \Magento\Core\Exception
+     *
+     * @return void
+     */
+    public function validate(\Magento\Core\Model\AbstractModel $object, $attributeSet = null);
+} 
diff --git a/app/code/Magento/Catalog/Model/Category.php b/app/code/Magento/Catalog/Model/Category.php
index bb59cd08d72..e15b8d8fe50 100644
--- a/app/code/Magento/Catalog/Model/Category.php
+++ b/app/code/Magento/Catalog/Model/Category.php
@@ -29,7 +29,7 @@ namespace Magento\Catalog\Model;
  * @method setAffectedProductIds(array $productIds)
  * @method array getAffectedProductIds()
  * @method setMovedCategoryId(array $productIds)
- * @method int metMovedCategoryId()
+ * @method int getMovedCategoryId()
  * @method setAffectedCategoryIds(array $categoryIds)
  * @method array getAffectedCategoryIds()
  *
@@ -179,6 +179,11 @@ class Category extends \Magento\Catalog\Model\AbstractModel
      */
     protected $indexIndexer;
 
+    /**
+     * @var \Magento\Indexer\Model\IndexerInterface
+     */
+    protected $productIndexer;
+
     /**
      * @param \Magento\Core\Model\Context $context
      * @param \Magento\Core\Model\Registry $registry
@@ -195,6 +200,7 @@ class Category extends \Magento\Catalog\Model\AbstractModel
      * @param \Magento\Filter\FilterManager $filter
      * @param Indexer\Category\Flat\State $flatState
      * @param \Magento\Indexer\Model\IndexerInterface $flatIndexer
+     * @param \Magento\Indexer\Model\IndexerInterface $productIndexer
      * @param \Magento\Core\Model\Resource\AbstractResource $resource
      * @param \Magento\Data\Collection\Db $resourceCollection
      * @param array $data
@@ -215,6 +221,7 @@ class Category extends \Magento\Catalog\Model\AbstractModel
         \Magento\Filter\FilterManager $filter,
         Indexer\Category\Flat\State $flatState,
         \Magento\Indexer\Model\IndexerInterface $flatIndexer,
+        \Magento\Indexer\Model\IndexerInterface $productIndexer,
         \Magento\Core\Model\Resource\AbstractResource $resource = null,
         \Magento\Data\Collection\Db $resourceCollection = null,
         array $data = array()
@@ -228,6 +235,7 @@ class Category extends \Magento\Catalog\Model\AbstractModel
         $this->_productCollectionFactory = $productCollectionFactory;
         $this->_catalogConfig = $catalogConfig;
         $this->indexIndexer = $indexIndexer;
+        $this->productIndexer = $productIndexer;
         $this->filter = $filter;
         $this->flatState = $flatState;
         $this->flatIndexer = $flatIndexer;
@@ -251,7 +259,7 @@ class Category extends \Magento\Catalog\Model\AbstractModel
     }
 
     /**
-     * Return own indexer object
+     * Return flat indexer object
      *
      * @return \Magento\Indexer\Model\IndexerInterface
      */
@@ -263,6 +271,19 @@ class Category extends \Magento\Catalog\Model\AbstractModel
         return $this->flatIndexer;
     }
 
+    /**
+     * Return category product indexer object
+     *
+     * @return \Magento\Indexer\Model\IndexerInterface
+     */
+    protected function getProductIndexer()
+    {
+        if (!$this->productIndexer->getId()) {
+            $this->productIndexer->load(Indexer\Category\Product::INDEXER_ID);
+        }
+        return $this->productIndexer;
+    }
+
     /**
      * Retrieve URL instance
      *
@@ -345,6 +366,7 @@ class Category extends \Magento\Catalog\Model\AbstractModel
         */
         $this->setMovedCategoryId($this->getId());
         $oldParentId = $this->getParentId();
+        $oldParentIds = $this->getParentIds();
 
         $eventParams = array(
             $this->_eventObject => $this,
@@ -374,6 +396,9 @@ class Category extends \Magento\Catalog\Model\AbstractModel
         if ($this->flatState->isFlatEnabled() && !$this->getFlatIndexer()->isScheduled()) {
             $this->getFlatIndexer()->reindexList(array($this->getId(), $oldParentId, $parentId));
         }
+        if (!$this->getProductIndexer()->isScheduled()) {
+            $this->getProductIndexer()->reindexList(array_merge($this->getPathIds(), $oldParentIds));
+        }
         $this->_cacheManager->clean(array(self::CACHE_TAG));
 
         return $this;
@@ -1055,6 +1080,9 @@ class Category extends \Magento\Catalog\Model\AbstractModel
         if ($this->flatState->isFlatEnabled() && !$this->getFlatIndexer()->isScheduled()) {
             $this->getFlatIndexer()->reindexRow($this->getId());
         }
+        if (!$this->getProductIndexer()->isScheduled()) {
+            $this->getProductIndexer()->reindexList($this->getPathIds());
+        }
     }
 
     /**
diff --git a/app/code/Magento/Catalog/Model/Category/Indexer/Product.php b/app/code/Magento/Catalog/Model/Category/Indexer/Product.php
deleted file mode 100644
index 5fe93afd0f1..00000000000
--- a/app/code/Magento/Catalog/Model/Category/Indexer/Product.php
+++ /dev/null
@@ -1,267 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Catalog
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-namespace Magento\Catalog\Model\Category\Indexer;
-
-/**
- * Category products indexer model.
- * Responsibility for system actions:
- *  - Product save (changed assigned categories list)
- *  - Category save (changed assigned products list or category move)
- *  - Store save (new store creation, changed store group) - require reindex all data
- *  - Store group save (changed root category or group website) - require reindex all data
- *
- * @method \Magento\Catalog\Model\Resource\Category\Indexer\Product _getResource()
- * @method \Magento\Catalog\Model\Resource\Category\Indexer\Product getResource()
- * @method int getCategoryId()
- * @method \Magento\Catalog\Model\Category\Indexer\Product setCategoryId(int $value)
- * @method int getProductId()
- * @method \Magento\Catalog\Model\Category\Indexer\Product setProductId(int $value)
- * @method int getPosition()
- * @method \Magento\Catalog\Model\Category\Indexer\Product setPosition(int $value)
- * @method int getIsParent()
- * @method \Magento\Catalog\Model\Category\Indexer\Product setIsParent(int $value)
- * @method int getStoreId()
- * @method \Magento\Catalog\Model\Category\Indexer\Product setStoreId(int $value)
- * @method int getVisibility()
- * @method \Magento\Catalog\Model\Category\Indexer\Product setVisibility(int $value)
- *
- * @category    Magento
- * @package     Magento_Catalog
- * @author      Magento Core Team <core@magentocommerce.com>
- */
-class Product extends \Magento\Index\Model\Indexer\AbstractIndexer
-{
-    /**
-     * Data key for matching result to be saved in
-     */
-    const EVENT_MATCH_RESULT_KEY = 'catalog_category_product_match_result';
-
-    /**
-     * @var array
-     */
-    protected $_matchedEntities = array(
-        \Magento\Catalog\Model\Product::ENTITY => array(
-            \Magento\Index\Model\Event::TYPE_SAVE,
-            \Magento\Index\Model\Event::TYPE_MASS_ACTION
-        ),
-        \Magento\Catalog\Model\Category::ENTITY => array(
-            \Magento\Index\Model\Event::TYPE_SAVE
-        ),
-        \Magento\Core\Model\Store::ENTITY => array(
-            \Magento\Index\Model\Event::TYPE_SAVE
-        ),
-        \Magento\Core\Model\Store\Group::ENTITY => array(
-            \Magento\Index\Model\Event::TYPE_SAVE
-        ),
-    );
-
-    /**
-     * Initialize resource
-     *
-     * @return void
-     */
-    protected function _construct()
-    {
-        $this->_init('Magento\Catalog\Model\Resource\Category\Indexer\Product');
-    }
-
-    /**
-     * Get Indexer name
-     *
-     * @return string
-     */
-    public function getName()
-    {
-        return __('Category Products');
-    }
-
-    /**
-     * Get Indexer description
-     *
-     * @return string
-     */
-    public function getDescription()
-    {
-        return __('Indexed category/products association');
-    }
-
-    /**
-     * Check if event can be matched by process.
-     * Overwrote for specific config save, store and store groups save matching
-     *
-     * @param \Magento\Index\Model\Event $event
-     * @return bool
-     */
-    public function matchEvent(\Magento\Index\Model\Event $event)
-    {
-        $data      = $event->getNewData();
-        if (isset($data[self::EVENT_MATCH_RESULT_KEY])) {
-            return $data[self::EVENT_MATCH_RESULT_KEY];
-        }
-
-        $entity = $event->getEntity();
-        if ($entity == \Magento\Core\Model\Store::ENTITY) {
-            $store = $event->getDataObject();
-            if ($store && ($store->isObjectNew() || $store->dataHasChangedFor('group_id'))) {
-                $result = true;
-            } else {
-                $result = false;
-            }
-        } elseif ($entity == \Magento\Core\Model\Store\Group::ENTITY) {
-            $storeGroup = $event->getDataObject();
-            $hasDataChanges = $storeGroup && ($storeGroup->dataHasChangedFor('root_category_id')
-                || $storeGroup->dataHasChangedFor('website_id'));
-            if ($storeGroup && !$storeGroup->isObjectNew() && $hasDataChanges) {
-                $result = true;
-            } else {
-                $result = false;
-            }
-        } else {
-            $result = parent::matchEvent($event);
-        }
-
-        $event->addNewData(self::EVENT_MATCH_RESULT_KEY, $result);
-
-        return $result;
-    }
-
-
-    /**
-     * Register data required by process in event object
-     * Check if category ids was changed
-     *
-     * @param \Magento\Index\Model\Event $event
-     * @return $this
-     */
-    protected function _registerEvent(\Magento\Index\Model\Event $event)
-    {
-        $event->addNewData(self::EVENT_MATCH_RESULT_KEY, true);
-        $entity = $event->getEntity();
-        switch ($entity) {
-            case \Magento\Catalog\Model\Product::ENTITY:
-               $this->_registerProductEvent($event);
-                break;
-
-            case \Magento\Catalog\Model\Category::ENTITY:
-                $this->_registerCategoryEvent($event);
-                break;
-
-            case \Magento\Core\Model\Store::ENTITY:
-            case \Magento\Core\Model\Store\Group::ENTITY:
-                $process = $event->getProcess();
-                $process->changeStatus(\Magento\Index\Model\Process::STATUS_REQUIRE_REINDEX);
-                break;
-        }
-        return $this;
-    }
-
-    /**
-     * Register event data during product save process
-     *
-     * @param \Magento\Index\Model\Event $event
-     * @return void
-     */
-    protected function _registerProductEvent(\Magento\Index\Model\Event $event)
-    {
-        $eventType = $event->getType();
-        if ($eventType == \Magento\Index\Model\Event::TYPE_SAVE) {
-            $product = $event->getDataObject();
-            /**
-             * Check if product categories data was changed
-             */
-            if ($product->getIsChangedCategories() || $product->dataHasChangedFor('status')
-                || $product->dataHasChangedFor('visibility') || $product->getIsChangedWebsites()) {
-                $event->addNewData('category_ids', $product->getCategoryIds());
-            }
-        } else if ($eventType == \Magento\Index\Model\Event::TYPE_MASS_ACTION) {
-            /* @var $actionObject \Magento\Object */
-            $actionObject = $event->getDataObject();
-            $attributes   = array('status', 'visibility');
-            $rebuildIndex = false;
-
-            // check if attributes changed
-            $attrData = $actionObject->getAttributesData();
-            if (is_array($attrData)) {
-                foreach ($attributes as $attributeCode) {
-                    if (array_key_exists($attributeCode, $attrData)) {
-                        $rebuildIndex = true;
-                        break;
-                    }
-                }
-            }
-
-            // check changed websites
-            if ($actionObject->getWebsiteIds()) {
-                $rebuildIndex = true;
-            }
-
-            // register affected products
-            if ($rebuildIndex) {
-                $event->addNewData('product_ids', $actionObject->getProductIds());
-            }
-        }
-    }
-
-    /**
-     * Register event data during category save process
-     *
-     * @param \Magento\Index\Model\Event $event
-     * @return void
-     */
-    protected function _registerCategoryEvent(\Magento\Index\Model\Event $event)
-    {
-        $category = $event->getDataObject();
-        /**
-         * Check if product categories data was changed
-         */
-        if ($category->getIsChangedProductList()) {
-            $event->addNewData('products_was_changed', true);
-        }
-        /**
-         * Check if category has another affected category ids (category move result)
-         */
-        if ($category->getAffectedCategoryIds()) {
-            $event->addNewData('affected_category_ids', $category->getAffectedCategoryIds());
-        }
-    }
-
-    /**
-     * Process event data and save to index
-     *
-     * @param \Magento\Index\Model\Event $event
-     * @return void
-     */
-    protected function _processEvent(\Magento\Index\Model\Event $event)
-    {
-        $data = $event->getNewData();
-        if (!empty($data['catalog_category_product_reindex_all'])) {
-            $this->reindexAll();
-        }
-        if (empty($data['catalog_category_product_skip_call_event_handler'])) {
-            $this->callEventHandler($event);
-        }
-    }
-}
diff --git a/app/code/Magento/Catalog/Model/Entity/Attribute.php b/app/code/Magento/Catalog/Model/Entity/Attribute.php
index 4cc598547f3..1f1ec92ef3a 100644
--- a/app/code/Magento/Catalog/Model/Entity/Attribute.php
+++ b/app/code/Magento/Catalog/Model/Entity/Attribute.php
@@ -25,6 +25,8 @@
  */
 namespace Magento\Catalog\Model\Entity;
 
+use \Magento\Catalog\Model\Attribute\LockValidatorInterface;
+
 /**
  * Product attribute extension with event dispatching
  *
@@ -54,8 +56,6 @@ namespace Magento\Catalog\Model\Entity;
  * @method \Magento\Catalog\Model\Entity\Attribute setUsedInProductListing(int $value)
  * @method int getUsedForSortBy()
  * @method \Magento\Catalog\Model\Entity\Attribute setUsedForSortBy(int $value)
- * @method int getIsConfigurable()
- * @method \Magento\Catalog\Model\Entity\Attribute setIsConfigurable(int $value)
  * @method string getApplyTo()
  * @method \Magento\Catalog\Model\Entity\Attribute setApplyTo(string $value)
  * @method int getIsVisibleInAdvancedSearch()
@@ -71,6 +71,7 @@ namespace Magento\Catalog\Model\Entity;
  * @package     Magento_Catalog
  * @author      Magento Core Team <core@magentocommerce.com>
  */
+
 class Attribute extends \Magento\Eav\Model\Entity\Attribute
 {
     /**
@@ -90,8 +91,11 @@ class Attribute extends \Magento\Eav\Model\Entity\Attribute
     const MODULE_NAME = 'Magento_Catalog';
 
     /**
-     * Class constructor
-     *
+     * @var LockValidatorInterface
+     */
+    protected $attrLockValidator;
+
+    /**
      * @param \Magento\Core\Model\Context $context
      * @param \Magento\Core\Model\Registry $registry
      * @param \Magento\Core\Helper\Data $coreData
@@ -102,6 +106,7 @@ class Attribute extends \Magento\Eav\Model\Entity\Attribute
      * @param \Magento\Validator\UniversalFactory $universalFactory
      * @param \Magento\Core\Model\LocaleInterface $locale
      * @param \Magento\Catalog\Model\ProductFactory $catalogProductFactory
+     * @param LockValidatorInterface $lockValidator
      * @param \Magento\Core\Model\Resource\AbstractResource $resource
      * @param \Magento\Data\Collection\Db $resourceCollection
      * @param array $data
@@ -117,10 +122,12 @@ class Attribute extends \Magento\Eav\Model\Entity\Attribute
         \Magento\Validator\UniversalFactory $universalFactory,
         \Magento\Core\Model\LocaleInterface $locale,
         \Magento\Catalog\Model\ProductFactory $catalogProductFactory,
+        LockValidatorInterface $lockValidator,
         \Magento\Core\Model\Resource\AbstractResource $resource = null,
         \Magento\Data\Collection\Db $resourceCollection = null,
         array $data = array()
     ) {
+        $this->attrLockValidator = $lockValidator;
         parent::__construct(
             $context,
             $registry,
@@ -146,9 +153,12 @@ class Attribute extends \Magento\Eav\Model\Entity\Attribute
      */
     protected function _beforeSave()
     {
-        if ($this->_getResource()->isUsedBySuperProducts($this)) {
-            throw new \Magento\Eav\Exception(__('This attribute is used in configurable products'));
+        try {
+            $this->attrLockValidator->validate($this);
+        } catch (\Magento\Core\Exception $exception) {
+            throw new \Magento\Eav\Exception($exception->getMessage());
         }
+
         $this->setData('modulePrefix', self::MODULE_NAME);
         return parent::_beforeSave();
     }
diff --git a/app/code/Magento/Catalog/Model/Entity/Product/Attribute/Group/AttributeMapper.php b/app/code/Magento/Catalog/Model/Entity/Product/Attribute/Group/AttributeMapper.php
new file mode 100644
index 00000000000..d54bc5db902
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Entity/Product/Attribute/Group/AttributeMapper.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Attribute mapper
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Catalog\Model\Entity\Product\Attribute\Group;
+
+use \Magento\Catalog\Model\Attribute;
+
+class AttributeMapper implements AttributeMapperInterface
+{
+    /**
+     * Unassignable attributes
+     *
+     * @var array
+     */
+    protected $unassignableAttributes;
+
+    /**
+     * @param \Magento\Catalog\Model\Attribute\Config $attributeConfig
+     */
+    public function __construct(Attribute\Config $attributeConfig)
+    {
+        $this->unassignableAttributes = $attributeConfig->getAttributeNames('unassignable');
+    }
+
+    /**
+     * Build attribute representation
+     *
+     * @param \Magento\Eav\Model\Entity\Attribute $attribute
+     * @return array
+     */
+    public function map(\Magento\Eav\Model\Entity\Attribute $attribute)
+    {
+        $isUnassignable = !in_array($attribute->getAttributeCode(), $this->unassignableAttributes);
+
+        return array(
+            'text'              => $attribute->getAttributeCode(),
+            'id'                => $attribute->getAttributeId(),
+            'cls'               => $isUnassignable ? 'leaf' : 'system-leaf',
+            'allowDrop'         => false,
+            'allowDrag'         => true,
+            'leaf'              => true,
+            'is_user_defined'   => $attribute->getIsUserDefined(),
+            'is_unassignable'   => $isUnassignable,
+            'entity_id'         => $attribute->getEntityAttributeId()
+        );
+    }
+} 
diff --git a/app/code/Magento/Catalog/Model/Entity/Product/Attribute/Group/AttributeMapperInterface.php b/app/code/Magento/Catalog/Model/Entity/Product/Attribute/Group/AttributeMapperInterface.php
new file mode 100644
index 00000000000..938712b4e6e
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Entity/Product/Attribute/Group/AttributeMapperInterface.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Attribute mapper that is used to build frontend representation of attribute
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Catalog\Model\Entity\Product\Attribute\Group;
+
+use Magento\Eav\Model\Entity\Attribute;
+
+interface AttributeMapperInterface
+{
+    /**
+     * Map attribute to presentation format
+     *
+     * @param Attribute $attribute
+     * @return array
+     */
+    public function map(Attribute $attribute);
+} 
diff --git a/app/code/Magento/Catalog/Model/Index.php b/app/code/Magento/Catalog/Model/Index.php
deleted file mode 100644
index 5999fef260c..00000000000
--- a/app/code/Magento/Catalog/Model/Index.php
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Catalog
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-
-
-/**
- * Catalog Category/Product Index
- *
- * @category   Magento
- * @package    Magento_Catalog
- * @author     Magento Core Team <core@magentocommerce.com>
- */
-namespace Magento\Catalog\Model;
-
-class Index
-{
-    /**
-     * Store manager
-     *
-     * @var \Magento\Core\Model\StoreManagerInterface
-     */
-    protected $_storeManager;
-
-    /**
-     * Catalog category
-     *
-     * @var \Magento\Catalog\Model\Resource\Category
-     */
-    protected $_catalogCategory;
-
-    /**
-     * Catalog product
-     *
-     * @var \Magento\Catalog\Model\Resource\Product
-     */
-    protected $_catalogProduct;
-
-    /**
-     * Construct
-     *
-     * @param \Magento\Catalog\Model\Resource\Product $catalogProduct
-     * @param \Magento\Catalog\Model\Resource\Category $catalogCategory
-     * @param \Magento\Core\Model\StoreManagerInterface $storeManager
-     */
-    public function __construct(
-        \Magento\Catalog\Model\Resource\Product $catalogProduct,
-        \Magento\Catalog\Model\Resource\Category $catalogCategory,
-        \Magento\Core\Model\StoreManagerInterface $storeManager
-    ) {
-        $this->_catalogProduct = $catalogProduct;
-        $this->_catalogCategory = $catalogCategory;
-        $this->_storeManager = $storeManager;
-    }
-
-    /**
-     * Rebuild indexes
-     *
-     * @return \Magento\Catalog\Model\Index
-     */
-    public function rebuild()
-    {
-        $this->_catalogCategory->refreshProductIndex();
-        foreach ($this->_storeManager->getStores() as $store) {
-            $this->_catalogProduct->refreshEnabledIndex($store);
-        }
-        return $this;
-    }
-}
diff --git a/app/code/Magento/Catalog/Model/Indexer/Category/Flat/Action/Rows.php b/app/code/Magento/Catalog/Model/Indexer/Category/Flat/Action/Rows.php
index dcdb9e84343..d4be1110384 100644
--- a/app/code/Magento/Catalog/Model/Indexer/Category/Flat/Action/Rows.php
+++ b/app/code/Magento/Catalog/Model/Indexer/Category/Flat/Action/Rows.php
@@ -140,7 +140,7 @@ class Rows extends \Magento\Catalog\Model\Indexer\Category\Flat\AbstractAction
         $select = $this->getWriteAdapter()->select()
             ->from(array('cf' => $this->getTableNameByStore($store, $useTempTable)))
             ->joinLeft(
-                array('ce' => $this->getWriteAdapter()->getTableName($this->getTableName('catalog_category_entity'))),
+                array('ce' => $this->getTableName('catalog_category_entity')),
                 'cf.path = ce.path',
                 array()
             )
@@ -167,10 +167,7 @@ class Rows extends \Magento\Catalog\Model\Indexer\Category\Flat\AbstractAction
         $catIdExpr = $this->getReadAdapter()->quote("{$rootId}/{$store->getRootCategoryId()}/%");
 
         $select = $this->getReadAdapter()->select()
-            ->from(
-                $this->getReadAdapter()->getTableName($this->getTableName('catalog_category_entity')),
-                array('entity_id')
-            )
+            ->from($this->getTableName('catalog_category_entity'), array('entity_id'))
             ->where("path = {$rootIdExpr} OR path = {$rootCatIdExpr} OR path like {$catIdExpr}")
             ->where('entity_id IN (?)', $ids);
 
diff --git a/app/code/Magento/Catalog/Model/Indexer/Category/Flat/Plugin/StoreGroup.php b/app/code/Magento/Catalog/Model/Indexer/Category/Flat/Plugin/StoreGroup.php
index 700c20bd722..e63de758571 100644
--- a/app/code/Magento/Catalog/Model/Indexer/Category/Flat/Plugin/StoreGroup.php
+++ b/app/code/Magento/Catalog/Model/Indexer/Category/Flat/Plugin/StoreGroup.php
@@ -23,21 +23,67 @@
  */
 namespace Magento\Catalog\Model\Indexer\Category\Flat\Plugin;
 
-class StoreGroup extends AbstractStore
+class StoreGroup
 {
     /**
+     * @var \Magento\Indexer\Model\IndexerInterface
+     */
+    protected $indexer;
+
+    /**
+     * @var \Magento\Catalog\Model\Indexer\Category\Flat\State
+     */
+    protected $state;
+
+    /**
+     * @param \Magento\Indexer\Model\IndexerInterface $indexer
+     * @param \Magento\Catalog\Model\Indexer\Category\Flat\State $state
+     */
+    public function __construct(
+        \Magento\Indexer\Model\IndexerInterface $indexer,
+        \Magento\Catalog\Model\Indexer\Category\Flat\State $state
+    ) {
+        $this->indexer = $indexer;
+        $this->state = $state;
+    }
+
+    /**
+     * Return own indexer object
+     *
+     * @return \Magento\Indexer\Model\IndexerInterface
+     */
+    protected function getIndexer()
+    {
+        if (!$this->indexer->getId()) {
+            $this->indexer->load(\Magento\Catalog\Model\Indexer\Category\Flat\State::INDEXER_ID);
+        }
+        return $this->indexer;
+    }
+
+    /**
+     * Validate changes for invalidating indexer
+     *
+     * @param \Magento\Core\Model\AbstractModel $group
+     * @return bool
+     */
+    protected function validate(\Magento\Core\Model\AbstractModel $group)
+    {
+        return $group->dataHasChangedFor('root_category_id') && !$group->isObjectNew();
+    }
+
+    /**
+     * Process to invalidate indexer
+     *
      * @param array $arguments
      * @param \Magento\Code\Plugin\InvocationChain $invocationChain
      * @return \Magento\Core\Model\Resource\Db\AbstractDb
      */
     public function aroundSave(array $arguments, \Magento\Code\Plugin\InvocationChain $invocationChain)
     {
-        /** @var \Magento\Core\Model\Store\Group $group */
-        $group = $arguments[0];
-        $needInvalidating = $group->dataHasChangedFor('root_category_id') && !$group->isObjectNew();
+        $needInvalidating = $this->validate($arguments[0]);
         $objectResource = $invocationChain->proceed($arguments);
-        if ($needInvalidating) {
-            $this->invalidateIndexer();
+        if ($needInvalidating && $this->state->isFlatEnabled()) {
+            $this->getIndexer()->invalidate();
         }
 
         return $objectResource;
diff --git a/app/code/Magento/Catalog/Model/Indexer/Category/Flat/Plugin/StoreView.php b/app/code/Magento/Catalog/Model/Indexer/Category/Flat/Plugin/StoreView.php
index 67ad38099f9..991cb873b4f 100644
--- a/app/code/Magento/Catalog/Model/Indexer/Category/Flat/Plugin/StoreView.php
+++ b/app/code/Magento/Catalog/Model/Indexer/Category/Flat/Plugin/StoreView.php
@@ -23,23 +23,16 @@
  */
 namespace Magento\Catalog\Model\Indexer\Category\Flat\Plugin;
 
-class StoreView extends AbstractStore
+class StoreView extends StoreGroup
 {
     /**
-     * @param array $arguments
-     * @param \Magento\Code\Plugin\InvocationChain $invocationChain
-     * @return \Magento\Core\Model\Resource\Db\AbstractDb
+     * Validate changes for invalidating indexer
+     *
+     * @param \Magento\Core\Model\AbstractModel $store
+     * @return bool
      */
-    public function aroundSave(array $arguments, \Magento\Code\Plugin\InvocationChain $invocationChain)
+    protected function validate(\Magento\Core\Model\AbstractModel $store)
     {
-        /** @var \Magento\Core\Model\Store $store */
-        $store = $arguments[0];
-        $needInvalidating = $store->isObjectNew() || $store->dataHasChangedFor('group_id');
-        $objectResource = $invocationChain->proceed($arguments);
-        if ($needInvalidating) {
-            $this->invalidateIndexer();
-        }
-
-        return $objectResource;
+        return $store->isObjectNew() || $store->dataHasChangedFor('group_id');
     }
 }
diff --git a/app/code/Magento/Catalog/Model/Indexer/Category/Product.php b/app/code/Magento/Catalog/Model/Indexer/Category/Product.php
new file mode 100644
index 00000000000..6643bd5e689
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Indexer/Category/Product.php
@@ -0,0 +1,123 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Category;
+
+class Product implements \Magento\Indexer\Model\ActionInterface, \Magento\Mview\ActionInterface
+{
+    /**
+     * Indexer ID in configuration
+     */
+    const INDEXER_ID = 'catalog_category_product';
+
+    /**
+     * @var Product\Action\FullFactory
+     */
+    protected $fullActionFactory;
+
+    /**
+     * @var Product\Action\RowsFactory
+     */
+    protected $rowsActionFactory;
+
+    /**
+     * @var \Magento\Indexer\Model\IndexerInterface
+     */
+    protected $indexer;
+
+    /**
+     * @param Product\Action\FullFactory $fullActionFactory
+     * @param Product\Action\RowsFactory $rowsActionFactory
+     * @param \Magento\Indexer\Model\IndexerInterface $indexer
+     */
+    public function __construct(
+        Product\Action\FullFactory $fullActionFactory,
+        Product\Action\RowsFactory $rowsActionFactory,
+        \Magento\Indexer\Model\IndexerInterface $indexer
+    ) {
+        $this->fullActionFactory = $fullActionFactory;
+        $this->rowsActionFactory = $rowsActionFactory;
+        $this->indexer = $indexer;
+    }
+
+    /**
+     * Execute materialization on ids entities
+     *
+     * @param int[] $ids
+     */
+    public function execute($ids)
+    {
+        $this->executeAction($ids);
+    }
+
+    /**
+     * Execute full indexation
+     */
+    public function executeFull()
+    {
+        $this->fullActionFactory->create()
+            ->execute();
+    }
+
+    /**
+     * Execute partial indexation by ID list
+     *
+     * @param int[] $ids
+     */
+    public function executeList($ids)
+    {
+        $this->executeAction($ids);
+    }
+
+    /**
+     * Execute partial indexation by ID
+     *
+     * @param int $id
+     */
+    public function executeRow($id)
+    {
+        $this->executeAction([$id]);
+    }
+
+    /**
+     * Execute action for single entity or list of entities
+     *
+     * @param int[] $ids
+     * @return $this
+     */
+    protected function executeAction($ids)
+    {
+        $ids = array_unique($ids);
+        $this->indexer->load(static::INDEXER_ID);
+
+        /** @var Product\Action\Rows $action */
+        $action = $this->rowsActionFactory->create();
+        if ($this->indexer->isWorking()) {
+            $action->execute($ids, true);
+        }
+        $action->execute($ids);
+
+        return $this;
+    }
+}
diff --git a/app/code/Magento/Catalog/Model/Indexer/Category/Product/AbstractAction.php b/app/code/Magento/Catalog/Model/Indexer/Category/Product/AbstractAction.php
new file mode 100644
index 00000000000..05caa7c9819
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Indexer/Category/Product/AbstractAction.php
@@ -0,0 +1,609 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Category\Product;
+
+abstract class AbstractAction
+{
+    /**
+     * Chunk size
+     */
+    const RANGE_CATEGORY_STEP = 500;
+
+    /**
+     * Chunk size for product
+     */
+    const RANGE_PRODUCT_STEP = 1000000;
+
+    /**
+     * Catalog category index table name
+     */
+    const MAIN_INDEX_TABLE = 'catalog_category_product_index';
+
+    /**
+     * Suffix for table to show it is temporary
+     */
+    const TEMPORARY_TABLE_SUFFIX = '_tmp';
+
+    /**
+     * Cached non anchor categories select by store id
+     *
+     * @var \Magento\DB\Select[]
+     */
+    protected $nonAnchorSelects = [];
+
+    /**
+     * Cached anchor categories select by store id
+     *
+     * @var \Magento\DB\Select[]
+     */
+    protected $anchorSelects = [];
+
+    /**
+     * Cached all product select by store id
+     *
+     * @var \Magento\DB\Select[]
+     */
+    protected $productsSelects = [];
+
+    /**
+     * Category path by id
+     *
+     * @var string[]
+     */
+    protected $categoryPath = [];
+
+    /**
+     * @var \Magento\App\Resource
+     */
+    protected $resource;
+
+    /**
+     * @var \Magento\Core\Model\StoreManagerInterface
+     */
+    protected $storeManager;
+
+    /**
+     * @var \Magento\Catalog\Model\Config
+     */
+    protected $config;
+
+    /**
+     * Whether to use main or temporary index table
+     *
+     * @var bool
+     */
+    protected $useTempTable = true;
+
+    /**
+     * @param \Magento\App\Resource $resource
+     * @param \Magento\Core\Model\StoreManagerInterface $storeManager
+     * @param \Magento\Catalog\Model\Config $config
+     */
+    public function __construct(
+        \Magento\App\Resource $resource,
+        \Magento\Core\Model\StoreManagerInterface $storeManager,
+        \Magento\Catalog\Model\Config $config
+    ) {
+        $this->resource = $resource;
+        $this->storeManager = $storeManager;
+        $this->config = $config;
+    }
+
+    /**
+     * Run full reindex
+     *
+     * @return $this
+     */
+    abstract public function execute();
+
+    /**
+     * Run reindexation
+     */
+    protected function reindex()
+    {
+        foreach ($this->storeManager->getStores() as $store) {
+            if ($this->getPathFromCategoryId($store->getRootCategoryId())) {
+                $this->reindexRootCategory($store);
+                $this->reindexAnchorCategories($store);
+                $this->reindexNonAnchorCategories($store);
+            }
+        }
+    }
+
+    /**
+     * Return validated table name
+     *
+     * @param string|string[] $table
+     * @return string
+     */
+    protected function getTable($table)
+    {
+        return $this->resource->getTableName($table);
+    }
+
+    /**
+     * Return main index table name
+     *
+     * @return string
+     */
+    protected function getMainTable()
+    {
+        return $this->getTable(self::MAIN_INDEX_TABLE);
+    }
+
+    /**
+     * Return temporary index table name
+     *
+     * @return string
+     */
+    protected function getMainTmpTable()
+    {
+        return $this->useTempTable ? $this->getTable(self::MAIN_INDEX_TABLE . self::TEMPORARY_TABLE_SUFFIX)
+            : $this->getMainTable();
+    }
+
+    /**
+     * Retrieve connection for read data
+     *
+     * @return \Magento\DB\Adapter\AdapterInterface
+     */
+    protected function getReadAdapter()
+    {
+        $writeAdapter = $this->getWriteAdapter();
+        if ($writeAdapter && $writeAdapter->getTransactionLevel() > 0) {
+            // if transaction is started we should use write connection for reading
+            return $writeAdapter;
+        }
+        return $this->resource->getConnection('read');
+    }
+
+    /**
+     * Retrieve connection for write data
+     *
+     * @return \Magento\DB\Adapter\AdapterInterface
+     */
+    protected function getWriteAdapter()
+    {
+        return $this->resource->getConnection('write');
+    }
+
+    /**
+     * Return category path by id
+     *
+     * @param int $categoryId
+     * @return string
+     */
+    protected function getPathFromCategoryId($categoryId)
+    {
+        if (!isset($this->categoryPath[$categoryId])) {
+            $this->categoryPath[$categoryId] = $this->getReadAdapter()->fetchOne(
+                $this->getReadAdapter()->select()
+                    ->from($this->getTable('catalog_category_entity'), ['path'])
+                    ->where('entity_id = ?', $categoryId)
+            );
+        }
+        return $this->categoryPath[$categoryId];
+    }
+
+    /**
+     * Retrieve select for reindex products of non anchor categories
+     *
+     * @param \Magento\Core\Model\Store $store
+     * @return \Magento\DB\Select
+     */
+    protected function getNonAnchorCategoriesSelect(\Magento\Core\Model\Store $store)
+    {
+        if (!isset($this->nonAnchorSelects[$store->getId()])) {
+            $statusAttributeId = $this->config->getAttribute(
+                \Magento\Catalog\Model\Product::ENTITY, 'status'
+            )->getId();
+            $visibilityAttributeId = $this->config->getAttribute(
+                \Magento\Catalog\Model\Product::ENTITY, 'visibility'
+            )->getId();
+
+            $rootPath = $this->getPathFromCategoryId($store->getRootCategoryId());
+
+            $select = $this->getWriteAdapter()->select()
+                ->from(['cc' => $this->getTable('catalog_category_entity')], [])
+                ->joinInner(
+                    ['ccp' => $this->getTable('catalog_category_product')],
+                    'ccp.category_id = cc.entity_id',
+                    []
+                )
+                ->joinInner(
+                    ['cpw' => $this->getTable('catalog_product_website')],
+                    'cpw.product_id = ccp.product_id',
+                    []
+                )
+                ->joinInner(
+                    ['cpsd' => $this->getTable('catalog_product_entity_int')],
+                    'cpsd.entity_id = ccp.product_id AND cpsd.store_id = 0'
+                        . ' AND cpsd.attribute_id = ' . $statusAttributeId,
+                    []
+                )
+                ->joinLeft(
+                    ['cpss' => $this->getTable('catalog_product_entity_int')],
+                    'cpss.entity_id = ccp.product_id AND cpss.attribute_id = cpsd.attribute_id'
+                        . ' AND cpss.store_id = ' . $store->getId(),
+                    []
+                )
+                ->joinInner(
+                    ['cpvd' => $this->getTable('catalog_product_entity_int')],
+                    'cpvd.entity_id = ccp.product_id AND cpvd.store_id = 0'
+                        . ' AND cpvd.attribute_id = ' . $visibilityAttributeId,
+                    []
+                )
+                ->joinLeft(
+                    ['cpvs' => $this->getTable('catalog_product_entity_int')],
+                    'cpvs.entity_id = ccp.product_id AND cpvs.attribute_id = cpvd.attribute_id'
+                        . ' AND cpvs.store_id = ' . $store->getId(),
+                    []
+                )
+                ->where('cc.path LIKE ' . $this->getWriteAdapter()->quote($rootPath . '/%'))
+                ->where('cpw.website_id = ?', $store->getWebsiteId())
+                ->where(
+                    $this->getWriteAdapter()->getIfNullSql('cpss.value', 'cpsd.value') . ' = ?',
+                    \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED
+                )
+                ->where(
+                    $this->getWriteAdapter()->getIfNullSql('cpvs.value', 'cpvd.value') . ' IN (?)',
+                    [
+                        \Magento\Catalog\Model\Product\Visibility::VISIBILITY_IN_CATALOG,
+                        \Magento\Catalog\Model\Product\Visibility::VISIBILITY_IN_SEARCH,
+                        \Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH,
+                    ]
+                )
+                ->columns(
+                    [
+                        'category_id' => 'cc.entity_id',
+                        'product_id'  => 'ccp.product_id',
+                        'position'    => 'ccp.position',
+                        'is_parent'   => new \Zend_Db_Expr('1'),
+                        'store_id'    => new \Zend_Db_Expr($store->getId()),
+                        'visibility'  => new \Zend_Db_Expr(
+                                $this->getWriteAdapter()->getIfNullSql('cpvs.value', 'cpvd.value')),
+                    ]
+                );
+
+            $this->nonAnchorSelects[$store->getId()] = $select;
+        }
+
+        return $this->nonAnchorSelects[$store->getId()];
+    }
+
+    /**
+     * Check whether select ranging is needed
+     *
+     * @return bool
+     */
+    protected function isRangingNeeded()
+    {
+        return true;
+    }
+
+    /**
+     * Return selects cut by min and max
+     *
+     * @param \Magento\DB\Select $select
+     * @param string $field
+     * @param int $range
+     * @return \Magento\DB\Select[]
+     */
+    protected function prepareSelectsByRange(\Magento\DB\Select $select, $field, $range = self::RANGE_CATEGORY_STEP)
+    {
+        return $this->isRangingNeeded()
+            ? $this->getWriteAdapter()->selectsByRange($field, $select, $range)
+            : array($select);
+    }
+
+    /**
+     * Reindex products of non anchor categories
+     *
+     * @param \Magento\Core\Model\Store $store
+     */
+    protected function reindexNonAnchorCategories(\Magento\Core\Model\Store $store)
+    {
+        $selects = $this->prepareSelectsByRange($this->getNonAnchorCategoriesSelect($store), 'entity_id');
+        foreach ($selects as $select) {
+            $this->getWriteAdapter()->query(
+                $this->getWriteAdapter()->insertFromSelect(
+                    $select,
+                    $this->getMainTmpTable(),
+                    ['category_id', 'product_id', 'position', 'is_parent', 'store_id', 'visibility'],
+                    \Magento\DB\Adapter\AdapterInterface::INSERT_ON_DUPLICATE
+                )
+            );
+        }
+    }
+
+    /**
+     * Check if anchor select isset
+     *
+     * @param \Magento\Core\Model\Store $store
+     * @return bool
+     */
+    protected function hasAnchorSelect(\Magento\Core\Model\Store $store)
+    {
+        return isset($this->anchorSelects[$store->getId()]);
+    }
+
+    /**
+     * Create anchor select
+     *
+     * @param \Magento\Core\Model\Store $store
+     * @return \Magento\DB\Select
+     */
+    protected function createAnchorSelect(\Magento\Core\Model\Store $store)
+    {
+        $isAnchorAttributeId = $this->config->getAttribute(\Magento\Catalog\Model\Category::ENTITY, 'is_anchor')
+            ->getId();
+        $statusAttributeId = $this->config->getAttribute(\Magento\Catalog\Model\Product::ENTITY, 'status')
+            ->getId();
+        $visibilityAttributeId = $this->config->getAttribute(\Magento\Catalog\Model\Product::ENTITY, 'visibility')
+            ->getId();
+        $rootCatIds = explode('/', $this->getPathFromCategoryId($store->getRootCategoryId()));
+        array_pop($rootCatIds);
+        return $this->getWriteAdapter()->select()
+            ->from(['cc' => $this->getTable('catalog_category_entity')], [])
+            ->joinInner(
+                ['cc2' => $this->getTable('catalog_category_entity')],
+                'cc2.path LIKE ' . $this->getWriteAdapter()->getConcatSql(
+                    [
+                        $this->getWriteAdapter()->quoteIdentifier('cc.path'),
+                        $this->getWriteAdapter()->quote('/%')
+                    ]
+                ) . ' AND cc.entity_id NOT IN (' . implode(',', $rootCatIds) . ')',
+                []
+            )
+            ->joinInner(
+                ['ccp' => $this->getTable('catalog_category_product')],
+                'ccp.category_id = cc2.entity_id',
+                []
+            )
+            ->joinInner(
+                ['cpw' => $this->getTable('catalog_product_website')],
+                'cpw.product_id = ccp.product_id',
+                []
+            )
+            ->joinInner(
+                ['cpsd' => $this->getTable('catalog_product_entity_int')],
+                'cpsd.entity_id = ccp.product_id AND cpsd.store_id = 0'
+                . ' AND cpsd.attribute_id = ' . $statusAttributeId,
+                []
+            )
+            ->joinLeft(
+                ['cpss' => $this->getTable('catalog_product_entity_int')],
+                'cpss.entity_id = ccp.product_id AND cpss.attribute_id = cpsd.attribute_id'
+                . ' AND cpss.store_id = ' . $store->getId(),
+                []
+            )
+            ->joinInner(
+                ['cpvd' => $this->getTable('catalog_product_entity_int')],
+                'cpvd.entity_id = ccp.product_id AND cpvd.store_id = 0'
+                . ' AND cpvd.attribute_id = ' . $visibilityAttributeId,
+                []
+            )
+            ->joinLeft(
+                ['cpvs' => $this->getTable('catalog_product_entity_int')],
+                'cpvs.entity_id = ccp.product_id AND cpvs.attribute_id = cpvd.attribute_id '
+                . 'AND cpvs.store_id = ' . $store->getId(),
+                []
+            )
+            ->joinInner(
+                ['ccad' => $this->getTable('catalog_category_entity_int')],
+                'ccad.entity_id = cc.entity_id AND ccad.store_id = 0'
+                . ' AND ccad.attribute_id = ' . $isAnchorAttributeId,
+                []
+            )
+            ->joinLeft(
+                ['ccas' => $this->getTable('catalog_category_entity_int')],
+                'ccas.entity_id = cc.entity_id AND ccas.attribute_id = ccad.attribute_id'
+                . ' AND ccas.store_id = ' . $store->getId(),
+                []
+            )
+            ->where('cpw.website_id = ?', $store->getWebsiteId())
+            ->where(
+                $this->getWriteAdapter()->getIfNullSql('cpss.value', 'cpsd.value') . ' = ?',
+                \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED
+            )
+            ->where(
+                $this->getWriteAdapter()->getIfNullSql('cpvs.value', 'cpvd.value') . ' IN (?)',
+                [
+                    \Magento\Catalog\Model\Product\Visibility::VISIBILITY_IN_CATALOG,
+                    \Magento\Catalog\Model\Product\Visibility::VISIBILITY_IN_SEARCH,
+                    \Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH,
+                ]
+            )
+            ->where($this->getWriteAdapter()->getIfNullSql('ccas.value', 'ccad.value') . ' = ?', 1)
+            ->columns(
+                [
+                    'category_id' => 'cc.entity_id',
+                    'product_id'  => 'ccp.product_id',
+                    'position'    => new \Zend_Db_Expr('ccp.position + 10000'),
+                    'is_parent'   => new \Zend_Db_Expr('0'),
+                    'store_id'    => new \Zend_Db_Expr($store->getId()),
+                    'visibility'  => new \Zend_Db_Expr(
+                            $this->getWriteAdapter()->getIfNullSql('cpvs.value', 'cpvd.value')),
+                ]
+            );
+    }
+
+    /**
+     * Retrieve select for reindex products of non anchor categories
+     *
+     * @param \Magento\Core\Model\Store $store
+     * @return \Magento\DB\Select
+     */
+    protected function getAnchorCategoriesSelect(\Magento\Core\Model\Store $store)
+    {
+        if (!$this->hasAnchorSelect($store)) {
+            $this->anchorSelects[$store->getId()] = $this->createAnchorSelect($store);
+        }
+        return $this->anchorSelects[$store->getId()];
+    }
+
+    /**
+     * Reindex products of anchor categories
+     *
+     * @param \Magento\Core\Model\Store $store
+     */
+    protected function reindexAnchorCategories(\Magento\Core\Model\Store $store)
+    {
+        $selects = $this->prepareSelectsByRange($this->getAnchorCategoriesSelect($store), 'entity_id');
+
+        foreach ($selects as $select) {
+            $this->getWriteAdapter()->query(
+                $this->getWriteAdapter()->insertFromSelect(
+                    $select,
+                    $this->getMainTmpTable(),
+                    ['category_id', 'product_id', 'position', 'is_parent', 'store_id', 'visibility'],
+                    \Magento\DB\Adapter\AdapterInterface::INSERT_ON_DUPLICATE
+                )
+            );
+        }
+    }
+
+    /**
+     * Get select for all products
+     *
+     * @param \Magento\Core\Model\Store $store
+     * @return \Magento\DB\Select
+     */
+    protected function getAllProducts(\Magento\Core\Model\Store $store)
+    {
+        if (!isset($this->productsSelects[$store->getId()])) {
+            $statusAttributeId = $this->config->getAttribute(
+                \Magento\Catalog\Model\Product::ENTITY, 'status'
+            )->getId();
+            $visibilityAttributeId = $this->config->getAttribute(
+                \Magento\Catalog\Model\Product::ENTITY, 'visibility'
+            )->getId();
+
+            $select = $this->getWriteAdapter()->select()
+                ->from(['cp' => $this->getTable('catalog_product_entity')], [])
+                ->joinInner(
+                    ['cpw' => $this->getTable('catalog_product_website')],
+                    'cpw.product_id = cp.entity_id',
+                    []
+                )
+                ->joinInner(
+                    ['cpsd' => $this->getTable('catalog_product_entity_int')],
+                    'cpsd.entity_id = cp.entity_id AND cpsd.store_id = 0'
+                        . ' AND cpsd.attribute_id = ' . $statusAttributeId,
+                    []
+                )
+                ->joinLeft(
+                    ['cpss' => $this->getTable('catalog_product_entity_int')],
+                    'cpss.entity_id = cp.entity_id AND cpss.attribute_id = cpsd.attribute_id'
+                        . ' AND cpss.store_id = ' . $store->getId(),
+                    []
+                )
+                ->joinInner(
+                    ['cpvd' => $this->getTable('catalog_product_entity_int')],
+                    'cpvd.entity_id = cp.entity_id AND cpvd.store_id = 0'
+                        . ' AND cpvd.attribute_id = ' . $visibilityAttributeId,
+                    []
+                )
+                ->joinLeft(
+                    ['cpvs' => $this->getTable('catalog_product_entity_int')],
+                    'cpvs.entity_id = cp.entity_id AND cpvs.attribute_id = cpvd.attribute_id '
+                        . ' AND cpvs.store_id = ' . $store->getId(),
+                    []
+                )
+                ->joinLeft(
+                    ['ccp' => $this->getTable('catalog_category_product')],
+                    'ccp.product_id = cp.entity_id',
+                    []
+                )
+                ->where('cpw.website_id = ?', $store->getWebsiteId())
+                ->where(
+                    $this->getWriteAdapter()->getIfNullSql('cpss.value', 'cpsd.value') . ' = ?',
+                    \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED
+                )
+                ->where(
+                    $this->getWriteAdapter()->getIfNullSql('cpvs.value', 'cpvd.value') . ' IN (?)',
+                    [
+                        \Magento\Catalog\Model\Product\Visibility::VISIBILITY_IN_CATALOG,
+                        \Magento\Catalog\Model\Product\Visibility::VISIBILITY_IN_SEARCH,
+                        \Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH,
+                    ]
+                )
+                ->group('cp.entity_id')
+                ->columns(
+                    [
+                        'category_id' => new \Zend_Db_Expr($store->getRootCategoryId()),
+                        'product_id'  => 'cp.entity_id',
+                        'position'    => new \Zend_Db_Expr(
+                                $this->getWriteAdapter()->getCheckSql('ccp.product_id IS NOT NULL', 'ccp.position', '0')
+                            ),
+                        'is_parent'   => new \Zend_Db_Expr(
+                                $this->getWriteAdapter()->getCheckSql('ccp.product_id IS NOT NULL', '1', '0')),
+                        'store_id'    => new \Zend_Db_Expr($store->getId()),
+                        'visibility'  => new \Zend_Db_Expr(
+                                $this->getWriteAdapter()->getIfNullSql('cpvs.value', 'cpvd.value')),
+                    ]
+                );
+
+            $this->productsSelects[$store->getId()] = $select;
+        }
+
+        return $this->productsSelects[$store->getId()];
+    }
+
+    /**
+     * Check whether indexation of root category is needed
+     *
+     * @return bool
+     */
+    protected function isIndexRootCategoryNeeded()
+    {
+        return true;
+    }
+
+    /**
+     * Reindex all products to root category
+     *
+     * @param \Magento\Core\Model\Store $store
+     */
+    protected function reindexRootCategory(\Magento\Core\Model\Store $store)
+    {
+        if ($this->isIndexRootCategoryNeeded()) {
+            $selects = $this->prepareSelectsByRange(
+                $this->getAllProducts($store), 'entity_id', self::RANGE_PRODUCT_STEP
+            );
+
+            foreach ($selects as $select) {
+                $this->getWriteAdapter()->query(
+                    $this->getWriteAdapter()->insertFromSelect(
+                        $select,
+                        $this->getMainTmpTable(),
+                        ['category_id', 'product_id', 'position', 'is_parent', 'store_id', 'visibility'],
+                        \Magento\DB\Adapter\AdapterInterface::INSERT_ON_DUPLICATE
+                    )
+                );
+            }
+        }
+    }
+}
diff --git a/app/code/Magento/Catalog/Model/Indexer/Category/Product/Action/Full.php b/app/code/Magento/Catalog/Model/Indexer/Category/Product/Action/Full.php
new file mode 100644
index 00000000000..e56b7dc92ce
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Indexer/Category/Product/Action/Full.php
@@ -0,0 +1,108 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Category\Product\Action;
+
+class Full extends \Magento\Catalog\Model\Indexer\Category\Product\AbstractAction
+{
+    /**
+     * Refresh entities index
+     *
+     * @return $this
+     */
+    public function execute()
+    {
+        $this->clearTmpData();
+
+        $this->reindex();
+
+        $this->publishData();
+        $this->removeUnnecessaryData();
+
+        return $this;
+    }
+
+    /**
+     * Return select for remove unnecessary data
+     *
+     * @return \Magento\DB\Select
+     */
+    protected function getSelectUnnecessaryData()
+    {
+        return $this->getWriteAdapter()->select()
+            ->from($this->getMainTable(), [])
+            ->joinLeft(
+                ['t' => $this->getMainTmpTable()],
+                $this->getMainTable() . '.category_id = t.category_id AND '
+                . $this->getMainTable() . '.store_id = t.store_id AND '
+                . $this->getMainTable() . '.product_id = t.product_id',
+                []
+            )
+            ->where('t.category_id IS NULL');
+    }
+
+    /**
+     * Remove unnecessary data
+     */
+    protected function removeUnnecessaryData()
+    {
+        $this->getWriteAdapter()->query(
+            $this->getWriteAdapter()->deleteFromSelect(
+                $this->getSelectUnnecessaryData(), $this->getMainTable()
+            )
+        );
+    }
+
+    /**
+     * Publish data from tmp to index
+     */
+    protected function publishData()
+    {
+        $select = $this->getWriteAdapter()->select()
+            ->from($this->getMainTmpTable());
+
+        $queries = $this->prepareSelectsByRange($select, 'category_id');
+
+        foreach ($queries as $query) {
+            $this->getWriteAdapter()->query(
+                $this->getWriteAdapter()->insertFromSelect(
+                    $query,
+                    $this->getMainTable(),
+                    ['category_id', 'product_id', 'position', 'is_parent', 'store_id', 'visibility'],
+                    \Magento\DB\Adapter\AdapterInterface::INSERT_ON_DUPLICATE
+                )
+            );
+        }
+    }
+
+    /**
+     * Clear all index data
+     */
+    protected function clearTmpData()
+    {
+        $this->getWriteAdapter()->delete(
+            $this->getMainTmpTable()
+        );
+    }
+}
diff --git a/app/code/Magento/Catalog/Model/Indexer/Category/Product/Action/Rows.php b/app/code/Magento/Catalog/Model/Indexer/Category/Product/Action/Rows.php
new file mode 100644
index 00000000000..6f2e812a4a6
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Indexer/Category/Product/Action/Rows.php
@@ -0,0 +1,126 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Category\Product\Action;
+
+class Rows extends \Magento\Catalog\Model\Indexer\Category\Product\AbstractAction
+{
+    /**
+     * Limitation by categories
+     *
+     * @var int[]
+     */
+    protected $limitationByCategories;
+
+    /**
+     * Refresh entities index
+     *
+     * @param int[] $entityIds
+     * @param bool $useTempTable
+     * @return $this
+     */
+    public function execute(array $entityIds = array(), $useTempTable = false)
+    {
+        $this->limitationByCategories = $entityIds;
+        $this->useTempTable = $useTempTable;
+
+        $this->removeEntries();
+
+        $this->reindex();
+
+        return $this;
+    }
+
+    /**
+     * Return array of all category root IDs + tree root ID
+     *
+     * @return int[]
+     */
+    protected function getRootCategoryIds()
+    {
+        $rootIds = [\Magento\Catalog\Model\Category::TREE_ROOT_ID];
+        foreach ($this->storeManager->getStores() as $store) {
+            if ($this->getPathFromCategoryId($store->getRootCategoryId())) {
+                $rootIds[] = $store->getRootCategoryId();
+            }
+        }
+        return $rootIds;
+    }
+
+    /**
+     * Remove index entries before reindexation
+     */
+    protected function removeEntries()
+    {
+        $removalCategoryIds = array_diff($this->limitationByCategories, $this->getRootCategoryIds());
+        $this->getWriteAdapter()->delete(
+            $this->getMainTable(),
+            ['category_id IN (?)' => $removalCategoryIds]
+        );
+    }
+
+    /**
+     * Retrieve select for reindex products of non anchor categories
+     *
+     * @param \Magento\Core\Model\Store $store
+     * @return \Magento\DB\Select
+     */
+    protected function getNonAnchorCategoriesSelect(\Magento\Core\Model\Store $store)
+    {
+        $select = parent::getNonAnchorCategoriesSelect($store);
+        return $select->where('cc.entity_id IN (?)', $this->limitationByCategories);
+    }
+
+    /**
+     * Retrieve select for reindex products of non anchor categories
+     *
+     * @param \Magento\Core\Model\Store $store
+     * @return \Magento\DB\Select
+     */
+    protected function getAnchorCategoriesSelect(\Magento\Core\Model\Store $store)
+    {
+        $select = parent::getAnchorCategoriesSelect($store);
+        return $select->where('cc.entity_id IN (?)', $this->limitationByCategories);
+    }
+
+    /**
+     * Check whether select ranging is needed
+     *
+     * @return bool
+     */
+    protected function isRangingNeeded()
+    {
+        return false;
+    }
+
+    /**
+     * Check whether indexation of root category is needed
+     *
+     * @return bool
+     */
+    protected function isIndexRootCategoryNeeded()
+    {
+        return false;
+    }
+}
diff --git a/app/code/Magento/Catalog/Model/Indexer/Category/Product/Action/RowsFactory.php b/app/code/Magento/Catalog/Model/Indexer/Category/Product/Action/RowsFactory.php
new file mode 100644
index 00000000000..b6ef93edd39
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Indexer/Category/Product/Action/RowsFactory.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Category\Product\Action;
+
+/**
+ * Factory class for \Magento\Catalog\Model\Indexer\Category\Product\Action\Rows
+ */
+class RowsFactory
+{
+    /**
+     * Object Manager instance
+     *
+     * @var \Magento\ObjectManager
+     */
+    protected $objectManager;
+
+    /**
+     * Instance name to create
+     *
+     * @var string
+     */
+    protected $instanceName;
+
+    /**
+     * Factory constructor
+     *
+     * @param \Magento\ObjectManager $objectManager
+     * @param string $instanceName
+     */
+    public function __construct(
+        \Magento\ObjectManager $objectManager,
+        $instanceName = 'Magento\Catalog\Model\Indexer\Category\Product\Action\Rows'
+    ) {
+        $this->objectManager = $objectManager;
+        $this->instanceName = $instanceName;
+    }
+
+    /**
+     * Create class instance with specified parameters
+     *
+     * @param array $data
+     * @throws \InvalidArgumentException
+     * @return \Magento\Catalog\Model\Indexer\Category\Product\AbstractAction
+     */
+    public function create(array $data = array())
+    {
+        /** @var \Magento\Catalog\Model\Indexer\Category\Product\AbstractAction $instance */
+        $instance = $this->objectManager->create($this->instanceName, $data);
+        if (!($instance instanceof \Magento\Catalog\Model\Indexer\Category\Product\AbstractAction)) {
+            throw new \InvalidArgumentException($this->instanceName
+                . ' is not instance of \Magento\Catalog\Model\Indexer\Category\Product\AbstractAction');
+        }
+        return $instance;
+    }
+}
diff --git a/app/code/Magento/Catalog/Model/Indexer/Category/Product/Plugin/IndexerState.php b/app/code/Magento/Catalog/Model/Indexer/Category/Product/Plugin/IndexerState.php
new file mode 100644
index 00000000000..d479a618ee5
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Indexer/Category/Product/Plugin/IndexerState.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * Plugin for \Magento\Indexer\Model\Indexer\State model
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Catalog\Model\Indexer\Category\Product\Plugin;
+
+class IndexerState
+{
+    /**
+     * @var \Magento\Indexer\Model\Indexer\State
+     */
+    protected $state;
+
+    /**
+     * Related indexers IDs
+     *
+     * @var int[]
+     */
+    protected $indexerIds = array(
+        \Magento\Catalog\Model\Indexer\Product\Category::INDEXER_ID,
+        \Magento\Catalog\Model\Indexer\Category\Product::INDEXER_ID
+    );
+
+    /**
+     * @param \Magento\Indexer\Model\Indexer\State $state
+     */
+    public function __construct(\Magento\Indexer\Model\Indexer\State $state)
+    {
+        $this->state = $state;
+    }
+
+    /**
+     * Synchronize status for indexers
+     *
+     * @param \Magento\Indexer\Model\Indexer\State $state
+     * @return \Magento\Indexer\Model\Indexer\State
+     */
+    public function afterSetStatus(\Magento\Indexer\Model\Indexer\State $state)
+    {
+        if (in_array($state->getIndexerId(), $this->indexerIds)) {
+            $indexerId = $state->getIndexerId() == \Magento\Catalog\Model\Indexer\Category\Product::INDEXER_ID
+                ? \Magento\Catalog\Model\Indexer\Product\Category::INDEXER_ID
+                : \Magento\Catalog\Model\Indexer\Category\Product::INDEXER_ID;
+
+            $relatedIndexerState = $this->state->loadByIndexer($indexerId);
+
+            $relatedIndexerState->setData('status', $state->getStatus());
+            $relatedIndexerState->save();
+        }
+
+        return $state;
+    }
+}
diff --git a/app/code/Magento/Catalog/Model/Indexer/Category/Product/Plugin/MviewState.php b/app/code/Magento/Catalog/Model/Indexer/Category/Product/Plugin/MviewState.php
new file mode 100644
index 00000000000..c3c3a3b304c
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Indexer/Category/Product/Plugin/MviewState.php
@@ -0,0 +1,99 @@
+<?php
+/**
+ * Plugin for \Magento\Mview\View\StateInterface model
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Catalog\Model\Indexer\Category\Product\Plugin;
+
+class MviewState
+{
+    /**
+     * @var \Magento\Mview\View\StateInterface
+     */
+    protected $state;
+
+    /**
+     * @var \Magento\Mview\View\ChangelogInterface
+     */
+    protected $changelog;
+
+    /**
+     * Related indexers IDs
+     *
+     * @var int[]
+     */
+    protected $viewIds = array(
+        \Magento\Catalog\Model\Indexer\Category\Product::INDEXER_ID,
+        \Magento\Catalog\Model\Indexer\Product\Category::INDEXER_ID
+    );
+
+    /**
+     * @param \Magento\Mview\View\StateInterface $state
+     * @param \Magento\Mview\View\ChangelogInterface $changelog
+     */
+    public function __construct(
+        \Magento\Mview\View\StateInterface $state,
+        \Magento\Mview\View\ChangelogInterface $changelog
+    ) {
+        $this->state = $state;
+        $this->changelog = $changelog;
+    }
+
+    /**
+     * Synchronize status for view
+     *
+     * @param \Magento\Mview\View\StateInterface $state
+     * @return \Magento\Mview\View\StateInterface
+     */
+    public function afterSetStatus(\Magento\Mview\View\StateInterface $state)
+    {
+        if (in_array($state->getViewId(), $this->viewIds)) {
+            $viewId = $state->getViewId() == \Magento\Catalog\Model\Indexer\Category\Product::INDEXER_ID
+                ? \Magento\Catalog\Model\Indexer\Product\Category::INDEXER_ID
+                : \Magento\Catalog\Model\Indexer\Category\Product::INDEXER_ID;
+
+            $relatedViewState = $this->state->loadByView($viewId);
+
+            // if equals nothing to change
+            if ($relatedViewState->getMode() == \Magento\Mview\View\StateInterface::MODE_DISABLED
+                || $state->getStatus() == $relatedViewState->getStatus()
+            ) {
+                return $state;
+            }
+
+            // suspend
+            if ($state->getStatus() == \Magento\Mview\View\StateInterface::STATUS_SUSPENDED) {
+                $relatedViewState->setStatus(\Magento\Mview\View\StateInterface::STATUS_SUSPENDED);
+                $relatedViewState->setVersionId($this->changelog->setViewId($viewId)->getVersion());
+                $relatedViewState->save();
+            } else {
+                if ($relatedViewState->getStatus() == \Magento\Mview\View\StateInterface::STATUS_SUSPENDED) {
+                    $relatedViewState->setStatus(\Magento\Mview\View\StateInterface::STATUS_IDLE);
+                    $relatedViewState->save();
+                }
+            }
+        }
+
+        return $state;
+    }
+}
diff --git a/app/code/Magento/Catalog/Model/Indexer/Category/Flat/Plugin/AbstractStore.php b/app/code/Magento/Catalog/Model/Indexer/Category/Product/Plugin/StoreGroup.php
similarity index 60%
rename from app/code/Magento/Catalog/Model/Indexer/Category/Flat/Plugin/AbstractStore.php
rename to app/code/Magento/Catalog/Model/Indexer/Category/Product/Plugin/StoreGroup.php
index 0676aed5d2c..3e5d5b02a50 100644
--- a/app/code/Magento/Catalog/Model/Indexer/Category/Flat/Plugin/AbstractStore.php
+++ b/app/code/Magento/Catalog/Model/Indexer/Category/Product/Plugin/StoreGroup.php
@@ -21,30 +21,22 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-namespace Magento\Catalog\Model\Indexer\Category\Flat\Plugin;
+namespace Magento\Catalog\Model\Indexer\Category\Product\Plugin;
 
-class AbstractStore
+class StoreGroup
 {
     /**
      * @var \Magento\Indexer\Model\IndexerInterface
      */
     protected $indexer;
 
-    /**
-     * @var \Magento\Catalog\Model\Indexer\Category\Flat\State
-     */
-    protected $state;
-
     /**
      * @param \Magento\Indexer\Model\IndexerInterface $indexer
-     * @param \Magento\Catalog\Model\Indexer\Category\Flat\State $state
      */
     public function __construct(
-        \Magento\Indexer\Model\IndexerInterface $indexer,
-        \Magento\Catalog\Model\Indexer\Category\Flat\State $state
+        \Magento\Indexer\Model\IndexerInterface $indexer
     ) {
         $this->indexer = $indexer;
-        $this->state = $state;
     }
 
     /**
@@ -55,18 +47,38 @@ class AbstractStore
     protected function getIndexer()
     {
         if (!$this->indexer->getId()) {
-            $this->indexer->load(\Magento\Catalog\Model\Indexer\Category\Flat\State::INDEXER_ID);
+            $this->indexer->load(\Magento\Catalog\Model\Indexer\Category\Product::INDEXER_ID);
         }
         return $this->indexer;
     }
 
     /**
-     * Invalidate indexer
+     * Process to invalidate indexer
+     *
+     * @param array $arguments
+     * @param \Magento\Code\Plugin\InvocationChain $invocationChain
+     * @return \Magento\Core\Model\Resource\Db\AbstractDb
      */
-    protected function invalidateIndexer()
+    public function aroundSave(array $arguments, \Magento\Code\Plugin\InvocationChain $invocationChain)
     {
-        if ($this->state->isFlatEnabled()) {
+        $needInvalidating = $this->validate($arguments[0]);
+        $objectResource = $invocationChain->proceed($arguments);
+        if ($needInvalidating) {
             $this->getIndexer()->invalidate();
         }
+
+        return $objectResource;
+    }
+
+    /**
+     * Validate changes for invalidating indexer
+     *
+     * @param \Magento\Core\Model\AbstractModel $group
+     * @return bool
+     */
+    protected function validate(\Magento\Core\Model\AbstractModel $group)
+    {
+        return ($group->dataHasChangedFor('website_id') || $group->dataHasChangedFor('root_category_id'))
+            && !$group->isObjectNew();
     }
 }
diff --git a/app/code/Magento/Catalog/Model/Indexer/Category/Product/Plugin/StoreView.php b/app/code/Magento/Catalog/Model/Indexer/Category/Product/Plugin/StoreView.php
new file mode 100644
index 00000000000..2e681093fc6
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Indexer/Category/Product/Plugin/StoreView.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *   
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Catalog\Model\Indexer\Category\Product\Plugin;
+
+class StoreView extends StoreGroup
+{
+    /**
+     * Validate changes for invalidating indexer
+     *
+     * @param \Magento\Core\Model\AbstractModel $store
+     * @return bool
+     */
+    protected function validate(\Magento\Core\Model\AbstractModel $store)
+    {
+        return $store->isObjectNew() || $store->dataHasChangedFor('group_id');
+    }
+}
diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Category.php b/app/code/Magento/Catalog/Model/Indexer/Product/Category.php
new file mode 100644
index 00000000000..f6d6a535034
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Indexer/Product/Category.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Product;
+
+class Category extends \Magento\Catalog\Model\Indexer\Category\Product
+{
+    /**
+     * Indexer ID in configuration
+     */
+    const INDEXER_ID = 'catalog_product_category';
+
+    /**
+     * @param \Magento\Catalog\Model\Indexer\Category\Product\Action\FullFactory $fullActionFactory
+     * @param Category\Action\RowsFactory $rowsActionFactory
+     * @param \Magento\Indexer\Model\IndexerInterface $indexer
+     */
+    public function __construct(
+        \Magento\Catalog\Model\Indexer\Category\Product\Action\FullFactory $fullActionFactory,
+        Category\Action\RowsFactory $rowsActionFactory,
+        \Magento\Indexer\Model\IndexerInterface $indexer
+    ) {
+        parent::__construct($fullActionFactory, $rowsActionFactory, $indexer);
+    }
+}
diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Category/Action/Rows.php b/app/code/Magento/Catalog/Model/Indexer/Product/Category/Action/Rows.php
new file mode 100644
index 00000000000..2b34680dada
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Indexer/Product/Category/Action/Rows.php
@@ -0,0 +1,111 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Product\Category\Action;
+
+class Rows extends \Magento\Catalog\Model\Indexer\Category\Product\AbstractAction
+{
+    /**
+     * Limitation by products
+     *
+     * @var int[]
+     */
+    protected $limitationByProducts;
+
+    /**
+     * Refresh entities index
+     *
+     * @param int[] $entityIds
+     * @param bool $useTempTable
+     * @return $this
+     */
+    public function execute(array $entityIds = array(), $useTempTable = false)
+    {
+        $this->limitationByProducts = $entityIds;
+        $this->useTempTable = $useTempTable;
+
+        $this->removeEntries();
+
+        $this->reindex();
+
+        return $this;
+    }
+
+    /**
+     * Remove index entries before reindexation
+     */
+    protected function removeEntries()
+    {
+        $this->getWriteAdapter()->delete(
+            $this->getMainTable(),
+            ['product_id IN (?)' => $this->limitationByProducts]
+        );
+    }
+
+    /**
+     * Retrieve select for reindex products of non anchor categories
+     *
+     * @param \Magento\Core\Model\Store $store
+     * @return \Magento\DB\Select
+     */
+    protected function getNonAnchorCategoriesSelect(\Magento\Core\Model\Store $store)
+    {
+        $select = parent::getNonAnchorCategoriesSelect($store);
+        return $select->where('ccp.product_id IN (?)', $this->limitationByProducts);
+    }
+
+    /**
+     * Retrieve select for reindex products of non anchor categories
+     *
+     * @param \Magento\Core\Model\Store $store
+     * @return \Magento\DB\Select
+     */
+    protected function getAnchorCategoriesSelect(\Magento\Core\Model\Store $store)
+    {
+        $select = parent::getAnchorCategoriesSelect($store);
+        return $select->where('ccp.product_id IN (?)', $this->limitationByProducts);
+    }
+
+    /**
+     * Get select for all products
+     *
+     * @param \Magento\Core\Model\Store $store
+     * @return \Magento\DB\Select
+     */
+    protected function getAllProducts(\Magento\Core\Model\Store $store)
+    {
+        $select = parent::getAllProducts($store);
+        return $select->where('cp.entity_id IN (?)', $this->limitationByProducts);
+    }
+
+    /**
+     * Check whether select ranging is needed
+     *
+     * @return bool
+     */
+    protected function isRangingNeeded()
+    {
+        return false;
+    }
+}
diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Category/Action/RowsFactory.php b/app/code/Magento/Catalog/Model/Indexer/Product/Category/Action/RowsFactory.php
new file mode 100644
index 00000000000..3b8b40f9837
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Indexer/Product/Category/Action/RowsFactory.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Product\Category\Action;
+
+/**
+ * Factory class for \Magento\Catalog\Model\Indexer\Product\Category\Action\Rows
+ */
+class RowsFactory extends \Magento\Catalog\Model\Indexer\Category\Product\Action\RowsFactory
+{
+    /**
+     * Factory constructor
+     *
+     * @param \Magento\ObjectManager $objectManager
+     * @param string $instanceName
+     */
+    public function __construct(
+        \Magento\ObjectManager $objectManager,
+        $instanceName = 'Magento\Catalog\Model\Indexer\Product\Category\Action\Rows'
+    ) {
+        parent::__construct($objectManager, $instanceName);
+    }
+}
diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Flat.php b/app/code/Magento/Catalog/Model/Indexer/Product/Flat.php
new file mode 100644
index 00000000000..588ad0ebefa
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Indexer/Product/Flat.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Product;
+
+class Flat implements \Magento\Indexer\Model\ActionInterface, \Magento\Mview\ActionInterface
+{
+    /**
+     * @var \Magento\Catalog\Model\Indexer\Product\Flat\Action\Row
+     */
+    protected $_productFlatIndexerRow;
+
+    /**
+     * @var \Magento\Catalog\Model\Indexer\Product\Flat\Action\Rows
+     */
+    protected $_productFlatIndexerRows;
+
+    /**
+     * @var \Magento\Catalog\Model\Indexer\Product\Flat\Action\Full
+     */
+    protected $_productFlatIndexerFull;
+
+    /**
+     * @param Flat\Action\Row $productFlatIndexerRow
+     * @param Flat\Action\Rows $productFlatIndexerRows
+     * @param Flat\Action\Full $productFlatIndexerFull
+     */
+    public function __construct(
+        \Magento\Catalog\Model\Indexer\Product\Flat\Action\Row $productFlatIndexerRow,
+        \Magento\Catalog\Model\Indexer\Product\Flat\Action\Rows $productFlatIndexerRows,
+        \Magento\Catalog\Model\Indexer\Product\Flat\Action\Full $productFlatIndexerFull
+    ) {
+        $this->_productFlatIndexerRow = $productFlatIndexerRow;
+        $this->_productFlatIndexerRows = $productFlatIndexerRows;
+        $this->_productFlatIndexerFull = $productFlatIndexerFull;
+    }
+
+    /**
+     * Execute materialization on ids entities
+     *
+     * @param int[] $ids
+     */
+    public function execute($ids)
+    {
+        $this->_productFlatIndexerRows->execute($ids);
+    }
+
+    /**
+     * Execute full indexation
+     */
+    public function executeFull()
+    {
+        $this->_productFlatIndexerFull->execute();
+    }
+
+    /**
+     * Execute partial indexation by ID list
+     *
+     * @param int[] $ids
+     */
+    public function executeList($ids)
+    {
+        $this->_productFlatIndexerRows->execute($ids);
+    }
+
+    /**
+     * Execute partial indexation by ID
+     *
+     * @param int $id
+     */
+    public function executeRow($id)
+    {
+        $this->_productFlatIndexerRow->execute($id);
+    }
+}
diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Flat/AbstractAction.php b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/AbstractAction.php
new file mode 100644
index 00000000000..5c9feef1f8e
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/AbstractAction.php
@@ -0,0 +1,1215 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Catalog\Model\Indexer\Product\Flat;
+
+/**
+ * Abstract action reindex class
+ *
+ * @package Magento\Catalog\Model\Indexer\Product\Flat
+ */
+abstract class AbstractAction
+{
+    /**
+     * Path to maximum available amount of indexes for flat indexer
+     */
+    const XML_NODE_MAX_INDEX_COUNT  = 'catalog/product/flat/max_index_count';
+
+    /**
+     * Maximum size of attributes chunk
+     */
+    const ATTRIBUTES_CHUNK_SIZE = 59;
+
+    /**
+     * Suffix for value field on composite attributes
+     *
+     * @var string
+     */
+    protected $_valueFieldSuffix = '_value';
+
+    /**
+     * Logger instance
+     *
+     * @var \Magento\Logger
+     */
+    protected $_logger;
+
+    /**
+     * Resource instance
+     *
+     * @var \Magento\App\Resource
+     */
+    protected $_resource;
+
+    /**
+     * @var \Magento\Core\Model\StoreManagerInterface
+     */
+    protected $_storeManager;
+
+    /**
+     * Catalog resource helper
+     *
+     * @var \Magento\Catalog\Model\Resource\Helper
+     */
+    protected $_resourceHelper;
+
+    /**
+     * Core store config
+     *
+     * @var \Magento\Core\Model\Store\ConfigInterface
+     */
+    protected $_coreStoreConfig;
+
+    /**
+     * Current store number representation
+     *
+     * @var int
+     */
+    protected $_storeId;
+
+    /**
+     * Suffix for drop table (uses on flat table rename)
+     *
+     * @var string
+     */
+    protected $_tableDropSuffix = '_drop_indexer';
+
+    /**
+     * @var \Magento\Catalog\Helper\Product\Flat\Indexer
+     */
+    protected $_productIndexerHelper;
+
+    /**
+     * Core data
+     *
+     * @var \Magento\Core\Helper\Data
+     */
+    protected $_coreData;
+
+    /**
+     * Product flat helper
+     *
+     * @var \Magento\Catalog\Helper\Product\Flat
+     */
+    protected $_productFlatHelper;
+
+    /**
+     * @var \Magento\DB\Adapter\AdapterInterface
+     */
+    protected $_connection;
+
+    /**
+     * @var \Magento\Catalog\Model\Product\Type
+     */
+    protected $_productType;
+
+    /**
+     * Existing flat tables flags pool
+     *
+     * @var array
+     */
+    protected $_flatTablesExist = array();
+
+    /**
+     * Contains list of created "value" tables
+     *
+     * @var array
+     */
+    protected $_valueTables = array();
+
+    /**
+     * List of product types available in installation
+     *
+     * @var array
+     */
+    protected $_productTypes = array();
+
+    /**
+     * Calls amount during current session
+     *
+     * @var int
+     */
+    protected static $_calls = 0;
+
+    /**
+     * @var \Magento\App\ConfigInterface $config
+     */
+    protected $_config;
+
+    /**
+     * @var \Magento\Catalog\Helper\Product\Flat
+     */
+    protected $_flatProductHelper;
+
+    /**
+     * @var \Magento\Catalog\Model\Indexer\Product\Flat\Processor
+     */
+    protected $_flatProductProcessor;
+
+    /**
+     * @param \Magento\Logger $logger
+     * @param \Magento\App\Resource $resource
+     * @param \Magento\Core\Model\StoreManagerInterface $storeManager
+     * @param \Magento\Catalog\Model\Resource\Helper $resourceHelper
+     * @param \Magento\Core\Model\Store\ConfigInterface $coreStoreConfig
+     * @param \Magento\Catalog\Helper\Product\Flat\Indexer $productHelper
+     * @param \Magento\Catalog\Model\Product\Type $productType
+     * @param \Magento\App\ConfigInterface $config
+     * @param \Magento\Catalog\Helper\Product\Flat $flatProductHelper
+     * @param Processor $flatProductProcessor
+     */
+    public function __construct(
+        \Magento\Logger $logger,
+        \Magento\App\Resource $resource,
+        \Magento\Core\Model\StoreManagerInterface $storeManager,
+        \Magento\Catalog\Model\Resource\Helper $resourceHelper,
+        \Magento\Core\Model\Store\ConfigInterface $coreStoreConfig,
+        \Magento\Catalog\Helper\Product\Flat\Indexer $productHelper,
+        \Magento\Catalog\Model\Product\Type $productType,
+        \Magento\App\ConfigInterface $config,
+        \Magento\Catalog\Helper\Product\Flat $flatProductHelper,
+        \Magento\Catalog\Model\Indexer\Product\Flat\Processor $flatProductProcessor
+    ) {
+        $this->_logger = $logger;
+        $this->_resource = $resource;
+        $this->_storeManager = $storeManager;
+        $this->_resourceHelper = $resourceHelper;
+        $this->_coreStoreConfig = $coreStoreConfig;
+        $this->_productIndexerHelper = $productHelper;
+        $this->_productType = $productType;
+        $this->_config = $config;
+        $this->_connection = $resource->getConnection('default');
+        $this->_flatProductHelper = $flatProductHelper;
+        $this->_flatProductProcessor = $flatProductProcessor;
+    }
+
+    /**
+     * Execute action for given ids
+     *
+     * @param array|int $ids
+     * @return \Magento\Catalog\Model\Indexer\Product\Flat\AbstractAction
+     */
+    abstract public function execute($ids);
+
+    /**
+     * Retrieve Catalog Product Flat Table name
+     *
+     * @param int $storeId
+     * @return string
+     */
+    public function getFlatTableName($storeId)
+    {
+        return sprintf('%s_%s', $this->_connection->getTableName('catalog_product_flat'), $storeId);
+    }
+
+    /**
+     * Return temporary table name by regular table name
+     *
+     * @param string $tableName
+     *
+     * @return string
+     */
+    protected function _getTemporaryTableName($tableName)
+    {
+        return sprintf('%s_tmp_indexer', $tableName);
+    }
+
+    /**
+     * Create empty temporary table with given columns list
+     *
+     * @param string $tableName  Table name
+     * @param array $columns array('columnName' => \Magento\Catalog\Model\Resource\Eav\Attribute, ...)
+     *
+     * @return \Magento\Catalog\Model\Indexer\Product\Flat\AbstractAction
+     */
+    protected function _createTemporaryTable($tableName, array $columns)
+    {
+        if (!empty($columns)) {
+            $valueTableName      = $tableName . $this->_valueFieldSuffix;
+            $temporaryTable      = $this->_connection->newTable($tableName);
+            $valueTemporaryTable = $this->_connection->newTable($valueTableName);
+            $flatColumns         = $this->_productIndexerHelper->getFlatColumns();
+
+            $temporaryTable->addColumn(
+                'entity_id',
+                \Magento\DB\Ddl\Table::TYPE_INTEGER
+            );
+
+            $temporaryTable->addColumn(
+                'type_id',
+                \Magento\DB\Ddl\Table::TYPE_TEXT
+            );
+
+            $temporaryTable->addColumn(
+                'attribute_set_id',
+                \Magento\DB\Ddl\Table::TYPE_INTEGER
+            );
+
+            $valueTemporaryTable->addColumn(
+                'entity_id',
+                \Magento\DB\Ddl\Table::TYPE_INTEGER
+            );
+
+            /** @var $attribute \Magento\Catalog\Model\Resource\Eav\Attribute */
+            foreach ($columns as $columnName => $attribute) {
+                $attributeCode = $attribute->getAttributeCode();
+                if (isset($flatColumns[$attributeCode])) {
+                    $column = $flatColumns[$attributeCode];
+                } else {
+                    $column = $attribute->_getFlatColumnsDdlDefinition();
+                    $column = $column[$attributeCode];
+                }
+
+                $temporaryTable->addColumn(
+                    $columnName,
+                    $column['type'],
+                    isset($column['length']) ? $column['length'] : null
+                );
+
+                $columnValueName = $attributeCode . $this->_valueFieldSuffix;
+                if (isset($flatColumns[$columnValueName])) {
+                    $columnValue = $flatColumns[$columnValueName];
+                    $valueTemporaryTable->addColumn(
+                        $columnValueName,
+                        $columnValue['type'],
+                        isset($columnValue['length']) ? $columnValue['length'] : null
+                    );
+                }
+            }
+            $this->_connection->dropTemporaryTable($tableName);
+            $this->_connection->createTemporaryTable($temporaryTable);
+
+            if (count($valueTemporaryTable->getColumns()) > 1) {
+                $this->_connection->dropTemporaryTable($valueTableName);
+                $this->_connection->createTemporaryTable($valueTemporaryTable);
+                $this->_valueTables[$valueTableName] = $valueTableName;
+            }
+        }
+        return $this;
+    }
+
+    /**
+     * Fill temporary entity table
+     *
+     * @param string $tableName
+     * @param array  $columns
+     * @param array  $changedIds
+     *
+     * @return \Magento\Catalog\Model\Indexer\Product\Flat\AbstractAction
+     */
+    protected function _fillTemporaryEntityTable($tableName, array $columns, array $changedIds = array())
+    {
+        if (!empty($columns)) {
+            $select = $this->_connection->select();
+            $temporaryEntityTable = $this->_getTemporaryTableName($tableName);
+            $idsColumns = array(
+                'entity_id',
+                'type_id',
+                'attribute_set_id',
+            );
+
+            $columns = array_merge($idsColumns, array_keys($columns));
+
+            $select->from(array('e' => $tableName), $columns);
+            $onDuplicate = false;
+            if (!empty($changedIds)) {
+                $select->where(
+                    $this->_connection->quoteInto('e.entity_id IN (?)', $changedIds)
+                );
+                $onDuplicate = true;
+            }
+            $sql = $select->insertFromSelect($temporaryEntityTable, $columns, $onDuplicate);
+            $this->_connection->query($sql);
+        }
+
+        return $this;
+    }
+
+    /**
+     * Fill temporary table by data from products EAV attributes by type
+     *
+     * @param string $tableName
+     * @param array  $tableColumns
+     * @param array  $changedIds
+     *
+     * @return \Magento\Catalog\Model\Indexer\Product\Flat\AbstractAction
+     */
+    protected function _fillTemporaryTable($tableName, array $tableColumns, array $changedIds)
+    {
+        if (!empty($tableColumns)) {
+
+            $columnsChunks = array_chunk($tableColumns, self::ATTRIBUTES_CHUNK_SIZE, true);
+            foreach ($columnsChunks as $columnsList) {
+                $select                  = $this->_connection->select();
+                $selectValue             = $this->_connection->select();
+                $entityTableName         = $this->_getTemporaryTableName(
+                    $this->_productIndexerHelper->getTable('catalog_product_entity')
+                );
+                $temporaryTableName      = $this->_getTemporaryTableName($tableName);
+                $temporaryValueTableName = $temporaryTableName . $this->_valueFieldSuffix;
+                $keyColumn               = array('entity_id');
+                $columns                 = array_merge($keyColumn, array_keys($columnsList));
+                $valueColumns            = $keyColumn;
+                $flatColumns             = $this->_productIndexerHelper->getFlatColumns();
+                $iterationNum            = 1;
+
+                $select->from(
+                    array('e' => $entityTableName),
+                    $keyColumn
+                );
+
+                $selectValue->from(
+                    array('e' => $temporaryTableName),
+                    $keyColumn
+                );
+
+                /** @var $attribute \Magento\Catalog\Model\Resource\Eav\Attribute */
+                foreach ($columnsList as $columnName => $attribute) {
+                    $countTableName = 't' . $iterationNum++;
+                    $joinCondition  = sprintf(
+                        'e.entity_id = %1$s.entity_id AND %1$s.attribute_id = %2$d AND %1$s.store_id = 0',
+                        $countTableName,
+                        $attribute->getId()
+                    );
+
+                    $select->joinLeft(
+                        array($countTableName => $tableName),
+                        $joinCondition,
+                        array($columnName => 'value')
+                    );
+
+                    if ($attribute->getFlatUpdateSelect($this->_storeId) instanceof \Magento\DB\Select) {
+                        $attributeCode   = $attribute->getAttributeCode();
+                        $columnValueName = $attributeCode . $this->_valueFieldSuffix;
+                        if (isset($flatColumns[$columnValueName])) {
+                            $valueJoinCondition = sprintf(
+                                'e.%1$s = %2$s.option_id AND %2$s.store_id = 0',
+                                $attributeCode,
+                                $countTableName
+                            );
+                            $selectValue->joinLeft(
+                                array($countTableName => $this->_productIndexerHelper->getTable('eav_attribute_option_value')),
+                                $valueJoinCondition,
+                                array($columnValueName => $countTableName . '.value')
+                            );
+                            $valueColumns[] = $columnValueName;
+                        }
+                    }
+                }
+
+                if (!empty($changedIds)) {
+                    $select->where(
+                        $this->_connection->quoteInto('e.entity_id IN (?)', $changedIds)
+                    );
+                }
+
+                $sql = $select->insertFromSelect($temporaryTableName, $columns, true);
+                $this->_connection->query($sql);
+
+                if (count($valueColumns) > 1) {
+                    if (!empty($changedIds)) {
+                        $selectValue->where(
+                            $this->_connection->quoteInto('e.entity_id IN (?)', $changedIds)
+                        );
+                    }
+                    $sql = $selectValue->insertFromSelect($temporaryValueTableName, $valueColumns, true);
+                    $this->_connection->query($sql);
+                }
+            }
+        }
+
+        return $this;
+    }
+
+    /**
+     * Add primary key to table by it name
+     *
+     * @param string $tableName
+     * @param string $columnName
+     *
+     * @return \Magento\Catalog\Model\Indexer\Product\Flat\AbstractAction
+     */
+    protected function _addPrimaryKeyToTable($tableName, $columnName = 'entity_id')
+    {
+        $this->_connection->addIndex(
+            $tableName,
+            'entity_id',
+            array($columnName),
+            \Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_PRIMARY
+        );
+
+        return $this;
+    }
+
+    /**
+     * Prepare flat table for store
+     *
+     * @throws \Magento\Core\Exception
+     *
+     * @return \Magento\Catalog\Model\Indexer\Product\Flat\AbstractAction
+     */
+    protected function _createTemporaryFlatTable()
+    {
+        $columns = $this->_productIndexerHelper->getFlatColumns();
+
+        $indexesNeed  = $this->_productIndexerHelper->getFlatIndexes();
+
+        $maxIndex = $this->_config->getValue(self::XML_NODE_MAX_INDEX_COUNT);
+        if ($maxIndex && count($indexesNeed) > $maxIndex) {
+            throw new \Magento\Core\Exception(
+                __("The Flat Catalog module has a limit of %2\$d filterable and/or sortable attributes."
+                . "Currently there are %1\$d of them."
+                . "Please reduce the number of filterable/sortable attributes in order to use this module",
+                    count($indexesNeed), $maxIndex)
+            );
+        }
+
+        $indexKeys = array();
+        $indexProps = array_values($indexesNeed);
+        $upperPrimaryKey = strtoupper(\Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_PRIMARY);
+        foreach ($indexProps as $i => $indexProp) {
+            $indexName = $this->_connection->getIndexName(
+                $this->_getTemporaryTableName($this->_productIndexerHelper->getFlatTableName($this->_storeId)),
+                $indexProp['fields'],
+                $indexProp['type']
+            );
+            $indexProp['type'] = strtoupper($indexProp['type']);
+            if ($indexProp['type'] == $upperPrimaryKey) {
+                $indexKey = $upperPrimaryKey;
+            } else {
+                $indexKey = $indexName;
+            }
+
+            $indexProps[$i] = array(
+                'KEY_NAME'     => $indexName,
+                'COLUMNS_LIST' => $indexProp['fields'],
+                'INDEX_TYPE'   => strtolower($indexProp['type'])
+            );
+            $indexKeys[$i] = $indexKey;
+        }
+        $indexesNeed = array_combine($indexKeys, $indexProps);
+
+        /** @var $table \Magento\DB\Ddl\Table */
+        $table = $this->_connection->newTable(
+            $this->_getTemporaryTableName($this->_productIndexerHelper->getFlatTableName($this->_storeId))
+        );
+        foreach ($columns as $fieldName => $fieldProp) {
+            $columnLength = isset($fieldProp['length']) ? $fieldProp['length'] : null;
+
+            $columnDefinition = array(
+                'nullable' => isset($fieldProp['nullable']) ? (bool)$fieldProp['nullable'] : false,
+                'unsigned' => isset($fieldProp['unsigned']) ? (bool)$fieldProp['unsigned'] : false,
+                'default'  => isset($fieldProp['default']) ? $fieldProp['default'] : false,
+                'primary'  => false,
+            );
+
+            $columnComment = isset($fieldProp['comment']) ? $fieldProp['comment'] : $fieldName;
+
+            $table->addColumn(
+                $fieldName,
+                $fieldProp['type'],
+                $columnLength,
+                $columnDefinition,
+                $columnComment
+            );
+        }
+
+        foreach ($indexesNeed as $indexProp) {
+            $table->addIndex(
+                $indexProp['KEY_NAME'], $indexProp['COLUMNS_LIST'],
+                array('type' => $indexProp['INDEX_TYPE'])
+            );
+        }
+
+        $table->setComment("Catalog Product Flat (Store {$this->_storeId})");
+
+        $this->_connection->dropTable(
+            $this->_getTemporaryTableName($this->_productIndexerHelper->getFlatTableName($this->_storeId))
+        );
+        $this->_connection->createTable($table);
+
+        return $this;
+    }
+
+    /**
+     * Fill temporary flat table by data from temporary flat table parts
+     *
+     * @param array $tables
+     *
+     * @return \Magento\Catalog\Model\Indexer\Product\Flat\AbstractAction
+     */
+    protected function _fillTemporaryFlatTable(array $tables)
+    {
+        $select                   = $this->_connection->select();
+        $temporaryFlatTableName   = $this->_getTemporaryTableName(
+            $this->_productIndexerHelper->getFlatTableName($this->_storeId)
+        );
+        $flatColumns              = $this->_productIndexerHelper->getFlatColumns();
+        $entityTableName          = $this->_productIndexerHelper->getTable('catalog_product_entity');
+        $entityTemporaryTableName = $this->_getTemporaryTableName($entityTableName);
+        $columnsList              = array_keys($tables[$entityTableName]);
+        $websiteId                = (int)$this->_storeManager->getStore($this->_storeId)->getWebsiteId();
+
+        unset($tables[$entityTableName]);
+
+        $allColumns = array_merge(
+            array(
+                'entity_id',
+                'type_id',
+                'attribute_set_id',
+            ),
+            $columnsList
+        );
+
+        /* @var $status \Magento\Eav\Model\Entity\Attribute */
+        $status = $this->_productIndexerHelper->getAttribute('status');
+        $statusTable = $this->_getTemporaryTableName($status->getBackendTable());
+        $statusConditions = array('e.entity_id = dstatus.entity_id',
+            'dstatus.entity_type_id = ' . (int)$status->getEntityTypeId(), 'dstatus.store_id = ' . (int)$this->_storeId,
+            'dstatus.attribute_id = ' . (int)$status->getId());
+        $statusExpression = $this->_connection->getIfNullSql('dstatus.value',
+            $this->_connection->quoteIdentifier("$statusTable.status"));
+
+        $select->from(
+            array('e' => $entityTemporaryTableName),
+            $allColumns
+        )->joinInner(
+                array('wp' => $this->_productIndexerHelper->getTable('catalog_product_website')),
+                'wp.product_id = e.entity_id AND wp.website_id = ' . $websiteId,
+                array()
+            )->joinLeft(
+                array('dstatus' => $status->getBackend()->getTable()),
+                implode(' AND ', $statusConditions),
+                array()
+            )->where(
+                $statusExpression . ' = ' . \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED
+            );
+
+        foreach ($tables as $tableName => $columns) {
+            $columnValueNames        = array();
+            $temporaryTableName      = $this->_getTemporaryTableName($tableName);
+            $temporaryValueTableName = $temporaryTableName . $this->_valueFieldSuffix;
+            $columnsNames            = array_keys($columns);
+
+            $select->joinLeft(
+                $temporaryTableName,
+                'e.entity_id = ' . $temporaryTableName. '.entity_id',
+                $columnsNames
+            );
+            $allColumns = array_merge($allColumns, $columnsNames);
+
+            foreach ($columnsNames as $name ) {
+                $columnValueName = $name . $this->_valueFieldSuffix;
+                if (isset($flatColumns[$columnValueName])) {
+                    $columnValueNames[] = $columnValueName;
+                }
+            }
+            if (!empty($columnValueNames)) {
+                $select->joinLeft(
+                    $temporaryValueTableName,
+                    'e.entity_id = ' . $temporaryValueTableName. '.entity_id',
+                    $columnValueNames
+                );
+                $allColumns = array_merge($allColumns, $columnValueNames);
+            }
+        }
+        $sql = $select->insertFromSelect($temporaryFlatTableName, $allColumns, false);
+        $this->_connection->query($sql);
+
+        return $this;
+    }
+
+    /**
+     * Apply diff. between 0 store and current store to temporary flat table
+     *
+     * @param array $tables
+     * @param array $changedIds
+     *
+     * @return \Magento\Catalog\Model\Indexer\Product\Flat\AbstractAction
+     */
+    protected function _updateTemporaryTableByStoreValues(array $tables, array $changedIds)
+    {
+        $flatColumns = $this->_productIndexerHelper->getFlatColumns();
+        $temporaryFlatTableName = $this->_getTemporaryTableName(
+            $this->_productIndexerHelper->getFlatTableName($this->_storeId)
+        );
+
+        foreach ($tables as $tableName => $columns) {
+            foreach ($columns as $attribute) {
+                /* @var $attribute \Magento\Eav\Model\Entity\Attribute */
+                $attributeCode = $attribute->getAttributeCode();
+                if ($attribute->getBackend()->getType() != 'static') {
+                    $joinCondition = 't.entity_id = e.entity_id'
+                        . ' AND t.entity_type_id = ' . $attribute->getEntityTypeId()
+                        . ' AND t.attribute_id=' . $attribute->getId()
+                        . ' AND t.store_id = ' . $this->_storeId
+                        . ' AND t.value IS NOT NULL';
+                    /** @var $select \Magento\DB\Select */
+                    $select = $this->_connection->select()
+                        ->joinInner(
+                            array('t' => $tableName),
+                            $joinCondition,
+                            array($attributeCode => 't.value')
+                        );
+                    if (!empty($changedIds)) {
+                        $select->where(
+                            $this->_connection->quoteInto('e.entity_id IN (?)', $changedIds)
+                        );
+                    }
+                    $sql = $select->crossUpdateFromSelect(array('e' => $temporaryFlatTableName));
+                    $this->_connection->query($sql);
+                }
+
+                //Update not simple attributes (eg. dropdown)
+                if (isset($flatColumns[$attributeCode . $this->_valueFieldSuffix])) {
+                    $select = $this->_connection->select()
+                        ->joinInner(
+                            array('t' => $this->_productIndexerHelper->getTable('eav_attribute_option_value')),
+                            't.option_id = e.' . $attributeCode . ' AND t.store_id=' . $this->_storeId,
+                            array($attributeCode . $this->_valueFieldSuffix => 't.value')
+                        );
+                    if (!empty($changedIds)) {
+                        $select->where(
+                            $this->_connection->quoteInto('e.entity_id IN (?)', $changedIds)
+                        );
+                    }
+                    $sql = $select->crossUpdateFromSelect(array('e' => $temporaryFlatTableName));
+                    $this->_connection->query($sql);
+                }
+            }
+        }
+
+        return $this;
+    }
+
+    /**
+     * Swap flat product table and temporary flat table and drop old one
+     *
+     * @return \Magento\Catalog\Model\Indexer\Product\Flat\AbstractAction
+     */
+    protected function _moveDataToFlatTable()
+    {
+        $flatTable              = $this->_productIndexerHelper->getFlatTableName($this->_storeId);
+        $flatDropName           = $flatTable . $this->_tableDropSuffix;
+        $temporaryFlatTableName = $this->_getTemporaryTableName(
+            $this->_productIndexerHelper->getFlatTableName($this->_storeId)
+        );
+        $renameTables           = array();
+
+        if ($this->_connection->isTableExists($flatTable)) {
+            $renameTables[] = array(
+                'oldName' => $flatTable,
+                'newName' => $flatDropName,
+            );
+        }
+        $renameTables[] = array(
+            'oldName' => $temporaryFlatTableName,
+            'newName' => $flatTable,
+        );
+
+        $this->_connection->dropTable($flatDropName);
+        $this->_connection->renameTablesBatch($renameTables);
+        $this->_connection->dropTable($flatDropName);
+
+        return $this;
+    }
+
+    /**
+     * Drop temporary tables created by reindex process
+     *
+     * @param array $tablesList
+     *
+     * @return \Magento\Catalog\Model\Indexer\Product\Flat\AbstractAction
+     */
+    protected function _cleanOnFailure(array $tablesList)
+    {
+        foreach ($tablesList as $table => $columns) {
+            $this->_connection->dropTemporaryTable($table);
+        }
+        $tableName = $this->_getTemporaryTableName($this->_productIndexerHelper->getFlatTableName($this->_storeId));
+        $this->_connection->dropTable($tableName);
+        return $this;
+    }
+
+    /**
+     * Rebuild catalog flat index from scratch
+     *
+     * @param int $storeId
+     * @param array $changedIds
+     *
+     * @return \Magento\Catalog\Model\Indexer\Product\Flat\AbstractAction
+     * @throws \Exception
+     */
+    protected function _reindex($storeId, array $changedIds = array())
+    {
+        $this->_storeId     = $storeId;
+        $entityTableName    = $this->_productIndexerHelper->getTable('catalog_product_entity');
+        $attributes         = $this->_productIndexerHelper->getAttributes();
+        $eavAttributes      = $this->_productIndexerHelper->getTablesStructure($attributes);
+        $entityTableColumns = $eavAttributes[$entityTableName];
+
+        try {
+            //We should prepare temp. tables only for first call of reindex all
+            if (!self::$_calls) {
+                $temporaryEavAttributes = $eavAttributes;
+
+                //add status global value to the base table
+                /* @var $status \Magento\Eav\Model\Entity\Attribute */
+                $status = $this->_productIndexerHelper->getAttribute('status');
+                $temporaryEavAttributes[$status->getBackendTable()]['status'] = $status;
+                //Create list of temporary tables based on available attributes attributes
+                foreach ($temporaryEavAttributes as $tableName => $columns) {
+                    $this->_createTemporaryTable($this->_getTemporaryTableName($tableName), $columns);
+                }
+
+                //Fill "base" table which contains all available products
+                $this->_fillTemporaryEntityTable($entityTableName, $entityTableColumns, $changedIds);
+
+                //Add primary key to "base" temporary table for increase speed of joins in future
+                $this->_addPrimaryKeyToTable($this->_getTemporaryTableName($entityTableName));
+                unset($temporaryEavAttributes[$entityTableName]);
+
+                foreach ($temporaryEavAttributes as $tableName => $columns) {
+                    $temporaryTableName = $this->_getTemporaryTableName($tableName);
+
+                    //Add primary key to temporary table for increase speed of joins in future
+                    $this->_addPrimaryKeyToTable($temporaryTableName);
+
+                    //Create temporary table for composite attributes
+                    if (isset($this->_valueTables[$temporaryTableName . $this->_valueFieldSuffix])) {
+                        $this->_addPrimaryKeyToTable($temporaryTableName . $this->_valueFieldSuffix);
+                    }
+
+                    //Fill temporary tables with attributes grouped by it type
+                    $this->_fillTemporaryTable($tableName, $columns, $changedIds);
+                }
+            }
+            //Create and fill flat temporary table
+            $this->_createTemporaryFlatTable();
+            $this->_fillTemporaryFlatTable($eavAttributes);
+            //Update zero based attributes by values from current store
+            $this->_updateTemporaryTableByStoreValues($eavAttributes, $changedIds);
+
+            //Rename current flat table to "drop", rename temporary flat to flat and drop "drop" table
+            $this->_moveDataToFlatTable();
+            $this->_updateRelationProducts($this->_storeId, $changedIds);
+            $this->_cleanRelationProducts($this->_storeId);
+            self::$_calls++;
+        } catch (\Exception $e) {
+            $this->_cleanOnFailure($eavAttributes);
+            throw $e;
+        }
+
+        return $this;
+    }
+
+    /**
+     * Remove products from flat that are not exist
+     *
+     * @param array $ids
+     * @param int $storeId
+     */
+    protected function _removeDeletedProducts(array &$ids, $storeId)
+    {
+        $select = $this->_connection->select()
+            ->from($this->_productIndexerHelper->getTable('catalog_product_entity'))
+            ->where('entity_id IN(?)', $ids);
+        $result = $this->_connection->query($select);
+
+        $existentProducts = [];
+        foreach ($result->fetchAll()as $product) {
+            $existentProducts[] = $product['entity_id'];
+        }
+
+        $productsToDelete = array_diff($ids, $existentProducts);
+        $ids = $existentProducts;
+
+        $this->deleteProductsFromStore($productsToDelete, $storeId);
+    }
+
+    /**
+     * Retrieve Product Type Instances
+     * as key - type code, value - instance model
+     *
+     * @return array
+     */
+    protected function _getProductTypeInstances()
+    {
+        if ($this->_productTypes === null) {
+            $this->_productTypes = array();
+            $productEmulator     = new \Magento\Object();
+            foreach (array_keys($this->_productType->getTypes()) as $typeId) {
+                $productEmulator->setTypeId($typeId);
+                $this->_productTypes[$typeId] = $this->_productType->factory($productEmulator);
+            }
+        }
+        return $this->_productTypes;
+    }
+
+    /**
+     * Update relation products
+     *
+     * @param int $storeId
+     * @param int|array $productIds Update child product(s) only
+     * @return \Magento\Catalog\Model\Indexer\Product\Flat\AbstractAction
+     */
+    protected function _updateRelationProducts($storeId, $productIds = null)
+    {
+        if (!$this->_flatProductHelper->isAddChildData() || !$this->_isFlatTableExists($storeId)) {
+            return $this;
+        }
+
+        foreach ($this->_getProductTypeInstances() as $typeInstance) {
+            /** @var $typeInstance \Magento\Catalog\Model\Product\Type\AbstractType */
+            if (!$typeInstance->isComposite(null)) {
+                continue;
+            }
+            $relation = $typeInstance->getRelationInfo();
+            if ($relation
+                && $relation->getTable()
+                && $relation->getParentFieldName()
+                && $relation->getChildFieldName()
+            ) {
+                $columns   = $this->_productIndexerHelper->getFlatColumns();
+                $fieldList = array_keys($columns);
+                unset($columns['entity_id']);
+                unset($columns['child_id']);
+                unset($columns['is_child']);
+                /** @var $select \Magento\DB\Select */
+                $select = $this->_connection->select()
+                    ->from(
+                        array('t' => $this->_productIndexerHelper->getTable($relation->getTable())),
+                        array($relation->getParentFieldName(), $relation->getChildFieldName(), new \Zend_Db_Expr('1')))
+                    ->join(
+                        array('e' => $this->_productIndexerHelper->getFlatTableName($storeId)),
+                        "e.entity_id = t.{$relation->getChildFieldName()}",
+                        array_keys($columns)
+                    );
+                if ($relation->getWhere() !== null) {
+                    $select->where($relation->getWhere());
+                }
+                if ($productIds !== null) {
+                    $cond = array(
+                        $this->_connection->quoteInto("{$relation->getChildFieldName()} IN(?)", $productIds),
+                        $this->_connection->quoteInto("{$relation->getParentFieldName()} IN(?)", $productIds)
+                    );
+
+                    $select->where(implode(' OR ', $cond));
+                }
+                $sql = $select->insertFromSelect($this->_productIndexerHelper->getFlatTableName($storeId), $fieldList);
+                $this->_connection->query($sql);
+            }
+        }
+
+        return $this;
+    }
+
+    /**
+     * Clean unused relation products
+     *
+     * @param int $storeId
+     * @return \Magento\Catalog\Model\Indexer\Product\Flat\AbstractAction
+     */
+    protected function _cleanRelationProducts($storeId)
+    {
+        if (!$this->_flatProductHelper->isAddChildData()) {
+            return $this;
+        }
+
+        foreach ($this->_getProductTypeInstances() as $typeInstance) {
+            /** @var $typeInstance \Magento\Catalog\Model\Product\Type\AbstractType */
+            if (!$typeInstance->isComposite(null)) {
+                continue;
+            }
+            $relation = $typeInstance->getRelationInfo();
+            if ($relation
+                && $relation->getTable()
+                && $relation->getParentFieldName()
+                && $relation->getChildFieldName()
+            ) {
+                $select = $this->_connection->select()
+                    ->distinct(true)
+                    ->from(
+                        $this->_productIndexerHelper->getTable($relation->getTable()),
+                        "{$relation->getParentFieldName()}"
+                    );
+                $joinLeftCond = array(
+                    "e.entity_id = t.{$relation->getParentFieldName()}",
+                    "e.child_id = t.{$relation->getChildFieldName()}"
+                );
+                if ($relation->getWhere() !== null) {
+                    $select->where($relation->getWhere());
+                    $joinLeftCond[] = $relation->getWhere();
+                }
+
+                $entitySelect = new \Zend_Db_Expr($select->__toString());
+                /** @var $select \Magento\DB\Select */
+                $select = $this->_connection->select()
+                    ->from(array('e' => $this->_productIndexerHelper->getFlatTableName($storeId)), null)
+                    ->joinLeft(
+                        array('t' => $this->_productIndexerHelper->getTable($relation->getTable())),
+                        implode(' AND ', $joinLeftCond),
+                        array()
+                    )
+                    ->where('e.is_child = ?', 1)
+                    ->where('e.entity_id IN(?)', $entitySelect)
+                    ->where("t.{$relation->getChildFieldName()} IS NULL");
+
+                $sql = $select->deleteFromSelect('e');
+                $this->_connection->query($sql);
+            }
+        }
+
+        return $this;
+    }
+
+    /**
+     * Reindex single product into flat product table
+     *
+     * @param int $storeId
+     * @param int $productId
+     * @return \Magento\Catalog\Model\Indexer\Product\Flat
+     */
+    protected function _reindexSingleProduct($storeId, $productId)
+    {
+        $this->_storeId = $storeId;
+
+        $flatTable = $this->_productIndexerHelper->getFlatTableName($this->_storeId);
+
+        if (!$this->_connection->isTableExists($flatTable)) {
+            $this->_createTemporaryFlatTable();
+            $this->_moveDataToFlatTable();
+        }
+
+        $attributes    = $this->_productIndexerHelper->getAttributes();
+        $eavAttributes = $this->_productIndexerHelper->getTablesStructure($attributes);
+        $updateData    = array();
+        $describe      = $this->_connection->describeTable($flatTable);
+
+        foreach ($eavAttributes as $tableName => $tableColumns) {
+            $columnsChunks = array_chunk($tableColumns, self::ATTRIBUTES_CHUNK_SIZE, true);
+
+            foreach ($columnsChunks as $columns) {
+                $select      = $this->_connection->select();
+                $selectValue = $this->_connection->select();
+                $keyColumns  = array(
+                    'entity_id'    => 'e.entity_id',
+                    'attribute_id' => 't.attribute_id',
+                    'value'        =>  $this->_connection->getIfNullSql('`t2`.`value`', '`t`.`value`'),
+                );
+
+                if ($tableName != $this->_productIndexerHelper->getTable('catalog_product_entity')) {
+                    $valueColumns = array();
+                    $ids          = array();
+                    $select->from(
+                        array('e' => $this->_productIndexerHelper->getTable('catalog_product_entity')),
+                        $keyColumns
+                    );
+
+                    $selectValue->from(
+                        array('e' => $this->_productIndexerHelper->getTable('catalog_product_entity')),
+                        $keyColumns
+                    );
+
+                    /** @var $attribute \Magento\Catalog\Model\Resource\Eav\Attribute */
+                    foreach ($columns as $columnName => $attribute) {
+                        if (isset($describe[$columnName])) {
+                            $ids[$attribute->getId()] = $columnName;
+                        }
+                    }
+
+                    $select->joinLeft(
+                        array('t' => $tableName),
+                        'e.entity_id = t.entity_id '
+                        . $this->_connection->quoteInto(' AND t.attribute_id IN (?)', array_keys($ids))
+                        . ' AND t.store_id = 0',
+                        array()
+                    )->joinLeft(
+                            array('t2' => $tableName),
+                            't.entity_id = t2.entity_id '
+                            . ' AND t.attribute_id = t2.attribute_id  '
+                            . $this->_connection->quoteInto(' AND t2.store_id = ?', $this->_storeId),
+                            array()
+                        )->where(
+                            'e.entity_id = ' . $productId
+                        )->where(
+                            't.attribute_id IS NOT NULL'
+                        );
+                    $cursor = $this->_connection->query($select);
+                    while ($row = $cursor->fetch(\Zend_Db::FETCH_ASSOC)) {
+                        $updateData[$ids[$row['attribute_id']]] = $row['value'];
+                        $valueColumnName = $ids[$row['attribute_id']] . $this->_valueFieldSuffix;
+                        if (isset($describe[$valueColumnName])) {
+                            $valueColumns[$row['value']] = $valueColumnName;
+                        }
+                    }
+
+                    //Update not simple attributes (eg. dropdown)
+                    if (!empty($valueColumns)) {
+                        $valueIds = array_keys($valueColumns);
+
+                        $select = $this->_connection->select()
+                            ->from(
+                                array('t' => $this->_productIndexerHelper->getTable('eav_attribute_option_value')),
+                                array('t.option_id', 't.value')
+                            )->where(
+                                $this->_connection->quoteInto('t.option_id IN (?)', $valueIds)
+                            );
+                        $cursor = $this->_connection->query($select);
+                        while ($row = $cursor->fetch(\Zend_Db::FETCH_ASSOC)) {
+                            $valueColumnName = $valueColumns[$row['option_id']];
+                            if (isset($describe[$valueColumnName])) {
+                                $updateData[$valueColumnName] = $row['value'];
+                            }
+                        }
+                    }
+
+                } else {
+                    $columnNames   = array_keys($columns);
+                    $columnNames[] = 'attribute_set_id';
+                    $columnNames[] = 'type_id';
+                    $select->from(
+                        array('e' => $this->_productIndexerHelper->getTable('catalog_product_entity')),
+                        $columnNames
+                    )->where(
+                            'e.entity_id = ' . $productId
+                        );
+                    $cursor = $this->_connection->query($select);
+                    $row    = $cursor->fetch(\Zend_Db::FETCH_ASSOC);
+                    if (!empty($row)) {
+                        foreach ($row as $columnName => $value) {
+                            $updateData[$columnName] = $value;
+                        }
+                    }
+                }
+            }
+        }
+
+        if (!empty($updateData)) {
+            $updateData += array('entity_id' => $productId);
+            $updateFields = array();
+            foreach ($updateData as $key => $value) {
+                $updateFields[$key] = $key;
+            }
+            $this->_connection->insertOnDuplicate($flatTable, $updateData, $updateFields);
+        }
+
+        return $this;
+    }
+
+    /**
+     * Delete products from flat table(s)
+     *
+     * @param int|array $productId
+     * @param null|int $storeId
+     */
+    public function deleteProductsFromStore($productId, $storeId = null)
+    {
+        if (!is_array($productId)) {
+            $productId = array($productId);
+        }
+        if (null === $storeId) {
+            foreach ($this->_storeManager->getStores() as $store) {
+                $this->_connection->delete(
+                    $this->_productIndexerHelper->getFlatTableName($store->getId()),
+                    array('entity_id IN(?)' => $productId)
+                );
+            }
+        } else {
+            $this->_connection->delete(
+                $this->_productIndexerHelper->getFlatTableName((int)$storeId),
+                array('entity_id IN(?)' => $productId)
+            );
+        }
+    }
+
+    /**
+     * Check is flat table for store exists
+     *
+     * @param int $storeId
+     * @return bool
+     */
+    protected function _isFlatTableExists($storeId)
+    {
+        if (!isset($this->_flatTablesExist[$storeId])) {
+            $tableName     = $this->getFlatTableName($storeId);
+            $isTableExists = $this->_connection->isTableExists($tableName);
+
+            $this->_flatTablesExist[$storeId] = $isTableExists ? true : false;
+        }
+
+        return $this->_flatTablesExist[$storeId];
+    }
+
+    /**
+     * set valid state
+     *
+     * @param $versionId
+     */
+    protected function _setValidState($versionId)
+    {
+        $this->_flatProductProcessor
+            ->getIndexer()
+            ->getView()
+            ->getState()
+            ->setStatus(\Magento\Indexer\Model\Indexer\State::STATUS_VALID)
+            ->setVersionId($versionId)
+            ->save();
+        $this->_flatProductProcessor
+            ->getIndexer()
+            ->getView()
+            ->getChangelog()
+            ->clear($versionId);
+    }
+
+    /**
+     * Set invalid state
+     */
+    protected function _setInvalidState()
+    {
+        $this->_flatProductProcessor->markIndexerAsInvalid();
+    }
+
+    /**
+     * set processing state
+     */
+    protected function _setProcessingState()
+    {
+        $this->_flatProductProcessor
+            ->getIndexer()
+            ->getState()
+            ->setStatus(\Magento\Indexer\Model\Indexer\State::STATUS_WORKING);
+    }
+
+    /**
+     * Is indexer processing
+     *
+     * @return bool
+     */
+    protected function _isProcessing()
+    {
+        return $this->_flatProductProcessor->getIndexer()->isWorking();
+    }
+}
diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Action/Full.php b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Action/Full.php
new file mode 100644
index 00000000000..ef9a832e270
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Action/Full.php
@@ -0,0 +1,54 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Catalog\Model\Indexer\Product\Flat\Action;
+/**
+ * Class Full reindex action
+ *
+ * @package Magento\Catalog\Model\Indexer\Product\Flat\Action
+ */
+class Full extends \Magento\Catalog\Model\Indexer\Product\Flat\AbstractAction
+{
+    /**
+     * Execute full reindex action
+     *
+     * @param null|array $ids
+     *
+     * @return \Magento\Catalog\Model\Indexer\Product\Flat\Action\Full
+     * @throws \Magento\Exception
+     * @throws \Exception
+     */
+    public function execute($ids = null)
+    {
+        try {
+            foreach ($this->_storeManager->getStores() as $store) {
+                $this->_reindex($store->getId());
+            }
+        } catch (\Exception $e) {
+            throw new \Magento\Core\Exception($e->getMessage(), $e->getCode(), $e);
+        }
+        return $this;
+    }
+}
diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Action/Row.php b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Action/Row.php
new file mode 100644
index 00000000000..48cd61eba63
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Action/Row.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Catalog\Model\Indexer\Product\Flat\Action;
+
+/**
+ * Class Row reindex action
+ * @package Magento\Catalog\Model\Indexer\Product\Flat\Action
+ */
+class Row extends \Magento\Catalog\Model\Indexer\Product\Flat\AbstractAction
+{
+    /**
+     * Execute row reindex action
+     *
+     * @param int|null $id
+     * @return \Magento\Catalog\Model\Indexer\Product\Flat\Action\Row
+     * @throws \Magento\Core\Exception
+     */
+    public function execute($id = null)
+    {
+        if (!isset($id) || empty($id)) {
+            throw new \Magento\Core\Exception(__('Could not rebuild index for undefined product'));
+        }
+        $ids = array($id);
+        foreach ($this->_storeManager->getStores() as $store) {
+            $this->_removeDeletedProducts($ids, $store->getId());
+            if (isset($ids[0])) {
+                $this->_reindexSingleProduct($store->getId(), $ids[0]);
+            }
+        }
+        return $this;
+    }
+}
diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Action/Rows.php b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Action/Rows.php
new file mode 100644
index 00000000000..f6666302857
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Action/Rows.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Catalog\Model\Indexer\Product\Flat\Action;
+/**
+ * Class Rows reindex action for mass actions
+ *
+ * @package Magento\Catalog\Model\Indexer\Product\Flat\Action
+ */
+class Rows extends \Magento\Catalog\Model\Indexer\Product\Flat\AbstractAction
+{
+    /**
+     * Execute multiple rows reindex action
+     *
+     * @param array $ids
+     *
+     * @return \Magento\Catalog\Model\Indexer\Product\Flat\Action\Rows
+     * @throws \Magento\Core\Exception
+     */
+    public function execute($ids)
+    {
+        if (empty($ids)) {
+            throw new \Magento\Core\Exception(__('Bad value was supplied.'));
+        }
+        foreach ($this->_storeManager->getStores() as $store) {
+            $idsBatches = array_chunk($ids, \Magento\Catalog\Helper\Product\Flat\Indexer::BATCH_SIZE);
+            foreach ($idsBatches as $changedIds) {
+                $this->_removeDeletedProducts($changedIds, $store->getId());
+                if (!empty($changedIds)) {
+                    $this->_reindex($store->getId(), $changedIds);
+                }
+            }
+        }
+        return $this;
+    }
+
+    /**
+     * Move data from temporary flat table into regular flat table.
+     *
+     * @return \Magento\Catalog\Model\Indexer\Product\Flat\Action\Rows
+     */
+    protected function _moveDataToFlatTable()
+    {
+        $flatTable = $this->_productIndexerHelper->getFlatTableName($this->_storeId);
+
+        if (!$this->_connection->isTableExists($flatTable)) {
+            parent::_moveDataToFlatTable();
+        } else {
+            $describe = $this->_connection->describeTable(
+                $this->_productIndexerHelper->getFlatTableName($this->_storeId)
+            );
+            $columns  = $this->_productIndexerHelper->getFlatColumns();
+            $columns  = array_keys(array_intersect_key($describe, $columns));
+            $select   = $this->_connection->select();
+
+            $select->from(
+                array(
+                    'tf' => $this->_getTemporaryTableName(
+                            $this->_productIndexerHelper->getFlatTableName($this->_storeId)
+                        ),
+                ),
+                $columns
+            );
+            $sql = $select->insertFromSelect($flatTable, $columns);
+            $this->_connection->query($sql);
+
+            $this->_connection->dropTable(
+                $this->_getTemporaryTableName($this->_productIndexerHelper->getFlatTableName($this->_storeId))
+            );
+        }
+
+        return $this;
+    }
+}
diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/Import.php b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/Import.php
new file mode 100644
index 00000000000..e72178db3a2
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/Import.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Product\Flat\Plugin;
+
+class Import
+{
+    /**
+     * @var \Magento\Catalog\Model\Indexer\Product\Flat\Processor
+     */
+    protected $_productFlatIndexerProcessor;
+
+    /**
+     * @param \Magento\Catalog\Model\Indexer\Product\Flat\Processor $productFlatIndexerProcessor
+     */
+    public function __construct(
+        \Magento\Catalog\Model\Indexer\Product\Flat\Processor $productFlatIndexerProcessor
+    ) {
+        $this->_productFlatIndexerProcessor = $productFlatIndexerProcessor;
+    }
+
+    /**
+     * After improt handler
+     *
+     * @param Object $import
+     * @return mixed
+     */
+    public function afterImportSource($import)
+    {
+        $this->_productFlatIndexerProcessor->markIndexerAsInvalid();
+        return $import;
+    }
+}
diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/IndexerConfigData.php b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/IndexerConfigData.php
new file mode 100644
index 00000000000..812e5a0ac7e
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/IndexerConfigData.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Product\Flat\Plugin;
+
+class IndexerConfigData
+{
+    /**
+     * @var \Magento\Catalog\Helper\Product\Flat
+     */
+    protected $_helper;
+
+    /**
+     * @param \Magento\Catalog\Helper\Product\Flat $helper
+     */
+    public function __construct(
+        \Magento\Catalog\Helper\Product\Flat $helper
+    ) {
+        $this->_helper = $helper;
+    }
+
+    /**
+     * Around get handler
+     *
+     * @param array $arguments
+     * @param \Magento\Code\Plugin\InvocationChain $invocationChain
+     *
+     * @return mixed|null
+     */
+    public function aroundGet(array $arguments, \Magento\Code\Plugin\InvocationChain $invocationChain)
+    {
+        $data = $invocationChain->proceed($arguments);
+
+        if (!$this->_helper->isEnabled()) {
+            $indexerId = \Magento\Catalog\Model\Indexer\Product\Flat\Processor::INDEXER_ID;
+            if ((!isset($arguments['path']) || !$arguments['path']) && isset($data[$indexerId])) {
+                unset($data[$indexerId]);
+            } elseif (isset($arguments['path'])) {
+                list($firstKey, ) = explode('/', $arguments['path']);
+                if ($firstKey == $indexerId) {
+                    $data = isset($arguments['default']) ? $arguments['default'] : null;
+                }
+            }
+        }
+
+        return $data;
+    }
+}
diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/Store.php b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/Store.php
new file mode 100644
index 00000000000..d185c6f97b4
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/Store.php
@@ -0,0 +1,60 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Product\Flat\Plugin;
+
+class Store
+{
+    /**
+     * @var \Magento\Catalog\Model\Indexer\Product\Flat\Processor
+     */
+    protected $_productFlatIndexerProcessor;
+
+    /**
+     * @param \Magento\Catalog\Model\Indexer\Product\Flat\Processor $productFlatIndexerProcessor
+     */
+    public function __construct(
+        \Magento\Catalog\Model\Indexer\Product\Flat\Processor $productFlatIndexerProcessor
+    ) {
+        $this->_productFlatIndexerProcessor = $productFlatIndexerProcessor;
+    }
+
+    /**
+     * Before save handler
+     *
+     * @param array $methodArguments
+     * @return array
+     */
+    public function beforeSave(array $methodArguments)
+    {
+        /** @var $store \Magento\Core\Model\Store */
+        $store = $methodArguments[0];
+        if (!$store->getId() || $store->dataHasChangedFor('group_id')) {
+            $this->_productFlatIndexerProcessor->markIndexerAsInvalid();
+        }
+        return $methodArguments;
+    }
+}
diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/StoreGroup.php b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/StoreGroup.php
new file mode 100644
index 00000000000..c5b7ea9b871
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/StoreGroup.php
@@ -0,0 +1,60 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Product\Flat\Plugin;
+
+class StoreGroup
+{
+    /**
+     * @var \Magento\Catalog\Model\Indexer\Product\Flat\Processor
+     */
+    protected $_productFlatIndexerProcessor;
+
+    /**
+     * @param \Magento\Catalog\Model\Indexer\Product\Flat\Processor $productFlatIndexerProcessor
+     */
+    public function __construct(
+        \Magento\Catalog\Model\Indexer\Product\Flat\Processor $productFlatIndexerProcessor
+    ) {
+        $this->_productFlatIndexerProcessor = $productFlatIndexerProcessor;
+    }
+
+    /**
+     * Before save handler
+     *
+     * @param array $methodArguments
+     * @return array
+     */
+    public function beforeSave(array $methodArguments)
+    {
+        /** @var $storeGroup \Magento\Core\Model\Store\Group */
+        $storeGroup = $methodArguments[0];
+        if (!$storeGroup->getId() || $storeGroup->dataHasChangedFor('root_category_id')) {
+            $this->_productFlatIndexerProcessor->markIndexerAsInvalid();
+        }
+        return $methodArguments;
+    }
+}
diff --git a/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Processor.php b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Processor.php
new file mode 100644
index 00000000000..1320a773161
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/Processor.php
@@ -0,0 +1,115 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Product\Flat;
+
+class Processor
+{
+    /**
+     * Indexer ID
+     */
+    const INDEXER_ID = 'catalog_product_flat';
+
+    /**
+     * @var \Magento\Indexer\Model\Indexer
+     */
+    protected $_indexer;
+
+    /**
+     * @var \Magento\Catalog\Helper\Product\Flat
+     */
+    protected $_helper;
+
+    /**
+     * @param \Magento\Indexer\Model\Indexer $indexer
+     * @param \Magento\Catalog\Helper\Product\Flat $helper
+     */
+    public function __construct(
+       \Magento\Indexer\Model\Indexer $indexer,
+       \Magento\Catalog\Helper\Product\Flat $helper
+    ) {
+        $this->_indexer = $indexer;
+        $this->_helper = $helper;
+    }
+
+    /**
+     * Get indexer instance
+     *
+     * @return \Magento\Indexer\Model\Indexer
+     */
+    public function getIndexer()
+    {
+        if (!$this->_indexer->getId()) {
+            $this->_indexer->load(self::INDEXER_ID);
+        }
+        return $this->_indexer;
+    }
+
+    /**
+     * Reindex single row by id
+     *
+     * @param int $id
+     */
+    public function reindexRow($id)
+    {
+        if (!$this->_helper->isEnabled() || $this->getIndexer()->isScheduled()) {
+            return;
+        }
+        $this->getIndexer()->reindexRow($id);
+    }
+
+    /**
+     * Reindex multiple rows by ids
+     *
+     * @param int[] $ids
+     */
+    public function reindexList($ids)
+    {
+        if (!$this->_helper->isEnabled() || $this->getIndexer()->isScheduled()) {
+            return;
+        }
+        $this->getIndexer()->reindexList($ids);
+    }
+
+    /**
+     * Run full reindex
+     */
+    public function reindexAll()
+    {
+        if (!$this->_helper->isEnabled()) {
+            return;
+        }
+        $this->getIndexer()->reindexAll();
+    }
+
+    /**
+     * Mark Product flat indexer as invalid
+     */
+    public function markIndexerAsInvalid()
+    {
+        $this->getIndexer()->invalidate();
+    }
+}
diff --git a/app/code/Magento/Catalog/Model/System/Config/Backend/Catalog/Product/Flat.php b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/System/Config/Mode.php
similarity index 67%
rename from app/code/Magento/Catalog/Model/System/Config/Backend/Catalog/Product/Flat.php
rename to app/code/Magento/Catalog/Model/Indexer/Product/Flat/System/Config/Mode.php
index daa6852da4e..4b4e62d1d70 100644
--- a/app/code/Magento/Catalog/Model/System/Config/Backend/Catalog/Product/Flat.php
+++ b/app/code/Magento/Catalog/Model/Indexer/Product/Flat/System/Config/Mode.php
@@ -18,32 +18,28 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Catalog
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
+namespace Magento\Catalog\Model\Indexer\Product\Flat\System\Config;
+
 /**
  * Flat product on/off backend
  */
-namespace Magento\Catalog\Model\System\Config\Backend\Catalog\Product;
-
-class Flat extends \Magento\Core\Model\Config\Value
+class Mode extends \Magento\Core\Model\Config\Value
 {
     /**
-     * Index indexer
-     *
-     * @var \Magento\Index\Model\Indexer
+     * @var \Magento\Catalog\Model\Indexer\Product\Flat\Processor
      */
-    protected $_indexIndexer;
+    protected $_productFlatIndexerProcessor;
 
     /**
      * @param \Magento\Core\Model\Context $context
      * @param \Magento\Core\Model\Registry $registry
      * @param \Magento\Core\Model\StoreManagerInterface $storeManager
      * @param \Magento\App\ConfigInterface $config
-     * @param \Magento\Index\Model\Indexer $indexIndexer
+     * @param \Magento\Catalog\Model\Indexer\Product\Flat\Processor $productFlatIndexerProcessor
      * @param \Magento\Core\Model\Resource\AbstractResource $resource
      * @param \Magento\Data\Collection\Db $resourceCollection
      * @param array $data
@@ -53,27 +49,37 @@ class Flat extends \Magento\Core\Model\Config\Value
         \Magento\Core\Model\Registry $registry,
         \Magento\Core\Model\StoreManagerInterface $storeManager,
         \Magento\App\ConfigInterface $config,
-        \Magento\Index\Model\Indexer $indexIndexer,
+        \Magento\Catalog\Model\Indexer\Product\Flat\Processor $productFlatIndexerProcessor,
         \Magento\Core\Model\Resource\AbstractResource $resource = null,
         \Magento\Data\Collection\Db $resourceCollection = null,
         array $data = array()
     ) {
-        $this->_indexIndexer = $indexIndexer;
+        $this->_productFlatIndexerProcessor = $productFlatIndexerProcessor;
         parent::__construct($context, $registry, $storeManager, $config, $resource, $resourceCollection, $data);
     }
 
     /**
-     * After enable flat products required reindex
+     * Set after commit callback
      *
      * @return $this
      */
     protected function _afterSave()
     {
-        if ($this->isValueChanged() && $this->getValue()) {
-            $this->_indexIndexer->getProcessByCode('catalog_product_flat')
-                ->changeStatus(\Magento\Index\Model\Process::STATUS_REQUIRE_REINDEX);
-        }
-
+        $this->_getResource()->addCommitCallback(array($this, 'processValue'));
         return $this;
     }
+
+    /**
+     * Process flat enabled mode change
+     */
+    public function processValue()
+    {
+        if ($this->isValueChanged()) {
+            if ($this->getValue()) {
+                $this->_productFlatIndexerProcessor->markIndexerAsInvalid();
+            } else {
+                $this->_productFlatIndexerProcessor->getIndexer()->setScheduled(false);
+            }
+        }
+    }
 }
diff --git a/app/code/Magento/Catalog/Model/Indexer/Url.php b/app/code/Magento/Catalog/Model/Indexer/Url.php
index 139d0ec3a99..ab752c334a3 100644
--- a/app/code/Magento/Catalog/Model/Indexer/Url.php
+++ b/app/code/Magento/Catalog/Model/Indexer/Url.php
@@ -95,7 +95,7 @@ class Url extends \Magento\Index\Model\Indexer\AbstractIndexer
      *
      * @param \Magento\Core\Model\Context $context
      * @param \Magento\Core\Model\Registry $registry
-     * @param \Magento\Catalog\Model\Resource\Url $catalogResourceUrl
+     * @param \Magento\Catalog\Model\Resource\UrlFactory $catalogResourceUrlFactory
      * @param \Magento\Catalog\Model\Url $catalogUrl
      * @param \Magento\Core\Model\Resource\AbstractResource $resource
      * @param \Magento\Data\Collection\Db $resourceCollection
@@ -104,13 +104,13 @@ class Url extends \Magento\Index\Model\Indexer\AbstractIndexer
     public function __construct(
         \Magento\Core\Model\Context $context,
         \Magento\Core\Model\Registry $registry,
-        \Magento\Catalog\Model\Resource\Url $catalogResourceUrl,
+        \Magento\Catalog\Model\Resource\UrlFactory $catalogResourceUrlFactory,
         \Magento\Catalog\Model\Url $catalogUrl,
         \Magento\Core\Model\Resource\AbstractResource $resource = null,
         \Magento\Data\Collection\Db $resourceCollection = null,
         array $data = array()
     ) {
-        $this->_catalogResourceUrl = $catalogResourceUrl;
+        $this->_catalogResourceUrl = $catalogResourceUrlFactory->create();
         $this->_catalogUrl = $catalogUrl;
         parent::__construct($context, $registry, $resource, $resourceCollection, $data);
     }
diff --git a/app/code/Magento/Catalog/Model/Observer.php b/app/code/Magento/Catalog/Model/Observer.php
index b5aa32f9a7d..15a97752a2d 100644
--- a/app/code/Magento/Catalog/Model/Observer.php
+++ b/app/code/Magento/Catalog/Model/Observer.php
@@ -234,30 +234,4 @@ class Observer
         $categoryPathIds = explode(',', $currentCategory->getPathInStore());
         return in_array($category->getId(), $categoryPathIds);
     }
-
-    /**
-     * Change product type on the fly depending on selected options
-     *
-     * @param \Magento\Event\Observer $observer
-     * @return void
-     */
-    public function transitionProductType(\Magento\Event\Observer $observer)
-    {
-        $switchableTypes = array(
-            \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE,
-            \Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL,
-            \Magento\Catalog\Model\Product\Type::TYPE_CONFIGURABLE,
-        );
-        $product = $observer->getProduct();
-        $attributes = $observer->getRequest()->getParam('attributes');
-        if (!empty($attributes)) {
-            $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_CONFIGURABLE);
-        } elseif (in_array($product->getTypeId(), $switchableTypes)) {
-            $product->setTypeInstance(null);
-            $product->setTypeId($product->hasIsVirtual()
-                ? \Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL
-                : \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE
-            );
-        }
-    }
 }
diff --git a/app/code/Magento/Catalog/Model/Product.php b/app/code/Magento/Catalog/Model/Product.php
index a8f8d0b52f9..83663d93be9 100644
--- a/app/code/Magento/Catalog/Model/Product.php
+++ b/app/code/Magento/Catalog/Model/Product.php
@@ -196,7 +196,7 @@ class Product extends \Magento\Catalog\Model\AbstractModel
     /**
      * Catalog product status
      *
-     * @var Product\Status
+     * @var \Magento\Catalog\Model\Product\Attribute\Source\Status
      */
     protected $_catalogProductStatus;
 
@@ -242,6 +242,16 @@ class Product extends \Magento\Catalog\Model\AbstractModel
      */
     protected $_filesystem;
 
+    /**
+     * @var \Magento\Indexer\Model\IndexerInterface
+     */
+    protected $categoryIndexer;
+
+    /**
+     * @var \Magento\Catalog\Model\Indexer\Product\Flat\Processor
+     */
+    protected $_productFlatIndexerProcessor;
+
     /**
      * @param \Magento\Core\Model\Context $context
      * @param \Magento\Core\Model\Registry $registry
@@ -254,7 +264,7 @@ class Product extends \Magento\Catalog\Model\AbstractModel
      * @param \Magento\Catalog\Model\CategoryFactory $categoryFactory
      * @param Product\Option $catalogProductOption
      * @param Product\Visibility $catalogProductVisibility
-     * @param Product\Status $catalogProductStatus
+     * @param \Magento\Catalog\Model\Product\Attribute\Source\Status $catalogProductStatus
      * @param Product\Media\Config $catalogProductMediaConfig
      * @param \Magento\Index\Model\Indexer $indexIndexer
      * @param Product\Type $catalogProductType
@@ -265,6 +275,8 @@ class Product extends \Magento\Catalog\Model\AbstractModel
      * @param Resource\Product\Collection $resourceCollection
      * @param \Magento\Data\CollectionFactory $collectionFactory
      * @param \Magento\App\Filesystem $filesystem
+     * @param \Magento\Indexer\Model\IndexerInterface $categoryIndexer
+     * @param Indexer\Product\Flat\Processor $productFlatIndexerProcessor
      * @param array $data
      *
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
@@ -279,10 +291,10 @@ class Product extends \Magento\Catalog\Model\AbstractModel
         \Magento\CatalogInventory\Model\Stock\ItemFactory $stockItemFactory,
         \Magento\Catalog\Model\ProductFactory $productFactory,
         \Magento\Catalog\Model\CategoryFactory $categoryFactory,
-        Product\Option $catalogProductOption,
-        Product\Visibility $catalogProductVisibility,
-        Product\Status $catalogProductStatus,
-        Product\Media\Config $catalogProductMediaConfig,
+        \Magento\Catalog\Model\Product\Option $catalogProductOption,
+        \Magento\Catalog\Model\Product\Visibility $catalogProductVisibility,
+        \Magento\Catalog\Model\Product\Attribute\Source\Status $catalogProductStatus,
+        \Magento\Catalog\Model\Product\Media\Config $catalogProductMediaConfig,
         \Magento\Index\Model\Indexer $indexIndexer,
         Product\Type $catalogProductType,
         \Magento\Catalog\Helper\Image $catalogImage,
@@ -292,6 +304,8 @@ class Product extends \Magento\Catalog\Model\AbstractModel
         Resource\Product\Collection $resourceCollection,
         \Magento\Data\CollectionFactory $collectionFactory,
         \Magento\App\Filesystem $filesystem,
+        \Magento\Indexer\Model\IndexerInterface $categoryIndexer,
+        \Magento\Catalog\Model\Indexer\Product\Flat\Processor $productFlatIndexerProcessor,
         array $data = array()
     ) {
         $this->_itemOptionFactory = $itemOptionFactory;
@@ -311,6 +325,8 @@ class Product extends \Magento\Catalog\Model\AbstractModel
         $this->_urlModel = $url;
         $this->_linkInstance = $productLink;
         $this->_filesystem = $filesystem;
+        $this->categoryIndexer = $categoryIndexer;
+        $this->_productFlatIndexerProcessor = $productFlatIndexerProcessor;
         parent::__construct($context, $registry, $storeManager, $resource, $resourceCollection, $data);
     }
 
@@ -324,6 +340,19 @@ class Product extends \Magento\Catalog\Model\AbstractModel
         $this->_init('Magento\Catalog\Model\Resource\Product');
     }
 
+    /**
+     * Return product category indexer object
+     *
+     * @return \Magento\Indexer\Model\IndexerInterface
+     */
+    protected function getCategoryIndexer()
+    {
+        if (!$this->categoryIndexer->getId()) {
+            $this->categoryIndexer->load(Indexer\Product\Category::INDEXER_ID);
+        }
+        return $this->categoryIndexer;
+    }
+
     /**
      * Retrieve Store Id
      *
@@ -427,7 +456,7 @@ class Product extends \Magento\Catalog\Model\AbstractModel
     public function getStatus()
     {
         if (is_null($this->_getData('status'))) {
-            $this->setData('status', Product\Status::STATUS_ENABLED);
+            $this->setData('status', \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED);
         }
         return $this->_getData('status');
     }
@@ -697,9 +726,24 @@ class Product extends \Magento\Catalog\Model\AbstractModel
         $this->_indexIndexer->processEntityAction(
             $this, self::ENTITY, \Magento\Index\Model\Event::TYPE_SAVE
         );
+        $this->_getResource()->addCommitCallback(array($this, 'reindex'));
         return $result;
     }
 
+
+    /**
+     * Init indexing process after product save
+     *
+     * @return $this
+     */
+    public function reindex()
+    {
+        $this->_productFlatIndexerProcessor->reindexRow($this->getEntityId());
+        if (!$this->getCategoryIndexer()->isScheduled()) {
+            $this->getCategoryIndexer()->reindexRow($this->getId());
+        }
+    }
+
     /**
      * Clear cache related with product and protect delete from not admin
      * Register indexing event before delete product
@@ -723,6 +767,7 @@ class Product extends \Magento\Catalog\Model\AbstractModel
      */
     protected function _afterDeleteCommit()
     {
+        $this->reindex();
         parent::_afterDeleteCommit();
         $this->_indexIndexer->indexEvents(
             self::ENTITY, \Magento\Index\Model\Event::TYPE_DELETE
@@ -1178,16 +1223,6 @@ class Product extends \Magento\Catalog\Model\AbstractModel
         return $this->_catalogProductMediaConfig;
     }
 
-    /**
-     * Check is product configurable
-     *
-     * @return bool
-     */
-    public function isConfigurable()
-    {
-        return $this->getTypeId() == Product\Type::TYPE_CONFIGURABLE;
-    }
-
     /**
      * Returns visible status IDs in catalog
      *
@@ -1352,7 +1387,7 @@ class Product extends \Magento\Catalog\Model\AbstractModel
      */
     public function isInStock()
     {
-        return $this->getStatus() == Product\Status::STATUS_ENABLED;
+        return $this->getStatus() == \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED;
     }
 
     /**
@@ -1987,7 +2022,7 @@ class Product extends \Magento\Catalog\Model\AbstractModel
      */
     public function isDisabled()
     {
-        return $this->getStatus() == Product\Status::STATUS_DISABLED;
+        return $this->getStatus() == \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_DISABLED;
     }
 
     /**
diff --git a/app/code/Magento/Catalog/Model/Product/Action.php b/app/code/Magento/Catalog/Model/Product/Action.php
index c9a33e9c422..1b68d930d86 100644
--- a/app/code/Magento/Catalog/Model/Product/Action.php
+++ b/app/code/Magento/Catalog/Model/Product/Action.php
@@ -48,11 +48,17 @@ class Action extends \Magento\Core\Model\AbstractModel
      */
     protected $_productWebsiteFactory;
 
+    /**
+     * @var \Magento\Indexer\Model\IndexerInterface
+     */
+    protected $categoryIndexer;
+
     /**
      * @param \Magento\Core\Model\Context $context
      * @param \Magento\Core\Model\Registry $registry
      * @param \Magento\Catalog\Model\Product\WebsiteFactory $productWebsiteFactory
      * @param \Magento\Index\Model\Indexer $indexIndexer
+     * @param \Magento\Indexer\Model\IndexerInterface $categoryIndexer
      * @param \Magento\Core\Model\Resource\AbstractResource $resource
      * @param \Magento\Data\Collection\Db $resourceCollection
      * @param array $data
@@ -62,12 +68,14 @@ class Action extends \Magento\Core\Model\AbstractModel
         \Magento\Core\Model\Registry $registry,
         \Magento\Catalog\Model\Product\WebsiteFactory $productWebsiteFactory,
         \Magento\Index\Model\Indexer $indexIndexer,
+        \Magento\Indexer\Model\IndexerInterface $categoryIndexer,
         \Magento\Core\Model\Resource\AbstractResource $resource = null,
         \Magento\Data\Collection\Db $resourceCollection = null,
         array $data = array()
     ) {
         $this->_productWebsiteFactory = $productWebsiteFactory;
         $this->_indexIndexer = $indexIndexer;
+        $this->categoryIndexer = $categoryIndexer;
         parent::__construct($context, $registry, $resource, $resourceCollection, $data);
     }
 
@@ -81,6 +89,19 @@ class Action extends \Magento\Core\Model\AbstractModel
         $this->_init('Magento\Catalog\Model\Resource\Product\Action');
     }
 
+    /**
+     * Return product category indexer object
+     *
+     * @return \Magento\Indexer\Model\IndexerInterface
+     */
+    protected function getCategoryIndexer()
+    {
+        if (!$this->categoryIndexer->getId()) {
+            $this->categoryIndexer->load(\Magento\Catalog\Model\Indexer\Product\Category::INDEXER_ID);
+        }
+        return $this->categoryIndexer;
+    }
+
     /**
      * Retrieve resource instance wrapper
      *
@@ -118,6 +139,9 @@ class Action extends \Magento\Core\Model\AbstractModel
         $this->_indexIndexer->processEntityAction(
             $this, \Magento\Catalog\Model\Product::ENTITY, \Magento\Index\Model\Event::TYPE_MASS_ACTION
         );
+        if (!$this->getCategoryIndexer()->isScheduled()) {
+            $this->getCategoryIndexer()->reindexList(array_unique($productIds));
+        }
         return $this;
     }
 
@@ -151,5 +175,8 @@ class Action extends \Magento\Core\Model\AbstractModel
         $this->_indexIndexer->processEntityAction(
             $this, \Magento\Catalog\Model\Product::ENTITY, \Magento\Index\Model\Event::TYPE_MASS_ACTION
         );
+        if (!$this->getCategoryIndexer()->isScheduled()) {
+            $this->getCategoryIndexer()->reindexList(array_unique($productIds));
+        }
     }
 }
diff --git a/app/code/Magento/Catalog/Model/Product/Attribute/Group.php b/app/code/Magento/Catalog/Model/Product/Attribute/Group.php
index 941cfd1668d..09e9f07068f 100644
--- a/app/code/Magento/Catalog/Model/Product/Attribute/Group.php
+++ b/app/code/Magento/Catalog/Model/Product/Attribute/Group.php
@@ -76,24 +76,4 @@ class Group extends \Magento\Eav\Model\Entity\Attribute\Group
         }
         return $result;
     }
-
-    /**
-     * Check if contains attributes used in the configurable products
-     *
-     * @return bool
-     */
-    public function hasConfigurableAttributes()
-    {
-        $result = false;
-        /** @var $attributesCollection \Magento\Catalog\Model\Resource\Product\Attribute\Collection */
-        $attributesCollection = $this->_attributeCollectionFactory->create();
-        $attributesCollection->setAttributeGroupFilter($this->getId());
-        foreach ($attributesCollection as $attribute) {
-            if ($attribute->getIsConfigurable()) {
-                $result = true;
-                break;
-            }
-        }
-        return $result;
-    }
 }
diff --git a/app/code/Magento/Catalog/Model/Product/Attribute/Source/Msrp/Type/Enabled.php b/app/code/Magento/Catalog/Model/Product/Attribute/Source/Msrp/Type/Enabled.php
index 67aee9bbfc3..95429e2aa0d 100644
--- a/app/code/Magento/Catalog/Model/Product/Attribute/Source/Msrp/Type/Enabled.php
+++ b/app/code/Magento/Catalog/Model/Product/Attribute/Source/Msrp/Type/Enabled.php
@@ -119,15 +119,10 @@ class Enabled
             'extra'     => null
         );
 
-        if ($this->_coreData->useDbCompatibleMode()) {
-            $column['type']     = 'tinyint(1)';
-            $column['is_null']  = true;
-        } else {
-            $column['type']     = \Magento\DB\Ddl\Table::TYPE_SMALLINT;
-            $column['length']   = 1;
-            $column['nullable'] = true;
-            $column['comment']  = $attributeCode . ' column';
-        }
+        $column['type']     = \Magento\DB\Ddl\Table::TYPE_SMALLINT;
+        $column['length']   = 1;
+        $column['nullable'] = true;
+        $column['comment']  = $attributeCode . ' column';
 
         return array($attributeCode => $column);
     }
diff --git a/app/code/Magento/Catalog/Model/Product/Attribute/Source/Msrp/Type/Price.php b/app/code/Magento/Catalog/Model/Product/Attribute/Source/Msrp/Type/Price.php
index 55b0bae9c43..c2a9bdc1d57 100644
--- a/app/code/Magento/Catalog/Model/Product/Attribute/Source/Msrp/Type/Price.php
+++ b/app/code/Magento/Catalog/Model/Product/Attribute/Source/Msrp/Type/Price.php
@@ -111,13 +111,8 @@ class Price
             'extra'     => null
         );
 
-        if ($this->_coreData->useDbCompatibleMode()) {
-            $column['type']     = $attributeType;
-            $column['is_null']  = true;
-        } else {
-            $column['type']     = $this->_eavResourceHelper->getDdlTypeByColumnType($attributeType);
-            $column['nullable'] = true;
-        }
+        $column['type']     = $this->_eavResourceHelper->getDdlTypeByColumnType($attributeType);
+        $column['nullable'] = true;
 
         return array($attributeCode => $column);
     }
diff --git a/app/code/Magento/Catalog/Model/Product/Attribute/Source/Status.php b/app/code/Magento/Catalog/Model/Product/Attribute/Source/Status.php
new file mode 100644
index 00000000000..50243f84f19
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Product/Attribute/Source/Status.php
@@ -0,0 +1,161 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Product\Attribute\Source;
+
+/**
+ * Product status functionality model
+ */
+class Status extends \Magento\Eav\Model\Entity\Attribute\Source\AbstractSource
+    implements \Magento\Eav\Model\Entity\Attribute\Source\SourceInterface
+{
+    /**#@+
+     * Product Status values
+     */
+    const STATUS_ENABLED    = 1;
+    const STATUS_DISABLED   = 2;
+    /**#@-*/
+
+    /**
+     * Retrieve Visible Status Ids
+     *
+     * @return int[]
+     */
+    public function getVisibleStatusIds()
+    {
+        return array(self::STATUS_ENABLED);
+    }
+
+    /**
+     * Retrieve Saleable Status Ids
+     * Default Product Enable status
+     *
+     * @return int[]
+     */
+    public function getSaleableStatusIds()
+    {
+        return array(self::STATUS_ENABLED);
+    }
+
+    /**
+     * Retrieve option array
+     *
+     * @return string[]
+     */
+    static public function getOptionArray()
+    {
+        return array(
+            self::STATUS_ENABLED    => __('Enabled'),
+            self::STATUS_DISABLED   => __('Disabled')
+        );
+    }
+
+    /**
+     * Retrieve option array with empty value
+     *
+     * @return string[]
+     */
+    public function getAllOptions()
+    {
+        $result = array();
+
+        foreach (self::getOptionArray() as $index => $value) {
+            $result[] = array(
+               'value' => $index,
+               'label' => $value
+            );
+        }
+
+        return $result;
+    }
+
+    /**
+     * Retrieve option text by option value
+     *
+     * @param string $optionId
+     * @return string
+     */
+    public function getOptionText($optionId)
+    {
+        $options = self::getOptionArray();
+
+        return isset($options[$optionId]) ? $options[$optionId] : null;
+    }
+
+    /**
+     * Add Value Sort To Collection Select
+     *
+     * @param \Magento\Eav\Model\Entity\Collection\AbstractCollection $collection
+     * @param string $dir direction
+     * @return \Magento\Eav\Model\Entity\Attribute\Source\AbstractSource
+     */
+    public function addValueSortToCollection($collection, $dir = 'asc')
+    {
+        $attributeCode  = $this->getAttribute()->getAttributeCode();
+        $attributeId    = $this->getAttribute()->getId();
+        $attributeTable = $this->getAttribute()->getBackend()->getTable();
+
+        if ($this->getAttribute()->isScopeGlobal()) {
+            $tableName = $attributeCode . '_t';
+
+            $collection->getSelect()
+                ->joinLeft(
+                    array($tableName => $attributeTable),
+                    "e.entity_id={$tableName}.entity_id"
+                        . " AND {$tableName}.attribute_id='{$attributeId}'"
+                        . " AND {$tableName}.store_id='0'",
+                    array());
+
+            $valueExpr = $tableName . '.value';
+        } else {
+            $valueTable1 = $attributeCode . '_t1';
+            $valueTable2 = $attributeCode . '_t2';
+
+            $collection->getSelect()
+                ->joinLeft(
+                    array($valueTable1 => $attributeTable),
+                    "e.entity_id={$valueTable1}.entity_id"
+                        . " AND {$valueTable1}.attribute_id='{$attributeId}'"
+                        . " AND {$valueTable1}.store_id='0'",
+                    array())
+                ->joinLeft(
+                    array($valueTable2 => $attributeTable),
+                    "e.entity_id={$valueTable2}.entity_id"
+                        . " AND {$valueTable2}.attribute_id='{$attributeId}'"
+                        . " AND {$valueTable2}.store_id='{$collection->getStoreId()}'",
+                    array()
+                );
+
+                $valueExpr = $collection->getConnection()->getCheckSql(
+                    $valueTable2 . '.value_id > 0',
+                    $valueTable2 . '.value',
+                    $valueTable1 . '.value'
+                );
+        }
+
+        $collection->getSelect()->order($valueExpr . ' ' . $dir);
+
+        return $this;
+    }
+}
diff --git a/app/code/Magento/Catalog/Model/Product/CartConfiguration.php b/app/code/Magento/Catalog/Model/Product/CartConfiguration.php
index 2a5bbf8165a..cd134b3fc3e 100644
--- a/app/code/Magento/Catalog/Model/Product/CartConfiguration.php
+++ b/app/code/Magento/Catalog/Model/Product/CartConfiguration.php
@@ -43,8 +43,6 @@ class CartConfiguration
             case \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE:
             case \Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL:
                 return isset($config['options']);
-            case \Magento\Catalog\Model\Product\Type::TYPE_CONFIGURABLE:
-                return isset($config['super_attribute']);
             case \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE:
                 return isset($config['bundle_option']);
         }
diff --git a/app/code/Magento/Catalog/Model/Product/Copier.php b/app/code/Magento/Catalog/Model/Product/Copier.php
index 759701f8e3f..89352d1e4c2 100644
--- a/app/code/Magento/Catalog/Model/Product/Copier.php
+++ b/app/code/Magento/Catalog/Model/Product/Copier.php
@@ -65,7 +65,7 @@ class Copier
         $duplicate->setData($product->getData());
         $duplicate->setIsDuplicate(true);
         $duplicate->setOriginalId($product->getId());
-        $duplicate->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_DISABLED);
+        $duplicate->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_DISABLED);
         $duplicate->setCreatedAt(null);
         $duplicate->setUpdatedAt(null);
         $duplicate->setId(null);
diff --git a/app/code/Magento/Catalog/Model/Product/Flat/Flag.php b/app/code/Magento/Catalog/Model/Product/Flat/Flag.php
deleted file mode 100644
index a64df7dd3ed..00000000000
--- a/app/code/Magento/Catalog/Model/Product/Flat/Flag.php
+++ /dev/null
@@ -1,102 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Catalog
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-namespace Magento\Catalog\Model\Product\Flat;
-
-/**
- * Calatog Product Flat Flag Model
- *
- * @category   Magento
- * @package    Magento_Catalog
- * @author     Magento Core Team <core@magentocommerce.com>
- */
-class Flag extends \Magento\Core\Model\Flag
-{
-    /**
-     * Flag code
-     *
-     * @var string
-     */
-    protected $_flagCode = 'catalog_product_flat';
-
-    /**
-     * Retrieve flag data array
-     *
-     * @return array
-     */
-    public function getFlagData()
-    {
-        $flagData = parent::getFlagData();
-        if (!is_array($flagData)) {
-            $flagData = array();
-            $this->setFlagData($flagData);
-        }
-        return $flagData;
-    }
-
-    /**
-     * Retrieve Catalog Product Flat Data is built flag
-     *
-     * @return bool
-     */
-    public function getIsBuilt()
-    {
-        $flagData = $this->getFlagData();
-        if (!isset($flagData['is_built'])) {
-            $flagData['is_built'] = false;
-            $this->setFlagData($flagData);
-        }
-        return (bool)$flagData['is_built'];
-    }
-
-    /**
-     * Set Catalog Product Flat Data is built flag
-     *
-     * @param bool $flag
-     *
-     * @return $this
-     */
-    public function setIsBuilt($flag)
-    {
-        $flagData = $this->getFlagData();
-        $flagData['is_built'] = (bool)$flag;
-        $this->setFlagData($flagData);
-        return $this;
-    }
-
-    /**
-     * Set Catalog Product Flat Data is built flag
-     *
-     * @param bool $flag
-     * @return $this
-     *
-     * @deprecated after 1.7.0.0 use \Magento\Catalog\Model\Product\Flat\Flag::setIsBuilt() instead
-     */
-    public function setIsBuild($flag)
-    {
-        $this->setIsBuilt($flag);
-        return $this;
-    }
-}
diff --git a/app/code/Magento/Catalog/Model/Product/Flat/Indexer.php b/app/code/Magento/Catalog/Model/Product/Flat/Indexer.php
deleted file mode 100644
index 70608ed1f25..00000000000
--- a/app/code/Magento/Catalog/Model/Product/Flat/Indexer.php
+++ /dev/null
@@ -1,348 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Catalog
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-namespace Magento\Catalog\Model\Product\Flat;
-
-/**
- * Catalog Product Flat Indexer Model
- *
- * @method \Magento\Catalog\Model\Resource\Product\Flat\Indexer _getResource()
- * @method \Magento\Catalog\Model\Resource\Product\Flat\Indexer getResource()
- * @method int getEntityTypeId()
- * @method \Magento\Catalog\Model\Product\Flat\Indexer setEntityTypeId(int $value)
- * @method int getAttributeSetId()
- * @method \Magento\Catalog\Model\Product\Flat\Indexer setAttributeSetId(int $value)
- * @method string getTypeId()
- * @method \Magento\Catalog\Model\Product\Flat\Indexer setTypeId(string $value)
- * @method string getSku()
- * @method \Magento\Catalog\Model\Product\Flat\Indexer setSku(string $value)
- * @method int getHasOptions()
- * @method \Magento\Catalog\Model\Product\Flat\Indexer setHasOptions(int $value)
- * @method int getRequiredOptions()
- * @method \Magento\Catalog\Model\Product\Flat\Indexer setRequiredOptions(int $value)
- * @method string getCreatedAt()
- * @method \Magento\Catalog\Model\Product\Flat\Indexer setCreatedAt(string $value)
- * @method string getUpdatedAt()
- * @method \Magento\Catalog\Model\Product\Flat\Indexer setUpdatedAt(string $value)
- *
- * @category    Magento
- * @package     Magento_Catalog
- * @author      Magento Core Team <core@magentocommerce.com>
- */
-class Indexer extends \Magento\Core\Model\AbstractModel
-{
-    /**
-     * Catalog product flat entity for indexers
-     */
-    const ENTITY = 'catalog_product_flat';
-
-    /**
-     * Indexers rebuild event type
-     */
-    const EVENT_TYPE_REBUILD = 'catalog_product_flat_rebuild';
-
-    /**
-     * Index indexer
-     *
-     * @var \Magento\Index\Model\Indexer
-     */
-    protected $_index;
-
-    /**
-     * Store manager
-     *
-     * @var \Magento\Core\Model\StoreManagerInterface
-     */
-    protected $_storeManager;
-
-    /**
-     * @param \Magento\Core\Model\Context $context
-     * @param \Magento\Core\Model\Registry $registry
-     * @param \Magento\Core\Model\StoreManagerInterface $storeManager
-     * @param \Magento\Index\Model\Indexer $index
-     * @param \Magento\Core\Model\Resource\AbstractResource $resource
-     * @param \Magento\Data\Collection\Db $resourceCollection
-     * @param array $data
-     */
-    public function __construct(
-        \Magento\Core\Model\Context $context,
-        \Magento\Core\Model\Registry $registry,
-        \Magento\Core\Model\StoreManagerInterface $storeManager,
-        \Magento\Index\Model\Indexer $index,
-        \Magento\Core\Model\Resource\AbstractResource $resource = null,
-        \Magento\Data\Collection\Db $resourceCollection = null,
-        array $data = array()
-    ) {
-        $this->_storeManager = $storeManager;
-        $this->_index = $index;
-        parent::__construct($context, $registry, $resource, $resourceCollection, $data);
-    }
-
-    /**
-     * Standard model resource initialization
-     *
-     * @return void
-     */
-    protected function _construct()
-    {
-        $this->_init('Magento\Catalog\Model\Resource\Product\Flat\Indexer');
-    }
-
-    /**
-     * Rebuild Catalog Product Flat Data
-     *
-     * @param int $store
-     * @return $this
-     */
-    public function rebuild($store = null)
-    {
-        if (is_null($store)) {
-            $this->_getResource()->prepareFlatTables();
-        } else {
-            $this->_getResource()->prepareFlatTable($store);
-        }
-        $this->_index->processEntityAction(
-            new \Magento\Object(array('id' => $store)),
-            self::ENTITY,
-            self::EVENT_TYPE_REBUILD
-        );
-        return $this;
-    }
-
-    /**
-     * Update attribute data for flat table
-     *
-     * @param string $attributeCode
-     * @param int $store
-     * @param int|array $productIds
-     * @return $this
-     */
-    public function updateAttribute($attributeCode, $store = null, $productIds = null)
-    {
-        if (is_null($store)) {
-            foreach ($this->_storeManager->getStores() as $store) {
-                $this->updateAttribute($attributeCode, $store->getId(), $productIds);
-            }
-
-            return $this;
-        }
-
-        $this->_getResource()->prepareFlatTable($store);
-        $attribute = $this->_getResource()->getAttribute($attributeCode);
-        $this->_getResource()->updateAttribute($attribute, $store, $productIds);
-        $this->_getResource()->updateChildrenDataFromParent($store, $productIds);
-
-        return $this;
-    }
-
-    /**
-     * Prepare datastorage for catalog product flat
-     *
-     * @param int $store
-     * @return $this
-     */
-    public function prepareDataStorage($store = null)
-    {
-        if (is_null($store)) {
-            foreach ($this->_storeManager->getStores() as $store) {
-                $this->prepareDataStorage($store->getId());
-            }
-
-            return $this;
-        }
-
-        $this->_getResource()->prepareFlatTable($store);
-
-        return $this;
-    }
-
-    /**
-     * Update events observer attributes
-     *
-     * @param int $store
-     * @return $this
-     */
-    public function updateEventAttributes($store = null)
-    {
-        if (is_null($store)) {
-            foreach ($this->_storeManager->getStores() as $store) {
-                $this->updateEventAttributes($store->getId());
-            }
-
-            return $this;
-        }
-
-        $this->_getResource()->prepareFlatTable($store);
-        $this->_getResource()->updateEventAttributes($store);
-        $this->_getResource()->updateRelationProducts($store);
-
-        return $this;
-    }
-
-    /**
-     * Update product status
-     *
-     * @param int $productId
-     * @param int $status
-     * @param int $store
-     * @return $this
-     */
-    public function updateProductStatus($productId, $status, $store = null)
-    {
-        if (is_null($store)) {
-            foreach ($this->_storeManager->getStores() as $store) {
-                $this->updateProductStatus($productId, $status, $store->getId());
-            }
-            return $this;
-        }
-
-        if ($status == \Magento\Catalog\Model\Product\Status::STATUS_ENABLED) {
-            $this->_getResource()->updateProduct($productId, $store);
-            $this->_getResource()->updateChildrenDataFromParent($store, $productId);
-        } else {
-            $this->_getResource()->removeProduct($productId, $store);
-        }
-
-        return $this;
-    }
-
-    /**
-     * Update Catalog Product Flat data
-     *
-     * @param int|array $productIds
-     * @param int $store
-     * @return $this
-     * @throws \Exception
-     */
-    public function updateProduct($productIds, $store = null)
-    {
-        if (is_null($store)) {
-            foreach ($this->_storeManager->getStores() as $store) {
-                $this->updateProduct($productIds, $store->getId());
-            }
-            return $this;
-        }
-
-        $resource = $this->_getResource();
-        $resource->beginTransaction();
-        try {
-            $resource->removeProduct($productIds, $store);
-            $resource->updateProduct($productIds, $store);
-            $resource->updateRelationProducts($store, $productIds);
-            $resource->commit();
-        } catch (\Exception $e){
-            $resource->rollBack();
-            throw $e;
-        }
-
-        return $this;
-    }
-
-    /**
-     * Save Catalog Product(s) Flat data
-     *
-     * @param int|array $productIds
-     * @param int $store
-     * @return $this
-     * @throws \Exception
-     */
-    public function saveProduct($productIds, $store = null)
-    {
-        if (is_null($store)) {
-            foreach ($this->_storeManager->getStores() as $store) {
-                $this->saveProduct($productIds, $store->getId());
-            }
-            return $this;
-        }
-
-        $resource = $this->_getResource();
-        $resource->beginTransaction();
-        try {
-            $resource->removeProduct($productIds, $store);
-            $resource->saveProduct($productIds, $store);
-            $resource->updateRelationProducts($store, $productIds);
-            $resource->commit();
-        } catch (\Exception $e){
-            $resource->rollBack();
-            throw $e;
-        }
-
-        return $this;
-    }
-
-    /**
-     * Remove product from flat
-     *
-     * @param int|array $productIds
-     * @param int $store
-     * @return $this
-     */
-    public function removeProduct($productIds, $store = null)
-    {
-        if (is_null($store)) {
-            foreach ($this->_storeManager->getStores() as $store) {
-                $this->removeProduct($productIds, $store->getId());
-            }
-            return $this;
-        }
-
-        $this->_getResource()->removeProduct($productIds, $store);
-
-        return $this;
-    }
-
-    /**
-     * Delete store process
-     *
-     * @param int $store
-     * @return $this
-     */
-    public function deleteStore($store)
-    {
-        $this->_getResource()->deleteFlatTable($store);
-        return $this;
-    }
-
-    /**
-     * Rebuild Catalog Product Flat Data for all stores
-     *
-     * @return $this
-     */
-    public function reindexAll()
-    {
-        $this->_getResource()->reindexAll();
-        return $this;
-    }
-
-    /**
-     * Retrieve list of attribute codes for flat
-     *
-     * @return array
-     */
-    public function getAttributeCodes()
-    {
-        return $this->_getResource()->getAttributeCodes();
-    }
-}
diff --git a/app/code/Magento/Catalog/Model/Product/Flat/Observer.php b/app/code/Magento/Catalog/Model/Product/Flat/Observer.php
deleted file mode 100644
index 24f5847f311..00000000000
--- a/app/code/Magento/Catalog/Model/Product/Flat/Observer.php
+++ /dev/null
@@ -1,325 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Catalog
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-namespace Magento\Catalog\Model\Product\Flat;
-
-use Magento\Event\Observer as EventObserver;
-
-/**
- * Catalog Product Flat observer
- *
- * @SuppressWarnings(PHPMD.LongVariable)
- */
-class Observer
-{
-    /**
-     * Catalog product flat
-     *
-     * @var \Magento\Catalog\Helper\Product\Flat
-     */
-    protected $_catalogProductFlat = null;
-
-    /**
-     * Catalog product flat indexer
-     *
-     * @var \Magento\Catalog\Model\Product\Flat\Indexer
-     */
-    protected $_catalogProductFlatIndexer;
-
-    /**
-     * Store manager
-     *
-     * @var \Magento\Core\Model\StoreManagerInterface
-     */
-    protected $_storeManager;
-
-    /**
-     * Construct
-     *
-     * @param \Magento\Core\Model\StoreManagerInterface $storeManager
-     * @param \Magento\Catalog\Model\Product\Flat\Indexer $catalogProductFlatIndexer
-     * @param \Magento\Catalog\Helper\Product\Flat $catalogProductFlat
-     */
-    public function __construct(
-        \Magento\Core\Model\StoreManagerInterface $storeManager,
-        \Magento\Catalog\Model\Product\Flat\Indexer $catalogProductFlatIndexer,
-        \Magento\Catalog\Helper\Product\Flat $catalogProductFlat
-    ) {
-        $this->_storeManager = $storeManager;
-        $this->_catalogProductFlatIndexer = $catalogProductFlatIndexer;
-        $this->_catalogProductFlat = $catalogProductFlat;
-    }
-
-    /**
-     * Retrieve Catalog Product Flat Helper
-     *
-     * @return \Magento\Catalog\Helper\Product\Flat
-     */
-    protected function _getHelper()
-    {
-        return $this->_catalogProductFlat;
-    }
-
-    /**
-     * Retrieve Catalog Product Flat Indexer model
-     *
-     * @return \Magento\Catalog\Model\Product\Flat\Indexer
-     */
-    protected function _getIndexer()
-    {
-        return $this->_catalogProductFlatIndexer;
-    }
-
-    /**
-     * Catalog Entity attribute after save process
-     *
-     * @param EventObserver $observer
-     * @return $this
-     */
-    public function catalogEntityAttributeSaveAfter(EventObserver $observer)
-    {
-        if (!$this->_getHelper()->isAvailable() || !$this->_getHelper()->isBuilt()) {
-            return $this;
-        }
-
-        $attribute = $observer->getEvent()->getAttribute();
-        /* @var $attribute \Magento\Catalog\Model\Entity\Attribute */
-
-        $enableBefore   = ($attribute->getOrigData('backend_type') == 'static')
-            || ($this->_getHelper()->isAddFilterableAttributes() && $attribute->getOrigData('is_filterable') > 0)
-            || ($attribute->getOrigData('used_in_product_listing') == 1)
-            || ($attribute->getOrigData('used_for_sort_by') == 1);
-        $enableAfter    = ($attribute->getData('backend_type') == 'static')
-            || ($this->_getHelper()->isAddFilterableAttributes() && $attribute->getData('is_filterable') > 0)
-            || ($attribute->getData('used_in_product_listing') == 1)
-            || ($attribute->getData('used_for_sort_by') == 1);
-
-        if (!$enableAfter && !$enableBefore) {
-            return $this;
-        }
-
-        if ($enableBefore && !$enableAfter) {
-            // delete attribute data from flat
-            $this->_getIndexer()->prepareDataStorage();
-        } else {
-            $this->_getIndexer()->updateAttribute($attribute->getAttributeCode());
-        }
-
-        return $this;
-    }
-
-    /**
-     * Catalog Product Status Update
-     *
-     * @param EventObserver $observer
-     * @return $this
-     */
-    public function catalogProductStatusUpdate(EventObserver $observer)
-    {
-        if (!$this->_getHelper()->isAvailable() || !$this->_getHelper()->isBuilt()) {
-            return $this;
-        }
-
-        $productId  = $observer->getEvent()->getProductId();
-        $status     = $observer->getEvent()->getStatus();
-        $storeId    = $observer->getEvent()->getStoreId();
-        $storeId    = $storeId > 0 ? $storeId : null;
-
-        $this->_getIndexer()->updateProductStatus($productId, $status, $storeId);
-
-        return $this;
-    }
-
-    /**
-     * Catalog Product Website(s) update
-     *
-     * @param EventObserver $observer
-     * @return $this
-     */
-    public function catalogProductWebsiteUpdate(EventObserver $observer)
-    {
-        if (!$this->_getHelper()->isAvailable() || !$this->_getHelper()->isBuilt()) {
-            return $this;
-        }
-
-        $websiteIds = $observer->getEvent()->getWebsiteIds();
-        $productIds = $observer->getEvent()->getProductIds();
-
-        foreach ($websiteIds as $websiteId) {
-            $website = $this->_storeManager->getWebsite($websiteId);
-            foreach ($website->getStores() as $store) {
-                if ($observer->getEvent()->getAction() == 'remove') {
-                    $this->_getIndexer()->removeProduct($productIds, $store->getId());
-                } else {
-                    $this->_getIndexer()->updateProduct($productIds, $store->getId());
-                }
-            }
-        }
-
-        return $this;
-    }
-
-    /**
-     * Catalog Product After Save
-     *
-     * @param EventObserver $observer
-     * @return $this
-     */
-    public function catalogProductSaveAfter(EventObserver $observer) {
-        if (!$this->_getHelper()->isAvailable() || !$this->_getHelper()->isBuilt()) {
-            return $this;
-        }
-
-        $product   = $observer->getEvent()->getProduct();
-        $productId = $product->getId();
-
-        $this->_getIndexer()->saveProduct($productId);
-
-        return $this;
-    }
-
-    /**
-     * Add new store flat process
-     *
-     * @param EventObserver $observer
-     * @return $this
-     */
-    public function storeAdd(EventObserver $observer)
-    {
-        if (!$this->_getHelper()->isAvailable() || !$this->_getHelper()->isBuilt()) {
-            return $this;
-        }
-
-        $store = $observer->getEvent()->getStore();
-        /* @var $store \Magento\Core\Model\Store */
-        $this->_getIndexer()->rebuild($store->getId());
-
-        return $this;
-    }
-
-    /**
-     * Store edit action, check change store group
-     *
-     * @param EventObserver $observer
-     * @return $this
-     */
-    public function storeEdit(EventObserver $observer)
-    {
-        if (!$this->_getHelper()->isAvailable() || !$this->_getHelper()->isBuilt()) {
-            return $this;
-        }
-
-        $store = $observer->getEvent()->getStore();
-        /* @var $store \Magento\Core\Model\Store */
-        if ($store->dataHasChangedFor('group_id')) {
-            $this->_getIndexer()->rebuild($store->getId());
-        }
-
-        return $this;
-    }
-
-    /**
-     * Store delete after process
-     *
-     * @param EventObserver $observer
-     * @return $this
-     */
-    public function storeDelete(EventObserver $observer)
-    {
-        if (!$this->_getHelper()->isAvailable() || !$this->_getHelper()->isBuilt()) {
-            return $this;
-        }
-
-        $store = $observer->getEvent()->getStore();
-        /* @var $store \Magento\Core\Model\Store */
-
-        $this->_getIndexer()->deleteStore($store->getId());
-
-        return $this;
-    }
-
-    /**
-     * Store Group Save process
-     *
-     * @param EventObserver $observer
-     * @return $this
-     */
-    public function storeGroupSave(EventObserver $observer)
-    {
-        if (!$this->_getHelper()->isAvailable() || !$this->_getHelper()->isBuilt()) {
-            return $this;
-        }
-
-        $group = $observer->getEvent()->getGroup();
-        /* @var $group \Magento\Core\Model\Store\Group */
-
-        if ($group->dataHasChangedFor('website_id')) {
-            foreach ($group->getStores() as $store) {
-                /* @var $store \Magento\Core\Model\Store */
-                $this->_getIndexer()->rebuild($store->getId());
-            }
-        }
-
-        return $this;
-    }
-
-    /**
-     * Catalog Product Import After process
-     *
-     * @param EventObserver $observer
-     * @return $this
-     */
-    public function catalogProductImportAfter(EventObserver $observer)
-    {
-        if (!$this->_getHelper()->isAvailable() || !$this->_getHelper()->isBuilt()) {
-            return $this;
-        }
-
-        $this->_getIndexer()->rebuild();
-
-        return $this;
-    }
-
-    /**
-     * Customer Group save after process
-     *
-     * @param EventObserver $observer
-     * @return $this
-     */
-    public function customerGroupSaveAfter(EventObserver $observer)
-    {
-        if (!$this->_getHelper()->isAvailable() || !$this->_getHelper()->isBuilt()) {
-            return $this;
-        }
-
-        $customerGroup = $observer->getEvent()->getObject();
-        /* @var $customerGroup \Magento\Customer\Model\Group */
-        if ($customerGroup->dataHasChangedFor($customerGroup->getIdFieldName())
-            || $customerGroup->dataHasChangedFor('tax_class_id')) {
-            $this->_getIndexer()->updateEventAttributes();
-        }
-        return $this;
-    }
-}
diff --git a/app/code/Magento/Catalog/Model/Product/Indexer/Flat.php b/app/code/Magento/Catalog/Model/Product/Indexer/Flat.php
deleted file mode 100644
index 460f02747b9..00000000000
--- a/app/code/Magento/Catalog/Model/Product/Indexer/Flat.php
+++ /dev/null
@@ -1,465 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Catalog
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-namespace Magento\Catalog\Model\Product\Indexer;
-
-use Magento\Catalog\Helper\Product\Flat as ProductFlat;
-
-/**
- * @SuppressWarnings(PHPMD.LongVariable)
- */
-class Flat extends \Magento\Index\Model\Indexer\AbstractIndexer
-{
-    /**
-     * Data key for matching result to be saved in
-     */
-    const EVENT_MATCH_RESULT_KEY = 'catalog_product_flat_match_result';
-
-    /**
-     * Index math Entities array
-     *
-     * @var array
-     */
-    protected $_matchedEntities = array(
-        \Magento\Catalog\Model\Product::ENTITY => array(
-            \Magento\Index\Model\Event::TYPE_SAVE,
-            \Magento\Index\Model\Event::TYPE_MASS_ACTION,
-        ),
-        \Magento\Catalog\Model\Resource\Eav\Attribute::ENTITY => array(
-            \Magento\Index\Model\Event::TYPE_SAVE,
-            \Magento\Index\Model\Event::TYPE_DELETE,
-        ),
-        \Magento\Core\Model\Store::ENTITY => array(
-            \Magento\Index\Model\Event::TYPE_SAVE,
-            \Magento\Index\Model\Event::TYPE_DELETE
-        ),
-        \Magento\Core\Model\Store\Group::ENTITY => array(
-            \Magento\Index\Model\Event::TYPE_SAVE
-        ),
-        \Magento\Catalog\Model\Product\Flat\Indexer::ENTITY => array(
-            \Magento\Catalog\Model\Product\Flat\Indexer::EVENT_TYPE_REBUILD,
-        ),
-    );
-
-    /**
-     * Whether the indexer should be displayed on process/list page
-     *
-     * @return bool
-     */
-    /**
-     * Catalog product flat
-     *
-     * @var ProductFlat
-     */
-    protected $_catalogProductFlat = null;
-
-    /**
-     * Catalog product flat indexer
-     *
-     * @var \Magento\Catalog\Model\Product\Flat\Indexer
-     */
-    protected $_catalogProductFlatIndexer;
-
-    /**
-     * Store manager
-     *
-     * @var \Magento\Core\Model\StoreManagerInterface
-     */
-    protected $_storeManager;
-
-    /**
-     * Flat indexer factory
-     *
-     * @var \Magento\Catalog\Model\Product\Flat\IndexerFactory
-     */
-    protected $_flatIndexerFactory;
-
-    /**
-     * @param \Magento\Core\Model\Context $context
-     * @param \Magento\Core\Model\Registry $registry
-     * @param \Magento\Catalog\Model\Product\Flat\IndexerFactory $flatIndexerFactory
-     * @param \Magento\Core\Model\StoreManagerInterface $storeManager
-     * @param \Magento\Catalog\Model\Product\Flat\Indexer $catalogProductFlatIndexer
-     * @param ProductFlat $catalogProductFlat
-     * @param \Magento\Core\Model\Resource\AbstractResource $resource
-     * @param \Magento\Data\Collection\Db $resourceCollection
-     * @param array $data
-     */
-    public function __construct(
-        \Magento\Core\Model\Context $context,
-        \Magento\Core\Model\Registry $registry,
-        \Magento\Catalog\Model\Product\Flat\IndexerFactory $flatIndexerFactory,
-        \Magento\Core\Model\StoreManagerInterface $storeManager,
-        \Magento\Catalog\Model\Product\Flat\Indexer $catalogProductFlatIndexer,
-        ProductFlat $catalogProductFlat,
-        \Magento\Core\Model\Resource\AbstractResource $resource = null,
-        \Magento\Data\Collection\Db $resourceCollection = null,
-        array $data = array()
-    ) {
-        $this->_flatIndexerFactory = $flatIndexerFactory;
-        $this->_storeManager = $storeManager;
-        $this->_catalogProductFlatIndexer = $catalogProductFlatIndexer;
-        $this->_catalogProductFlat = $catalogProductFlat;
-        parent::__construct($context, $registry, $resource, $resourceCollection, $data);
-    }
-
-    /**
-     * @return bool
-     */
-    public function isVisible()
-    {
-        /** @var $productFlatHelper ProductFlat */
-        $productFlatHelper = $this->_catalogProductFlat;
-        return $productFlatHelper->isEnabled() || !$productFlatHelper->isBuilt();
-    }
-
-    /**
-     * Retrieve Indexer name
-     *
-     * @return string
-     */
-    public function getName()
-    {
-        return __('Product Flat Data');
-    }
-
-    /**
-     * Retrieve Indexer description
-     *
-     * @return string
-     */
-    public function getDescription()
-    {
-        return __('Reorganize EAV product structure to flat structure');
-    }
-
-    /**
-     * Check if event can be matched by process
-     * Overwrote for check is flat catalog product is enabled and specific save
-     * attribute, store, store_group
-     *
-     * @param \Magento\Index\Model\Event $event
-     * @return bool
-     */
-    public function matchEvent(\Magento\Index\Model\Event $event)
-    {
-        /** @var $productFlatHelper ProductFlat */
-        $productFlatHelper = $event->getFlatHelper() ?: $this->_catalogProductFlat;
-        if (!$productFlatHelper->isAvailable() || !$productFlatHelper->isBuilt()) {
-            return false;
-        }
-
-        $data = $event->getNewData();
-        if (isset($data[self::EVENT_MATCH_RESULT_KEY])) {
-            return $data[self::EVENT_MATCH_RESULT_KEY];
-        }
-
-        $entity = $event->getEntity();
-        switch ($entity) {
-            case \Magento\Catalog\Model\Resource\Eav\Attribute::ENTITY:
-                $result = $this->_matchAttributeEvent($event, $productFlatHelper);
-                break;
-
-            case \Magento\Core\Model\Store::ENTITY:
-                $result = $this->_matchStoreEvent($event);
-                break;
-
-            case \Magento\Core\Model\Store\Group::ENTITY:
-                $result = $this->_matchStoreGroupEvent($event);
-                break;
-
-            default:
-                $result = parent::matchEvent($event);
-                break;
-        }
-
-        $event->addNewData(self::EVENT_MATCH_RESULT_KEY, $result);
-
-        return $result;
-    }
-
-    /**
-     * Whether a store group available for matching or not
-     *
-     * @param \Magento\Index\Model\Event $event
-     * @return bool
-     */
-    protected function _matchStoreGroupEvent(\Magento\Index\Model\Event $event)
-     {
-         /* @var $storeGroup \Magento\Core\Model\Store\Group */
-         $storeGroup = $event->getDataObject();
-         if ($storeGroup && $storeGroup->dataHasChangedFor('website_id')) {
-             return true;
-         }
-         return false;
-     }
-
-    /**
-     * Whether a store available for matching or not
-     *
-     * @param \Magento\Index\Model\Event $event
-     * @return bool
-     */
-    protected function _matchStoreEvent(\Magento\Index\Model\Event $event)
-    {
-        if ($event->getType() == \Magento\Index\Model\Event::TYPE_DELETE) {
-            return true;
-        } else {
-            /* @var $store \Magento\Core\Model\Store */
-            $store = $event->getDataObject();
-            if ($store && $store->isObjectNew()) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Whether an attribute available for matching or not
-     *
-     * @param \Magento\Index\Model\Event $event
-     * @param ProductFlat $productFlatHelper
-     * @return bool
-     */
-    protected function _matchAttributeEvent(\Magento\Index\Model\Event $event, $productFlatHelper)
-    {
-        $attribute = $event->getDataObject();
-        if (!$attribute) {
-            return false;
-        }
-
-        $enableBefore = $this->_isAttributeEnabled($attribute, $productFlatHelper);
-        $enableAfter = $this->_isAttributeEnabled($attribute, $productFlatHelper, false);
-
-        if ($event->getType() == \Magento\Index\Model\Event::TYPE_DELETE) {
-            return $enableBefore;
-        } elseif ($event->getType() == \Magento\Index\Model\Event::TYPE_SAVE && ($enableAfter || $enableBefore)) {
-            return true;
-        }
-
-        return false;
-    }
-
-    /**
-     * Whether an attribute available for matching or not
-     *
-     * @param \Magento\Catalog\Model\Resource\Eav\Attribute $attribute
-     * @param ProductFlat $productFlatHelper
-     * @param bool $before
-     * @return bool
-     */
-    protected function _isAttributeEnabled($attribute, $productFlatHelper, $before = true)
-    {
-        $method = $before ? 'getOrigData': 'getData';
-
-        return $attribute && (($attribute->$method('backend_type') == 'static')
-            || ($productFlatHelper->isAddFilterableAttributes() && $attribute->$method('is_filterable') > 0)
-            || ($attribute->$method('used_in_product_listing') == 1)
-            || ($attribute->$method('is_used_for_promo_rules') == 1)
-            || ($attribute->$method('used_for_sort_by') == 1));
-    }
-
-    /**
-     * Register data required by process in event object
-     *
-     * @param \Magento\Index\Model\Event $event
-     * @return void
-     */
-    protected function _registerEvent(\Magento\Index\Model\Event $event)
-    {
-        $event->addNewData(self::EVENT_MATCH_RESULT_KEY, true);
-        switch ($event->getEntity()) {
-            case \Magento\Catalog\Model\Product::ENTITY:
-                $this->_registerCatalogProductEvent($event);
-                break;
-            case \Magento\Core\Model\Store::ENTITY:
-                if ($event->getType() == \Magento\Index\Model\Event::TYPE_DELETE) {
-                    $this->_registerCoreStoreEvent($event);
-                    break;
-                }
-            // fall-through intentional
-            case \Magento\Catalog\Model\Resource\Eav\Attribute::ENTITY:
-            case \Magento\Core\Model\Store\Group::ENTITY:
-                $event->addNewData('catalog_product_flat_skip_call_event_handler', true);
-                $process = $event->getProcess();
-                $process->changeStatus(\Magento\Index\Model\Process::STATUS_REQUIRE_REINDEX);
-                break;
-            case \Magento\Catalog\Model\Product\Flat\Indexer::ENTITY:
-                switch ($event->getType()) {
-                    case \Magento\Catalog\Model\Product\Flat\Indexer::EVENT_TYPE_REBUILD:
-                        $event->addNewData('id', $event->getDataObject()->getId());
-                }
-                break;
-        }
-    }
-
-    /**
-     * Register data required by catalog product process in event object
-     *
-     * @param \Magento\Index\Model\Event $event
-     * @return $this
-     */
-    protected function _registerCatalogProductEvent(\Magento\Index\Model\Event $event)
-    {
-        switch ($event->getType()) {
-            case \Magento\Index\Model\Event::TYPE_SAVE:
-                /* @var $product \Magento\Catalog\Model\Product */
-                $product = $event->getDataObject();
-                $event->addNewData('catalog_product_flat_product_id', $product->getId());
-                break;
-
-            case \Magento\Index\Model\Event::TYPE_MASS_ACTION:
-                /* @var $actionObject \Magento\Object */
-                $actionObject = $event->getDataObject();
-
-                $reindexData  = array();
-                $reindexFlat  = false;
-
-                // check if status changed
-                $attrData = $actionObject->getAttributesData();
-                if (isset($attrData['status'])) {
-                    $reindexFlat = true;
-                    $reindexData['catalog_product_flat_status'] = $attrData['status'];
-                }
-
-                // check changed websites
-                if ($actionObject->getWebsiteIds()) {
-                    $reindexFlat = true;
-                    $reindexData['catalog_product_flat_website_ids'] = $actionObject->getWebsiteIds();
-                    $reindexData['catalog_product_flat_action_type'] = $actionObject->getActionType();
-                }
-
-                $flatAttributes = array();
-                if (is_array($attrData)) {
-                    $flatAttributes = array_intersect($this->_getFlatAttributes(), array_keys($attrData));
-                }
-
-                if (count($flatAttributes) > 0) {
-                    $reindexFlat = true;
-                    $reindexData['catalog_product_flat_force_update'] = true;
-                }
-
-                // register affected products
-                if ($reindexFlat) {
-                    $reindexData['catalog_product_flat_product_ids'] = $actionObject->getProductIds();
-                    foreach ($reindexData as $k => $v) {
-                        $event->addNewData($k, $v);
-                    }
-                }
-                break;
-        }
-
-        return $this;
-    }
-
-    /**
-     * Register core store delete process
-     *
-     * @param \Magento\Index\Model\Event $event
-     * @return $this
-     */
-    protected function _registerCoreStoreEvent(\Magento\Index\Model\Event $event)
-    {
-        if ($event->getType() == \Magento\Index\Model\Event::TYPE_DELETE) {
-            /* @var $store \Magento\Core\Model\Store */
-            $store = $event->getDataObject();
-            $event->addNewData('catalog_product_flat_delete_store_id', $store->getId());
-        }
-        return $this;
-    }
-
-    /**
-     * Process event
-     *
-     * @param \Magento\Index\Model\Event $event
-     * @return void
-     */
-    protected function _processEvent(\Magento\Index\Model\Event $event)
-    {
-        $data = $event->getNewData();
-        if ($event->getType() == \Magento\Catalog\Model\Product\Flat\Indexer::EVENT_TYPE_REBUILD) {
-            $this->_catalogProductFlatIndexer->getResource()->rebuild($data['id']);
-            return;
-        }
-
-
-        if (!empty($data['catalog_product_flat_reindex_all'])) {
-            $this->reindexAll();
-        } else if (!empty($data['catalog_product_flat_product_id'])) {
-            // catalog_product save
-            $productId = $data['catalog_product_flat_product_id'];
-            $this->_catalogProductFlatIndexer->saveProduct($productId);
-        } else if (!empty($data['catalog_product_flat_product_ids'])) {
-            // catalog_product mass_action
-            $productIds = $data['catalog_product_flat_product_ids'];
-
-            if (!empty($data['catalog_product_flat_website_ids'])) {
-                $websiteIds = $data['catalog_product_flat_website_ids'];
-                foreach ($websiteIds as $websiteId) {
-                    $website = $this->_storeManager->getWebsite($websiteId);
-                    foreach ($website->getStores() as $store) {
-                        if ($data['catalog_product_flat_action_type'] == 'remove') {
-                            $this->_catalogProductFlatIndexer->removeProduct($productIds, $store->getId());
-                        } else {
-                            $this->_catalogProductFlatIndexer->updateProduct($productIds, $store->getId());
-                        }
-                    }
-                }
-            }
-
-            if (isset($data['catalog_product_flat_status'])) {
-                $status = $data['catalog_product_flat_status'];
-                $this->_catalogProductFlatIndexer->updateProductStatus($productIds, $status);
-            }
-
-            if (isset($data['catalog_product_flat_force_update'])) {
-                $this->_catalogProductFlatIndexer->updateProduct($productIds);
-            }
-        } else if (!empty($data['catalog_product_flat_delete_store_id'])) {
-            $this->_catalogProductFlatIndexer->deleteStore($data['catalog_product_flat_delete_store_id']);
-        }
-    }
-
-    /**
-     * Rebuild all index data
-     *
-     * @return void
-     */
-    public function reindexAll()
-    {
-        $this->_catalogProductFlatIndexer->reindexAll();
-    }
-
-    /**
-     * Retrieve list of attribute codes, that are used in flat
-     *
-     * @return array
-     */
-    protected function _getFlatAttributes()
-    {
-        return $this->_flatIndexerFactory->create()->getAttributeCodes();
-    }
-}
diff --git a/app/code/Magento/Catalog/Model/Product/PriceModifier/Composite.php b/app/code/Magento/Catalog/Model/Product/PriceModifier/Composite.php
new file mode 100644
index 00000000000..ad7d3365cda
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Product/PriceModifier/Composite.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * Composite price modifier can be used.
+ * Any module can add its price modifier to extend price modification from other modules.
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Product\PriceModifier;
+
+use Magento\Catalog\Model\Product\PriceModifierInterface;
+use Magento\Catalog\Model\Product;
+use Magento\ObjectManager;
+
+class Composite implements PriceModifierInterface
+{
+    /**
+     * @var \Magento\ObjectManager
+     */
+    protected $objectManager;
+
+    /**
+     * @var array
+     */
+    protected $modifiers;
+
+    /**
+     * @param ObjectManager $objectManager
+     * @param array $modifiers
+     */
+    public function __construct(ObjectManager $objectManager, array $modifiers = array())
+    {
+        $this->objectManager = $objectManager;
+        $this->modifiers = $modifiers;
+    }
+
+    /**
+     * Modify price
+     *
+     * @param mixed $price
+     * @param Product $product
+     * @return mixed
+     */
+    public function modifyPrice($price, Product $product)
+    {
+        foreach ($this->modifiers as $modifierClass) {
+            $price = $this->objectManager->get($modifierClass)->modifyPrice($price, $product);
+        }
+        return $price;
+    }
+}
diff --git a/app/code/Magento/Catalog/Model/Product/PriceModifierInterface.php b/app/code/Magento/Catalog/Model/Product/PriceModifierInterface.php
new file mode 100644
index 00000000000..50c96d4a9b4
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Product/PriceModifierInterface.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Price calculation extension point
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Catalog\Model\Product;
+
+use Magento\Catalog\Model\Product;
+
+interface PriceModifierInterface
+{
+    /**
+     * Modify price
+     *
+     * @param mixed $price
+     * @param Product $product
+     * @return mixed
+     */
+    public function modifyPrice($price, Product $product);
+} 
diff --git a/app/code/Magento/Catalog/Model/Product/Status.php b/app/code/Magento/Catalog/Model/Product/Status.php
deleted file mode 100644
index 183159a64cc..00000000000
--- a/app/code/Magento/Catalog/Model/Product/Status.php
+++ /dev/null
@@ -1,357 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Catalog
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-
-
-/**
- * Product status functionality model
- *
- * @method \Magento\Catalog\Model\Resource\Product\Status getResource()
- * @method int getProductId()
- * @method \Magento\Catalog\Model\Product\Status setProductId(int $value)
- * @method int getStoreId()
- * @method \Magento\Catalog\Model\Product\Status setStoreId(int $value)
- * @method int getVisibility()
- * @method \Magento\Catalog\Model\Product\Status setVisibility(int $value)
- *
- * @category    Magento
- * @package     Magento_Catalog
- * @author      Magento Core Team <core@magentocommerce.com>
- */
-namespace Magento\Catalog\Model\Product;
-
-class Status extends \Magento\Core\Model\AbstractModel
-{
-    const STATUS_ENABLED    = 1;
-    const STATUS_DISABLED   = 2;
-
-    /**
-     * Reference to the attribute instance
-     *
-     * @var \Magento\Catalog\Model\Resource\Eav\Attribute
-     */
-    protected $_attribute;
-
-    /**
-     * Catalog product action
-     *
-     * @var \Magento\Catalog\Model\Product\Action
-     */
-    protected $_catalogProductAction;
-
-    /**
-     * Store manager
-     *
-     * @var \Magento\Core\Model\StoreManagerInterface
-     */
-    protected $_storeManager;
-
-    /**
-     * @param \Magento\Core\Model\Context $context
-     * @param \Magento\Core\Model\Registry $registry
-     * @param \Magento\Core\Model\StoreManagerInterface $storeManager
-     * @param \Magento\Catalog\Model\Product\Action $catalogProductAction
-     * @param \Magento\Core\Model\Resource\AbstractResource $resource
-     * @param \Magento\Data\Collection\Db $resourceCollection
-     * @param array $data
-     */
-    public function __construct(
-        \Magento\Core\Model\Context $context,
-        \Magento\Core\Model\Registry $registry,
-        \Magento\Core\Model\StoreManagerInterface $storeManager,
-        \Magento\Catalog\Model\Product\Action $catalogProductAction,
-        \Magento\Core\Model\Resource\AbstractResource $resource = null,
-        \Magento\Data\Collection\Db $resourceCollection = null,
-        array $data = array()
-    ) {
-        $this->_storeManager = $storeManager;
-        $this->_catalogProductAction = $catalogProductAction;
-        parent::__construct($context, $registry, $resource, $resourceCollection, $data);
-    }
-
-    /**
-     * Initialize resource model
-     *
-     * @return void
-     */
-    protected function _construct()
-    {
-        $this->_init('Magento\Catalog\Model\Resource\Product\Status');
-    }
-
-    /**
-     * Retrieve resource model wrapper
-     *
-     * @return \Magento\Catalog\Model\Resource\Product\Status
-     */
-    protected function _getResource()
-    {
-        return parent::_getResource();
-    }
-
-    /**
-     * Retrieve Product Attribute by code
-     *
-     * @param string $attributeCode
-     * @return \Magento\Eav\Model\Entity\Attribute\AbstractAttribute
-     */
-    public function getProductAttribute($attributeCode)
-    {
-        return $this->_getResource()->getProductAttribute($attributeCode);
-    }
-
-    /**
-     * Retrieve Visible Status Ids
-     *
-     * @return string[]
-     */
-    public function getVisibleStatusIds()
-    {
-        return array(self::STATUS_ENABLED);
-    }
-
-    /**
-     * Retrieve Saleable Status Ids
-     * Default Product Enable status
-     *
-     * @return int[]
-     */
-    public function getSaleableStatusIds()
-    {
-        return array(self::STATUS_ENABLED);
-    }
-
-    /**
-     * Retrieve option array
-     *
-     * @return array
-     */
-    static public function getOptionArray()
-    {
-        return array(
-            self::STATUS_ENABLED    => __('Enabled'),
-            self::STATUS_DISABLED   => __('Disabled')
-        );
-    }
-
-    /**
-     * Retrieve option array with empty value
-     *
-     * @return array
-     */
-    static public function getAllOption()
-    {
-        $options = self::getOptionArray();
-        array_unshift($options, array('value'=>'', 'label'=>''));
-        return $options;
-    }
-
-    /**
-     * Retrieve option array with empty value
-     *
-     * @return array
-     */
-    static public function getAllOptions()
-    {
-        $res = array();
-        foreach (self::getOptionArray() as $index => $value) {
-            $res[] = array(
-               'value' => $index,
-               'label' => $value
-            );
-        }
-        return $res;
-    }
-
-    /**
-     * Retrieve option text by option value
-     *
-     * @param string $optionId
-     * @return string
-     */
-    static public function getOptionText($optionId)
-    {
-        $options = self::getOptionArray();
-        return isset($options[$optionId]) ? $options[$optionId] : null;
-    }
-
-    /**
-     * Update status value for product
-     *
-     * @param   int $productId
-     * @param   int $storeId
-     * @param   int $value
-     * @return  \Magento\Catalog\Model\Product\Status
-     */
-    public function updateProductStatus($productId, $storeId, $value)
-    {
-        $this->_catalogProductAction
-            ->updateAttributes(array($productId), array('status' => $value), $storeId);
-
-        // add back compatibility event
-        $status = $this->_getResource()->getProductAttribute('status');
-        if ($status->isScopeWebsite()) {
-            $website = $this->_storeManager->getStore($storeId)->getWebsite();
-            $stores  = $website->getStoreIds();
-        } else if ($status->isScopeStore()) {
-            $stores = array($storeId);
-        } else {
-            $stores = array_keys($this->_storeManager->getStores());
-        }
-
-        foreach ($stores as $storeId) {
-            $this->_eventManager->dispatch('catalog_product_status_update', array(
-                'product_id'    => $productId,
-                'store_id'      => $storeId,
-                'status'        => $value
-            ));
-        }
-
-        return $this;
-    }
-
-    /**
-     * Retrieve Product(s) status for store
-     * Return array where key is product, value - status
-     *
-     * @param int|array $productIds
-     * @param int $storeId
-     * @return array
-     */
-    public function getProductStatus($productIds, $storeId = null)
-    {
-        return $this->getResource()->getProductStatus($productIds, $storeId);
-    }
-
-    /**
-     * ---------------- Eav Source methods for Flat data -----------------------
-     */
-
-    /**
-     * Retrieve flat column definition
-     *
-     * @return array
-     */
-    public function getFlatColums()
-    {
-        return array();
-    }
-
-    /**
-     * Retrieve Indexes for Flat
-     *
-     * @return array
-     */
-    public function getFlatIndexes()
-    {
-        return array();
-    }
-
-    /**
-     * Retrieve Select For Flat Attribute update
-     *
-     * @param int $store
-     * @return \Magento\DB\Select|null
-     */
-    public function getFlatUpdateSelect($store)
-    {
-        return null;
-    }
-
-    /**
-     * Set attribute instance
-     *
-     * @param \Magento\Catalog\Model\Resource\Eav\Attribute $attribute
-     * @return $this
-     */
-    public function setAttribute($attribute)
-    {
-        $this->_attribute = $attribute;
-        return $this;
-    }
-
-    /**
-     * Get attribute instance
-     *
-     * @return \Magento\Catalog\Model\Resource\Eav\Attribute
-     */
-    public function getAttribute()
-    {
-        return $this->_attribute;
-    }
-
-    /**
-     * Add Value Sort To Collection Select
-     *
-     * @param \Magento\Eav\Model\Entity\Collection\AbstractCollection $collection
-     * @param string $dir direction
-     * @return $this
-     */
-    public function addValueSortToCollection($collection, $dir = 'asc')
-    {
-        $attributeCode  = $this->getAttribute()->getAttributeCode();
-        $attributeId    = $this->getAttribute()->getId();
-        $attributeTable = $this->getAttribute()->getBackend()->getTable();
-
-        if ($this->getAttribute()->isScopeGlobal()) {
-            $tableName = $attributeCode . '_t';
-            $collection->getSelect()
-                ->joinLeft(
-                    array($tableName => $attributeTable),
-                    "e.entity_id={$tableName}.entity_id"
-                        . " AND {$tableName}.attribute_id='{$attributeId}'"
-                        . " AND {$tableName}.store_id='0'",
-                    array());
-            $valueExpr = $tableName . '.value';
-        }
-        else {
-            $valueTable1 = $attributeCode . '_t1';
-            $valueTable2 = $attributeCode . '_t2';
-            $collection->getSelect()
-                ->joinLeft(
-                    array($valueTable1 => $attributeTable),
-                    "e.entity_id={$valueTable1}.entity_id"
-                        . " AND {$valueTable1}.attribute_id='{$attributeId}'"
-                        . " AND {$valueTable1}.store_id='0'",
-                    array())
-                ->joinLeft(
-                    array($valueTable2 => $attributeTable),
-                    "e.entity_id={$valueTable2}.entity_id"
-                        . " AND {$valueTable2}.attribute_id='{$attributeId}'"
-                        . " AND {$valueTable2}.store_id='{$collection->getStoreId()}'",
-                    array()
-                );
-
-                $valueExpr = $collection->getConnection()->getCheckSql(
-                    $valueTable2 . '.value_id > 0',
-                    $valueTable2 . '.value',
-                    $valueTable1 . '.value'
-                );
-        }
-
-        $collection->getSelect()->order($valueExpr . ' ' . $dir);
-        return $this;
-    }
-}
diff --git a/app/code/Magento/Catalog/Model/Product/Type.php b/app/code/Magento/Catalog/Model/Product/Type.php
index 0dfed06d58a..7dffe7b36cd 100644
--- a/app/code/Magento/Catalog/Model/Product/Type.php
+++ b/app/code/Magento/Catalog/Model/Product/Type.php
@@ -36,7 +36,6 @@ class Type
      */
     const TYPE_SIMPLE       = 'simple';
     const TYPE_BUNDLE       = 'bundle';
-    const TYPE_CONFIGURABLE = 'configurable';
     const TYPE_VIRTUAL      = 'virtual';
     /**#@-*/
 
diff --git a/app/code/Magento/Catalog/Model/Product/Type/AbstractType.php b/app/code/Magento/Catalog/Model/Product/Type/AbstractType.php
index bc1711cc48c..c5f661fe230 100644
--- a/app/code/Magento/Catalog/Model/Product/Type/AbstractType.php
+++ b/app/code/Magento/Catalog/Model/Product/Type/AbstractType.php
@@ -56,7 +56,7 @@ abstract class AbstractType
     protected $_isComposite = false;
 
     /**
-     * Is a configurable product type
+     * If product can be configured
      *
      * @var bool
      */
@@ -355,7 +355,7 @@ abstract class AbstractType
      */
     public function isSalable($product)
     {
-        $salable = $product->getStatus() == \Magento\Catalog\Model\Product\Status::STATUS_ENABLED;
+        $salable = $product->getStatus() == \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED;
         if ($salable && $product->hasData('is_salable')) {
             $salable = $product->getData('is_salable');
         }
@@ -745,7 +745,7 @@ abstract class AbstractType
     }
 
     /**
-     * Check if product is configurable
+     * Check if product can be configured
      *
      * @param \Magento\Catalog\Model\Product $product
      * @return bool
diff --git a/app/code/Magento/Catalog/Model/Product/TypeTransitionManager.php b/app/code/Magento/Catalog/Model/Product/TypeTransitionManager.php
new file mode 100644
index 00000000000..981fa6aa2aa
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Product/TypeTransitionManager.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Product type transition manager
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Catalog\Model\Product;
+
+use Magento\Catalog\Model\Product;
+
+class TypeTransitionManager
+{
+    /**
+     * List of compatible product types
+     *
+     * @var array
+     */
+    protected $compatibleTypes;
+
+    /**
+     * @param array $compatibleTypes
+     */
+    public function __construct(
+        array $compatibleTypes
+    ) {
+        $this->compatibleTypes = $compatibleTypes;
+    }
+
+    /**
+     * Process given product and change its type if needed
+     *
+     * @param \Magento\Catalog\Model\Product $product
+     */
+    public function processProduct(Product $product)
+    {
+        if (in_array($product->getTypeId(), $this->compatibleTypes)) {
+            $product->setTypeInstance(null);
+            $productTypeId = $product->hasIsVirtual() ? \Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL
+                : \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE;
+            $product->setTypeId($productTypeId);
+        }
+    }
+
+}
diff --git a/app/code/Magento/Sales/Block/Adminhtml/Items/Renderer/Configurable.php b/app/code/Magento/Catalog/Model/Product/Validator.php
similarity index 67%
rename from app/code/Magento/Sales/Block/Adminhtml/Items/Renderer/Configurable.php
rename to app/code/Magento/Catalog/Model/Product/Validator.php
index 4ef4838093e..54a6b5a2eee 100644
--- a/app/code/Magento/Sales/Block/Adminhtml/Items/Renderer/Configurable.php
+++ b/app/code/Magento/Catalog/Model/Product/Validator.php
@@ -1,5 +1,6 @@
 <?php
 /**
+ *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -18,27 +19,26 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Sales
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Catalog\Model\Product;
 
+use Magento\App\RequestInterface;
+use Magento\Catalog\Model\Product;
 
-/**
- * Adminhtml sales order item renderer
- *
- * @category   Magento
- * @package    Magento_Sales
- * @author     Magento Core Team <core@magentocommerce.com>
- */
-namespace Magento\Sales\Block\Adminhtml\Items\Renderer;
-
-class Configurable extends  \Magento\Sales\Block\Adminhtml\Items\AbstractItems
+class Validator
 {
-
-    public function getItem()
+    /**
+     * Validate product data
+     *
+     * @param Product $product
+     * @param RequestInterface $request
+     * @param \Magento\Object $response
+     * @return array
+     */
+    public function validate(Product $product, RequestInterface $request, \Magento\Object $response)
     {
-        return $this->_getData('item');//->getOrderItem();
+        return $product->validate();
     }
 }
diff --git a/app/code/Magento/Catalog/Model/Product/Visibility.php b/app/code/Magento/Catalog/Model/Product/Visibility.php
index 48aa003dc7c..ef9c86bdb03 100644
--- a/app/code/Magento/Catalog/Model/Product/Visibility.php
+++ b/app/code/Magento/Catalog/Model/Product/Visibility.php
@@ -180,14 +180,9 @@ class Visibility extends \Magento\Object
             'extra'     => null
         );
 
-        if ($this->_coreData->useDbCompatibleMode()) {
-            $column['type']     = 'tinyint';
-            $column['is_null']  = true;
-        } else {
-            $column['type']     = \Magento\DB\Ddl\Table::TYPE_SMALLINT;
-            $column['nullable'] = true;
-            $column['comment']  = 'Catalog Product Visibility ' . $attributeCode . ' column';
-        }
+        $column['type']     = \Magento\DB\Ddl\Table::TYPE_SMALLINT;
+        $column['nullable'] = true;
+        $column['comment']  = 'Catalog Product Visibility ' . $attributeCode . ' column';
 
         return array($attributeCode => $column);
     }
diff --git a/app/code/Magento/Catalog/Model/ProductTypes/Config.php b/app/code/Magento/Catalog/Model/ProductTypes/Config.php
index e07b60fa5a1..1a13853bed2 100644
--- a/app/code/Magento/Catalog/Model/ProductTypes/Config.php
+++ b/app/code/Magento/Catalog/Model/ProductTypes/Config.php
@@ -79,4 +79,23 @@ class Config extends \Magento\Config\Data implements \Magento\Catalog\Model\Prod
     {
         return $this->get('composableTypes', array());
     }
+
+    /**
+     * Get list of product types that comply with condition
+     *
+     * @param string $attributeName
+     * @param string $value
+     * @return array
+     */
+    public function filter($attributeName, $value = 'true')
+    {
+        $availableProductTypes = array();
+        foreach ($this->getAll() as $type) {
+            if (!isset($type['custom_attributes'][$attributeName])
+                || $type['custom_attributes'][$attributeName] == $value) {
+                $availableProductTypes[$type['name']] = $type['name'];
+            }
+        }
+        return $availableProductTypes;
+    }
 }
diff --git a/app/code/Magento/Catalog/Model/ProductTypes/ConfigInterface.php b/app/code/Magento/Catalog/Model/ProductTypes/ConfigInterface.php
index b66db7b741a..07f4f970c35 100644
--- a/app/code/Magento/Catalog/Model/ProductTypes/ConfigInterface.php
+++ b/app/code/Magento/Catalog/Model/ProductTypes/ConfigInterface.php
@@ -54,4 +54,14 @@ interface ConfigInterface
      * @return array
      */
     public function getComposableTypes();
+
+
+    /**
+     * Get list of product types that comply with condition
+     *
+     * @param string $customAttributeName
+     * @param string $value
+     * @return array
+     */
+    public function filter($customAttributeName, $value = 'true');
 }
diff --git a/app/code/Magento/Catalog/Model/Resource/Attribute.php b/app/code/Magento/Catalog/Model/Resource/Attribute.php
index 3ff094235f8..90cf75170aa 100644
--- a/app/code/Magento/Catalog/Model/Resource/Attribute.php
+++ b/app/code/Magento/Catalog/Model/Resource/Attribute.php
@@ -25,6 +25,8 @@
  */
 namespace Magento\Catalog\Model\Resource;
 
+use \Magento\Catalog\Model\Attribute\LockValidatorInterface;
+
 /**
  * Catalog attribute resource model
  *
@@ -32,6 +34,7 @@ namespace Magento\Catalog\Model\Resource;
  * @package     Magento_Catalog
  * @author      Magento Core Team <core@magentocommerce.com>
  */
+
 class Attribute extends \Magento\Eav\Model\Resource\Entity\Attribute
 {
     /**
@@ -42,19 +45,25 @@ class Attribute extends \Magento\Eav\Model\Resource\Entity\Attribute
     protected $_eavConfig;
 
     /**
-     * Class constructor
-     *
+     * @var LockValidatorInterface
+     */
+    protected $attrLockValidator;
+
+    /**
      * @param \Magento\App\Resource $resource
      * @param \Magento\Core\Model\StoreManagerInterface $storeManager
      * @param \Magento\Eav\Model\Resource\Entity\Type $eavEntityType
      * @param \Magento\Eav\Model\Config $eavConfig
+     * @param LockValidatorInterface $lockValidator
      */
     public function __construct(
         \Magento\App\Resource $resource,
         \Magento\Core\Model\StoreManagerInterface $storeManager,
         \Magento\Eav\Model\Resource\Entity\Type $eavEntityType,
-        \Magento\Eav\Model\Config $eavConfig
+        \Magento\Eav\Model\Config $eavConfig,
+        LockValidatorInterface $lockValidator
     ) {
+        $this->attrLockValidator = $lockValidator;
         $this->_eavConfig = $eavConfig;
         parent::__construct($resource, $storeManager, $eavEntityType);
     }
@@ -136,10 +145,14 @@ class Attribute extends \Magento\Eav\Model\Resource\Entity\Attribute
             $attribute = $this->_eavConfig
                 ->getAttribute(\Magento\Catalog\Model\Product::ENTITY, $result['attribute_id']);
 
-            if ($this->isUsedBySuperProducts($attribute, $result['attribute_set_id'])) {
-                throw new \Magento\Core\Exception(__("Attribute '%1' used in configurable products",
-                    $attribute->getAttributeCode()));
+            try {
+                $this->attrLockValidator->validate($attribute, $result['attribute_set_id']);
+            } catch (\Magento\Core\Exception $exception) {
+                throw new \Magento\Core\Exception(
+                    __("Attribute '%1' is locked. ", $attribute->getAttributeCode()) . $exception->getMessage()
+                );
             }
+
             $backendTable = $attribute->getBackend()->getTable();
             if ($backendTable) {
                 $select = $this->_getWriteAdapter()->select()
@@ -160,34 +173,4 @@ class Attribute extends \Magento\Eav\Model\Resource\Entity\Attribute
 
         return $this;
     }
-
-    /**
-     * Defines is Attribute used by super products
-     *
-     * @param \Magento\Core\Model\AbstractModel $object
-     * @param int $attributeSet
-     * @return int
-     */
-    public function isUsedBySuperProducts(\Magento\Core\Model\AbstractModel $object, $attributeSet = null)
-    {
-        $adapter      = $this->_getReadAdapter();
-        $attrTable    = $this->getTable('catalog_product_super_attribute');
-        $productTable = $this->getTable('catalog_product_entity');
-
-        $bind = array('attribute_id' => $object->getAttributeId());
-        $select = clone $adapter->select();
-        $select->reset()
-            ->from(array('main_table' => $attrTable), array('psa_count' => 'COUNT(product_super_attribute_id)'))
-            ->join(array('entity' => $productTable), 'main_table.product_id = entity.entity_id')
-            ->where('main_table.attribute_id = :attribute_id')
-            ->group('main_table.attribute_id')
-            ->limit(1);
-
-        if ($attributeSet !== null) {
-            $bind['attribute_set_id'] = $attributeSet;
-            $select->where('entity.attribute_set_id = :attribute_set_id');
-        }
-
-        return $adapter->fetchOne($select, $bind);
-    }
 }
diff --git a/app/code/Magento/Catalog/Model/Resource/Category.php b/app/code/Magento/Catalog/Model/Resource/Category.php
index 8df2283e5bd..59c21880c8b 100644
--- a/app/code/Magento/Catalog/Model/Resource/Category.php
+++ b/app/code/Magento/Catalog/Model/Resource/Category.php
@@ -884,6 +884,7 @@ class Category extends AbstractResource
 
         // Update category object to new data
         $category->addData($data);
+        $category->unsetData('path_ids');
 
         return $this;
     }
diff --git a/app/code/Magento/Catalog/Model/Resource/Category/Indexer/Product.php b/app/code/Magento/Catalog/Model/Resource/Category/Indexer/Product.php
deleted file mode 100644
index 40d526f32aa..00000000000
--- a/app/code/Magento/Catalog/Model/Resource/Category/Indexer/Product.php
+++ /dev/null
@@ -1,1152 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Catalog
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-namespace Magento\Catalog\Model\Resource\Category\Indexer;
-
-/**
- * Resource model for category product indexer
- *
- * @category    Magento
- * @package     Magento_Catalog
- * @author      Magento Core Team <core@magentocommerce.com>
- */
-class Product extends \Magento\Index\Model\Resource\AbstractResource
-{
-    /**
-     * Category table
-     *
-     * @var string
-     */
-    protected $_categoryTable;
-
-    /**
-     * Category product table
-     *
-     * @var string
-     */
-    protected $_categoryProductTable;
-
-    /**
-     * Product website table
-     *
-     * @var string
-     */
-    protected $_productWebsiteTable;
-
-    /**
-     * Store table
-     *
-     * @var string
-     */
-    protected $_storeTable;
-
-    /**
-     * Group table
-     *
-     * @var string
-     */
-    protected $_groupTable;
-
-    /**
-     * Array of info about stores
-     *
-     * @var array
-     */
-    protected $_storesInfo;
-
-    /**
-     * Eav config
-     *
-     * @var \Magento\Eav\Model\Config
-     */
-    protected $_eavConfig;
-
-    /**
-     * @param \Magento\App\Resource $resource
-     * @param \Magento\Eav\Model\Config $eavConfig
-     */
-    public function __construct(\Magento\App\Resource $resource, \Magento\Eav\Model\Config $eavConfig)
-    {
-        $this->_eavConfig = $eavConfig;
-        parent::__construct($resource);
-    }
-
-    /**
-     * Model initialization
-     *
-     * @return void
-     */
-    protected function _construct()
-    {
-        $this->_init('catalog_category_product_index', 'category_id');
-        $this->_categoryTable        = $this->getTable('catalog_category_entity');
-        $this->_categoryProductTable = $this->getTable('catalog_category_product');
-        $this->_productWebsiteTable  = $this->getTable('catalog_product_website');
-        $this->_storeTable           = $this->getTable('core_store');
-        $this->_groupTable           = $this->getTable('core_store_group');
-    }
-
-    /**
-     * Process product save.
-     * Method is responsible for index support
-     * when product was saved and assigned categories was changed.
-     *
-     * @param \Magento\Index\Model\Event $event
-     * @return $this
-     */
-    public function catalogProductSave(\Magento\Index\Model\Event $event)
-    {
-        $productId = $event->getEntityPk();
-        $data      = $event->getNewData();
-
-        /**
-         * Check if category ids were updated
-         */
-        if (!isset($data['category_ids'])) {
-            return $this;
-        }
-
-        /**
-         * Select relations to categories
-         */
-        $select = $this->_getWriteAdapter()->select()
-            ->from(array('cp' => $this->_categoryProductTable), 'category_id')
-            ->joinInner(array('ce' => $this->_categoryTable), 'ce.entity_id=cp.category_id', 'path')
-            ->where('cp.product_id=:product_id');
-
-        /**
-         * Get information about product categories
-         */
-        $categories = $this->_getWriteAdapter()->fetchPairs($select, array('product_id' => $productId));
-        $categoryIds = array();
-        $allCategoryIds = array();
-
-        foreach ($categories as $id=>$path) {
-            $categoryIds[]  = $id;
-            $allCategoryIds = array_merge($allCategoryIds, explode('/', $path));
-        }
-        $allCategoryIds = array_unique($allCategoryIds);
-        $allCategoryIds = array_diff($allCategoryIds, $categoryIds);
-
-        /**
-         * Delete previous index data
-         */
-        $this->_getWriteAdapter()->delete(
-            $this->getMainTable(),
-            array('product_id = ?' => $productId)
-        );
-
-        $this->_refreshAnchorRelations($allCategoryIds, $productId);
-        $this->_refreshDirectRelations($categoryIds, $productId);
-        $this->_refreshRootRelations($productId);
-        return $this;
-    }
-
-    /**
-     * Process Catalog Product mass action
-     *
-     * @param \Magento\Index\Model\Event $event
-     * @return $this
-     */
-    public function catalogProductMassAction(\Magento\Index\Model\Event $event)
-    {
-        $data = $event->getNewData();
-
-        /**
-         * check is product ids were updated
-         */
-        if (!isset($data['product_ids'])) {
-            return $this;
-        }
-        $productIds     = $data['product_ids'];
-        $categoryIds    = array();
-        $allCategoryIds = array();
-
-        /**
-         * Select relations to categories
-         */
-        $adapter = $this->_getWriteAdapter();
-        $select  = $adapter->select()
-            ->distinct(true)
-            ->from(array('cp' => $this->_categoryProductTable), array('category_id'))
-            ->join(
-                array('ce' => $this->_categoryTable),
-                'ce.entity_id=cp.category_id',
-                array('path'))
-            ->where('cp.product_id IN(?)', $productIds);
-        $pairs   = $adapter->fetchPairs($select);
-        foreach ($pairs as $categoryId => $categoryPath) {
-            $categoryIds[] = $categoryId;
-            $allCategoryIds = array_merge($allCategoryIds, explode('/', $categoryPath));
-        }
-
-        $allCategoryIds = array_unique($allCategoryIds);
-        $allCategoryIds = array_diff($allCategoryIds, $categoryIds);
-
-        /**
-         * Delete previous index data
-         */
-        $this->_getWriteAdapter()->delete(
-            $this->getMainTable(), array('product_id IN(?)' => $productIds)
-        );
-
-        $this->_refreshAnchorRelations($allCategoryIds, $productIds);
-        $this->_refreshDirectRelations($categoryIds, $productIds);
-        $this->_refreshRootRelations($productIds);
-        return $this;
-    }
-
-    /**
-     * Return array of used root category id - path pairs
-     *
-     * @return array
-     */
-    protected function _getRootCategories()
-    {
-        $rootCategories = array();
-        $stores = $this->_getStoresInfo();
-        foreach ($stores as $storeInfo) {
-            if ($storeInfo['root_id']) {
-                $rootCategories[$storeInfo['root_id']] = $storeInfo['root_path'];
-            }
-        }
-
-        return $rootCategories;
-    }
-
-    /**
-     * Process category index after category save
-     *
-     * @param \Magento\Index\Model\Event $event
-     * @return void
-     */
-    public function catalogCategorySave(\Magento\Index\Model\Event $event)
-    {
-        $data = $event->getNewData();
-
-        $checkRootCategories        = false;
-        $processRootCategories      = false;
-        $affectedRootCategoryIds    = array();
-        $rootCategories             = $this->_getRootCategories();
-
-        /**
-         * Check if we have reindex category move results
-         */
-        if (isset($data['affected_category_ids'])) {
-            $categoryIds = $data['affected_category_ids'];
-            $checkRootCategories = true;
-        } else if (isset($data['products_was_changed'])) {
-            $categoryIds = array($event->getEntityPk());
-
-            if (isset($rootCategories[$event->getEntityPk()])) {
-                $processRootCategories = true;
-                $affectedRootCategoryIds[] = $event->getEntityPk();
-            }
-        } else {
-            return;
-        }
-
-        $select = $this->_getWriteAdapter()->select()
-            ->from($this->_categoryTable, 'path')
-            ->where('entity_id IN (?)', $categoryIds);
-        $paths = $this->_getWriteAdapter()->fetchCol($select);
-        $allCategoryIds = array();
-        foreach ($paths as $path) {
-            if ($checkRootCategories) {
-                foreach ($rootCategories as $rootCategoryId => $rootCategoryPath) {
-                    if (strpos($path, sprintf('%d/', $rootCategoryPath)) === 0 || $path == $rootCategoryPath) {
-                        $affectedRootCategoryIds[$rootCategoryId] = $rootCategoryId;
-                    }
-                }
-            }
-            $allCategoryIds = array_merge($allCategoryIds, explode('/', $path));
-        }
-        $allCategoryIds = array_unique($allCategoryIds);
-
-        if ($checkRootCategories && count($affectedRootCategoryIds) > 1) {
-            $processRootCategories = true;
-        }
-
-        /**
-         * retrieve anchor category id
-         */
-        $anchorInfo = $this->_getAnchorAttributeInfo();
-        $bind = array(
-            'attribute_id' => $anchorInfo['id'],
-            'store_id'     => \Magento\Core\Model\Store::DEFAULT_STORE_ID,
-            'e_value'      => 1
-        );
-        $select = $this->_getReadAdapter()->select()
-            ->distinct(true)
-            ->from(array('ce' => $this->_categoryTable), array('entity_id'))
-            ->joinInner(
-                array('dca'=>$anchorInfo['table']),
-                "dca.entity_id=ce.entity_id AND dca.attribute_id=:attribute_id AND dca.store_id=:store_id",
-                array())
-             ->where('dca.value=:e_value')
-             ->where('ce.entity_id IN (?)', $allCategoryIds);
-        $anchorIds = $this->_getWriteAdapter()->fetchCol($select, $bind);
-        /**
-         * delete only anchor id and category ids
-         */
-        $deleteCategoryIds = array_merge($anchorIds,$categoryIds);
-
-        $this->_getWriteAdapter()->delete(
-            $this->getMainTable(),
-            $this->_getWriteAdapter()->quoteInto('category_id IN(?)', $deleteCategoryIds)
-        );
-
-        $directIds = array_diff($categoryIds, $anchorIds);
-        if ($anchorIds) {
-            $this->_refreshAnchorRelations($anchorIds);
-        }
-        if ($directIds) {
-            $this->_refreshDirectRelations($directIds);
-        }
-
-        /**
-         * Need to re-index affected root category ids when its are not anchor
-         */
-        if ($processRootCategories) {
-            $reindexRootCategoryIds = array_diff($affectedRootCategoryIds, $anchorIds);
-            if ($reindexRootCategoryIds) {
-                $this->_refreshNotAnchorRootCategories($reindexRootCategoryIds);
-            }
-        }
-
-    }
-
-    /**
-     * Reindex not anchor root categories
-     *
-     * @param array $categoryIds
-     * @return $this
-     */
-    protected function _refreshNotAnchorRootCategories(array $categoryIds = null)
-    {
-        if (empty($categoryIds)) {
-            return $this;
-        }
-
-        $adapter = $this->_getWriteAdapter();
-
-        // remove anchor relations
-        $where = array(
-            'category_id IN(?)' => $categoryIds,
-            'is_parent=?'       => 0
-        );
-        $adapter->delete($this->getMainTable(), $where);
-
-        $stores = $this->_getStoresInfo();
-        /**
-         * Build index for each store
-         */
-        foreach ($stores as $storeData) {
-            $storeId    = $storeData['store_id'];
-            $websiteId  = $storeData['website_id'];
-            $rootPath   = $storeData['root_path'];
-            $rootId     = $storeData['root_id'];
-            if (!in_array($rootId, $categoryIds)) {
-                continue;
-            }
-
-            $select = $adapter->select()
-                ->distinct(true)
-                ->from(array('cc' => $this->getTable('catalog_category_entity')), null)
-                ->join(
-                    array('i' => $this->getMainTable()),
-                    'i.category_id = cc.entity_id and i.store_id = 1',
-                    array())
-                ->joinLeft(
-                    array('ie' => $this->getMainTable()),
-                    'ie.category_id = ' . (int)$rootId
-                        . ' AND ie.product_id=i.product_id AND ie.store_id = ' . (int)$storeId,
-                    array())
-                ->where('cc.path LIKE ?', $rootPath . '/%')
-                ->where('ie.category_id IS NULL')
-                ->columns(array(
-                    'category_id'   => new \Zend_Db_Expr($rootId),
-                    'product_id'    => 'i.product_id',
-                    'position'      => new \Zend_Db_Expr('0'),
-                    'is_parent'     => new \Zend_Db_Expr('0'),
-                    'store_id'      => new \Zend_Db_Expr($storeId),
-                    'visibility'    => 'i.visibility'
-                ));
-            $query = $select->insertFromSelect($this->getMainTable());
-            $adapter->query($query);
-
-            $visibilityInfo = $this->_getVisibilityAttributeInfo();
-            $statusInfo     = $this->_getStatusAttributeInfo();
-
-            $select = $this->_getReadAdapter()->select()
-                ->from(array('pw' => $this->_productWebsiteTable), array())
-                ->joinLeft(
-                    array('i' => $this->getMainTable()),
-                    'i.product_id = pw.product_id AND i.category_id = ' . (int)$rootId
-                        . ' AND i.store_id = ' . (int) $storeId,
-                    array())
-                ->join(
-                    array('dv' => $visibilityInfo['table']),
-                    "dv.entity_id = pw.product_id AND dv.attribute_id = {$visibilityInfo['id']} AND dv.store_id = 0",
-                    array())
-                ->joinLeft(
-                    array('sv' => $visibilityInfo['table']),
-                    "sv.entity_id = pw.product_id AND sv.attribute_id = {$visibilityInfo['id']}"
-                        . " AND sv.store_id = " . (int)$storeId,
-                    array())
-                ->join(
-                    array('dss' => $statusInfo['table']),
-                    "dss.entity_id = pw.product_id AND dss.attribute_id = {$statusInfo['id']} AND dss.store_id = 0",
-                    array())
-                ->joinLeft(
-                    array('ss' => $statusInfo['table']),
-                    "ss.entity_id = pw.product_id AND ss.attribute_id = {$statusInfo['id']}"
-                        . " AND ss.store_id = " . (int)$storeId,
-                    array())
-                ->where('i.product_id IS NULL')
-                ->where('pw.website_id=?', $websiteId)
-                ->where(
-                    $this->_getWriteAdapter()->getCheckSql('ss.value_id IS NOT NULL', 'ss.value', 'dss.value') . ' = ?',
-                    \Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
-                ->columns(array(
-                    'category_id'   => new \Zend_Db_Expr($rootId),
-                    'product_id'    => 'pw.product_id',
-                    'position'      => new \Zend_Db_Expr('0'),
-                    'is_parent'     => new \Zend_Db_Expr('1'),
-                    'store_id'      => new \Zend_Db_Expr($storeId),
-                    'visibility'    => $adapter->getCheckSql('sv.value_id IS NOT NULL', 'sv.value', 'dv.value')
-                ));
-
-            $query = $select->insertFromSelect($this->getMainTable());
-            $this->_getWriteAdapter()->query($query);
-        }
-
-        return $this;
-    }
-
-
-    /**
-     * Rebuild index for direct associations categories and products
-     *
-     * @param null|array $categoryIds
-     * @param null|array $productIds
-     * @return $this
-     */
-    protected function _refreshDirectRelations($categoryIds = null, $productIds = null)
-    {
-        if (!$categoryIds && !$productIds) {
-            return $this;
-        }
-
-        $visibilityInfo = $this->_getVisibilityAttributeInfo();
-        $statusInfo     = $this->_getStatusAttributeInfo();
-        $adapter = $this->_getWriteAdapter();
-        /**
-         * Insert direct relations
-         * product_ids (enabled filter) X category_ids X store_ids
-         * Validate store root category
-         */
-        $isParent = new \Zend_Db_Expr('1');
-        $select = $adapter->select()
-            ->from(array('cp' => $this->_categoryProductTable),
-                array('category_id', 'product_id', 'position', $isParent))
-            ->joinInner(array('pw'  => $this->_productWebsiteTable), 'pw.product_id=cp.product_id', array())
-            ->joinInner(array('g'   => $this->_groupTable), 'g.website_id=pw.website_id', array())
-            ->joinInner(array('s'   => $this->_storeTable), 's.group_id=g.group_id', array('store_id'))
-            ->joinInner(array('rc'  => $this->_categoryTable), 'rc.entity_id=g.root_category_id', array())
-            ->joinInner(
-                array('ce'=>$this->_categoryTable),
-                'ce.entity_id=cp.category_id AND ('.
-                $adapter->quoteIdentifier('ce.path') . ' LIKE ' .
-                $adapter->getConcatSql(array($adapter->quoteIdentifier('rc.path') , $adapter->quote('/%'))) .
-                ' OR ce.entity_id=rc.entity_id)',
-                array())
-            ->joinLeft(
-                array('dv'=>$visibilityInfo['table']),
-                $adapter->quoteInto(
-                    "dv.entity_id=cp.product_id AND dv.attribute_id=? AND dv.store_id=0",
-                    $visibilityInfo['id']),
-                array()
-            )
-            ->joinLeft(
-                array('sv'=>$visibilityInfo['table']),
-                $adapter->quoteInto(
-                    "sv.entity_id=cp.product_id AND sv.attribute_id=? AND sv.store_id=s.store_id",
-                    $visibilityInfo['id']),
-                array('visibility' => $adapter->getCheckSql('sv.value_id IS NOT NULL',
-                    $adapter->quoteIdentifier('sv.value'),
-                    $adapter->quoteIdentifier('dv.value')
-                ))
-            )
-            ->joinLeft(
-                array('dss'=>$statusInfo['table']),
-                "dss.entity_id=cp.product_id AND dss.attribute_id={$statusInfo['id']} AND dss.store_id=0",
-                array())
-            ->joinLeft(
-                array('ss'=>$statusInfo['table']),
-                "ss.entity_id=cp.product_id AND ss.attribute_id={$statusInfo['id']} AND ss.store_id=s.store_id",
-                array())
-            ->where(
-                $adapter->getCheckSql('ss.value_id IS NOT NULL',
-                    $adapter->quoteIdentifier('ss.value'),
-                    $adapter->quoteIdentifier('dss.value')
-                ) . ' = ?',
-                \Magento\Catalog\Model\Product\Status::STATUS_ENABLED
-            );
-        if ($categoryIds) {
-            $select->where('cp.category_id IN (?)', $categoryIds);
-        }
-        if ($productIds) {
-            $select->where('cp.product_id IN(?)', $productIds);
-        }
-        $sql = $select->insertFromSelect(
-            $this->getMainTable(),
-            array('category_id', 'product_id', 'position', 'is_parent', 'store_id', 'visibility'),
-            true
-        );
-        $adapter->query($sql);
-        return $this;
-    }
-
-    /**
-     * Rebuild index for anchor categories and associated to child categories products
-     *
-     * @param null | array $categoryIds
-     * @param null | array $productIds
-     * @return $this
-     */
-    protected function _refreshAnchorRelations($categoryIds = null, $productIds = null)
-    {
-        if (!$categoryIds && !$productIds) {
-            return $this;
-        }
-
-        $anchorInfo     = $this->_getAnchorAttributeInfo();
-        $visibilityInfo = $this->_getVisibilityAttributeInfo();
-        $statusInfo     = $this->_getStatusAttributeInfo();
-
-        /**
-         * Insert anchor categories relations
-         */
-        $adapter = $this->_getReadAdapter();
-        $isParent = $adapter->getCheckSql('MIN(cp.category_id)=ce.entity_id', 1, 0);
-        $position = 'MIN('.
-            $adapter->getCheckSql(
-                'cp.category_id = ce.entity_id',
-                'cp.position',
-                '(cc.position + 1) * ('.$adapter->quoteIdentifier('cc.level').' + 1) * 10000 + cp.position'
-            )
-        .')';
-
-        $select = $adapter->select()
-            ->distinct(true)
-            ->from(array('ce' => $this->_categoryTable), array('entity_id'))
-            ->joinInner(
-                array('cc' => $this->_categoryTable),
-                $adapter->quoteIdentifier('cc.path') .
-                ' LIKE ('.$adapter->getConcatSql(array($adapter->quoteIdentifier('ce.path'),$adapter->quote('/%'))).')'
-                . ' OR cc.entity_id=ce.entity_id'
-                , array()
-            )
-            ->joinInner(
-                array('cp' => $this->_categoryProductTable),
-                'cp.category_id=cc.entity_id',
-                array('cp.product_id', 'position' => $position, 'is_parent' => $isParent)
-            )
-            ->joinInner(array('pw' => $this->_productWebsiteTable), 'pw.product_id=cp.product_id', array())
-            ->joinInner(array('g'  => $this->_groupTable), 'g.website_id=pw.website_id', array())
-            ->joinInner(array('s'  => $this->_storeTable), 's.group_id=g.group_id', array('store_id'))
-            ->joinInner(array('rc' => $this->_categoryTable), 'rc.entity_id=g.root_category_id', array())
-            ->joinLeft(
-                array('dca'=>$anchorInfo['table']),
-                "dca.entity_id=ce.entity_id AND dca.attribute_id={$anchorInfo['id']} AND dca.store_id=0",
-                array())
-            ->joinLeft(
-                array('sca'=>$anchorInfo['table']),
-                "sca.entity_id=ce.entity_id AND sca.attribute_id={$anchorInfo['id']} AND sca.store_id=s.store_id",
-                array())
-            ->joinLeft(
-                array('dv'=>$visibilityInfo['table']),
-                "dv.entity_id=pw.product_id AND dv.attribute_id={$visibilityInfo['id']} AND dv.store_id=0",
-                array())
-            ->joinLeft(
-                array('sv'=>$visibilityInfo['table']),
-                "sv.entity_id=pw.product_id AND sv.attribute_id={$visibilityInfo['id']} AND sv.store_id=s.store_id",
-                array('visibility' => $adapter->getCheckSql(
-                    'MIN(sv.value_id) IS NOT NULL',
-                    'MIN(sv.value)', 'MIN(dv.value)'
-                ))
-            )
-            ->joinLeft(
-                array('dss'=>$statusInfo['table']),
-                "dss.entity_id=pw.product_id AND dss.attribute_id={$statusInfo['id']} AND dss.store_id=0",
-                array())
-            ->joinLeft(
-                array('ss'=>$statusInfo['table']),
-                "ss.entity_id=pw.product_id AND ss.attribute_id={$statusInfo['id']} AND ss.store_id=s.store_id",
-                array())
-            /**
-             * Condition for anchor or root category (all products should be assigned to root)
-             */
-            ->where('('.
-                $adapter->quoteIdentifier('ce.path') . ' LIKE ' .
-                $adapter->getConcatSql(array($adapter->quoteIdentifier('rc.path'), $adapter->quote('/%'))) . ' AND ' .
-                $adapter->getCheckSql('sca.value_id IS NOT NULL',
-                    $adapter->quoteIdentifier('sca.value'),
-                    $adapter->quoteIdentifier('dca.value')) . '=1) OR ce.entity_id=rc.entity_id'
-            )
-            ->where(
-                $adapter->getCheckSql('ss.value_id IS NOT NULL', 'ss.value', 'dss.value') . '=?',
-                \Magento\Catalog\Model\Product\Status::STATUS_ENABLED
-            )
-            ->group(array('ce.entity_id', 'cp.product_id', 's.store_id'));
-        if ($categoryIds) {
-            $select->where('ce.entity_id IN (?)', $categoryIds);
-        }
-        if ($productIds) {
-            $select->where('pw.product_id IN(?)', $productIds);
-        }
-
-        $sql = $select->insertFromSelect($this->getMainTable());
-        $this->_getWriteAdapter()->query($sql);
-        return $this;
-    }
-
-    /**
-     * Add product association with root store category for products which are not assigned to another category
-     *
-     * @param int | array $productIds
-     * @return $this
-     */
-    protected function _refreshRootRelations($productIds)
-    {
-        $visibilityInfo = $this->_getVisibilityAttributeInfo();
-        $statusInfo     = $this->_getStatusAttributeInfo();
-        $adapter = $this->_getWriteAdapter();
-        /**
-         * Insert anchor categories relations
-         */
-        $isParent = new \Zend_Db_Expr('0');
-        $position = new \Zend_Db_Expr('0');
-        $select = $this->_getReadAdapter()->select()
-            ->distinct(true)
-            ->from(array('pw'  => $this->_productWebsiteTable), array())
-            ->joinInner(array('g'   => $this->_groupTable), 'g.website_id=pw.website_id', array())
-            ->joinInner(array('s'   => $this->_storeTable), 's.group_id=g.group_id', array())
-            ->joinInner(array('rc'  => $this->_categoryTable), 'rc.entity_id=g.root_category_id',
-                array('entity_id'))
-            ->joinLeft(array('cp'   => $this->_categoryProductTable), 'cp.product_id=pw.product_id',
-                array('pw.product_id', $position, $isParent, 's.store_id'))
-            ->joinLeft(
-                array('dv'=>$visibilityInfo['table']),
-                "dv.entity_id=pw.product_id AND dv.attribute_id={$visibilityInfo['id']} AND dv.store_id=0",
-                array())
-            ->joinLeft(
-                array('sv'=>$visibilityInfo['table']),
-                "sv.entity_id=pw.product_id AND sv.attribute_id={$visibilityInfo['id']} AND sv.store_id=s.store_id",
-                array('visibility' => $adapter->getCheckSql('sv.value_id IS NOT NULL',
-                    $adapter->quoteIdentifier('sv.value'),
-                    $adapter->quoteIdentifier('dv.value')
-                ))
-            )
-            ->joinLeft(
-                array('dss'=>$statusInfo['table']),
-                "dss.entity_id=pw.product_id AND dss.attribute_id={$statusInfo['id']} AND dss.store_id=0",
-                array())
-            ->joinLeft(
-                array('ss'=>$statusInfo['table']),
-                "ss.entity_id=pw.product_id AND ss.attribute_id={$statusInfo['id']} AND ss.store_id=s.store_id",
-                array())
-            /**
-             * Condition for anchor or root category (all products should be assigned to root)
-             */
-            ->where('cp.product_id IS NULL')
-            ->where(
-                    $adapter->getCheckSql('ss.value_id IS NOT NULL',
-                        $adapter->quoteIdentifier('ss.value'),
-                        $adapter->quoteIdentifier('dss.value')
-                    ) . ' = ?', \Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
-            ->where('pw.product_id IN(?)', $productIds);
-
-        $sql = $select->insertFromSelect($this->getMainTable());
-        $this->_getWriteAdapter()->query($sql);
-
-        $select = $this->_getReadAdapter()->select()
-            ->from(array('pw' => $this->_productWebsiteTable), array())
-            ->joinInner(array('g' => $this->_groupTable), 'g.website_id = pw.website_id', array())
-            ->joinInner(array('s' => $this->_storeTable), 's.group_id = g.group_id', array())
-            ->joinLeft(
-                array('i'  => $this->getMainTable()),
-                'i.product_id = pw.product_id AND i.category_id = g.root_category_id', array())
-            ->joinLeft(
-                array('dv' => $visibilityInfo['table']),
-                "dv.entity_id = pw.product_id AND dv.attribute_id = {$visibilityInfo['id']} AND dv.store_id = 0",
-                array())
-            ->joinLeft(
-                array('sv' => $visibilityInfo['table']),
-                "sv.entity_id = pw.product_id AND sv.attribute_id = {$visibilityInfo['id']}"
-                    . " AND sv.store_id = s.store_id",
-                array())
-            ->join(
-                array('dss' => $statusInfo['table']),
-                "dss.entity_id = pw.product_id AND dss.attribute_id = {$statusInfo['id']} AND dss.store_id = 0",
-                array())
-            ->joinLeft(
-                array('ss' => $statusInfo['table']),
-                "ss.entity_id = pw.product_id AND ss.attribute_id = {$statusInfo['id']} AND ss.store_id = s.store_id",
-                array())
-            ->where('i.product_id IS NULL')
-            ->where(
-                $adapter->getCheckSql('ss.value_id IS NOT NULL', 'ss.value', 'dss.value') . '=?',
-                \Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
-            ->where('pw.product_id IN(?)', $productIds)
-            ->columns(array(
-                'category_id'   => 'g.root_category_id',
-                'product_id'    => 'pw.product_id',
-                'position'      => $position,
-                'is_parent'     => new \Zend_Db_Expr('1'),
-                'store_id'      => 's.store_id',
-                'visibility'    => $adapter->getCheckSql('sv.value_id IS NOT NULL', 'sv.value', 'dv.value'),
-            ));
-
-        $sql = $select->insertFromSelect($this->getMainTable());
-        $this->_getWriteAdapter()->query($sql);
-
-        return $this;
-    }
-
-    /**
-     * Get is_anchor category attribute information
-     *
-     * @return array array('id' => $id, 'table'=>$table)
-     */
-    protected function _getAnchorAttributeInfo()
-    {
-        $isAnchorAttribute = $this->_eavConfig
-            ->getAttribute(\Magento\Catalog\Model\Category::ENTITY, 'is_anchor');
-        $info = array(
-            'id'    => $isAnchorAttribute->getId() ,
-            'table' => $isAnchorAttribute->getBackend()->getTable()
-        );
-        return $info;
-    }
-
-    /**
-     * Get visibility product attribute information
-     *
-     * @return array array('id' => $id, 'table'=>$table)
-     */
-    protected function _getVisibilityAttributeInfo()
-    {
-        $visibilityAttribute = $this->_eavConfig
-            ->getAttribute(\Magento\Catalog\Model\Product::ENTITY, 'visibility');
-        $info = array(
-            'id'    => $visibilityAttribute->getId() ,
-            'table' => $visibilityAttribute->getBackend()->getTable()
-        );
-        return $info;
-    }
-
-    /**
-     * Get status product attribute information
-     *
-     * @return array array('id' => $id, 'table'=>$table)
-     */
-    protected function _getStatusAttributeInfo()
-    {
-        $statusAttribute = $this->_eavConfig->getAttribute(\Magento\Catalog\Model\Product::ENTITY, 'status');
-        $info = array(
-            'id'    => $statusAttribute->getId() ,
-            'table' => $statusAttribute->getBackend()->getTable()
-        );
-        return $info;
-    }
-
-    /**
-     * Rebuild all index data
-     *
-     * @return $this
-     */
-    public function reindexAll()
-    {
-        $this->useIdxTable(true);
-        $this->beginTransaction();
-        try {
-            $this->clearTemporaryIndexTable();
-            $idxTable = $this->getIdxTable();
-            $idxAdapter = $this->_getIndexAdapter();
-            $stores = $this->_getStoresInfo();
-            /**
-             * Build index for each store
-             */
-            foreach ($stores as $storeData) {
-                $storeId    = $storeData['store_id'];
-                $websiteId  = $storeData['website_id'];
-                $rootPath   = $storeData['root_path'];
-                $rootId     = $storeData['root_id'];
-                /**
-                 * Prepare visibility for all enabled store products
-                 */
-                $enabledTable = $this->_prepareEnabledProductsVisibility($websiteId, $storeId);
-                /**
-                 * Select information about anchor categories
-                 */
-                $anchorTable = $this->_prepareAnchorCategories($storeId, $rootPath);
-                /**
-                 * Add relations between not anchor categories and products
-                 */
-                $select = $idxAdapter->select();
-                /** @var $select \Magento\DB\Select */
-                $select->from(
-                    array('cp' => $this->_categoryProductTable),
-                    array('category_id', 'product_id', 'position', 'is_parent' => new \Zend_Db_Expr('1'),
-                        'store_id' => new \Zend_Db_Expr($storeId))
-                )
-                ->joinInner(array('pv' => $enabledTable), 'pv.product_id=cp.product_id', array('visibility'))
-                ->joinLeft(array('ac' => $anchorTable), 'ac.category_id=cp.category_id', array())
-                ->where('ac.category_id IS NULL');
-
-                $query = $select->insertFromSelect(
-                    $idxTable,
-                    array('category_id', 'product_id', 'position', 'is_parent', 'store_id', 'visibility'),
-                    false
-                );
-                $idxAdapter->query($query);
-
-                /**
-                 * Assign products not associated to any category to root category in index
-                 */
-
-                $select = $idxAdapter->select();
-                $select->from(
-                    array('pv' => $enabledTable),
-                    array(new \Zend_Db_Expr($rootId), 'product_id', new \Zend_Db_Expr('0'), new \Zend_Db_Expr('1'),
-                        new \Zend_Db_Expr($storeId), 'visibility')
-                )
-                ->joinLeft(array('cp' => $this->_categoryProductTable), 'pv.product_id=cp.product_id', array())
-                ->where('cp.product_id IS NULL');
-
-                $query = $select->insertFromSelect(
-                    $idxTable,
-                    array('category_id', 'product_id', 'position', 'is_parent', 'store_id', 'visibility'),
-                    false
-                );
-                $idxAdapter->query($query);
-
-                /**
-                 * Prepare anchor categories products
-                 */
-                $anchorProductsTable = $this->_getAnchorCategoriesProductsTemporaryTable();
-                $idxAdapter->delete($anchorProductsTable);
-
-                $position = 'MIN('.
-                    $idxAdapter->getCheckSql(
-                        'ca.category_id = ce.entity_id',
-                        $idxAdapter->quoteIdentifier('cp.position'),
-                        '('.$idxAdapter->quoteIdentifier('ce.position').' + 1) * '
-                        .'('.$idxAdapter->quoteIdentifier('ce.level').' + 1 * 10000)'
-                        .' + '.$idxAdapter->quoteIdentifier('cp.position')
-                    )
-                .')';
-
-
-                $select = $idxAdapter->select()
-                ->useStraightJoin(true)
-                ->distinct(true)
-                ->from(array('ca' => $anchorTable), array('category_id'))
-                ->joinInner(
-                    array('ce' => $this->_categoryTable),
-                    $idxAdapter->quoteIdentifier('ce.path') . ' LIKE ' .
-                    $idxAdapter->quoteIdentifier('ca.path') . ' OR ce.entity_id = ca.category_id',
-                    array()
-                )
-                ->joinInner(
-                    array('cp' => $this->_categoryProductTable),
-                    'cp.category_id = ce.entity_id',
-                    array('product_id')
-                )
-                ->joinInner(
-                    array('pv' => $enabledTable),
-                    'pv.product_id = cp.product_id',
-                    array('position' => $position)
-                )
-                ->group(array('ca.category_id', 'cp.product_id'));
-                $query = $select->insertFromSelect($anchorProductsTable,
-                    array('category_id', 'product_id', 'position'), false);
-                $idxAdapter->query($query);
-
-                /**
-                 * Add anchor categories products to index
-                 */
-                $select = $idxAdapter->select()
-                ->from(
-                    array('ap' => $anchorProductsTable),
-                    array('category_id', 'product_id',
-                        'position', // => new \Zend_Db_Expr('MIN('. $idxAdapter->quoteIdentifier('ap.position').')'),
-                        'is_parent' => $idxAdapter->getCheckSql('cp.product_id > 0', 1, 0),
-                        'store_id' => new \Zend_Db_Expr($storeId))
-                )
-                ->joinLeft(
-                    array('cp' => $this->_categoryProductTable),
-                    'cp.category_id=ap.category_id AND cp.product_id=ap.product_id',
-                    array()
-                )
-                ->joinInner(array('pv' => $enabledTable), 'pv.product_id = ap.product_id', array('visibility'));
-
-                $query = $select->insertFromSelect(
-                    $idxTable,
-                    array('category_id', 'product_id', 'position', 'is_parent', 'store_id', 'visibility'),
-                    false
-                );
-                $idxAdapter->query($query);
-
-                $select = $idxAdapter->select()
-                    ->from(array('e' => $this->getTable('catalog_product_entity')), null)
-                    ->join(
-                        array('ei' => $enabledTable),
-                        'ei.product_id = e.entity_id',
-                        array())
-                    ->joinLeft(
-                        array('i' => $idxTable),
-                        'i.product_id = e.entity_id AND i.category_id = :category_id AND i.store_id = :store_id',
-                        array())
-                    ->where('i.product_id IS NULL')
-                    ->columns(array(
-                        'category_id'   => new \Zend_Db_Expr($rootId),
-                        'product_id'    => 'e.entity_id',
-                        'position'      => new \Zend_Db_Expr('0'),
-                        'is_parent'     => new \Zend_Db_Expr('1'),
-                        'store_id'      => new \Zend_Db_Expr($storeId),
-                        'visibility'    => 'ei.visibility'
-                    ));
-
-                $query = $select->insertFromSelect(
-                    $idxTable,
-                    array('category_id', 'product_id', 'position', 'is_parent', 'store_id', 'visibility'),
-                    false
-                );
-
-                $idxAdapter->query($query, array('store_id' => $storeId, 'category_id' => $rootId));
-            }
-
-            $this->syncData();
-
-            /**
-             * Clean up temporary tables
-             */
-            $this->clearTemporaryIndexTable();
-            $idxAdapter->delete($enabledTable);
-            $idxAdapter->delete($anchorTable);
-            $idxAdapter->delete($anchorProductsTable);
-            $this->commit();
-        } catch (\Exception $e) {
-            $this->rollBack();
-            throw $e;
-        }
-        return $this;
-    }
-
-
-    /**
-     * Create temporary table with enabled products visibility info
-     *
-     * @param int $websiteId
-     * @param int $storeId
-     * @return string temporary table name
-     */
-    protected function _prepareEnabledProductsVisibility($websiteId, $storeId)
-    {
-        $statusAttribute = $this->_eavConfig->getAttribute(\Magento\Catalog\Model\Product::ENTITY, 'status');
-        $visibilityAttribute = $this->_eavConfig
-            ->getAttribute(\Magento\Catalog\Model\Product::ENTITY, 'visibility');
-        $statusAttributeId = $statusAttribute->getId();
-        $visibilityAttributeId = $visibilityAttribute->getId();
-        $statusTable = $statusAttribute->getBackend()->getTable();
-        $visibilityTable = $visibilityAttribute->getBackend()->getTable();
-
-        /**
-         * Prepare temporary table
-         */
-        $tmpTable = $this->_getEnabledProductsTemporaryTable();
-        $this->_getIndexAdapter()->delete($tmpTable);
-
-        $adapter        = $this->_getIndexAdapter();
-        $visibilityExpr = $adapter->getCheckSql('pvs.value_id>0', $adapter->quoteIdentifier('pvs.value'),
-            $adapter->quoteIdentifier('pvd.value'));
-        $select         = $adapter->select()
-            ->from(array('pw' => $this->_productWebsiteTable), array('product_id', 'visibility' => $visibilityExpr))
-            ->joinLeft(
-                array('pvd' => $visibilityTable),
-                $adapter->quoteInto('pvd.entity_id=pw.product_id AND pvd.attribute_id=? AND pvd.store_id=0',
-                    $visibilityAttributeId),
-                array())
-            ->joinLeft(
-                array('pvs' => $visibilityTable),
-                $adapter->quoteInto('pvs.entity_id=pw.product_id AND pvs.attribute_id=? AND ', $visibilityAttributeId)
-                    . $adapter->quoteInto('pvs.store_id=?', $storeId),
-                array())
-            ->joinLeft(
-                array('psd' => $statusTable),
-                $adapter->quoteInto('psd.entity_id=pw.product_id AND psd.attribute_id=? AND psd.store_id=0',
-                    $statusAttributeId),
-                array())
-            ->joinLeft(
-                array('pss' => $statusTable),
-                    $adapter->quoteInto('pss.entity_id=pw.product_id AND pss.attribute_id=? AND ', $statusAttributeId)
-                        . $adapter->quoteInto('pss.store_id=?', $storeId),
-                array())
-            ->where('pw.website_id=?',$websiteId)
-            ->where($adapter->getCheckSql('pss.value_id > 0',
-                $adapter->quoteIdentifier('pss.value'),
-                $adapter->quoteIdentifier('psd.value')) . ' = ?', \Magento\Catalog\Model\Product\Status::STATUS_ENABLED);
-
-        $query = $select->insertFromSelect($tmpTable, array('product_id' , 'visibility'), false);
-        $adapter->query($query);
-        return $tmpTable;
-    }
-
-    /**
-     * Retrieve temporary table of category enabled products
-     *
-     * @return string
-     */
-    protected function _getEnabledProductsTemporaryTable()
-    {
-        if ($this->useIdxTable()) {
-            return $this->getTable('catalog_category_product_index_enbl_idx');
-        }
-        return $this->getTable('catalog_category_product_index_enbl_tmp');
-    }
-
-    /**
-     * Get array with store|website|root_categry path information
-     *
-     * @return array
-     */
-    protected function _getStoresInfo()
-    {
-        if (is_null($this->_storesInfo)) {
-            $adapter = $this->_getReadAdapter();
-            $select = $adapter->select()
-                ->from(array('s' => $this->getTable('core_store')), array('store_id', 'website_id'))
-                ->join(
-                    array('sg' => $this->getTable('core_store_group')),
-                    'sg.group_id = s.group_id',
-                    array())
-                ->join(
-                    array('c' => $this->getTable('catalog_category_entity')),
-                    'c.entity_id = sg.root_category_id',
-                    array(
-                        'root_path' => 'path',
-                        'root_id'   => 'entity_id'
-                    )
-                );
-            $this->_storesInfo = $adapter->fetchAll($select);
-        }
-
-        return $this->_storesInfo;
-    }
-
-
-    /**
-     * @param int $storeId
-     * @param string $rootPath
-     * @return string temporary table name
-     */
-    protected function _prepareAnchorCategories($storeId, $rootPath)
-    {
-        $isAnchorAttribute = $this->_eavConfig
-            ->getAttribute(\Magento\Catalog\Model\Category::ENTITY, 'is_anchor');
-        $anchorAttributeId = $isAnchorAttribute->getId();
-        $anchorTable = $isAnchorAttribute->getBackend()->getTable();
-        $adapter = $this->_getIndexAdapter();
-        $tmpTable = $this->_getAnchorCategoriesTemporaryTable();
-        $adapter->delete($tmpTable);
-
-        $anchorExpr = $adapter->getCheckSql('cas.value_id>0', $adapter->quoteIdentifier('cas.value'),
-            $adapter->quoteIdentifier('cad.value'));
-        $pathConcat = $adapter->getConcatSql(array($adapter->quoteIdentifier('ce.path'), $adapter->quote('/%')));
-        $select = $adapter->select()
-            ->from(
-                array('ce' => $this->_categoryTable),
-                array('category_id' => 'ce.entity_id', 'path' => $pathConcat))
-            ->joinLeft(
-                array('cad' => $anchorTable),
-                $adapter->quoteInto("cad.entity_id=ce.entity_id AND cad.attribute_id=? AND cad.store_id=0",
-                    $anchorAttributeId),
-                array())
-            ->joinLeft(
-                array('cas' => $anchorTable),
-                $adapter->quoteInto("cas.entity_id=ce.entity_id AND cas.attribute_id=? AND ", $anchorAttributeId)
-                    . $adapter->quoteInto('cas.store_id=?', $storeId),
-                array())
-            ->where("{$anchorExpr} = 1 AND {$adapter->quoteIdentifier('ce.path')} LIKE ?", $rootPath . '%')
-            ->orWhere('ce.path = ?', $rootPath);
-
-        $query = $select->insertFromSelect($tmpTable, array('category_id' , 'path'), false);
-        $adapter->query($query);
-        return $tmpTable;
-    }
-
-    /**
-     * Retrieve temporary table of anchor categories
-     *
-     * @return string
-     */
-    protected function _getAnchorCategoriesTemporaryTable()
-    {
-        if ($this->useIdxTable()) {
-            return $this->getTable('catalog_category_anc_categs_index_idx');
-        }
-        return $this->getTable('catalog_category_anc_categs_index_tmp');
-    }
-
-    /**
-     * Retrieve temporary table of anchor categories products
-     *
-     * @return string
-     */
-    protected function _getAnchorCategoriesProductsTemporaryTable()
-    {
-        if ($this->useIdxTable()) {
-            return $this->getTable('catalog_category_anc_products_index_idx');
-        }
-        return $this->getTable('catalog_category_anc_products_index_tmp');
-    }
-
-    /**
-     * Retrieve temporary decimal index table name
-     *
-     * @param string $table
-     * @return string
-     */
-    public function getIdxTable($table = null)
-    {
-        if ($this->useIdxTable()) {
-            return $this->getTable('catalog_category_product_index_idx');
-        }
-        return $this->getTable('catalog_category_product_index_tmp');
-    }
-}
diff --git a/app/code/Magento/Catalog/Model/Resource/Eav/Attribute.php b/app/code/Magento/Catalog/Model/Resource/Eav/Attribute.php
index 17c0ba2d98a..65b3d9b8258 100644
--- a/app/code/Magento/Catalog/Model/Resource/Eav/Attribute.php
+++ b/app/code/Magento/Catalog/Model/Resource/Eav/Attribute.php
@@ -25,6 +25,7 @@
  */
 namespace Magento\Catalog\Model\Resource\Eav;
 
+use \Magento\Catalog\Model\Attribute\LockValidatorInterface;
 /**
  * Catalog attribute model
  *
@@ -54,8 +55,6 @@ namespace Magento\Catalog\Model\Resource\Eav;
  * @method int setUsedInProductListing(int $value)
  * @method \Magento\Catalog\Model\Resource\Eav\Attribute getUsedForSortBy()
  * @method int setUsedForSortBy(int $value)
- * @method \Magento\Catalog\Model\Resource\Eav\Attribute getIsConfigurable()
- * @method int setIsConfigurable(int $value)
  * @method string setApplyTo(string $value)
  * @method \Magento\Catalog\Model\Resource\Eav\Attribute getIsVisibleInAdvancedSearch()
  * @method int setIsVisibleInAdvancedSearch(int $value)
@@ -71,6 +70,7 @@ namespace Magento\Catalog\Model\Resource\Eav;
  * @package     Magento_Catalog
  * @author      Magento Core Team <core@magentocommerce.com>
  */
+
 class Attribute extends \Magento\Eav\Model\Entity\Attribute
 {
     const SCOPE_STORE                           = 0;
@@ -81,11 +81,17 @@ class Attribute extends \Magento\Eav\Model\Entity\Attribute
     const ENTITY                                = 'catalog_eav_attribute';
 
     /**
-     * Event prefix
+     * Index indexer
      *
-     * @var string
+     * @var \Magento\Index\Model\Indexer
      */
-    protected $_eventPrefix                     = 'catalog_entity_attribute';
+    protected $_indexIndexer;
+
+    /**
+     * @var LockValidatorInterface
+     */
+    protected $attrLockValidator;
+
     /**
      * Event object name
      *
@@ -101,15 +107,23 @@ class Attribute extends \Magento\Eav\Model\Entity\Attribute
     static protected $_labels                   = null;
 
     /**
-     * Index indexer
+     * Event prefix
      *
-     * @var \Magento\Index\Model\Indexer
+     * @var string
      */
-    protected $_indexIndexer;
+    protected $_eventPrefix                     = 'catalog_entity_attribute';
+
+    /**
+     * @var \Magento\Catalog\Model\Indexer\Product\Flat\Processor
+     */
+    protected $_productFlatIndexerProcessor;
+
+    /**
+     * @var \Magento\Catalog\Helper\Product\Flat
+     */
+    protected $_productFlatHelper;
 
     /**
-     * Class constructor
-     *
      * @param \Magento\Core\Model\Context $context
      * @param \Magento\Core\Model\Registry $registry
      * @param \Magento\Core\Helper\Data $coreData
@@ -121,6 +135,9 @@ class Attribute extends \Magento\Eav\Model\Entity\Attribute
      * @param \Magento\Core\Model\LocaleInterface $locale
      * @param \Magento\Catalog\Model\ProductFactory $catalogProductFactory
      * @param \Magento\Index\Model\Indexer $indexIndexer
+     * @param \Magento\Catalog\Model\Indexer\Product\Flat\Processor $productFlatIndexerProcessor
+     * @param \Magento\Catalog\Helper\Product\Flat $productFlatHelper
+     * @param LockValidatorInterface $lockValidator
      * @param \Magento\Core\Model\Resource\AbstractResource $resource
      * @param \Magento\Data\Collection\Db $resourceCollection
      * @param array $data
@@ -137,11 +154,17 @@ class Attribute extends \Magento\Eav\Model\Entity\Attribute
         \Magento\Core\Model\LocaleInterface $locale,
         \Magento\Catalog\Model\ProductFactory $catalogProductFactory,
         \Magento\Index\Model\Indexer $indexIndexer,
+        \Magento\Catalog\Model\Indexer\Product\Flat\Processor $productFlatIndexerProcessor,
+        \Magento\Catalog\Helper\Product\Flat $productFlatHelper,
+        LockValidatorInterface $lockValidator,
         \Magento\Core\Model\Resource\AbstractResource $resource = null,
         \Magento\Data\Collection\Db $resourceCollection = null,
         array $data = array()
     ) {
         $this->_indexIndexer = $indexIndexer;
+        $this->_productFlatIndexerProcessor = $productFlatIndexerProcessor;
+        $this->_productFlatHelper = $productFlatHelper;
+        $this->attrLockValidator = $lockValidator;
         parent::__construct(
             $context,
             $registry,
@@ -180,11 +203,14 @@ class Attribute extends \Magento\Eav\Model\Entity\Attribute
             if (!isset($this->_data['is_global'])) {
                 $this->_data['is_global'] = self::SCOPE_GLOBAL;
             }
-            if (($this->_data['is_global'] != $this->_origData['is_global'])
-                && $this->_getResource()->isUsedBySuperProducts($this)) {
-                throw new \Magento\Core\Exception(
-                    __('Do not change the scope. This attribute is used in configurable products.')
-                );
+            if ($this->_data['is_global'] != $this->_origData['is_global']) {
+                try {
+                    $this->attrLockValidator->validate($this);
+                } catch (\Magento\Core\Exception $exception) {
+                    throw new \Magento\Core\Exception(
+                        __('Do not change the scope. ' . $exception->getMessage())
+                    );
+                }
             }
         }
         if ($this->getFrontendInput() == 'price') {
@@ -211,6 +237,20 @@ class Attribute extends \Magento\Eav\Model\Entity\Attribute
          * Fix saving attribute in admin
          */
         $this->_eavConfig->clear();
+
+        $enableBefore = ($this->getOrigData('backend_type') == 'static')
+            || ($this->_productFlatHelper->isAddFilterableAttributes() && $this->getOrigData('is_filterable') > 0)
+            || ($this->getOrigData('used_in_product_listing') == 1)
+            || ($this->getOrigData('used_for_sort_by') == 1);
+        $enableAfter = ($this->getData('backend_type') == 'static')
+            || ($this->_productFlatHelper->isAddFilterableAttributes() && $this->getData('is_filterable') > 0)
+            || ($this->getData('used_in_product_listing') == 1)
+            || ($this->getData('used_for_sort_by') == 1);
+
+        if ($enableBefore != $enableAfter) {
+            $this->_productFlatIndexerProcessor->markIndexerAsInvalid();
+        }
+
         $this->_indexIndexer->processEntityAction(
             $this, self::ENTITY, \Magento\Index\Model\Event::TYPE_SAVE
         );
@@ -225,9 +265,7 @@ class Attribute extends \Magento\Eav\Model\Entity\Attribute
      */
     protected function _beforeDelete()
     {
-        if ($this->_getResource()->isUsedBySuperProducts($this)) {
-            throw new \Magento\Core\Exception(__('This attribute is used in configurable products.'));
-        }
+        $this->attrLockValidator->validate($this);
         $this->_indexIndexer->logEvent(
             $this, self::ENTITY, \Magento\Index\Model\Event::TYPE_DELETE
         );
@@ -242,6 +280,9 @@ class Attribute extends \Magento\Eav\Model\Entity\Attribute
     protected function _afterDeleteCommit()
     {
         parent::_afterDeleteCommit();
+
+        $this->_productFlatIndexerProcessor->markIndexerAsInvalid();
+
         $this->_indexIndexer->indexEvents(
             self::ENTITY, \Magento\Index\Model\Event::TYPE_DELETE
         );
diff --git a/app/code/Magento/Catalog/Model/Resource/Product.php b/app/code/Magento/Catalog/Model/Resource/Product.php
index 0d17048e6d7..43c889c85d6 100644
--- a/app/code/Magento/Catalog/Model/Resource/Product.php
+++ b/app/code/Magento/Catalog/Model/Resource/Product.php
@@ -350,201 +350,6 @@ class Product extends AbstractResource
         return $this;
     }
 
-    /**
-     * Refresh Product Enabled Index
-     *
-     * @param \Magento\Catalog\Model\Product $product
-     * @return $this
-     */
-    public function refreshIndex($product)
-    {
-        $writeAdapter = $this->_getWriteAdapter();
-
-        /**
-         * Ids of all categories where product is assigned (not related with store)
-         */
-        $categoryIds = $product->getCategoryIds();
-
-        /**
-         * Clear previous index data related with product
-         */
-        $condition = array('product_id = ?' => (int)$product->getId());
-        $writeAdapter->delete($this->getTable('catalog_category_product_index'), $condition);
-
-        if (!empty($categoryIds)) {
-            $categoriesSelect = $writeAdapter->select()
-                ->from($this->getTable('catalog_category_entity'))
-                ->where('entity_id IN (?)', $categoryIds);
-
-            $categoriesInfo = $writeAdapter->fetchAll($categoriesSelect);
-
-            $indexCategoryIds = array();
-            foreach ($categoriesInfo as $categoryInfo) {
-                $ids = explode('/', $categoryInfo['path']);
-                $ids[] = $categoryInfo['entity_id'];
-                $indexCategoryIds = array_merge($indexCategoryIds, $ids);
-            }
-
-            $indexCategoryIds   = array_unique($indexCategoryIds);
-            $indexProductIds    = array($product->getId());
-
-            $this->_catalogCategory->refreshProductIndex($indexCategoryIds, $indexProductIds);
-        } else {
-            $websites = $product->getWebsiteIds();
-
-            if ($websites) {
-                $storeIds = array();
-
-                foreach ($websites as $websiteId) {
-                    $website  = $this->_storeManager->getWebsite($websiteId);
-                    $storeIds = array_merge($storeIds, $website->getStoreIds());
-                }
-
-                $this->_catalogCategory->refreshProductIndex(array(), array($product->getId()), $storeIds);
-            }
-        }
-
-        /**
-         * Refresh enabled products index (visibility state)
-         */
-        $this->refreshEnabledIndex(null, $product);
-
-        return $this;
-    }
-
-    /**
-     * Refresh index for visibility of enabled product in store
-     * if store parameter is null - index will refreshed for all stores
-     * if product parameter is null - idex will be refreshed for all products
-     *
-     * @param \Magento\Core\Model\Store $store
-     * @param \Magento\Catalog\Model\Product $product
-     * @throws \Magento\Core\Exception
-     * @return $this
-     */
-    public function refreshEnabledIndex($store = null, $product = null)
-    {
-        $statusAttribute        = $this->getAttribute('status');
-        $visibilityAttribute    = $this->getAttribute('visibility');
-        $statusAttributeId      = $statusAttribute->getId();
-        $visibilityAttributeId  = $visibilityAttribute->getId();
-        $statusTable            = $statusAttribute->getBackend()->getTable();
-        $visibilityTable        = $visibilityAttribute->getBackend()->getTable();
-
-        $adapter = $this->_getWriteAdapter();
-
-        $select = $adapter->select();
-        $condition = array();
-
-        $indexTable = $this->getTable('catalog_product_enabled_index');
-        if (is_null($store) && is_null($product)) {
-            throw new \Magento\Core\Exception(
-                __('To reindex the enabled product(s), please specify the store or product.')
-            );
-        } elseif (is_null($product) || is_array($product)) {
-            $storeId    = $store->getId();
-            $websiteId  = $store->getWebsiteId();
-
-            if (is_array($product) && !empty($product)) {
-                $condition[] = $adapter->quoteInto('product_id IN (?)', $product);
-            }
-
-            $condition[] = $adapter->quoteInto('store_id = ?', $storeId);
-
-            $selectFields = array(
-                't_v_default.entity_id',
-                new \Zend_Db_Expr($storeId),
-                $adapter->getCheckSql('t_v.value_id > 0', 't_v.value', 't_v_default.value'),
-            );
-
-            $select->joinInner(
-                array('w' => $this->getTable('catalog_product_website')),
-                $adapter->quoteInto(
-                    'w.product_id = t_v_default.entity_id AND w.website_id = ?', $websiteId
-                ),
-                array()
-            );
-        } elseif ($store === null) {
-            foreach ($product->getStoreIds() as $storeId) {
-                $store = $this->_storeManager->getStore($storeId);
-                $this->refreshEnabledIndex($store, $product);
-            }
-            return $this;
-        } else {
-            $productId = is_numeric($product) ? $product : $product->getId();
-            $storeId   = is_numeric($store) ? $store : $store->getId();
-
-            $condition = array(
-                'product_id = ?' => (int)$productId,
-                'store_id   = ?' => (int)$storeId,
-            );
-
-            $selectFields = array(
-                new \Zend_Db_Expr($productId),
-                new \Zend_Db_Expr($storeId),
-                $adapter->getCheckSql('t_v.value_id > 0', 't_v.value', 't_v_default.value')
-            );
-
-            $select->where('t_v_default.entity_id = ?', $productId);
-        }
-
-        $adapter->delete($indexTable, $condition);
-
-        $select->from(array('t_v_default' => $visibilityTable), $selectFields);
-
-        $visibilityTableJoinCond = array(
-            't_v.entity_id = t_v_default.entity_id',
-            $adapter->quoteInto('t_v.attribute_id = ?', $visibilityAttributeId),
-            $adapter->quoteInto('t_v.store_id     = ?', $storeId),
-        );
-
-        $select->joinLeft(
-            array('t_v' => $visibilityTable),
-            implode(' AND ', $visibilityTableJoinCond),
-            array()
-        );
-
-        $defaultStatusJoinCond = array(
-            't_s_default.entity_id = t_v_default.entity_id',
-            't_s_default.store_id = 0',
-            $adapter->quoteInto('t_s_default.attribute_id = ?', $statusAttributeId),
-        );
-
-        $select->joinInner(
-            array('t_s_default' => $statusTable),
-            implode(' AND ', $defaultStatusJoinCond),
-            array()
-        );
-
-
-        $statusJoinCond = array(
-            't_s.entity_id = t_v_default.entity_id',
-            $adapter->quoteInto('t_s.store_id     = ?', $storeId),
-            $adapter->quoteInto('t_s.attribute_id = ?', $statusAttributeId),
-        );
-
-        $select->joinLeft(
-            array('t_s' => $statusTable),
-            implode(' AND ', $statusJoinCond),
-            array()
-        );
-
-        $valueCondition = $adapter->getCheckSql('t_s.value_id > 0', 't_s.value', 't_s_default.value');
-
-        $select->where('t_v_default.attribute_id = ?', $visibilityAttributeId)
-            ->where('t_v_default.store_id = ?', 0)
-            ->where(sprintf('%s = ?', $valueCondition), \Magento\Catalog\Model\Product\Status::STATUS_ENABLED);
-
-        if (is_array($product) && !empty($product)) {
-            $select->where('t_v_default.entity_id IN (?)', $product);
-        }
-
-        $adapter->query($adapter->insertFromSelect($select, $indexTable));
-
-
-        return $this;
-    }
-
     /**
      * Get collection of product categories
      *
@@ -660,7 +465,7 @@ class Product extends AbstractResource
         $updateCond[]         = $adapter->quoteInto('attribute_id = ?', $statusAttributeId);
         $adapter->update(
             $statusAttributeTable,
-            array('value' => \Magento\Catalog\Model\Product\Status::STATUS_DISABLED),
+            array('value' => \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_DISABLED),
             $updateCond
         );
 
diff --git a/app/code/Magento/Catalog/Model/Resource/Product/Collection.php b/app/code/Magento/Catalog/Model/Resource/Product/Collection.php
index 84b025da64c..17ea71cc4ba 100644
--- a/app/code/Magento/Catalog/Model/Resource/Product/Collection.php
+++ b/app/code/Magento/Catalog/Model/Resource/Product/Collection.php
@@ -25,8 +25,8 @@
  */
 namespace Magento\Catalog\Model\Resource\Product;
 
+use Magento\Catalog\Model\Product\Attribute\Source\Status as ProductStatus;
 use Magento\Core\Model\Store;
-use Magento\Core\Model\Website;
 
 /**
  * Product collection
@@ -546,7 +546,7 @@ class Collection extends \Magento\Catalog\Model\Resource\Collection\AbstractColl
         if ($this->isEnabledFlat()) {
             $this->getSelect()
                 ->from(array(self::MAIN_TABLE_ALIAS => $this->getEntity()->getFlatTableName()), null)
-                ->columns(array('status' => new \Zend_Db_Expr(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)));
+                ->columns(array('status' => new \Zend_Db_Expr(ProductStatus::STATUS_ENABLED)));
             $this->addAttributeToSelect(array('entity_id', 'type_id', 'attribute_set_id'));
             if ($this->getFlatHelper()->isAddChildData()) {
                 $this->getSelect()
@@ -766,7 +766,7 @@ class Collection extends \Magento\Catalog\Model\Resource\Collection\AbstractColl
     /**
      * Add website filter to collection
      *
-     * @param null|bool|int|string|Website|array $websites
+     * @param null|bool|int|string|array $websites
      * @return $this
      */
     public function addWebsiteFilter($websites = null)
diff --git a/app/code/Magento/Catalog/Model/Resource/Product/Collection/AssociatedProductUpdater.php b/app/code/Magento/Catalog/Model/Resource/Product/Collection/AssociatedProductUpdater.php
deleted file mode 100644
index 51b673f5ff6..00000000000
--- a/app/code/Magento/Catalog/Model/Resource/Product/Collection/AssociatedProductUpdater.php
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Catalog
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-
-/**
- * Associated product resource collection
- *
- * @category    Magento
- * @package     Magento_Catalog
- * @author      Magento Core Team <core@magentocommerce.com>
- */
-namespace Magento\Catalog\Model\Resource\Product\Collection;
-
-class AssociatedProductUpdater
-    implements \Magento\Core\Model\Layout\Argument\UpdaterInterface
-{
-    /**
-     * Stock Item instance
-     *
-     * @var \Magento\CatalogInventory\Model\Resource\Stock\Item
-     */
-    protected $_stockItem;
-
-    /**
-     * Updater constructor
-     *
-     * @param \Magento\CatalogInventory\Model\Resource\Stock\Item $stockItem
-     */
-    public function __construct(\Magento\CatalogInventory\Model\Resource\Stock\Item $stockItem)
-    {
-        $this->_stockItem = $stockItem;
-    }
-
-    /**
-     * Add filtration by qty and stock availability
-     *
-     * @param \Magento\Catalog\Model\Resource\Product\Collection\AssociatedProduct $collection
-     * @return mixed
-     */
-    public function update($collection)
-    {
-        $this->_stockItem->addCatalogInventoryToProductCollection(
-            $collection,
-            array(
-                'qty' => 'qty',
-                'inventory_in_stock' => 'is_in_stock'
-            )
-        );
-        return $collection;
-    }
-}
diff --git a/app/code/Magento/Catalog/Model/Resource/Product/Flat.php b/app/code/Magento/Catalog/Model/Resource/Product/Flat.php
index 6267066827a..583de61d12c 100644
--- a/app/code/Magento/Catalog/Model/Resource/Product/Flat.php
+++ b/app/code/Magento/Catalog/Model/Resource/Product/Flat.php
@@ -80,7 +80,7 @@ class Flat extends \Magento\Core\Model\Resource\Db\AbstractDb
     protected function _construct()
     {
         $this->_init('catalog_product_flat', 'entity_id');
-        $this->_storeId = (int)$this->_storeManager->getStore()->getId();
+        $this->setStoreId(null);
     }
 
     /**
@@ -104,7 +104,10 @@ class Flat extends \Magento\Core\Model\Resource\Db\AbstractDb
         if (is_int($store)) {
             $this->_storeId = $store;
         } else {
-            $this->_storeId = (int)$this->_storeManager->getStore($store)->getId();
+            $this->_storeId = $this->_storeManager->getStore()->getId();
+        }
+        if (empty($this->_storeId)) {
+            $this->_storeId = (int)$this->_storeManager->getDefaultStoreView()->getId();
         }
         return $this;
     }
diff --git a/app/code/Magento/Catalog/Model/Resource/Product/Flat/Indexer.php b/app/code/Magento/Catalog/Model/Resource/Product/Flat/Indexer.php
deleted file mode 100644
index 4f5974714d9..00000000000
--- a/app/code/Magento/Catalog/Model/Resource/Product/Flat/Indexer.php
+++ /dev/null
@@ -1,1441 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-namespace Magento\Catalog\Model\Resource\Product\Flat;
-
-/**
- * Catalog Product Flat Indexer Resource Model
- */
-class Indexer extends \Magento\Index\Model\Resource\AbstractResource
-{
-    /**
-     * @var \Magento\Eav\Model\Config
-     */
-    private $_eavConfig;
-
-    /**
-     * @var \Magento\Catalog\Model\Attribute\Config
-     */
-    private $_attributeConfig;
-
-    /**
-     * Attribute codes for flat
-     *
-     * @var array
-     */
-    protected $_attributeCodes;
-
-    /**
-     * Attribute objects for flat cache
-     *
-     * @var array
-     */
-    protected $_attributes;
-
-    /**
-     * Required system attributes for preload
-     *
-     * @var string[]
-     */
-    protected $_systemAttributes     = array('status', 'required_options', 'tax_class_id', 'weight');
-
-    /**
-     * Eav Catalog_Product Entity Type Id
-     *
-     * @var int
-     */
-    protected $_entityTypeId;
-
-    /**
-     * Flat table columns cache
-     *
-     * @var array
-     */
-    protected $_columns;
-
-    /**
-     * Flat table indexes cache
-     *
-     * @var array
-     */
-    protected $_indexes;
-
-    /**
-     * Product Type Instances cache
-     *
-     * @var array
-     */
-    protected $_productTypes;
-
-    /**
-     * Exists flat tables cache
-     *
-     * @var array
-     */
-    protected $_existsFlatTables     = array();
-
-    /**
-     * Flat tables which were prepared
-     *
-     * @var array
-     */
-    protected $_preparedFlatTables   = array();
-
-    /**
-     * Catalog product flat
-     *
-     * @var \Magento\Catalog\Helper\Product\Flat
-     */
-    protected $_catalogProductFlat = null;
-
-    /**
-     * Core data
-     *
-     * @var \Magento\Core\Helper\Data
-     */
-    protected $_coreData = null;
-
-    /**
-     * Core event manager proxy
-     *
-     * @var \Magento\Event\ManagerInterface
-     */
-    protected $_eventManager = null;
-
-    /**
-     * @var int
-     */
-    protected $_maxIndexCount;
-
-    /**
-     * @var string[]
-     */
-    protected $_flatAttributeGroups;
-
-    /**
-     * @var \Magento\Logger
-     */
-    protected $_logger;
-
-    /**
-     * @var \Magento\Catalog\Model\Product\Type
-     */
-    protected $_productType;
-
-    /**
-     * Store manager
-     *
-     * @var \Magento\Core\Model\StoreManagerInterface
-     */
-    protected $_storeManager;
-
-    /**
-     * Eav attribute factory
-     *
-     * @var \Magento\Catalog\Model\Resource\Eav\AttributeFactory
-     */
-    protected $_eavAttributeFactory;
-
-    /**
-     * Config factory
-     *
-     * @var \Magento\Catalog\Model\Resource\ConfigFactory
-     */
-    protected $_configFactory;
-
-    /**
-     * Catalog resource helper
-     *
-     * @var \Magento\Catalog\Model\Resource\Helper
-     */
-    protected $_resourceHelper;
-
-    /**
-     * @param \Magento\App\Resource $resource
-     * @param \Magento\Catalog\Model\Resource\ConfigFactory $configFactory
-     * @param \Magento\Catalog\Model\Resource\Eav\AttributeFactory $eavAttributeFactory
-     * @param \Magento\Core\Model\StoreManagerInterface $storeManager
-     * @param \Magento\Logger $logger
-     * @param \Magento\Event\ManagerInterface $eventManager
-     * @param \Magento\Core\Helper\Data $coreData
-     * @param \Magento\Eav\Model\Config $eavConfig
-     * @param \Magento\Catalog\Model\Attribute\Config $attributeConfig
-     * @param \Magento\Catalog\Helper\Product\Flat $catalogProductFlat
-     * @param \Magento\Catalog\Model\Product\Type $productType
-     * @param \Magento\Catalog\Model\Resource\Helper $resourceHelper
-     * @param string $maxIndexCount
-     * @param string[] $flatAttributeGroups
-     */
-    public function __construct(
-        \Magento\App\Resource $resource,
-        \Magento\Catalog\Model\Resource\ConfigFactory $configFactory,
-        \Magento\Catalog\Model\Resource\Eav\AttributeFactory $eavAttributeFactory,
-        \Magento\Core\Model\StoreManagerInterface $storeManager,
-        \Magento\Logger $logger,
-        \Magento\Event\ManagerInterface $eventManager,
-        \Magento\Core\Helper\Data $coreData,
-        \Magento\Eav\Model\Config $eavConfig,
-        \Magento\Catalog\Model\Attribute\Config $attributeConfig,
-        \Magento\Catalog\Helper\Product\Flat $catalogProductFlat,
-        \Magento\Catalog\Model\Product\Type $productType,
-        \Magento\Catalog\Model\Resource\Helper $resourceHelper,
-        $maxIndexCount,
-        array $flatAttributeGroups = array()
-    ) {
-        $this->_configFactory = $configFactory;
-        $this->_eavAttributeFactory = $eavAttributeFactory;
-        $this->_storeManager = $storeManager;
-        $this->_eventManager = $eventManager;
-        $this->_coreData = $coreData;
-        $this->_eavConfig = $eavConfig;
-        $this->_attributeConfig = $attributeConfig;
-        $this->_catalogProductFlat = $catalogProductFlat;
-        $this->_maxIndexCount = intval($maxIndexCount);
-        $this->_flatAttributeGroups = $flatAttributeGroups;
-        $this->_logger = $logger;
-        $this->_productType = $productType;
-        $this->_resourceHelper = $resourceHelper;
-        parent::__construct($resource);
-    }
-
-    /**
-     * Initialize connection
-     *
-     * @return void
-     */
-    protected function _construct()
-    {
-        $this->_init('catalog_product_entity', 'entity_id');
-    }
-
-    /**
-     * Rebuild Catalog Product Flat Data
-     *
-     * @param \Magento\Core\Model\Store|int $store
-     * @return $this
-     */
-    public function rebuild($store = null)
-    {
-        if ($store === null) {
-            foreach ($this->_storeManager->getStores() as $store) {
-                $this->rebuild($store->getId());
-            }
-            return $this;
-        }
-
-        $storeId = (int)$this->_storeManager->getStore($store)->getId();
-
-        $this->prepareFlatTable($storeId);
-        $this->cleanNonWebsiteProducts($storeId);
-        $this->updateStaticAttributes($storeId);
-        $this->updateEavAttributes($storeId);
-        $this->updateEventAttributes($storeId);
-        $this->updateRelationProducts($storeId);
-        $this->cleanRelationProducts($storeId);
-
-        $flag = $this->getFlatHelper()->getFlag();
-        $flag->setIsBuilt(true)->save();
-        return $this;
-    }
-
-    /**
-     * Retrieve Catalog Product Flat helper
-     *
-     * @return \Magento\Catalog\Helper\Product\Flat
-     */
-    public function getFlatHelper()
-    {
-        return $this->_catalogProductFlat;
-    }
-
-    /**
-     * Retrieve attribute codes using for flat
-     *
-     * @return array
-     */
-    public function getAttributeCodes()
-    {
-        if ($this->_attributeCodes === null) {
-            $adapter = $this->_getReadAdapter();
-            $this->_attributeCodes = array();
-
-            foreach ($this->_flatAttributeGroups as $attributeGroupName) {
-                $attributes = $this->_attributeConfig->getAttributeNames($attributeGroupName);
-                $this->_systemAttributes = array_unique(array_merge($attributes, $this->_systemAttributes));
-            }
-
-            $bind = array(
-                'backend_type'      => \Magento\Eav\Model\Entity\Attribute\AbstractAttribute::TYPE_STATIC,
-                'entity_type_id'    => $this->getEntityTypeId()
-            );
-
-            $select = $adapter->select()
-                ->from(array('main_table' => $this->getTable('eav_attribute')))
-                ->join(
-                    array('additional_table' => $this->getTable('catalog_eav_attribute')),
-                    'additional_table.attribute_id = main_table.attribute_id'
-                )
-                ->where('main_table.entity_type_id = :entity_type_id');
-            $whereCondition = array(
-                'main_table.backend_type = :backend_type',
-                $adapter->quoteInto('additional_table.is_used_for_promo_rules = ?', 1),
-                $adapter->quoteInto('additional_table.used_in_product_listing = ?', 1),
-                $adapter->quoteInto('additional_table.used_for_sort_by = ?', 1),
-                $adapter->quoteInto('main_table.attribute_code IN(?)', $this->_systemAttributes)
-            );
-            if ($this->getFlatHelper()->isAddFilterableAttributes()) {
-                $whereCondition[] = $adapter->quoteInto('additional_table.is_filterable > ?', 0);
-            }
-
-            $select->where(implode(' OR ', $whereCondition));
-            $attributesData = $adapter->fetchAll($select, $bind);
-            $this->_eavConfig->importAttributesData($this->getEntityType(), $attributesData);
-
-            foreach ($attributesData as $data) {
-                $this->_attributeCodes[$data['attribute_id']] = $data['attribute_code'];
-            }
-            unset($attributesData);
-        }
-
-        return $this->_attributeCodes;
-    }
-
-    /**
-     * Retrieve entity type
-     *
-     * @return string
-     */
-    public function getEntityType()
-    {
-        return \Magento\Catalog\Model\Product::ENTITY;
-    }
-
-    /**
-     * Retrieve Catalog Entity Type Id
-     *
-     * @return int
-     */
-    public function getEntityTypeId()
-    {
-        if ($this->_entityTypeId === null) {
-            $this->_entityTypeId = $this->_configFactory->create()
-                ->getEntityTypeId();
-        }
-        return $this->_entityTypeId;
-    }
-
-    /**
-     * Retrieve attribute objects for flat
-     *
-     * @return array
-     */
-    public function getAttributes()
-    {
-        if ($this->_attributes === null) {
-            $this->_attributes = array();
-            $attributeCodes    = $this->getAttributeCodes();
-            $entity = $this->_eavConfig
-                ->getEntityType($this->getEntityType())
-                ->getEntity();
-
-            foreach ($attributeCodes as $attributeCode) {
-                $attribute = $this->_eavConfig
-                    ->getAttribute($this->getEntityType(), $attributeCode)
-                    ->setEntity($entity);
-                try {
-                    // check if exists source and backend model.
-                    // To prevent exception when some module was disabled
-                    $attribute->usesSource() && $attribute->getSource();
-                    $attribute->getBackend();
-                    $this->_attributes[$attributeCode] = $attribute;
-                } catch (\Exception $e) {
-                    $this->_logger->logException($e);
-                }
-            }
-        }
-
-        return $this->_attributes;
-    }
-
-    /**
-     * Retrieve loaded attribute by code
-     *
-     * @param string $attributeCode
-     * @throws \Magento\Core\Exception
-     * @return \Magento\Eav\Model\Entity\Attribute
-     */
-    public function getAttribute($attributeCode)
-    {
-        $attributes = $this->getAttributes();
-        if (!isset($attributes[$attributeCode])) {
-            $attribute = $this->_eavAttributeFactory->create()
-                ->loadByCode($this->getEntityTypeId(), $attributeCode);
-            if (!$attribute->getId()) {
-                throw new \Magento\Core\Exception(__('Invalid attribute %1', $attributeCode));
-            }
-            $entity = $this->_eavConfig
-                ->getEntityType($this->getEntityType())
-                ->getEntity();
-            $attribute->setEntity($entity);
-
-            return $attribute;
-        }
-
-        return $attributes[$attributeCode];
-    }
-
-    /**
-     * Retrieve Catalog Product Flat Table name
-     *
-     * @param int $storeId
-     * @return string
-     */
-    public function getFlatTableName($storeId)
-    {
-        return sprintf('%s_%s', $this->getTable('catalog_product_flat'), $storeId);
-    }
-
-    /**
-     * Retrieve catalog product flat columns array in old format (used before MMDB support)
-     *
-     * @return array
-     */
-    protected function _getFlatColumnsOldDefinition()
-    {
-        $columns = array();
-        $columns['entity_id'] = array(
-            'type'      => 'int(10)',
-            'unsigned'  => true,
-            'is_null'   => false,
-            'default'   => null,
-            'extra'     => null
-        );
-        if ($this->getFlatHelper()->isAddChildData()) {
-            $columns['child_id'] = array(
-                'type'      => 'int(10)',
-                'unsigned'  => true,
-                'is_null'   => true,
-                'default'   => null,
-                'extra'     => null
-            );
-            $columns['is_child'] = array(
-                'type'      => 'tinyint(1)',
-                'unsigned'  => true,
-                'is_null'   => false,
-                'default'   => 0,
-                'extra'     => null
-            );
-        }
-        $columns['attribute_set_id'] = array(
-            'type'      => 'smallint(5)',
-            'unsigned'  => true,
-            'is_null'   => false,
-            'default'   => 0,
-            'extra'     => null
-        );
-        $columns['type_id'] = array(
-            'type'      => 'varchar(32)',
-            'unsigned'  => false,
-            'is_null'   => false,
-            'default'   => \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE,
-            'extra'     => null
-        );
-
-        return $columns;
-    }
-
-    /**
-     * Retrieve catalog product flat columns array in DDL format
-     *
-     * @return array
-     */
-    protected function _getFlatColumnsDdlDefinition()
-    {
-        $columns = array();
-        $columns['entity_id'] = array(
-            'type'      => \Magento\DB\Ddl\Table::TYPE_INTEGER,
-            'length'    => null,
-            'unsigned'  => true,
-            'nullable'  => false,
-            'default'   => false,
-            'primary'   => true,
-            'comment'   => 'Entity Id'
-        );
-        if ($this->getFlatHelper()->isAddChildData()) {
-            $columns['child_id'] = array(
-                'type'      => \Magento\DB\Ddl\Table::TYPE_INTEGER,
-                'length'    => null,
-                'unsigned'  => true,
-                'nullable'  => true,
-                'default'   => null,
-                'primary'   => true,
-                'comment'   => 'Child Id'
-            );
-            $columns['is_child'] = array(
-                'type'      => \Magento\DB\Ddl\Table::TYPE_SMALLINT,
-                'length'    => 1,
-                'unsigned'  => true,
-                'nullable'  => false,
-                'default'   => '0',
-                'comment'   => 'Checks If Entity Is Child'
-            );
-        }
-        $columns['attribute_set_id'] = array(
-            'type'      => \Magento\DB\Ddl\Table::TYPE_SMALLINT,
-            'length'    => 5,
-            'unsigned'  => true,
-            'nullable'  => false,
-            'default'   => '0',
-            'comment'   => 'Attribute Set Id'
-        );
-        $columns['type_id'] = array(
-            'type'      => \Magento\DB\Ddl\Table::TYPE_TEXT,
-            'length'    => 32,
-            'unsigned'  => false,
-            'nullable'  => false,
-            'default'   => \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE,
-            'comment'   => 'Type Id'
-        );
-
-        return $columns;
-    }
-
-    /**
-     * Retrieve catalog product flat table columns array
-     *
-     * @return array
-     */
-    public function getFlatColumns()
-    {
-        if ($this->_columns === null) {
-            if ($this->_coreData->useDbCompatibleMode()) {
-                $this->_columns = $this->_getFlatColumnsOldDefinition();
-            } else {
-                $this->_columns = $this->_getFlatColumnsDdlDefinition();
-            }
-
-            foreach ($this->getAttributes() as $attribute) {
-                /** @var $attribute \Magento\Eav\Model\Entity\Attribute\AbstractAttribute */
-                $columns = $attribute
-                    ->setFlatAddFilterableAttributes($this->getFlatHelper()->isAddFilterableAttributes())
-                    ->setFlatAddChildData($this->getFlatHelper()->isAddChildData())
-                    ->getFlatColumns();
-                if ($columns !== null) {
-                    $this->_columns = array_merge($this->_columns, $columns);
-                }
-            }
-
-            $columnsObject = new \Magento\Object();
-            $columnsObject->setColumns($this->_columns);
-            $this->_eventManager->dispatch('catalog_product_flat_prepare_columns',
-                array('columns' => $columnsObject)
-            );
-            $this->_columns = $columnsObject->getColumns();
-        }
-
-        return $this->_columns;
-    }
-
-    /**
-     * Retrieve catalog product flat table indexes array
-     *
-     * @return array
-     */
-    public function getFlatIndexes()
-    {
-        if ($this->_indexes === null) {
-            $this->_indexes = array();
-
-            if ($this->getFlatHelper()->isAddChildData()) {
-                $this->_indexes['PRIMARY'] = array(
-                    'type'   => \Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_PRIMARY,
-                    'fields' => array('entity_id', 'child_id')
-                );
-                $this->_indexes['IDX_CHILD'] = array(
-                    'type'   => \Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_INDEX,
-                    'fields' => array('child_id')
-                );
-                $this->_indexes['IDX_IS_CHILD'] = array(
-                    'type'   => \Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_INDEX,
-                    'fields' => array('entity_id', 'is_child')
-                );
-            } else {
-                $this->_indexes['PRIMARY'] = array(
-                    'type'   => \Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_PRIMARY,
-                    'fields' => array('entity_id')
-                );
-            }
-            $this->_indexes['IDX_TYPE_ID'] = array(
-                'type'   => \Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_INDEX,
-                'fields' => array('type_id')
-            );
-            $this->_indexes['IDX_ATTRIBUTE_SET'] = array(
-                'type'   => \Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_INDEX,
-                'fields' => array('attribute_set_id')
-            );
-
-            foreach ($this->getAttributes() as $attribute) {
-                /** @var $attribute \Magento\Eav\Model\Entity\Attribute */
-                $indexes = $attribute
-                    ->setFlatAddFilterableAttributes($this->getFlatHelper()->isAddFilterableAttributes())
-                    ->setFlatAddChildData($this->getFlatHelper()->isAddChildData())
-                    ->getFlatIndexes();
-                if ($indexes !== null) {
-                    $this->_indexes = array_merge($this->_indexes, $indexes);
-                }
-            }
-
-            $indexesObject = new \Magento\Object();
-            $indexesObject->setIndexes($this->_indexes);
-            $this->_eventManager->dispatch('catalog_product_flat_prepare_indexes', array(
-                'indexes'   => $indexesObject
-            ));
-            $this->_indexes = $indexesObject->getIndexes();
-        }
-
-        return $this->_indexes;
-    }
-
-    /**
-     * Compare Flat style with Describe style columns
-     * If column a different - return false
-     *
-     * @param array $column
-     * @param array $describe
-     * @return bool
-     */
-    protected function _compareColumnProperties($column, $describe)
-    {
-        return $this->_resourceHelper->compareIndexColumnProperties($column, $describe);
-    }
-
-    /**
-     * Retrieve UNIQUE HASH for a Table foreign key
-     *
-     * @param string $priTableName  the target table name
-     * @param string $priColumnName the target table column name
-     * @param string $refTableName  the reference table name
-     * @param string $refColumnName the reference table column name
-     * @return string
-     */
-    public function getFkName($priTableName, $priColumnName, $refTableName, $refColumnName)
-    {
-        return $this->_resources->getFkName($priTableName, $priColumnName, $refTableName, $refColumnName);
-    }
-
-    /**
-     * Prepare flat table for store
-     *
-     * @param int $storeId
-     * @throws \Magento\Core\Exception
-     * @return $this
-     */
-    public function prepareFlatTable($storeId)
-    {
-        if (isset($this->_preparedFlatTables[$storeId])) {
-            return $this;
-        }
-        $adapter   = $this->_getWriteAdapter();
-        $tableName = $this->getFlatTableName($storeId);
-
-        // Extract columns we need to have in flat table
-        $columns = $this->getFlatColumns();
-        if ($this->_coreData->useDbCompatibleMode()) {
-             /* Convert old format of flat columns to new MMDB format that uses DDL types and definitions */
-            foreach ($columns as $key => $column) {
-                $columns[$key] = $this->_resourceHelper->convertOldColumnDefinition($column);
-            }
-        }
-
-        // Extract indexes we need to have in flat table
-        $indexesNeed  = $this->getFlatIndexes();
-
-        if (count($indexesNeed) > $this->_maxIndexCount) {
-            throw new \Magento\Core\Exception(__("Please make sure you don\'t have too many filterable and sortable attributes. You now have %1\$d. The Flat Catalog module allows only %2\$d.", count($indexesNeed), $maxIndex));
-        }
-
-        // Process indexes to create names for them in MMDB-style and reformat to common index definition
-        $indexKeys = array();
-        $indexProps = array_values($indexesNeed);
-        $upperPrimaryKey = strtoupper(\Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_PRIMARY);
-        foreach ($indexProps as $i => $indexProp) {
-            $indexName = $adapter->getIndexName($tableName, $indexProp['fields'], $indexProp['type']);
-            $indexProp['type'] = strtoupper($indexProp['type']);
-            if ($indexProp['type'] == $upperPrimaryKey) {
-                $indexKey = $upperPrimaryKey;
-            } else {
-                $indexKey = $indexName;
-            }
-
-            $indexProps[$i] = array(
-                'KEY_NAME' => $indexName,
-                'COLUMNS_LIST' => $indexProp['fields'],
-                'INDEX_TYPE' => strtolower($indexProp['type'])
-            );
-            $indexKeys[$i] = $indexKey;
-        }
-        $indexesNeed = array_combine($indexKeys, $indexProps); // Array with index names as keys, except for primary
-
-        // Foreign keys
-        $foreignEntityKey = $this->getFkName($tableName, 'entity_id', 'catalog_product_entity', 'entity_id');
-        $foreignChildKey  = $this->getFkName($tableName, 'child_id', 'catalog_product_entity', 'entity_id');
-
-        // Create table or modify existing one
-        if (!$this->_isFlatTableExists($storeId)) {
-            /** @var $table \Magento\DB\Ddl\Table */
-            $table = $adapter->newTable($tableName);
-            foreach ($columns as $fieldName => $fieldProp) {
-                $table->addColumn(
-                    $fieldName,
-                    $fieldProp['type'],
-                    isset($fieldProp['length']) ? $fieldProp['length'] : null,
-                    array(
-                        'nullable' => isset($fieldProp['nullable']) ? (bool)$fieldProp['nullable'] : false,
-                        'unsigned' => isset($fieldProp['unsigned']) ? (bool)$fieldProp['unsigned'] : false,
-                        'default'  => isset($fieldProp['default']) ? $fieldProp['default'] : false,
-                        'primary'  => false,
-                    ),
-                    isset($fieldProp['comment']) ? $fieldProp['comment'] : $fieldName
-                );
-            }
-
-            foreach ($indexesNeed as $indexProp) {
-                $table->addIndex($indexProp['KEY_NAME'], $indexProp['COLUMNS_LIST'],
-                    array('type' => $indexProp['INDEX_TYPE']));
-            }
-
-            $table->addForeignKey($foreignEntityKey,
-                'entity_id', $this->getTable('catalog_product_entity'), 'entity_id',
-                \Magento\DB\Ddl\Table::ACTION_CASCADE, \Magento\DB\Ddl\Table::ACTION_CASCADE);
-
-            if ($this->getFlatHelper()->isAddChildData()) {
-                $table->addForeignKey($foreignChildKey,
-                    'child_id', $this->getTable('catalog_product_entity'), 'entity_id',
-                    \Magento\DB\Ddl\Table::ACTION_CASCADE, \Magento\DB\Ddl\Table::ACTION_CASCADE);
-            }
-            $table->setComment("Catalog Product Flat (Store {$storeId})");
-
-            $adapter->createTable($table);
-
-            $this->_existsFlatTables[$storeId] = true;
-        } else {
-            $adapter->resetDdlCache($tableName);
-
-            // Sort columns into added/altered/dropped lists
-            $describe   = $adapter->describeTable($tableName);
-            $addColumns     = array_diff_key($columns, $describe);
-            $dropColumns    = array_diff_key($describe, $columns);
-            $modifyColumns  = array();
-            foreach ($columns as $field => $fieldProp) {
-                if (isset($describe[$field]) && !$this->_compareColumnProperties($fieldProp, $describe[$field])) {
-                    $modifyColumns[$field] = $fieldProp;
-                }
-            }
-
-            // Sort indexes into added/dropped lists. Altered indexes are put into both lists.
-            $addIndexes = array();
-            $dropIndexes = array();
-            $indexesNow  = $adapter->getIndexList($tableName); // Note: primary is always stored under 'PRIMARY' key
-            $newIndexes = $indexesNeed;
-            foreach ($indexesNow as $key => $indexNow) {
-                if (isset($indexesNeed[$key])) {
-                    $indexNeed = $indexesNeed[$key];
-                    if (($indexNeed['INDEX_TYPE'] != $indexNow['INDEX_TYPE'])
-                        || ($indexNeed['COLUMNS_LIST'] != $indexNow['COLUMNS_LIST'])) {
-                        $dropIndexes[$key] = $indexNow;
-                        $addIndexes[$key] = $indexNeed;
-                    }
-                    unset($newIndexes[$key]);
-                } else {
-                    $dropIndexes[$key] = $indexNow;
-                }
-            }
-            $addIndexes = $addIndexes + $newIndexes;
-
-            // Compose contstraints
-            $addConstraints = array();
-            $addConstraints[$foreignEntityKey] = array(
-                'table_index'   => 'entity_id',
-                'ref_table'     => $this->getTable('catalog_product_entity'),
-                'ref_index'     => 'entity_id',
-                'on_update'     => \Magento\DB\Ddl\Table::ACTION_CASCADE,
-                'on_delete'     => \Magento\DB\Ddl\Table::ACTION_CASCADE
-            );
-
-            // Additional data from childs
-            $isAddChildData = $this->getFlatHelper()->isAddChildData();
-            if (!$isAddChildData && isset($describe['is_child'])) {
-                $adapter->delete($tableName, array('is_child = ?' => 1));
-                $adapter->dropForeignKey($tableName, $foreignChildKey);
-            }
-            if ($isAddChildData && !isset($describe['is_child'])) {
-                $adapter->delete($tableName);
-                $dropIndexes['PRIMARY'] = $indexesNow['PRIMARY'];
-                $addIndexes['PRIMARY']  = $indexesNeed['PRIMARY'];
-
-                $addConstraints[$foreignChildKey] = array(
-                    'table_index'   => 'child_id',
-                    'ref_table'     => $this->getTable('catalog_product_entity'),
-                    'ref_index'     => 'entity_id',
-                    'on_update'     => \Magento\DB\Ddl\Table::ACTION_CASCADE,
-                    'on_delete'     => \Magento\DB\Ddl\Table::ACTION_CASCADE
-                );
-            }
-
-            // Drop constraints
-            foreach (array_keys($adapter->getForeignKeys($tableName)) as $constraintName) {
-                $adapter->dropForeignKey($tableName, $constraintName);
-            }
-
-            // Drop indexes
-            foreach ($dropIndexes as $indexProp) {
-                $adapter->dropIndex($tableName, $indexProp['KEY_NAME']);
-            }
-
-            // Drop columns
-            foreach (array_keys($dropColumns) as $columnName) {
-                $adapter->dropColumn($tableName, $columnName);
-            }
-
-            // Modify columns
-            foreach ($modifyColumns as $columnName => $columnProp) {
-                $columnProp = array_change_key_case($columnProp, CASE_UPPER);
-                if (!isset($columnProp['COMMENT'])) {
-                    $columnProp['COMMENT'] = ucwords(str_replace('_', ' ', $columnName));
-                }
-                $adapter->changeColumn($tableName, $columnName, $columnName, $columnProp);
-            }
-
-            // Add columns
-            foreach ($addColumns as $columnName => $columnProp) {
-                $columnProp = array_change_key_case($columnProp, CASE_UPPER);
-                if (!isset($columnProp['COMMENT'])) {
-                    $columnProp['COMMENT'] = ucwords(str_replace('_', ' ', $columnName));
-                }
-                $adapter->addColumn($tableName, $columnName, $columnProp);
-            }
-
-            // Add indexes
-            foreach ($addIndexes as $indexProp) {
-                $adapter->addIndex($tableName, $indexProp['KEY_NAME'], $indexProp['COLUMNS_LIST'],
-                    $indexProp['INDEX_TYPE']);
-            }
-
-            // Add constraints
-            foreach ($addConstraints as $constraintName => $constraintProp) {
-                $adapter->addForeignKey($constraintName, $tableName,
-                    $constraintProp['table_index'],
-                    $constraintProp['ref_table'],
-                    $constraintProp['ref_index'],
-                    $constraintProp['on_delete'],
-                    $constraintProp['on_update']
-                );
-            }
-        }
-
-        $this->_preparedFlatTables[$storeId] = true;
-
-        return $this;
-    }
-
-    /**
-     * Add or Update static attributes
-     *
-     * @param int $storeId
-     * @param int|array $productIds update only product(s)
-     * @return $this
-     */
-    public function updateStaticAttributes($storeId, $productIds = null)
-    {
-        if (!$this->_isFlatTableExists($storeId)) {
-            return $this;
-        }
-        $adapter   = $this->_getWriteAdapter();
-        $websiteId = (int)$this->_storeManager->getStore($storeId)->getWebsite()->getId();
-        /* @var $status \Magento\Eav\Model\Entity\Attribute */
-        $status    = $this->getAttribute('status');
-
-        $fieldList  = array('entity_id', 'type_id', 'attribute_set_id');
-        $colsList   = array('entity_id', 'type_id', 'attribute_set_id');
-        if ($this->getFlatHelper()->isAddChildData()) {
-            $fieldList = array_merge($fieldList, array('child_id', 'is_child'));
-            $isChild   = new \Zend_Db_Expr('0');
-            $colsList  = array_merge($colsList, array('entity_id', $isChild));
-        }
-
-        $columns    = $this->getFlatColumns();
-        $bind       = array(
-            'website_id'     => $websiteId,
-            'store_id'       => $storeId,
-            'entity_type_id' => (int)$status->getEntityTypeId(),
-            'attribute_id'   => (int)$status->getId()
-        );
-
-        $fieldExpr = $adapter->getCheckSql('t2.value_id > 0', 't2.value', 't1.value');
-        $select     = $this->_getWriteAdapter()->select()
-            ->from(array('e' => $this->getTable('catalog_product_entity')), $colsList)
-            ->join(
-                array('wp' => $this->getTable('catalog_product_website')),
-                'e.entity_id = wp.product_id AND wp.website_id = :website_id',
-                array())
-            ->joinLeft(
-                array('t1' => $status->getBackend()->getTable()),
-                'e.entity_id = t1.entity_id',
-                array())
-            ->joinLeft(
-                array('t2' => $status->getBackend()->getTable()),
-                't2.entity_id = t1.entity_id'
-                    . ' AND t1.entity_type_id = t2.entity_type_id'
-                    . ' AND t1.attribute_id = t2.attribute_id'
-                    . ' AND t2.store_id = :store_id',
-                array())
-            ->where('t1.entity_type_id = :entity_type_id')
-            ->where('t1.attribute_id = :attribute_id')
-            ->where('t1.store_id = ?', \Magento\Core\Model\Store::DEFAULT_STORE_ID)
-            ->where("{$fieldExpr} = ?", \Magento\Catalog\Model\Product\Status::STATUS_ENABLED);
-        foreach ($this->getAttributes() as $attributeCode => $attribute) {
-            /** @var $attribute \Magento\Eav\Model\Entity\Attribute */
-            if ($attribute->getBackend()->getType() == 'static') {
-                if (!isset($columns[$attributeCode])) {
-                    continue;
-                }
-                $fieldList[] = $attributeCode;
-                $select->columns($attributeCode, 'e');
-            }
-        }
-
-        if ($productIds !== null) {
-            $select->where('e.entity_id IN(?)', $productIds);
-        }
-
-        $sql = $select->insertFromSelect($this->getFlatTableName($storeId), $fieldList);
-        $adapter->query($sql, $bind);
-
-        return $this;
-    }
-
-    /**
-     * Remove non website products
-     *
-     * @param int $storeId
-     * @param int|array $productIds
-     * @return $this
-     */
-    public function cleanNonWebsiteProducts($storeId, $productIds = null)
-    {
-        if (!$this->_isFlatTableExists($storeId)) {
-            return $this;
-        }
-
-        $websiteId = (int)$this->_storeManager->getStore($storeId)->getWebsite()->getId();
-        $adapter   = $this->_getWriteAdapter();
-
-        $joinCondition = array(
-            'e.entity_id = wp.product_id',
-            'wp.website_id = :website_id'
-        );
-        if ($this->getFlatHelper()->isAddChildData()) {
-            $joinCondition[] = 'e.child_id = wp.product_id';
-        }
-        $bind   = array('website_id'    => $websiteId);
-        $select = $adapter->select()
-            ->from(array('e' => $this->getFlatTableName($storeId)), null)
-            ->joinLeft(
-                array('wp' => $this->getTable('catalog_product_website')),
-                implode(' AND ', $joinCondition),
-                array());
-        if ($productIds !== null) {
-            $condition = array(
-                $adapter->quoteInto('e.entity_id IN(?)', $productIds)
-            );
-            if ($this->getFlatHelper()->isAddChildData()) {
-                $condition[] = $adapter->quoteInto('e.child_id IN(?)', $productIds);
-            }
-            $select->where(implode(' OR ', $condition));
-        }
-
-        $sql = $select->deleteFromSelect('e');
-        $adapter->query($sql, $bind);
-
-        return $this;
-    }
-
-    /**
-     * Update attribute flat data
-     *
-     * @param \Magento\Eav\Model\Entity\Attribute $attribute
-     * @param int $storeId
-     * @param int|array $productIds update only product(s)
-     * @return $this
-     */
-    public function updateAttribute($attribute, $storeId, $productIds = null)
-    {
-        if (!$this->_isFlatTableExists($storeId)) {
-            return $this;
-        }
-        $adapter       = $this->_getWriteAdapter();
-        $flatTableName = $this->getFlatTableName($storeId);
-        $describe      = $adapter->describeTable($flatTableName);
-
-        if ($attribute->getBackend()->getType() == 'static') {
-            if (!isset($describe[$attribute->getAttributeCode()])) {
-                return $this;
-            }
-
-            $select = $adapter->select()
-                ->join(
-                    array('main_table' => $this->getTable('catalog_product_entity')),
-                    'main_table.entity_id = e.entity_id',
-                    array($attribute->getAttributeCode() => 'main_table.' . $attribute->getAttributeCode())
-                );
-            if ($this->getFlatHelper()->isAddChildData()) {
-                $select->where('e.is_child = ?', 0);
-            }
-            if ($productIds !== null) {
-                $select->where('main_table.entity_id IN(?)', $productIds);
-            }
-
-            $sql = $select->crossUpdateFromSelect(array('e' => $flatTableName));
-            $adapter->query($sql);
-        } else {
-            $columns = $attribute->getFlatColumns();
-            if (!$columns) {
-                return $this;
-            }
-            foreach (array_keys($columns) as $columnName) {
-                if (!isset($describe[$columnName])) {
-                    return $this;
-                }
-            }
-
-            $select = $attribute->getFlatUpdateSelect($storeId);
-            if ($select instanceof \Magento\DB\Select) {
-                if ($productIds !== null) {
-                    $select->where('e.entity_id IN(?)', $productIds);
-                }
-
-                $sql = $select->crossUpdateFromSelect(array('e' => $flatTableName));
-                $adapter->query($sql);
-            }
-        }
-
-        return $this;
-    }
-
-    /**
-     * Update non static EAV attributes flat data
-     *
-     * @param int $storeId
-     * @param int|array $productIds update only product(s)
-     * @return $this
-     */
-    public function updateEavAttributes($storeId, $productIds = null)
-    {
-        if (!$this->_isFlatTableExists($storeId)) {
-            return $this;
-        }
-
-        foreach ($this->getAttributes() as $attribute) {
-            /* @var $attribute \Magento\Eav\Model\Entity\Attribute */
-            if ($attribute->getBackend()->getType() != 'static') {
-                $this->updateAttribute($attribute, $storeId, $productIds);
-            }
-        }
-        return $this;
-    }
-
-    /**
-     * Update events observer attributes
-     *
-     * @param int $storeId
-     * @return void
-     */
-    public function updateEventAttributes($storeId = null)
-    {
-        $this->_eventManager->dispatch('catalog_product_flat_rebuild', array(
-            'store_id' => $storeId,
-            'table'    => $this->getFlatTableName($storeId)
-        ));
-    }
-
-    /**
-     * Retrieve Product Type Instances
-     * as key - type code, value - instance model
-     *
-     * @return array
-     */
-    public function getProductTypeInstances()
-    {
-        if ($this->_productTypes === null) {
-            $this->_productTypes = array();
-            $productEmulator     = new \Magento\Object();
-
-            foreach (array_keys($this->_productType->getTypes()) as $typeId) {
-                $productEmulator->setTypeId($typeId);
-                $this->_productTypes[$typeId] = $this->_productType
-                    ->factory($productEmulator);
-            }
-        }
-        return $this->_productTypes;
-    }
-
-    /**
-     * Update relation products
-     *
-     * @param int $storeId
-     * @param int|array $productIds Update child product(s) only
-     * @return $this
-     */
-    public function updateRelationProducts($storeId, $productIds = null)
-    {
-        if (!$this->getFlatHelper()->isAddChildData() || !$this->_isFlatTableExists($storeId)) {
-            return $this;
-        }
-
-        $adapter = $this->_getWriteAdapter();
-
-        foreach ($this->getProductTypeInstances() as $typeInstance) {
-            if (!$typeInstance->isComposite()) {
-                continue;
-            }
-            $relation = $typeInstance->getRelationInfo();
-            if ($relation
-                && $relation->getTable()
-                && $relation->getParentFieldName()
-                && $relation->getChildFieldName()
-            ) {
-                $columns    = $this->getFlatColumns();
-                $fieldList  = array_keys($columns);
-                unset($columns['entity_id']);
-                unset($columns['child_id']);
-                unset($columns['is_child']);
-
-                $select = $adapter->select()
-                    ->from(
-                        array('t' => $this->getTable($relation->getTable())),
-                        array($relation->getParentFieldName(), $relation->getChildFieldName(), new \Zend_Db_Expr('1')))
-                    ->join(
-                        array('e' => $this->getFlatTableName($storeId)),
-                        "e.entity_id = t.{$relation->getChildFieldName()}",
-                        array_keys($columns)
-                    );
-                if ($relation->getWhere() !== null) {
-                    $select->where($relation->getWhere());
-                }
-                if ($productIds !== null) {
-                    $cond = array(
-                        $adapter->quoteInto("{$relation->getChildFieldName()} IN(?)", $productIds),
-                        $adapter->quoteInto("{$relation->getParentFieldName()} IN(?)", $productIds)
-                    );
-
-                    $select->where(implode(' OR ', $cond));
-                }
-                $sql = $select->insertFromSelect($this->getFlatTableName($storeId), $fieldList);
-                $adapter->query($sql);
-            }
-        }
-
-        return $this;
-    }
-
-    /**
-     * Update children data from parent
-     *
-     * @param int $storeId
-     * @param int|array $productIds
-     * @return $this
-     */
-    public function updateChildrenDataFromParent($storeId, $productIds = null)
-    {
-        if (!$this->getFlatHelper()->isAddChildData() || !$this->_isFlatTableExists($storeId)) {
-            return $this;
-        }
-        $adapter = $this->_getWriteAdapter();
-
-        $select = $adapter->select();
-        foreach (array_keys($this->getFlatColumns()) as $columnName) {
-            if ($columnName == 'entity_id' || $columnName == 'child_id' || $columnName == 'is_child') {
-                continue;
-            }
-            $select->columns(array($columnName => new \Zend_Db_Expr('t1.' . $columnName)));
-        }
-        $select
-            ->joinLeft(
-                array('t1' => $this->getFlatTableName($storeId)),
-                $adapter->quoteInto('t2.child_id = t1.entity_id AND t1.is_child = ?', 0),
-                array())
-            ->where('t2.is_child = ?', 1);
-
-        if ($productIds !== null) {
-            $select->where('t2.child_id IN(?)', $productIds);
-        }
-
-        $sql = $select->crossUpdateFromSelect(array('t2' => $this->getFlatTableName($storeId)));
-        $adapter->query($sql);
-
-        return $this;
-    }
-
-    /**
-     * Clean unused relation products
-     *
-     * @param int $storeId
-     * @return $this
-     */
-    public function cleanRelationProducts($storeId)
-    {
-        if (!$this->getFlatHelper()->isAddChildData()) {
-            return $this;
-        }
-
-        foreach ($this->getProductTypeInstances() as $typeInstance) {
-            if (!$typeInstance->isComposite()) {
-                continue;
-            }
-            $adapter  = $this->_getWriteAdapter();
-            $relation = $typeInstance->getRelationInfo();
-            if ($relation
-                && $relation->getTable()
-                && $relation->getParentFieldName()
-                && $relation->getChildFieldName()
-            ) {
-                $select = $this->_getWriteAdapter()->select()
-                    ->distinct(true)
-                    ->from(
-                        $this->getTable($relation->getTable()),
-                        "{$relation->getParentFieldName()}"
-                    );
-                $joinLeftCond = array(
-                    "e.entity_id = t.{$relation->getParentFieldName()}",
-                    "e.child_id = t.{$relation->getChildFieldName()}"
-                );
-                if ($relation->getWhere() !== null) {
-                    $select->where($relation->getWhere());
-                    $joinLeftCond[] = $relation->getWhere();
-                }
-
-                $entitySelect = new \Zend_Db_Expr($select->__toString());
-
-                $select = $adapter->select()
-                    ->from(array('e' => $this->getFlatTableName($storeId)), null)
-                    ->joinLeft(
-                        array('t' => $this->getTable($relation->getTable())),
-                        implode(' AND ', $joinLeftCond),
-                        array())
-                    ->where('e.is_child = ?', 1)
-                    ->where('e.entity_id IN(?)', $entitySelect)
-                    ->where("t.{$relation->getChildFieldName()} IS NULL");
-
-                $sql = $select->deleteFromSelect('e');
-                $adapter->query($sql);
-            }
-        }
-
-        return $this;
-    }
-
-    /**
-     * Remove product data from flat
-     *
-     * @param int|array $productIds
-     * @param int $storeId
-     * @return $this
-     */
-    public function removeProduct($productIds, $storeId)
-    {
-        if (!$this->_isFlatTableExists($storeId)) {
-            return $this;
-        }
-        $adapter = $this->_getWriteAdapter();
-        $cond = array(
-            $adapter->quoteInto('entity_id IN(?)', $productIds)
-        );
-        if ($this->getFlatHelper()->isAddChildData()) {
-            $cond[] = $adapter->quoteInto('child_id IN(?)', $productIds);
-        }
-        $cond = implode(' OR ', $cond);
-        $adapter->delete($this->getFlatTableName($storeId), $cond);
-
-        return $this;
-    }
-
-    /**
-     * Remove children from parent product
-     *
-     * @param int|array $productIds
-     * @param int $storeId
-     * @return $this
-     */
-    public function removeProductChildren($productIds, $storeId)
-    {
-        if (!$this->getFlatHelper()->isAddChildData()) {
-            return $this;
-        }
-        $whereExpr = array(
-            'entity_id IN(?)' => $productIds,
-            'is_child = ?'    => 1
-        );
-        $this->_getWriteAdapter()->delete($this->getFlatTableName($storeId), $whereExpr);
-
-        return $this;
-    }
-
-    /**
-     * Update flat data for product
-     *
-     * @param int|array $productIds
-     * @param int $storeId
-     * @return $this
-     */
-    public function updateProduct($productIds, $storeId)
-    {
-        if (!$this->_isFlatTableExists($storeId)) {
-            return $this;
-        }
-
-        $this->saveProduct($productIds, $storeId);
-
-        $this->_eventManager->dispatch('catalog_product_flat_update_product', array(
-            'store_id'      => $storeId,
-            'table'         => $this->getFlatTableName($storeId),
-            'product_ids'   => $productIds
-        ));
-
-        return $this;
-    }
-
-    /**
-     * Save product(s) data for store
-     *
-     * @param int|array $productIds
-     * @param int $storeId
-     * @return $this
-     */
-    public function saveProduct($productIds, $storeId)
-    {
-        if (!$this->_isFlatTableExists($storeId)) {
-            return $this;
-        }
-
-        $this->updateStaticAttributes($storeId, $productIds);
-        $this->updateEavAttributes($storeId, $productIds);
-
-        return $this;
-    }
-
-    /**
-     * Delete flat table process
-     *
-     * @param int $storeId
-     * @return $this
-     */
-    public function deleteFlatTable($storeId)
-    {
-        if ($this->_isFlatTableExists($storeId)) {
-            $this->_getWriteAdapter()->dropTable($this->getFlatTableName($storeId));
-        }
-
-        return $this;
-    }
-
-    /**
-     * Check is flat table for store exists
-     *
-     * @param int $storeId
-     * @return bool
-     */
-    protected function _isFlatTableExists($storeId)
-    {
-        if (!isset($this->_existsFlatTables[$storeId])) {
-            $tableName     = $this->getFlatTableName($storeId);
-            $isTableExists = $this->_getWriteAdapter()->isTableExists($tableName);
-
-            $this->_existsFlatTables[$storeId] = $isTableExists ? true : false;
-        }
-
-        return $this->_existsFlatTables[$storeId];
-    }
-
-    /**
-     * Retrieve previous key from array by key
-     *
-     * @param array $array
-     * @param mixed $key
-     * @return mixed
-     */
-    protected function _arrayPrevKey(array $array, $key)
-    {
-        $prev = false;
-        foreach (array_keys($array) as $k) {
-            if ($k == $key) {
-                return $prev;
-            }
-            $prev = $k;
-        }
-        return false;
-    }
-
-    /**
-     * Retrieve next key from array by key
-     *
-     * @param array $array
-     * @param mixed $key
-     * @return mixed
-     */
-    protected function _arrayNextKey(array $array, $key)
-    {
-        $next = false;
-        foreach (array_keys($array) as $k) {
-            if ($next === true) {
-                return $k;
-            }
-            if ($k == $key) {
-                $next = true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Transactional rebuild Catalog Product Flat Data
-     *
-     * @return $this
-     * @throws \Exception
-     */
-    public function reindexAll()
-    {
-        foreach ($this->_storeManager->getStores() as $storeId => $store) {
-            $this->prepareFlatTable($storeId);
-            $this->beginTransaction();
-            try {
-                $this->rebuild($store);
-                $this->commit();
-           } catch (\Exception $e) {
-                $this->rollBack();
-                throw $e;
-           }
-        }
-
-        return $this;
-    }
-}
diff --git a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/Decimal.php b/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/Decimal.php
index 3dd27d218ff..8faa30e2794 100644
--- a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/Decimal.php
+++ b/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/Decimal.php
@@ -85,7 +85,7 @@ class Decimal extends AbstractEav
             ->where('pdd.attribute_id IN(?)', $attrIds)
             ->where("{$productValueExpression} IS NOT NULL");
 
-        $statusCond = $write->quoteInto('=?', \Magento\Catalog\Model\Product\Status::STATUS_ENABLED);
+        $statusCond = $write->quoteInto('=?', \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED);
         $this->_addAttributeToSelect($select, 'status', 'pdd.entity_id', 'cs.store_id', $statusCond);
 
         if (!is_null($entityIds)) {
diff --git a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/Source.php b/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/Source.php
index 83b22ca216c..8796b041e7c 100644
--- a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/Source.php
+++ b/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Eav/Source.php
@@ -25,6 +25,8 @@
  */
 namespace Magento\Catalog\Model\Resource\Product\Indexer\Eav;
 
+use \Magento\Catalog\Model\Product\Attribute\Source\Status as ProductStatus;
+
 /**
  * Catalog Product Eav Select and Multiply Select Attributes Indexer resource model
  *
@@ -32,7 +34,8 @@ namespace Magento\Catalog\Model\Resource\Product\Indexer\Eav;
  * @package     Magento_Catalog
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-class Source extends AbstractEav
+class Source
+    extends AbstractEav
 {
     /**
      * Catalog resource helper
@@ -240,7 +243,7 @@ class Source extends AbstractEav
             ->where('cs.store_id!=?', \Magento\Core\Model\Store::DEFAULT_STORE_ID)
             ->where('pvd.attribute_id IN(?)', $attrIds);
 
-        $statusCond = $adapter->quoteInto('=?', \Magento\Catalog\Model\Product\Status::STATUS_ENABLED);
+        $statusCond = $adapter->quoteInto('=?', ProductStatus::STATUS_ENABLED);
         $this->_addAttributeToSelect($select, 'status', 'pvd.entity_id', 'cs.store_id', $statusCond);
 
         if (!is_null($entityIds)) {
diff --git a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Price/DefaultPrice.php b/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Price/DefaultPrice.php
index a9507fd30d9..bf11a6e5b9f 100644
--- a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Price/DefaultPrice.php
+++ b/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Price/DefaultPrice.php
@@ -262,7 +262,7 @@ class DefaultPrice
             ->where('e.type_id = ?', $this->getTypeId());
 
         // add enable products limitation
-        $statusCond = $write->quoteInto('=?', \Magento\Catalog\Model\Product\Status::STATUS_ENABLED);
+        $statusCond = $write->quoteInto('=?', \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED);
         $this->_addAttributeToSelect($select, 'status', 'e.entity_id', 'cs.store_id', $statusCond, true);
         if ($this->_coreData->isModuleEnabled('Magento_Tax')) {
             $taxClassId = $this->_addAttributeToSelect($select, 'tax_class_id', 'e.entity_id', 'cs.store_id');
diff --git a/app/code/Magento/Catalog/Model/Resource/Product/Status.php b/app/code/Magento/Catalog/Model/Resource/Product/Status.php
deleted file mode 100644
index c2a8a4855a2..00000000000
--- a/app/code/Magento/Catalog/Model/Resource/Product/Status.php
+++ /dev/null
@@ -1,251 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Catalog
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-namespace Magento\Catalog\Model\Resource\Product;
-
-use Magento\Core\Model\Config\Element;
-
-/**
- * Catalog product website resource model
- *
- * @category    Magento
- * @package     Magento_Catalog
- * @author      Magento Core Team <core@magentocommerce.com>
- */
-class Status extends \Magento\Core\Model\Resource\Db\AbstractDb
-{
-    /**
-     * Product atrribute cache
-     *
-     * @var array
-     */
-    protected $_productAttributes  = array();
-
-    /**
-     * Catalog product
-     *
-     * @var \Magento\Catalog\Model\Product
-     */
-    protected $_catalogProduct;
-
-    /**
-     * Store manager
-     *
-     * @var \Magento\Core\Model\StoreManagerInterface
-     */
-    protected $_storeManager;
-
-    /**
-     * Catalog product1
-     *
-     * @var \Magento\Catalog\Model\Resource\Product
-     */
-    protected $_productResource;
-
-    /**
-     * @param \Magento\App\Resource $resource
-     * @param \Magento\Catalog\Model\Resource\Product $productResource
-     * @param \Magento\Core\Model\StoreManagerInterface $storeManager
-     * @param \Magento\Catalog\Model\Product $catalogProduct
-     */
-    public function __construct(
-        \Magento\App\Resource $resource,
-        \Magento\Catalog\Model\Resource\Product $productResource,
-        \Magento\Core\Model\StoreManagerInterface $storeManager,
-        \Magento\Catalog\Model\Product $catalogProduct
-    ) {
-        $this->_productResource = $productResource;
-        $this->_storeManager = $storeManager;
-        $this->_catalogProduct = $catalogProduct;
-        parent::__construct($resource);
-    }
-
-    /**
-     * Initialize connection
-     *
-     * @return void
-     */
-    protected function _construct()
-    {
-        $this->_init('catalog_product_enabled_index', 'product_id');
-    }
-
-    /**
-     * Retrieve product attribute (public method for status model)
-     *
-     * @param string $attributeCode
-     * @return \Magento\Catalog\Model\Resource\Eav\Attribute
-     */
-    public function getProductAttribute($attributeCode)
-    {
-        return $this->_getProductAttribute($attributeCode);
-    }
-
-    /**
-     * Retrieve product attribute
-     *
-     * @param string|integer|Element $attribute
-     * @return \Magento\Eav\Model\Entity\Attribute\AbstractAttribute
-     */
-    protected function _getProductAttribute($attribute)
-    {
-        if (empty($this->_productAttributes[$attribute])) {
-            $this->_productAttributes[$attribute] = $this->_catalogProduct->getResource()->getAttribute($attribute);
-        }
-        return $this->_productAttributes[$attribute];
-    }
-
-    /**
-     * Refresh enabled index cache
-     *
-     * @param int $productId
-     * @param int $storeId
-     * @return $this
-     */
-    public function refreshEnabledIndex($productId, $storeId)
-    {
-        if ($storeId == \Magento\Core\Model\Store::DEFAULT_STORE_ID) {
-            foreach ($this->_storeManager->getStores() as $store) {
-                $this->refreshEnabledIndex($productId, $store->getId());
-            }
-
-            return $this;
-        }
-
-        $this->_productResource->refreshEnabledIndex($storeId, $productId);
-
-        return $this;
-    }
-
-    /**
-     * Update product status for store
-     *
-     * @param int $productId
-     * @param int $storeId
-     * @param int $value
-     * @return $this
-     */
-    public function updateProductStatus($productId, $storeId, $value)
-    {
-        $statusAttributeId  = $this->_getProductAttribute('status')->getId();
-        $statusEntityTypeId = $this->_getProductAttribute('status')->getEntityTypeId();
-        $statusTable        = $this->_getProductAttribute('status')->getBackend()->getTable();
-        $refreshIndex       = true;
-        $adapter            = $this->_getWriteAdapter();
-
-        $data = new \Magento\Object(array(
-            'entity_type_id' => $statusEntityTypeId,
-            'attribute_id'   => $statusAttributeId,
-            'store_id'       => $storeId,
-            'entity_id'      => $productId,
-            'value'          => $value
-        ));
-
-        $data = $this->_prepareDataForTable($data, $statusTable);
-
-        $select = $adapter->select()
-            ->from($statusTable)
-            ->where('attribute_id = :attribute_id')
-            ->where('store_id     = :store_id')
-            ->where('entity_id    = :product_id');
-
-        $row = $adapter->fetchRow($select);
-
-        if ($row) {
-            if ($row['value'] == $value) {
-                $refreshIndex = false;
-            } else {
-                $condition = array('value_id = ?' => $row['value_id']);
-                $adapter->update($statusTable, $data, $condition);
-            }
-        } else {
-            $adapter->insert($statusTable, $data);
-        }
-
-        if ($refreshIndex) {
-            $this->refreshEnabledIndex($productId, $storeId);
-        }
-
-        return $this;
-    }
-
-    /**
-     * Retrieve Product(s) status for store
-     * Return array where key is a product_id, value - status
-     *
-     * @param array|int $productIds
-     * @param int $storeId
-     * @return array
-     */
-    public function getProductStatus($productIds, $storeId = null)
-    {
-        $statuses = array();
-
-        $attribute      = $this->_getProductAttribute('status');
-        $attributeTable = $attribute->getBackend()->getTable();
-        $adapter        = $this->_getReadAdapter();
-
-        if (!is_array($productIds)) {
-            $productIds = array($productIds);
-        }
-
-        if ($storeId === null || $storeId == \Magento\Core\Model\Store::DEFAULT_STORE_ID) {
-            $select = $adapter->select()
-                ->from($attributeTable, array('entity_id', 'value'))
-                ->where('entity_id IN (?)', $productIds)
-                ->where('attribute_id = ?', $attribute->getAttributeId())
-                ->where('store_id = ?', \Magento\Core\Model\Store::DEFAULT_STORE_ID);
-
-            $rows = $adapter->fetchPairs($select);
-        } else {
-            $valueCheckSql = $adapter->getCheckSql('t2.value_id > 0', 't2.value', 't1.value');
-
-            $select = $adapter->select()
-                ->from(
-                    array('t1' => $attributeTable),
-                    array('value' => $valueCheckSql))
-                ->joinLeft(
-                    array('t2' => $attributeTable),
-                    't1.entity_id = t2.entity_id AND t1.attribute_id = t2.attribute_id AND t2.store_id = '
-                        . (int)$storeId,
-                    array('t1.entity_id')
-                )
-                ->where('t1.store_id = ?', \Magento\Core\Model\Store::DEFAULT_STORE_ID)
-                ->where('t1.attribute_id = ?', $attribute->getAttributeId())
-                ->where('t1.entity_id IN(?)', $productIds);
-            $rows = $adapter->fetchPairs($select);
-        }
-
-        foreach ($productIds as $productId) {
-            if (isset($rows[$productId])) {
-                $statuses[$productId] = $rows[$productId];
-            } else {
-                $statuses[$productId] = -1;
-            }
-        }
-
-        return $statuses;
-    }
-}
diff --git a/app/code/Magento/Catalog/Model/Resource/Product/Website.php b/app/code/Magento/Catalog/Model/Resource/Product/Website.php
index e4438e63cfa..38ccf7723fc 100644
--- a/app/code/Magento/Catalog/Model/Resource/Product/Website.php
+++ b/app/code/Magento/Catalog/Model/Resource/Product/Website.php
@@ -18,8 +18,6 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Catalog
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
@@ -27,10 +25,6 @@ namespace Magento\Catalog\Model\Resource\Product;
 
 /**
  * Catalog Product Website Resource Model
- *
- * @category    Magento
- * @package     Magento_Catalog
- * @author      Magento Core Team <core@magentocommerce.com>
  */
 class Website extends \Magento\Core\Model\Resource\Db\AbstractDb
 {
@@ -41,24 +35,14 @@ class Website extends \Magento\Core\Model\Resource\Db\AbstractDb
      */
     protected $_storeManager;
 
-    /**
-     * Catalog product
-     *
-     * @var \Magento\Catalog\Model\Resource\Product
-     */
-    protected $_productResource;
-
     /**
      * @param \Magento\App\Resource $resource
-     * @param \Magento\Catalog\Model\Resource\Product $productResource
      * @param \Magento\Core\Model\StoreManagerInterface $storeManager
      */
     public function __construct(
         \Magento\App\Resource $resource,
-        \Magento\Catalog\Model\Resource\Product $productResource,
         \Magento\Core\Model\StoreManagerInterface $storeManager
     ) {
-        $this->_productResource = $productResource;
         $this->_storeManager = $storeManager;
         parent::__construct($resource);
     }
@@ -83,9 +67,10 @@ class Website extends \Magento\Core\Model\Resource\Db\AbstractDb
      */
     public function removeProducts($websiteIds, $productIds)
     {
-        if (!is_array($websiteIds) || !is_array($productIds)
-            || count($websiteIds) == 0 || count($productIds) == 0)
-        {
+        if (!is_array($websiteIds)
+            || !is_array($productIds)
+            || count($websiteIds) == 0
+            || count($productIds) == 0) {
             return $this;
         }
 
@@ -118,9 +103,10 @@ class Website extends \Magento\Core\Model\Resource\Db\AbstractDb
      */
     public function addProducts($websiteIds, $productIds)
     {
-        if (!is_array($websiteIds) || !is_array($productIds)
-            || count($websiteIds) == 0 || count($productIds) == 0)
-        {
+        if (!is_array($websiteIds)
+            || !is_array($productIds)
+            || count($websiteIds) == 0
+            || count($productIds) == 0) {
             return $this;
         }
 
@@ -139,15 +125,7 @@ class Website extends \Magento\Core\Model\Resource\Db\AbstractDb
                         'website_id' => (int) $websiteId
                     ));
                 }
-
-                // Refresh product enabled index
-                $storeIds = $this->_storeManager->getWebsite($websiteId)->getStoreIds();
-                foreach ($storeIds as $storeId) {
-                    $store = $this->_storeManager->getStore($storeId);
-                    $this->_productResource->refreshEnabledIndex($store, $productIds);
-                }
             }
-
             $this->_getWriteAdapter()->commit();
         } catch (\Exception $e) {
             $this->_getWriteAdapter()->rollBack();
diff --git a/app/code/Magento/Catalog/Model/Resource/Setup.php b/app/code/Magento/Catalog/Model/Resource/Setup.php
index 44c09334c1f..06728b86f52 100755
--- a/app/code/Magento/Catalog/Model/Resource/Setup.php
+++ b/app/code/Magento/Catalog/Model/Resource/Setup.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Catalog entity setup
+ *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -18,20 +20,11 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Catalog
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 namespace Magento\Catalog\Model\Resource;
 
-/**
- * Catalog entity setup
- *
- * @category    Magento
- * @package     Magento_Catalog
- * @author      Magento Core Team <core@magentocommerce.com>
- */
 class Setup extends \Magento\Eav\Model\Entity\Setup
 {
     /**
@@ -56,18 +49,18 @@ class Setup extends \Magento\Eav\Model\Entity\Setup
     protected $_eavAttributeResourceFactory;
 
     /**
-     * @param \Magento\Core\Model\Resource\Setup\Context $context
-     * @param string $resourceName
+     * @param \Magento\Eav\Model\Entity\Setup\Context $context
+     * @param $resourceName
      * @param \Magento\App\CacheInterface $cache
      * @param \Magento\Eav\Model\Resource\Entity\Attribute\Group\CollectionFactory $attrGroupCollectionFactory
      * @param \Magento\Catalog\Model\CategoryFactory $categoryFactory
      * @param \Magento\Index\Model\IndexerFactory $indexerFactory
-     * @param \Magento\Catalog\Model\Resource\Eav\AttributeFactory $eavAttributeResourceFactory
+     * @param Eav\AttributeFactory $eavAttributeResourceFactory
      * @param string $moduleName
      * @param string $connectionName
      */
     public function __construct(
-        \Magento\Core\Model\Resource\Setup\Context $context,
+        \Magento\Eav\Model\Entity\Setup\Context $context,
         $resourceName,
         \Magento\App\CacheInterface $cache,
         \Magento\Eav\Model\Resource\Entity\Attribute\Group\CollectionFactory $attrGroupCollectionFactory,
@@ -80,7 +73,9 @@ class Setup extends \Magento\Eav\Model\Entity\Setup
         $this->_categoryFactory = $categoryFactory;
         $this->_indexerFactory = $indexerFactory;
         $this->_eavAttributeResourceFactory = $eavAttributeResourceFactory;
-        parent::__construct($context, $resourceName, $cache, $attrGroupCollectionFactory, $moduleName, $connectionName);
+        parent::__construct(
+            $context, $resourceName, $cache, $attrGroupCollectionFactory, $moduleName, $connectionName
+        );
     }
 
     /**
@@ -116,41 +111,6 @@ class Setup extends \Magento\Eav\Model\Entity\Setup
         return $this->_eavAttributeResourceFactory->create($data);
     }
 
-    /**
-     * Prepare catalog attribute values to save
-     *
-     * @param array $attr
-     * @return array
-     */
-    protected function _prepareValues($attr)
-    {
-        $data = parent::_prepareValues($attr);
-        $data = array_merge($data, array(
-            'frontend_input_renderer'       => $this->_getValue($attr, 'input_renderer'),
-            'is_global'                     => $this->_getValue(
-                $attr,
-                'global',
-                \Magento\Catalog\Model\Resource\Eav\Attribute::SCOPE_GLOBAL
-            ),
-            'is_visible'                    => $this->_getValue($attr, 'visible', 1),
-            'is_searchable'                 => $this->_getValue($attr, 'searchable', 0),
-            'is_filterable'                 => $this->_getValue($attr, 'filterable', 0),
-            'is_comparable'                 => $this->_getValue($attr, 'comparable', 0),
-            'is_visible_on_front'           => $this->_getValue($attr, 'visible_on_front', 0),
-            'is_wysiwyg_enabled'            => $this->_getValue($attr, 'wysiwyg_enabled', 0),
-            'is_html_allowed_on_front'      => $this->_getValue($attr, 'is_html_allowed_on_front', 0),
-            'is_visible_in_advanced_search' => $this->_getValue($attr, 'visible_in_advanced_search', 0),
-            'is_filterable_in_search'       => $this->_getValue($attr, 'filterable_in_search', 0),
-            'used_in_product_listing'       => $this->_getValue($attr, 'used_in_product_listing', 0),
-            'used_for_sort_by'              => $this->_getValue($attr, 'used_for_sort_by', 0),
-            'apply_to'                      => $this->_getValue($attr, 'apply_to'),
-            'position'                      => $this->_getValue($attr, 'position', 0),
-            'is_configurable'               => $this->_getValue($attr, 'is_configurable', 1),
-            'is_used_for_promo_rules'       => $this->_getValue($attr, 'used_for_promo_rules', 0)
-        ));
-        return $data;
-    }
-
     /**
      * Default entites and attributes
      *
@@ -514,7 +474,7 @@ class Setup extends \Magento\Eav\Model\Entity\Setup
                         'visible_in_advanced_search' => true,
                         'used_in_product_listing'    => true,
                         'used_for_sort_by'           => true,
-                        'apply_to'                   => 'simple,configurable,virtual',
+                        'apply_to'                   => 'simple,virtual',
                         'group'                      => 'Prices',
                     ),
                     'special_price'      => array(
@@ -526,7 +486,7 @@ class Setup extends \Magento\Eav\Model\Entity\Setup
                         'sort_order'                 => 2,
                         'global'                     => \Magento\Catalog\Model\Resource\Eav\Attribute::SCOPE_WEBSITE,
                         'used_in_product_listing'    => true,
-                        'apply_to'                   => 'simple,configurable,virtual',
+                        'apply_to'                   => 'simple,virtual',
                         'group'                      => 'Prices',
                     ),
                     'special_from_date'  => array(
@@ -538,7 +498,7 @@ class Setup extends \Magento\Eav\Model\Entity\Setup
                         'sort_order'                 => 3,
                         'global'                     => \Magento\Catalog\Model\Resource\Eav\Attribute::SCOPE_WEBSITE,
                         'used_in_product_listing'    => true,
-                        'apply_to'                   => 'simple,configurable,virtual',
+                        'apply_to'                   => 'simple,virtual',
                         'group'                      => 'Prices',
                     ),
                     'special_to_date'    => array(
@@ -550,7 +510,7 @@ class Setup extends \Magento\Eav\Model\Entity\Setup
                         'sort_order'                 => 4,
                         'global'                     => \Magento\Catalog\Model\Resource\Eav\Attribute::SCOPE_WEBSITE,
                         'used_in_product_listing'    => true,
-                        'apply_to'                   => 'simple,configurable,virtual',
+                        'apply_to'                   => 'simple,virtual',
                         'group'                      => 'Prices',
                     ),
                     'cost'               => array(
@@ -668,7 +628,7 @@ class Setup extends \Magento\Eav\Model\Entity\Setup
                         'required'                   => false,
                         'sort_order'                 => 6,
                         'global'                     => \Magento\Catalog\Model\Resource\Eav\Attribute::SCOPE_WEBSITE,
-                        'apply_to'                   => 'simple,configurable,virtual',
+                        'apply_to'                   => 'simple,virtual',
                         'group'                      => 'Prices',
                     ),
                     'tier_price'         => array(
@@ -679,7 +639,7 @@ class Setup extends \Magento\Eav\Model\Entity\Setup
                         'required'                   => false,
                         'sort_order'                 => 6,
                         'global'                     => \Magento\Catalog\Model\Resource\Eav\Attribute::SCOPE_WEBSITE,
-                        'apply_to'                   => 'simple,configurable,virtual',
+                        'apply_to'                   => 'simple,virtual',
                         'group'                      => 'Prices',
                     ),
                     'color'              => array(
@@ -726,7 +686,7 @@ class Setup extends \Magento\Eav\Model\Entity\Setup
                         'type'                       => 'int',
                         'label'                      => 'Status',
                         'input'                      => 'select',
-                        'source'                     => 'Magento\Catalog\Model\Product\Status',
+                        'source'                     => 'Magento\Catalog\Model\Product\Attribute\Source\Status',
                         'sort_order'                 => 9,
                         'global'                     => \Magento\Catalog\Model\Resource\Eav\Attribute::SCOPE_WEBSITE,
                         'searchable'                 => true,
@@ -757,7 +717,7 @@ class Setup extends \Magento\Eav\Model\Entity\Setup
                         'sort_order'                 => 7,
                         'global'                     => \Magento\Catalog\Model\Resource\Eav\Attribute::SCOPE_STORE,
                         'visible'                    => false,
-                        'apply_to'                   => 'simple,configurable,virtual',
+                        'apply_to'                   => 'simple,virtual',
                         'group'                      => 'Prices',
                     ),
                     'is_recurring'       => array(
@@ -770,7 +730,6 @@ class Setup extends \Magento\Eav\Model\Entity\Setup
                             'Products with recurring profile participate in catalog as nominal items.',
                         'sort_order'                 => 1,
                         'apply_to'                   => 'simple,virtual',
-                        'is_configurable'            => false,
                         'group'                      => 'Recurring Profile',
                     ),
                     'recurring_profile'  => array(
@@ -781,7 +740,6 @@ class Setup extends \Magento\Eav\Model\Entity\Setup
                         'required'                   => false,
                         'sort_order'                 => 2,
                         'apply_to'                   => 'simple,virtual',
-                        'is_configurable'            => false,
                         'group'                      => 'Recurring Profile',
                     ),
                     'visibility'         => array(
@@ -886,7 +844,6 @@ class Setup extends \Magento\Eav\Model\Entity\Setup
                         'global'                     => \Magento\Catalog\Model\Resource\Eav\Attribute::SCOPE_STORE,
                         'visible'                    => false,
                         'used_in_product_listing'    => true,
-                        'is_configurable'            => false,
                     ),
                     'small_image_label'  => array(
                         'type'                       => 'varchar',
@@ -897,7 +854,6 @@ class Setup extends \Magento\Eav\Model\Entity\Setup
                         'global'                     => \Magento\Catalog\Model\Resource\Eav\Attribute::SCOPE_STORE,
                         'visible'                    => false,
                         'used_in_product_listing'    => true,
-                        'is_configurable'            => false,
                     ),
                     'thumbnail_label'    => array(
                         'type'                       => 'varchar',
@@ -908,7 +864,6 @@ class Setup extends \Magento\Eav\Model\Entity\Setup
                         'global'                     => \Magento\Catalog\Model\Resource\Eav\Attribute::SCOPE_STORE,
                         'visible'                    => false,
                         'used_in_product_listing'    => true,
-                        'is_configurable'            => false,
                     ),
                     'created_at'         => array(
                         'type'                       => 'static',
diff --git a/app/code/Magento/Catalog/Model/Resource/Setup/PropertyMapper.php b/app/code/Magento/Catalog/Model/Resource/Setup/PropertyMapper.php
new file mode 100644
index 00000000000..e856421fcfe
--- /dev/null
+++ b/app/code/Magento/Catalog/Model/Resource/Setup/PropertyMapper.php
@@ -0,0 +1,64 @@
+<?php
+/**
+ * Catalog attribute property mapper
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Catalog\Model\Resource\Setup;
+
+use Magento\Eav\Model\Entity\Setup\PropertyMapperAbstract;
+
+class PropertyMapper extends PropertyMapperAbstract
+{
+    /**
+     * Map input attribute properties to storage representation
+     *
+     * @param array $input
+     * @param int $entityTypeId
+     * @return array
+     */
+    public function map(array $input, $entityTypeId)
+    {
+        return array(
+            'frontend_input_renderer'       => $this->_getValue($input, 'input_renderer'),
+            'is_global'                     => $this->_getValue(
+                    $input,
+                    'global',
+                    \Magento\Catalog\Model\Resource\Eav\Attribute::SCOPE_GLOBAL
+                ),
+            'is_visible'                    => $this->_getValue($input, 'visible', 1),
+            'is_searchable'                 => $this->_getValue($input, 'searchable', 0),
+            'is_filterable'                 => $this->_getValue($input, 'filterable', 0),
+            'is_comparable'                 => $this->_getValue($input, 'comparable', 0),
+            'is_visible_on_front'           => $this->_getValue($input, 'visible_on_front', 0),
+            'is_wysiwyg_enabled'            => $this->_getValue($input, 'wysiwyg_enabled', 0),
+            'is_html_allowed_on_front'      => $this->_getValue($input, 'is_html_allowed_on_front', 0),
+            'is_visible_in_advanced_search' => $this->_getValue($input, 'visible_in_advanced_search', 0),
+            'is_filterable_in_search'       => $this->_getValue($input, 'filterable_in_search', 0),
+            'used_in_product_listing'       => $this->_getValue($input, 'used_in_product_listing', 0),
+            'used_for_sort_by'              => $this->_getValue($input, 'used_for_sort_by', 0),
+            'apply_to'                      => $this->_getValue($input, 'apply_to'),
+            'position'                      => $this->_getValue($input, 'position', 0),
+            'is_used_for_promo_rules'       => $this->_getValue($input, 'used_for_promo_rules', 0)
+        );
+    }
+} 
diff --git a/app/code/Magento/Catalog/data/catalog_setup/data-upgrade-1.6.0.0.19-1.6.0.0.20.php b/app/code/Magento/Catalog/data/catalog_setup/data-upgrade-1.6.0.0.19-1.6.0.0.20.php
index 903c8a02d3c..7bc795e473a 100644
--- a/app/code/Magento/Catalog/data/catalog_setup/data-upgrade-1.6.0.0.19-1.6.0.0.20.php
+++ b/app/code/Magento/Catalog/data/catalog_setup/data-upgrade-1.6.0.0.19-1.6.0.0.20.php
@@ -27,7 +27,7 @@
 /** @var $this \Magento\Catalog\Model\Resource\Setup */
 $applyTo = array_merge(
     explode(',', $this->getAttribute(\Magento\Catalog\Model\Product::ENTITY, 'weight', 'apply_to')),
-    array(\Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL, \Magento\Catalog\Model\Product\Type::TYPE_CONFIGURABLE)
+    array(\Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL)
 );
 
 $this->updateAttribute(
diff --git a/app/code/Magento/Catalog/etc/adminhtml/di.xml b/app/code/Magento/Catalog/etc/adminhtml/di.xml
index 7261a5fdcd0..52a5d0e53e2 100644
--- a/app/code/Magento/Catalog/etc/adminhtml/di.xml
+++ b/app/code/Magento/Catalog/etc/adminhtml/di.xml
@@ -23,67 +23,57 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <preference for="Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper\HandlerInterface" type="Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper\Plugin\Handler\Composite" />
     <type name="Magento\Catalog\Controller\Adminhtml\Product\Attribute">
-        <param name="attributeLabelCache">
-            <instance type="Magento\App\Cache\Type\Translate" />
-        </param>
+        <arguments>
+            <argument name="attributeLabelCache" xsi:type="object">Magento\App\Cache\Type\Translate</argument>
+        </arguments>
     </type>
     <type name="Magento\Catalog\Model\Session">
-        <param name="sessionName">
-            <value>adminhtml</value>
-        </param>
+        <arguments>
+            <argument name="sessionName" xsi:type="string">adminhtml</argument>
+        </arguments>
     </type>
     <type name="Magento\Catalog\Block\Adminhtml\Product\Frontend\Product\Watermark">
-        <param name="imageTypes">
-            <array>
-                <item key="small">
-                    <array>
-                        <item key="title"><value>Small</value></item>
-                        <item key="attribute"><value>small_image</value></item>
-                    </array>
+        <arguments>
+            <argument name="imageTypes" xsi:type="array">
+                <item name="small" xsi:type="array">
+                    <item name="title" xsi:type="string">Small</item>
+                    <item name="attribute" xsi:type="string">small_image</item>
                 </item>
-                <item key="main">
-                    <array>
-                        <item key="title"><value>Main</value></item>
-                        <item key="attribute"><value>image</value></item>
-                    </array>
+                <item name="main" xsi:type="array">
+                    <item name="title" xsi:type="string">Main</item>
+                    <item name="attribute" xsi:type="string">image</item>
                 </item>
-                <item key="cart">
-                    <array>
-                        <item key="title"><value>Thumbnail</value></item>
-                        <item key="attribute"><value>thumbnail</value></item>
-                    </array>
+                <item name="cart" xsi:type="array">
+                    <item name="title" xsi:type="string">Thumbnail</item>
+                    <item name="attribute" xsi:type="string">thumbnail</item>
                 </item>
-                <item key="custom">
-                    <array>
-                        <item key="title"><value>Custom image</value></item>
-                        <item key="attribute"><value>custom_image</value></item>
-                    </array>
+                <item name="custom" xsi:type="array">
+                    <item name="title" xsi:type="string">Custom image</item>
+                    <item name="attribute" xsi:type="string">custom_image</item>
                 </item>
-            </array>
-        </param>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Catalog\Helper\Flat\AbstractFlat">
-        <param name="isAvailable">
-            <value type="bool">false</value>
-        </param>
-    </type>
-    <type name="Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper">
-        <plugin name="configurable" type="Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper\Plugin\Configurable" sortOrder="50" />
+        <arguments>
+            <argument name="isAvailable" xsi:type="boolean">false</argument>
+        </arguments>
     </type>
     <type name="Magento\Catalog\Model\Product\CopyConstructor\Composite">
-        <param name="constructors">
-            <array>
-                <item key="crossSell"><value>Magento\Catalog\Model\Product\CopyConstructor\CrossSell</value></item>
-                <item key="upSell"><value>Magento\Catalog\Model\Product\CopyConstructor\UpSell</value></item>
-                <item key="related"><value>Magento\Catalog\Model\Product\CopyConstructor\Related</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="constructors" xsi:type="array">
+                <item name="crossSell" xsi:type="string">Magento\Catalog\Model\Product\CopyConstructor\CrossSell</item>
+                <item name="upSell" xsi:type="string">Magento\Catalog\Model\Product\CopyConstructor\UpSell</item>
+                <item name="related" xsi:type="string">Magento\Catalog\Model\Product\CopyConstructor\Related</item>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Catalog\Model\Product\Copier">
-        <param name="copyConstructor">
-            <instance type="Magento\Catalog\Model\Product\CopyConstructor\Composite" />
-        </param>
+        <arguments>
+            <argument name="copyConstructor" xsi:type="object">Magento\Catalog\Model\Product\CopyConstructor\Composite</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Catalog/etc/adminhtml/system.xml b/app/code/Magento/Catalog/etc/adminhtml/system.xml
index 474044fe5d5..21124229764 100644
--- a/app/code/Magento/Catalog/etc/adminhtml/system.xml
+++ b/app/code/Magento/Catalog/etc/adminhtml/system.xml
@@ -87,8 +87,7 @@
                 </field>
                 <field id="flat_catalog_product" translate="label" type="select" sortOrder="100" showInDefault="1" showInWebsite="0" showInStore="0">
                     <label>Use Flat Catalog Product</label>
-                    <frontend_model>Magento\Catalog\Block\Adminhtml\System\Config\Form\Field\Select\Flatproduct</frontend_model>
-                    <backend_model>Magento\Catalog\Model\System\Config\Backend\Catalog\Product\Flat</backend_model>
+                    <backend_model>Magento\Catalog\Model\Indexer\Product\Flat\System\Config\Mode</backend_model>
                     <source_model>Magento\Backend\Model\Config\Source\Yesno</source_model>
                 </field>
                 <field id="default_sort_by" translate="label comment" type="select" sortOrder="6" showInDefault="1" showInWebsite="1" showInStore="1">
diff --git a/app/code/Magento/Catalog/etc/config.xml b/app/code/Magento/Catalog/etc/config.xml
index c52812cb5f3..15782333d17 100644
--- a/app/code/Magento/Catalog/etc/config.xml
+++ b/app/code/Magento/Catalog/etc/config.xml
@@ -48,6 +48,9 @@
                 <parse_url_directives>1</parse_url_directives>
             </frontend>
             <product>
+                <flat>
+                    <max_index_count>64</max_index_count>
+                </flat>
                 <default_tax_group>2</default_tax_group>
             </product>
             <seo>
diff --git a/app/code/Magento/Catalog/etc/crontab.xml b/app/code/Magento/Catalog/etc/crontab.xml
index 8bfea016cde..41685092c92 100644
--- a/app/code/Magento/Catalog/etc/crontab.xml
+++ b/app/code/Magento/Catalog/etc/crontab.xml
@@ -28,5 +28,8 @@
         <job name="catalog_product_index_price_reindex_all" instance="Magento\Catalog\Model\Observer" method="reindexProductPrices">
             <schedule>0 2 * * *</schedule>
         </job>
+        <job name="catalog_product_flat_indexer_store_cleanup" instance="Magento\Catalog\Helper\Product\Flat\Indexer" method="deleteAbandonedStoreFlatTables">
+            <schedule>0 0 * * *</schedule>
+        </job>
     </group>
 </config>
diff --git a/app/code/Magento/Catalog/etc/di.xml b/app/code/Magento/Catalog/etc/di.xml
index 6f085173874..21c19a51f6d 100644
--- a/app/code/Magento/Catalog/etc/di.xml
+++ b/app/code/Magento/Catalog/etc/di.xml
@@ -23,163 +23,200 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <preference for="Magento\Catalog\Model\ProductTypes\ConfigInterface" type="Magento\Catalog\Model\ProductTypes\Config" />
     <preference for="Magento\Catalog\Model\ProductOptions\ConfigInterface" type="Magento\Catalog\Model\ProductOptions\Config" />
+    <preference for="Magento\Catalog\Model\Product\PriceModifierInterface" type="Magento\Catalog\Model\Product\PriceModifier\Composite" />
+    <preference for="Magento\Catalog\Model\Attribute\LockValidatorInterface" type="Magento\Catalog\Model\Attribute\LockValidatorComposite" />
+    <preference for="Magento\Catalog\Model\Entity\Product\Attribute\Group\AttributeMapperInterface" type="Magento\Catalog\Model\Entity\Product\Attribute\Group\AttributeMapper" />
     <type name="Magento\Log\Model\Resource\Log">
         <plugin name="catalogLog" type="Magento\Catalog\Model\Plugin\Log" />
     </type>
+    <type name="Magento\Indexer\Model\Indexer\State">
+        <plugin name="setStatusForIndexer" type="Magento\Catalog\Model\Indexer\Category\Product\Plugin\IndexerState" />
+    </type>
+    <type name="Magento\Mview\View\StateInterface">
+        <plugin name="setStatusForMview" type="Magento\Catalog\Model\Indexer\Category\Product\Plugin\MviewState" />
+    </type>
+    <type name="Magento\Catalog\Model\Indexer\Category\Product\Plugin\IndexerState">
+        <arguments>
+            <argument name="state" xsi:type="object" shared="false">Magento\Indexer\Model\Indexer\State</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Catalog\Model\Indexer\Category\Product\Plugin\MviewState">
+        <arguments>
+            <argument name="state" xsi:type="object" shared="false">Magento\Mview\View\StateInterface</argument>
+            <argument name="changelog" xsi:type="object" shared="false">Magento\Mview\View\ChangelogInterface</argument>
+        </arguments>
+    </type>
     <type name="Magento\Catalog\Helper\Product">
-        <param name="typeSwitcherLabel">
-            <value>Virtual</value>
-        </param>
-        <param name="catalogSession">
-            <instance type="Magento\Catalog\Model\Session\Proxy" />
-        </param>
+        <arguments>
+            <argument name="typeSwitcherLabel" xsi:type="string">Virtual</argument>
+            <argument name="catalogSession" xsi:type="object">Magento\Catalog\Model\Session\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Catalog\Model\Product">
-        <param name="catalogProductStatus">
-            <instance type="Magento\Catalog\Model\Product\Status\Proxy" />
-        </param>
-    </type>
-    <type name="Magento\Catalog\Model\Resource\Product\Flat\Indexer">
-        <param name="maxIndexCount">
-            <value type="int">64</value>
-        </param>
-        <param name="flatAttributeGroups">
-            <array>
-                <item key="catalog_product"><value>catalog_product</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="catalogProductStatus" xsi:type="object">Magento\Catalog\Model\Product\Attribute\Source\Status\Proxy</argument>
+            <argument name="categoryIndexer" xsi:type="object" shared="false">Magento\Indexer\Model\IndexerInterface</argument>
+        </arguments>
     </type>
     <type name="Magento\Catalog\Model\Resource\Product\Collection">
-        <param name="catalogUrl">
-            <instance type="Magento\Catalog\Model\Resource\Url\Proxy" />
-        </param>
-        <param name="customerSession">
-            <instance type="Magento\Customer\Model\Session\Proxy" />
-        </param>
+        <arguments>
+            <argument name="catalogUrl" xsi:type="object">Magento\Catalog\Model\Resource\Url\Proxy</argument>
+            <argument name="customerSession" xsi:type="object">Magento\Customer\Model\Session\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Catalog\Model\Entity\Product\Attribute\Design\Options\Container">
-        <param name="options">
-            <array>
-                <item key="option1">
-                    <array>
-                        <item key="value"><value>container1</value></item>
-                        <item key="label"><value>Product Info Column</value></item>
-                    </array>
+        <arguments>
+            <argument name="options" xsi:type="array">
+                <item name="option1" xsi:type="array">
+                    <item name="value" xsi:type="string">container1</item>
+                    <item name="label" xsi:type="string">Product Info Column</item>
                 </item>
-                <item key="option2">
-                    <array>
-                        <item key="value"><value>container2</value></item>
-                        <item key="label"><value>Block after Info Column</value></item>
-                    </array>
+                <item name="option2" xsi:type="array">
+                    <item name="value" xsi:type="string">container2</item>
+                    <item name="label" xsi:type="string">Block after Info Column</item>
                 </item>
-            </array>
-        </param>
-    </type>
-    <type name="Magento\Catalog\Helper\Product\Flat">
-        <param name="addFilterableAttrs">
-            <value type="int">0</value>
-        </param>
-        <param name="addChildData">
-            <value type="int">0</value>
-        </param>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Catalog\Helper\Data">
-        <param name="templateFilterModel">
-            <value>Magento\Catalog\Model\Template\Filter</value>
-        </param>
-        <param name="catalogSession">
-            <instance type="Magento\Catalog\Model\Session\Proxy" />
-        </param>
+        <arguments>
+            <argument name="templateFilterModel" xsi:type="string">Magento\Catalog\Model\Template\Filter</argument>
+            <argument name="catalogSession" xsi:type="object">Magento\Catalog\Model\Session\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Catalog\Model\Config\Source\GridPerPage">
-        <param name="perPageValues">
-            <value>9,15,30</value>
-        </param>
+        <arguments>
+            <argument name="perPageValues" xsi:type="string">9,15,30</argument>
+        </arguments>
     </type>
     <type name="Magento\Catalog\Model\Config\Source\ListPerPage">
-        <param name="options">
-            <value>5,10,15,20,25</value>
-        </param>
+        <arguments>
+            <argument name="options" xsi:type="string">5,10,15,20,25</argument>
+        </arguments>
     </type>
     <type name="Magento\Catalog\Block\Layer\View">
-        <param name="catalogLayer">
-            <instance type="Magento\Catalog\Model\Layer\Proxy" />
-        </param>
+        <arguments>
+            <argument name="catalogLayer" xsi:type="object">Magento\Catalog\Model\Layer\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Module\Updater\SetupFactory">
-        <param name="resourceTypes">
-            <array>
-                <item key="catalog_setup"><value>Magento\Catalog\Model\Resource\Setup</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="resourceTypes" xsi:type="array">
+                <item name="catalog_setup" xsi:type="string">Magento\Catalog\Model\Resource\Setup</item>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Catalog\Helper\Product\Compare">
-        <param name="customerSession">
-            <instance type="Magento\Customer\Model\Session\Proxy" />
-        </param>
-        <param name="catalogSession">
-            <instance type="Magento\Catalog\Model\Session\Proxy" />
-        </param>
+        <arguments>
+            <argument name="customerSession" xsi:type="object">Magento\Customer\Model\Session\Proxy</argument>
+            <argument name="catalogSession" xsi:type="object">Magento\Catalog\Model\Session\Proxy</argument>
+        </arguments>
     </type>
     <virtualType name="Magento\Catalog\Model\Session\Storage" type="Magento\Session\Storage">
-        <param name="namespace">
-            <value>catalog</value>
-        </param>
+        <arguments>
+            <argument name="namespace" xsi:type="string">catalog</argument>
+        </arguments>
     </virtualType>
     <virtualType name="Magento\Catalog\Model\System\Config\Source\InputtypeFactory" type="Magento\Eav\Model\Adminhtml\System\Config\Source\InputtypeFactory">
-        <param name="instanceName">
-            <value>Magento\Catalog\Model\System\Config\Source\Inputtype</value>
-        </param>
+        <arguments>
+            <argument name="instanceName" xsi:type="string">Magento\Catalog\Model\System\Config\Source\Inputtype</argument>
+        </arguments>
     </virtualType>
     <type name="Magento\Catalog\Model\Session">
-        <param name="storage">
-            <instance type="Magento\Catalog\Model\Session\Storage" />
-        </param>
-    </type>
-    <type name="Magento\Catalog\Block\Adminhtml\Product\Attribute\Edit\Tab\Variations\Main">
-        <param name="inputTypeFactory">
-            <instance type="Magento\Catalog\Model\System\Config\Source\InputtypeFactory" />
-        </param>
+        <arguments>
+            <argument name="storage" xsi:type="object">Magento\Catalog\Model\Session\Storage</argument>
+        </arguments>
     </type>
     <type name="Magento\Catalog\Model\Category">
-        <param name="flatIndexer">
-            <instance type="Magento\Indexer\Model\IndexerInterface" shared="false"/>
-        </param>
+        <arguments>
+            <argument name="flatIndexer" xsi:type="object" shared="false">Magento\Indexer\Model\IndexerInterface</argument>
+            <argument name="productIndexer" xsi:type="object" shared="false">Magento\Indexer\Model\IndexerInterface</argument>
+        </arguments>
     </type>
     <type name="Magento\Catalog\Model\Indexer\Category\Flat\System\Config\Mode">
-        <param name="flatIndexer">
-            <instance type="Magento\Indexer\Model\IndexerInterface" shared="false"/>
-        </param>
+        <arguments>
+            <argument name="flatIndexer" xsi:type="object" shared="false">Magento\Indexer\Model\IndexerInterface</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\Resource\Store">
         <plugin name="storeViewResourceAroundSave" type="Magento\Catalog\Model\Indexer\Category\Flat\Plugin\StoreView"/>
+        <plugin name="catalogProductFlatIndexerStore" type="Magento\Catalog\Model\Indexer\Product\Flat\Plugin\Store" />
+        <plugin name="categoryStoreAroundSave" type="Magento\Catalog\Model\Indexer\Category\Product\Plugin\StoreView"/>
     </type>
     <type name="Magento\Core\Model\Resource\Store\Group">
         <plugin name="storeGroupResourceAroundSave" type="Magento\Catalog\Model\Indexer\Category\Flat\Plugin\StoreGroup"/>
-    </type>
-    <type name="Magento\Catalog\Model\Indexer\Category\Flat\Plugin\AbstractStore">
-        <param name="indexer">
-            <instance type="Magento\Indexer\Model\IndexerInterface" shared="false"/>
-        </param>
+        <plugin name="catalogProductFlatIndexerStoreGroup" type="Magento\Catalog\Model\Indexer\Product\Flat\Plugin\StoreGroup" />
+        <plugin name="categoryStoreGroupAroundSave" type="Magento\Catalog\Model\Indexer\Category\Product\Plugin\StoreGroup"/>
     </type>
     <type name="Magento\Indexer\Model\Config\Data">
-        <plugin name="indexerConfigGet" type="Magento\Catalog\Model\Indexer\Category\Flat\Plugin\IndexerConfigData"/>
+        <plugin name="indexerCategoryFlat" type="Magento\Catalog\Model\Indexer\Category\Flat\Plugin\IndexerConfigData"/>
+        <plugin name="indexerProductFlat" type="Magento\Catalog\Model\Indexer\Product\Flat\Plugin\IndexerConfigData"/>
     </type>
     <type name="Magento\Catalog\Model\Indexer\Category\Flat">
-        <param name="indexer">
-            <instance type="Magento\Indexer\Model\IndexerInterface" shared="false"/>
-        </param>
+        <arguments>
+            <argument name="indexer" xsi:type="object" shared="false">Magento\Indexer\Model\IndexerInterface</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Catalog\Model\Indexer\Category\Product\Plugin\StoreGroup">
+        <arguments>
+            <argument name="indexer" xsi:type="object" shared="false">Magento\Indexer\Model\IndexerInterface</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Catalog\Model\Indexer\Product\Flat\Processor">
+        <arguments>
+            <argument name="indexer" xsi:type="object" shared="false">Magento\Indexer\Model\Indexer</argument>
+        </arguments>
+    </type>
+    <type name="Magento\ImportExport\Model\Import">
+        <plugin name="catalogProductFlatIndexerImport" type="\Magento\Catalog\Model\Indexer\Product\Flat\Plugin\Import" />
+    </type>
+    <type name="Magento\Catalog\Helper\Product\Flat\Indexer">
+        <arguments>
+            <argument name="flatAttributeGroups" xsi:type="array">
+                <item name="catalog_product" xsi:type="string">catalog_product</item>
+            </argument>
+        </arguments>
+    </type>
+    <type name="Magento\Catalog\Model\Indexer\Category\Product">
+        <arguments>
+            <argument name="indexer" xsi:type="object" shared="false">Magento\Indexer\Model\IndexerInterface</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Catalog\Model\Indexer\Product\Category">
+        <arguments>
+            <argument name="indexer" xsi:type="object" shared="false">Magento\Indexer\Model\IndexerInterface</argument>
+        </arguments>
     </type>
     <type name="Magento\Catalog\Model\Product\LinkTypeProvider">
-        <param name="linkTypes">
-            <array>
-                <item key="links_related"><value type="const">Magento\Catalog\Model\Product\Link::LINK_TYPE_RELATED</value></item>
-                <item key="links_crosssell"><value type="const">Magento\Catalog\Model\Product\Link::LINK_TYPE_CROSSSELL</value></item>
-                <item key="links_upsell"><value type="const">Magento\Catalog\Model\Product\Link::LINK_TYPE_UPSELL</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="linkTypes" xsi:type="array">
+                <item name="links_related" xsi:type="const">Magento\Catalog\Model\Product\Link::LINK_TYPE_RELATED</item>
+                <item name="links_crosssell" xsi:type="const">Magento\Catalog\Model\Product\Link::LINK_TYPE_CROSSSELL</item>
+                <item name="links_upsell" xsi:type="const">Magento\Catalog\Model\Product\Link::LINK_TYPE_UPSELL</item>
+            </argument>
+        </arguments>
+    </type>
+    <type name="Magento\Catalog\Model\Product\TypeTransitionManager">
+        <arguments>
+            <argument name="compatibleTypes" xsi:type="array">
+                <item name="simple" xsi:type="const">Magento\Catalog\Model\Product\Type::TYPE_SIMPLE</item>
+                <item name="virtual" xsi:type="const">Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL</item>
+            </argument>
+        </arguments>
+    </type>
+    <type name="Magento\Eav\Model\Entity\Setup\PropertyMapper\Composite">
+        <arguments>
+            <argument name="propertyMappers" xsi:type="array">
+                <item name="catalog" xsi:type="string">Magento\Catalog\Model\Resource\Setup\PropertyMapper</item>
+            </argument>
+        </arguments>
+    </type>
+    <type name="Magento\Catalog\Model\Product\Action">
+        <arguments>
+            <argument name="categoryIndexer" xsi:type="object" shared="false">Magento\Indexer\Model\IndexerInterface</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Catalog/etc/eav_attributes.xml b/app/code/Magento/Catalog/etc/eav_attributes.xml
index 3504c0ec6fe..32c11ce2e80 100644
--- a/app/code/Magento/Catalog/etc/eav_attributes.xml
+++ b/app/code/Magento/Catalog/etc/eav_attributes.xml
@@ -33,12 +33,10 @@
             <field code="is_unique" locked="true" />
         </attribute>
         <attribute code="status">
-            <field code="is_configurable" locked="true" />
             <field code="is_filterable" locked="true" />
             <field code="is_filterable_in_search" locked="true" />
         </attribute>
         <attribute code="visibility">
-            <field code="is_configurable" locked="true" />
             <field code="is_filterable" locked="true" />
             <field code="is_filterable_in_search" locked="true" />
         </attribute>
diff --git a/app/code/Magento/Catalog/etc/events.xml b/app/code/Magento/Catalog/etc/events.xml
index 356d40a297a..f08c4656fd1 100644
--- a/app/code/Magento/Catalog/etc/events.xml
+++ b/app/code/Magento/Catalog/etc/events.xml
@@ -30,7 +30,4 @@
     <event name="page_block_html_topmenu_gethtml_before">
         <observer name="catalog_add_topmenu_items" instance="Magento\Catalog\Model\Observer" method="addCatalogToTopmenuItems" />
     </event>
-    <event name="catalog_product_transition_product_type">
-        <observer name="type_transition" instance="Magento\Catalog\Model\Observer" method="transitionProductType" />
-    </event>
 </config>
diff --git a/app/code/Magento/Catalog/etc/frontend/di.xml b/app/code/Magento/Catalog/etc/frontend/di.xml
index f0857e93fc1..0e83b79c052 100644
--- a/app/code/Magento/Catalog/etc/frontend/di.xml
+++ b/app/code/Magento/Catalog/etc/frontend/di.xml
@@ -23,46 +23,44 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Catalog\Model\Session">
-        <param name="sessionName">
-            <value>frontend</value>
-        </param>
+        <arguments>
+            <argument name="sessionName" xsi:type="string">frontend</argument>
+        </arguments>
     </type>
     <type name="Magento\Catalog\Model\Resource\Category\Collection">
-        <param name="fetchStrategy">
-            <instance type="Magento\Data\Collection\Db\FetchStrategy\Cache" />
-        </param>
+        <arguments>
+            <argument name="fetchStrategy" xsi:type="object">Magento\Data\Collection\Db\FetchStrategy\Cache</argument>
+        </arguments>
     </type>
     <type name="Magento\Sales\Model\Convert\Quote">
         <plugin name="copy_quote_files_to_order" type="Magento\Catalog\Model\Plugin\QuoteItemProductOption"/>
     </type>
     <virtualType name="compareProductInitSession" type="Magento\Core\App\Action\Plugin\Session">
-        <param name="cookieCheckActions">
-            <array>
-                <item key="compareProductAdd"><value>add</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="cookieCheckActions" xsi:type="array">
+                <item name="compareProductAdd" xsi:type="string">add</item>
+            </argument>
+        </arguments>
     </virtualType>
     <type name="Magento\Catalog\Controller\Product\Compare">
         <plugin name="sessionInitializer" type="compareProductInitSession" />
     </type>
     <type name="Magento\Catalog\Model\Indexer\AbstractFlatState">
-        <param name="isAvailable">
-            <value type="bool">true</value>
-        </param>
+        <arguments>
+            <argument name="isAvailable" xsi:type="boolean">true</argument>
+        </arguments>
     </type>
     <virtualType name="Magento\Catalog\Block\ShortcutButtons\InCatalog" type="Magento\Catalog\Block\ShortcutButtons">
-        <param name="isCatalogProduct">
-            <value type="bool">true</value>
-        </param>
+        <arguments>
+            <argument name="isCatalogProduct" xsi:type="boolean">true</argument>
+        </arguments>
     </virtualType>
     <virtualType name="Magento\Catalog\Block\ShortcutButtons\InCatalog\PositionAfter" type="Magento\Catalog\Block\ShortcutButtons">
-        <param name="isCatalogProduct">
-            <value type="bool">true</value>
-        </param>
-        <param name="orPosition">
-            <value type="const">Magento\Catalog\Block\ShortcutButtons::POSITION_AFTER</value>
-        </param>
+        <arguments>
+            <argument name="isCatalogProduct" xsi:type="boolean">true</argument>
+            <argument name="orPosition" xsi:type="const">Magento\Catalog\Block\ShortcutButtons::POSITION_AFTER</argument>
+        </arguments>
     </virtualType>
 </config>
diff --git a/app/code/Magento/Catalog/etc/indexer.xml b/app/code/Magento/Catalog/etc/indexer.xml
index 66d7642fadf..64cd38fa8db 100644
--- a/app/code/Magento/Catalog/etc/indexer.xml
+++ b/app/code/Magento/Catalog/etc/indexer.xml
@@ -24,8 +24,20 @@
  */
 -->
 <config>
+    <indexer id="catalog_product_flat" view_id="catalog_product_flat" class="Magento\Catalog\Model\Indexer\Product\Flat">
+        <title translate="true">Product Flat Data</title>
+        <description translate="true">Reorganize EAV product structure to flat structure</description>
+    </indexer>
     <indexer id="catalog_category_flat" view_id="catalog_category_flat" class="Magento\Catalog\Model\Indexer\Category\Flat">
         <title translate="true">Category Flat Data</title>
         <description translate="true">Reorganize EAV category structure to flat structure</description>
     </indexer>
+    <indexer id="catalog_category_product" view_id="catalog_category_product" class="Magento\Catalog\Model\Indexer\Category\Product">
+        <title translate="true">Category Products</title>
+        <description translate="true">Indexed category/products association</description>
+    </indexer>
+    <indexer id="catalog_product_category" view_id="catalog_product_category" class="Magento\Catalog\Model\Indexer\Product\Category">
+        <title translate="true">Product Categories</title>
+        <description translate="true">Indexed product/categories association</description>
+    </indexer>
 </config>
diff --git a/app/code/Magento/Catalog/etc/indexers.xml b/app/code/Magento/Catalog/etc/indexers.xml
index 0ae4f1783bd..9c6fbce5fa7 100644
--- a/app/code/Magento/Catalog/etc/indexers.xml
+++ b/app/code/Magento/Catalog/etc/indexers.xml
@@ -27,6 +27,4 @@
     <indexer name="catalog_product_attribute" instance="Magento\Catalog\Model\Product\Indexer\Eav" />
     <indexer name="catalog_product_price" instance="Magento\Catalog\Model\Product\Indexer\Price" />
     <indexer name="catalog_url" instance="Magento\Catalog\Model\Indexer\Url" />
-    <indexer name="catalog_product_flat" instance="Magento\Catalog\Model\Product\Indexer\Flat" />
-    <indexer name="catalog_category_product" instance="Magento\Catalog\Model\Category\Indexer\Product" />
 </config>
diff --git a/app/code/Magento/Catalog/etc/module.xml b/app/code/Magento/Catalog/etc/module.xml
index e0ebf1ee4a0..9f4c16f8f3f 100755
--- a/app/code/Magento/Catalog/etc/module.xml
+++ b/app/code/Magento/Catalog/etc/module.xml
@@ -24,17 +24,19 @@
  */
 -->
 <config>
-    <module name="Magento_Catalog" version="1.6.0.0.24" active="true">
+    <module name="Magento_Catalog" version="1.6.0.0.26" active="true">
         <sequence>
             <module name="Magento_Eav"/>
             <module name="Magento_Cms"/>
             <module name="Magento_Index"/>
+            <module name="Magento_Indexer"/>
             <module name="Magento_Customer"/>
         </sequence>
         <depends>
             <module name="Magento_Eav"/>
             <module name="Magento_Cms"/>
             <module name="Magento_Index"/>
+            <module name="Magento_Indexer"/>
             <module name="Magento_Customer"/>
             <module name="Magento_Core"/>
             <module name="Magento_Theme"/>
@@ -55,7 +57,6 @@
             <module name="Magento_Weee"/>
             <module name="Magento_ProductAlert"/>
             <module name="Magento_Rating"/>
-            <module name="Magento_Indexer"/>
         </depends>
     </module>
 </config>
diff --git a/app/code/Magento/Catalog/etc/mview.xml b/app/code/Magento/Catalog/etc/mview.xml
index 4025c180e6e..5c94110235b 100644
--- a/app/code/Magento/Catalog/etc/mview.xml
+++ b/app/code/Magento/Catalog/etc/mview.xml
@@ -34,4 +34,31 @@
             <table name="catalog_category_entity_datetime" entity_column="entity_id" />
         </subscriptions>
     </view>
+    <view id="catalog_category_product" class="Magento\Catalog\Model\Indexer\Category\Product" group="indexer">
+        <subscriptions>
+            <table name="catalog_category_entity" entity_column="entity_id" />
+            <table name="catalog_category_entity_int" entity_column="entity_id" />
+        </subscriptions>
+    </view>
+    <view id="catalog_product_category" class="Magento\Catalog\Model\Indexer\Product\Category" group="indexer">
+        <subscriptions>
+            <table name="catalog_category_product" entity_column="product_id" />
+            <table name="catalog_product_entity_int" entity_column="entity_id" />
+            <table name="catalog_product_website" entity_column="product_id" />
+        </subscriptions>
+    </view>
+    <view id="catalog_product_flat" class="Magento\Catalog\Model\Indexer\Product\Flat" group="indexer">
+        <subscriptions>
+            <table name="catalog_product_entity" entity_column="entity_id" />
+            <table name="catalog_product_entity_datetime" entity_column="entity_id" />
+            <table name="catalog_product_entity_decimal" entity_column="entity_id" />
+            <table name="catalog_product_entity_gallery" entity_column="entity_id" />
+            <table name="catalog_product_entity_group_price" entity_column="entity_id" />
+            <table name="catalog_product_entity_int" entity_column="entity_id" />
+            <table name="catalog_product_entity_media_gallery" entity_column="entity_id" />
+            <table name="catalog_product_entity_text" entity_column="entity_id" />
+            <table name="catalog_product_entity_tier_price" entity_column="entity_id" />
+            <table name="catalog_product_entity_varchar" entity_column="entity_id" />
+        </subscriptions>
+    </view>
 </config>
diff --git a/app/code/Magento/Catalog/etc/product_types.xml b/app/code/Magento/Catalog/etc/product_types.xml
index 0a093d3e7bd..a00897a5d54 100644
--- a/app/code/Magento/Catalog/etc/product_types.xml
+++ b/app/code/Magento/Catalog/etc/product_types.xml
@@ -29,19 +29,12 @@
             <attribute name="refundable" value="true"/>
         </customAttributes>
     </type>
-    <type name="configurable" label="Configurable Product" modelInstance="Magento\Catalog\Model\Product\Type\Configurable" composite='true' indexPriority="30">
-        <priceModel instance="Magento\Catalog\Model\Product\Type\Configurable\Price" />
-        <indexerModel instance="Magento\Catalog\Model\Resource\Product\Indexer\Price\Configurable" />
-        <customAttributes>
-            <attribute name="refundable" value="true"/>
-        </customAttributes>
-    </type>
     <type name="virtual" label="Virtual Product" modelInstance="Magento\Catalog\Model\Product\Type\Virtual" indexPriority="20">
         <customAttributes>
             <attribute name="is_real_product" value="false"/>
+            <attribute name="refundable" value="false"/>
         </customAttributes>
     </type>
-
     <composableTypes>
         <type name="simple" />
         <type name="virtual" />
diff --git a/app/code/Magento/Catalog/i18n/de_DE.csv b/app/code/Magento/Catalog/i18n/de_DE.csv
index 8ae7321172c..74d31880fe1 100644
--- a/app/code/Magento/Catalog/i18n/de_DE.csv
+++ b/app/code/Magento/Catalog/i18n/de_DE.csv
@@ -145,7 +145,6 @@
 "Catalog Product Image Gallery Popup","Katalog-Popup der Produktbildergallerie"
 "Catalog Product Link","Link zu den Produkten im Katalog"
 "Catalog Product View (Any)","Produktansicht des Katalogs (beliebig)"
-"Catalog Product View (Configurable)","Produktansicht des Katalogs (konfigurierbar)"
 "Catalog Product View (Simple)","Produktansicht des Katalogs (vereinfacht)"
 "Catalog Product View (Virtual)","Produktansicht des Katalogs (virtuell)"
 "Catalog Section","Katalogabschnitt"
@@ -193,11 +192,7 @@
 "Compare","Vergleichen"
 "Compare Products","Produkte vergleichen"
 "Conditions Combination","Bedingungenkombination"
-"Configurable Product","Konfigurierbare Produkte"
-"Configurable Product Settings","Konfigurierbare Produkteinstellungen"
-"Configure Product","Produkt konfigurieren"
 "Continue","Fortsetzen"
-"Copy From Configurable","Aus konfigurierbaren Produkteinstellungen kopieren"
 "Country/State","Land/Staat"
 "Create","Erstellen"
 "Create (Upload)","Erstellen (hochladen)"
@@ -517,7 +512,6 @@
 "Product links API (related, cross sells, up sells)","Produktlink-API (Ähnliches, Cross-Selling, Up-Selling)"
 "Product name","Produktbezeichnung"
 "Product types API","API Produkttypen"
-"Product with this combination of attributes already associated to configurable.","Produktkombination mit diesen Attributen existiert bereits im konfigurierbaren Produkt."
 "Products","Produkte"
 "Products Comparison List","Produkt Vergleichsliste"
 "Products Information","Produktinformationen"
@@ -598,7 +592,6 @@
 "Save and Continue Edit","Speichern und Bearbeitung fortsetzen"
 "Saved %d record(s)","%d gespeicherte(r) Eintrag/Einträge"
 "Scope","Umfang"
-"Scope must not be changed, because the attribute is used in configurable products.","Der Umfang darf nicht geändert werden, da dieses Attribut bei konfigurierbaren Produkten verwendet wird."
 "Search","Suche"
 "Search Engine Optimizations","Suchmaschinen Optimierung"
 "Search Information","Suchinformationen"
@@ -608,7 +601,6 @@
 "Searchable","Suchbar"
 "See price before order confirmation.","Preis vor Bestellbestätigung ansehen."
 "Select Category...","Kategorie auswählen…"
-"Select Configurable Attributes ","Konfigurierbare Merkmale auswählen"
 "Select Product...","Produkt aussuchen…"
 "Select type of option","Optionsart auswählen"
 "Select type options required values rows.","Typenoptionen für benötigte Wertezeilen auswählen."
@@ -700,11 +692,8 @@
 "This attribute cannot be deleted.","Diese Eigenschaft kann nicht gelöscht werden."
 "This attribute cannot be edited.","Dieses Merkmal kann nicht bearbeitet werden."
 "This attribute cannot be updated.","Diese Eigenschaft kann nicht aktualisiert werden."
-"This attribute is used in configurable products.","Das Attribut wurde in konfigurierbaren Produkten verwendet."
-"This attribute is used in configurable products. You cannot remove it from the attribute set.","Diese Eigenschaft wird für konfigurierbare Produkte benötigt. Sie können sie nicht aus dem Eigenschaftenset entfernen."
 "This attribute no longer exists","Dieses Attribut existiert nicht mehr."
 "This attribute set no longer exists.","Dieses Eigenschaftenset existiert nicht mehr."
-"This group contains attributes, used in configurable products. Please move these attributes to another group and try again.","Diese Gruppe enthält Eigenschaften, die für konfigurierbare Produkte benutzt werden. Bitte verschieben Sie diese Eigenschaften in eine andere Gruppe und versuchen Sie es noch einmal."
 "This group contains system attributes. Please move system attributes to another group and try again.","Diese Gruppe enthält System Eigenschaften. Bitte verschieben Sie System Eigenschaften in eine andere Gruppe und versuchen Sie es noch einmal."
 "This is a required option","Dies ist eine obligatorische Option"
 "This product no longer exists.","Dieses Produkt existiert nicht mehr."
@@ -759,7 +748,6 @@
 "Use In Search Results Layered Navigation","Navigation in Suchergebnissen nutzen"
 "Use JavaScript Calendar","JavaScript Kalender verwenden"
 "Use Static URLs for Media Content in WYSIWYG for Catalog","Statische URLs für Medieninhalt in WYSIWYG für Katalog nutzen"
-"Use To Create Configurable Product","Verwenden um konfigurierbares Produkt zu erstellen"
 "Use Tree Like Category Sitemap","Kategorie-Sitemap in Baumansicht verwenden"
 "Use config","config verwenden"
 "Use default","Standard verwenden"
@@ -799,7 +787,6 @@
 "Wrong option type to get group instance.","Falscher Options-Typ um die Gruppen-Instanz zu erhalten."
 "Wrong product instance type in options group.","Falsches Produktbeispiel in Optionengruppe."
 "Wrong product type filter specified","Falscher Produkttyp Filter festgelegt"
-"Wrong product type to extract configurable options.","Falscher Produkt-Typ, um konfigurierbare Optionen zu extrahieren."
 "Year Range","Jahres-Zeitraum"
 "Yes","Ja"
 "You cannot remove system attribute from this set.","Dieses Systemattribut kann aus dieser Gruppe nicht entfernt werden."
diff --git a/app/code/Magento/Catalog/i18n/en_US.csv b/app/code/Magento/Catalog/i18n/en_US.csv
index a76ec9887fb..1107cf1fbd1 100644
--- a/app/code/Magento/Catalog/i18n/en_US.csv
+++ b/app/code/Magento/Catalog/i18n/en_US.csv
@@ -146,7 +146,6 @@
 "Catalog Product Image Gallery Popup","Catalog Product Image Gallery Popup"
 "Catalog Product Link","Catalog Product Link"
 "Catalog Product View (Any)","Catalog Product View (Any)"
-"Catalog Product View (Configurable)","Catalog Product View (Configurable)"
 "Catalog Product View (Simple)","Catalog Product View (Simple)"
 "Catalog Product View (Virtual)","Catalog Product View (Virtual)"
 "Catalog Section","Catalog Section"
@@ -194,11 +193,7 @@
 "Compare","Compare"
 "Compare Products","Compare Products"
 "Conditions Combination","Conditions Combination"
-"Configurable Product","Configurable Product"
-"Configurable Product Settings","Configurable Product Settings"
-"Configure Product","Configure Product"
 "Continue","Continue"
-"Copy From Configurable","Copy From Configurable"
 "Country/State","Country/State"
 "Create","Create"
 "Create (Upload)","Create (Upload)"
@@ -519,7 +514,6 @@
 "Product links API (related, cross sells, up sells)","Product links API (related, cross sells, up sells)"
 "Product name","Product name"
 "Product types API","Product types API"
-"Product with this combination of attributes already associated to configurable.","Product with this combination of attributes already associated to configurable."
 "Products","Products"
 "Products Comparison List","Products Comparison List"
 "Products Information","Products Information"
@@ -600,7 +594,6 @@
 "Save and Continue Edit","Save and Continue Edit"
 "Saved %d record(s)","Saved %d record(s)"
 "Scope","Scope"
-"Scope must not be changed, because the attribute is used in configurable products.","Scope must not be changed, because the attribute is used in configurable products."
 "Search","Search"
 "Search Engine Optimizations","Search Engine Optimizations"
 "Search Information","Search Information"
@@ -610,7 +603,6 @@
 "Searchable","Searchable"
 "See price before order confirmation.","See price before order confirmation."
 "Select Category...","Select Category..."
-"Select Configurable Attributes ","Select Configurable Attributes "
 "Select Product...","Select Product..."
 "Select type of option","Select type of option"
 "Select type options required values rows.","Select type options required values rows."
@@ -702,11 +694,8 @@
 "This attribute cannot be deleted.","This attribute cannot be deleted."
 "This attribute cannot be edited.","This attribute cannot be edited."
 "This attribute cannot be updated.","This attribute cannot be updated."
-"This attribute is used in configurable products.","This attribute is used in configurable products."
-"This attribute is used in configurable products. You cannot remove it from the attribute set.","This attribute is used in configurable products. You cannot remove it from the attribute set."
 "This attribute no longer exists","This attribute no longer exists"
 "This attribute set no longer exists.","This attribute set no longer exists."
-"This group contains attributes, used in configurable products. Please move these attributes to another group and try again.","This group contains attributes, used in configurable products. Please move these attributes to another group and try again."
 "This group contains system attributes. Please move system attributes to another group and try again.","This group contains system attributes. Please move system attributes to another group and try again."
 "This is a required option","This is a required option"
 "This product no longer exists.","This product no longer exists."
@@ -762,7 +751,6 @@
 "Use In Search Results Layered Navigation","Use In Search Results Layered Navigation"
 "Use JavaScript Calendar","Use JavaScript Calendar"
 "Use Static URLs for Media Content in WYSIWYG for Catalog","Use Static URLs for Media Content in WYSIWYG for Catalog"
-"Use To Create Configurable Product","Use To Create Configurable Product"
 "Use Tree Like Category Sitemap","Use Tree Like Category Sitemap"
 "Use config","Use config"
 "Use default","Use default"
@@ -803,7 +791,6 @@
 "Wrong option type to get group instance.","Wrong option type to get group instance."
 "Wrong product instance type in options group.","Wrong product instance type in options group."
 "Wrong product type filter specified","Wrong product type filter specified"
-"Wrong product type to extract configurable options.","Wrong product type to extract configurable options."
 "Year Range","Year Range"
 "Yes","Yes"
 "You cannot remove system attribute from this set.","You cannot remove system attribute from this set."
diff --git a/app/code/Magento/Catalog/i18n/es_ES.csv b/app/code/Magento/Catalog/i18n/es_ES.csv
index 6d4cda7c684..fa906909ddf 100644
--- a/app/code/Magento/Catalog/i18n/es_ES.csv
+++ b/app/code/Magento/Catalog/i18n/es_ES.csv
@@ -145,7 +145,6 @@
 "Catalog Product Image Gallery Popup","Galería de imágenes emergente del Catálogo de Productos"
 "Catalog Product Link","Enlace al Catálgo de Productos"
 "Catalog Product View (Any)","Vista del Catálogo de Producto (cualquiera)"
-"Catalog Product View (Configurable)","Vista del Catálogo de Producto (Configurable)"
 "Catalog Product View (Simple)","Vista del Catálogo de Producto (Simple)"
 "Catalog Product View (Virtual)","Vista del Catálogo de Producto (Virtual)"
 "Catalog Section","Sección de Catálogo"
@@ -193,11 +192,7 @@
 "Compare","Comparar"
 "Compare Products","Comparar Productos"
 "Conditions Combination","Combinación de condiciones"
-"Configurable Product","Producto Configurable"
-"Configurable Product Settings","Parametrización de Producto Configurable"
-"Configure Product","Configurar Producto"
 "Continue","Continuar"
-"Copy From Configurable","Copiar desde Configurable"
 "Country/State","País/Estado"
 "Create","Crear."
 "Create (Upload)","Crear (Cargar)"
@@ -517,7 +512,6 @@
 "Product links API (related, cross sells, up sells)","API de vínculos de producto (relacionados, ventas cruzadas, ventas incrementadas)"
 "Product name","Nombre de producto"
 "Product types API","API de tipos de producto"
-"Product with this combination of attributes already associated to configurable.","El producto con esta combinación de atributos ya ha sido asociado a configurables."
 "Products","Productos"
 "Products Comparison List","Lista de Comparación de Productos"
 "Products Information","Información de Productos"
@@ -598,7 +592,6 @@
 "Save and Continue Edit","Guardar y continuar editando"
 "Saved %d record(s)","Registro(s) %d Guardado(s)"
 "Scope","Alcance"
-"Scope must not be changed, because the attribute is used in configurable products.","No se puede cambiar el ámbito de aplicación, dado que el atributo se utiliza en productos configurables."
 "Search","Buscar"
 "Search Engine Optimizations","Optimizaciones de motor de búsqueda"
 "Search Information","Información de búsqueda"
@@ -608,7 +601,6 @@
 "Searchable","Puede buscarse"
 "See price before order confirmation.","Ver precio antes de la confirmación del pedido."
 "Select Category...","Seleccionar categoría..."
-"Select Configurable Attributes ","Seleccionar atributos configurables"
 "Select Product...","Seleccionar producto..."
 "Select type of option","Seleccionar tipo de opción"
 "Select type options required values rows.","Determinados tipos de opciones requieren filas de valores."
@@ -700,11 +692,8 @@
 "This attribute cannot be deleted.","No puede eliminarse este atributo."
 "This attribute cannot be edited.","No se puede editar este atributo."
 "This attribute cannot be updated.","No puede actualizarse este atributo."
-"This attribute is used in configurable products.","Este atributo se utiliza en productos configurables."
-"This attribute is used in configurable products. You cannot remove it from the attribute set.","Este atributo se utiliza en productos configurables. No es posible eliminarlo del conjunto de atributos."
 "This attribute no longer exists","Este atributo ya no existe."
 "This attribute set no longer exists.","Este conjunto de atributos ya no existe."
-"This group contains attributes, used in configurable products. Please move these attributes to another group and try again.","Este grupo contiene atributos utilizados en productos configurables. Páselos a otro grupo y vuelva a intentarlo."
 "This group contains system attributes. Please move system attributes to another group and try again.","Este grupo contiene atributos del sistema. Pase los atributos del sistema a otro grupo y vuelva a intentarlo."
 "This is a required option","Esta es una opción obligatoria"
 "This product no longer exists.","Este producto ya no existe."
@@ -759,7 +748,6 @@
 "Use In Search Results Layered Navigation","Utilizar en la navegación por capas de los resultados de búsqueda"
 "Use JavaScript Calendar","Utilizar calendario de JavaScript"
 "Use Static URLs for Media Content in WYSIWYG for Catalog","Utilizar URL estáticas para contenido multimedia en WYSIWYG para el catálogo"
-"Use To Create Configurable Product","Utilizar para crear producto configurable"
 "Use Tree Like Category Sitemap","Utilizar mapa de sitio con categorías jerárquicas"
 "Use config","Usar configuración"
 "Use default","Uso por defecto"
@@ -799,7 +787,6 @@
 "Wrong option type to get group instance.","Tipo de opción incorrecto en el grupo de opciones."
 "Wrong product instance type in options group.","Tipo de instancia de producto no válido en el grupo de opciones."
 "Wrong product type filter specified","Se especificó un filtro de tipo de producto incorrecto"
-"Wrong product type to extract configurable options.","Tipo de producto incorrecto para extraer opciones configurables."
 "Year Range","Rango de años"
 "Yes","Sí"
 "You cannot remove system attribute from this set.","No es posible eliminar atributos del sistema de este conjunto."
diff --git a/app/code/Magento/Catalog/i18n/fr_FR.csv b/app/code/Magento/Catalog/i18n/fr_FR.csv
index 122f2ea0233..73f60c7d7e8 100644
--- a/app/code/Magento/Catalog/i18n/fr_FR.csv
+++ b/app/code/Magento/Catalog/i18n/fr_FR.csv
@@ -145,7 +145,6 @@
 "Catalog Product Image Gallery Popup","Popup Galerie d'Images du Produit du Catalogue"
 "Catalog Product Link","Lien du Produit Catalogue"
 "Catalog Product View (Any)","Affichage du Produit Catalogue (Tous)"
-"Catalog Product View (Configurable)","Affichage du Produit Catalogue (Configurable)"
 "Catalog Product View (Simple)","Affichage du Produit Catalogue (Simple)"
 "Catalog Product View (Virtual)","Affichage du Produit Catalogue (Virtuel)"
 "Catalog Section","Section Catalogue"
@@ -193,11 +192,7 @@
 "Compare","Comparer"
 "Compare Products","Comparer des produits"
 "Conditions Combination","Combinaison de conditions"
-"Configurable Product","Produit configurable"
-"Configurable Product Settings","Réglages du produit configurable"
-"Configure Product","Configurer produit"
 "Continue","Continuer"
-"Copy From Configurable","Copier depuis configurable"
 "Country/State","Pays/État"
 "Create","Créer"
 "Create (Upload)","Créer (envoyer)"
@@ -517,7 +512,6 @@
 "Product links API (related, cross sells, up sells)","API de liens de produits (liés, ventes croisées ...)"
 "Product name","Nom du produit"
 "Product types API","Types API du produit"
-"Product with this combination of attributes already associated to configurable.","Les produits avec cette combinaison d'attributs sont déjà associés à configurable."
 "Products","Produits"
 "Products Comparison List","Liste de comparaison des produits"
 "Products Information","Information des produits"
@@ -598,7 +592,6 @@
 "Save and Continue Edit","Sauvegarder et continuer l'édition"
 "Saved %d record(s)","Sauvegardé %d enregistrement(s)"
 "Scope","Portée"
-"Scope must not be changed, because the attribute is used in configurable products.","Le champ ne doit pas être changé, car l'attribut est utilisé dans des produits configurables."
 "Search","Rechercher"
 "Search Engine Optimizations","Optimisations du Moteur de Recherche"
 "Search Information","Informations de recherche"
@@ -608,7 +601,6 @@
 "Searchable","Consultable"
 "See price before order confirmation.","Voir le prix avant la confirmation de commande."
 "Select Category...","Sélectionner Catégorie"
-"Select Configurable Attributes ","Sélectionner les attributs configurables"
 "Select Product...","Sélectionner Produit..."
 "Select type of option","Sélectionner le type d'option"
 "Select type options required values rows.","La sélection du type d'options a requis des rangs de valeurs."
@@ -700,11 +692,8 @@
 "This attribute cannot be deleted.","L'attribut ne peut pas être supprimé."
 "This attribute cannot be edited.","Cet attribut ne peut pas être modifié."
 "This attribute cannot be updated.","L'attribut ne peut pas être mis à jour."
-"This attribute is used in configurable products.","Cet attribut est utilisé dans les produits configurables."
-"This attribute is used in configurable products. You cannot remove it from the attribute set.","L'attribut est utilisé dans des produits paramétrables. Vous ne pouvez pas le retirer de la série d'attributs."
 "This attribute no longer exists","Cet attribut n'existe plus"
 "This attribute set no longer exists.","La série d'attributs n'existe plus."
-"This group contains attributes, used in configurable products. Please move these attributes to another group and try again.","Le groupe contient des attributs, utilisés dans des produits paramétrables. Veuillez déplacer ces attributs vers un autre groupe et réessayer."
 "This group contains system attributes. Please move system attributes to another group and try again.","Le groupe contient des attributs système. Veuillez déplacer les attributs système vers un autre groupe et réessayer."
 "This is a required option","Cette option est requise"
 "This product no longer exists.","Ce produit n'existe plus."
@@ -759,7 +748,6 @@
 "Use In Search Results Layered Navigation","Utilisez la page de résultats de navigation en couches"
 "Use JavaScript Calendar","Utiliser le Calendrier JavaScript"
 "Use Static URLs for Media Content in WYSIWYG for Catalog","Utilisez des URL statiques pour le contenu multimédia en mode WYSIWYG pour le catalogue"
-"Use To Create Configurable Product","Permet de créer des produits configurables"
 "Use Tree Like Category Sitemap","Utiliser la carte du site sous forme de hiérarchie"
 "Use config","Utiliser config"
 "Use default","Utiliser le défaut"
@@ -799,7 +787,6 @@
 "Wrong option type to get group instance.","Mauvais type d'option pour obtenir l'instance du groupe."
 "Wrong product instance type in options group.","Mauvais type de produit d'exemple dans le groupe d'options."
 "Wrong product type filter specified","Mauvais filtre de type de produit spécifié"
-"Wrong product type to extract configurable options.","Mauvais type de produit pour extraire des options configurables."
 "Year Range","Années"
 "Yes","Oui"
 "You cannot remove system attribute from this set.","Vous ne pouvez pas retirer d'attribut système de cet ensemble."
diff --git a/app/code/Magento/Catalog/i18n/nl_NL.csv b/app/code/Magento/Catalog/i18n/nl_NL.csv
index 157296cda20..6cb2a1e1f0a 100644
--- a/app/code/Magento/Catalog/i18n/nl_NL.csv
+++ b/app/code/Magento/Catalog/i18n/nl_NL.csv
@@ -145,7 +145,6 @@
 "Catalog Product Image Gallery Popup","Catalogus productbeeldenreeks popup"
 "Catalog Product Link","Catalogus Product Link"
 "Catalog Product View (Any)","Catalogus Product Bezichtiging (Elke)"
-"Catalog Product View (Configurable)","Catalogus Product Bezichtiging (Configureerbaar)"
 "Catalog Product View (Simple)","Catalogus Product Bezichtiging (Simpel)"
 "Catalog Product View (Virtual)","Catalogus Product Bezichtiging (Virtueel)"
 "Catalog Section","Catalogus Gedeelte"
@@ -193,11 +192,7 @@
 "Compare","Vergelijk"
 "Compare Products","Vergelijk Producten"
 "Conditions Combination","Voorwaarden Combinatie"
-"Configurable Product","Configureerbaar Product"
-"Configurable Product Settings","Configureerbare Productinstellingen"
-"Configure Product","Product instellen"
 "Continue","Doorgaan"
-"Copy From Configurable","Kopieer Van Configureerbaar"
 "Country/State","Land/Provincie"
 "Create","Maak aan"
 "Create (Upload)","Creëer (Upload)"
@@ -517,7 +512,6 @@
 "Product links API (related, cross sells, up sells)","Product links API (gerelateerd, kruisverkoop, omhoogverkoop)"
 "Product name","Productnaam"
 "Product types API","Product types API"
-"Product with this combination of attributes already associated to configurable.","Product met deze combinatie van attributen is reeds geassocieerd met configureerbaar."
 "Products","Producten"
 "Products Comparison List","Productvergelijkingslijst"
 "Products Information","Producteninformatie"
@@ -598,7 +592,6 @@
 "Save and Continue Edit","Opslaan en doorgaan met bewerken"
 "Saved %d record(s)","%d archief(ven) opgeslagen"
 "Scope","Reikwijdte"
-"Scope must not be changed, because the attribute is used in configurable products.","Reikwijdte moet niet veranderd worden, omdat de attribuut gebruikt wordt door configureerbare producten."
 "Search","Zoeken"
 "Search Engine Optimizations","Zoekmachine optimalisaties"
 "Search Information","Zoekinformatie"
@@ -608,7 +601,6 @@
 "Searchable","Zoekbaar"
 "See price before order confirmation.","Zie prijs voor bevestiging van bestelling."
 "Select Category...","Selecteer categorie..."
-"Select Configurable Attributes ","Selecteer Configureerbare Attributen"
 "Select Product...","Selecteer Product..."
 "Select type of option","Selecteer optietype"
 "Select type options required values rows.","Selecteer optietype verplichte rijwaarden."
@@ -700,11 +692,8 @@
 "This attribute cannot be deleted.","Dit attribuut kan niet verwijderd worden."
 "This attribute cannot be edited.","Dit attribuut kan niet gewijzigd worden."
 "This attribute cannot be updated.","Dit attribuut kan niet bijgewerkt worden."
-"This attribute is used in configurable products.","Dit kenmerk wordt gebruikt in configureerbare producten."
-"This attribute is used in configurable products. You cannot remove it from the attribute set.","Dit attribuut wordt gebruikt in configureerbare producten. U kunt het niet verwijderen uit de attributenreeks."
 "This attribute no longer exists","Deze eigenschap bestaat niet meer"
 "This attribute set no longer exists.","Deze attribuutset bestaat niet meer."
-"This group contains attributes, used in configurable products. Please move these attributes to another group and try again.","Deze groep bevat attributen die gebruikt worden in configureerbare producten. Verplaats deze attributen naar een andere groep en probeer het opnieuw."
 "This group contains system attributes. Please move system attributes to another group and try again.","Deze groep bevat systeemattributen. Verplaats de systeemattributen naar een andere groep en probeer het opnieuw."
 "This is a required option","Dit is een verplichte optie"
 "This product no longer exists.","Dit product bestaat niet meer."
@@ -759,7 +748,6 @@
 "Use In Search Results Layered Navigation","Gebruik in Zoek Resultaten een Gelaagde Navigatie"
 "Use JavaScript Calendar","Gebruik Javascript Kalender"
 "Use Static URLs for Media Content in WYSIWYG for Catalog","Gebruik Vaste URL's voor Media Inhoud in WYSIWYG voor de Catalogus"
-"Use To Create Configurable Product","Gebruik Om Configureerbaar Product Te Creëren"
 "Use Tree Like Category Sitemap","Gebruik Boomnetwerk Als Categorie Sitemap"
 "Use config","Gebruik config"
 "Use default","Gebruik standaard"
@@ -799,7 +787,6 @@
 "Wrong option type to get group instance.","Verkeerde optie type om groep voorbeeld te krijgen."
 "Wrong product instance type in options group.","Verkeerd productvoorbeeld type in optiegroep."
 "Wrong product type filter specified","Verkeerd product type filter opgegeven"
-"Wrong product type to extract configurable options.","Verkeerd producttype om configureerbare opties van af te nemen."
 "Year Range","Jaar Range"
 "Yes","Ja"
 "You cannot remove system attribute from this set.","U kunt geen systeemattributen uit deze set verwijderen."
diff --git a/app/code/Magento/Catalog/i18n/pt_BR.csv b/app/code/Magento/Catalog/i18n/pt_BR.csv
index ec85d4721e5..12bf8bcf8a9 100644
--- a/app/code/Magento/Catalog/i18n/pt_BR.csv
+++ b/app/code/Magento/Catalog/i18n/pt_BR.csv
@@ -145,7 +145,6 @@
 "Catalog Product Image Gallery Popup","Produto de Catálogo: Pop-up da Galeria de Imagens"
 "Catalog Product Link","Link do Produto de Catálogo"
 "Catalog Product View (Any)","Visualizar Produto de Catálogo (Qualquer Um)"
-"Catalog Product View (Configurable)","Visualizar Produto de Catálogo (Configurável)"
 "Catalog Product View (Simple)","Visualizar Produto de Catálogo (Simples)"
 "Catalog Product View (Virtual)","Visualizar Produto de Catálogo (Virtual)"
 "Catalog Section","Seção de Catálogo"
@@ -193,11 +192,7 @@
 "Compare","Comparar"
 "Compare Products","Comparar Produtos"
 "Conditions Combination","Combinação de condições"
-"Configurable Product","Produto Configurável"
-"Configurable Product Settings","Características do Produto Configurável"
-"Configure Product","Configurar Produto"
 "Continue","Continue"
-"Copy From Configurable","Copiar de Configurável"
 "Country/State","País/Estado"
 "Create","Criar"
 "Create (Upload)","Criar (Carregar)"
@@ -517,7 +512,6 @@
 "Product links API (related, cross sells, up sells)","API para links de produto (relacionados, vendas cruzadas, vendas extras)"
 "Product name","Nome do produto"
 "Product types API","API para tipos de produto"
-"Product with this combination of attributes already associated to configurable.","O produto com esta combinação de atributos já está associado aos configuráveis."
 "Products","Produtos"
 "Products Comparison List","Lista de Comparação de Produtos"
 "Products Information","Informações de Produtos"
@@ -598,7 +592,6 @@
 "Save and Continue Edit","Salvar e continuar a editar"
 "Saved %d record(s)","%d registro(s) salvo(s)"
 "Scope","Limite"
-"Scope must not be changed, because the attribute is used in configurable products.","O limite não pode ser alterado, porque o atributo é usado em produtos configuráveis."
 "Search","Pesquisa"
 "Search Engine Optimizations","Otimizações nos Mecanismos de Busca"
 "Search Information","Buscar Informações"
@@ -608,7 +601,6 @@
 "Searchable","Passível de Busca"
 "See price before order confirmation.","Ver preço antes de confirmar pedido."
 "Select Category...","Seleciona Categoria..."
-"Select Configurable Attributes ","Selecionar Atributos Configuráveis"
 "Select Product...","Selecionar Produto..."
 "Select type of option","Selecionar tipo de opção"
 "Select type options required values rows.","Selecione as linhas de valores exigidas para opções de tipo."
@@ -700,11 +692,8 @@
 "This attribute cannot be deleted.","Este atributo não pode ser apagado."
 "This attribute cannot be edited.","Este atributo não pode ser editado."
 "This attribute cannot be updated.","Este atributo não pode ser atualizado."
-"This attribute is used in configurable products.","O atributo é usado em produtos configuráveis."
-"This attribute is used in configurable products. You cannot remove it from the attribute set.","Este atributo é usado em produtos configuráveis​​. Você não pode removê-lo do conjunto de atributos."
 "This attribute no longer exists","Este atributo não existe mais"
 "This attribute set no longer exists.","Este conjunto de atributos não existe mais."
-"This group contains attributes, used in configurable products. Please move these attributes to another group and try again.","Este grupo contém atributos, usados ​​em produtos configuráveis. Por favor mova esses atributos para outro grupo e tente novamente."
 "This group contains system attributes. Please move system attributes to another group and try again.","Este grupo contém atributos do sistema. Por favor mova atributos do sistema para outro grupo e tente novamente."
 "This is a required option","Esta é uma opção necessária"
 "This product no longer exists.","Este produto não existe mais."
@@ -759,7 +748,6 @@
 "Use In Search Results Layered Navigation","Use Em Resultados de Pesquisa de Navegação em Camadas"
 "Use JavaScript Calendar","Use Calendário JavaScript"
 "Use Static URLs for Media Content in WYSIWYG for Catalog","Use URLs Estáticos para Conteúdo Mídia em WYSIWYG para Catálogo"
-"Use To Create Configurable Product","Use Para Criar Produto Configurável"
 "Use Tree Like Category Sitemap","Use Categoria Mapa do Site Como Árvore"
 "Use config","Use config"
 "Use default","Use padrão"
@@ -799,7 +787,6 @@
 "Wrong option type to get group instance.","Tipo de opção errado para obter instância de grupo."
 "Wrong product instance type in options group.","Tipo de instância de produtos errada no grupo de opções."
 "Wrong product type filter specified","Tipo de filtro de produto especificado errado"
-"Wrong product type to extract configurable options.","Tipo de produto errado para extrair opções configuráveis."
 "Year Range","Intervalo de Ano"
 "Yes","Sim"
 "You cannot remove system attribute from this set.","Você não pode remover atributo de sistema a partir deste conjunto."
diff --git a/app/code/Magento/Catalog/i18n/zh_CN.csv b/app/code/Magento/Catalog/i18n/zh_CN.csv
index 776e34364e4..8eba15cdcc8 100644
--- a/app/code/Magento/Catalog/i18n/zh_CN.csv
+++ b/app/code/Magento/Catalog/i18n/zh_CN.csv
@@ -145,7 +145,6 @@
 "Catalog Product Image Gallery Popup","分类产品图像库弹出窗口"
 "Catalog Product Link","分类产品链接"
 "Catalog Product View (Any)","分类产品视图(任意)"
-"Catalog Product View (Configurable)","分类产品视图(可配置)"
 "Catalog Product View (Simple)","分类产品视图(简单)"
 "Catalog Product View (Virtual)","分类产品视图(虚拟)"
 "Catalog Section","分类选择"
@@ -193,11 +192,7 @@
 "Compare","比较"
 "Compare Products","比较产品"
 "Conditions Combination","条件组合"
-"Configurable Product","可配置的产品"
-"Configurable Product Settings","可配置的产品设置"
-"Configure Product","配置产品"
 "Continue","ç»§ç»­"
-"Copy From Configurable","从配置中复制"
 "Country/State","国家/州"
 "Create","创建"
 "Create (Upload)","创建(上传)"
@@ -517,7 +512,6 @@
 "Product links API (related, cross sells, up sells)","产品链接API(相关、交叉销售、超售)"
 "Product name","产品名"
 "Product types API","产品类型API"
-"Product with this combination of attributes already associated to configurable.","具有此属性组合的产品已与可配置产品关联。"
 "Products","产品"
 "Products Comparison List","产品比较列表"
 "Products Information","产品信息"
@@ -598,7 +592,6 @@
 "Save and Continue Edit","保存并继续编辑"
 "Saved %d record(s)","已保存 %s 条记录"
 "Scope","范围"
-"Scope must not be changed, because the attribute is used in configurable products.","范围不能更改,因为可配置产品中使用了属性。"
 "Search","搜索"
 "Search Engine Optimizations","搜索引擎优化"
 "Search Information","搜索信息"
@@ -608,7 +601,6 @@
 "Searchable","可搜索"
 "See price before order confirmation.","确认订单前显示价格。"
 "Select Category...","选择分类..."
-"Select Configurable Attributes ","选择可配置属性"
 "Select Product...","选择产品..."
 "Select type of option","选择选项类型"
 "Select type options required values rows.","选择需要值的选项类型。"
@@ -700,11 +692,8 @@
 "This attribute cannot be deleted.","该属性无法被删除。"
 "This attribute cannot be edited.","该属性无法编辑。"
 "This attribute cannot be updated.","该属性无法更新。"
-"This attribute is used in configurable products.","该属性已用于可配置产品。"
-"This attribute is used in configurable products. You cannot remove it from the attribute set.","该属性用于可配置的产品。您无法从属性集中将其删除。"
 "This attribute no longer exists","该属性不存在"
 "This attribute set no longer exists.","该属性已不存在。"
-"This group contains attributes, used in configurable products. Please move these attributes to another group and try again.","该群组包含用于可配置产品的属性。请移动这些属性到另一群组并重试。"
 "This group contains system attributes. Please move system attributes to another group and try again.","该群组包含系统属性。请移动系统属性到另一群组并重试。"
 "This is a required option","这是必选的选项"
 "This product no longer exists.","该产品已不存在。"
@@ -759,7 +748,6 @@
 "Use In Search Results Layered Navigation","使用搜索结果内层次导航"
 "Use JavaScript Calendar","使用 JavaScript 日历"
 "Use Static URLs for Media Content in WYSIWYG for Catalog","为分类的所见即所得编辑中的媒体内容使用静态URL"
-"Use To Create Configurable Product","用于创建可配置的产品"
 "Use Tree Like Category Sitemap","使用树形分类站点地图"
 "Use config","用户配置"
 "Use default","使用默认"
@@ -799,7 +787,6 @@
 "Wrong option type to get group instance.","错误的选项类型来获得群组实例。"
 "Wrong product instance type in options group.","选项组中错误的产品实例类型。"
 "Wrong product type filter specified","错误的已指定产品类型过滤器"
-"Wrong product type to extract configurable options.","错误的产品类型来提取可配置选项。"
 "Year Range","年份范围"
 "Yes","是"
 "You cannot remove system attribute from this set.","您无法从此集合中移除系统属性。"
diff --git a/app/code/Magento/Catalog/sql/catalog_setup/install-1.6.0.0.php b/app/code/Magento/Catalog/sql/catalog_setup/install-1.6.0.0.php
index bb86dd49870..85a03b445d1 100644
--- a/app/code/Magento/Catalog/sql/catalog_setup/install-1.6.0.0.php
+++ b/app/code/Magento/Catalog/sql/catalog_setup/install-1.6.0.0.php
@@ -1037,18 +1037,18 @@ $table = $installer->getConnection()
         'nullable'  => false,
         'primary'   => true,
         'default'   => '0',
-        ), 'Product ID')
+    ), 'Product ID')
     ->addColumn('store_id', \Magento\DB\Ddl\Table::TYPE_SMALLINT, null, array(
         'unsigned'  => true,
         'nullable'  => false,
         'primary'   => true,
         'default'   => '0',
-        ), 'Store ID')
+    ), 'Store ID')
     ->addColumn('visibility', \Magento\DB\Ddl\Table::TYPE_SMALLINT, null, array(
         'unsigned'  => true,
         'nullable'  => false,
         'default'   => '0',
-        ), 'Visibility')
+    ), 'Visibility')
     ->addIndex($installer->getIdxName('catalog_product_enabled_index', array('store_id')),
         array('store_id'))
     ->addForeignKey(
@@ -1341,189 +1341,6 @@ $table = $installer->getConnection()
     ->setComment('Catalog Product Link Varchar Attribute Table');
 $installer->getConnection()->createTable($table);
 
-/**
- * Create table 'catalog_product_super_attribute'
- */
-$table = $installer->getConnection()
-    ->newTable($installer->getTable('catalog_product_super_attribute'))
-    ->addColumn('product_super_attribute_id', \Magento\DB\Ddl\Table::TYPE_INTEGER, null, array(
-        'identity'  => true,
-        'unsigned'  => true,
-        'nullable'  => false,
-        'primary'   => true,
-        ), 'Product Super Attribute ID')
-    ->addColumn('product_id', \Magento\DB\Ddl\Table::TYPE_INTEGER, null, array(
-        'unsigned'  => true,
-        'nullable'  => false,
-        'default'   => '0',
-        ), 'Product ID')
-    ->addColumn('attribute_id', \Magento\DB\Ddl\Table::TYPE_SMALLINT, null, array(
-        'unsigned'  => true,
-        'nullable'  => false,
-        'default'   => '0',
-        ), 'Attribute ID')
-    ->addColumn('position', \Magento\DB\Ddl\Table::TYPE_SMALLINT, null, array(
-        'unsigned'  => true,
-        'nullable'  => false,
-        'default'   => '0',
-        ), 'Position')
-    ->addIndex($installer->getIdxName('catalog_product_super_attribute', array('product_id')),
-        array('product_id'))
-    ->addForeignKey(
-        $installer->getFkName('catalog_product_super_attribute', 'product_id', 'catalog_product_entity', 'entity_id'),
-        'product_id', $installer->getTable('catalog_product_entity'), 'entity_id',
-        \Magento\DB\Ddl\Table::ACTION_CASCADE, \Magento\DB\Ddl\Table::ACTION_NO_ACTION)
-    ->setComment('Catalog Product Super Attribute Table');
-$installer->getConnection()->createTable($table);
-
-/**
- * Create table 'catalog_product_super_attribute_label'
- */
-$table = $installer->getConnection()
-    ->newTable($installer->getTable('catalog_product_super_attribute_label'))
-    ->addColumn('value_id', \Magento\DB\Ddl\Table::TYPE_INTEGER, null, array(
-        'identity'  => true,
-        'unsigned'  => true,
-        'nullable'  => false,
-        'primary'   => true,
-        ), 'Value ID')
-    ->addColumn('product_super_attribute_id', \Magento\DB\Ddl\Table::TYPE_INTEGER, null, array(
-        'unsigned'  => true,
-        'nullable'  => false,
-        'default'   => '0',
-        ), 'Product Super Attribute ID')
-    ->addColumn('store_id', \Magento\DB\Ddl\Table::TYPE_SMALLINT, null, array(
-        'unsigned'  => true,
-        'nullable'  => false,
-        'default'   => '0',
-        ), 'Store ID')
-    ->addColumn('use_default', \Magento\DB\Ddl\Table::TYPE_SMALLINT, null, array(
-        'unsigned'  => true,
-        'default'   => '0',
-        ), 'Use Default Value')
-    ->addColumn('value', \Magento\DB\Ddl\Table::TYPE_TEXT, 255, array(
-        ), 'Value')
-    ->addIndex(
-        $installer->getIdxName(
-            'catalog_product_super_attribute_label',
-            array('product_super_attribute_id', 'store_id'),
-            \Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE
-        ),
-        array('product_super_attribute_id', 'store_id'),
-        array('type' => \Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE))
-    ->addIndex($installer->getIdxName('catalog_product_super_attribute_label', array('product_super_attribute_id')),
-        array('product_super_attribute_id'))
-    ->addIndex($installer->getIdxName('catalog_product_super_attribute_label', array('store_id')),
-        array('store_id'))
-    ->addForeignKey(
-        $installer->getFkName(
-            'catalog_product_super_attribute_label',
-            'product_super_attribute_id',
-            'catalog_product_super_attribute',
-            'product_super_attribute_id'
-        ),
-        'product_super_attribute_id', $installer->getTable('catalog_product_super_attribute'),
-        'product_super_attribute_id',
-        \Magento\DB\Ddl\Table::ACTION_CASCADE, \Magento\DB\Ddl\Table::ACTION_CASCADE)
-    ->addForeignKey(
-        $installer->getFkName('catalog_product_super_attribute_label', 'store_id', 'core_store', 'store_id'),
-        'store_id', $installer->getTable('core_store'), 'store_id',
-        \Magento\DB\Ddl\Table::ACTION_CASCADE, \Magento\DB\Ddl\Table::ACTION_CASCADE)
-    ->setComment('Catalog Product Super Attribute Label Table');
-$installer->getConnection()->createTable($table);
-
-/**
- * Create table 'catalog_product_super_attribute_pricing'
- */
-$table = $installer->getConnection()
-    ->newTable($installer->getTable('catalog_product_super_attribute_pricing'))
-    ->addColumn('value_id', \Magento\DB\Ddl\Table::TYPE_INTEGER, null, array(
-        'identity'  => true,
-        'unsigned'  => true,
-        'nullable'  => false,
-        'primary'   => true,
-        ), 'Value ID')
-    ->addColumn('product_super_attribute_id', \Magento\DB\Ddl\Table::TYPE_INTEGER, null, array(
-        'unsigned'  => true,
-        'nullable'  => false,
-        'default'   => '0',
-        ), 'Product Super Attribute ID')
-    ->addColumn('value_index', \Magento\DB\Ddl\Table::TYPE_TEXT, 255, array(
-        'nullable'  => true,
-        'default'   => null,
-        ), 'Value Index')
-    ->addColumn('is_percent', \Magento\DB\Ddl\Table::TYPE_SMALLINT, null, array(
-        'unsigned'  => true,
-        'default'   => '0',
-        ), 'Is Percent')
-    ->addColumn('pricing_value', \Magento\DB\Ddl\Table::TYPE_DECIMAL, '12,4', array(
-        ), 'Pricing Value')
-    ->addColumn('website_id', \Magento\DB\Ddl\Table::TYPE_SMALLINT, null, array(
-        'unsigned'  => true,
-        'nullable'  => false,
-        'default'   => '0',
-        ), 'Website ID')
-    ->addIndex($installer->getIdxName('catalog_product_super_attribute_pricing', array('product_super_attribute_id')),
-        array('product_super_attribute_id'))
-    ->addIndex($installer->getIdxName('catalog_product_super_attribute_pricing', array('website_id')),
-        array('website_id'))
-    ->addForeignKey(
-        $installer->getFkName(
-            'catalog_product_super_attribute_pricing',
-            'website_id',
-            'core_website',
-            'website_id'
-        ),
-        'website_id', $installer->getTable('core_website'), 'website_id',
-        \Magento\DB\Ddl\Table::ACTION_CASCADE, \Magento\DB\Ddl\Table::ACTION_CASCADE)
-    ->addForeignKey(
-        $installer->getFkName(
-            'catalog_product_super_attribute_pricing',
-            'product_super_attribute_id',
-            'catalog_product_super_attribute',
-            'product_super_attribute_id'
-        ),
-        'product_super_attribute_id',
-        $installer->getTable('catalog_product_super_attribute'),
-        'product_super_attribute_id',
-        \Magento\DB\Ddl\Table::ACTION_CASCADE, \Magento\DB\Ddl\Table::ACTION_CASCADE)
-    ->setComment('Catalog Product Super Attribute Pricing Table');
-$installer->getConnection()->createTable($table);
-
-/**
- * Create table 'catalog_product_super_link'
- */
-$table = $installer->getConnection()
-    ->newTable($installer->getTable('catalog_product_super_link'))
-    ->addColumn('link_id', \Magento\DB\Ddl\Table::TYPE_INTEGER, null, array(
-        'identity'  => true,
-        'unsigned'  => true,
-        'nullable'  => false,
-        'primary'   => true,
-        ), 'Link ID')
-    ->addColumn('product_id', \Magento\DB\Ddl\Table::TYPE_INTEGER, null, array(
-        'unsigned'  => true,
-        'nullable'  => false,
-        'default'   => '0',
-        ), 'Product ID')
-    ->addColumn('parent_id', \Magento\DB\Ddl\Table::TYPE_INTEGER, null, array(
-        'unsigned'  => true,
-        'nullable'  => false,
-        'default'   => '0',
-        ), 'Parent ID')
-    ->addIndex($installer->getIdxName('catalog_product_super_link', array('parent_id')),
-        array('parent_id'))
-    ->addIndex($installer->getIdxName('catalog_product_super_link', array('product_id')),
-        array('product_id'))
-    ->addForeignKey($installer->getFkName('catalog_product_super_link', 'product_id', 'catalog_product_entity', 'entity_id'),
-        'product_id', $installer->getTable('catalog_product_entity'), 'entity_id',
-        \Magento\DB\Ddl\Table::ACTION_CASCADE, \Magento\DB\Ddl\Table::ACTION_CASCADE)
-    ->addForeignKey($installer->getFkName('catalog_product_super_link', 'parent_id', 'catalog_product_entity', 'entity_id'),
-        'parent_id', $installer->getTable('catalog_product_entity'), 'entity_id',
-        \Magento\DB\Ddl\Table::ACTION_CASCADE, \Magento\DB\Ddl\Table::ACTION_CASCADE)
-    ->setComment('Catalog Product Super Link Table');
-$installer->getConnection()->createTable($table);
-
 /**
  * Create table 'catalog_product_entity_tier_price'
  */
@@ -2087,11 +1904,6 @@ $table = $installer->getConnection()
         'nullable'  => false,
         'default'   => '0',
         ), 'Is Used For Sorting')
-    ->addColumn('is_configurable', \Magento\DB\Ddl\Table::TYPE_SMALLINT, null, array(
-        'unsigned'  => true,
-        'nullable'  => false,
-        'default'   => '1',
-        ), 'Is Configurable')
     ->addColumn('apply_to', \Magento\DB\Ddl\Table::TYPE_TEXT, 255, array(
         'nullable'  => true,
         ), 'Apply To')
@@ -2973,30 +2785,30 @@ $table = $installer->getConnection()
         'unsigned'  => true,
         'nullable'  => false,
         'default'   => '0',
-        ), 'Category ID')
+    ), 'Category ID')
     ->addColumn('product_id', \Magento\DB\Ddl\Table::TYPE_INTEGER, null, array(
         'unsigned'  => true,
         'nullable'  => false,
         'default'   => '0',
-        ), 'Product ID')
+    ), 'Product ID')
     ->addColumn('position', \Magento\DB\Ddl\Table::TYPE_INTEGER, null, array(
         'nullable'  => false,
         'default'   => '0',
-        ), 'Position')
+    ), 'Position')
     ->addColumn('is_parent', \Magento\DB\Ddl\Table::TYPE_SMALLINT, null, array(
         'unsigned'  => true,
         'nullable'  => false,
         'default'   => '0',
-        ), 'Is Parent')
+    ), 'Is Parent')
     ->addColumn('store_id', \Magento\DB\Ddl\Table::TYPE_SMALLINT, null, array(
         'unsigned'  => true,
         'nullable'  => false,
         'default'   => '0',
-        ), 'Store ID')
+    ), 'Store ID')
     ->addColumn('visibility', \Magento\DB\Ddl\Table::TYPE_SMALLINT, null, array(
         'unsigned'  => true,
         'nullable'  => false,
-        ), 'Visibility')
+    ), 'Visibility')
     ->addIndex(
         $installer->getIdxName(
             'catalog_category_product_index_idx',
@@ -3015,30 +2827,30 @@ $table = $installer->getConnection()
         'unsigned'  => true,
         'nullable'  => false,
         'default'   => '0',
-        ), 'Category ID')
+    ), 'Category ID')
     ->addColumn('product_id', \Magento\DB\Ddl\Table::TYPE_INTEGER, null, array(
         'unsigned'  => true,
         'nullable'  => false,
         'default'   => '0',
-        ), 'Product ID')
+    ), 'Product ID')
     ->addColumn('position', \Magento\DB\Ddl\Table::TYPE_INTEGER, null, array(
         'nullable'  => false,
         'default'   => '0',
-        ), 'Position')
+    ), 'Position')
     ->addColumn('is_parent', \Magento\DB\Ddl\Table::TYPE_SMALLINT, null, array(
         'unsigned'  => true,
         'nullable'  => false,
         'default'   => '0',
-        ), 'Is Parent')
+    ), 'Is Parent')
     ->addColumn('store_id', \Magento\DB\Ddl\Table::TYPE_SMALLINT, null, array(
         'unsigned'  => true,
         'nullable'  => false,
         'default'   => '0',
-        ), 'Store ID')
+    ), 'Store ID')
     ->addColumn('visibility', \Magento\DB\Ddl\Table::TYPE_SMALLINT, null, array(
         'unsigned'  => true,
         'nullable'  => false,
-        ), 'Visibility')
+    ), 'Visibility')
     ->setComment('Catalog Category Product Indexer Temp Table');
 $installer->getConnection()->createTable($table);
 
@@ -3051,12 +2863,12 @@ $table = $installer->getConnection()
         'unsigned'  => true,
         'nullable'  => false,
         'default'   => '0',
-        ), 'Product ID')
+    ), 'Product ID')
     ->addColumn('visibility', \Magento\DB\Ddl\Table::TYPE_INTEGER, null, array(
         'unsigned'  => true,
         'nullable'  => false,
         'default'   => '0',
-        ), 'Visibility')
+    ), 'Visibility')
     ->addIndex($installer->getIdxName('catalog_category_product_index_enbl_idx', array('product_id')),
         array('product_id'))
     ->setComment('Catalog Category Product Enabled Indexer Index Table');
@@ -3071,12 +2883,12 @@ $table = $installer->getConnection()
         'unsigned'  => true,
         'nullable'  => false,
         'default'   => '0',
-        ), 'Product ID')
+    ), 'Product ID')
     ->addColumn('visibility', \Magento\DB\Ddl\Table::TYPE_INTEGER, null, array(
         'unsigned'  => true,
         'nullable'  => false,
         'default'   => '0',
-        ), 'Visibility')
+    ), 'Visibility')
     ->addIndex($installer->getIdxName('catalog_category_product_index_enbl_tmp', array('product_id')),
         array('product_id'))
     ->setComment('Catalog Category Product Enabled Indexer Temp Table');
@@ -3091,11 +2903,11 @@ $table = $installer->getConnection()
         'unsigned'  => true,
         'nullable'  => false,
         'default'   => '0',
-        ), 'Category ID')
+    ), 'Category ID')
     ->addColumn('path', \Magento\DB\Ddl\Table::TYPE_TEXT, 255, array(
         'nullable'  => true,
         'default'   => null,
-        ), 'Path')
+    ), 'Path')
     ->addIndex($installer->getIdxName('catalog_category_anc_categs_index_idx', array('category_id')),
         array('category_id'))
     ->setComment('Catalog Category Anchor Indexer Index Table');
@@ -3110,11 +2922,11 @@ $table = $installer->getConnection()
         'unsigned'  => true,
         'nullable'  => false,
         'default'   => '0',
-        ), 'Category ID')
+    ), 'Category ID')
     ->addColumn('path', \Magento\DB\Ddl\Table::TYPE_TEXT, 255, array(
         'nullable'  => true,
         'default'   => null,
-        ), 'Path')
+    ), 'Path')
     ->addIndex($installer->getIdxName('catalog_category_anc_categs_index_tmp', array('category_id')),
         array('category_id'))
     ->setComment('Catalog Category Anchor Indexer Temp Table');
@@ -3129,15 +2941,15 @@ $table = $installer->getConnection()
         'unsigned'  => true,
         'nullable'  => false,
         'default'   => '0',
-        ), 'Category ID')
+    ), 'Category ID')
     ->addColumn('product_id', \Magento\DB\Ddl\Table::TYPE_INTEGER, null, array(
         'unsigned'  => true,
         'nullable'  => false,
         'default'   => '0',
-        ), 'Product ID')
+    ), 'Product ID')
     ->addColumn('position', \Magento\DB\Ddl\Table::TYPE_INTEGER, null, array(
         'unsigned'  => true,
-        ), 'Position')
+    ), 'Position')
     ->setComment('Catalog Category Anchor Product Indexer Index Table');
 $installer->getConnection()->createTable($table);
 
@@ -3150,19 +2962,17 @@ $table = $installer->getConnection()
         'unsigned'  => true,
         'nullable'  => false,
         'default'   => '0',
-        ), 'Category ID')
+    ), 'Category ID')
     ->addColumn('product_id', \Magento\DB\Ddl\Table::TYPE_INTEGER, null, array(
         'unsigned'  => true,
         'nullable'  => false,
         'default'   => '0',
-        ), 'Product ID')
+    ), 'Product ID')
     ->setComment('Catalog Category Anchor Product Indexer Temp Table');
 $installer->getConnection()->createTable($table);
 
-
 /**
  * Modify core/url_rewrite table
- *
  */
 $installer->getConnection()->addColumn($installer->getTable('core_url_rewrite'), 'category_id', array(
     'type'      => \Magento\DB\Ddl\Table::TYPE_INTEGER,
diff --git a/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.0-1.6.0.0.1.php b/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.0-1.6.0.0.1.php
index 0f3837dff5a..a7df86b2f0c 100644
--- a/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.0-1.6.0.0.1.php
+++ b/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.0-1.6.0.0.1.php
@@ -30,7 +30,6 @@ $installer = $this;
 $productTypes = array(
     \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE,
     \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE,
-    \Magento\Catalog\Model\Product\Type::TYPE_CONFIGURABLE,
     \Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL
 );
 $productTypes = join(',', $productTypes);
diff --git a/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.0.1-1.6.0.0.2.php b/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.0.1-1.6.0.0.2.php
index bba182665a1..659ada1cf31 100644
--- a/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.0.1-1.6.0.0.2.php
+++ b/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.0.1-1.6.0.0.2.php
@@ -43,6 +43,5 @@ $installer->addAttribute(\Magento\Catalog\Model\Product::ENTITY, 'country_of_man
     'comparable'        => false,
     'visible_on_front'  => false,
     'unique'            => false,
-    'apply_to'          => 'simple,configurable,bundle',
-    'is_configurable'   => false,
+    'apply_to'          => 'simple,bundle',
 ));
diff --git a/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.0.17-1.6.0.0.18.php b/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.0.17-1.6.0.0.18.php
index aef4985808e..a0d3c494bb3 100644
--- a/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.0.17-1.6.0.0.18.php
+++ b/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.0.17-1.6.0.0.18.php
@@ -44,5 +44,4 @@ $this->addAttribute(\Magento\Catalog\Model\Product::ENTITY, 'quantity_and_stock_
     'filterable'        => false,
     'comparable'        => false,
     'unique'            => false,
-    'is_configurable'   => false,
 ));
diff --git a/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.0.6-1.6.0.0.7.php b/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.0.6-1.6.0.0.7.php
index 83392626ac3..3bddde73ef6 100644
--- a/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.0.6-1.6.0.0.7.php
+++ b/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.0.6-1.6.0.0.7.php
@@ -18,10 +18,8 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Catalog
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
 /** @var $installer \Magento\Catalog\Model\Resource\Setup */
@@ -36,4 +34,4 @@ $installer->getConnection()->addColumn(
         'nullable'  => true,
         'comment'   => 'Position'
     )
-);
\ No newline at end of file
+);
diff --git a/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.0.7-1.6.0.0.8.php b/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.0.7-1.6.0.0.8.php
index 0c46568013a..d5b839c67d6 100644
--- a/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.0.7-1.6.0.0.8.php
+++ b/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.0.7-1.6.0.0.8.php
@@ -94,4 +94,4 @@ $connection->addIndex(
         array('path', 'entity_id')
     ),
     array('path', 'entity_id')
-);
\ No newline at end of file
+);
diff --git a/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.0.9-1.6.0.0.10.php b/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.0.9-1.6.0.0.10.php
index 7fc37f3e672..ade6e2337cd 100644
--- a/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.0.9-1.6.0.0.10.php
+++ b/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.0.9-1.6.0.0.10.php
@@ -113,7 +113,7 @@ $installer->addAttribute('catalog_product', 'group_price', array(
     'required'                   => false,
     'sort_order'                 => 6,
     'global'                     => \Magento\Catalog\Model\Resource\Eav\Attribute::SCOPE_WEBSITE,
-    'apply_to'                   => 'simple,configurable,virtual',
+    'apply_to'                   => 'simple,virtual',
     'group'                      => 'Prices',
 ));
 
diff --git a/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.24-1.6.0.0.25.php b/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.24-1.6.0.0.25.php
new file mode 100644
index 00000000000..b468241f098
--- /dev/null
+++ b/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.24-1.6.0.0.25.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+/** @var \Magento\Catalog\Model\Resource\Setup $this */
+$this->updateAttribute(
+    \Magento\Catalog\Model\Product::ENTITY,
+    'status',
+    'source_model',
+    'Magento\Catalog\Model\Product\Attribute\Source\Status'
+);
diff --git a/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.25-1.6.0.0.26.php b/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.25-1.6.0.0.26.php
new file mode 100644
index 00000000000..cd01d3b5129
--- /dev/null
+++ b/app/code/Magento/Catalog/sql/catalog_setup/upgrade-1.6.0.25-1.6.0.0.26.php
@@ -0,0 +1,50 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+/** @var \Magento\DB\Adapter\AdapterInterface $connection */
+$connection = $this->getConnection();
+
+/** @var \Magento\Catalog\Model\Resource\Setup $this */
+$connection
+    ->dropForeignKey(
+        $this->getTable('catalog_category_product_index'),
+        $this->getFkName('catalog_category_product_index', 'category_id', 'catalog_category_entity', 'entity_id')
+    )
+    ->dropForeignKey(
+        $this->getTable('catalog_category_product_index'),
+        $this->getFkName('catalog_category_product_index', 'product_id', 'catalog_product_entity', 'entity_id')
+    )
+    ->dropForeignKey(
+        $this->getTable('catalog_category_product_index'),
+        $this->getFkName('catalog_category_product_index', 'store_id', 'core_store', 'store_id')
+    );
+
+$connection->dropTable($this->getTable('catalog_product_enabled_index'));
+$connection->dropTable($this->getTable('catalog_category_product_index_idx'));
+$connection->dropTable($this->getTable('catalog_category_product_index_enbl_idx'));
+$connection->dropTable($this->getTable('catalog_category_product_index_enbl_tmp'));
+$connection->dropTable($this->getTable('catalog_category_anc_categs_index_idx'));
+$connection->dropTable($this->getTable('catalog_category_anc_categs_index_tmp'));
+$connection->dropTable($this->getTable('catalog_category_anc_products_index_idx'));
+$connection->dropTable($this->getTable('catalog_category_anc_products_index_tmp'));
diff --git a/app/code/Magento/Catalog/view/adminhtml/catalog/product.js b/app/code/Magento/Catalog/view/adminhtml/catalog/product.js
index 0e18d017385..92e28823629 100644
--- a/app/code/Magento/Catalog/view/adminhtml/catalog/product.js
+++ b/app/code/Magento/Catalog/view/adminhtml/catalog/product.js
@@ -77,17 +77,6 @@ var Product = {};
             });
         }
     });
-
-    $.widget("mage.configurableAttribute", $.mage.productAttributes, {
-        _prepareUrl: function() {
-            var name = $('#configurable-attribute-selector').val();
-            return this.options.url +
-                (/\?/.test(this.options.url) ? '&' : '?') +
-                'set=' + window.encodeURIComponent($('#attribute_set_id').val()) +
-                '&attribute[frontend_label]=' +
-                window.encodeURIComponent(name);
-        }
-    });
 })(jQuery);
 
 var onInitDisableFieldsList = [];
diff --git a/app/code/Magento/Catalog/view/adminhtml/catalog/product/attribute/js.phtml b/app/code/Magento/Catalog/view/adminhtml/catalog/product/attribute/js.phtml
index e8f3ce09952..3b7dd5c5caf 100644
--- a/app/code/Magento/Catalog/view/adminhtml/catalog/product/attribute/js.phtml
+++ b/app/code/Magento/Catalog/view/adminhtml/catalog/product/attribute/js.phtml
@@ -65,7 +65,6 @@ function bindAttributeInputType()
 {
     checkOptionsPanelVisibility();
     switchDefaultValueField();
-    checkIsConfigurableVisibility();
     if($('frontend_input') && ($('frontend_input').value=='select' || $('frontend_input').value=='multiselect' || $('frontend_input').value=='price')){
         if($('is_filterable') && !$('is_filterable').getAttribute('readonly')){
             $('is_filterable').disabled = false;
@@ -227,10 +226,7 @@ function switchDefaultValueField()
         default:
             getFrontTab().show();
 
-            setRowVisibility('is_required', true);
-            setRowVisibility('is_unique', true);
-            setRowVisibility('frontend_class', true);
-            setRowVisibility('is_configurable', true);
+            showDefaultRows();
         break;
     }
 
@@ -246,6 +242,13 @@ function switchDefaultValueField()
     }
 }
 
+function showDefaultRows()
+{
+    setRowVisibility('is_required', true);
+    setRowVisibility('is_unique', true);
+    setRowVisibility('frontend_class', true);
+}
+
 function setRowVisibility(id, isVisible)
 {
     if ($(id)) {
@@ -261,15 +264,6 @@ function setRowVisibility(id, isVisible)
     }
 }
 
-function checkIsConfigurableVisibility()
-{
-    if (!$('is_configurable') || !$('is_global') || !$('frontend_input')) return;
-    if ($F('is_global')==1 && $F('frontend_input')=='select') {
-        setRowVisibility('is_configurable', true);
-    } else {
-        setRowVisibility('is_configurable', false);
-    }
-}
 
 function updateRequriedOptions()
 {
@@ -317,7 +311,6 @@ function saveAttributeInNewSet(promptMessage)
 if($('frontend_input')){
     Event.observe($('frontend_input'), 'change', updateRequriedOptions);
     Event.observe($('frontend_input'), 'change', bindAttributeInputType);
-    Event.observe($('is_global'), 'change', checkIsConfigurableVisibility);
 }
 
 if ($('is_filterable')) {
@@ -327,9 +320,9 @@ if ($('is_filterable')) {
 if ($('is_required')) {
     Event.observe($('is_required'), 'change', updateRequriedOptions);
 }
-bindAttributeInputType();
 
 jQuery(function($) {
+    bindAttributeInputType();
     // @todo: refactor collapsable component
     $('.attribute-popup .collapse, [data-role="advanced_fieldset-content"]')
         .collapsable()
diff --git a/app/code/Magento/Catalog/view/adminhtml/catalog/product/attribute/set/main.phtml b/app/code/Magento/Catalog/view/adminhtml/catalog/product/attribute/set/main.phtml
index 1ba25a0126c..57d8f38f403 100644
--- a/app/code/Magento/Catalog/view/adminhtml/catalog/product/attribute/set/main.phtml
+++ b/app/code/Magento/Catalog/view/adminhtml/catalog/product/attribute/set/main.phtml
@@ -195,7 +195,7 @@
                 }
             }
 
-            var editSet = function() {
+            editSet = function() {
                 return {
                     register : function(node) {
                         editSet.currentNode = node;
@@ -215,10 +215,6 @@
                             return;
                         }
 
-                        if (editSet.ConfigurableNodeExists(editSet.currentNode)) {
-                            alert('<?php echo $this->escapeJsQuote(__('This group contains attributes used in configurable products. Please move these attributes to another group and try again.')) ?>');
-                            return;
-                        }
 
                         if( editSet.currentNode && editSet.currentNode.attributes.cls == 'folder' ) {
                             TreePanels.root.removeChild(editSet.currentNode);
@@ -248,18 +244,6 @@
                         }
                     },
 
-                    ConfigurableNodeExists : function(currentNode) {
-                        for (var i in currentNode.childNodes ) {
-                            if (currentNode.childNodes[i].id) {
-                                child = editSet.currentNode.childNodes[i];
-                                if (child.attributes.is_configurable) {
-                                    return true;
-                                }
-                            }
-                        }
-                        return false;
-                    },
-
                     rightAppend : function(node) {
                         return;
                     },
@@ -363,12 +347,7 @@
                         if (node.attributes.is_user_defined == 0) {
                             alert('<?php echo $this->escapeJsQuote(__('You cannot remove system attributes from this set.')) ?>');
                             return false;
-                        }
-                        else if (node.attributes.is_configurable == 1) {
-                            alert('<?php echo $this->escapeJsQuote(__('This attribute is used in configurable products. You cannot remove it from the attribute set.')) ?>');
-                            return false;
-                        }
-                        else {
+                        } else {
                             return true;
                         }
                     },
@@ -382,9 +361,6 @@
                         if (node.attributes.is_unassignable == 0) {
                             alert('<?php echo $this->escapeJsQuote(__('You cannot remove system attributes from this set.')) ?>');
                             return false;
-                        } else if (node.attributes.is_configurable == 1) {
-                            alert('<?php echo $this->escapeJsQuote(__('This attribute is used in configurable products. You cannot remove it from the attribute set.')) ?>');
-                            return false;
                         } else {
                             return true;
                         }
@@ -434,8 +410,10 @@
                 editSet.req.removeGroups = new Array();
             }
 
-            initVars();
-            Ext.EventManager.onDocumentReady(TreePanels.init, TreePanels, true);
+            jQuery(function() {
+                initVars();
+                TreePanels.init();
+            });
             //]]>
             </script>
     </div>
diff --git a/app/code/Magento/Catalog/view/adminhtml/catalog/product/composite/configure.phtml b/app/code/Magento/Catalog/view/adminhtml/catalog/product/composite/configure.phtml
index 1b8f3ab4a14..5729075cff8 100644
--- a/app/code/Magento/Catalog/view/adminhtml/catalog/product/composite/configure.phtml
+++ b/app/code/Magento/Catalog/view/adminhtml/catalog/product/composite/configure.phtml
@@ -25,7 +25,7 @@
  */
  ?>
 <div id="product_composite_configure" class="product-configure-popup" style="display:none;">
-    <iframe name="product_composite_configure_iframe" id="product_composite_configure_iframe" src="#" style="width:0; height:0; border:0px solid #fff; position:absolute; top:-1000px; left:-1000px" onload="window.productConfigure && productConfigure.onLoadIFrame()"></iframe>
+    <iframe name="product_composite_configure_iframe" id="product_composite_configure_iframe" style="width:0; height:0; border:0px solid #fff; position:absolute; top:-1000px; left:-1000px" onload="window.productConfigure && productConfigure.onLoadIFrame()"></iframe>
     <form action="" method="post" id="product_composite_configure_form" enctype="multipart/form-data" onsubmit="productConfigure.onConfirmBtn(); return false;" target="product_composite_configure_iframe">
         <div class="entry-edit">
             <div id="product_composite_configure_messages" style="display: none;" >
diff --git a/app/code/Magento/Catalog/view/adminhtml/catalog/product/created.phtml b/app/code/Magento/Catalog/view/adminhtml/catalog/product/created.phtml
deleted file mode 100644
index 8ed787b82db..00000000000
--- a/app/code/Magento/Catalog/view/adminhtml/catalog/product/created.phtml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Academic Free License (AFL 3.0)
- * that is bundled with this package in the file LICENSE_AFL.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/afl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    design
- * @package     default_default
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
- */
-?>
-<script type="text/javascript">
-var added = false;
-function addProduct(closeAfter) {
-    if(window.opener!=null && !added) {
-        <?php if($this->isEdit()): ?>
-        window.opener.superProduct.updateProduct(<?php echo $this->getProductId() ?>, <?php echo $this->getAttributesJson(); ?>);
-        <?php else: ?>
-        window.opener.superProduct.addNewProduct(<?php echo $this->getProductId() ?>, <?php echo $this->getAttributesJson(); ?>);
-        window.opener.superProduct.showNoticeMessage();
-        <?php endif; ?>
-        added = true;
-    }
-
-    if(closeAfter)
-    {
-        closeWindow();
-    }
-}
-
-function closeWindow()
-{
-    if (window.opener) {
-        window.opener.focus();
-    }
-    window.close();
-}
-
-addProduct(false);
-setTimeout(closeWindow, 3000);
-</script>
-<div class="a-center">
-<?php echo $this->getCloseButtonHtml() ?>
-</div>
diff --git a/app/code/Magento/Catalog/view/adminhtml/catalog/product/edit.phtml b/app/code/Magento/Catalog/view/adminhtml/catalog/product/edit.phtml
index cc8b65140a0..9175dfe7518 100644
--- a/app/code/Magento/Catalog/view/adminhtml/catalog/product/edit.phtml
+++ b/app/code/Magento/Catalog/view/adminhtml/catalog/product/edit.phtml
@@ -54,9 +54,6 @@
 
     <?php if($this->getProductId()): ?>
         <?php echo $this->getDeleteButtonHtml() ?>
-        <?php if($this->getProductSetId() && $this->getIsConfigured()): ?>
-            <?php echo $this->getDuplicateButtonHtml() ?>
-        <?php endif; ?>
     <?php endif; ?>
     <?php if ($this->getProductSetId()): ?>
         <?php echo $this->getChangeAttributeSetButtonHtml() ?>
diff --git a/app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_new.xml b/app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_new.xml
index 91159ae119f..918f4ffae78 100644
--- a/app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_new.xml
+++ b/app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_new.xml
@@ -81,11 +81,6 @@
                 <argument name="file" xsi:type="string">Magento_Catalog::catalog/type-switcher.js</argument>
             </arguments>
         </block>
-        <block class="Magento\Theme\Block\Html\Head\Script" name="magento-adminhtml-catalog-product-variation-js">
-            <arguments>
-                <argument name="file" xsi:type="string">Magento_Catalog::catalog/product-variation.js</argument>
-            </arguments>
-        </block>
         <block class="Magento\Theme\Block\Html\Head\Script" name="magento-adminhtml-catalog-base-image-uploader-js">
             <arguments>
                 <argument name="file" xsi:type="string">Magento_Catalog::catalog/base-image-uploader.js</argument>
@@ -119,7 +114,6 @@
         </block>
         <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\AttributeSet" name="attribute-set-info" template="Magento_Catalog::catalog/product/edit/attribute_set.phtml"/>
         <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\NewCategory" name="new-category" template="Magento_Catalog::catalog/product/edit/category/new/form.phtml"/>
-        <block class="Magento\View\Element\Template" name="affected-attribute-set-form" template="Magento_Catalog::product/configurable/affected-attribute-set-selector/form.phtml"/>
     </referenceContainer>
     <referenceContainer name="left">
         <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tabs" name="product_tabs">
@@ -142,7 +136,5 @@
     <referenceContainer name="js">
         <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Js" name="catalog_product_js" template="catalog/product/js.phtml"/>
         <block class="Magento\View\Element\Template" template="Magento_Catalog::catalog/wysiwyg/js.phtml"/>
-        <block class="Magento\Catalog\Block\Product\Configurable\AttributeSelector" template="Magento_Catalog::product/configurable/attribute-selector/js.phtml"/>
-        <block class="Magento\Catalog\Block\Product\Configurable\AttributeSelector" template="Magento_Catalog::product/configurable/affected-attribute-set-selector/js.phtml"/>
     </referenceContainer>
 </layout>
diff --git a/app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_set_edit.xml b/app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_set_edit.xml
new file mode 100644
index 00000000000..1a1215cd168
--- /dev/null
+++ b/app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_set_edit.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <referenceContainer name="content">
+        <block class="Magento\Catalog\Block\Adminhtml\Product\Attribute\Set\Main"
+               name="adminhtml.catalog.product.set.edit"
+               template="catalog/product/attribute/set/main.phtml"/>
+    </referenceContainer>
+</layout>
diff --git a/app/code/Magento/Catalog/view/adminhtml/product/product.css b/app/code/Magento/Catalog/view/adminhtml/product/product.css
index 54a508adde2..f1c3c2b4eb0 100644
--- a/app/code/Magento/Catalog/view/adminhtml/product/product.css
+++ b/app/code/Magento/Catalog/view/adminhtml/product/product.css
@@ -536,301 +536,6 @@
     color: #888;
 }
 
-/* Variations Search Field */
-#variations-search-field {
-    margin-bottom: 16px;
-}
-
-#variations-search-field > .control {
-    position: relative;
-    width: 42%;
-}
-
-#variations-search-field > .control > input {
-    padding-right: 25px;
-}
-
-#configurable-attributes-container .field-variation > .label {
-    margin-left: -7px;
-}
-
-#configurable-attributes-container .field-variation > .control {
-    width: 43%;
-}
-
-#configurable-attributes-container {
-    margin-bottom: 23px;
-}
-
-#configurable-attributes-container .col-name {
-    width: 65%;
-}
-
-#configurable-attributes-container .col-include {
-    width: 80px;
-}
-
-#configurable-attributes-container .col-actions {
-    width: 80px;
-}
-
-#configurable-attributes-container .col-change-price {
-    width: 150px;
-}
-
-#configurable-attributes-container .field-change-pricing .field {
-    float: left;
-}
-
-#configurable-attributes-container .field-change-pricing .field-pricing-value {
-    width: 75px;
-}
-
-#configurable-attributes-container .field-change-pricing .action-toggle {
-    min-width: 40px;
-}
-
-@media screen and (max-width: 960px) {
-    [class^="fields-group-"] .field {
-        width: auto !important;
-    }
-}
-
-#configurable-attributes-container .field-pricing-value .control {
-    width: 75px;
-}
-
-#configurable-attributes-container .field-pricing-value .pricing-value {
-    width: 100%;
-    padding: 4px;
-    border-right: none;
-    border-radius: 4px 0 0 4px;
-}
-
-#configurable-attributes-container .field-pricing-measure select {
-    border-radius: 0 4px 4px 0;
-}
-
-/* "Generate Variations" button */
-.generate {
-    margin-bottom: 18px;
-}
-
-#product-variations-matrix > .title {
-    margin-bottom: 10px;
-}
-
-/* Variations Image Uploader */
-.eq-ie8 .actions-image-uploader .action-upload {
-    filter: none;
-}
-
-.actions-image-uploader .action-toggle,
-.actions-image-uploader .action-toggle:hover,
-.actions-image-uploader .action-toggle:active,
-.actions-image-uploader .action-toggle:focus,
-.actions-image-uploader .action-toggle[disabled] {
-    position: relative;
-    height: 33px;
-    padding-left: 2px;
-    padding-right: 2px;
-    background: #fff;
-    filter: none;
-    color: #888;
-}
-
-.actions-image-uploader.active .action-toggle {
-    border-radius: 0 5px 0 0;
-}
-
-.actions-image-uploader.active .action-toggle:after {
-    position: absolute;
-    left: 0;
-    right: 0;
-    bottom: -1px;
-    height: 1px;
-    background: #fff;
-    z-index: 991;
-    content: '';
-}
-
-.actions-image-uploader .dropdown-menu {
-    margin-top: -1px;
-    border-radius: 3px 0 3px 3px;
-}
-
-#product-variations-matrix img.variation {
-    position: relative;
-    border: 0;
-    width: 32px;
-    height: 32px;
-    z-index: 2;
-}
-
-#product-variations-matrix .action-upload {
-    position: relative;
-    border: 1px solid #b7b2a7;
-    background: #fff;
-    border-radius: 0;
-    padding: 0;
-    width: 31px;
-    height: 31px;
-    line-height: 31px;
-    text-align: center;
-    color: #9f9a91;
-    overflow: hidden;
-    cursor: default;
-    filter: none;
-}
-
-#product-variations-matrix .action-upload input[type="file"] {
-    position: absolute;
-    left: 0;
-    top: 0;
-    width: 31px;
-    height: 31px;
-    background: none;
-    border: 500px solid transparent;
-    font-size: 10em;
-    z-index: 3;
-    cursor: pointer;
-}
-
-#product-variations-matrix .action-upload:hover {
-    color: #7e7e7e;
-}
-
-#product-variations-matrix .action-upload:before {
-    font-family: 'MUI-Icons';
-    font-style: normal;
-    speak: none;
-    font-weight: normal;
-    -webkit-font-smoothing: antialiased;
-    content: '\e02d'; /* plus icon */
-    font-size: 22px;
-    position: absolute;
-    left: 0;
-    top: 0;
-    right: 0;
-    bottom: 0;
-    z-index: 1;
-    text-align: center;
-}
-
-#product-variations-matrix .action-upload.loading:before {
-    content: '';
-}
-
-#product-variations-matrix .action-upload.loading:after {
-    left: 0;
-    top: 0;
-    right: 0;
-    bottom: 0;
-    margin: 0;
-    width: 31px;
-    height: 31px;
-    z-index: 4;
-}
-
-#product-variations-matrix .action-upload span,
-#product-variations-matrix .action-choose span {
-    display: none;
-}
-
-#product-variations-matrix .action-choose,
-#product-variations-matrix .action-choose:hover,
-#product-variations-matrix .action-choose[disabled] {
-    color: #b8b3a7;
-    float: right;
-    margin: 6px 0 0 5px;
-}
-
-#product-variations-matrix .action-choose:hover {
-    color: #7e7e7e;
-}
-
-#product-variations-matrix .action-choose:before {
-    font-family: 'MUI-Icons';
-    font-style: normal;
-    speak: none;
-    font-weight: normal;
-    -webkit-font-smoothing: antialiased;
-    content: '\e03f'; /* user icon */
-}
-
-#product-variations-matrix .col-name > a + .action-choose:before {
-    content: '\e040'; /* user icon */
-    color: #a09a8c;
-}
-
-#product-variations-matrix .col-name > input {
-    width: 88%;
-}
-
-#product-variations-matrix .col-actions {
-    width: 60px;
-}
-
-#product-variations-matrix .col-name {
-    width: 30%;
-}
-
-#product-variations-matrix .col-sku {
-    width: 20%;
-}
-
-#product-variations-matrix .col-display,
-#product-variations-matrix .col-qty,
-#product-variations-matrix .col-weight {
-    width: 5%;
-}
-
-/* Select Associated Product popup window */
-#configurable_associated_products_grid .filter-actions,
-#configurable_associated_products_grid .filter {
-    display: none;
-}
-
-#product_options_container .data-table td,
-#attribute-tier_price-container .data-table td,
-#attribute-group_price-container .data-table td {
-    vertical-align: top;
-}
-
-#product_options_container .product-option-scope-checkbox {
-    margin: 10px 5px 10px 0;
-}
-
-#product_options_container .select + .product-option-scope-checkbox {
-    margin: 0 5px;
-}
-
-#allow_open_amount {
-    margin-top: 8px;
-}
-
-.mage-new-category-dialog .ui-dialog-content .fieldset {
-    padding: 0;
-    margin: 0;
-}
-
-.mage-new-category-dialog .ui-dialog-content .label {
-    width: 25%;
-}
-
-.mage-new-category-dialog .ui-dialog-content .control {
-    width: 75%;
-}
-
-.mage-new-category-dialog .ui-dialog-buttonset {
-    text-align: left;
-}
-
-.mage-new-category-dialog .ui-dialog-buttonset .action-create {
-    margin: 0 0 0 25%;
-    vertical-align: middle;
-}
-
 /*
     Advanced Pricing tab
 -------------------------------------- */
diff --git a/app/code/Magento/Catalog/view/frontend/js/msrp.js b/app/code/Magento/Catalog/view/frontend/js/msrp.js
index 89b02aac43e..7fd81dc0674 100644
--- a/app/code/Magento/Catalog/view/frontend/js/msrp.js
+++ b/app/code/Magento/Catalog/view/frontend/js/msrp.js
@@ -82,7 +82,7 @@
             this.element.trigger('addToCart', this.element);
             if (this.options.addToCartUrl) {
                 $('#map-popup').hide();
-                if (opener !== null) {
+                if (opener) {
                     opener.location.href = this.options.addToCartUrl;
                 } else {
                     location.href = this.options.addToCartUrl;
diff --git a/app/code/Magento/CatalogInventory/Block/Adminhtml/Form/Field/Stock.php b/app/code/Magento/CatalogInventory/Block/Adminhtml/Form/Field/Stock.php
index 03fd8ec3b37..d00adbfc950 100644
--- a/app/code/Magento/CatalogInventory/Block/Adminhtml/Form/Field/Stock.php
+++ b/app/code/Magento/CatalogInventory/Block/Adminhtml/Form/Field/Stock.php
@@ -56,20 +56,11 @@ class Stock extends \Magento\Data\Form\Element\Select
      */
     protected $_factoryText;
 
-    /**
-     * List of product types that treated as complex and
-     * has no quantity option if taken without their children
-     *
-     * @var array
-     */
-    protected $complexProductTypes;
-
     /**
      * @param \Magento\Data\Form\Element\Factory $factoryElement
      * @param \Magento\Data\Form\Element\CollectionFactory $factoryCollection
      * @param \Magento\Escaper $escaper
      * @param \Magento\Data\Form\Element\TextFactory $factoryText
-     * @param array $complexProductTypes
      * @param array $data
      */
     public function __construct(
@@ -77,12 +68,10 @@ class Stock extends \Magento\Data\Form\Element\Select
         \Magento\Data\Form\Element\CollectionFactory $factoryCollection,
         \Magento\Escaper $escaper,
         \Magento\Data\Form\Element\TextFactory $factoryText,
-        array $complexProductTypes = array(),
         array $data = array()
     ) {
         $this->_factoryText = $factoryText;
         $this->_qty = isset($data['qty']) ? $data['qty'] : $this->_createQtyElement();
-        $this->complexProductTypes = $complexProductTypes;
         unset($data['qty']);
         parent::__construct($factoryElement, $factoryCollection, $escaper, $data);
         $this->setName($data['name']);
@@ -204,22 +193,18 @@ class Stock extends \Magento\Data\Form\Element\Select
                         useConfigManageStockField = $('#inventory_use_config_manage_stock');
 
                     var disabler = function(event) {
-                        var complexProductTypes = " . json_encode(array_values($this->complexProductTypes)) . ";
-                        var hasVariation = $('[data-panel=product-variations]').is('.opened');
-                        if ((productType == 'configurable' && hasVariation)
-                            || $.inArray(productType, complexProductTypes) >= 0
-                            || hasVariation
-                        ) {
-                            return;
-                        }
-                        var manageStockValue = (qty.val() === '') ? 0 : 1;
-                        stockAvailabilityField.prop('disabled', !manageStockValue);
-                        if (manageStockField.val() != manageStockValue && !(event && event.type == 'keyup')) {
-                            if (useConfigManageStockField.val() == 1) {
-                                useConfigManageStockField.removeAttr('checked').val(0);
+                        var stockBeforeDisable = $.Event('stockbeforedisable', {productType: productType});
+                        $('#product_info_tabs_product-details_content').trigger(stockBeforeDisable);
+                        if (stockBeforeDisable.result !== false) {
+                            var manageStockValue = (qty.val() === '') ? 0 : 1;
+                            stockAvailabilityField.prop('disabled', !manageStockValue);
+                            if (manageStockField.val() != manageStockValue && !(event && event.type == 'keyup')) {
+                                if (useConfigManageStockField.val() == 1) {
+                                    useConfigManageStockField.removeAttr('checked').val(0);
+                                }
+                                manageStockField.toggleClass('disabled', false).prop('disabled', false);
+                                manageStockField.val(manageStockValue);
                             }
-                            manageStockField.toggleClass('disabled', false).prop('disabled', false);
-                            manageStockField.val(manageStockValue);
                         }
                     };
 
diff --git a/app/code/Magento/CatalogInventory/Model/Observer.php b/app/code/Magento/CatalogInventory/Model/Observer.php
index e1f351df004..6f84b453d4f 100644
--- a/app/code/Magento/CatalogInventory/Model/Observer.php
+++ b/app/code/Magento/CatalogInventory/Model/Observer.php
@@ -35,14 +35,6 @@ use Magento\Sales\Model\Quote\Item as QuoteItem;
 
 class Observer
 {
-    /**
-     * Product qty's checked
-     * data is valid if you check quote item qty and use singleton instance
-     *
-     * @var array
-     */
-    protected $_checkedQuoteItems = array();
-
     /**
      * @var Item[]
      */
@@ -116,11 +108,6 @@ class Observer
      */
     protected $_indexerPrice;
 
-    /**
-     * @var \Magento\Catalog\Model\ProductTypes\ConfigInterface
-     */
-    protected $typeConfig;
-
     /**
      * @param \Magento\Catalog\Model\Resource\Product\Indexer\Price $indexerPrice
      * @param \Magento\CatalogInventory\Model\Resource\Indexer\Stock $resourceIndexerStock
@@ -132,7 +119,6 @@ class Observer
      * @param \Magento\CatalogInventory\Model\Stock\ItemFactory $stockItemFactory
      * @param StockFactory $stockFactory
      * @param \Magento\CatalogInventory\Model\Stock\StatusFactory $stockStatusFactory
-     * @param \Magento\Catalog\Model\ProductTypes\ConfigInterface $typeConfig
      */
     public function __construct(
         \Magento\Catalog\Model\Resource\Product\Indexer\Price $indexerPrice,
@@ -144,8 +130,7 @@ class Observer
         \Magento\CatalogInventory\Helper\Data $catalogInventoryData,
         \Magento\CatalogInventory\Model\Stock\ItemFactory $stockItemFactory,
         StockFactory $stockFactory,
-        \Magento\CatalogInventory\Model\Stock\StatusFactory $stockStatusFactory,
-        \Magento\Catalog\Model\ProductTypes\ConfigInterface $typeConfig
+        \Magento\CatalogInventory\Model\Stock\StatusFactory $stockStatusFactory
     ) {
         $this->_indexerPrice = $indexerPrice;
         $this->_resourceIndexerStock = $resourceIndexerStock;
@@ -157,7 +142,6 @@ class Observer
         $this->_stockItemFactory = $stockItemFactory;
         $this->_stockFactory = $stockFactory;
         $this->_stockStatusFactory = $stockStatusFactory;
-        $this->typeConfig = $typeConfig;
     }
 
     /**
@@ -303,334 +287,6 @@ class Observer
 
     }
 
-    /**
-     * Removes error statuses from quote and item, set by this observer
-     *
-     * @param QuoteItem $item
-     * @param int $code
-     * @return $this
-     */
-    protected function _removeErrorsFromQuoteAndItem($item, $code)
-    {
-        if ($item->getHasError()) {
-            $params = array(
-                'origin' => 'cataloginventory',
-                'code' => $code
-            );
-            $item->removeErrorInfosByParams($params);
-        }
-
-        $quote = $item->getQuote();
-        $quoteItems = $quote->getItemsCollection();
-        $canRemoveErrorFromQuote = true;
-
-        foreach ($quoteItems as $quoteItem) {
-            if ($quoteItem->getItemId() == $item->getItemId()) {
-                continue;
-            }
-
-            $errorInfos = $quoteItem->getErrorInfos();
-            foreach ($errorInfos as $errorInfo) {
-                if ($errorInfo['code'] == $code) {
-                    $canRemoveErrorFromQuote = false;
-                    break;
-                }
-            }
-
-            if (!$canRemoveErrorFromQuote) {
-                break;
-            }
-        }
-
-        if ($quote->getHasError() && $canRemoveErrorFromQuote) {
-            $params = array(
-                'origin' => 'cataloginventory',
-                'code' => $code
-            );
-            $quote->removeErrorInfosByParams(null, $params);
-        }
-
-        return $this;
-    }
-
-    /**
-     * Check product inventory data when quote item quantity declaring
-     *
-     * @param EventObserver $observer
-     * @return $this
-     * @throws \Magento\Core\Exception
-     */
-    public function checkQuoteItemQty($observer)
-    {
-        $quoteItem = $observer->getEvent()->getItem();
-        /* @var $quoteItem QuoteItem */
-        if (!$quoteItem || !$quoteItem->getProductId() || !$quoteItem->getQuote()
-            || $quoteItem->getQuote()->getIsSuperMode()) {
-            return $this;
-        }
-
-        /**
-         * Get Qty
-         */
-        $qty = $quoteItem->getQty();
-
-        /**
-         * Check if product in stock. For composite products check base (parent) item stosk status
-         */
-        $stockItem = $quoteItem->getProduct()->getStockItem();
-        $parentStockItem = false;
-        if ($quoteItem->getParentItem()) {
-            $parentStockItem = $quoteItem->getParentItem()->getProduct()->getStockItem();
-        }
-        if ($stockItem) {
-            if (!$stockItem->getIsInStock() || ($parentStockItem && !$parentStockItem->getIsInStock())) {
-                $quoteItem->addErrorInfo(
-                    'cataloginventory',
-                    \Magento\CatalogInventory\Helper\Data::ERROR_QTY,
-                    __('This product is out of stock.')
-                );
-                $quoteItem->getQuote()->addErrorInfo(
-                    'stock',
-                    'cataloginventory',
-                    \Magento\CatalogInventory\Helper\Data::ERROR_QTY,
-                    __('Some of the products are currently out of stock.')
-                );
-                return $this;
-            } else {
-                // Delete error from item and its quote, if it was set due to item out of stock
-                $this->_removeErrorsFromQuoteAndItem($quoteItem, \Magento\CatalogInventory\Helper\Data::ERROR_QTY);
-            }
-        }
-
-        /**
-         * Check item for options
-         */
-        if (($options = $quoteItem->getQtyOptions()) && $qty > 0) {
-            $qty = $quoteItem->getProduct()->getTypeInstance()->prepareQuoteItemQty($qty, $quoteItem->getProduct());
-            $quoteItem->setData('qty', $qty);
-
-            if ($stockItem) {
-                $result = $stockItem->checkQtyIncrements($qty);
-                if ($result->getHasError()) {
-                    $quoteItem->addErrorInfo(
-                        'cataloginventory',
-                        \Magento\CatalogInventory\Helper\Data::ERROR_QTY_INCREMENTS,
-                        $result->getMessage()
-                    );
-
-                    $quoteItem->getQuote()->addErrorInfo(
-                        $result->getQuoteMessageIndex(),
-                        'cataloginventory',
-                        \Magento\CatalogInventory\Helper\Data::ERROR_QTY_INCREMENTS,
-                        $result->getQuoteMessage()
-                    );
-                } else {
-                    // Delete error from item and its quote, if it was set due to qty problems
-                    $this->_removeErrorsFromQuoteAndItem(
-                        $quoteItem,
-                        \Magento\CatalogInventory\Helper\Data::ERROR_QTY_INCREMENTS
-                    );
-                }
-            }
-
-            foreach ($options as $option) {
-                $optionValue = $option->getValue();
-                /* @var $option \Magento\Sales\Model\Quote\Item\Option */
-                $optionQty = $qty * $optionValue;
-                $increaseOptionQty = ($quoteItem->getQtyToAdd() ? $quoteItem->getQtyToAdd() : $qty) * $optionValue;
-
-                $stockItem = $option->getProduct()->getStockItem();
-
-                if ($quoteItem->getProductType() == \Magento\Catalog\Model\Product\Type::TYPE_CONFIGURABLE) {
-                    $stockItem->setProductName($quoteItem->getName());
-                }
-
-                /* @var Item $stockItem */
-                if (!$stockItem instanceof Item) {
-                    throw new \Magento\Core\Exception(__('The stock item for Product in option is not valid.'));
-                }
-
-                /**
-                 * define that stock item is child for composite product
-                 */
-                $stockItem->setIsChildItem(true);
-                /**
-                 * don't check qty increments value for option product
-                 */
-                $stockItem->setSuppressCheckQtyIncrements(true);
-
-                $qtyForCheck = $this->_getQuoteItemQtyForCheck(
-                    $option->getProduct()->getId(),
-                    $quoteItem->getId(),
-                    $increaseOptionQty
-                );
-
-                $result = $stockItem->checkQuoteItemQty($optionQty, $qtyForCheck, $optionValue);
-
-                if (!is_null($result->getItemIsQtyDecimal())) {
-                    $option->setIsQtyDecimal($result->getItemIsQtyDecimal());
-                }
-
-                if ($result->getHasQtyOptionUpdate()) {
-                    $option->setHasQtyOptionUpdate(true);
-                    $quoteItem->updateQtyOption($option, $result->getOrigQty());
-                    $option->setValue($result->getOrigQty());
-                    /**
-                     * if option's qty was updates we also need to update quote item qty
-                     */
-                    $quoteItem->setData('qty', intval($qty));
-                }
-                if (!is_null($result->getMessage())) {
-                    $option->setMessage($result->getMessage());
-                    $quoteItem->setMessage($result->getMessage());
-                }
-                if (!is_null($result->getItemBackorders())) {
-                    $option->setBackorders($result->getItemBackorders());
-                }
-
-                if ($result->getHasError()) {
-                    $option->setHasError(true);
-
-                    $quoteItem->addErrorInfo(
-                        'cataloginventory',
-                        \Magento\CatalogInventory\Helper\Data::ERROR_QTY,
-                        $result->getMessage()
-                    );
-
-                    $quoteItem->getQuote()->addErrorInfo(
-                        $result->getQuoteMessageIndex(),
-                        'cataloginventory',
-                        \Magento\CatalogInventory\Helper\Data::ERROR_QTY,
-                        $result->getQuoteMessage()
-                    );
-                } else {
-                    // Delete error from item and its quote, if it was set due to qty lack
-                    $this->_removeErrorsFromQuoteAndItem($quoteItem, \Magento\CatalogInventory\Helper\Data::ERROR_QTY);
-                }
-
-                $stockItem->unsIsChildItem();
-            }
-        } else {
-            /* @var Item $stockItem */
-            if (!$stockItem instanceof Item) {
-                throw new \Magento\Core\Exception(__('The stock item for Product is not valid.'));
-            }
-
-            /**
-             * When we work with subitem (as subproduct of configurable product)
-             */
-            if ($quoteItem->getParentItem()) {
-                $rowQty = $quoteItem->getParentItem()->getQty() * $qty;
-                /**
-                 * we are using 0 because original qty was processed
-                 */
-                $qtyForCheck = $this->_getQuoteItemQtyForCheck(
-                    $quoteItem->getProduct()->getId(),
-                    $quoteItem->getId(),
-                    0
-                );
-            } else {
-                $increaseQty = $quoteItem->getQtyToAdd() ? $quoteItem->getQtyToAdd() : $qty;
-                $rowQty = $qty;
-                $qtyForCheck = $this->_getQuoteItemQtyForCheck(
-                    $quoteItem->getProduct()->getId(),
-                    $quoteItem->getId(),
-                    $increaseQty
-                );
-            }
-
-            $productTypeCustomOption = $quoteItem->getProduct()->getCustomOption('product_type');
-            if (!is_null($productTypeCustomOption)) {
-                // Check if product related to current item is a part of product that represents product set
-                if ($this->typeConfig->isProductSet($productTypeCustomOption->getValue())) {
-                    $stockItem->setProductName($quoteItem->getProduct()->getName());
-                    $stockItem->setIsChildItem(true);
-                }
-            }
-
-            $result = $stockItem->checkQuoteItemQty($rowQty, $qtyForCheck, $qty);
-
-            if ($stockItem->hasIsChildItem()) {
-                $stockItem->unsIsChildItem();
-            }
-
-            if (!is_null($result->getItemIsQtyDecimal())) {
-                $quoteItem->setIsQtyDecimal($result->getItemIsQtyDecimal());
-                if ($quoteItem->getParentItem()) {
-                    $quoteItem->getParentItem()->setIsQtyDecimal($result->getItemIsQtyDecimal());
-                }
-            }
-
-            /**
-             * Just base (parent) item qty can be changed
-             * qty of child products are declared just during add process
-             * exception for updating also managed by product type
-             */
-            if ($result->getHasQtyOptionUpdate()
-                && (!$quoteItem->getParentItem()
-                    || $quoteItem->getParentItem()->getProduct()->getTypeInstance()
-                        ->getForceChildItemQtyChanges($quoteItem->getParentItem()->getProduct())
-                )
-            ) {
-                $quoteItem->setData('qty', $result->getOrigQty());
-            }
-
-            if (!is_null($result->getItemUseOldQty())) {
-                $quoteItem->setUseOldQty($result->getItemUseOldQty());
-            }
-            if (!is_null($result->getMessage())) {
-                $quoteItem->setMessage($result->getMessage());
-            }
-
-            if (!is_null($result->getItemBackorders())) {
-                $quoteItem->setBackorders($result->getItemBackorders());
-            }
-
-            if ($result->getHasError()) {
-                $quoteItem->addErrorInfo(
-                    'cataloginventory',
-                    \Magento\CatalogInventory\Helper\Data::ERROR_QTY,
-                    $result->getMessage()
-                );
-
-                $quoteItem->getQuote()->addErrorInfo(
-                    $result->getQuoteMessageIndex(),
-                    'cataloginventory',
-                    \Magento\CatalogInventory\Helper\Data::ERROR_QTY,
-                    $result->getQuoteMessage()
-                );
-            } else {
-                // Delete error from item and its quote, if it was set due to qty lack
-                $this->_removeErrorsFromQuoteAndItem($quoteItem, \Magento\CatalogInventory\Helper\Data::ERROR_QTY);
-            }
-        }
-
-        return $this;
-    }
-
-    /**
-     * Get product qty includes information from all quote items
-     * Need be used only in sungleton mode
-     *
-     * @param int $productId
-     * @param int $quoteItemId
-     * @param float $itemQty
-     * @return int
-     */
-    protected function _getQuoteItemQtyForCheck($productId, $quoteItemId, $itemQty)
-    {
-        $qty = $itemQty;
-        if (isset($this->_checkedQuoteItems[$productId]['qty']) &&
-            !in_array($quoteItemId, $this->_checkedQuoteItems[$productId]['items'])) {
-                $qty += $this->_checkedQuoteItems[$productId]['qty'];
-        }
-
-        $this->_checkedQuoteItems[$productId]['qty'] = $qty;
-        $this->_checkedQuoteItems[$productId]['items'][] = $quoteItemId;
-
-        return $qty;
-    }
-
     /**
      * Subtract qtys of quote item products after multishipping checkout
      *
diff --git a/app/code/Magento/CatalogInventory/Model/Quote/Item/QuantityValidator.php b/app/code/Magento/CatalogInventory/Model/Quote/Item/QuantityValidator.php
new file mode 100644
index 00000000000..06c0b1e0b0c
--- /dev/null
+++ b/app/code/Magento/CatalogInventory/Model/Quote/Item/QuantityValidator.php
@@ -0,0 +1,233 @@
+<?php
+/**
+ * Product inventory data validator
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\CatalogInventory\Model\Quote\Item;
+
+class QuantityValidator 
+{
+    /**
+     * @var QuantityValidator\Initializer\Option
+     */
+    protected $optionInitializer;
+
+    /**
+     * @var QuantityValidator\Initializer\StockItem
+     */
+    protected $stockItemInitializer;
+
+    /**
+     * @param QuantityValidator\Initializer\Option $optionInitializer
+     * @param QuantityValidator\Initializer\StockItem $stockItemInitializer
+     */
+    public function __construct(
+        QuantityValidator\Initializer\Option $optionInitializer,
+        QuantityValidator\Initializer\StockItem $stockItemInitializer
+    ) {
+        $this->optionInitializer = $optionInitializer;
+        $this->stockItemInitializer = $stockItemInitializer;
+    }
+
+    /**
+     * Check product inventory data when quote item quantity declaring
+     *
+     * @param \Magento\Event\Observer $observer
+     *
+     * @return void
+     * @throws \Magento\Core\Exception
+     */
+    public function validate(\Magento\Event\Observer $observer)
+    {
+        /* @var $quoteItem \Magento\Sales\Model\Quote\Item */
+        $quoteItem = $observer->getEvent()->getItem();
+
+        if (!$quoteItem || !$quoteItem->getProductId() || !$quoteItem->getQuote()
+            || $quoteItem->getQuote()->getIsSuperMode()) {
+            return;
+        }
+
+        $qty = $quoteItem->getQty();
+
+        /** @var \Magento\CatalogInventory\Model\Stock\Item $stockItem */
+        $stockItem = $quoteItem->getProduct()->getStockItem();
+
+        $parentStockItem = false;
+
+        /**
+         * Check if product in stock. For composite products check base (parent) item stosk status
+         */
+        if ($quoteItem->getParentItem()) {
+            $parentStockItem = $quoteItem->getParentItem()->getProduct()->getStockItem();
+        }
+
+        if ($stockItem) {
+            if (!$stockItem->getIsInStock() || ($parentStockItem && !$parentStockItem->getIsInStock())) {
+                $quoteItem->addErrorInfo(
+                    'cataloginventory',
+                    \Magento\CatalogInventory\Helper\Data::ERROR_QTY,
+                    __('This product is out of stock.')
+                );
+                $quoteItem->getQuote()->addErrorInfo(
+                    'stock',
+                    'cataloginventory',
+                    \Magento\CatalogInventory\Helper\Data::ERROR_QTY,
+                    __('Some of the products are currently out of stock.')
+                );
+                return;
+            } else {
+                // Delete error from item and its quote, if it was set due to item out of stock
+                $this->_removeErrorsFromQuoteAndItem($quoteItem, \Magento\CatalogInventory\Helper\Data::ERROR_QTY);
+            }
+        }
+
+        /**
+         * Check item for options
+         */
+        if (($options = $quoteItem->getQtyOptions()) && $qty > 0) {
+            $qty = $quoteItem->getProduct()->getTypeInstance()->prepareQuoteItemQty($qty, $quoteItem->getProduct());
+            $quoteItem->setData('qty', $qty);
+
+            if ($stockItem) {
+                $result = $stockItem->checkQtyIncrements($qty);
+                if ($result->getHasError()) {
+                    $quoteItem->addErrorInfo(
+                        'cataloginventory',
+                        \Magento\CatalogInventory\Helper\Data::ERROR_QTY_INCREMENTS,
+                        $result->getMessage()
+                    );
+
+                    $quoteItem->getQuote()->addErrorInfo(
+                        $result->getQuoteMessageIndex(),
+                        'cataloginventory',
+                        \Magento\CatalogInventory\Helper\Data::ERROR_QTY_INCREMENTS,
+                        $result->getQuoteMessage()
+                    );
+                } else {
+                    // Delete error from item and its quote, if it was set due to qty problems
+                    $this->_removeErrorsFromQuoteAndItem(
+                        $quoteItem,
+                        \Magento\CatalogInventory\Helper\Data::ERROR_QTY_INCREMENTS
+                    );
+                }
+            }
+
+            foreach ($options as $option) {
+                $result = $this->optionInitializer->initialize($option, $quoteItem, $qty);
+                if ($result->getHasError()) {
+                    $option->setHasError(true);
+
+                    $quoteItem->addErrorInfo(
+                        'cataloginventory',
+                        \Magento\CatalogInventory\Helper\Data::ERROR_QTY,
+                        $result->getMessage()
+                    );
+
+                    $quoteItem->getQuote()->addErrorInfo(
+                        $result->getQuoteMessageIndex(),
+                        'cataloginventory',
+                        \Magento\CatalogInventory\Helper\Data::ERROR_QTY,
+                        $result->getQuoteMessage()
+                    );
+                } else {
+                    // Delete error from item and its quote, if it was set due to qty lack
+                    $this->_removeErrorsFromQuoteAndItem($quoteItem, \Magento\CatalogInventory\Helper\Data::ERROR_QTY);
+                }
+            }
+
+        } else {
+            /* @var $stockItem \Magento\CatalogInventory\Model\Stock\Item */
+            if (!$stockItem instanceof \Magento\CatalogInventory\Model\Stock\Item) {
+                throw new \Magento\Core\Exception(__('The stock item for Product in option is not valid.'));
+            }
+
+            $result = $this->stockItemInitializer->initialize($stockItem, $quoteItem, $qty);
+
+            if ($result->getHasError()) {
+                $quoteItem->addErrorInfo(
+                    'cataloginventory',
+                    \Magento\CatalogInventory\Helper\Data::ERROR_QTY,
+                    $result->getMessage()
+                );
+
+                $quoteItem->getQuote()->addErrorInfo(
+                    $result->getQuoteMessageIndex(),
+                    'cataloginventory',
+                    \Magento\CatalogInventory\Helper\Data::ERROR_QTY,
+                    $result->getQuoteMessage()
+                );
+            } else {
+                // Delete error from item and its quote, if it was set due to qty lack
+                $this->_removeErrorsFromQuoteAndItem($quoteItem, \Magento\CatalogInventory\Helper\Data::ERROR_QTY);
+            }
+        }
+    }
+
+    /**
+     * Removes error statuses from quote and item, set by this observer
+     *
+     * @param \Magento\Sales\Model\Quote\Item $item
+     * @param int $code
+     */
+    protected function _removeErrorsFromQuoteAndItem($item, $code)
+    {
+        if ($item->getHasError()) {
+            $params = array(
+                'origin' => 'cataloginventory',
+                'code' => $code
+            );
+            $item->removeErrorInfosByParams($params);
+        }
+
+        $quote = $item->getQuote();
+        $quoteItems = $quote->getItemsCollection();
+        $canRemoveErrorFromQuote = true;
+
+        foreach ($quoteItems as $quoteItem) {
+            if ($quoteItem->getItemId() == $item->getItemId()) {
+                continue;
+            }
+
+            $errorInfos = $quoteItem->getErrorInfos();
+            foreach ($errorInfos as $errorInfo) {
+                if ($errorInfo['code'] == $code) {
+                    $canRemoveErrorFromQuote = false;
+                    break;
+                }
+            }
+
+            if (!$canRemoveErrorFromQuote) {
+                break;
+            }
+        }
+
+        if ($quote->getHasError() && $canRemoveErrorFromQuote) {
+            $params = array(
+                'origin' => 'cataloginventory',
+                'code' => $code
+            );
+            $quote->removeErrorInfosByParams(null, $params);
+        }
+    }
+}
diff --git a/app/code/Magento/CatalogInventory/Model/Quote/Item/QuantityValidator/Initializer/Option.php b/app/code/Magento/CatalogInventory/Model/Quote/Item/QuantityValidator/Initializer/Option.php
new file mode 100644
index 00000000000..56ee30eee6f
--- /dev/null
+++ b/app/code/Magento/CatalogInventory/Model/Quote/Item/QuantityValidator/Initializer/Option.php
@@ -0,0 +1,112 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\CatalogInventory\Model\Quote\Item\QuantityValidator\Initializer;
+use Magento\CatalogInventory\Model\Quote\Item\QuantityValidator\QuoteItemQtyList;
+
+class Option
+{
+    /**
+     * @var QuoteItemQtyList
+     */
+    protected $quoteItemQtyList;
+
+    /**
+     * @param QuoteItemQtyList $quoteItemQtyList
+     */
+    public function __construct(QuoteItemQtyList $quoteItemQtyList)
+    {
+        $this->quoteItemQtyList = $quoteItemQtyList;
+    }
+
+    /**
+     * Initialize item option
+     *
+     * @param \Magento\Sales\Model\Quote\Item\Option $option
+     * @param \Magento\Sales\Model\Quote\Item $quoteItem
+     * @param int $qty
+     *
+     * @return \Magento\Object
+     *
+     * @throws \Magento\Core\Exception
+     */
+    public function initialize(
+        \Magento\Sales\Model\Quote\Item\Option $option,
+        \Magento\Sales\Model\Quote\Item $quoteItem,
+        $qty
+    ) {
+        $optionValue = $option->getValue();
+        $optionQty = $qty * $optionValue;
+        $increaseOptionQty = ($quoteItem->getQtyToAdd() ? $quoteItem->getQtyToAdd() : $qty) * $optionValue;
+
+        /* @var $stockItem \Magento\CatalogInventory\Model\Stock\Item */
+        $stockItem = $option->getProduct()->getStockItem();
+
+        if (!$stockItem instanceof \Magento\CatalogInventory\Model\Stock\Item) {
+            throw new \Magento\Core\Exception(__('The stock item for Product in option is not valid.'));
+        }
+
+        /**
+         * define that stock item is child for composite product
+         */
+        $stockItem->setIsChildItem(true);
+        /**
+         * don't check qty increments value for option product
+         */
+        $stockItem->setSuppressCheckQtyIncrements(true);
+
+        $qtyForCheck = $this->quoteItemQtyList->getQty(
+            $option->getProduct()->getId(),
+            $quoteItem->getId(),
+            $increaseOptionQty
+        );
+
+        $result = $stockItem->checkQuoteItemQty($optionQty, $qtyForCheck, $optionValue);
+
+        if (!is_null($result->getItemIsQtyDecimal())) {
+            $option->setIsQtyDecimal($result->getItemIsQtyDecimal());
+        }
+
+        if ($result->getHasQtyOptionUpdate()) {
+            $option->setHasQtyOptionUpdate(true);
+            $quoteItem->updateQtyOption($option, $result->getOrigQty());
+            $option->setValue($result->getOrigQty());
+            /**
+             * if option's qty was updates we also need to update quote item qty
+             */
+            $quoteItem->setData('qty', intval($qty));
+        }
+        if (!is_null($result->getMessage())) {
+            $option->setMessage($result->getMessage());
+            $quoteItem->setMessage($result->getMessage());
+        }
+        if (!is_null($result->getItemBackorders())) {
+            $option->setBackorders($result->getItemBackorders());
+        }
+
+        $stockItem->unsIsChildItem();
+
+        return $result;
+    }
+} 
diff --git a/app/code/Magento/CatalogInventory/Model/Quote/Item/QuantityValidator/Initializer/StockItem.php b/app/code/Magento/CatalogInventory/Model/Quote/Item/QuantityValidator/Initializer/StockItem.php
new file mode 100644
index 00000000000..4558a5a6bed
--- /dev/null
+++ b/app/code/Magento/CatalogInventory/Model/Quote/Item/QuantityValidator/Initializer/StockItem.php
@@ -0,0 +1,140 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\CatalogInventory\Model\Quote\Item\QuantityValidator\Initializer;
+use Magento\CatalogInventory\Model\Quote\Item\QuantityValidator\QuoteItemQtyList;
+
+class StockItem 
+{
+    /**
+     * @var QuoteItemQtyList
+     */
+    protected $quoteItemQtyList;
+
+    /**
+     * @var \Magento\Catalog\Model\ProductTypes\ConfigInterface
+     */
+    protected $typeConfig;
+
+    /**
+     * @param \Magento\Catalog\Model\ProductTypes\ConfigInterface $typeConfig
+     * @param QuoteItemQtyList $quoteItemQtyList
+     */
+    public function __construct(
+        \Magento\Catalog\Model\ProductTypes\ConfigInterface $typeConfig,
+        QuoteItemQtyList $quoteItemQtyList
+    ) {
+        $this->quoteItemQtyList = $quoteItemQtyList;
+        $this->typeConfig = $typeConfig;
+    }
+
+    /**
+     * Initialize stock item
+     *
+     * @param \Magento\CatalogInventory\Model\Stock\Item $stockItem
+     * @param \Magento\Sales\Model\Quote\Item $quoteItem
+     * @param int $qty
+     *
+     * @return \Magento\Object
+     * @throws \Magento\Core\Exception
+     */
+    public function initialize(
+        \Magento\CatalogInventory\Model\Stock\Item $stockItem,
+        \Magento\Sales\Model\Quote\Item $quoteItem,
+        $qty
+    ) {
+        /**
+         * When we work with subitem
+         */
+        if ($quoteItem->getParentItem()) {
+            $rowQty = $quoteItem->getParentItem()->getQty() * $qty;
+            /**
+             * we are using 0 because original qty was processed
+             */
+            $qtyForCheck = $this->quoteItemQtyList->getQty(
+                $quoteItem->getProduct()->getId(),
+                $quoteItem->getId(),
+                0
+            );
+        } else {
+            $increaseQty = $quoteItem->getQtyToAdd() ? $quoteItem->getQtyToAdd() : $qty;
+            $rowQty = $qty;
+            $qtyForCheck = $this->quoteItemQtyList->getQty(
+                $quoteItem->getProduct()->getId(),
+                $quoteItem->getId(),
+                $increaseQty
+            );
+        }
+
+        $productTypeCustomOption = $quoteItem->getProduct()->getCustomOption('product_type');
+        if (!is_null($productTypeCustomOption)) {
+            // Check if product related to current item is a part of product that represents product set
+            if ($this->typeConfig->isProductSet($productTypeCustomOption->getValue())) {
+                $stockItem->setProductName($quoteItem->getProduct()->getName());
+                $stockItem->setIsChildItem(true);
+            }
+        }
+
+        $result = $stockItem->checkQuoteItemQty($rowQty, $qtyForCheck, $qty);
+
+        if ($stockItem->hasIsChildItem()) {
+            $stockItem->unsIsChildItem();
+        }
+
+        if (!is_null($result->getItemIsQtyDecimal())) {
+            $quoteItem->setIsQtyDecimal($result->getItemIsQtyDecimal());
+            if ($quoteItem->getParentItem()) {
+                $quoteItem->getParentItem()->setIsQtyDecimal($result->getItemIsQtyDecimal());
+            }
+        }
+
+        /**
+         * Just base (parent) item qty can be changed
+         * qty of child products are declared just during add process
+         * exception for updating also managed by product type
+         */
+        if ($result->getHasQtyOptionUpdate()
+            && (!$quoteItem->getParentItem()
+                || $quoteItem->getParentItem()->getProduct()->getTypeInstance()
+                    ->getForceChildItemQtyChanges($quoteItem->getParentItem()->getProduct())
+            )
+        ) {
+            $quoteItem->setData('qty', $result->getOrigQty());
+        }
+
+        if (!is_null($result->getItemUseOldQty())) {
+            $quoteItem->setUseOldQty($result->getItemUseOldQty());
+        }
+
+        if (!is_null($result->getMessage())) {
+            $quoteItem->setMessage($result->getMessage());
+        }
+
+        if (!is_null($result->getItemBackorders())) {
+            $quoteItem->setBackorders($result->getItemBackorders());
+        }
+
+        return $result;
+    }
+} 
diff --git a/app/code/Magento/CatalogInventory/Model/Quote/Item/QuantityValidator/QuoteItemQtyList.php b/app/code/Magento/CatalogInventory/Model/Quote/Item/QuantityValidator/QuoteItemQtyList.php
new file mode 100644
index 00000000000..0ea3afd5654
--- /dev/null
+++ b/app/code/Magento/CatalogInventory/Model/Quote/Item/QuantityValidator/QuoteItemQtyList.php
@@ -0,0 +1,60 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\CatalogInventory\Model\Quote\Item\QuantityValidator;
+
+class QuoteItemQtyList
+{
+    /**
+     * Product qty's checked
+     * data is valid if you check quote item qty and use singleton instance
+     *
+     * @var array
+     */
+    protected $_checkedQuoteItems = array();
+
+    /**
+     * Get product qty includes information from all quote items
+     * Need be used only in singleton mode
+     *
+     * @param int   $productId
+     * @param int   $quoteItemId
+     * @param float $itemQty
+     *
+     * @return int
+     */
+    public function getQty($productId, $quoteItemId, $itemQty)
+    {
+        $qty = $itemQty;
+        if (isset($this->_checkedQuoteItems[$productId]['qty']) &&
+            !in_array($quoteItemId, $this->_checkedQuoteItems[$productId]['items'])) {
+            $qty += $this->_checkedQuoteItems[$productId]['qty'];
+        }
+
+        $this->_checkedQuoteItems[$productId]['qty'] = $qty;
+        $this->_checkedQuoteItems[$productId]['items'][] = $quoteItemId;
+
+        return $qty;
+    }
+} 
diff --git a/app/code/Magento/CatalogInventory/Model/Resource/Indexer/Stock/DefaultStock.php b/app/code/Magento/CatalogInventory/Model/Resource/Indexer/Stock/DefaultStock.php
index e2ba9da3051..67dda7bc9b5 100644
--- a/app/code/Magento/CatalogInventory/Model/Resource/Indexer/Stock/DefaultStock.php
+++ b/app/code/Magento/CatalogInventory/Model/Resource/Indexer/Stock/DefaultStock.php
@@ -204,7 +204,7 @@ class DefaultStock
             ->where('e.type_id = ?', $this->getTypeId());
 
         // add limitation of status
-        $condition = $adapter->quoteInto('=?', \Magento\Catalog\Model\Product\Status::STATUS_ENABLED);
+        $condition = $adapter->quoteInto('=?', \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED);
         $this->_addAttributeToSelect($select, 'status', 'e.entity_id', 'cs.store_id', $condition);
 
         if ($this->_isManageStock()) {
diff --git a/app/code/Magento/CatalogInventory/Model/Resource/Stock/Status.php b/app/code/Magento/CatalogInventory/Model/Resource/Stock/Status.php
index d1673b4af8d..85fb42fed67 100644
--- a/app/code/Magento/CatalogInventory/Model/Resource/Stock/Status.php
+++ b/app/code/Magento/CatalogInventory/Model/Resource/Stock/Status.php
@@ -18,18 +18,15 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_CatalogInventory
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
+namespace Magento\CatalogInventory\Model\Resource\Stock;
 
 /**
  * CatalogInventory Stock Status per website Resource Model
  */
-namespace Magento\CatalogInventory\Model\Resource\Stock;
-
 class Status extends \Magento\Core\Model\Resource\Db\AbstractDb
 {
     /**
@@ -47,21 +44,27 @@ class Status extends \Magento\Core\Model\Resource\Db\AbstractDb
     protected $_websiteFactory;
 
     /**
-     * Construct
-     *
+     * @var \Magento\Eav\Model\Config
+     */
+    protected $eavConfig;
+
+    /**
      * @param \Magento\App\Resource $resource
      * @param \Magento\Core\Model\StoreManagerInterface $storeManager
      * @param \Magento\Core\Model\WebsiteFactory $websiteFactory
+     * @param \Magento\Eav\Model\Config $eavConfig
      */
     public function __construct(
         \Magento\App\Resource $resource,
         \Magento\Core\Model\StoreManagerInterface $storeManager,
-        \Magento\Core\Model\WebsiteFactory $websiteFactory
+        \Magento\Core\Model\WebsiteFactory $websiteFactory,
+        \Magento\Eav\Model\Config $eavConfig
     ) {
         parent::__construct($resource);
 
         $this->_storeManager = $storeManager;
         $this->_websiteFactory = $websiteFactory;
+        $this->eavConfig = $eavConfig;
     }
 
     /**
@@ -85,9 +88,14 @@ class Status extends \Magento\Core\Model\Resource\Db\AbstractDb
      * @param int|null $websiteId
      * @return $this
      */
-    public function saveProductStatus(\Magento\CatalogInventory\Model\Stock\Status $object, $productId, $status, $qty = 0,
-        $stockId = 1, $websiteId = null)
-    {
+    public function saveProductStatus(
+        \Magento\CatalogInventory\Model\Stock\Status $object,
+        $productId,
+        $status,
+        $qty = 0,
+        $stockId = 1,
+        $websiteId = null
+    ) {
         $websites = array_keys($object->getWebsites($websiteId));
         $adapter = $this->_getWriteAdapter();
         foreach ($websites as $websiteId) {
@@ -131,12 +139,12 @@ class Status extends \Magento\Core\Model\Resource\Db\AbstractDb
      * Retrieve product status
      * Return array as key product id, value - stock status
      *
-     * @param int|array $productIds
+     * @param int[] $productIds
      * @param int $websiteId
      * @param int $stockId
      * @return array
      */
-    public function getProductStatus($productIds, $websiteId, $stockId = 1)
+    public function getProductStockStatus($productIds, $websiteId, $stockId = 1)
     {
         if (!is_array($productIds)) {
             $productIds = array($productIds);
@@ -298,4 +306,60 @@ class Status extends \Magento\Core\Model\Resource\Db\AbstractDb
 
         return $this;
     }
+
+    /**
+     * Retrieve Product(s) status for store
+     * Return array where key is a product_id, value - status
+     *
+     * @param int[] $productIds
+     * @param int $storeId
+     * @return array
+     */
+    public function getProductStatus($productIds, $storeId = null)
+    {
+        if (!is_array($productIds)) {
+            $productIds = array($productIds);
+        }
+
+        $attribute      = $this->eavConfig->getAttribute(\Magento\Catalog\Model\Product::ENTITY, 'status');
+        $attributeTable = $attribute->getBackend()->getTable();
+
+        $adapter        = $this->_getReadAdapter();
+
+        if ($storeId === null || $storeId == \Magento\Core\Model\Store::DEFAULT_STORE_ID) {
+            $select = $adapter->select()
+                ->from($attributeTable, array('entity_id', 'value'))
+                ->where('entity_id IN (?)', $productIds)
+                ->where('attribute_id = ?', $attribute->getAttributeId())
+                ->where('store_id = ?', \Magento\Core\Model\Store::DEFAULT_STORE_ID);
+
+            $rows = $adapter->fetchPairs($select);
+        } else {
+            $select = $adapter->select()
+                ->from(
+                    array('t1' => $attributeTable),
+                    array('value' => $adapter->getCheckSql('t2.value_id > 0', 't2.value', 't1.value')))
+                ->joinLeft(
+                    array('t2' => $attributeTable),
+                    't1.entity_id = t2.entity_id AND t1.attribute_id = t2.attribute_id AND t2.store_id = '
+                    . (int)$storeId,
+                    array('t1.entity_id')
+                )
+                ->where('t1.store_id = ?', \Magento\Core\Model\Store::DEFAULT_STORE_ID)
+                ->where('t1.attribute_id = ?', $attribute->getAttributeId())
+                ->where('t1.entity_id IN(?)', $productIds);
+
+            $rows = $adapter->fetchPairs($select);
+        }
+
+        $statuses = array();
+        foreach ($productIds as $productId) {
+            if (isset($rows[$productId])) {
+                $statuses[$productId] = $rows[$productId];
+            } else {
+                $statuses[$productId] = -1;
+            }
+        }
+        return $statuses;
+    }
 }
diff --git a/app/code/Magento/CatalogInventory/Model/Stock/Status.php b/app/code/Magento/CatalogInventory/Model/Stock/Status.php
index 25ce684f037..dbfe2d2b260 100644
--- a/app/code/Magento/CatalogInventory/Model/Stock/Status.php
+++ b/app/code/Magento/CatalogInventory/Model/Stock/Status.php
@@ -27,12 +27,11 @@ namespace Magento\CatalogInventory\Model\Stock;
 
 use Magento\Catalog\Model\Product\Type\AbstractType;
 use Magento\Catalog\Model\Product\Type;
+use Magento\Catalog\Model\Product\Attribute\Source\Status as ProductStatus;
 
 /**
  * CatalogInventory Stock Status per website Model
  *
- * @method \Magento\CatalogInventory\Model\Resource\Stock\Status _getResource()
- * @method \Magento\CatalogInventory\Model\Resource\Stock\Status getResource()
  * @method int getProductId()
  * @method \Magento\CatalogInventory\Model\Stock\Status setProductId(int $value)
  * @method int getWebsiteId()
@@ -47,8 +46,12 @@ use Magento\Catalog\Model\Product\Type;
 
 class Status extends \Magento\Core\Model\AbstractModel
 {
+    /**#@+
+     * Stock Status values
+     */
     const STATUS_OUT_OF_STOCK       = 0;
     const STATUS_IN_STOCK           = 1;
+    /**#@-*/
 
     /**
      * Product Type Instances cache
@@ -94,7 +97,6 @@ class Status extends \Magento\Core\Model\AbstractModel
      * @param \Magento\Core\Model\Context $context
      * @param \Magento\Core\Model\Registry $registry
      * @param Type $productType
-     * @param \Magento\Catalog\Model\Product\Status $productStatus
      * @param \Magento\Catalog\Model\Product\Website $productWebsite
      * @param \Magento\Core\Model\StoreManagerInterface $storeManager
      * @param ItemFactory $stockItemFactory
@@ -107,7 +109,6 @@ class Status extends \Magento\Core\Model\AbstractModel
         \Magento\Core\Model\Context $context,
         \Magento\Core\Model\Registry $registry,
         Type $productType,
-        \Magento\Catalog\Model\Product\Status $productStatus,
         \Magento\Catalog\Model\Product\Website $productWebsite,
         \Magento\Core\Model\StoreManagerInterface $storeManager,
         ItemFactory $stockItemFactory,
@@ -120,7 +121,6 @@ class Status extends \Magento\Core\Model\AbstractModel
 
         $this->_catalogInventoryData = $catalogInventoryData;
         $this->_productType = $productType;
-        $this->_productStatus = $productStatus;
         $this->_productWebsite = $productWebsite;
         $this->_storeManager = $storeManager;
         $this->_stockItemFactory = $stockItemFactory;
@@ -205,16 +205,6 @@ class Status extends \Magento\Core\Model\AbstractModel
         return 0;
     }
 
-    /**
-     * Retrieve Product Status Enabled Constant
-     *
-     * @return int
-     */
-    public function getProductStatusEnabled()
-    {
-        return \Magento\Catalog\Model\Product\Status::STATUS_ENABLED;
-    }
-
     /**
      * Change Stock Item status process
      *
@@ -249,7 +239,7 @@ class Status extends \Magento\Core\Model\AbstractModel
     {
         if (is_null($stockStatus)) {
             $websiteId = $product->getStore()->getWebsiteId();
-            $status = $this->getProductStatus($product->getId(), $websiteId, $stockId);
+            $status = $this->getProductStockStatus($product->getId(), $websiteId, $stockId);
             $stockStatus = isset($status[$product->getId()]) ? $status[$product->getId()] : null;
         }
 
@@ -356,19 +346,19 @@ class Status extends \Magento\Core\Model\AbstractModel
             }
             $childrenWebsites = $this->_productWebsite->getWebsites($childrenIds);
             foreach ($websites as $websiteId => $storeId) {
-                $childrenStatus = $this->_productStatus->getProductStatus($childrenIds, $storeId);
-                $childrenStock  = $this->getProductStatus($childrenIds, $websiteId, $stockId);
+                $childrenStatus = $this->getProductStatus($childrenIds, $storeId);
+                $childrenStock  = $this->getProductStockStatus($childrenIds, $websiteId, $stockId);
 
                 $websiteStatus = $statuses[$websiteId];
                 foreach ($requiredChildrenIds as $groupedChildrenIds) {
                     $optionStatus = false;
                     foreach ($groupedChildrenIds as $childId) {
                         if (isset($childrenStatus[$childId])
-                            and isset($childrenWebsites[$childId])
-                            and in_array($websiteId, $childrenWebsites[$childId])
-                            and $childrenStatus[$childId] == $this->getProductStatusEnabled()
-                            and isset($childrenStock[$childId])
-                            and $childrenStock[$childId] == self::STATUS_IN_STOCK
+                            && isset($childrenWebsites[$childId])
+                            && in_array($websiteId, $childrenWebsites[$childId])
+                            && ($childrenStatus[$childId] == ProductStatus::STATUS_ENABLED)
+                            && isset($childrenStock[$childId])
+                            && ($childrenStock[$childId] == self::STATUS_IN_STOCK)
                         ) {
                             $optionStatus = true;
                         }
@@ -446,16 +436,28 @@ class Status extends \Magento\Core\Model\AbstractModel
     }
 
     /**
-     * Retrieve Product(s) status
+     * Retrieve Product(s) stock status
      *
-     * @param int|array $productIds
+     * @param int[] $productIds
      * @param int $websiteId
      * @param int $stockId
      * @return array
      */
-    public function getProductStatus($productIds, $websiteId, $stockId = 1)
+    public function getProductStockStatus($productIds, $websiteId, $stockId = 1)
+    {
+        return $this->getResource()->getProductStockStatus($productIds, $websiteId, $stockId);
+    }
+
+    /**
+     * Retrieve Product(s) status
+     *
+     * @param $productIds
+     * @param int $storeId
+     * @return array
+     */
+    public function getProductStatus($productIds, $storeId = null)
     {
-        return $this->getResource()->getProductStatus($productIds, $websiteId, $stockId);
+        return $this->getResource()->getProductStatus($productIds, $storeId);
     }
 
     /**
@@ -523,7 +525,7 @@ class Status extends \Magento\Core\Model\AbstractModel
         }
 
         if (!empty($productIds)) {
-            $stockStatuses = $this->_getResource()->getProductStatus($productIds, $websiteId, $stockId);
+            $stockStatuses = $this->getProductStockStatus($productIds, $websiteId, $stockId);
             foreach ($stockStatuses as $productId => $status) {
                 if ($product = $productCollection->getItemById($productId)) {
                     $product->setIsSalable($status);
diff --git a/app/code/Magento/CatalogInventory/etc/adminhtml/di.xml b/app/code/Magento/CatalogInventory/etc/adminhtml/di.xml
index 58041a9577b..0b230382bd0 100644
--- a/app/code/Magento/CatalogInventory/etc/adminhtml/di.xml
+++ b/app/code/Magento/CatalogInventory/etc/adminhtml/di.xml
@@ -23,13 +23,13 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <preference for="Magento\CatalogInventory\Model\Stock\Item" type="Magento\CatalogInventory\Model\Adminhtml\Stock\Item" />
     <type name="Magento\Catalog\Model\Product\CopyConstructor\Composite">
-        <param name="constructors">
-            <array>
-                <item key="catalog_inventory"><value>Magento\CatalogInventory\Model\Product\CopyConstructor\CatalogInventory</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="constructors" xsi:type="array">
+                <item name="catalog_inventory" xsi:type="string">Magento\CatalogInventory\Model\Product\CopyConstructor\CatalogInventory</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/CatalogInventory/etc/di.xml b/app/code/Magento/CatalogInventory/etc/di.xml
index 729b4eb1a34..1e8acde3f6c 100644
--- a/app/code/Magento/CatalogInventory/etc/di.xml
+++ b/app/code/Magento/CatalogInventory/etc/di.xml
@@ -23,35 +23,23 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\CatalogInventory\Model\Observer">
-        <param name="indexerPrice">
-            <instance type="Magento\Catalog\Model\Resource\Product\Indexer\Price\Proxy" />
-        </param>
-        <param name="resourceIndexerStock">
-            <instance type="Magento\CatalogInventory\Model\Resource\Indexer\Stock\Proxy" />
-        </param>
-        <param name="resourceStock">
-            <instance type="Magento\CatalogInventory\Model\Resource\Stock\Proxy" />
-        </param>
-        <param name="indexer">
-            <instance type="Magento\Index\Model\Indexer\Proxy" />
-        </param>
-        <param name="stock">
-            <instance type="Magento\CatalogInventory\Model\Stock\Proxy" />
-        </param>
-        <param name="stockStatus">
-            <instance type="Magento\CatalogInventory\Model\Stock\Status\Proxy" />
-        </param>
-        <param name="catalogInventoryData">
-            <instance type="Magento\CatalogInventory\Helper\Data\Proxy" />
-        </param>
+        <arguments>
+            <argument name="indexerPrice" xsi:type="object">Magento\Catalog\Model\Resource\Product\Indexer\Price\Proxy</argument>
+            <argument name="resourceIndexerStock" xsi:type="object">Magento\CatalogInventory\Model\Resource\Indexer\Stock\Proxy</argument>
+            <argument name="resourceStock" xsi:type="object">Magento\CatalogInventory\Model\Resource\Stock\Proxy</argument>
+            <argument name="indexer" xsi:type="object">Magento\Index\Model\Indexer\Proxy</argument>
+            <argument name="stock" xsi:type="object">Magento\CatalogInventory\Model\Stock\Proxy</argument>
+            <argument name="stockStatus" xsi:type="object">Magento\CatalogInventory\Model\Stock\Status\Proxy</argument>
+            <argument name="catalogInventoryData" xsi:type="object">Magento\CatalogInventory\Helper\Data\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Module\Updater\SetupFactory">
-        <param name="resourceTypes">
-            <array>
-                <item key="cataloginventory_setup"><value>Magento\Eav\Model\Entity\Setup</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="resourceTypes" xsi:type="array">
+                <item name="cataloginventory_setup" xsi:type="string">Magento\Eav\Model\Entity\Setup</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/CatalogInventory/etc/events.xml b/app/code/Magento/CatalogInventory/etc/events.xml
index ead47fb2d88..df4ba2365c8 100644
--- a/app/code/Magento/CatalogInventory/etc/events.xml
+++ b/app/code/Magento/CatalogInventory/etc/events.xml
@@ -43,7 +43,7 @@
         <observer name="inventory" instance="Magento\CatalogInventory\Model\Observer" method="addInventoryDataToCollection" />
     </event>
     <event name="sales_quote_item_qty_set_after">
-        <observer name="inventory" instance="Magento\CatalogInventory\Model\Observer" method="checkQuoteItemQty" />
+        <observer name="inventory" instance="Magento\CatalogInventory\Model\Quote\Item\QuantityValidator" method="validate" />
     </event>
     <event name="checkout_submit_all_after">
         <observer name="inventory" instance="Magento\CatalogInventory\Model\Observer" method="checkoutAllSubmitAfter" />
diff --git a/app/code/Magento/CatalogInventory/etc/product_types.xml b/app/code/Magento/CatalogInventory/etc/product_types.xml
index 72c3744a174..1b4b450c2d8 100644
--- a/app/code/Magento/CatalogInventory/etc/product_types.xml
+++ b/app/code/Magento/CatalogInventory/etc/product_types.xml
@@ -26,7 +26,4 @@
 <config>
     <type name="simple" isQty="true" />
     <type name="virtual" isQty="true" />
-    <type name="configurable">
-        <stockIndexerModel instance="Magento\CatalogInventory\Model\Resource\Indexer\Stock\Configurable" />
-    </type>
 </config>
diff --git a/app/code/Magento/CatalogInventory/view/adminhtml/layout/catalog_product_superconfig_config.xml b/app/code/Magento/CatalogInventory/view/adminhtml/layout/catalog_product_superconfig_config.xml
deleted file mode 100644
index 0c14d2f21db..00000000000
--- a/app/code/Magento/CatalogInventory/view/adminhtml/layout/catalog_product_superconfig_config.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Academic Free License (AFL 3.0)
- * that is bundled with this package in the file LICENSE_AFL.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/afl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
- */
--->
-<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-    <referenceBlock name="admin.product.edit.tab.super.config.grid">
-        <arguments>
-            <argument name="dataSource" xsi:type="object">
-                <updater>Magento\Catalog\Model\Resource\Product\Collection\AssociatedProductUpdater</updater>
-            </argument>
-        </arguments>
-        <referenceBlock name="admin.product.edit.tab.super.config.grid.columnSet">
-            <block class="Magento\Backend\Block\Widget\Grid\Column" as="inventory_in_stock" after="admin.product.edit.tab.super.config.grid.sku">
-                <arguments>
-                    <argument name="header" xsi:type="string" translate="true">Stock Availability</argument>
-                    <argument name="type" xsi:type="string">text</argument>
-                    <argument name="index" xsi:type="string">inventory_in_stock</argument>
-                    <argument name="id" xsi:type="string">inventory_in_stock</argument>
-                    <argument name="filter" xsi:type="string">0</argument>
-                    <argument name="sortable" xsi:type="string">1</argument>
-                    <argument name="renderer" xsi:type="string">Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config\Grid\Renderer\Inventory</argument>
-                </arguments>
-            </block>
-            <block class="Magento\Backend\Block\Widget\Grid\Column" as="qty" after="admin.product.edit.tab.super.config.grid.sku">
-                <arguments>
-                    <argument name="header" xsi:type="string" translate="true">Qty</argument>
-                    <argument name="type" xsi:type="string">text</argument>
-                    <argument name="index" xsi:type="string">qty</argument>
-                    <argument name="id" xsi:type="string">qty</argument>
-                    <argument name="filter" xsi:type="string">0</argument>
-                    <argument name="sortable" xsi:type="string">1</argument>
-                </arguments>
-            </block>
-        </referenceBlock>
-    </referenceBlock>
-</layout>
diff --git a/app/code/Magento/CatalogRule/Model/Observer.php b/app/code/Magento/CatalogRule/Model/Observer.php
index 1945af970fe..ffce60cff90 100644
--- a/app/code/Magento/CatalogRule/Model/Observer.php
+++ b/app/code/Magento/CatalogRule/Model/Observer.php
@@ -315,29 +315,6 @@ class Observer
         return $this;
     }
 
-    /**
-     * Calculate price using catalog price rules of configurable product
-     *
-     * @param EventObserver $observer
-     * @return $this
-     */
-    public function catalogProductTypeConfigurablePrice(EventObserver $observer)
-    {
-        $product = $observer->getEvent()->getProduct();
-        if ($product instanceof Product
-            && $product->getConfigurablePrice() !== null
-        ) {
-            $configurablePrice = $product->getConfigurablePrice();
-            $productPriceRule = $this->_ruleFactory->create()
-                ->calcProductPriceRule($product, $configurablePrice);
-            if ($productPriceRule !== null) {
-                $product->setConfigurablePrice($productPriceRule);
-            }
-        }
-
-        return $this;
-    }
-
     /**
      * Daily update catalog price rule by cron
      * Update include interval 3 days - current day - 1 days before + 1 days after
diff --git a/app/code/Magento/Core/Model/Layout/Argument/Handler/Number.php b/app/code/Magento/CatalogRule/Model/Product/PriceModifier.php
similarity index 52%
rename from app/code/Magento/Core/Model/Layout/Argument/Handler/Number.php
rename to app/code/Magento/CatalogRule/Model/Product/PriceModifier.php
index 1c0d8050c2b..57a08318cdd 100644
--- a/app/code/Magento/Core/Model/Layout/Argument/Handler/Number.php
+++ b/app/code/Magento/CatalogRule/Model/Product/PriceModifier.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Catalog rule product price modifier.
+ *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -18,49 +20,45 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Core
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\CatalogRule\Model\Product;
 
-/**
- * Layout argument. Type number.
- *
- * @category    Magento
- * @package     Magento_Core
- * @author      Magento Core Team <core@magentocommerce.com>
- */
-namespace Magento\Core\Model\Layout\Argument\Handler;
+use Magento\Catalog\Model\Product\PriceModifierInterface;
+use Magento\Catalog\Model\Product;
+use Magento\CatalogRule\Model\RuleFactory;
 
-class Number extends \Magento\Core\Model\Layout\Argument\AbstractHandler
+class PriceModifier implements PriceModifierInterface
 {
     /**
-     * Process argument value
-     *
-     * @param array $argument
-     * @return mixed
-     * @throws \InvalidArgumentException
+     * @var \Magento\CatalogRule\Model\RuleFactory
      */
-    public function process(array $argument)
-    {
-        $this->_validate($argument);
+    protected $ruleFactory;
 
-        return $argument['value'];
+    /**
+     * @param RuleFactory $ruleFactory
+     */
+    public function __construct(RuleFactory $ruleFactory)
+    {
+        $this->ruleFactory = $ruleFactory;
     }
 
     /**
-     * @param array $argument
-     * @return void
-     * @throws \InvalidArgumentException
+     * Modify price
+     *
+     * @param mixed $price
+     * @param Product $product
+     * @return mixed
      */
-    protected function _validate(array $argument)
+    public function modifyPrice($price, Product $product)
     {
-        parent::_validate($argument);
-        if (!is_numeric($argument['value'])) {
-            throw new \InvalidArgumentException(
-                'Value is not number argument. ' . $this->_getArgumentInfo($argument)
-            );
+        if ($price !== null) {
+            $resultPrice = $this->ruleFactory->create()->calcProductPriceRule($product, $price);
+            if ($resultPrice !== null) {
+                $price = $resultPrice;
+            }
         }
+        return $price;
     }
 }
diff --git a/app/code/Magento/CatalogRule/etc/adminhtml/di.xml b/app/code/Magento/CatalogRule/etc/adminhtml/di.xml
index a0dc1ca7fc5..2e1053eb286 100644
--- a/app/code/Magento/CatalogRule/etc/adminhtml/di.xml
+++ b/app/code/Magento/CatalogRule/etc/adminhtml/di.xml
@@ -23,12 +23,12 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\CatalogRule\Model\Rule">
-        <param name="relatedCacheTypes">
-            <array>
-                <item key="blockCache"><value>block_html</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="relatedCacheTypes" xsi:type="array">
+                <item name="blockCache" xsi:type="string">block_html</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/CatalogRule/etc/di.xml b/app/code/Magento/CatalogRule/etc/di.xml
index b31f71d7def..5fdf22e6d8b 100644
--- a/app/code/Magento/CatalogRule/etc/di.xml
+++ b/app/code/Magento/CatalogRule/etc/di.xml
@@ -23,29 +23,32 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\CatalogRule\Model\Resource\Rule">
-        <param name="eventManager">
-            <instance type="Magento\Event\Manager\Proxy" />
-        </param>
+        <arguments>
+            <argument name="eventManager" xsi:type="object">Magento\Event\Manager\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\CatalogRule\Model\Resource\Rule\Collection" shared="false" />
     <type name="Magento\CatalogRule\Model\Observer">
-        <param name="resourceRule">
-            <instance type="Magento\CatalogRule\Model\Resource\Rule\Proxy" />
-        </param>
-        <param name="customerSession">
-            <instance type="Magento\Customer\Model\Session\Proxy" />
-        </param>
-        <param name="backendSession">
-            <instance type="Magento\Backend\Model\Session\Proxy" />
-        </param>
+        <arguments>
+            <argument name="resourceRule" xsi:type="object">Magento\CatalogRule\Model\Resource\Rule\Proxy</argument>
+            <argument name="customerSession" xsi:type="object">Magento\Customer\Model\Session\Proxy</argument>
+            <argument name="backendSession" xsi:type="object">Magento\Backend\Model\Session\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Module\Updater\SetupFactory">
-        <param name="resourceTypes">
-            <array>
-                <item key="catalogrule_setup"><value>Magento\Core\Model\Resource\Setup\Generic</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="resourceTypes" xsi:type="array">
+                <item name="catalogrule_setup" xsi:type="string">Magento\Core\Model\Resource\Setup\Generic</item>
+            </argument>
+        </arguments>
+    </type>
+    <type name="Magento\Catalog\Model\Product\PriceModifier\Composite">
+        <arguments>
+            <argument name="modifiers" xsi:type="array">
+                <item name="catalog_rule" xsi:type="string">Magento\CatalogRule\Model\Product\PriceModifier</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/CatalogRule/etc/events.xml b/app/code/Magento/CatalogRule/etc/events.xml
index 8721205a1ab..e1ac491054b 100644
--- a/app/code/Magento/CatalogRule/etc/events.xml
+++ b/app/code/Magento/CatalogRule/etc/events.xml
@@ -27,9 +27,6 @@
     <event name="prepare_catalog_product_price_index_table">
         <observer name="catalogrule" instance="Magento\CatalogRule\Model\Observer" method="prepareCatalogProductPriceIndexTable" />
     </event>
-    <event name="catalog_product_type_configurable_price">
-        <observer name="catalogrule" instance="Magento\CatalogRule\Model\Observer" method="catalogProductTypeConfigurablePrice" />
-    </event>
     <event name="catalogrule_apply_all">
         <observer name="catalogrule" instance="Magento\CatalogRule\Model\Observer" method="processApplyAll" />
     </event>
diff --git a/app/code/Magento/CatalogSearch/Model/Indexer/Fulltext.php b/app/code/Magento/CatalogSearch/Model/Indexer/Fulltext.php
index aee093f00d4..fc241dcc3f4 100644
--- a/app/code/Magento/CatalogSearch/Model/Indexer/Fulltext.php
+++ b/app/code/Magento/CatalogSearch/Model/Indexer/Fulltext.php
@@ -495,7 +495,7 @@ class Fulltext extends AbstractIndexer
             }
             if (isset($data['catalogsearch_status'])) {
                 $status = $data['catalogsearch_status'];
-                if ($status == \Magento\Catalog\Model\Product\Status::STATUS_ENABLED) {
+                if ($status == \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED) {
                     $this->_getIndexer()
                         ->rebuildIndex(null, $productIds);
                 } else {
diff --git a/app/code/Magento/CatalogSearch/Model/Resource/Fulltext.php b/app/code/Magento/CatalogSearch/Model/Resource/Fulltext.php
index 511cd415bf2..4a1384537ff 100644
--- a/app/code/Magento/CatalogSearch/Model/Resource/Fulltext.php
+++ b/app/code/Magento/CatalogSearch/Model/Resource/Fulltext.php
@@ -73,7 +73,7 @@ class Fulltext extends \Magento\Core\Model\Resource\Db\AbstractDb
     /**
      * Catalog product status
      *
-     * @var \Magento\Catalog\Model\Product\Status
+     * @var \Magento\Catalog\Model\Product\Attribute\Source\Status
      */
     protected $_catalogProductStatus;
 
@@ -147,7 +147,7 @@ class Fulltext extends \Magento\Core\Model\Resource\Db\AbstractDb
      * @param \Magento\App\Resource $resource
      * @param \Magento\Catalog\Model\Product\Type $catalogProductType
      * @param \Magento\Eav\Model\Config $eavConfig
-     * @param \Magento\Catalog\Model\Product\Status $catalogProductStatus
+     * @param \Magento\Catalog\Model\Product\Attribute\Source\Status $catalogProductStatus
      * @param \Magento\Catalog\Model\Resource\Product\Attribute\CollectionFactory $productAttributeCollectionFactory
      * @param EngineProvider $engineProvider
      * @param \Magento\Event\ManagerInterface $eventManager
@@ -162,7 +162,7 @@ class Fulltext extends \Magento\Core\Model\Resource\Db\AbstractDb
         \Magento\App\Resource $resource,
         \Magento\Catalog\Model\Product\Type $catalogProductType,
         \Magento\Eav\Model\Config $eavConfig,
-        \Magento\Catalog\Model\Product\Status $catalogProductStatus,
+        \Magento\Catalog\Model\Product\Attribute\Source\Status $catalogProductStatus,
         \Magento\Catalog\Model\Resource\Product\Attribute\CollectionFactory $productAttributeCollectionFactory,
         \Magento\CatalogSearch\Model\Resource\EngineProvider $engineProvider,
         \Magento\Event\ManagerInterface $eventManager,
diff --git a/app/code/Magento/CatalogSearch/etc/adminhtml/di.xml b/app/code/Magento/CatalogSearch/etc/adminhtml/di.xml
index 60225cf9487..225e15d7037 100644
--- a/app/code/Magento/CatalogSearch/etc/adminhtml/di.xml
+++ b/app/code/Magento/CatalogSearch/etc/adminhtml/di.xml
@@ -23,18 +23,16 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <virtualType name="Magento\CatalogSearch\Model\Session\Storage" type="Magento\Session\Storage">
-        <param name="namespace">
-            <value>catalogsearch</value>
-        </param>
+        <arguments>
+            <argument name="namespace" xsi:type="string">catalogsearch</argument>
+        </arguments>
     </virtualType>
     <virtualType name="Magento\CatalogSearch\Model\Session" type="Magento\Session\Generic">
-        <param name="storage">
-            <instance type="Magento\CatalogSearch\Model\Session\Storage" />
-        </param>
-        <param name="sessionName">
-            <value>adminhtml</value>
-        </param>
+        <arguments>
+            <argument name="storage" xsi:type="object">Magento\CatalogSearch\Model\Session\Storage</argument>
+            <argument name="sessionName" xsi:type="string">adminhtml</argument>
+        </arguments>
     </virtualType>
 </config>
diff --git a/app/code/Magento/CatalogSearch/etc/di.xml b/app/code/Magento/CatalogSearch/etc/di.xml
index f1ee9fa5778..af2fc803e95 100644
--- a/app/code/Magento/CatalogSearch/etc/di.xml
+++ b/app/code/Magento/CatalogSearch/etc/di.xml
@@ -23,10 +23,10 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\CatalogSearch\Block\Layer">
-        <param name="catalogLayer">
-            <instance type="Magento\CatalogSearch\Model\Layer\Proxy" />
-        </param>
+        <arguments>
+            <argument name="catalogLayer" xsi:type="object">Magento\CatalogSearch\Model\Layer\Proxy</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/CatalogSearch/etc/frontend/di.xml b/app/code/Magento/CatalogSearch/etc/frontend/di.xml
index d1b3fe81bcc..2affb9397d0 100644
--- a/app/code/Magento/CatalogSearch/etc/frontend/di.xml
+++ b/app/code/Magento/CatalogSearch/etc/frontend/di.xml
@@ -23,18 +23,16 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <virtualType name="Magento\CatalogSearch\Model\Session\Storage" type="Magento\Session\Storage">
-        <param name="namespace">
-            <value>catalogsearch</value>
-        </param>
+        <arguments>
+            <argument name="namespace" xsi:type="string">catalogsearch</argument>
+        </arguments>
     </virtualType>
     <virtualType name="Magento\CatalogSearch\Model\Session" type="Magento\Session\Generic">
-        <param name="storage">
-            <instance type="Magento\CatalogSearch\Model\Session\Storage" />
-        </param>
-        <param name="sessionName">
-            <value>frontend</value>
-        </param>
+        <arguments>
+            <argument name="storage" xsi:type="object">Magento\CatalogSearch\Model\Session\Storage</argument>
+            <argument name="sessionName" xsi:type="string">frontend</argument>
+        </arguments>
     </virtualType>
 </config>
diff --git a/app/code/Magento/Centinel/etc/adminhtml/di.xml b/app/code/Magento/Centinel/etc/adminhtml/di.xml
index 57f978e52aa..5c76d7c5b54 100644
--- a/app/code/Magento/Centinel/etc/adminhtml/di.xml
+++ b/app/code/Magento/Centinel/etc/adminhtml/di.xml
@@ -23,29 +23,23 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <virtualType name="Magento\Centinel\Model\Session\Storage" type="Magento\Session\Storage">
-        <param name="namespace">
-            <value>centinel_validator</value>
-        </param>
+        <arguments>
+            <argument name="namespace" xsi:type="string">centinel_validator</argument>
+        </arguments>
     </virtualType>
     <virtualType name="Magento\Centinel\Model\Session" type="Magento\Session\Generic">
-        <param name="storage">
-            <instance type="Magento\Centinel\Model\Session\Storage" />
-        </param>
-        <param name="sessionName">
-            <value>adminhtml</value>
-        </param>
+        <arguments>
+            <argument name="storage" xsi:type="object">Magento\Centinel\Model\Session\Storage</argument>
+            <argument name="sessionName" xsi:type="string">adminhtml</argument>
+        </arguments>
     </virtualType>
     <type name="Magento\Centinel\Model\Service">
-        <param name="url">
-            <instance type="Magento\Backend\Model\UrlInterface" />
-        </param>
-        <param name="centinelSession">
-            <instance type="Magento\Centinel\Model\Session" />
-        </param>
-        <param name="urlPrefix">
-            <value>adminhtml/centinel_index/</value>
-        </param>
+        <arguments>
+            <argument name="url" xsi:type="object">Magento\Backend\Model\UrlInterface</argument>
+            <argument name="centinelSession" xsi:type="object">Magento\Centinel\Model\Session</argument>
+            <argument name="urlPrefix" xsi:type="string">adminhtml/centinel_index/</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Centinel/etc/di.xml b/app/code/Magento/Centinel/etc/di.xml
index cd72f1a5d1d..77beb13a704 100644
--- a/app/code/Magento/Centinel/etc/di.xml
+++ b/app/code/Magento/Centinel/etc/di.xml
@@ -23,15 +23,15 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Centinel\Model\StateFactory">
-        <param name="stateClassMap">
-            <array>
-                <item key="VI"><value>Magento\Centinel\Model\State\Visa</value></item>
-                <item key="MC"><value>Magento\Centinel\Model\State\Mastercard</value></item>
-                <item key="JCB"><value>Magento\Centinel\Model\State\Jcb</value></item>
-                <item key="SM"><value>Magento\Centinel\Model\State\Mastercard</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="stateClassMap" xsi:type="array">
+                <item name="VI" xsi:type="string">Magento\Centinel\Model\State\Visa</item>
+                <item name="MC" xsi:type="string">Magento\Centinel\Model\State\Mastercard</item>
+                <item name="JCB" xsi:type="string">Magento\Centinel\Model\State\Jcb</item>
+                <item name="SM" xsi:type="string">Magento\Centinel\Model\State\Mastercard</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Centinel/etc/frontend/di.xml b/app/code/Magento/Centinel/etc/frontend/di.xml
index 6a73a392867..082b1e607e6 100644
--- a/app/code/Magento/Centinel/etc/frontend/di.xml
+++ b/app/code/Magento/Centinel/etc/frontend/di.xml
@@ -23,30 +23,28 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <virtualType name="Magento\Centinel\Model\Session\Storage" type="Magento\Session\Storage">
-        <param name="namespace">
-            <value>centinel_validator</value>
-        </param>
+        <arguments>
+            <argument name="namespace" xsi:type="string">centinel_validator</argument>
+        </arguments>
     </virtualType>
     <virtualType name="Magento\Centinel\Model\Session" type="Magento\Session\Generic">
-        <param name="storage">
-            <instance type="Magento\Centinel\Model\Session\Storage" />
-        </param>
-        <param name="sessionName">
-            <value>frontend</value>
-        </param>
+        <arguments>
+            <argument name="storage" xsi:type="object">Magento\Centinel\Model\Session\Storage</argument>
+            <argument name="sessionName" xsi:type="string">frontend</argument>
+        </arguments>
     </virtualType>
     <type name="Magento\Core\Model\Url\SecurityInfo">
-        <param name="secureUrlList">
-            <array>
-                <item key="centinel"><value>/centinel/</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="secureUrlList" xsi:type="array">
+                <item name="centinel" xsi:type="string">/centinel/</item>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Centinel\Model\Service">
-        <param name="centinelSession">
-            <instance type="Magento\Centinel\Model\Session" />
-        </param>
+        <arguments>
+            <argument name="centinelSession" xsi:type="object">Magento\Centinel\Model\Session</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Checkout/Helper/Data.php b/app/code/Magento/Checkout/Helper/Data.php
index af1aceffc26..7b50097ace4 100644
--- a/app/code/Magento/Checkout/Helper/Data.php
+++ b/app/code/Magento/Checkout/Helper/Data.php
@@ -313,29 +313,6 @@ class Data extends \Magento\App\Helper\AbstractHelper
         return false;
     }
 
-    /**
-     * Check if multishipping checkout is available.
-     * There should be a valid quote in checkout session. If not, only the config value will be returned.
-     *
-     * @return bool
-     */
-    public function isMultishippingCheckoutAvailable()
-    {
-        $quote = $this->getQuote();
-        $isMultiShipping = (bool)(int)$this->_coreStoreConfig->getConfig('shipping/option/checkout_multiple');
-        if ((!$quote) || !$quote->hasItems()) {
-            return $isMultiShipping;
-        }
-        $maximunQty = (int)$this->_coreStoreConfig->getConfig('shipping/option/checkout_multiple_maximum_qty');
-        return $isMultiShipping
-            && !$quote->hasItemsWithDecimalQty()
-            && $quote->validateMinimumAmount(true)
-            && (($quote->getItemsSummaryQty() - $quote->getItemVirtualQty()) > 0)
-            && ($quote->getItemsSummaryQty() <= $maximunQty)
-            && !$quote->hasNominalItems()
-        ;
-    }
-
     /**
      * Check is allowed Guest Checkout
      * Use config settings and observer
diff --git a/app/code/Magento/Checkout/Model/Resource/Setup.php b/app/code/Magento/Checkout/Model/Resource/Setup.php
index 22e6cd9348a..0e42f6edc97 100644
--- a/app/code/Magento/Checkout/Model/Resource/Setup.php
+++ b/app/code/Magento/Checkout/Model/Resource/Setup.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Checkout Resource Setup Model
+ *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -18,20 +20,9 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Checkout
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-
-/**
- * Checkout Resource Setup Model
- *
- * @category    Magento
- * @package     Magento_Checkout
- * @author      Magento Core Team <core@magentocommerce.com>
- */
 namespace Magento\Checkout\Model\Resource;
 
 class Setup extends \Magento\Eav\Model\Entity\Setup
@@ -42,8 +33,8 @@ class Setup extends \Magento\Eav\Model\Entity\Setup
     protected $_customerAddress;
 
     /**
-     * @param \Magento\Core\Model\Resource\Setup\Context $context
-     * @param string $resourceName
+     * @param \Magento\Eav\Model\Entity\Setup\Context $context
+     * @param $resourceName
      * @param \Magento\App\CacheInterface $cache
      * @param \Magento\Eav\Model\Resource\Entity\Attribute\Group\CollectionFactory $attrGroupCollectionFactory
      * @param \Magento\Customer\Helper\Address $customerAddress
@@ -51,7 +42,7 @@ class Setup extends \Magento\Eav\Model\Entity\Setup
      * @param string $connectionName
      */
     public function __construct(
-        \Magento\Core\Model\Resource\Setup\Context $context,
+        \Magento\Eav\Model\Entity\Setup\Context $context,
         $resourceName,
         \Magento\App\CacheInterface $cache,
         \Magento\Eav\Model\Resource\Entity\Attribute\Group\CollectionFactory $attrGroupCollectionFactory,
@@ -60,7 +51,9 @@ class Setup extends \Magento\Eav\Model\Entity\Setup
         $connectionName = ''
     ) {
         $this->_customerAddress = $customerAddress;
-        parent::__construct($context, $resourceName, $cache, $attrGroupCollectionFactory, $moduleName, $connectionName);
+        parent::__construct(
+            $context, $resourceName, $cache, $attrGroupCollectionFactory, $moduleName, $connectionName
+        );
     }
 
     /**
diff --git a/app/code/Magento/Checkout/etc/adminhtml/di.xml b/app/code/Magento/Checkout/etc/adminhtml/di.xml
index 932c755ba98..d84497b672c 100644
--- a/app/code/Magento/Checkout/etc/adminhtml/di.xml
+++ b/app/code/Magento/Checkout/etc/adminhtml/di.xml
@@ -23,10 +23,10 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Checkout\Model\Session">
-        <param name="sessionName">
-            <value>adminhtml</value>
-        </param>
+        <arguments>
+            <argument name="sessionName" xsi:type="string">adminhtml</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Checkout/etc/adminhtml/system.xml b/app/code/Magento/Checkout/etc/adminhtml/system.xml
index a7c26534f28..01b52a3dd61 100644
--- a/app/code/Magento/Checkout/etc/adminhtml/system.xml
+++ b/app/code/Magento/Checkout/etc/adminhtml/system.xml
@@ -62,10 +62,6 @@
                     <label>After Adding a Product Redirect to Shopping Cart</label>
                     <source_model>Magento\Backend\Model\Config\Source\Yesno</source_model>
                 </field>
-                <field id="configurable_product_image" translate="label" type="select" sortOrder="4" showInDefault="1" showInWebsite="1" showInStore="1">
-                    <label>Configurable Product Image</label>
-                    <source_model>Magento\Catalog\Model\Config\Source\Product\Thumbnail</source_model>
-                </field>
             </group>
             <group id="cart_link" translate="label" sortOrder="3" showInDefault="1" showInWebsite="1" showInStore="0">
                 <label>My Cart Link</label>
diff --git a/app/code/Magento/Checkout/etc/config.xml b/app/code/Magento/Checkout/etc/config.xml
index 39c9bc9ff1c..e9c3c0af273 100644
--- a/app/code/Magento/Checkout/etc/config.xml
+++ b/app/code/Magento/Checkout/etc/config.xml
@@ -35,7 +35,6 @@
             <cart>
                 <delete_quote_after>30</delete_quote_after>
                 <redirect_to_cart>1</redirect_to_cart>
-                <configurable_product_image>parent</configurable_product_image>
             </cart>
             <cart_link>
                 <use_qty>1</use_qty>
diff --git a/app/code/Magento/Checkout/etc/di.xml b/app/code/Magento/Checkout/etc/di.xml
index 1a1f221654e..cd14f6e25e7 100644
--- a/app/code/Magento/Checkout/etc/di.xml
+++ b/app/code/Magento/Checkout/etc/di.xml
@@ -23,22 +23,22 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Module\Updater\SetupFactory">
-        <param name="resourceTypes">
-            <array>
-                <item key="checkout_setup"><value>Magento\Checkout\Model\Resource\Setup</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="resourceTypes" xsi:type="array">
+                <item name="checkout_setup" xsi:type="string">Magento\Checkout\Model\Resource\Setup</item>
+            </argument>
+        </arguments>
     </type>
     <virtualType name="Magento\Checkout\Model\Session\Storage" type="Magento\Session\Storage">
-        <param name="namespace">
-            <value>checkout</value>
-        </param>
+        <arguments>
+            <argument name="namespace" xsi:type="string">checkout</argument>
+        </arguments>
     </virtualType>
     <type name="Magento\Checkout\Model\Session">
-        <param name="storage">
-            <instance type="Magento\Checkout\Model\Session\Storage" />
-        </param>
+        <arguments>
+            <argument name="storage" xsi:type="object">Magento\Checkout\Model\Session\Storage</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Checkout/etc/frontend/di.xml b/app/code/Magento/Checkout/etc/frontend/di.xml
index 70de95507f1..a4a19590fc8 100644
--- a/app/code/Magento/Checkout/etc/frontend/di.xml
+++ b/app/code/Magento/Checkout/etc/frontend/di.xml
@@ -23,25 +23,25 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Checkout\Model\Session">
-        <param name="sessionName">
-            <value>frontend</value>
-        </param>
+        <arguments>
+            <argument name="sessionName" xsi:type="string">frontend</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\Url\SecurityInfo">
-        <param name="secureUrlList">
-            <array>
-                <item key="checkout_onepage"><value>/checkout/onepage</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="secureUrlList" xsi:type="array">
+                <item name="checkout_onepage" xsi:type="string">/checkout/onepage</item>
+            </argument>
+        </arguments>
     </type>
     <virtualType name="checkoutCartInitSession" type="Magento\Core\App\Action\Plugin\Session">
-        <param name="cookieCheckActions">
-            <array>
-                <item key="checkoutCartAdd"><value>add</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="cookieCheckActions" xsi:type="array">
+                <item name="checkoutCartAdd" xsi:type="string">add</item>
+            </argument>
+        </arguments>
     </virtualType>
     <type name="Magento\Checkout\Controller\Cart">
         <plugin name="sessionInitializer" type="checkoutCartInitSession" />
diff --git a/app/code/Magento/Checkout/i18n/de_DE.csv b/app/code/Magento/Checkout/i18n/de_DE.csv
index e1c9c4fba62..c373fb13cea 100644
--- a/app/code/Magento/Checkout/i18n/de_DE.csv
+++ b/app/code/Magento/Checkout/i18n/de_DE.csv
@@ -64,7 +64,6 @@
 "Close","Schließen"
 "Company","Firma"
 "Condition Name","Konditionsname"
-"Configurable Product Image","Konfigurierbares Produktbild"
 "Configure Cart Item","Artikel im Korb konfigurieren"
 "Confirm Password","Passwort bestätigen"
 "Content","Inhalt"
diff --git a/app/code/Magento/Checkout/i18n/en_US.csv b/app/code/Magento/Checkout/i18n/en_US.csv
index b516a61b8ef..4eb60d26e01 100644
--- a/app/code/Magento/Checkout/i18n/en_US.csv
+++ b/app/code/Magento/Checkout/i18n/en_US.csv
@@ -64,7 +64,6 @@
 "Close","Close"
 "Company","Company"
 "Condition Name","Condition Name"
-"Configurable Product Image","Configurable Product Image"
 "Configure Cart Item","Configure Cart Item"
 "Confirm Password","Confirm Password"
 "Content","Content"
diff --git a/app/code/Magento/Checkout/i18n/es_ES.csv b/app/code/Magento/Checkout/i18n/es_ES.csv
index 81f280e2f48..1f9805d506f 100644
--- a/app/code/Magento/Checkout/i18n/es_ES.csv
+++ b/app/code/Magento/Checkout/i18n/es_ES.csv
@@ -64,7 +64,6 @@
 "Close","Cerrar"
 "Company","Compañía"
 "Condition Name","Nombre de condición"
-"Configurable Product Image","Imagen configurable del producto"
 "Configure Cart Item","Configurar artículo de la cesta"
 "Confirm Password","Confirma Contraseña"
 "Content","Contenido"
diff --git a/app/code/Magento/Checkout/i18n/fr_FR.csv b/app/code/Magento/Checkout/i18n/fr_FR.csv
index 9e31dedcfdd..706a26d1eae 100644
--- a/app/code/Magento/Checkout/i18n/fr_FR.csv
+++ b/app/code/Magento/Checkout/i18n/fr_FR.csv
@@ -64,7 +64,6 @@
 "Close","Fermer"
 "Company","Société"
 "Condition Name","Nom de la condition"
-"Configurable Product Image","Image de produit configurable"
 "Configure Cart Item","Configurer les objets du panier"
 "Confirm Password","Confirmez le mot de passe"
 "Content","Contenu"
diff --git a/app/code/Magento/Checkout/i18n/nl_NL.csv b/app/code/Magento/Checkout/i18n/nl_NL.csv
index 2f79ee1da3f..92867e48034 100644
--- a/app/code/Magento/Checkout/i18n/nl_NL.csv
+++ b/app/code/Magento/Checkout/i18n/nl_NL.csv
@@ -64,7 +64,6 @@
 "Close","Sluiten"
 "Company","Bedrijf"
 "Condition Name","Naam voorwaarde"
-"Configurable Product Image","Instelbare productafbeelding"
 "Configure Cart Item","Artikel in mandje configureren"
 "Confirm Password","Bevestig Wachtwoord"
 "Content","inhoud"
diff --git a/app/code/Magento/Checkout/i18n/pt_BR.csv b/app/code/Magento/Checkout/i18n/pt_BR.csv
index 6f9fb1999fc..08fda0620db 100644
--- a/app/code/Magento/Checkout/i18n/pt_BR.csv
+++ b/app/code/Magento/Checkout/i18n/pt_BR.csv
@@ -64,7 +64,6 @@
 "Close","Fechar"
 "Company","Companhia"
 "Condition Name","Nome de Condição"
-"Configurable Product Image","Imagem Configurável de Produto"
 "Configure Cart Item","Configurar Item de Carrinho"
 "Confirm Password","Confirmar a senha"
 "Content","Conteúdo"
diff --git a/app/code/Magento/Checkout/i18n/zh_CN.csv b/app/code/Magento/Checkout/i18n/zh_CN.csv
index 9f0536a9333..66cecb1b948 100644
--- a/app/code/Magento/Checkout/i18n/zh_CN.csv
+++ b/app/code/Magento/Checkout/i18n/zh_CN.csv
@@ -64,7 +64,6 @@
 "Close","关闭"
 "Company","公司"
 "Condition Name","条件名称"
-"Configurable Product Image","可配置产品图片"
 "Configure Cart Item","配置购物车项目"
 "Confirm Password","确认密码"
 "Content","内容"
diff --git a/app/code/Magento/Checkout/view/frontend/layout/checkout_cart_item_renderers.xml b/app/code/Magento/Checkout/view/frontend/layout/checkout_cart_item_renderers.xml
index 22ad3b4d1a2..58b443ce6ba 100644
--- a/app/code/Magento/Checkout/view/frontend/layout/checkout_cart_item_renderers.xml
+++ b/app/code/Magento/Checkout/view/frontend/layout/checkout_cart_item_renderers.xml
@@ -27,7 +27,6 @@
     <referenceBlock name="checkout.cart.item.renderers">
         <block class="Magento\Checkout\Block\Cart\Item\Renderer" as="default" template="cart/item/default.phtml" cacheable="false"/>
         <block class="Magento\Checkout\Block\Cart\Item\Renderer" as="simple" template="cart/item/default.phtml" cacheable="false"/>
-        <block class="Magento\Checkout\Block\Cart\Item\Renderer\Configurable" as="configurable" template="cart/item/default.phtml" cacheable="false"/>
     </referenceBlock>
 </layout>
 
diff --git a/app/code/Magento/Checkout/view/frontend/layout/checkout_cart_sidebar_item_renderers.xml b/app/code/Magento/Checkout/view/frontend/layout/checkout_cart_sidebar_item_renderers.xml
index 831ddfef553..1b657c135c1 100644
--- a/app/code/Magento/Checkout/view/frontend/layout/checkout_cart_sidebar_item_renderers.xml
+++ b/app/code/Magento/Checkout/view/frontend/layout/checkout_cart_sidebar_item_renderers.xml
@@ -27,7 +27,6 @@
     <referenceBlock name="checkout.cart.sidebar.item.renderers">
         <block class="Magento\Checkout\Block\Cart\Item\Renderer" as="default" template="cart/sidebar/default.phtml" cacheable="false"/>
         <block class="Magento\Checkout\Block\Cart\Item\Renderer" as="simple" template="cart/sidebar/default.phtml" cacheable="false"/>
-        <block class="Magento\Checkout\Block\Cart\Item\Renderer\Configurable" as="configurable" template="cart/sidebar/default.phtml" cacheable="false"/>
         <block class="Magento\Checkout\Block\Cart\Item\Renderer" as="virtual" template="cart/sidebar/default.phtml" cacheable="false"/>
     </referenceBlock>
 </layout>
diff --git a/app/code/Magento/Checkout/view/frontend/layout/checkout_onepage_review_item_renderers.xml b/app/code/Magento/Checkout/view/frontend/layout/checkout_onepage_review_item_renderers.xml
index 40198c064b4..a28347c1176 100644
--- a/app/code/Magento/Checkout/view/frontend/layout/checkout_onepage_review_item_renderers.xml
+++ b/app/code/Magento/Checkout/view/frontend/layout/checkout_onepage_review_item_renderers.xml
@@ -26,7 +26,6 @@
 <layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <referenceBlock name="checkout.onepage.review.item.renderers">
         <block class="Magento\Checkout\Block\Cart\Item\Renderer" as="default" template="onepage/review/item.phtml" cacheable="false"/>
-        <block class="Magento\Checkout\Block\Cart\Item\Renderer\Configurable" as="configurable" template="onepage/review/item.phtml" cacheable="false"/>
     </referenceBlock>
 </layout>
 
diff --git a/app/code/Magento/Cms/Block/Adminhtml/Block.php b/app/code/Magento/Cms/Block/Adminhtml/Block.php
index 47adb2ce1c7..f94e46e9b59 100644
--- a/app/code/Magento/Cms/Block/Adminhtml/Block.php
+++ b/app/code/Magento/Cms/Block/Adminhtml/Block.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Cms\Block\Adminhtml;
 
 /**
  * Adminhtml cms blocks content block
@@ -31,11 +32,12 @@
  * @package    Magento_Cms
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Block\Adminhtml;
-
 class Block extends \Magento\Backend\Block\Widget\Grid\Container
 {
 
+    /**
+     * @return void
+     */
     protected function _construct()
     {
         $this->_blockGroup = 'Magento_Cms';
diff --git a/app/code/Magento/Cms/Block/Adminhtml/Block/Edit.php b/app/code/Magento/Cms/Block/Adminhtml/Block/Edit.php
index fc70a12c173..7bdf790be55 100644
--- a/app/code/Magento/Cms/Block/Adminhtml/Block/Edit.php
+++ b/app/code/Magento/Cms/Block/Adminhtml/Block/Edit.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Cms\Block\Adminhtml\Block;
 
 /**
  * CMS block edit form container
@@ -31,8 +32,6 @@
  * @package    Magento_Cms
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Block\Adminhtml\Block;
-
 class Edit extends \Magento\Backend\Block\Widget\Form\Container
 {
     /**
@@ -56,6 +55,9 @@ class Edit extends \Magento\Backend\Block\Widget\Form\Container
         parent::__construct($context, $data);
     }
 
+    /**
+     * @return void
+     */
     protected function _construct()
     {
         $this->_objectId = 'block_id';
@@ -97,8 +99,7 @@ class Edit extends \Magento\Backend\Block\Widget\Form\Container
     {
         if ($this->_coreRegistry->registry('cms_block')->getId()) {
             return __("Edit Block '%1'", $this->escapeHtml($this->_coreRegistry->registry('cms_block')->getTitle()));
-        }
-        else {
+        } else {
             return __('New Block');
         }
     }
diff --git a/app/code/Magento/Cms/Block/Adminhtml/Block/Edit/Form.php b/app/code/Magento/Cms/Block/Adminhtml/Block/Edit/Form.php
index 8b5bebe3bda..a4d9645cbdd 100644
--- a/app/code/Magento/Cms/Block/Adminhtml/Block/Edit/Form.php
+++ b/app/code/Magento/Cms/Block/Adminhtml/Block/Edit/Form.php
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Cms\Block\Adminhtml\Block\Edit;
 
 /**
  * Adminhtml cms block edit form
@@ -32,8 +32,6 @@
  * @package    Magento_Cms
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Block\Adminhtml\Block\Edit;
-
 class Form extends \Magento\Backend\Block\Widget\Form\Generic
 {
     /**
@@ -69,6 +67,8 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic
 
     /**
      * Init form
+     *
+     * @return void
      */
     protected function _construct()
     {
@@ -79,6 +79,8 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic
 
     /**
      * Load Wysiwyg on demand and Prepare layout
+     *
+     * @return void
      */
     protected function _prepareLayout()
     {
@@ -88,6 +90,11 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic
         }
     }
 
+    /**
+     * Prepare form
+     *
+     * @return $this
+     */
     protected function _prepareForm()
     {
         $model = $this->_coreRegistry->registry('cms_block');
@@ -126,9 +133,7 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic
             'class'     => 'validate-xml-identifier',
         ));
 
-        /**
-         * Check is single store mode
-         */
+        /* Check is single store mode */
         if (!$this->_storeManager->isSingleStoreMode()) {
             $field =$fieldset->addField('store_id', 'multiselect', array(
                 'name'      => 'stores[]',
diff --git a/app/code/Magento/Cms/Block/Adminhtml/Block/Widget/Chooser.php b/app/code/Magento/Cms/Block/Adminhtml/Block/Widget/Chooser.php
index 70cb64aada1..1dafdf94b5b 100644
--- a/app/code/Magento/Cms/Block/Adminhtml/Block/Widget/Chooser.php
+++ b/app/code/Magento/Cms/Block/Adminhtml/Block/Widget/Chooser.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Cms\Block\Adminhtml\Block\Widget;
 
 /**
  * CMS block chooser for Wysiwyg CMS widget
@@ -31,8 +32,6 @@
  * @package    Magento_Cms
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Block\Adminhtml\Block\Widget;
-
 class Chooser extends \Magento\Backend\Block\Widget\Grid\Extended
 {
     /**
@@ -66,6 +65,8 @@ class Chooser extends \Magento\Backend\Block\Widget\Grid\Extended
 
     /**
      * Block construction, prepare grid params
+     *
+     * @return void
      */
     protected function _construct()
     {
@@ -178,6 +179,11 @@ class Chooser extends \Magento\Backend\Block\Widget\Grid\Extended
         return parent::_prepareColumns();
     }
 
+    /**
+     * Get grid url
+     *
+     * @return string
+     */
     public function getGridUrl()
     {
         return $this->getUrl('cms/block_widget/chooser', array('_current' => true));
diff --git a/app/code/Magento/Cms/Block/Adminhtml/Page.php b/app/code/Magento/Cms/Block/Adminhtml/Page.php
index 4ad33e28d44..2728db98613 100644
--- a/app/code/Magento/Cms/Block/Adminhtml/Page.php
+++ b/app/code/Magento/Cms/Block/Adminhtml/Page.php
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Cms\Block\Adminhtml;
 
 /**
  * Adminhtml cms pages content block
@@ -32,12 +32,12 @@
  * @package    Magento_Cms
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Block\Adminhtml;
-
 class Page extends \Magento\Backend\Block\Widget\Grid\Container
 {
     /**
      * Block constructor
+     *
+     * @return void
      */
     protected function _construct()
     {
diff --git a/app/code/Magento/Cms/Block/Adminhtml/Page/Edit.php b/app/code/Magento/Cms/Block/Adminhtml/Page/Edit.php
index 757d0ecc81a..a82c876df27 100644
--- a/app/code/Magento/Cms/Block/Adminhtml/Page/Edit.php
+++ b/app/code/Magento/Cms/Block/Adminhtml/Page/Edit.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Cms\Block\Adminhtml\Page;
 
 /**
  * Admin CMS page
@@ -31,8 +32,6 @@
  * @package    Magento_Cms
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Block\Adminhtml\Page;
-
 class Edit extends \Magento\Backend\Block\Widget\Form\Container
 {
     /**
@@ -100,8 +99,7 @@ class Edit extends \Magento\Backend\Block\Widget\Form\Container
     {
         if ($this->_coreRegistry->registry('cms_page')->getId()) {
             return __("Edit Page '%1'", $this->escapeHtml($this->_coreRegistry->registry('cms_page')->getTitle()));
-        }
-        else {
+        } else {
             return __('New Page');
         }
     }
diff --git a/app/code/Magento/Cms/Block/Adminhtml/Page/Edit/Form.php b/app/code/Magento/Cms/Block/Adminhtml/Page/Edit/Form.php
index 855b2523d15..2ff4fe8404a 100644
--- a/app/code/Magento/Cms/Block/Adminhtml/Page/Edit/Form.php
+++ b/app/code/Magento/Cms/Block/Adminhtml/Page/Edit/Form.php
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Cms\Block\Adminhtml\Page\Edit;
 
 /**
  * Adminhtml cms page edit form block
@@ -32,11 +32,14 @@
  * @package    Magento_Cms
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Block\Adminhtml\Page\Edit;
-
 class Form extends \Magento\Backend\Block\Widget\Form\Generic
 {
 
+    /**
+     * Prepare form
+     *
+     * @return $this
+     */
     protected function _prepareForm()
     {
         /** @var \Magento\Data\Form $form */
diff --git a/app/code/Magento/Cms/Block/Adminhtml/Page/Edit/Tab/Content.php b/app/code/Magento/Cms/Block/Adminhtml/Page/Edit/Tab/Content.php
index d6364010e00..c356cf8024c 100644
--- a/app/code/Magento/Cms/Block/Adminhtml/Page/Edit/Tab/Content.php
+++ b/app/code/Magento/Cms/Block/Adminhtml/Page/Edit/Tab/Content.php
@@ -23,12 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Cms\Block\Adminhtml\Page\Edit\Tab;
 
 /**
  * Cms page edit form main tab
  */
-namespace Magento\Cms\Block\Adminhtml\Page\Edit\Tab;
-
 class Content
     extends \Magento\Backend\Block\Widget\Form\Generic
     implements \Magento\Backend\Block\Widget\Tab\TabInterface
@@ -58,6 +57,8 @@ class Content
 
     /**
      * Load Wysiwyg on demand and Prepare layout
+     *
+     * @return void
      */
     protected function _prepareLayout()
     {
@@ -67,6 +68,11 @@ class Content
         }
     }
 
+    /**
+     * Prepare form
+     *
+     * @return $this
+     */
     protected function _prepareForm()
     {
         /** @var $model \Magento\Cms\Model\Page */
diff --git a/app/code/Magento/Cms/Block/Adminhtml/Page/Edit/Tab/Design.php b/app/code/Magento/Cms/Block/Adminhtml/Page/Edit/Tab/Design.php
index f567b271576..7ee655dd3a6 100644
--- a/app/code/Magento/Cms/Block/Adminhtml/Page/Edit/Tab/Design.php
+++ b/app/code/Magento/Cms/Block/Adminhtml/Page/Edit/Tab/Design.php
@@ -65,6 +65,8 @@ class Design
 
     /**
      * Prepare form tab configuration
+     *
+     * @return void
      */
     protected function _construct()
     {
@@ -75,7 +77,7 @@ class Design
     /**
      * Initialise form fields
      *
-     * @return \Magento\Cms\Block\Adminhtml\Page\Edit\Tab\Design
+     * @return $this
      */
     protected function _prepareForm()
     {
@@ -195,9 +197,7 @@ class Design
     }
 
     /**
-     * Returns status flag about this tab can be showen or not
-     *
-     * @return true
+     * {@inheritdoc}
      */
     public function canShowTab()
     {
@@ -205,9 +205,7 @@ class Design
     }
 
     /**
-     * Returns status flag about this tab hidden or not
-     *
-     * @return true
+     * {@inheritdoc}
      */
     public function isHidden()
     {
diff --git a/app/code/Magento/Cms/Block/Adminhtml/Page/Edit/Tab/Main.php b/app/code/Magento/Cms/Block/Adminhtml/Page/Edit/Tab/Main.php
index de48ce98dff..9bc98eb3276 100644
--- a/app/code/Magento/Cms/Block/Adminhtml/Page/Edit/Tab/Main.php
+++ b/app/code/Magento/Cms/Block/Adminhtml/Page/Edit/Tab/Main.php
@@ -23,12 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Cms\Block\Adminhtml\Page\Edit\Tab;
 
 /**
  * Cms page edit form main tab
  */
-namespace Magento\Cms\Block\Adminhtml\Page\Edit\Tab;
-
 class Main
     extends \Magento\Backend\Block\Widget\Form\Generic
     implements \Magento\Backend\Block\Widget\Tab\TabInterface
@@ -56,6 +55,11 @@ class Main
         parent::__construct($context, $registry, $formFactory, $data);
     }
 
+    /**
+     * Prepare form
+     *
+     * @return $this
+     */
     protected function _prepareForm()
     {
         /* @var $model \Magento\Cms\Model\Page */
@@ -166,9 +170,7 @@ class Main
     }
 
     /**
-     * Returns status flag about this tab can be shown or not
-     *
-     * @return true
+     * {@inheritdoc}
      */
     public function canShowTab()
     {
@@ -176,9 +178,7 @@ class Main
     }
 
     /**
-     * Returns status flag about this tab hidden or not
-     *
-     * @return true
+     * {@inheritdoc}
      */
     public function isHidden()
     {
diff --git a/app/code/Magento/Cms/Block/Adminhtml/Page/Edit/Tab/Meta.php b/app/code/Magento/Cms/Block/Adminhtml/Page/Edit/Tab/Meta.php
index 09bea49a32c..903e476564d 100644
--- a/app/code/Magento/Cms/Block/Adminhtml/Page/Edit/Tab/Meta.php
+++ b/app/code/Magento/Cms/Block/Adminhtml/Page/Edit/Tab/Meta.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Cms\Block\Adminhtml\Page\Edit\Tab;
 
 /**
  * Customer account form block
@@ -31,12 +32,15 @@
  * @package    Magento_Cms
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Block\Adminhtml\Page\Edit\Tab;
-
 class Meta
     extends \Magento\Backend\Block\Widget\Form\Generic
     implements \Magento\Backend\Block\Widget\Tab\TabInterface
 {
+    /**
+     * Prepare form
+     *
+     * @return $this
+     */
     protected function _prepareForm()
     {
         /*
@@ -101,9 +105,7 @@ class Meta
     }
 
     /**
-     * Returns status flag about this tab can be showen or not
-     *
-     * @return true
+     * {@inheritdoc}
      */
     public function canShowTab()
     {
@@ -111,9 +113,7 @@ class Meta
     }
 
     /**
-     * Returns status flag about this tab hidden or not
-     *
-     * @return true
+     * {@inheritdoc}
      */
     public function isHidden()
     {
diff --git a/app/code/Magento/Cms/Block/Adminhtml/Page/Edit/Tabs.php b/app/code/Magento/Cms/Block/Adminhtml/Page/Edit/Tabs.php
index 340a78c9bb7..71ec8c9c3a9 100644
--- a/app/code/Magento/Cms/Block/Adminhtml/Page/Edit/Tabs.php
+++ b/app/code/Magento/Cms/Block/Adminhtml/Page/Edit/Tabs.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Cms\Block\Adminhtml\Page\Edit;
 
 /**
  * Admin page left menu
@@ -31,11 +32,12 @@
  * @package    Magento_Cms
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Block\Adminhtml\Page\Edit;
 
 class Tabs extends \Magento\Backend\Block\Widget\Tabs
 {
-
+    /**
+     * @return void
+     */
     protected function _construct()
     {
         parent::_construct();
diff --git a/app/code/Magento/Cms/Block/Adminhtml/Page/Grid.php b/app/code/Magento/Cms/Block/Adminhtml/Page/Grid.php
index ecebc9ed2b1..800f33ea134 100644
--- a/app/code/Magento/Cms/Block/Adminhtml/Page/Grid.php
+++ b/app/code/Magento/Cms/Block/Adminhtml/Page/Grid.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Cms\Block\Adminhtml\Page;
 
 /**
  * Adminhtml cms pages grid
@@ -31,8 +32,6 @@
  * @package    Magento_Cms
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Block\Adminhtml\Page;
-
 class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
 {
     /**
@@ -72,6 +71,9 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
         parent::__construct($context, $backendHelper, $data);
     }
 
+    /**
+     * @return void
+     */
     protected function _construct()
     {
         parent::_construct();
@@ -80,6 +82,11 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
         $this->setDefaultDir('ASC');
     }
 
+    /**
+     * Prepare collection
+     *
+     * @return \Magento\Backend\Block\Widget\Grid
+     */
     protected function _prepareCollection()
     {
         $collection = $this->_collectionFactory->create();
@@ -90,6 +97,11 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
         return parent::_prepareCollection();
     }
 
+    /**
+     * Prepare columns
+     *
+     * @return \Magento\Backend\Block\Widget\Grid\Extended
+     */
     protected function _prepareColumns()
     {
         $baseUrl = $this->getUrl();
@@ -159,13 +171,25 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
         return parent::_prepareColumns();
     }
 
+    /**
+     * After load collection
+     *
+     * @return void
+     */
     protected function _afterLoadCollection()
     {
         $this->getCollection()->walk('afterLoad');
         parent::_afterLoadCollection();
     }
 
-    protected function _filterStoreCondition($collection, $column)
+    /**
+     * Filter store condition
+     *
+     * @param $collection
+     * @param \Magento\Object $column
+     * @return void
+     */
+    protected function _filterStoreCondition($collection, \Magento\Object $column)
     {
         if (!$value = $column->getFilter()->getValue()) {
             return;
@@ -177,6 +201,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
     /**
      * Row click url
      *
+     * @param \Magento\Object $row
      * @return string
      */
     public function getRowUrl($row)
diff --git a/app/code/Magento/Cms/Block/Adminhtml/Page/Grid/Renderer/Action.php b/app/code/Magento/Cms/Block/Adminhtml/Page/Grid/Renderer/Action.php
index e4b638a39e2..2a31ab9240e 100644
--- a/app/code/Magento/Cms/Block/Adminhtml/Page/Grid/Renderer/Action.php
+++ b/app/code/Magento/Cms/Block/Adminhtml/Page/Grid/Renderer/Action.php
@@ -23,7 +23,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Cms\Block\Adminhtml\Page\Grid\Renderer;
 
 class Action
@@ -48,6 +47,12 @@ class Action
         parent::__construct($context, $data);
     }
 
+    /**
+     * Render action
+     *
+     * @param \Magento\Object $row
+     * @return string
+     */
     public function render(\Magento\Object $row)
     {
         /** @var \Magento\UrlInterface $urlModel */
diff --git a/app/code/Magento/Cms/Block/Adminhtml/Page/Widget/Chooser.php b/app/code/Magento/Cms/Block/Adminhtml/Page/Widget/Chooser.php
index b8a094d825a..12256046a3d 100644
--- a/app/code/Magento/Cms/Block/Adminhtml/Page/Widget/Chooser.php
+++ b/app/code/Magento/Cms/Block/Adminhtml/Page/Widget/Chooser.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Cms\Block\Adminhtml\Page\Widget;
 
 /**
  * CMS page chooser for Wysiwyg CMS widget
@@ -31,8 +32,6 @@
  * @package    Magento_Cms
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Block\Adminhtml\Page\Widget;
-
 class Chooser extends \Magento\Backend\Block\Widget\Grid\Extended
 {
     /**
@@ -82,6 +81,8 @@ class Chooser extends \Magento\Backend\Block\Widget\Grid\Extended
 
     /**
      * Block construction, prepare grid params
+     *
+     * @return void
      */
     protected function _construct()
     {
@@ -160,7 +161,7 @@ class Chooser extends \Magento\Backend\Block\Widget\Grid\Extended
     /**
      * Prepare columns for pages grid
      *
-     * @return \Magento\Backend\Block\Widget\Grid\Extended
+     * @return $this
      */
     protected function _prepareColumns()
     {
@@ -206,6 +207,11 @@ class Chooser extends \Magento\Backend\Block\Widget\Grid\Extended
         return parent::_prepareColumns();
     }
 
+    /**
+     * Get grid url
+     *
+     * @return string
+     */
     public function getGridUrl()
     {
         return $this->getUrl('cms/page_widget/chooser', array('_current' => true));
diff --git a/app/code/Magento/Cms/Block/Adminhtml/Wysiwyg/Images/Content.php b/app/code/Magento/Cms/Block/Adminhtml/Wysiwyg/Images/Content.php
index 6d6c97da637..f802709948e 100644
--- a/app/code/Magento/Cms/Block/Adminhtml/Wysiwyg/Images/Content.php
+++ b/app/code/Magento/Cms/Block/Adminhtml/Wysiwyg/Images/Content.php
@@ -58,6 +58,8 @@ class Content extends \Magento\Backend\Block\Widget\Container
 
     /**
      * Block construction
+     *
+     * @return void
      */
     protected function _construct()
     {
@@ -148,8 +150,7 @@ class Content extends \Magento\Backend\Block\Widget\Container
     /**
      * Description goes here...
      *
-     * @param none
-     * @return void
+     * @return string
      */
     public function getDeleteFilesUrl()
     {
diff --git a/app/code/Magento/Cms/Block/Adminhtml/Wysiwyg/Images/Content/Files.php b/app/code/Magento/Cms/Block/Adminhtml/Wysiwyg/Images/Content/Files.php
index 158dfb79d1b..e34857ae0f5 100644
--- a/app/code/Magento/Cms/Block/Adminhtml/Wysiwyg/Images/Content/Files.php
+++ b/app/code/Magento/Cms/Block/Adminhtml/Wysiwyg/Images/Content/Files.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Cms\Block\Adminhtml\Wysiwyg\Images\Content;
 
 /**
  * Directory contents block for Wysiwyg Images
@@ -31,8 +32,6 @@
  * @package    Magento_Cms
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Block\Adminhtml\Wysiwyg\Images\Content;
-
 class Files extends \Magento\Backend\Block\Template
 {
     /**
diff --git a/app/code/Magento/Cms/Block/Adminhtml/Wysiwyg/Images/Content/Newfolder.php b/app/code/Magento/Cms/Block/Adminhtml/Wysiwyg/Images/Content/Newfolder.php
index d3aed5348ef..772a74c2260 100644
--- a/app/code/Magento/Cms/Block/Adminhtml/Wysiwyg/Images/Content/Newfolder.php
+++ b/app/code/Magento/Cms/Block/Adminhtml/Wysiwyg/Images/Content/Newfolder.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Cms\Block\Adminhtml\Wysiwyg\Images\Content;
 
 /**
  * New directory block for Wysiwyg Images
@@ -31,8 +32,6 @@
  * @package    Magento_Cms
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Block\Adminhtml\Wysiwyg\Images\Content;
-
 class Newfolder extends \Magento\Backend\Block\Template
 {
 
diff --git a/app/code/Magento/Cms/Block/Adminhtml/Wysiwyg/Images/Content/Uploader.php b/app/code/Magento/Cms/Block/Adminhtml/Wysiwyg/Images/Content/Uploader.php
index da8e98e9da3..feb367fc02b 100644
--- a/app/code/Magento/Cms/Block/Adminhtml/Wysiwyg/Images/Content/Uploader.php
+++ b/app/code/Magento/Cms/Block/Adminhtml/Wysiwyg/Images/Content/Uploader.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Cms\Block\Adminhtml\Wysiwyg\Images\Content;
 
 /**
  * Uploader block for Wysiwyg Images
@@ -31,8 +32,6 @@
  * @package    Magento_Cms
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Block\Adminhtml\Wysiwyg\Images\Content;
-
 class Uploader extends \Magento\Backend\Block\Media\Uploader
 {
     /**
@@ -56,6 +55,9 @@ class Uploader extends \Magento\Backend\Block\Media\Uploader
         parent::__construct($context, $fileSize, $data);
     }
 
+    /**
+     * @return void
+     */
     protected function _construct()
     {
         parent::_construct();
@@ -80,6 +82,7 @@ class Uploader extends \Magento\Backend\Block\Media\Uploader
 
     /**
      * Return current media type based on request or data
+     *
      * @return string
      */
     protected function _getMediaType()
diff --git a/app/code/Magento/Cms/Block/Adminhtml/Wysiwyg/Images/Tree.php b/app/code/Magento/Cms/Block/Adminhtml/Wysiwyg/Images/Tree.php
index c9271838154..c56e1ce519d 100644
--- a/app/code/Magento/Cms/Block/Adminhtml/Wysiwyg/Images/Tree.php
+++ b/app/code/Magento/Cms/Block/Adminhtml/Wysiwyg/Images/Tree.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Cms\Block\Adminhtml\Wysiwyg\Images;
 
 /**
  * Directory tree renderer for Cms Wysiwyg Images
@@ -31,8 +32,6 @@
  * @package    Magento_Cms
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Block\Adminhtml\Wysiwyg\Images;
-
 class Tree extends \Magento\Backend\Block\Template
 {
     /**
@@ -131,6 +130,7 @@ class Tree extends \Magento\Backend\Block\Template
 
     /**
      * Get tree widget options
+     *
      * @return array
      */
     public function getTreeWidgetOptions()
diff --git a/app/code/Magento/Cms/Block/Page.php b/app/code/Magento/Cms/Block/Page.php
index e55f83fecca..848b9ffb076 100644
--- a/app/code/Magento/Cms/Block/Page.php
+++ b/app/code/Magento/Cms/Block/Page.php
@@ -23,7 +23,9 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Cms\Block;
 
+use Magento\View\Element\AbstractBlock;
 
 /**
  * Cms page content block
@@ -32,10 +34,6 @@
  * @package    Magento_Cms
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Block;
-
-use Magento\View\Element\AbstractBlock;
-
 class Page extends \Magento\View\Element\AbstractBlock
 {
     /**
@@ -112,7 +110,7 @@ class Page extends \Magento\View\Element\AbstractBlock
     /**
      * Prepare global layout
      *
-     * @return \Magento\Cms\Block\Page
+     * @return $this
      */
     protected function _prepareLayout()
     {
diff --git a/app/code/Magento/Cms/Block/Widget/Block.php b/app/code/Magento/Cms/Block/Widget/Block.php
index 6bdfdf4cc39..4fc984190d7 100644
--- a/app/code/Magento/Cms/Block/Widget/Block.php
+++ b/app/code/Magento/Cms/Block/Widget/Block.php
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Cms\Block\Widget;
 
 /**
  * Cms Static Block Widget
@@ -32,8 +32,6 @@
  * @package    Magento_Cms
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Block\Widget;
-
 class Block extends \Magento\View\Element\Template implements \Magento\Widget\Block\BlockInterface
 {
     /**
@@ -76,7 +74,7 @@ class Block extends \Magento\View\Element\Template implements \Magento\Widget\Bl
      * Prepare block text and determine whether block output enabled or not
      * Prevent blocks recursion if needed
      *
-     * @return \Magento\Cms\Block\Widget\Block
+     * @return $this
      */
     protected function _beforeToHtml()
     {
diff --git a/app/code/Magento/Cms/Block/Widget/Page/Link.php b/app/code/Magento/Cms/Block/Widget/Page/Link.php
index e0f49577bbc..e6917b991f4 100644
--- a/app/code/Magento/Cms/Block/Widget/Page/Link.php
+++ b/app/code/Magento/Cms/Block/Widget/Page/Link.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Cms\Block\Widget\Page;
 
 /**
  * Widget to display link to CMS page
@@ -31,9 +32,6 @@
  * @package    Magento_Cms
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-
-namespace Magento\Cms\Block\Widget\Page;
-
 class Link
     extends \Magento\View\Element\Html\Link
     implements \Magento\Widget\Block\BlockInterface
diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Block.php b/app/code/Magento/Cms/Controller/Adminhtml/Block.php
index 844ef78b845..0ea283b3f06 100644
--- a/app/code/Magento/Cms/Controller/Adminhtml/Block.php
+++ b/app/code/Magento/Cms/Controller/Adminhtml/Block.php
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Cms\Controller\Adminhtml;
 
 /**
  * Cms manage blocks controller
@@ -32,8 +32,6 @@
  * @package    Magento_Cms
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Controller\Adminhtml;
-
 class Block extends \Magento\Backend\App\Action
 {
     /**
@@ -58,7 +56,7 @@ class Block extends \Magento\Backend\App\Action
     /**
      * Init actions
      *
-     * @return \Magento\Cms\Controller\Adminhtml\Block
+     * @return $this
      */
     protected function _initAction()
     {
@@ -72,6 +70,8 @@ class Block extends \Magento\Backend\App\Action
 
     /**
      * Index action
+     *
+     * @return void
      */
     public function indexAction()
     {
@@ -83,6 +83,8 @@ class Block extends \Magento\Backend\App\Action
 
     /**
      * Create new CMS block
+     *
+     * @return void
      */
     public function newAction()
     {
@@ -92,6 +94,8 @@ class Block extends \Magento\Backend\App\Action
 
     /**
      * Edit CMS block
+     *
+     * @return void
      */
     public function editAction()
     {
@@ -130,6 +134,8 @@ class Block extends \Magento\Backend\App\Action
 
     /**
      * Save action
+     *
+     * @return void
      */
     public function saveAction()
     {
@@ -181,6 +187,8 @@ class Block extends \Magento\Backend\App\Action
 
     /**
      * Delete action
+     *
+     * @return void
      */
     public function deleteAction()
     {
diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Block/Widget.php b/app/code/Magento/Cms/Controller/Adminhtml/Block/Widget.php
index 38fbf8eab88..b8b22287848 100644
--- a/app/code/Magento/Cms/Controller/Adminhtml/Block/Widget.php
+++ b/app/code/Magento/Cms/Controller/Adminhtml/Block/Widget.php
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Cms\Controller\Adminhtml\Block;
 
 /**
  * Controller for CMS Block Widget plugin
@@ -32,12 +32,12 @@
  * @package    Magento_Cms
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Controller\Adminhtml\Block;
-
 class Widget extends \Magento\Backend\App\Action
 {
     /**
      * Chooser Source action
+     *
+     * @return void
      */
     public function chooserAction()
     {
diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Page.php b/app/code/Magento/Cms/Controller/Adminhtml/Page.php
index 173ab76d3de..c9717c42791 100644
--- a/app/code/Magento/Cms/Controller/Adminhtml/Page.php
+++ b/app/code/Magento/Cms/Controller/Adminhtml/Page.php
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Cms\Controller\Adminhtml;
 
 /**
  * Cms manage pages controller
@@ -32,8 +32,6 @@
  * @package    Magento_Cms
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Controller\Adminhtml;
-
 class Page extends \Magento\Backend\App\Action
 {
     /**
@@ -66,7 +64,7 @@ class Page extends \Magento\Backend\App\Action
     /**
      * Init actions
      *
-     * @return \Magento\Cms\Controller\Adminhtml\Page
+     * @return $this
      */
     protected function _initAction()
     {
@@ -81,6 +79,8 @@ class Page extends \Magento\Backend\App\Action
 
     /**
      * Index action
+     *
+     * @return void
      */
     public function indexAction()
     {
@@ -92,6 +92,8 @@ class Page extends \Magento\Backend\App\Action
 
     /**
      * Create new CMS page
+     *
+     * @return void
      */
     public function newAction()
     {
@@ -101,6 +103,8 @@ class Page extends \Magento\Backend\App\Action
 
     /**
      * Edit CMS page
+     *
+     * @return void
      */
     public function editAction()
     {
@@ -143,6 +147,8 @@ class Page extends \Magento\Backend\App\Action
 
     /**
      * Save action
+     *
+     * @return void
      */
     public function saveAction()
     {
@@ -201,6 +207,8 @@ class Page extends \Magento\Backend\App\Action
 
     /**
      * Delete action
+     *
+     * @return void
      */
     public function deleteAction()
     {
@@ -239,7 +247,7 @@ class Page extends \Magento\Backend\App\Action
     /**
      * Check the permission to run it
      *
-     * @return boolean
+     * @return bool
      */
     protected function _isAllowed()
     {
@@ -257,7 +265,7 @@ class Page extends \Magento\Backend\App\Action
     /**
      * Filtering posted data. Converting localized data if needed
      *
-     * @param array
+     * @param array $data
      * @return array
      */
     protected function _filterPostData($data)
diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Page/Widget.php b/app/code/Magento/Cms/Controller/Adminhtml/Page/Widget.php
index 62dbb17c27d..68b2a8964a4 100644
--- a/app/code/Magento/Cms/Controller/Adminhtml/Page/Widget.php
+++ b/app/code/Magento/Cms/Controller/Adminhtml/Page/Widget.php
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Cms\Controller\Adminhtml\Page;
 
 /**
  * Controller for CMS Page Link Widget plugin
@@ -32,12 +32,12 @@
  * @package    Magento_Cms
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Controller\Adminhtml\Page;
-
 class Widget extends \Magento\Backend\App\Action
 {
     /**
      * Chooser Source action
+     *
+     * @return void
      */
     public function chooserAction()
     {
diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg.php b/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg.php
index 33cade36b18..098091fdd4d 100644
--- a/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg.php
+++ b/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Cms\Controller\Adminhtml;
 
 /**
  * Wysiwyg controller for different purposes
@@ -31,14 +32,14 @@
  * @package     Magento_Cms
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Controller\Adminhtml;
-
 class Wysiwyg extends \Magento\Backend\App\Action
 {
     /**
      * Template directives callback
      *
-     * TODO: move this to some model
+     * @todo: move this to some model
+     *
+     * @return void
      */
     public function directiveAction()
     {
diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images.php b/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images.php
index f5fd0f987a4..11e9dd26e95 100644
--- a/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images.php
+++ b/app/code/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Cms\Controller\Adminhtml\Wysiwyg;
 
 /**
  * Images manage controller for Cms WYSIWYG editor
@@ -31,8 +32,6 @@
  * @package     Magento_Cms
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Controller\Adminhtml\Wysiwyg;
-
 class Images extends \Magento\Backend\App\Action
 {
     /**
@@ -57,7 +56,7 @@ class Images extends \Magento\Backend\App\Action
     /**
      * Init storage
      *
-     * @return \Magento\Cms\Controller\Adminhtml\Wysiwyg\Images
+     * @return $this
      */
     protected function _initAction()
     {
@@ -65,6 +64,11 @@ class Images extends \Magento\Backend\App\Action
         return $this;
     }
 
+    /**
+     * Index action
+     *
+     * @return void
+     */
     public function indexAction()
     {
         $storeId = (int)$this->getRequest()->getParam('store');
@@ -83,6 +87,11 @@ class Images extends \Magento\Backend\App\Action
         $this->_view->renderLayout();
     }
 
+    /**
+     * Tree json action
+     *
+     * @return void
+     */
     public function treeJsonAction()
     {
         try {
@@ -97,6 +106,11 @@ class Images extends \Magento\Backend\App\Action
         }
     }
 
+    /**
+     * Contents action
+     *
+     * @return void
+     */
     public function contentsAction()
     {
         try {
@@ -109,6 +123,11 @@ class Images extends \Magento\Backend\App\Action
         }
     }
 
+    /**
+     * New folder action
+     *
+     * @return void
+     */
     public function newFolderAction()
     {
         try {
@@ -122,6 +141,11 @@ class Images extends \Magento\Backend\App\Action
         $this->getResponse()->setBody($this->_objectManager->get('Magento\Core\Helper\Data')->jsonEncode($result));
     }
 
+    /**
+     * Delete folder action
+     *
+     * @return void
+     */
     public function deleteFolderAction()
     {
         try {
@@ -167,6 +191,8 @@ class Images extends \Magento\Backend\App\Action
 
     /**
      * Files upload processing
+     *
+     * @return void
      */
     public function uploadAction()
     {
@@ -183,6 +209,8 @@ class Images extends \Magento\Backend\App\Action
 
     /**
      * Fire when select image
+     *
+     * @return void
      */
     public function onInsertAction()
     {
@@ -202,6 +230,8 @@ class Images extends \Magento\Backend\App\Action
 
     /**
      * Generate image thumbnail on the fly
+     *
+     * @return void
      */
     public function thumbnailAction()
     {
@@ -235,7 +265,7 @@ class Images extends \Magento\Backend\App\Action
     /**
      * Save current path in session
      *
-     * @return \Magento\Cms\Controller\Adminhtml\Wysiwyg\Images
+     * @return $this
      */
     protected function _saveSessionCurrentPath()
     {
diff --git a/app/code/Magento/Cms/Controller/Index.php b/app/code/Magento/Cms/Controller/Index.php
index 843d91bb459..04a87f6def8 100644
--- a/app/code/Magento/Cms/Controller/Index.php
+++ b/app/code/Magento/Cms/Controller/Index.php
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Cms\Controller;
 
 /**
  * Cms index controller
@@ -32,14 +32,13 @@
  * @package    Magento_Cms
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Controller;
-
 class Index extends \Magento\App\Action\Action
 {
     /**
      * Renders CMS Home page
      *
-     * @param string $coreRoute
+     * @param string|null $coreRoute
+     * @return void
      */
     public function indexAction($coreRoute = null)
     {
@@ -54,6 +53,7 @@ class Index extends \Magento\App\Action\Action
      * Default index action (with 404 Not Found headers)
      * Used if default page don't configure or available
      *
+     * @return void
      */
     public function defaultIndexAction()
     {
@@ -68,6 +68,7 @@ class Index extends \Magento\App\Action\Action
      * Default no route page action
      * Used if no route page don't configure or available
      *
+     * @return void
      */
     public function defaultNoRouteAction()
     {
@@ -81,6 +82,7 @@ class Index extends \Magento\App\Action\Action
     /**
      * Render Disable cookies page
      *
+     * @return void
      */
     public function noCookiesAction()
     {
@@ -95,6 +97,7 @@ class Index extends \Magento\App\Action\Action
      * Default no cookies page action
      * Used if no cookies page don't configure or available
      *
+     * @return void
      */
     public function defaultNoCookiesAction()
     {
diff --git a/app/code/Magento/Cms/Controller/Noroute.php b/app/code/Magento/Cms/Controller/Noroute.php
index fad162b1a65..b2b3296dfcb 100644
--- a/app/code/Magento/Cms/Controller/Noroute.php
+++ b/app/code/Magento/Cms/Controller/Noroute.php
@@ -28,6 +28,8 @@ class Noroute extends \Magento\App\Action\Action
 {
     /**
      * Render CMS 404 Not found page
+     *
+     * @return void
      */
     public function indexAction()
     {
diff --git a/app/code/Magento/Cms/Controller/Page.php b/app/code/Magento/Cms/Controller/Page.php
index b6fe680c1ce..f7b208ee46e 100644
--- a/app/code/Magento/Cms/Controller/Page.php
+++ b/app/code/Magento/Cms/Controller/Page.php
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Cms\Controller;
 
 /**
  * CMS Page controller
@@ -32,13 +32,12 @@
  * @package    Magento_Cms
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Controller;
-
 class Page extends \Magento\App\Action\Action
 {
     /**
      * View CMS page action
      *
+     * @return void
      */
     public function viewAction()
     {
diff --git a/app/code/Magento/Cms/Controller/Router.php b/app/code/Magento/Cms/Controller/Router.php
index 13bc9727254..c21d0349389 100644
--- a/app/code/Magento/Cms/Controller/Router.php
+++ b/app/code/Magento/Cms/Controller/Router.php
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Cms\Controller;
 
 /**
  * Cms Controller Router
@@ -32,8 +32,6 @@
  * @package     Magento_Cms
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Controller;
-
 class Router extends \Magento\App\Router\AbstractRouter
 {
     /**
diff --git a/app/code/Magento/Cms/Helper/Page.php b/app/code/Magento/Cms/Helper/Page.php
index 55fe8cace8e..bb2c47e7931 100644
--- a/app/code/Magento/Cms/Helper/Page.php
+++ b/app/code/Magento/Cms/Helper/Page.php
@@ -23,7 +23,9 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Cms\Helper;
 
+use Magento\App\Action\Action;
 
 /**
  * CMS Page Helper
@@ -32,8 +34,6 @@
  * @package    Magento_Cms
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Helper;
-
 class Page extends \Magento\App\Helper\AbstractHelper
 {
     const XML_PATH_NO_ROUTE_PAGE        = 'web/default/cms_no_route';
@@ -136,11 +136,11 @@ class Page extends \Magento\App\Helper\AbstractHelper
      *
      * Call from controller action
      *
-     * @param \Magento\App\Action\Action $action
-     * @param integer $pageId
-     * @return boolean
+     * @param Action $action
+     * @param int $pageId
+     * @return bool
      */
-    public function renderPage(\Magento\App\Action\Action $action, $pageId = null)
+    public function renderPage(Action $action, $pageId = null)
     {
         return $this->_renderPage($action, $pageId);
     }
@@ -148,12 +148,12 @@ class Page extends \Magento\App\Helper\AbstractHelper
     /**
      * Renders CMS page
      *
-     * @param \Magento\App\Action\Action|\Magento\App\Action\Action $action
-     * @param integer $pageId
+     * @param Action $action
+     * @param int $pageId
      * @param bool $renderLayout
-     * @return boolean
+     * @return bool
      */
-    protected function _renderPage(\Magento\App\Action\Action  $action, $pageId = null, $renderLayout = true)
+    protected function _renderPage(Action  $action, $pageId = null, $renderLayout = true)
     {
         if (!is_null($pageId) && $pageId!==$this->_page->getId()) {
             $delimiterPosition = strrpos($pageId, '|');
@@ -232,12 +232,12 @@ class Page extends \Magento\App\Helper\AbstractHelper
      * Allows to use also backend action as first parameter.
      * Also takes third parameter which allows not run renderLayout method.
      *
-     * @param \Magento\App\Action\Action $action
-     * @param $pageId
-     * @param $renderLayout
+     * @param Action $action
+     * @param int $pageId
+     * @param bool $renderLayout
      * @return bool
      */
-    public function renderPageExtended(\Magento\App\Action\Action $action, $pageId = null, $renderLayout = true)
+    public function renderPageExtended(Action $action, $pageId = null, $renderLayout = true)
     {
         return $this->_renderPage($action, $pageId, $renderLayout);
     }
diff --git a/app/code/Magento/Cms/Helper/Wysiwyg/Images.php b/app/code/Magento/Cms/Helper/Wysiwyg/Images.php
index 8a7608e9dd6..6f7da7c25f7 100644
--- a/app/code/Magento/Cms/Helper/Wysiwyg/Images.php
+++ b/app/code/Magento/Cms/Helper/Wysiwyg/Images.php
@@ -23,12 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Cms\Helper\Wysiwyg;
 
 /**
  * Wysiwyg Images Helper
  */
-namespace Magento\Cms\Helper\Wysiwyg;
-
 class Images extends \Magento\App\Helper\AbstractHelper
 {
 
@@ -102,12 +101,11 @@ class Images extends \Magento\App\Helper\AbstractHelper
         $this->_directory->create(\Magento\Cms\Model\Wysiwyg\Config::IMAGE_DIRECTORY);
     }
 
-
     /**
      * Set a specified store ID value
      *
      * @param int $store
-     * @return \Magento\Cms\Helper\Wysiwyg\Images
+     * @return $this
      */
     public function setStoreId($store)
     {
@@ -171,11 +169,11 @@ class Images extends \Magento\App\Helper\AbstractHelper
             return $this->getStorageRoot() . $this->idDecode($id);
         }
     }
-    
-    /*
+
+    /**
      * Check whether using static URLs is allowed
      *
-     * @return boolean
+     * @return bool
      */
     public function isUsingStaticUrlsAllowed()
     {
diff --git a/app/code/Magento/Cms/Model/Block.php b/app/code/Magento/Cms/Model/Block.php
index d4a1f9dd1bd..1f913973215 100644
--- a/app/code/Magento/Cms/Model/Block.php
+++ b/app/code/Magento/Cms/Model/Block.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Cms\Model;
 
 /**
  * CMS block model
@@ -46,12 +47,13 @@
  * @package     Magento_Cms
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-
-namespace Magento\Cms\Model;
-
 class Block extends \Magento\Core\Model\AbstractModel
 {
     const CACHE_TAG     = 'cms_block';
+
+    /**
+     * @var string
+     */
     protected $_cacheTag= 'cms_block';
 
     /**
@@ -61,6 +63,9 @@ class Block extends \Magento\Core\Model\AbstractModel
      */
     protected $_eventPrefix = 'cms_block';
 
+    /**
+     * @return void
+     */
     protected function _construct()
     {
         $this->_init('Magento\Cms\Model\Resource\Block');
diff --git a/app/code/Magento/Cms/Model/Config/Source/Page.php b/app/code/Magento/Cms/Model/Config/Source/Page.php
index a9f414521e0..069486f81ba 100644
--- a/app/code/Magento/Cms/Model/Config/Source/Page.php
+++ b/app/code/Magento/Cms/Model/Config/Source/Page.php
@@ -30,6 +30,9 @@ namespace Magento\Cms\Model\Config\Source;
  */
 class Page implements \Magento\Core\Model\Option\ArrayInterface
 {
+    /**
+     * @var array
+     */
     protected $_options;
 
     /**
diff --git a/app/code/Magento/Cms/Model/Config/Source/Wysiwyg/Enabled.php b/app/code/Magento/Cms/Model/Config/Source/Wysiwyg/Enabled.php
index 1962a241ae4..68941c19d78 100644
--- a/app/code/Magento/Cms/Model/Config/Source/Wysiwyg/Enabled.php
+++ b/app/code/Magento/Cms/Model/Config/Source/Wysiwyg/Enabled.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Cms\Model\Config\Source\Wysiwyg;
 
 /**
  * Configuration source model for Wysiwyg toggling
@@ -31,10 +32,11 @@
  * @package     Magento_Cms
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Model\Config\Source\Wysiwyg;
-
 class Enabled implements \Magento\Core\Model\Option\ArrayInterface
 {
+    /**
+     * {@inheritdoc}
+     */
     public function toOptionArray()
     {
         return array(
diff --git a/app/code/Magento/Cms/Model/Observer.php b/app/code/Magento/Cms/Model/Observer.php
index 105c17530f5..74cf0cc77ef 100644
--- a/app/code/Magento/Cms/Model/Observer.php
+++ b/app/code/Magento/Cms/Model/Observer.php
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Cms\Model;
 
 /**
  * CMS Observer model
@@ -32,8 +32,6 @@
  * @package    Magento_Cms
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Model;
-
 class Observer
 {
     /**
@@ -66,7 +64,7 @@ class Observer
      * Modify No Route Forward object
      *
      * @param \Magento\Event\Observer $observer
-     * @return \Magento\Cms\Model\Observer
+     * @return $this
      */
     public function noRoute(\Magento\Event\Observer $observer)
     {
@@ -82,7 +80,7 @@ class Observer
      * Modify no Cookies forward object
      *
      * @param \Magento\Event\Observer $observer
-     * @return \Magento\Cms\Model\Observer
+     * @return $this
      */
     public function noCookies(\Magento\Event\Observer $observer)
     {
diff --git a/app/code/Magento/Cms/Model/Page.php b/app/code/Magento/Cms/Model/Page.php
index 88d70134acb..94bb51b6282 100644
--- a/app/code/Magento/Cms/Model/Page.php
+++ b/app/code/Magento/Cms/Model/Page.php
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Cms\Model;
 
 /**
  * Cms Page Model
@@ -69,8 +69,6 @@
  * @package     Magento_Cms
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Model;
-
 class Page extends \Magento\Core\Model\AbstractModel
 {
     const NOROUTE_PAGE_ID = 'no-route';
@@ -82,6 +80,10 @@ class Page extends \Magento\Core\Model\AbstractModel
     const STATUS_DISABLED = 0;
 
     const CACHE_TAG              = 'cms_page';
+
+    /**
+     * @var string
+     */
     protected $_cacheTag         = 'cms_page';
 
     /**
@@ -94,6 +96,7 @@ class Page extends \Magento\Core\Model\AbstractModel
     /**
      * Initialize resource model
      *
+     * @return void
      */
     protected function _construct()
     {
@@ -103,9 +106,9 @@ class Page extends \Magento\Core\Model\AbstractModel
     /**
      * Load object data
      *
-     * @param mixed $id
+     * @param int|null $id
      * @param string $field
-     * @return \Magento\Cms\Model\Page
+     * @return $this
      */
     public function load($id, $field=null)
     {
diff --git a/app/code/Magento/Cms/Model/Page/Urlrewrite.php b/app/code/Magento/Cms/Model/Page/Urlrewrite.php
index 236e642d6d2..3b3715b99f2 100644
--- a/app/code/Magento/Cms/Model/Page/Urlrewrite.php
+++ b/app/code/Magento/Cms/Model/Page/Urlrewrite.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Cms\Model\Page;
 
 /**
  * @method \Magento\Cms\Model\Resource\Page\Urlrewrite getResource() getResource()
@@ -31,13 +32,12 @@
  * @method \Magento\Cms\Model\Page\Urlrewrite setCmsPageId() setCmsPageId(int)
  * @method \Magento\Cms\Model\Page\Urlrewrite setUrlRewriteId() setUrlRewriteId(int)
  */
-namespace Magento\Cms\Model\Page;
-
 class Urlrewrite extends \Magento\Core\Model\AbstractModel
 {
     /**
      * Initialize resource model
      *
+     * @return void
      */
     protected function _construct()
     {
diff --git a/app/code/Magento/Cms/Model/Resource/Block.php b/app/code/Magento/Cms/Model/Resource/Block.php
index e54e999bfdf..2cd2e591226 100644
--- a/app/code/Magento/Cms/Model/Resource/Block.php
+++ b/app/code/Magento/Cms/Model/Resource/Block.php
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Cms\Model\Resource;
 
 /**
  * CMS block model
@@ -32,8 +32,6 @@
  * @package     Magento_Cms
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Model\Resource;
-
 class Block extends \Magento\Core\Model\Resource\Db\AbstractDb
 {
     /**
@@ -68,6 +66,7 @@ class Block extends \Magento\Core\Model\Resource\Db\AbstractDb
     /**
      * Initialize resource model
      *
+     * @return void
      */
     protected function _construct()
     {
@@ -95,7 +94,7 @@ class Block extends \Magento\Core\Model\Resource\Db\AbstractDb
      * Perform operations before object save
      *
      * @param \Magento\Core\Model\AbstractModel $object
-     * @return \Magento\Cms\Model\Resource\Block
+     * @return $this
      * @throws \Magento\Core\Exception
      */
     protected function _beforeSave(\Magento\Core\Model\AbstractModel $object)
@@ -116,7 +115,7 @@ class Block extends \Magento\Core\Model\Resource\Db\AbstractDb
      * Perform operations after object save
      *
      * @param \Magento\Core\Model\AbstractModel $object
-     * @return \Magento\Cms\Model\Resource\Block
+     * @return $this
      */
     protected function _afterSave(\Magento\Core\Model\AbstractModel $object)
     {
@@ -159,7 +158,7 @@ class Block extends \Magento\Core\Model\Resource\Db\AbstractDb
      * @param \Magento\Core\Model\AbstractModel $object
      * @param mixed $value
      * @param string $field
-     * @return \Magento\Cms\Model\Resource\Block
+     * @return $this
      */
     public function load(\Magento\Core\Model\AbstractModel $object, $value, $field = null)
     {
@@ -174,7 +173,7 @@ class Block extends \Magento\Core\Model\Resource\Db\AbstractDb
      * Perform operations after object load
      *
      * @param \Magento\Core\Model\AbstractModel $object
-     * @return \Magento\Cms\Model\Resource\Block
+     * @return $this
      */
     protected function _afterLoad(\Magento\Core\Model\AbstractModel $object)
     {
diff --git a/app/code/Magento/Cms/Model/Resource/Block/Collection.php b/app/code/Magento/Cms/Model/Resource/Block/Collection.php
index 6d2844e7821..42b2143558f 100644
--- a/app/code/Magento/Cms/Model/Resource/Block/Collection.php
+++ b/app/code/Magento/Cms/Model/Resource/Block/Collection.php
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Cms\Model\Resource\Block;
 
 /**
  * CMS block model
@@ -32,13 +32,12 @@
  * @package     Magento_Cms
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Model\Resource\Block;
-
 class Collection extends \Magento\Core\Model\Resource\Db\Collection\AbstractCollection
 {
     /**
      * Define resource model
      *
+     * @return void
      */
     protected function _construct()
     {
@@ -61,7 +60,7 @@ class Collection extends \Magento\Core\Model\Resource\Db\Collection\AbstractColl
      *
      * @param int|\Magento\Core\Model\Store $store
      * @param bool $withAdmin
-     * @return \Magento\Cms\Model\Resource\Block\Collection
+     * @return $this
      */
     public function addStoreFilter($store, $withAdmin = true)
     {
@@ -99,6 +98,8 @@ class Collection extends \Magento\Core\Model\Resource\Db\Collection\AbstractColl
 
     /**
      * Join store relation table if there is store filter
+     *
+     * @return void
      */
     protected function _renderFiltersBefore()
     {
diff --git a/app/code/Magento/Cms/Model/Resource/Page.php b/app/code/Magento/Cms/Model/Resource/Page.php
index 4e9aa6ffd8d..5935401142f 100644
--- a/app/code/Magento/Cms/Model/Resource/Page.php
+++ b/app/code/Magento/Cms/Model/Resource/Page.php
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Cms\Model\Resource;
 
 /**
  * Cms page mysql resource
@@ -32,8 +32,6 @@
  * @package     Magento_Cms
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Model\Resource;
-
 class Page extends \Magento\Core\Model\Resource\Db\AbstractDb
 {
     /**
@@ -83,6 +81,7 @@ class Page extends \Magento\Core\Model\Resource\Db\AbstractDb
     /**
      * Initialize resource model
      *
+     * @return void
      */
     protected function _construct()
     {
@@ -93,7 +92,7 @@ class Page extends \Magento\Core\Model\Resource\Db\AbstractDb
      * Process page data before deleting
      *
      * @param \Magento\Core\Model\AbstractModel $object
-     * @return \Magento\Cms\Model\Resource\Page
+     * @return $this
      */
     protected function _beforeDelete(\Magento\Core\Model\AbstractModel $object)
     {
@@ -110,7 +109,7 @@ class Page extends \Magento\Core\Model\Resource\Db\AbstractDb
      * Process page data before saving
      *
      * @param \Magento\Core\Model\AbstractModel $object
-     * @return \Magento\Cms\Model\Resource\Page
+     * @return $this
      * @throws \Magento\Core\Exception
      */
     protected function _beforeSave(\Magento\Core\Model\AbstractModel $object)
@@ -152,7 +151,7 @@ class Page extends \Magento\Core\Model\Resource\Db\AbstractDb
      * Assign page to store views
      *
      * @param \Magento\Core\Model\AbstractModel $object
-     * @return \Magento\Cms\Model\Resource\Page
+     * @return $this
      */
     protected function _afterSave(\Magento\Core\Model\AbstractModel $object)
     {
@@ -196,7 +195,7 @@ class Page extends \Magento\Core\Model\Resource\Db\AbstractDb
      * @param \Magento\Core\Model\AbstractModel $object
      * @param mixed $value
      * @param string $field
-     * @return \Magento\Cms\Model\Resource\Page
+     * @return $this
      */
     public function load(\Magento\Core\Model\AbstractModel $object, $value, $field = null)
     {
@@ -211,7 +210,7 @@ class Page extends \Magento\Core\Model\Resource\Db\AbstractDb
      * Perform operations after object load
      *
      * @param \Magento\Core\Model\AbstractModel $object
-     * @return \Magento\Cms\Model\Resource\Page
+     * @return $this
      */
     protected function _afterLoad(\Magento\Core\Model\AbstractModel $object)
     {
@@ -308,10 +307,9 @@ class Page extends \Magento\Core\Model\Resource\Db\AbstractDb
     /**
      *  Check whether page identifier is numeric
      *
-     * @date Wed Mar 26 18:12:28 EET 2008
-     *
      * @param \Magento\Core\Model\AbstractModel $object
      * @return bool
+     * @date Wed Mar 26 18:12:28 EET 2008
      */
     protected function isNumericPageIdentifier(\Magento\Core\Model\AbstractModel $object)
     {
@@ -321,8 +319,8 @@ class Page extends \Magento\Core\Model\Resource\Db\AbstractDb
     /**
      *  Check whether page identifier is valid
      *
-     *  @param    \Magento\Core\Model\AbstractModel $object
-     *  @return   bool
+     * @param \Magento\Core\Model\AbstractModel $object
+     * @return bool
      */
     protected function isValidPageIdentifier(\Magento\Core\Model\AbstractModel $object)
     {
@@ -418,7 +416,7 @@ class Page extends \Magento\Core\Model\Resource\Db\AbstractDb
     /**
      * Get store ids to which specified item is assigned
      *
-     * @param int $id
+     * @param int $pageId
      * @return array
      */
     public function lookupStoreIds($pageId)
@@ -427,7 +425,7 @@ class Page extends \Magento\Core\Model\Resource\Db\AbstractDb
 
         $select  = $adapter->select()
             ->from($this->getTable('cms_page_store'), 'store_id')
-            ->where('page_id = ?',(int)$pageId);
+            ->where('page_id = ?', (int)$pageId);
 
         return $adapter->fetchCol($select);
     }
@@ -436,7 +434,7 @@ class Page extends \Magento\Core\Model\Resource\Db\AbstractDb
      * Set store model
      *
      * @param \Magento\Core\Model\Store $store
-     * @return \Magento\Cms\Model\Resource\Page
+     * @return $this
      */
     public function setStore($store)
     {
diff --git a/app/code/Magento/Cms/Model/Resource/Page/Collection.php b/app/code/Magento/Cms/Model/Resource/Page/Collection.php
index 26622b277b5..8b8d01851d4 100644
--- a/app/code/Magento/Cms/Model/Resource/Page/Collection.php
+++ b/app/code/Magento/Cms/Model/Resource/Page/Collection.php
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Cms\Model\Resource\Page;
 
 /**
  * CMS page collection
@@ -32,8 +32,6 @@
  * @package     Magento_Cms
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Model\Resource\Page;
-
 class Collection extends \Magento\Core\Model\Resource\Db\Collection\AbstractCollection
 {
     /**
@@ -76,6 +74,7 @@ class Collection extends \Magento\Core\Model\Resource\Db\Collection\AbstractColl
     /**
      * Define resource model
      *
+     * @return void
      */
     protected function _construct()
     {
@@ -116,7 +115,7 @@ class Collection extends \Magento\Core\Model\Resource\Db\Collection\AbstractColl
      * Set first store flag
      *
      * @param bool $flag
-     * @return \Magento\Cms\Model\Resource\Page\Collection
+     * @return $this
      */
     public function setFirstStoreFlag($flag = false)
     {
@@ -127,7 +126,7 @@ class Collection extends \Magento\Core\Model\Resource\Db\Collection\AbstractColl
     /**
      * Perform operations after collection load
      *
-     * @return \Magento\Cms\Model\Resource\Page\Collection
+     * @return $this
      */
     protected function _afterLoad()
     {
@@ -167,7 +166,7 @@ class Collection extends \Magento\Core\Model\Resource\Db\Collection\AbstractColl
      *
      * @param int|\Magento\Core\Model\Store $store
      * @param bool $withAdmin
-     * @return \Magento\Cms\Model\Resource\Page\Collection
+     * @return $this
      */
     public function addStoreFilter($store, $withAdmin = true)
     {
@@ -191,6 +190,8 @@ class Collection extends \Magento\Core\Model\Resource\Db\Collection\AbstractColl
 
     /**
      * Join store relation table if there is store filter
+     *
+     * @return void
      */
     protected function _renderFiltersBefore()
     {
diff --git a/app/code/Magento/Cms/Model/Resource/Page/Service.php b/app/code/Magento/Cms/Model/Resource/Page/Service.php
index 345c875cd3f..4210142823d 100644
--- a/app/code/Magento/Cms/Model/Resource/Page/Service.php
+++ b/app/code/Magento/Cms/Model/Resource/Page/Service.php
@@ -23,19 +23,19 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Cms\Model\Resource\Page;
 
 /**
  * Cms page service resource model
  *
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Model\Resource\Page;
-
 class Service extends \Magento\Core\Model\Resource\Db\AbstractDb
 {
     /**
      * Init cms page service model
      *
+     * @return void
      */
     protected function _construct()
     {
@@ -54,7 +54,7 @@ class Service extends \Magento\Core\Model\Resource\Db\AbstractDb
      * @param int $byStoreId
      * @param string $byLinkTable
      *
-     * @return \Magento\Cms\Model\Resource\Page\Service
+     * @return $this
      */
     public function unlinkConflicts($fromStoreId, $byStoreId, $byLinkTable = null)
     {
diff --git a/app/code/Magento/Cms/Model/Resource/Page/Urlrewrite.php b/app/code/Magento/Cms/Model/Resource/Page/Urlrewrite.php
index 6856bcfae0d..7aa9e496db6 100644
--- a/app/code/Magento/Cms/Model/Resource/Page/Urlrewrite.php
+++ b/app/code/Magento/Cms/Model/Resource/Page/Urlrewrite.php
@@ -23,19 +23,19 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Cms\Model\Resource\Page;
 
 /**
  * Cms page url rewrite resource model
  *
  * @author Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Model\Resource\Page;
-
 class Urlrewrite extends \Magento\Core\Model\Resource\Db\AbstractDb
 {
     /**
      * Init cms page urlrewrite model
      *
+     * @return void
      */
     protected function _construct()
     {
diff --git a/app/code/Magento/Cms/Model/Resource/Setup.php b/app/code/Magento/Cms/Model/Resource/Setup.php
index ad3918a6012..865e3b92980 100644
--- a/app/code/Magento/Cms/Model/Resource/Setup.php
+++ b/app/code/Magento/Cms/Model/Resource/Setup.php
@@ -21,12 +21,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Cms\Model\Resource;
 
 /**
  * Cms resource setup
  */
-namespace Magento\Cms\Model\Resource;
-
 class Setup extends \Magento\Core\Model\Resource\Setup\Generic
 {
     /**
@@ -43,6 +42,14 @@ class Setup extends \Magento\Core\Model\Resource\Setup\Generic
      */
     protected $_pageFactory;
 
+    /**
+     * @param \Magento\Core\Model\Resource\Setup\Context $context
+     * @param string $resourceName
+     * @param \Magento\Cms\Model\BlockFactory $blockFactory
+     * @param \Magento\Cms\Model\PageFactory $pageFactory
+     * @param string $moduleName
+     * @param string $connectionName
+     */
     public function __construct(
         \Magento\Core\Model\Resource\Setup\Context $context,
         $resourceName,
diff --git a/app/code/Magento/Cms/Model/Template/Filter.php b/app/code/Magento/Cms/Model/Template/Filter.php
index 6ff4cce0d92..77022f308de 100644
--- a/app/code/Magento/Cms/Model/Template/Filter.php
+++ b/app/code/Magento/Cms/Model/Template/Filter.php
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Cms\Model\Template;
 
 /**
  * Cms Template Filter Model
@@ -32,8 +32,6 @@
  * @package     Magento_Cms
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Model\Template;
-
 class Filter extends \Magento\Email\Model\Template\Filter
 {
     /**
@@ -47,7 +45,7 @@ class Filter extends \Magento\Email\Model\Template\Filter
      * Setter whether SID is allowed in store directive
      *
      * @param bool $flag
-     * @return \Magento\Cms\Model\Template\Filter
+     * @return $this
      */
     public function setUseSessionInUrl($flag)
     {
diff --git a/app/code/Magento/Cms/Model/Wysiwyg/Config.php b/app/code/Magento/Cms/Model/Wysiwyg/Config.php
index 2d4e04230c9..f0c66bc1492 100644
--- a/app/code/Magento/Cms/Model/Wysiwyg/Config.php
+++ b/app/code/Magento/Cms/Model/Wysiwyg/Config.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Cms\Model\Wysiwyg;
 
 /**
  * Wysiwyg Config for Editor HTML Element
@@ -31,8 +32,6 @@
  * @package     Magento_Cms
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Model\Wysiwyg;
-
 class Config extends \Magento\Object
 {
     /**
diff --git a/app/code/Magento/Cms/Model/Wysiwyg/Images/Storage.php b/app/code/Magento/Cms/Model/Wysiwyg/Images/Storage.php
index 8a02492c7a9..d9cb5fc9172 100644
--- a/app/code/Magento/Cms/Model/Wysiwyg/Images/Storage.php
+++ b/app/code/Magento/Cms/Model/Wysiwyg/Images/Storage.php
@@ -399,6 +399,7 @@ class Storage extends \Magento\Object
      * Delete by path
      *
      * @param string $path
+     * @return void
      */
     protected function _deleteByPath($path)
     {
@@ -413,7 +414,7 @@ class Storage extends \Magento\Object
      * Delete file (and its thumbnail if exists) from storage
      *
      * @param string $target File path to be deleted
-     * @return \Magento\Cms\Model\Wysiwyg\Images\Storage
+     * @return $this
      */
     public function deleteFile($target)
     {
@@ -477,8 +478,8 @@ class Storage extends \Magento\Object
      * Thumbnail path getter
      *
      * @param  string $filePath original file path
-     * @param  boolean $checkFile OPTIONAL is it necessary to check file availability
-     * @return string | false
+     * @param  bool $checkFile OPTIONAL is it necessary to check file availability
+     * @return string|false
      */
     public function getThumbnailPath($filePath, $checkFile = false)
     {
@@ -499,8 +500,8 @@ class Storage extends \Magento\Object
      * Thumbnail URL getter
      *
      * @param  string $filePath original file path
-     * @param  boolean $checkFile OPTIONAL is it necessary to check file availability
-     * @return string | false
+     * @param  bool $checkFile OPTIONAL is it necessary to check file availability
+     * @return string|false
      */
     public function getThumbnailUrl($filePath, $checkFile = false)
     {
@@ -556,7 +557,7 @@ class Storage extends \Magento\Object
     /**
      * Resize images on the fly in controller action
      *
-     * @param string File basename
+     * @param string $filename File basename
      * @return bool|string Thumbnail path or false for errors
      */
     public function resizeOnTheFly($filename)
@@ -673,6 +674,7 @@ class Storage extends \Magento\Object
      *
      * @param string $path
      *
+     * @return void
      * @throws \Magento\Core\Exception
      */
     protected function _validatePath($path)
diff --git a/app/code/Magento/Cms/Model/Wysiwyg/Images/Storage/Collection.php b/app/code/Magento/Cms/Model/Wysiwyg/Images/Storage/Collection.php
index 2ccf1fffd41..9c2c4940487 100644
--- a/app/code/Magento/Cms/Model/Wysiwyg/Images/Storage/Collection.php
+++ b/app/code/Magento/Cms/Model/Wysiwyg/Images/Storage/Collection.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Cms\Model\Wysiwyg\Images\Storage;
 
 /**
  * Wysiwyg Images storage collection
@@ -31,8 +32,6 @@
  * @package     Magento_Cms
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Cms\Model\Wysiwyg\Images\Storage;
-
 class Collection extends \Magento\Data\Collection\Filesystem
 {
     /**
@@ -50,6 +49,12 @@ class Collection extends \Magento\Data\Collection\Filesystem
         parent::__construct($entityFactory);
     }
 
+    /**
+     * Generate row
+     *
+     * @param string $filename
+     * @return array
+     */
     protected function _generateRow($filename)
     {
         $filename = preg_replace('~[/\\\]+~', '/', $filename);
diff --git a/app/code/Magento/Cms/etc/di.xml b/app/code/Magento/Cms/etc/di.xml
index ae12fb9bf39..f149d69eded 100644
--- a/app/code/Magento/Cms/etc/di.xml
+++ b/app/code/Magento/Cms/etc/di.xml
@@ -23,64 +23,54 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Cms\Model\Wysiwyg\Config">
-        <param name="windowSize">
-            <array>
-                <item key="height"><value type="int">600</value></item>
-                <item key="width"><value type="int">1000</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="windowSize" xsi:type="array">
+                <item name="height" xsi:type="number">600</item>
+                <item name="width" xsi:type="number">1000</item>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Cms\Model\Wysiwyg\Images\Storage">
-        <param name="resizeParameters">
-            <array>
-                <item key="height"><value type="int">75</value></item>
-                <item key="width"><value type="int">100</value></item>
-            </array>
-        </param>
-        <param name="extensions">
-            <array>
-                <item key="allowed">
-                    <array>
-                        <item key="jpg"><value type="int">1</value></item>
-                        <item key="jpeg"><value type="int">1</value></item>
-                        <item key="png"><value type="int">1</value></item>
-                        <item key="gif"><value type="int">1</value></item>
-                    </array>
+        <arguments>
+            <argument name="resizeParameters" xsi:type="array">
+                <item name="height" xsi:type="number">75</item>
+                <item name="width" xsi:type="number">100</item>
+            </argument>
+            <argument name="extensions" xsi:type="array">
+                <item name="allowed" xsi:type="array">
+                    <item name="jpg" xsi:type="number">1</item>
+                    <item name="jpeg" xsi:type="number">1</item>
+                    <item name="png" xsi:type="number">1</item>
+                    <item name="gif" xsi:type="number">1</item>
                 </item>
-                <item key="image_allowed">
-                    <array>
-                        <item key="jpg"><value type="int">1</value></item>
-                        <item key="jpeg"><value type="int">1</value></item>
-                        <item key="png"><value type="int">1</value></item>
-                        <item key="gif"><value type="int">1</value></item>
-                    </array>
+                <item name="image_allowed" xsi:type="array">
+                    <item name="jpg" xsi:type="number">1</item>
+                    <item name="jpeg" xsi:type="number">1</item>
+                    <item name="png" xsi:type="number">1</item>
+                    <item name="gif" xsi:type="number">1</item>
                 </item>
-                <item key="media_allowed">
-                    <array>
-                        <item key="flv"><value type="int">1</value></item>
-                        <item key="swf"><value type="int">1</value></item>
-                        <item key="avi"><value type="int">1</value></item>
-                        <item key="mov"><value type="int">1</value></item>
-                        <item key="rm"><value type="int">1</value></item>
-                        <item key="wmv"><value type="int">1</value></item>
-                    </array>
+                <item name="media_allowed" xsi:type="array">
+                    <item name="flv" xsi:type="number">1</item>
+                    <item name="swf" xsi:type="number">1</item>
+                    <item name="avi" xsi:type="number">1</item>
+                    <item name="mov" xsi:type="number">1</item>
+                    <item name="rm" xsi:type="number">1</item>
+                    <item name="wmv" xsi:type="number">1</item>
                 </item>
-            </array>
-        </param>
-        <param name="dirs">
-            <array>
-                <item key="exclude"><value/></item>
-                <item key="include"><value/></item>
-            </array>
-        </param>
+            </argument>
+            <argument name="dirs" xsi:type="array">
+                <item name="exclude" xsi:type="string"></item>
+                <item name="include" xsi:type="string"></item>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Module\Updater\SetupFactory">
-        <param name="resourceTypes">
-            <array>
-                <item key="cms_setup"><value>Magento\Cms\Model\Resource\Setup</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="resourceTypes" xsi:type="array">
+                <item name="cms_setup" xsi:type="string">Magento\Cms\Model\Resource\Setup</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Cms/etc/frontend/di.xml b/app/code/Magento/Cms/etc/frontend/di.xml
index f361f75775f..f7ebd1c3edd 100644
--- a/app/code/Magento/Cms/etc/frontend/di.xml
+++ b/app/code/Magento/Cms/etc/frontend/di.xml
@@ -23,18 +23,16 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\App\RouterList">
-        <param name="routerList">
-            <array>
-                <item key="cms">
-                    <array>
-                        <item key="instance"><value>Magento\Cms\Controller\Router</value></item>
-                        <item key="disable"><value type="bool">false</value></item>
-                        <item key="sortOrder"><value>60</value></item>
-                    </array>
+        <arguments>
+            <argument name="routerList" xsi:type="array">
+                <item name="cms" xsi:type="array">
+                    <item name="instance" xsi:type="string">Magento\Cms\Controller\Router</item>
+                    <item name="disable" xsi:type="boolean">false</item>
+                    <item name="sortOrder" xsi:type="string">60</item>
                 </item>
-            </array>
-        </param>
+            </argument>
+        </arguments>
     </type>
-</config>
\ No newline at end of file
+</config>
diff --git a/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Attribute/Edit/Tab/Advanced/Observer.php b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Attribute/Edit/Tab/Advanced/Observer.php
new file mode 100644
index 00000000000..11879d7495a
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Attribute/Edit/Tab/Advanced/Observer.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * Product edit form observer
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\ConfigurableProduct\Block\Adminhtml\Product\Attribute\Edit\Tab\Advanced;
+
+use Magento\Backend\Model\Config\Source;
+
+class Observer
+{
+    /**
+     * @var \Magento\Backend\Model\Config\Source\Yesno
+     */
+    protected $optionList;
+
+    /**
+     * @param Source\Yesno $optionList
+     */
+    public function __construct(Source\Yesno $optionList)
+    {
+        $this->optionList = $optionList;
+    }
+
+    /**
+     * @param \Magento\Event $event
+     */
+    public function observe($event)
+    {
+        /** @var \Magento\Data\Form\AbstractForm $form */
+        $form = $event->getForm();
+        /** @var  $fieldset */
+        $fieldset = $form->getElement('advanced_fieldset');
+
+        $fieldset->addField('is_configurable', 'select', array(
+            'name' => 'is_configurable',
+            'label' => __('Use To Create Configurable Product'),
+            'values' => $this->optionList->toOptionArray()
+        ));
+    }
+} 
diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit/Tab/Variations/Main.php b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Attribute/Edit/Tab/Variations/Main.php
similarity index 84%
rename from app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit/Tab/Variations/Main.php
rename to app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Attribute/Edit/Tab/Variations/Main.php
index 399a103ffdf..d035277e25e 100644
--- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/Edit/Tab/Variations/Main.php
+++ b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Attribute/Edit/Tab/Variations/Main.php
@@ -31,7 +31,7 @@
  * @package    Magento_Catalog
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Catalog\Block\Adminhtml\Product\Attribute\Edit\Tab\Variations;
+namespace Magento\ConfigurableProduct\Block\Adminhtml\Product\Attribute\Edit\Tab\Variations;
 
 
 class Main extends \Magento\Eav\Block\Adminhtml\Attribute\Edit\Main\AbstractMain
@@ -39,17 +39,16 @@ class Main extends \Magento\Eav\Block\Adminhtml\Attribute\Edit\Main\AbstractMain
     /**
      * Adding product form elements for editing attribute
      *
-     * @return \Magento\Catalog\Block\Adminhtml\Product\Attribute\Edit\Tab\Variations\Main
+     * @return \Magento\ConfigurableProduct\Block\Adminhtml\Product\Attribute\Edit\Tab\Variations\Main
      */
     protected function _prepareForm()
     {
         parent::_prepareForm();
-        $attributeObject = $this->getAttributeObject();
         /* @var $form \Magento\Data\Form */
         $form = $this->getForm();
         /* @var $fieldset \Magento\Data\Form\Element\Fieldset */
         $fieldset = $form->getElement('base_fieldset');
-        $fiedsToRemove = array(
+        $fieldsToRemove = array(
             'attribute_code',
             'is_unique',
             'frontend_class',
@@ -58,10 +57,10 @@ class Main extends \Magento\Eav\Block\Adminhtml\Attribute\Edit\Main\AbstractMain
         foreach ($fieldset->getElements() as $element) {
             /** @var \Magento\Data\Form\AbstractForm $element  */
             if (substr($element->getId(), 0, strlen('default_value')) == 'default_value') {
-                $fiedsToRemove[] = $element->getId();
+                $fieldsToRemove[] = $element->getId();
             }
         }
-        foreach ($fiedsToRemove as $id) {
+        foreach ($fieldsToRemove as $id) {
             $fieldset->removeField($id);
         }
         return $this;
diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/NewAttribute/Product/Created.php b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Attribute/NewAttribute/Product/Created.php
similarity index 96%
rename from app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/NewAttribute/Product/Created.php
rename to app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Attribute/NewAttribute/Product/Created.php
index 8ee8a2c1b9b..2e34422e13f 100644
--- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Attribute/NewAttribute/Product/Created.php
+++ b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Attribute/NewAttribute/Product/Created.php
@@ -31,7 +31,7 @@
  * @package    Magento_Catalog
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Catalog\Block\Adminhtml\Product\Attribute\NewAttribute\Product;
+namespace Magento\ConfigurableProduct\Block\Adminhtml\Product\Attribute\NewAttribute\Product;
 
 class Created extends \Magento\Backend\Block\Widget
 {
@@ -95,7 +95,7 @@ class Created extends \Magento\Backend\Block\Widget
         $attributes = array();
         /** @var $product \Magento\Catalog\Model\Product */
         $product = $this->_coreRegistry->registry('product');
-        foreach($product->getAttributes($this->getRequest()->getParam('group')) as $attribute) {
+        foreach ($product->getAttributes($this->getRequest()->getParam('group')) as $attribute) {
             /** @var $attribute \Magento\Eav\Model\Entity\Attribute */
             if ($attribute->getId() == $this->getRequest()->getParam('attribute')) {
                 $attributes[] = $attribute;
diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Composite/Fieldset/Configurable.php b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Composite/Fieldset/Configurable.php
similarity index 91%
rename from app/code/Magento/Catalog/Block/Adminhtml/Product/Composite/Fieldset/Configurable.php
rename to app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Composite/Fieldset/Configurable.php
index e034871c813..4a7bf053c92 100644
--- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Composite/Fieldset/Configurable.php
+++ b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Composite/Fieldset/Configurable.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Adminhtml block for fieldset of configurable product
+ *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -18,18 +20,12 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Adminhtml
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ConfigurableProduct\Block\Adminhtml\Product\Composite\Fieldset;
 
-/**
- * Adminhtml block for fieldset of configurable product
- */
-namespace Magento\Catalog\Block\Adminhtml\Product\Composite\Fieldset;
-
-class Configurable extends \Magento\Catalog\Block\Product\View\Type\Configurable
+class Configurable extends \Magento\ConfigurableProduct\Block\Product\View\Type\Configurable
 {
     /**
      * Retrieve product
diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Config.php b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config.php
similarity index 82%
rename from app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Config.php
rename to app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config.php
index d99e4682f1b..0c337a444fd 100644
--- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Config.php
+++ b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config.php
@@ -26,12 +26,10 @@
 
 /**
  * Adminhtml catalog super product configurable tab
- *
- * @category   Magento
- * @package    Magento_Catalog
- * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super;
+namespace Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super;
+
+use \Magento\ConfigurableProduct\Model\Product\Type\Configurable;
 
 use Magento\Catalog\Model\Product;
 use Magento\Core\Model\App;
@@ -58,7 +56,7 @@ class Config
     protected $_coreRegistry = null;
 
     /**
-     * @var \Magento\Catalog\Model\Product\Type\Configurable
+     * @var \Magento\ConfigurableProduct\Model\Product\Type\Configurable
      */
     protected $_configurableType;
 
@@ -70,7 +68,7 @@ class Config
     /**
      * @param \Magento\Backend\Block\Template\Context $context
      * @param \Magento\Json\EncoderInterface $jsonEncoder
-     * @param \Magento\Catalog\Model\Product\Type\Configurable $configurableType
+     * @param \Magento\ConfigurableProduct\Model\Product\Type\Configurable $configurableType
      * @param \Magento\Catalog\Helper\Data $catalogData
      * @param \Magento\Core\Model\Registry $coreRegistry
      * @param array $data
@@ -78,7 +76,7 @@ class Config
     public function __construct(
         \Magento\Backend\Block\Template\Context $context,
         \Magento\Json\EncoderInterface $jsonEncoder,
-        \Magento\Catalog\Model\Product\Type\Configurable $configurableType,
+        \Magento\ConfigurableProduct\Model\Product\Type\Configurable $configurableType,
         \Magento\Catalog\Helper\Data $catalogData,
         \Magento\Core\Model\Registry $coreRegistry,
         array $data = array()
@@ -86,6 +84,7 @@ class Config
         $this->_configurableType = $configurableType;
         $this->_coreRegistry = $coreRegistry;
         $this->_catalogData = $catalogData;
+        $this->_jsonEncoder = $jsonEncoder;
         parent::__construct($context, $data);
     }
 
@@ -157,7 +156,8 @@ class Config
             'class' => 'add',
             'onclick' => 'superProduct.createEmptyProduct()'
         ));
-        $this->addChild('super_settings', 'Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Settings');
+        $this->addChild('super_settings',
+            'Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Settings');
 
         $this->addChild(
             'generate',
@@ -171,7 +171,10 @@ class Config
                             'event' => 'generate',
                             'target' => '#product-variations-matrix',
                             'eventData' => array(
-                                'url' => $this->getUrl('catalog/*/generateVariations', array('_current' => true)),
+                                'url' => $this->getUrl(
+                                    'catalog/product_generateVariations/index',
+                                    array('_current' => true)
+                                ),
                             ),
                         ),
                     ),
@@ -240,6 +243,7 @@ class Config
      * Retrieve attributes data
      *
      * @return array
+     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
      */
     public function getAttributes()
     {
@@ -286,7 +290,7 @@ class Config
     {
         $products = $this->_configurableType
             ->getUsedProducts($this->getProduct());
-        if(!$products) {
+        if (!$products) {
             return '{}';
         }
         $data = array();
@@ -338,60 +342,6 @@ class Config
         return $this->getChildBlock('grid')->getJsObjectName();
     }
 
-    /**
-     * Retrieve Create New Empty Product URL
-     *
-     * @return string
-     */
-    public function getNewEmptyProductUrl()
-    {
-        return $this->getUrl(
-            '*/*/new',
-            array(
-                'set'      => $this->getProduct()->getAttributeSetId(),
-                'type'     => \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE,
-                'required' => $this->_getRequiredAttributesIds(),
-                'popup'    => 1
-            )
-        );
-    }
-
-    /**
-     * Retrieve Create New Product URL
-     *
-     * @return string
-     */
-    public function getNewProductUrl()
-    {
-        return $this->getUrl(
-            '*/*/new',
-            array(
-                'set'      => $this->getProduct()->getAttributeSetId(),
-                'type'     => \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE,
-                'required' => $this->_getRequiredAttributesIds(),
-                'popup'    => 1,
-                'product'  => $this->getProduct()->getId()
-            )
-        );
-    }
-
-    /**
-     * Retrieve Required attributes Ids (comma separated)
-     *
-     * @return string
-     */
-    protected function _getRequiredAttributesIds()
-    {
-        $attributesIds = array();
-        $configurableAttributes = $this->getProduct()
-            ->getTypeInstance()->getConfigurableAttributes($this->getProduct());
-        foreach ($configurableAttributes as $attribute) {
-            $attributesIds[] = $attribute->getProductAttribute()->getId();
-        }
-
-        return implode(',', $attributesIds);
-    }
-
     /**
      * Retrieve Tab label
      *
@@ -432,17 +382,6 @@ class Config
         return false;
     }
 
-    /**
-     * Show "Use default price" checkbox
-     *
-     * @return bool
-     */
-    public function getShowUseDefaultPrice()
-    {
-        return !$this->_catalogData->isPriceGlobal()
-            && $this->getProduct()->getStoreId();
-    }
-
     /**
      * Get list of used attributes
      *
@@ -450,7 +389,7 @@ class Config
      */
     public function getSelectedAttributes()
     {
-        return $this->getProduct()->isConfigurable()
+        return $this->getProduct()->getTypeId() == Configurable::TYPE_CODE
             ? array_filter($this->_configurableType->getUsedProductAttributes($this->getProduct()))
             : array();
     }
diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute.php b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute.php
similarity index 82%
rename from app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute.php
rename to app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute.php
index 675d4d46138..36b199c3ecf 100644
--- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute.php
+++ b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute.php
@@ -26,15 +26,11 @@
 
 /**
  * Renderer for attribute block
- *
- * @category   Magento
- * @package    Magento_Catalog
- * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config;
+namespace Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config;
 
 class Attribute
-    extends \Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config
+    extends \Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config
 {
     /**
      * Render block
diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Config/Grid/Filter/Inventory.php b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/Grid/Filter/Inventory.php
similarity index 88%
rename from app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Config/Grid/Filter/Inventory.php
rename to app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/Grid/Filter/Inventory.php
index adcbea35c7c..74439b3f6de 100644
--- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Config/Grid/Filter/Inventory.php
+++ b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/Grid/Filter/Inventory.php
@@ -27,12 +27,8 @@
 
 /**
  * Configurable product associated products in stock filter
- *
- * @category   Magento
- * @package    Magento_Catalog
- * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config\Grid\Filter;
+namespace Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config\Grid\Filter;
 
 use Magento\Backend\Block\Widget\Grid\Column\Filter\Select;
 
diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Config/Grid/Renderer/Checkbox.php b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/Grid/Renderer/Checkbox.php
similarity index 79%
rename from app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Config/Grid/Renderer/Checkbox.php
rename to app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/Grid/Renderer/Checkbox.php
index 5096329da0e..c84319e5a84 100644
--- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Config/Grid/Renderer/Checkbox.php
+++ b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/Grid/Renderer/Checkbox.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Adminhtml catalog super product link grid checkbox renderer
+ *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -18,21 +20,11 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Adminhtml
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
-/**
- * Adminhtml catalog super product link grid checkbox renderer
- *
- * @category   Magento
- * @package    Magento_Catalog
- * @author      Magento Core Team <core@magentocommerce.com>
- */
-
-namespace Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config\Grid\Renderer;
+namespace Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config\Grid\Renderer;
 
 class Checkbox extends \Magento\Backend\Block\Widget\Grid\Column\Renderer\Checkbox
 {
@@ -66,24 +58,28 @@ class Checkbox extends \Magento\Backend\Block\Widget\Grid\Column\Renderer\Checkb
     public function render(\Magento\Object $row)
     {
         $result = parent::render($row);
-        return $result.'<input type="hidden" class="value-json" value="'.htmlspecialchars($this->getAttributesJson($row)).'" />';
+        return $result . '<input type="hidden" class="value-json" value="'
+            . htmlspecialchars($this->getAttributesJson($row)) . '" />';
     }
 
     /**
+     * Get attributes json
+     *
      * @param \Magento\Object $row
      * @return string
      */
     public function getAttributesJson(\Magento\Object $row)
     {
-        if(!$this->getColumn()->getAttributes()) {
+        if (!$this->getColumn()->getAttributes()) {
             return '[]';
         }
 
         $result = array();
-        foreach($this->getColumn()->getAttributes() as $attribute) {
+        foreach ($this->getColumn()->getAttributes() as $attribute) {
             $productAttribute = $attribute->getProductAttribute();
-            if($productAttribute->getSourceModel()) {
-                $label = $productAttribute->getSource()->getOptionText($row->getData($productAttribute->getAttributeCode()));
+            if ($productAttribute->getSourceModel()) {
+                $label = $productAttribute->getSource()
+                    ->getOptionText($row->getData($productAttribute->getAttributeCode()));
             } else {
                 $label = $row->getData($productAttribute->getAttributeCode());
             }
diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Config/Grid/Renderer/Inventory.php b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/Grid/Renderer/Inventory.php
similarity index 87%
rename from app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Config/Grid/Renderer/Inventory.php
rename to app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/Grid/Renderer/Inventory.php
index 449a375b112..0ff25c7dd26 100644
--- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Config/Grid/Renderer/Inventory.php
+++ b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/Grid/Renderer/Inventory.php
@@ -27,12 +27,8 @@
 
 /**
  * Configurable product assocciated products grid in stock renderer
- *
- * @category   Magento
- * @package    Magento_Catalog
- * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config\Grid\Renderer;
+namespace Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config\Grid\Renderer;
 
 class Inventory extends \Magento\Backend\Block\Widget\Grid\Column\Renderer\AbstractRenderer
 {
diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Config/Matrix.php b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/Matrix.php
similarity index 95%
rename from app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Config/Matrix.php
rename to app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/Matrix.php
index d806c350127..ae74ec7ed7f 100644
--- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Config/Matrix.php
+++ b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/Matrix.php
@@ -26,12 +26,8 @@
 
 /**
  * Product variations matrix block
- *
- * @category   Magento
- * @package    Magento_Catalog
- * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config;
+namespace Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config;
 
 use Magento\Catalog\Model\Product;
 
@@ -46,7 +42,7 @@ class Matrix
     protected $_coreRegistry = null;
 
     /**
-     * @var \Magento\Catalog\Model\Product\Type\Configurable
+     * @var \Magento\ConfigurableProduct\Model\Product\Type\Configurable
      */
     protected $_configurableType;
 
@@ -62,7 +58,7 @@ class Matrix
 
     /**
      * @param \Magento\Backend\Block\Template\Context $context
-     * @param \Magento\Catalog\Model\Product\Type\Configurable $configurableType
+     * @param \Magento\ConfigurableProduct\Model\Product\Type\Configurable $configurableType
      * @param \Magento\Catalog\Model\Config $config
      * @param \Magento\Catalog\Model\ProductFactory $productFactory
      * @param \Magento\Core\Model\Registry $coreRegistry
@@ -70,7 +66,7 @@ class Matrix
      */
     public function __construct(
         \Magento\Backend\Block\Template\Context $context,
-        \Magento\Catalog\Model\Product\Type\Configurable $configurableType,
+        \Magento\ConfigurableProduct\Model\Product\Type\Configurable $configurableType,
         \Magento\Catalog\Model\Config $config,
         \Magento\Catalog\Model\ProductFactory $productFactory,
         \Magento\Core\Model\Registry $coreRegistry,
@@ -108,6 +104,7 @@ class Matrix
      * Retrieve all possible attribute values combinations
      *
      * @return array
+     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
      */
     public function getVariations()
     {
diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Config/Simple.php b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/Simple.php
similarity index 93%
rename from app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Config/Simple.php
rename to app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/Simple.php
index 8bfb0e04e32..41352766ce7 100644
--- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Config/Simple.php
+++ b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/Simple.php
@@ -26,18 +26,13 @@
 
 /**
  * Quick simple product creation
- *
- * @category   Magento
- * @package    Magento_Catalog
- * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config;
+namespace Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config;
 
 use Magento\Catalog\Model\Product;
 use Magento\Catalog\Model\ProductFactory;
 
-class Simple
-    extends \Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Attributes
+class Simple extends \Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Attributes
 {
     /**
      * Link to currently editing product
@@ -74,7 +69,11 @@ class Simple
     }
 
     /**
-     * @return void
+     * Prepare form
+     *
+     * @return null|void
+     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
+     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
      */
     protected function _prepareForm()
     {
@@ -105,7 +104,10 @@ class Simple
             if (($attribute->getIsRequired()
                 && $attribute->getApplyTo()
                 // If not applied to configurable
-                && !in_array(\Magento\Catalog\Model\Product\Type::TYPE_CONFIGURABLE, $attribute->getApplyTo())
+                && !in_array(
+                    \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE,
+                    $attribute->getApplyTo()
+                )
                 // If not used in configurable
                 && !in_array($attribute->getId(),
                     $this->getProduct()->getTypeInstance()->getUsedProductAttributeIds($this->getProduct()))
@@ -154,7 +156,7 @@ class Simple
         $usedAttributes = $this->getProduct()->getTypeInstance()->getUsedProductAttributes($this->getProduct());
         foreach ($usedAttributes as $attribute) {
             $attributeCode =  $attribute->getAttributeCode();
-            $fieldset->addField( 'simple_product_' . $attributeCode, 'select',  array(
+            $fieldset->addField('simple_product_' . $attributeCode, 'select', array(
                 'label' => $attribute->getFrontend()->getLabel(),
                 'name'  => $attributeCode,
                 'values' => $attribute->getSource()->getAllOptions(true, true),
diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Settings.php b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Settings.php
similarity index 91%
rename from app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Settings.php
rename to app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Settings.php
index 0460219e0f8..03561b09eae 100644
--- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Settings.php
+++ b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Settings.php
@@ -26,19 +26,16 @@
 
 /**
  * Create Configurable product Settings Tab Block
- *
- * @category   Magento
- * @package    Magento_Catalog
- * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super;
+namespace Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super;
 
+use \Magento\ConfigurableProduct\Model\Product\Type\Configurable;
 use Magento\Backend\Block\Widget\Form\Generic;
 
 class Settings extends Generic
 {
     /**
-     * @var \Magento\Catalog\Model\Product\Type\Configurable
+     * @var \Magento\ConfigurableProduct\Model\Product\Type\Configurable
      */
     protected $_configurableType;
 
@@ -51,7 +48,7 @@ class Settings extends Generic
      * @param \Magento\Backend\Block\Template\Context $context
      * @param \Magento\Core\Model\Registry $registry
      * @param \Magento\Data\FormFactory $formFactory
-     * @param \Magento\Catalog\Model\Product\Type\Configurable $configurableType
+     * @param \Magento\ConfigurableProduct\Model\Product\Type\Configurable $configurableType
      * @param \Magento\Core\Helper\Data $coreHelper
      * @param array $data
      */
@@ -59,7 +56,7 @@ class Settings extends Generic
         \Magento\Backend\Block\Template\Context $context,
         \Magento\Core\Model\Registry $registry,
         \Magento\Data\FormFactory $formFactory,
-        \Magento\Catalog\Model\Product\Type\Configurable $configurableType,
+        \Magento\ConfigurableProduct\Model\Product\Type\Configurable $configurableType,
         \Magento\Core\Helper\Data $coreHelper,
         array $data = array()
     ) {
@@ -115,7 +112,7 @@ class Settings extends Generic
         ));
 
         $product = $this->getProduct();
-        $usedAttributes = $product->isConfigurable()
+        $usedAttributes = $product->getTypeId() == Configurable::TYPE_CODE
             ? $this->_configurableType->getUsedProductAttributes($product)
             : array();
         foreach ($usedAttributes as $attribute) {
diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tabs/Configurable.php b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tabs/Configurable.php
similarity index 73%
rename from app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tabs/Configurable.php
rename to app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tabs/Configurable.php
index 1f99362064e..c2f0cca0ab4 100644
--- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tabs/Configurable.php
+++ b/app/code/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tabs/Configurable.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Edit tabs for configurable products
+ *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -18,34 +20,24 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Adminhtml
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-/**
- * admin edit tabs for configurable products
- *
- * @category    Magento
- * @package     Magento_Adminhtml
- * @author      Magento Core Team <core@magentocommerce.com>
- */
-namespace Magento\Catalog\Block\Adminhtml\Product\Edit\Tabs;
+namespace Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tabs;
 
 class Configurable extends \Magento\Catalog\Block\Adminhtml\Product\Edit\Tabs
 {
     /**
      * Preparing layout
      *
-     * @return \Magento\Catalog\Block\Adminhtml\Product\Edit\Tabs\Configurable
+     * @return \Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tabs\Configurable
      */
     protected function _prepareLayout()
     {
         $this->addTab('super_settings', array(
             'label'     => __('Configurable Product Settings'),
             'content'   => $this->getLayout()
-                ->createBlock('Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Settings')
+                ->createBlock('Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Settings')
                 ->toHtml(),
             'active'    => true
         ));
diff --git a/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Configurable.php b/app/code/Magento/ConfigurableProduct/Block/Cart/Item/Renderer/Configurable.php
similarity index 95%
rename from app/code/Magento/Checkout/Block/Cart/Item/Renderer/Configurable.php
rename to app/code/Magento/ConfigurableProduct/Block/Cart/Item/Renderer/Configurable.php
index d1dcfc14c35..9b386555257 100644
--- a/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Configurable.php
+++ b/app/code/Magento/ConfigurableProduct/Block/Cart/Item/Renderer/Configurable.php
@@ -22,7 +22,7 @@
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
-namespace Magento\Checkout\Block\Cart\Item\Renderer;
+namespace Magento\ConfigurableProduct\Block\Cart\Item\Renderer;
 
 use Magento\Catalog\Model\Config\Source\Product\Thumbnail as ThumbnailSource;
 
@@ -90,13 +90,13 @@ class Configurable extends \Magento\Checkout\Block\Cart\Item\Renderer
     }
 
     /**
-     * Get list of all otions for product
+     * Get list of all options for product
      *
      * @return array
      */
     public function getOptionList()
     {
-        return $this->_productConfig->getConfigurableOptions($this->getItem());
+        return $this->_productConfig->getOptions($this->getItem());
     }
 
     /**
diff --git a/app/code/Magento/Catalog/Block/Product/Configurable/AssociatedSelector/Backend/Grid/ColumnSet.php b/app/code/Magento/ConfigurableProduct/Block/Product/Configurable/AssociatedSelector/Backend/Grid/ColumnSet.php
similarity index 87%
rename from app/code/Magento/Catalog/Block/Product/Configurable/AssociatedSelector/Backend/Grid/ColumnSet.php
rename to app/code/Magento/ConfigurableProduct/Block/Product/Configurable/AssociatedSelector/Backend/Grid/ColumnSet.php
index c6734d2736f..37a1e7b8c40 100644
--- a/app/code/Magento/Catalog/Block/Product/Configurable/AssociatedSelector/Backend/Grid/ColumnSet.php
+++ b/app/code/Magento/ConfigurableProduct/Block/Product/Configurable/AssociatedSelector/Backend/Grid/ColumnSet.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Block representing set of columns in product grid
+ *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -18,21 +20,10 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Catalog
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-/**
- * Block representing set of columns in product grid
- *
- * @category   Magento
- * @package    Magento_Catalog
- * @author     Magento Core Team <core@magentocommerce.com>
- *
- */
-namespace Magento\Catalog\Block\Product\Configurable\AssociatedSelector\Backend\Grid;
+namespace Magento\ConfigurableProduct\Block\Product\Configurable\AssociatedSelector\Backend\Grid;
 
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
@@ -50,7 +41,7 @@ class ColumnSet
     /**
      * Product type configurable instance
      *
-     * @var \Magento\Catalog\Model\Product\Type\Configurable
+     * @var \Magento\ConfigurableProduct\Model\Product\Type\Configurable
      */
     protected $_productType;
 
@@ -59,7 +50,7 @@ class ColumnSet
      * @param \Magento\Backend\Model\Widget\Grid\Row\UrlGeneratorFactory $generatorFactory
      * @param \Magento\Backend\Model\Widget\Grid\SubTotals $subtotals
      * @param \Magento\Backend\Model\Widget\Grid\Totals $totals
-     * @param \Magento\Catalog\Model\Product\Type\Configurable $productType
+     * @param \Magento\ConfigurableProduct\Model\Product\Type\Configurable $productType
      * @param \Magento\Core\Model\Registry $registryManager
      * @param array $data
      */
@@ -68,7 +59,7 @@ class ColumnSet
         \Magento\Backend\Model\Widget\Grid\Row\UrlGeneratorFactory $generatorFactory,
         \Magento\Backend\Model\Widget\Grid\SubTotals $subtotals,
         \Magento\Backend\Model\Widget\Grid\Totals $totals,
-        \Magento\Catalog\Model\Product\Type\Configurable $productType,
+        \Magento\ConfigurableProduct\Model\Product\Type\Configurable $productType,
         \Magento\Core\Model\Registry $registryManager,
         array $data = array()
     ) {
@@ -91,7 +82,7 @@ class ColumnSet
     /**
      * Preparing layout
      *
-     * @return \Magento\Catalog\Block\Product\Configurable\AssociatedSelector\Backend\Grid\ColumnSet
+     * @return \Magento\ConfigurableProduct\Block\Product\Configurable\AssociatedSelector\Backend\Grid\ColumnSet
      */
     protected function _prepareLayout()
     {
diff --git a/app/code/Magento/Catalog/Block/Product/Configurable/AssociatedSelector/Renderer/Id.php b/app/code/Magento/ConfigurableProduct/Block/Product/Configurable/AssociatedSelector/Renderer/Id.php
similarity index 84%
rename from app/code/Magento/Catalog/Block/Product/Configurable/AssociatedSelector/Renderer/Id.php
rename to app/code/Magento/ConfigurableProduct/Block/Product/Configurable/AssociatedSelector/Renderer/Id.php
index e95e0195043..c1d85ac6e74 100644
--- a/app/code/Magento/Catalog/Block/Product/Configurable/AssociatedSelector/Renderer/Id.php
+++ b/app/code/Magento/ConfigurableProduct/Block/Product/Configurable/AssociatedSelector/Renderer/Id.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * ID column renderer, also contains image URL in hidden field
+ *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -18,24 +20,12 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Backend
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ConfigurableProduct\Block\Product\Configurable\AssociatedSelector\Renderer;
 
-/**
- * ID column renderer, also contains image URL in hidden field
- *
- * @category   Magento
- * @package    Magento_Catalog
- * @author     Magento Core Team <core@magentocommerce.com>
- */
-
-namespace Magento\Catalog\Block\Product\Configurable\AssociatedSelector\Renderer;
-
-class Id
-    extends \Magento\Backend\Block\Widget\Grid\Column\Renderer\AbstractRenderer
+class Id extends \Magento\Backend\Block\Widget\Grid\Column\Renderer\AbstractRenderer
 {
 
     /**
diff --git a/app/code/Magento/ConfigurableProduct/Block/Product/Configurable/AttributeSelector.php b/app/code/Magento/ConfigurableProduct/Block/Product/Configurable/AttributeSelector.php
new file mode 100644
index 00000000000..4122a7d929c
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/Block/Product/Configurable/AttributeSelector.php
@@ -0,0 +1,57 @@
+<?php
+/**
+ * Select attributes suitable for product variations generation
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\ConfigurableProduct\Block\Product\Configurable;
+
+/**
+ * @SuppressWarnings(PHPMD.LongVariable)
+ */
+class AttributeSelector extends \Magento\Backend\Block\Template
+{
+    /**
+     * Attribute set creation action URL
+     *
+     * @return string
+     */
+    public function getAttributeSetCreationUrl()
+    {
+        return $this->getUrl('*/product_set/save');
+    }
+
+    /**
+     * Get options for suggest widget
+     *
+     * @return array
+     */
+    public function getSuggestWidgetOptions()
+    {
+        return array(
+            'source' => $this->getUrl('*/product_attribute_suggestConfigurableAttributes'),
+            'minLength' => 0,
+            'className' => 'category-select',
+            'showAll' => true,
+        );
+    }
+}
diff --git a/app/code/Magento/Catalog/Block/Product/View/Type/Configurable.php b/app/code/Magento/ConfigurableProduct/Block/Product/View/Type/Configurable.php
similarity index 94%
rename from app/code/Magento/Catalog/Block/Product/View/Type/Configurable.php
rename to app/code/Magento/ConfigurableProduct/Block/Product/View/Type/Configurable.php
index 34bff6598a1..31ce1c9ed55 100644
--- a/app/code/Magento/Catalog/Block/Product/View/Type/Configurable.php
+++ b/app/code/Magento/ConfigurableProduct/Block/Product/View/Type/Configurable.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Catalog super product configurable part block
+ *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -18,22 +20,16 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Catalog
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ConfigurableProduct\Block\Product\View\Type;
 
+use Magento\Catalog\Model\Product\PriceModifierInterface;
 
 /**
- * Catalog super product configurable part block
- *
- * @category   Magento
- * @package    Magento_Catalog
- * @author      Magento Core Team <core@magentocommerce.com>
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
-namespace Magento\Catalog\Block\Product\View\Type;
-
 class Configurable extends \Magento\Catalog\Block\Product\View\AbstractView
 {
     /**
@@ -72,6 +68,11 @@ class Configurable extends \Magento\Catalog\Block\Product\View\AbstractView
      */
     protected $priceHelper;
 
+    /**
+     * @var \Magento\Catalog\Model\Product\PriceModifierInterface
+     */
+    protected $priceModifier;
+
     /**
      * @param \Magento\View\Element\Template\Context $context
      * @param \Magento\Catalog\Model\Config $catalogConfig
@@ -88,9 +89,10 @@ class Configurable extends \Magento\Catalog\Block\Product\View\AbstractView
      * @param \Magento\Json\EncoderInterface $jsonEncoder
      * @param \Magento\Catalog\Helper\Product $catalogProduct
      * @param \Magento\Catalog\Helper\Product\Price $priceHelper
+     * @param \Magento\Catalog\Model\Product\PriceModifierInterface $priceModifier
      * @param array $data
      * @param array $priceBlockTypes
-     * 
+     *
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
@@ -109,6 +111,7 @@ class Configurable extends \Magento\Catalog\Block\Product\View\AbstractView
         \Magento\Json\EncoderInterface $jsonEncoder,
         \Magento\Catalog\Helper\Product $catalogProduct,
         \Magento\Catalog\Helper\Product\Price $priceHelper,
+        PriceModifierInterface $priceModifier,
         array $data = array(),
         array $priceBlockTypes = array()
     ) {
@@ -116,6 +119,7 @@ class Configurable extends \Magento\Catalog\Block\Product\View\AbstractView
         $this->_catalogProduct = $catalogProduct;
         $this->_jsonEncoder = $jsonEncoder;
         $this->priceHelper = $priceHelper;
+        $this->priceModifier = $priceModifier;
         parent::__construct(
             $context,
             $catalogConfig,
@@ -156,7 +160,7 @@ class Configurable extends \Magento\Catalog\Block\Product\View\AbstractView
         $attributes = $this->getAllowAttributes();
         if (count($attributes)) {
             foreach ($attributes as $attribute) {
-                /** @var \Magento\Catalog\Model\Product\Type\Configurable\Attribute $attribute */
+                /** @var \Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute $attribute */
                 if ($attribute->getData('prices')) {
                     return true;
                 }
@@ -211,6 +215,9 @@ class Configurable extends \Magento\Catalog\Block\Product\View\AbstractView
      * Composes configuration for js
      *
      * @return string
+     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
+     * @SuppressWarnings(PHPMD.NPathComplexity)
+     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
      */
     public function getJsonConfig()
     {
@@ -274,10 +281,9 @@ class Configurable extends \Magento\Catalog\Block\Product\View\AbstractView
                         $this->_preparePrice($value['pricing_value'], $value['is_percent'])
                     );
                     $currentProduct->setParentId(true);
-                    $this->_eventManager->dispatch(
-                        'catalog_product_type_configurable_price',
-                        array('product' => $currentProduct)
-                    );
+                    $currentProduct->setConfigurablePrice($this->priceModifier->modifyPrice(
+                        $currentProduct->getConfigurablePrice(), $currentProduct
+                    ));
                     $configurablePrice = $currentProduct->getConfigurablePrice();
 
                     if (isset($options[$attributeId][$value['value_index']])) {
diff --git a/app/code/Magento/CatalogInventory/Block/Stockqty/Type/Configurable.php b/app/code/Magento/ConfigurableProduct/Block/Stockqty/Type/Configurable.php
similarity index 77%
rename from app/code/Magento/CatalogInventory/Block/Stockqty/Type/Configurable.php
rename to app/code/Magento/ConfigurableProduct/Block/Stockqty/Type/Configurable.php
index e564e1281e0..050678e6a3e 100644
--- a/app/code/Magento/CatalogInventory/Block/Stockqty/Type/Configurable.php
+++ b/app/code/Magento/ConfigurableProduct/Block/Stockqty/Type/Configurable.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Product stock qty block for configurable product type
+ *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -18,21 +20,11 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_CatalogInventory
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
-
-/**
- * Product stock qty block for configurable product type
- *
- * @category   Magento
- * @package    Magento_CatalogInventory
- * @author      Magento Core Team <core@magentocommerce.com>
- */
-namespace Magento\CatalogInventory\Block\Stockqty\Type;
+namespace Magento\ConfigurableProduct\Block\Stockqty\Type;
 
 use Magento\Catalog\Model\Product;
 
@@ -45,7 +37,6 @@ class Configurable extends \Magento\CatalogInventory\Block\Stockqty\Composite
      */
     protected function _getChildProducts()
     {
-        return $this->getProduct()->getTypeInstance()
-            ->getUsedProducts($this->getProduct());
+        return $this->getProduct()->getTypeInstance()->getUsedProducts($this->getProduct());
     }
 }
diff --git a/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product.php b/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product.php
new file mode 100644
index 00000000000..ccf5931d443
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product.php
@@ -0,0 +1,60 @@
+<?php
+/**
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\ConfigurableProduct\Controller\Adminhtml;
+
+use Magento\Backend\App\Action;
+
+class Product extends Action
+{
+    /**
+     * @var \Magento\Catalog\Controller\Adminhtml\Product\Builder
+     */
+    protected $productBuilder;
+
+    /**
+     * @param Action\Context $context
+     * @param \Magento\Catalog\Controller\Adminhtml\Product\Builder $productBuilder
+     */
+    public function __construct(
+        \Magento\Backend\App\Action\Context $context,
+        \Magento\Catalog\Controller\Adminhtml\Product\Builder $productBuilder
+    ) {
+        $this->productBuilder = $productBuilder;
+        parent::__construct($context);
+    }
+
+    /**
+     * Add "super" attribute from popup window
+     */
+    public function addAttributeAction()
+    {
+        $this->_view->loadLayout('popup');
+        $this->productBuilder->build($this->getRequest());
+        $attributeBlock = $this->_view->getLayout()
+            ->createBlock('Magento\ConfigurableProduct\Block\Adminhtml\Product\Attribute\NewAttribute\Product\Created');
+        $this->_addContent($attributeBlock);
+        $this->_view->renderLayout();
+    }
+}
diff --git a/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Attribute/SuggestConfigurableAttributes.php b/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Attribute/SuggestConfigurableAttributes.php
new file mode 100644
index 00000000000..b09a5ba8116
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Attribute/SuggestConfigurableAttributes.php
@@ -0,0 +1,76 @@
+<?php
+/**
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\ConfigurableProduct\Controller\Adminhtml\Product\Attribute;
+
+use Magento\Backend\App\Action;
+use Magento\ConfigurableProduct\Model\SuggestedAttributeList;
+
+class SuggestConfigurableAttributes extends Action
+{
+    /**
+     * @var \Magento\ConfigurableProduct\Model\SuggestedAttributeList
+     */
+    protected $attributeList;
+
+    /**
+     * @var \Magento\Core\Helper\Data
+     */
+    protected $coreHelper;
+
+    /**
+     * @param Action\Context $context
+     * @param SuggestedAttributeList $attributeList
+     * @param \Magento\Core\Helper\Data $coreHelper
+     */
+    public function __construct(
+        Action\Context $context, SuggestedAttributeList $attributeList, \Magento\Core\Helper\Data $coreHelper
+    ) {
+        $this->attributeList = $attributeList;
+        $this->coreHelper = $coreHelper;
+        parent::__construct($context);
+    }
+
+    /**
+     * ACL check
+     *
+     * @return bool
+     */
+    protected function _isAllowed()
+    {
+        return $this->_authorization->isAllowed('Magento_Catalog::attributes_attributes');
+    }
+
+    /**
+     * Search for attributes by part of attribute's label in admin store
+     */
+    public function indexAction()
+    {
+        $this->getResponse()->setBody(
+            $this->coreHelper->jsonEncode(
+                $this->attributeList->getSuggestedAttributes($this->getRequest()->getParam('label_part'))
+            )
+        );
+    }
+}
diff --git a/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Builder/Plugin.php b/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Builder/Plugin.php
new file mode 100644
index 00000000000..5995ff5fea8
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Builder/Plugin.php
@@ -0,0 +1,115 @@
+<?php
+/**
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\ConfigurableProduct\Controller\Adminhtml\Product\Builder;
+
+use Magento\Catalog\Model\ProductFactory;
+use Magento\Code\Plugin\InvocationChain;
+use Magento\ConfigurableProduct\Model\Product\Type;
+
+class Plugin
+{
+    /**
+     * @var ProductFactory
+     */
+    protected $productFactory;
+
+    /**
+     * @var \Magento\ConfigurableProduct\Model\Product\Type\Configurable
+     */
+    protected $configurableType;
+
+    /**
+     * @param ProductFactory $productFactory
+     * @param Type\Configurable $configurableType
+     */
+    public function __construct(ProductFactory $productFactory, Type\Configurable $configurableType)
+    {
+        $this->productFactory = $productFactory;
+        $this->configurableType = $configurableType;
+    }
+
+    /**
+     * @param array $arguments
+     * @param InvocationChain $invocationChain
+     * @return \Magento\Catalog\Model\Product
+     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
+     */
+    public function aroundBuild(array $arguments, InvocationChain $invocationChain)
+    {
+        /** @var \Magento\Catalog\Model\Product $product */
+        $product = $invocationChain->proceed($arguments);
+        /** @var \Magento\App\RequestInterface $request */
+        $request = $arguments[0];
+
+        if ($request->has('attributes')) {
+            $attributes = $request->getParam('attributes');
+            if (!empty($attributes)) {
+                $product->setTypeId(\Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE);
+                $this->configurableType->setUsedProductAttributeIds($attributes, $product);
+            } else {
+                $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE);
+            }
+        }
+
+        // Required attributes of simple product for configurable creation
+        if ($request->getParam('popup')
+            && $requiredAttributes = $request->getParam('required')) {
+            $requiredAttributes = explode(",", $requiredAttributes);
+            foreach ($product->getAttributes() as $attribute) {
+                if (in_array($attribute->getId(), $requiredAttributes)) {
+                    $attribute->setIsRequired(1);
+                }
+            }
+        }
+
+        if ($request->getParam('popup')
+            && $request->getParam('product')
+            && !is_array($request->getParam('product'))
+            && $request->getParam('id', false) === false
+        ) {
+            $configProduct = $this->productFactory->create();
+            $configProduct->setStoreId(0)
+                ->load($request->getParam('product'))
+                ->setTypeId($request->getParam('type'));
+
+            $data = array();
+            foreach ($configProduct->getTypeInstance()->getEditableAttributes($configProduct) as $attribute) {
+                /* @var $attribute \Magento\Catalog\Model\Resource\Eav\Attribute */
+                if (!$attribute->getIsUnique()
+                    && $attribute->getFrontend()->getInputType() != 'gallery'
+                    && $attribute->getAttributeCode() != 'required_options'
+                    && $attribute->getAttributeCode() != 'has_options'
+                    && $attribute->getAttributeCode() != $configProduct->getIdFieldName()
+                ) {
+                    $data[$attribute->getAttributeCode()] = $configProduct->getData($attribute->getAttributeCode());
+                }
+            }
+            $product->addData($data);
+            $product->setWebsiteIds($configProduct->getWebsiteIds());
+        }
+
+        return $product;
+    }
+}
diff --git a/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/GenerateVariations.php b/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/GenerateVariations.php
new file mode 100644
index 00000000000..021e7739a7a
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/GenerateVariations.php
@@ -0,0 +1,134 @@
+<?php
+/**
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\ConfigurableProduct\Controller\Adminhtml\Product;
+
+use Magento\Backend\App\Action;
+use Magento\Catalog\Controller\Adminhtml\Product;
+use Magento\Catalog\Model\Resource\Eav\AttributeFactory;
+
+class GenerateVariations extends Action
+{
+    /**
+     * @var Product\Initialization\Helper
+     */
+    protected $initializationHelper;
+
+    /**
+     * @var Product\Builder
+     */
+    protected $productBuilder;
+
+    /**
+     * @var \Magento\Catalog\Model\Resource\Eav\AttributeFactory
+     */
+    protected $attributeFactory;
+
+    /**
+     * @param Action\Context $context
+     * @param Product\Initialization\Helper $initializationHelper
+     * @param Product\Builder $productBuilder
+     * @param AttributeFactory $attributeFactory
+     */
+    public function __construct(
+        Action\Context $context,
+        Product\Initialization\Helper $initializationHelper,
+        Product\Builder $productBuilder,
+        AttributeFactory $attributeFactory
+    ) {
+        $this->initializationHelper = $initializationHelper;
+        $this->productBuilder = $productBuilder;
+        $this->attributeFactory = $attributeFactory;
+        parent::__construct($context);
+    }
+
+    /**
+     * Check for is allowed
+     *
+     * @return boolean
+     */
+    protected function _isAllowed()
+    {
+        return $this->_authorization->isAllowed('Magento_Catalog::products');
+    }
+
+    /**
+     * Generate product variations matrix
+     */
+    public function indexAction()
+    {
+        $this->_saveAttributeOptions();
+        $this->initializationHelper->initialize($this->productBuilder->build($this->getRequest()));
+        $this->_view->loadLayout();
+        $this->_view->renderLayout();
+    }
+
+    /**
+     * Save attribute options just created by user
+     *
+     * @TODO Move this logic to configurable product type model
+     *   when full set of operations for attribute options during
+     *   product creation will be implemented: edit labels, remove, reorder.
+     * Currently only addition of options to end and removal of just added option is supported.
+     */
+    protected function _saveAttributeOptions()
+    {
+        $productData = (array)$this->getRequest()->getParam('product');
+        if (!isset($productData['configurable_attributes_data'])) {
+            return;
+        }
+
+        foreach ($productData['configurable_attributes_data'] as &$attributeData) {
+            $values = array();
+            foreach ($attributeData['values'] as $valueId => $priceData) {
+                if (isset($priceData['label'])) {
+                    $attribute = $this->attributeFactory->create();
+                    $attribute->load($attributeData['attribute_id']);
+                    $optionsBefore = $attribute->getSource()->getAllOptions(false);
+
+                    $attribute->setOption(array(
+                        'value' => array('option_0' => array($priceData['label'])),
+                        'order' => array('option_0' => count($optionsBefore) + 1),
+                    ));
+                    $attribute->save();
+
+                    $attribute = $this->attributeFactory->create();
+                    $attribute->load($attributeData['attribute_id']);
+                    $optionsAfter = $attribute->getSource()->getAllOptions(false);
+
+                    $newOption = array_pop($optionsAfter);
+
+                    unset($priceData['label']);
+                    $valueId = $newOption['value'];
+                    $priceData['value_index'] = $valueId;
+                }
+                $values[$valueId] = $priceData;
+            }
+            $attributeData['values'] = $values;
+        }
+
+        $this->getRequest()->setParam('product', $productData);
+    }
+}
+
diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper/Plugin/Configurable.php b/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Initialization/Helper/Plugin/Configurable.php
similarity index 88%
rename from app/code/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper/Plugin/Configurable.php
rename to app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Initialization/Helper/Plugin/Configurable.php
index 8e56f81f9e8..0cc8aabb2b5 100644
--- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper/Plugin/Configurable.php
+++ b/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Initialization/Helper/Plugin/Configurable.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Product initialzation helper
+ *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -21,17 +23,16 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ConfigurableProduct\Controller\Adminhtml\Product\Initialization\Helper\Plugin;
 
-namespace Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper\Plugin;
-
-class Configurable 
+class Configurable
 {
     /**
-     * @param \Magento\Catalog\Model\Product\Type\Configurable $productType
+     * @param \Magento\ConfigurableProduct\Model\Product\Type\Configurable $productType
      * @param \Magento\App\RequestInterface $request
      */
     public function __construct(
-        \Magento\Catalog\Model\Product\Type\Configurable $productType,
+        \Magento\ConfigurableProduct\Model\Product\Type\Configurable $productType,
         \Magento\App\RequestInterface $request
     ) {
         $this->productType = $productType;
diff --git a/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Initialization/Helper/Plugin/Handler/ProductType/Configurable.php b/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Initialization/Helper/Plugin/Handler/ProductType/Configurable.php
new file mode 100644
index 00000000000..c0520c2b117
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Initialization/Helper/Plugin/Handler/ProductType/Configurable.php
@@ -0,0 +1,79 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ConfigurableProduct\Controller\Adminhtml\Product\Initialization\Helper\Plugin\Handler\ProductType;
+
+use Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper\HandlerInterface;
+use Magento\Catalog\Model\Product;
+
+class Configurable implements HandlerInterface
+{
+    /**
+     * Handle data received from Associated Products tab of configurable product
+     *
+     * @param Product $product
+     * @return void
+     */
+    public function handle(Product $product)
+    {
+        if ($product->getTypeId() != \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE) {
+            return;
+        }
+
+        /** @var \Magento\ConfigurableProduct\Model\Product\Type\Configurable $type */
+        $type = $product->getTypeInstance();
+        $originalAttributes = $type->getConfigurableAttributesAsArray($product);
+        // Organize main information about original product attributes in assoc array form
+        $originalAttributesMainInfo = array();
+        if (is_array($originalAttributes)) {
+            foreach ($originalAttributes as $originalAttribute) {
+                $originalAttributesMainInfo[$originalAttribute['id']] = array();
+                foreach ($originalAttribute['values'] as $value) {
+                    $originalAttributesMainInfo[$originalAttribute['id']][$value['value_index']] = array(
+                        'is_percent'    => $value['is_percent'],
+                        'pricing_value' => $value['pricing_value']
+                    );
+                }
+            }
+        }
+        $attributeData = $product->getConfigurableAttributesData();
+        if (is_array($attributeData)) {
+            foreach ($attributeData as &$data) {
+                $id = $data['attribute_id'];
+                foreach ($data['values'] as &$value) {
+                    $valueIndex = $value['value_index'];
+                    if (isset($originalAttributesMainInfo[$id][$valueIndex])) {
+                        $value['pricing_value'] =
+                            $originalAttributesMainInfo[$id][$valueIndex]['pricing_value'];
+                        $value['is_percent'] = $originalAttributesMainInfo[$id][$valueIndex]['is_percent'];
+                    } else {
+                        $value['pricing_value'] = 0;
+                        $value['is_percent'] = 0;
+                    }
+                }
+            }
+            $product->setConfigurableAttributesData($attributeData);
+        }
+    }
+} 
diff --git a/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/SuperConfig.php b/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/SuperConfig.php
new file mode 100644
index 00000000000..30e39d26efc
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/Controller/Adminhtml/Product/SuperConfig.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * Super config product controller
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\ConfigurableProduct\Controller\Adminhtml\Product;
+
+use Magento\Backend\App\Action;
+use Magento\Catalog\Controller\Adminhtml\Product;
+
+class SuperConfig extends Action
+{
+    /**
+     * @var \Magento\Catalog\Controller\Adminhtml\Product\Builder
+     */
+    protected $productBuilder;
+
+    /**
+     * @param Action\Context $context
+     * @param Product\Builder $productBuilder
+     */
+    public function __construct(
+        Action\Context $context,
+        Product\Builder $productBuilder
+    ) {
+        $this->productBuilder = $productBuilder;
+        parent::__construct($context);
+    }
+
+    public function indexAction()
+    {
+        $this->productBuilder->build($this->getRequest());
+        $this->_view->loadLayout(false);
+        $this->_view->renderLayout();
+    }
+} 
diff --git a/app/code/Magento/ConfigurableProduct/Helper/Product/Configuration/Plugin.php b/app/code/Magento/ConfigurableProduct/Helper/Product/Configuration/Plugin.php
new file mode 100644
index 00000000000..2a0c7583556
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/Helper/Product/Configuration/Plugin.php
@@ -0,0 +1,50 @@
+<?php
+/**
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\ConfigurableProduct\Helper\Product\Configuration;
+
+use Magento\Code\Plugin\InvocationChain;
+
+class Plugin
+{
+    /**
+     * Retrieve configuration options for configurable product
+     *
+     * @param array $arguments
+     * @param InvocationChain $invocationChain
+     * @return array
+     */
+    public function aroundGetOptions(array $arguments, InvocationChain $invocationChain)
+    {
+        /** @var \Magento\Catalog\Model\Product\Configuration\Item\ItemInterface $item */
+        $item = $arguments[0];
+        $product = $item->getProduct();
+        $typeId = $product->getTypeId();
+        if ($typeId == \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE) {
+            $attributes = $product->getTypeInstance()->getSelectedAttributesInfo($product);
+            return array_merge($attributes, $invocationChain->proceed($arguments));
+        }
+        return $invocationChain->proceed($arguments);
+    }
+} 
diff --git a/app/code/Magento/ConfigurableProduct/Model/Attribute/LockValidator.php b/app/code/Magento/ConfigurableProduct/Model/Attribute/LockValidator.php
new file mode 100644
index 00000000000..95545af8558
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/Model/Attribute/LockValidator.php
@@ -0,0 +1,79 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ConfigurableProduct\Model\Attribute;
+
+use Magento\Catalog\Model\Attribute\LockValidatorInterface;
+
+class LockValidator implements LockValidatorInterface
+{
+    /**
+     * @var \Magento\App\Resource
+     */
+    protected $resource;
+
+    /**
+     * @param \Magento\App\Resource $resource
+     */
+    public function __construct(\Magento\App\Resource $resource)
+    {
+        $this->resource = $resource;
+    }
+
+    /**
+     * Check attribute lock state
+     *
+     * @param \Magento\Core\Model\AbstractModel $object
+     * @param null $attributeSet
+     * @throws \Magento\Core\Exception
+     *
+     * @return void
+     */
+    public function validate(\Magento\Core\Model\AbstractModel $object, $attributeSet = null)
+    {
+        $adapter = $this->resource->getConnection('read');
+        $attrTable    = $this->resource->getTableName('catalog_product_super_attribute');
+        $productTable = $this->resource->getTableName('catalog_product_entity');
+
+        $bind = array('attribute_id' => $object->getAttributeId());
+        $select = clone $adapter->select();
+        $select->reset()
+            ->from(array('main_table' => $attrTable), array('psa_count' => 'COUNT(product_super_attribute_id)'))
+            ->join(array('entity' => $productTable), 'main_table.product_id = entity.entity_id')
+            ->where('main_table.attribute_id = :attribute_id')
+            ->group('main_table.attribute_id')
+            ->limit(1);
+
+        if ($attributeSet !== null) {
+            $bind['attribute_set_id'] = $attributeSet;
+            $select->where('entity.attribute_set_id = :attribute_set_id');
+        }
+
+        if ($adapter->fetchOne($select, $bind)) {
+            throw new \Magento\Core\Exception(
+                __('This attribute is used in configurable products.')
+            );
+        }
+    }
+} 
diff --git a/app/code/Magento/ConfigurableProduct/Model/Entity/Product/Attribute/Group/AttributeMapper/Plugin.php b/app/code/Magento/ConfigurableProduct/Model/Entity/Product/Attribute/Group/AttributeMapper/Plugin.php
new file mode 100644
index 00000000000..f4d632357aa
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/Model/Entity/Product/Attribute/Group/AttributeMapper/Plugin.php
@@ -0,0 +1,79 @@
+<?php
+/**
+ * Product Attribute Group mapper plugin. Adds Configurable product information
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\ConfigurableProduct\Model\Entity\Product\Attribute\Group\AttributeMapper;
+
+use Magento\Code\Plugin\InvocationChain;
+use Magento\Core\Model\Registry;
+use Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\AttributeFactory;
+
+class Plugin
+{
+    /**
+     * @var \Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\AttributeFactory
+     */
+    protected $attributeFactory;
+
+    /**
+     * @var \Magento\Core\Model\Registry
+     */
+    protected $registry;
+
+    /**
+     * @var array
+     */
+    protected $configurableAttributes;
+
+    /**
+     * @param AttributeFactory $attributeFactory
+     * @param Registry $registry
+     */
+    public function __construct(
+        AttributeFactory $attributeFactory,
+        Registry $registry
+    ) {
+        $this->registry = $registry;
+        $this->attributeFactory = $attributeFactory;
+    }
+
+    /**
+     * Add is_configurable field to attribute presentation
+     *
+     * @param array $arguments
+     * @param InvocationChain $invocationChain
+     * @return mixed
+     */
+    public function aroundMap($arguments, InvocationChain $invocationChain)
+    {
+        $setId = $this->registry->registry('current_attribute_set')->getId();
+        $attribute = $arguments[0];
+        $result = $invocationChain->proceed($arguments);
+        if (!isset($this->configurableAttributes[$setId])) {
+            $this->configurableAttributes[$setId] = $this->attributeFactory->create()->getUsedAttributes($setId);
+        }
+        $result['is_configurable'] = (int)in_array($attribute->getAttributeId(), $this->configurableAttributes[$setId]);
+        return $result;
+    }
+} 
diff --git a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/TestObject.php b/app/code/Magento/ConfigurableProduct/Model/Export/Entity/Product/Type/Configurable.php
similarity index 80%
rename from dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/TestObject.php
rename to app/code/Magento/ConfigurableProduct/Model/Export/Entity/Product/Type/Configurable.php
index 252bca1aef2..7681cd5c5ac 100644
--- a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/TestObject.php
+++ b/app/code/Magento/ConfigurableProduct/Model/Export/Entity/Product/Type/Configurable.php
@@ -18,18 +18,13 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Core
- * @subpackage  unit_tests
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
-namespace Magento\Core\Model\Layout\Argument\Handler;
+namespace Magento\ConfigurableProduct\Model\Export\Entity\Product\Type;
 
-class TestObject extends \Magento\Data\Collection
+class Configurable
+    extends \Magento\ImportExport\Model\Export\Entity\Product\Type\AbstractType
 {
-    public function testMethod()
-    {
-    }
 }
diff --git a/app/code/Magento/ConfigurableProduct/Model/Export/RowCustomizer.php b/app/code/Magento/ConfigurableProduct/Model/Export/RowCustomizer.php
new file mode 100644
index 00000000000..3e5f3780f6c
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/Model/Export/RowCustomizer.php
@@ -0,0 +1,122 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ConfigurableProduct\Model\Export;
+
+use Magento\ImportExport\Model\Export\RowCustomizerInterface;
+
+class RowCustomizer implements RowCustomizerInterface
+{
+    /**
+     * @var array
+     */
+    protected $configurableData = array();
+
+    /**
+     * Prepare configurable data for export
+     *
+     * @param \Magento\Catalog\Model\Resource\Product\Collection $collection
+     * @param int $productIds
+     */
+    public function prepareData($collection, $productIds)
+    {
+        $collection->addAttributeToFilter(
+            'entity_id',
+            array(
+                'in'    => $productIds
+            )
+        )->addAttributeToFilter(
+                'type_id',
+                array(
+                    'eq'    => \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE
+                )
+            );
+
+        while ($product = $collection->fetchItem()) {
+            $productAttributesOptions = $product->getTypeInstance()->getConfigurableOptions($product);
+
+            foreach ($productAttributesOptions as $productAttributeOption) {
+                $this->configurableData[$product->getId()] = array();
+                foreach ($productAttributeOption as $optionValues) {
+                    $priceType = $optionValues['pricing_is_percent'] ? '%' : '';
+                    $this->configurableData[$product->getId()][] = array(
+                        '_super_products_sku'           => $optionValues['sku'],
+                        '_super_attribute_code'         => $optionValues['attribute_code'],
+                        '_super_attribute_option'       => $optionValues['option_title'],
+                        '_super_attribute_price_corr'   => $optionValues['pricing_value'] . $priceType
+                    );
+                }
+            }
+        }
+    }
+
+    /**
+     * Set headers columns
+     *
+     * @param array $columns
+     * @return array
+     */
+    public function addHeaderColumns($columns)
+    {
+        // have we merge configurable products data
+        if (!empty($this->configurableData)) {
+            $columns =  array_merge($columns, array(
+                '_super_products_sku', '_super_attribute_code',
+                '_super_attribute_option', '_super_attribute_price_corr'
+            ));
+        }
+        return $columns;
+    }
+
+    /**
+     * Add configurable data for export
+     *
+     * @param array $dataRow
+     * @param int $productId
+     * @return array
+     */
+    public function addData($dataRow, $productId)
+    {
+        if (!empty($this->configurableData[$productId])) {
+            $dataRow = array_merge($dataRow, array_shift($this->configurableData[$productId]));
+
+        }
+        return $dataRow;
+    }
+
+    /**
+     * Calculate the largest links block
+     *
+     * @param array $additionalRowsCount
+     * @param int $productId
+     * @return array
+     */
+    public function getAdditionalRowsCount($additionalRowsCount, $productId)
+    {
+        if (!empty($this->configurableData[$productId])) {
+            $additionalRowsCount = max($additionalRowsCount, count($this->configurableData[$productId]));
+        }
+        return $additionalRowsCount;
+    }
+}
diff --git a/app/code/Magento/ImportExport/Model/Import/Entity/Product/Type/Configurable.php b/app/code/Magento/ConfigurableProduct/Model/Import/Entity/Product/Type/Configurable.php
similarity index 96%
rename from app/code/Magento/ImportExport/Model/Import/Entity/Product/Type/Configurable.php
rename to app/code/Magento/ConfigurableProduct/Model/Import/Entity/Product/Type/Configurable.php
index bb35aec1770..0e85fd9a58f 100644
--- a/app/code/Magento/ImportExport/Model/Import/Entity/Product/Type/Configurable.php
+++ b/app/code/Magento/ConfigurableProduct/Model/Import/Entity/Product/Type/Configurable.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Import entity configurable product type model
+ * 
  * Magento
  *
  * NOTICE OF LICENSE
@@ -18,20 +20,11 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_ImportExport
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
-/**
- * Import entity configurable product type model
- *
- * @category    Magento
- * @package     Magento_ImportExport
- * @author      Magento Core Team <core@magentocommerce.com>
- */
-namespace Magento\ImportExport\Model\Import\Entity\Product\Type;
+namespace Magento\ConfigurableProduct\Model\Import\Entity\Product\Type;
 
 class Configurable
     extends \Magento\ImportExport\Model\Import\Entity\Product\Type\AbstractType
@@ -59,7 +52,7 @@ class Configurable
     /**
      * Column names that holds values with particular meaning.
      *
-     * @var array
+     * @var string[]
      */
     protected $_specialAttributes = array(
         '_super_products_sku', '_super_attribute_code', '_super_attribute_option',
@@ -69,7 +62,7 @@ class Configurable
     /**
      * Reference array of existing product-attribute to product super attribute ID.
      *
-     * product_1 (underscore) attribute_id_1 => product_super_attr_id_1,
+     * Example: product_1 (underscore) attribute_id_1 => product_super_attr_id_1,
      * product_1 (underscore) attribute_id_2 => product_super_attr_id_2,
      * ...,
      * product_n (underscore) attribute_id_n => product_super_attr_id_n
@@ -178,17 +171,18 @@ class Configurable
     /**
      * Add attribute parameters to appropriate attribute set.
      *
-     * @param string $attrParams Name of attribute set.
+     * @param string $attrSetName Name of attribute set.
      * @param array $attrParams Refined attribute parameters.
+     * @param mixed $attribute
      * @return \Magento\ImportExport\Model\Import\Entity\Product\Type\AbstractType
      */
-    protected function _addAttributeParams($attrSetName, array $attrParams)
+    protected function _addAttributeParams($attrSetName, array $attrParams, $attribute)
     {
         // save super attributes for simplier and quicker search in future
-        if ('select' == $attrParams['type'] && 1 == $attrParams['is_global'] && $attrParams['for_configurable']) {
+        if ('select' == $attrParams['type'] && 1 == $attrParams['is_global'] && $attribute->getIsConfigurable()) {
             $this->_superAttributes[$attrParams['code']] = $attrParams;
         }
-        return parent::_addAttributeParams($attrSetName, $attrParams);
+        return parent::_addAttributeParams($attrSetName, $attrParams, $attribute);
     }
 
     /**
@@ -222,7 +216,7 @@ class Configurable
      * Is attribute is super-attribute?
      *
      * @param string $attrCode
-     * @return boolean
+     * @return bool
      */
     protected function _isAttributeSuper($attrCode)
     {
@@ -265,7 +259,7 @@ class Configurable
     /**
      * Array of SKU to array of super attribute values for all products.
      *
-     * @return \Magento\ImportExport\Model\Import\Entity\Product\Type\Configurable
+     * @return $this
      */
     protected function _loadSkuSuperAttributeValues()
     {
@@ -292,7 +286,7 @@ class Configurable
     /**
      * Array of SKU to array of super attribute values for all products.
      *
-     * @return \Magento\ImportExport\Model\Import\Entity\Product\Type\Configurable
+     * @return $this
      */
     protected function _loadSkuSuperData()
     {
@@ -326,7 +320,8 @@ class Configurable
      *
      * @param array $superData
      * @param array $superAttributes
-     * @return \Magento\ImportExport\Model\Import\Entity\Product\Type\Configurable
+     * @return $this
+     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
      */
     protected function _processSuperData(array $superData, array &$superAttributes)
     {
@@ -385,6 +380,9 @@ class Configurable
      *
      * @throws \Exception
      * @return \Magento\ImportExport\Model\Import\Entity\Product\Type\AbstractType
+     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
+     * @SuppressWarnings(PHPMD.NPathComplexity)
+     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
      */
     public function saveData()
     {
diff --git a/app/code/Magento/ConfigurableProduct/Model/Order/Admin/Item/Plugin/Configurable.php b/app/code/Magento/ConfigurableProduct/Model/Order/Admin/Item/Plugin/Configurable.php
new file mode 100644
index 00000000000..4b7beeb884e
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/Model/Order/Admin/Item/Plugin/Configurable.php
@@ -0,0 +1,104 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ConfigurableProduct\Model\Order\Admin\Item\Plugin;
+
+class Configurable
+{
+    /**
+     * @var \Magento\Catalog\Model\ProductFactory
+     */
+    protected $productFactory;
+
+    /**
+     * @param \Magento\Catalog\Model\ProductFactory $productFactory
+     */
+    public  function __construct(\Magento\Catalog\Model\ProductFactory $productFactory)
+    {
+        $this->productFactory = $productFactory;
+    }
+
+    /**
+     * Get item sku
+     *
+     * @param array $arguments
+     * @param \Magento\Code\Plugin\InvocationChain $invocationChain
+     *
+     * @return string
+     */
+    public function aroundGetSku(array $arguments, \Magento\Code\Plugin\InvocationChain $invocationChain)
+    {
+        /** @var \Magento\Sales\Model\Order\Item $item */
+        list($item) = $arguments;
+
+        if ($item->getProductType() == \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE) {
+            $productOptions = $item->getProductOptions();
+            return $productOptions['simple_sku'];
+        }
+
+        return $invocationChain->proceed($arguments);
+    }
+
+    /**
+     * Get item name
+     *
+     * @param array $arguments
+     * @param \Magento\Code\Plugin\InvocationChain $invocationChain
+     *
+     * @return string
+     */
+    public function aroundGetName(array $arguments, \Magento\Code\Plugin\InvocationChain $invocationChain)
+    {
+        /** @var \Magento\Sales\Model\Order\Item $item */
+        list($item) = $arguments;
+
+        if ($item->getProductType() == \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE) {
+            $productOptions = $item->getProductOptions();
+            return $productOptions['simple_name'];
+        }
+
+        return $invocationChain->proceed($arguments);
+    }
+
+    /**
+     * Get product id
+     *
+     * @param array $arguments
+     * @param \Magento\Code\Plugin\InvocationChain $invocationChain
+     *
+     * @return int
+     */
+    public function aroundGetProductId(array $arguments, \Magento\Code\Plugin\InvocationChain $invocationChain)
+    {
+        /** @var \Magento\Sales\Model\Order\Item $item */
+        list($item) = $arguments;
+
+        if ($item->getProductType() == \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE) {
+            $productOptions     = $item->getProductOptions();
+            $product = $this->productFactory->create();
+            return $product->getIdBySku($productOptions['simple_sku']);
+        }
+        return $invocationChain->proceed($arguments);
+    }
+}
diff --git a/app/code/Magento/ConfigurableProduct/Model/Product/CartConfiguration/Plugin/Configurable.php b/app/code/Magento/ConfigurableProduct/Model/Product/CartConfiguration/Plugin/Configurable.php
new file mode 100644
index 00000000000..00d666da637
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/Model/Product/CartConfiguration/Plugin/Configurable.php
@@ -0,0 +1,51 @@
+<?php
+/**
+ * Plugin for cart product configuration
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ConfigurableProduct\Model\Product\CartConfiguration\Plugin;
+
+use Magento\Code\Plugin\InvocationChain;
+
+class Configurable
+{
+    /**
+     * Decide whether product has been configured for cart or not
+     *
+     * @param array $arguments
+     * @param InvocationChain $invocationChain
+     * @return bool
+     */
+    public function aroundIsProductConfigured(array $arguments, InvocationChain $invocationChain)
+    {
+        /** @var $product \Magento\Catalog\Model\Product */
+        list($product, $config) = $arguments;
+
+        if ($product->getTypeId() == \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE) {
+            return isset($config['super_attribute']);
+        }
+
+        return $invocationChain->proceed($arguments);
+    }
+}
diff --git a/app/code/Magento/Catalog/Model/Product/Type/Configurable.php b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php
similarity index 92%
rename from app/code/Magento/Catalog/Model/Product/Type/Configurable.php
rename to app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php
index e68a31785d9..4d7dd5c6967 100644
--- a/app/code/Magento/Catalog/Model/Product/Type/Configurable.php
+++ b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php
@@ -1,5 +1,9 @@
 <?php
 /**
+ * Configurable product type implementation
+ *
+ * This type builds in product attributes and existing simple products
+ *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -18,23 +22,16 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Catalog
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ConfigurableProduct\Model\Product\Type;
 
 /**
- * Configurable product type implementation
- *
- * This type builds in product attributes and existing simple products
- *
- * @category   Magento
- * @package    Magento_Catalog
- * @author     Magento Core Team <core@magentocommerce.com>
+ * @SuppressWarnings(PHPMD.TooManyFields)
+ * @SuppressWarnings(PHPMD.ExcessiveClassComplexity)
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
-namespace Magento\Catalog\Model\Product\Type;
-
 class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
 {
     const TYPE_CODE = 'configurable';
@@ -105,7 +102,7 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
     /**
      * Catalog product type configurable
      *
-     * @var \Magento\Catalog\Model\Resource\Product\Type\Configurable
+     * @var \Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable
      */
     protected $_catalogProductTypeConfigurable;
 
@@ -113,7 +110,7 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
      * Attribute collection factory
      *
      * @var
-     * \Magento\Catalog\Model\Resource\Product\Type\Configurable\Attribute\CollectionFactory
+     * \Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute\CollectionFactory
      */
     protected $_attributeCollectionFactory;
 
@@ -121,14 +118,14 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
      * Product collection factory
      *
      * @var
-     * \Magento\Catalog\Model\Resource\Product\Type\Configurable\Product\CollectionFactory
+     * \Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Product\CollectionFactory
      */
     protected $_productCollectionFactory;
 
     /**
      * Configurable attribute factory
      *
-     * @var \Magento\Catalog\Model\Product\Type\Configurable\AttributeFactory
+     * @var \Magento\ConfigurableProduct\Model\Product\Type\Configurable\AttributeFactory
      */
     protected $_configurableAttributeFactory;
 
@@ -156,7 +153,7 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
     /**
      * Type configurable factory
      *
-     * @var \Magento\Catalog\Model\Resource\Product\Type\ConfigurableFactory
+     * @var \Magento\ConfigurableProduct\Model\Resource\Product\Type\ConfigurableFactory
      */
     protected $_typeConfigurableFactory;
 
@@ -173,17 +170,17 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
      * @param \Magento\App\Filesystem $filesystem
      * @param \Magento\Core\Model\Registry $coreRegistry
      * @param \Magento\Logger $logger
-     * @param \Magento\Catalog\Model\Resource\Product\Type\ConfigurableFactory $typeConfigurableFactory
+     * @param \Magento\ConfigurableProduct\Model\Resource\Product\Type\ConfigurableFactory $typeConfigurableFactory
      * @param \Magento\Eav\Model\EntityFactory $entityFactory
      * @param \Magento\Eav\Model\Entity\Attribute\SetFactory $attributeSetFactory
      * @param \Magento\Catalog\Model\Resource\Eav\AttributeFactory $eavAttributeFactory
-     * @param \Magento\Catalog\Model\Product\Type\Configurable\AttributeFactory $configurableAttributeFactory
-     * @param \Magento\Catalog\Model\Resource\Product\Type\Configurable\Product\CollectionFactory $productCollectionFactory
-     * @param \Magento\Catalog\Model\Resource\Product\Type\Configurable\Attribute\CollectionFactory $attributeCollectionFactory
-     * @param \Magento\Catalog\Model\Resource\Product\Type\Configurable $catalogProductTypeConfigurable
+     * @param \Magento\ConfigurableProduct\Model\Product\Type\Configurable\AttributeFactory $configurableAttributeFactory
+     * @param \Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Product\CollectionFactory $productCollectionFactory
+     * @param \Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute\CollectionFactory $attributeCollectionFactory
+     * @param \Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable $catalogProductTypeConfigurable
      * @param \Magento\Core\Model\StoreManagerInterface $storeManager
      * @param array $data
-     * 
+     *
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
@@ -197,14 +194,14 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
         \Magento\App\Filesystem $filesystem,
         \Magento\Core\Model\Registry $coreRegistry,
         \Magento\Logger $logger,
-        \Magento\Catalog\Model\Resource\Product\Type\ConfigurableFactory $typeConfigurableFactory,
+        \Magento\ConfigurableProduct\Model\Resource\Product\Type\ConfigurableFactory $typeConfigurableFactory,
         \Magento\Eav\Model\EntityFactory $entityFactory,
         \Magento\Eav\Model\Entity\Attribute\SetFactory $attributeSetFactory,
         \Magento\Catalog\Model\Resource\Eav\AttributeFactory $eavAttributeFactory,
-        \Magento\Catalog\Model\Product\Type\Configurable\AttributeFactory $configurableAttributeFactory,
-        \Magento\Catalog\Model\Resource\Product\Type\Configurable\Product\CollectionFactory $productCollectionFactory,
-        \Magento\Catalog\Model\Resource\Product\Type\Configurable\Attribute\CollectionFactory $attributeCollectionFactory,
-        \Magento\Catalog\Model\Resource\Product\Type\Configurable $catalogProductTypeConfigurable,
+        \Magento\ConfigurableProduct\Model\Product\Type\Configurable\AttributeFactory $configurableAttributeFactory,
+        \Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Product\CollectionFactory $productCollectionFactory,
+        \Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute\CollectionFactory $attributeCollectionFactory,
+        \Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable $catalogProductTypeConfigurable,
         \Magento\Core\Model\StoreManagerInterface $storeManager,
         array $data = array()
     ) {
@@ -294,7 +291,7 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
      *
      * @param   array $ids
      * @param   \Magento\Catalog\Model\Product $product
-     * @return  \Magento\Catalog\Model\Product\Type\Configurable
+     * @return  \Magento\ConfigurableProduct\Model\Product\Type\Configurable
      */
     public function setUsedProductAttributeIds($ids, $product)
     {
@@ -385,7 +382,7 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
         $res = array();
         foreach ($this->getConfigurableAttributes($product) as $attribute) {
             $eavAttribute = $attribute->getProductAttribute();
-            /* @var $attribute \Magento\Catalog\Model\Product\Type\Configurable\Attribute */
+            /* @var $attribute \Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute */
             $res[$eavAttribute->getId()] = array(
                 'id'             => $attribute->getId(),
                 'label'          => $attribute->getLabel(),
@@ -406,7 +403,7 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
      * Retrieve configurable attribute collection
      *
      * @param \Magento\Catalog\Model\Product $product
-     * @return \Magento\Catalog\Model\Resource\Product\Type\Configurable\Attribute\Collection
+     * @return \Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute\Collection
      */
     public function getConfigurableAttributeCollection($product)
     {
@@ -479,7 +476,7 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
      * Retrieve related products collection
      *
      * @param  \Magento\Catalog\Model\Product $product
-     * @return \Magento\Catalog\Model\Resource\Product\Type\Configurable\Product\Collection
+     * @return \Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Product\Collection
      */
     public function getUsedProductCollection($product)
     {
@@ -540,7 +537,7 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
         $data = $product->getConfigurableAttributesData();
         if ($data) {
             foreach ($data as $attributeData) {
-                /** @var $configurableAttribute \Magento\Catalog\Model\Product\Type\Configurable\Attribute */
+                /** @var $configurableAttribute \Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute */
                 $configurableAttribute = $this->_configurableAttributeFactory->create();
                 if (!empty($attributeData['id'])) {
                     $configurableAttribute->load($attributeData['id']);
@@ -557,7 +554,7 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
                    ->setProductId($product->getId())
                    ->save();
             }
-            /** @var $configurableAttributesCollection \Magento\Catalog\Model\Resource\Product\Type\Configurable\Attribute\Collection  */
+            /** @var $configurableAttributesCollection \Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute\Collection  */
             $configurableAttributesCollection = $this->_attributeCollectionFactory->create();
             $configurableAttributesCollection->setProductFilter($product);
             $configurableAttributesCollection->addFieldToFilter(
@@ -609,6 +606,7 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
      *
      * @param \Magento\Catalog\Model\Product $product
      * @return bool
+     * @SuppressWarnings(PHPMD.BooleanGetMethodName)
      */
     public function getIsSalable($product)
     {
@@ -696,6 +694,8 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
      * @param \Magento\Catalog\Model\Product $product
      * @param string $processMode
      * @return array|string
+     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
+     * @SuppressWarnings(PHPMD.NPathComplexity)
      */
     protected function _prepareProduct(\Magento\Object $buyRequest, $product, $processMode)
     {
@@ -874,7 +874,7 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
         $attributes = $this->getConfigurableAttributes($product);
         if (count($attributes)) {
             foreach ($attributes as $attribute) {
-                /** @var \Magento\Catalog\Model\Product\Type\Configurable\Attribute $attribute */
+                /** @var \Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute $attribute */
                 if ($attribute->getData('prices')) {
                     return true;
                 }
@@ -913,6 +913,7 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
      * @param  \Magento\Sales\Model\Quote\Item\Option $option
      * @param  \Magento\Catalog\Model\Product|null $product
      * @return $this
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
     public function assignProductToOption($optionProduct, $option, $product)
     {
@@ -965,6 +966,7 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
      * @param  \Magento\Catalog\Model\Product $product
      * @param  \Magento\Object $buyRequest
      * @return array
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
     public function processBuyRequest($product, $buyRequest)
     {
@@ -982,6 +984,7 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
      * @param \Magento\Catalog\Model\Product $product
      * @param int $visibility
      * @return bool|null
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
     public function isMapEnabledInOptions($product, $visibility = null)
     {
@@ -1009,7 +1012,7 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
     {
         $this->_typeConfigurableFactory->create()
             ->saveProducts($product, array());
-        /** @var $configurableAttribute \Magento\Catalog\Model\Product\Type\Configurable\Attribute */
+        /** @var $configurableAttribute \Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute */
         $configurableAttribute = $this->_configurableAttributeFactory->create();
         $configurableAttribute->deleteByProduct($product);
     }
@@ -1062,7 +1065,7 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
      * Set image for product without image if possible
      *
      * @param \Magento\Catalog\Model\Product $product
-     * @return \Magento\Catalog\Model\Product\Type\Configurable
+     * @return \Magento\ConfigurableProduct\Model\Product\Type\Configurable
      */
     public function setImageFromChildProduct(\Magento\Catalog\Model\Product $product)
     {
@@ -1108,6 +1111,8 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
      * @param \Magento\Catalog\Model\Product $product
      * @param \Magento\Catalog\Model\Product $parentProduct
      * @param array $postData
+     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
+     * @SuppressWarnings(PHPMD.NPathComplexity)
      */
     protected function _fillSimpleProductData(
         \Magento\Catalog\Model\Product $product,
@@ -1153,7 +1158,7 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
         }
         $product->addData($postData)
             ->setWebsiteIds($parentProduct->getWebsiteIds())
-            ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+            ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
             ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_NOT_VISIBLE);
     }
 }
diff --git a/app/code/Magento/Catalog/Model/Product/Type/Configurable/Attribute.php b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable/Attribute.php
similarity index 77%
rename from app/code/Magento/Catalog/Model/Product/Type/Configurable/Attribute.php
rename to app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable/Attribute.php
index e05a2a9a174..c1cf918e76c 100644
--- a/app/code/Magento/Catalog/Model/Product/Type/Configurable/Attribute.php
+++ b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable/Attribute.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Catalog Configurable Product Attribute Model
+ *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -18,34 +20,23 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Catalog
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\ConfigurableProduct\Model\Product\Type\Configurable;
 
 /**
- * Catalog Configurable Product Attribute Model
- *
- * @method \Magento\Catalog\Model\Resource\Product\Type\Configurable\Attribute _getResource()
- * @method \Magento\Catalog\Model\Resource\Product\Type\Configurable\Attribute getResource()
+ * @method Attribute _getResource()
+ * @method Attribute getResource()
  * @method int getProductId()
- * @method \Magento\Catalog\Model\Product\Type\Configurable\Attribute setProductId(int $value)
+ * @method Attribute setProductId(int $value)
  * @method int getAttributeId()
- * @method \Magento\Catalog\Model\Product\Type\Configurable\Attribute setAttributeId(int $value)
+ * @method Attribute setAttributeId(int $value)
  * @method int getPosition()
- * @method \Magento\Catalog\Model\Product\Type\Configurable\Attribute setPosition(int $value)
- *
- * @method \Magento\Catalog\Model\Product\Type\Configurable\Attribute setProductAttribute(\Magento\Eav\Model\Entity\Attribute\AbstractAttribute $value)
+ * @method Attribute setPosition(int $value)
+ * @method Attribute setProductAttribute(\Magento\Eav\Model\Entity\Attribute\AbstractAttribute $value)
  * @method \Magento\Eav\Model\Entity\Attribute\AbstractAttribute getProductAttribute()
- *
- * @category    Magento
- * @package     Magento_Catalog
- * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Catalog\Model\Product\Type\Configurable;
-
 class Attribute extends \Magento\Core\Model\AbstractModel
 {
     /**
@@ -55,7 +46,7 @@ class Attribute extends \Magento\Core\Model\AbstractModel
      */
     protected function _construct()
     {
-        $this->_init('Magento\Catalog\Model\Resource\Product\Type\Configurable\Attribute');
+        $this->_init('Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute');
     }
 
     /**
diff --git a/app/code/Magento/Catalog/Model/Product/Type/Configurable/Price.php b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable/Price.php
similarity index 72%
rename from app/code/Magento/Catalog/Model/Product/Type/Configurable/Price.php
rename to app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable/Price.php
index 89df94dfcce..d9024b0560d 100644
--- a/app/code/Magento/Catalog/Model/Product/Type/Configurable/Price.php
+++ b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable/Price.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Product type price model
+ *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -18,23 +20,40 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Catalog
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ConfigurableProduct\Model\Product\Type\Configurable;
 
-/**
- * Product type price model
- *
- * @category    Magento
- * @package     Magento_Catalog
- * @author      Magento Core Team <core@magentocommerce.com>
- */
-namespace Magento\Catalog\Model\Product\Type\Configurable;
+use Magento\Catalog\Model\Product\PriceModifierInterface;
 
 class Price extends \Magento\Catalog\Model\Product\Type\Price
 {
+    /**
+     * @var \Magento\Catalog\Model\Product\PriceModifierInterface
+     */
+    protected $priceModifier;
+
+    /**
+     * @param \Magento\CatalogRule\Model\Resource\RuleFactory $ruleFactory
+     * @param \Magento\Core\Model\StoreManagerInterface $storeManager
+     * @param \Magento\Core\Model\LocaleInterface $locale
+     * @param \Magento\Customer\Model\Session $customerSession
+     * @param \Magento\Event\ManagerInterface $eventManager
+     * @param PriceModifierInterface $priceModifier
+     */
+    public function __construct(
+        \Magento\CatalogRule\Model\Resource\RuleFactory $ruleFactory,
+        \Magento\Core\Model\StoreManagerInterface $storeManager,
+        \Magento\Core\Model\LocaleInterface $locale,
+        \Magento\Customer\Model\Session $customerSession,
+        \Magento\Event\ManagerInterface $eventManager,
+        PriceModifierInterface $priceModifier
+    ) {
+        $this->priceModifier = $priceModifier;
+        parent::__construct($ruleFactory, $storeManager, $locale, $customerSession, $eventManager);
+    }
+
     /**
      * Get product final price
      *
@@ -93,9 +112,8 @@ class Price extends \Magento\Catalog\Model\Product\Type\Price
             if ($value) {
                 if ($value['pricing_value'] != 0) {
                     $product->setConfigurablePrice($this->_calcSelectionPrice($value, $finalPrice));
-                    $this->_eventManager->dispatch(
-                        'catalog_product_type_configurable_price',
-                        array('product' => $product)
+                    $product->setConfigurablePrice(
+                        $this->priceModifier->modifyPrice($product->getConfigurablePrice(), $product)
                     );
                     $price += $product->getConfigurablePrice();
                 }
@@ -123,11 +141,15 @@ class Price extends \Magento\Catalog\Model\Product\Type\Price
     }
 
     /**
+     * Find value in array by index
+     *
      * @param array $values
-     * @param int $index
-     * @return array|false
+     * @param string $index
+     * @return bool
+     * @SuppressWarnings(PHPMD.BooleanGetMethodName)
      */
-    protected function _getValueByIndex($values, $index) {
+    protected function _getValueByIndex($values, $index)
+    {
         foreach ($values as $value) {
             if ($value['value_index'] == $index) {
                 return $value;
diff --git a/app/code/Magento/ConfigurableProduct/Model/Product/Type/Plugin.php b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Plugin.php
new file mode 100644
index 00000000000..996bc4f6e61
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Plugin.php
@@ -0,0 +1,57 @@
+<?php
+/**
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\ConfigurableProduct\Model\Product\Type;
+
+use Magento\Module\Manager;
+
+class Plugin
+{
+    /**
+     * @var \Magento\Module\Manager
+     */
+    protected $moduleManager;
+
+    /**
+     * @param Manager $moduleManager
+     */
+    public function __construct(Manager $moduleManager)
+    {
+        $this->moduleManager = $moduleManager;
+    }
+
+    /**
+     * Remove grouped product from list of visible product types
+     *
+     * @param array $result
+     * @return array
+     */
+    public function afterGetOptionArray($result)
+    {
+        if (!$this->moduleManager->isOutputEnabled('Magento_ConfigurableProduct')) {
+            unset($result[Configurable::TYPE_CODE]);
+        }
+        return $result;
+    }
+}
diff --git a/app/code/Magento/ConfigurableProduct/Model/Product/TypeTransitionManager/Plugin/Configurable.php b/app/code/Magento/ConfigurableProduct/Model/Product/TypeTransitionManager/Plugin/Configurable.php
new file mode 100644
index 00000000000..a6c38151720
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/Model/Product/TypeTransitionManager/Plugin/Configurable.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * Plugin for product type transition manager
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\ConfigurableProduct\Model\Product\TypeTransitionManager\Plugin;
+
+use Magento\App\RequestInterface,
+    Magento\Code\Plugin\InvocationChain;
+
+class Configurable
+{
+    /**
+     * Request instance
+     *
+     * @var \Magento\App\RequestInterface
+     */
+    protected $request;
+
+    /**
+     * @param RequestInterface $request
+     */
+    public function __construct(
+        RequestInterface $request
+    ) {
+        $this->request = $request;
+    }
+
+    /**
+     * Change product type to configurable if needed
+     *
+     * @param array $arguments
+     * @param InvocationChain $invocationChain
+     */
+    public function aroundProcessProduct(array $arguments, InvocationChain $invocationChain)
+    {
+        /** @var \Magento\Catalog\Model\Product $product */
+        $product = $arguments[0];
+        $attributes = $this->request->getParam('attributes');
+        if (!empty($attributes)) {
+            $product->setTypeId(\Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE);
+            return;
+        }
+        $invocationChain->proceed($arguments);
+    }
+}
diff --git a/app/code/Magento/ConfigurableProduct/Model/Product/Validator/Plugin.php b/app/code/Magento/ConfigurableProduct/Model/Product/Validator/Plugin.php
new file mode 100644
index 00000000000..ba512b779be
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/Model/Product/Validator/Plugin.php
@@ -0,0 +1,134 @@
+<?php
+/**
+ * Configurable product validation
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\ConfigurableProduct\Model\Product\Validator;
+
+use Magento\App\RequestInterface;
+use Magento\App\ResponseInterface;
+use Magento\Catalog\Model\Product;
+use Magento\Catalog\Model\ProductFactory;
+use Magento\Code\Plugin\InvocationChain;
+use Magento\Event\Manager;
+use Magento\Core\Helper;
+
+class Plugin
+{
+    /**
+     * @var \Magento\Event\Manager
+     */
+    protected $eventManager;
+
+    /**
+     * @var \Magento\Catalog\Model\ProductFactory
+     */
+    protected $productFactory;
+
+    /**
+     * @var Helper\Data
+     */
+    protected $coreHelper;
+
+    /**
+     * @param Manager $eventManager
+     * @param ProductFactory $productFactory
+     * @param Helper\Data $coreHelper
+     */
+    public function __construct(Manager $eventManager, ProductFactory $productFactory, Helper\Data $coreHelper)
+    {
+        $this->eventManager = $eventManager;
+        $this->productFactory = $productFactory;
+        $this->coreHelper = $coreHelper;
+    }
+
+    /**
+     * Validate product data
+     *
+     * @param $arguments
+     * @param InvocationChain $invocationChain
+     * @return ResponseInterface
+     */
+    public function aroundValidate(array $arguments, InvocationChain $invocationChain)
+    {
+        /** @var Product $product */
+        $product = $arguments[0];
+        /** @var RequestInterface $request */
+        $request = $arguments[1];
+        /** @var \Magento\Object $response */
+        $response = $arguments[2];
+        $result = $invocationChain->proceed($arguments);
+        $variationProducts = (array)$request->getPost('variations-matrix');
+        if ($variationProducts) {
+            $validationResult = $this->_validateProductVariations($product, $variationProducts, $request);
+            if (!empty($validationResult)) {
+                $response->setError(true)
+                    ->setMessage(__('Some product variations fields are not valid.'))
+                    ->setAttributes($validationResult);
+            }
+        }
+        return $result;
+    }
+
+    /**
+     * Product variations attributes validation
+     *
+     * @param Product $parentProduct
+     * @param array $products
+     * @param RequestInterface $request
+     * @return array
+     */
+    protected function _validateProductVariations(Product $parentProduct, array $products, RequestInterface $request)
+    {
+
+        $this->eventManager->dispatch(
+            'catalog_product_validate_variations_before',
+            array('product' => $parentProduct, 'variations' => $products)
+        );
+        $validationResult = array();
+        foreach ($products as $productData) {
+            $product = $this->productFactory->create();
+            $product->setData('_edit_mode', true);
+            $storeId = $request->getParam('store');
+            if ($storeId) {
+                $product->setStoreId($storeId);
+            }
+            $product->setAttributeSetId($parentProduct->getAttributeSetId());
+            $product->addData($productData);
+            $product->setCollectExceptionMessages(true);
+            $configurableAttribute = $this->coreHelper ->jsonDecode($productData['configurable_attribute']);
+            $configurableAttribute = implode('-', $configurableAttribute);
+
+            $errorAttributes = $product->validate();
+            if (is_array($errorAttributes)) {
+                foreach ($errorAttributes as $attributeCode => $result) {
+                    if (is_string($result)) {
+                        $key = 'variations-matrix-' . $configurableAttribute . '-' . $attributeCode;
+                        $validationResult[$key] = $result;
+                    }
+                }
+            }
+        }
+        return $validationResult;
+    }
+}
diff --git a/app/code/Magento/ConfigurableProduct/Model/Quote/Item/QuantityValidator/Initializer/Option/Plugin/ConfigurableProduct.php b/app/code/Magento/ConfigurableProduct/Model/Quote/Item/QuantityValidator/Initializer/Option/Plugin/ConfigurableProduct.php
new file mode 100644
index 00000000000..6682d047a8b
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/Model/Quote/Item/QuantityValidator/Initializer/Option/Plugin/ConfigurableProduct.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * Stock item initializer for configurable product type
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ConfigurableProduct\Model\Quote\Item\QuantityValidator\Initializer\Option\Plugin;
+
+class ConfigurableProduct
+{
+    /**
+     * Initialize stock item for configurable product type
+     *
+     * @param array $arguments
+     *
+     * @return array
+     */
+    public function beforeInitialize(array $arguments)
+    {
+        /** @var \Magento\Sales\Model\Quote\Item\Option $option */
+        /** @var \Magento\Sales\Model\Quote\Item $quoteItem */
+        list($option, $quoteItem) = $arguments;
+
+        /* @var $stockItem \Magento\CatalogInventory\Model\Stock\Item */
+        $stockItem = $option->getProduct()->getStockItem();
+
+        if ($quoteItem->getProductType() == \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE) {
+            $stockItem->setProductName($quoteItem->getName());
+        }
+
+        return $arguments;
+    }
+}
diff --git a/app/code/Magento/CatalogInventory/Model/Resource/Indexer/Stock/Configurable.php b/app/code/Magento/ConfigurableProduct/Model/Resource/Indexer/Stock/Configurable.php
similarity index 75%
rename from app/code/Magento/CatalogInventory/Model/Resource/Indexer/Stock/Configurable.php
rename to app/code/Magento/ConfigurableProduct/Model/Resource/Indexer/Stock/Configurable.php
index 1f27f282bdc..751c579893d 100644
--- a/app/code/Magento/CatalogInventory/Model/Resource/Indexer/Stock/Configurable.php
+++ b/app/code/Magento/ConfigurableProduct/Model/Resource/Indexer/Stock/Configurable.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * CatalogInventory Configurable Products Stock Status Indexer Resource Model
+ *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -18,12 +20,11 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_CatalogInventory
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
+namespace Magento\ConfigurableProduct\Model\Resource\Indexer\Stock;
 
 /**
  * CatalogInventory Configurable Products Stock Status Indexer Resource Model
@@ -32,24 +33,12 @@
  * @package     Magento_CatalogInventory
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\CatalogInventory\Model\Resource\Indexer\Stock;
+use \Magento\Catalog\Model\Product\Attribute\Source\Status as ProductStatus;
 
-class Configurable extends DefaultStock
+class Configurable extends \Magento\CatalogInventory\Model\Resource\Indexer\Stock\DefaultStock
 {
     /**
-     * Reindex stock data for defined configurable product ids
-     *
-     * @param int|array $entityIds
-     * @return $this
-     */
-    public function reindexEntity($entityIds)
-    {
-        $this->_updateIndex($entityIds);
-        return $this;
-    }
-
-    /**
-     * Get the select object for get stock status by product ids
+     * Get the select object for get stock status by configurable product ids
      *
      * @param int|array $entityIds
      * @param bool $usePrimaryTable use primary or temporary index table
@@ -57,9 +46,9 @@ class Configurable extends DefaultStock
      */
     protected function _getStockStatusSelect($entityIds = null, $usePrimaryTable = false)
     {
-        $adapter  = $this->_getWriteAdapter();
+        $writer  = $this->_getWriteAdapter();
         $idxTable = $usePrimaryTable ? $this->getMainTable() : $this->getIdxTable();
-        $select  = $adapter->select()
+        $select  = $writer->select()
             ->from(array('e' => $this->getTable('catalog_product_entity')), array('entity_id'));
         $this->_addWebsiteJoinToSelect($select, true);
         $this->_addProductWebsiteJoinToSelect($select, 'cw.website_id', 'e.entity_id');
@@ -90,18 +79,18 @@ class Configurable extends DefaultStock
             ->group(array('e.entity_id', 'cw.website_id', 'cis.stock_id'));
 
         $psExpr = $this->_addAttributeToSelect($select, 'status', 'e.entity_id', 'cs.store_id');
-        $psCond = $adapter->quoteInto($psExpr . '=?', \Magento\Catalog\Model\Product\Status::STATUS_ENABLED);
+        $psCond = $writer->quoteInto($psExpr . '=?', ProductStatus::STATUS_ENABLED);
 
         if ($this->_isManageStock()) {
-            $statusExpr = $adapter->getCheckSql('cisi.use_config_manage_stock = 0 AND cisi.manage_stock = 0',
+            $statusExpr = $writer->getCheckSql('cisi.use_config_manage_stock = 0 AND cisi.manage_stock = 0',
                 1, 'cisi.is_in_stock');
         } else {
-            $statusExpr = $adapter->getCheckSql('cisi.use_config_manage_stock = 0 AND cisi.manage_stock = 1',
+            $statusExpr = $writer->getCheckSql('cisi.use_config_manage_stock = 0 AND cisi.manage_stock = 1',
                 'cisi.is_in_stock', 1);
         }
 
-        $optExpr = $adapter->getCheckSql("{$psCond} AND le.required_options = 0", 'i.stock_status', 0);
-        $stockStatusExpr = $adapter->getLeastSql(array("MAX({$optExpr})", "MIN({$statusExpr})"));
+        $optExpr = $writer->getCheckSql("{$psCond} AND le.required_options = 0", 'i.stock_status', 0);
+        $stockStatusExpr = $writer->getLeastSql(array("MAX({$optExpr})", "MIN({$statusExpr})"));
 
         $select->columns(array(
             'status' => $stockStatusExpr
diff --git a/app/code/Magento/Catalog/Model/Resource/Product/Collection/AssociatedProduct.php b/app/code/Magento/ConfigurableProduct/Model/Resource/Product/Collection/AssociatedProduct.php
similarity index 81%
rename from app/code/Magento/Catalog/Model/Resource/Product/Collection/AssociatedProduct.php
rename to app/code/Magento/ConfigurableProduct/Model/Resource/Product/Collection/AssociatedProduct.php
index ad08cb48a70..d1e8591e286 100644
--- a/app/code/Magento/Catalog/Model/Resource/Product/Collection/AssociatedProduct.php
+++ b/app/code/Magento/ConfigurableProduct/Model/Resource/Product/Collection/AssociatedProduct.php
@@ -18,12 +18,14 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Catalog
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-namespace Magento\Catalog\Model\Resource\Product\Collection;
+
+/**
+ * Catalog compare item resource model
+ */
+namespace Magento\ConfigurableProduct\Model\Resource\Product\Collection;
 
 /**
  * Catalog compare item resource model
@@ -43,16 +45,16 @@ class AssociatedProduct
     /**
      * Product type configurable instance
      *
-     * @var \Magento\Catalog\Model\Product\Type\Configurable
+     * @var \Magento\ConfigurableProduct\Model\Product\Type\Configurable
      */
     protected $_productType;
 
     /**
-     * Configuration helper instance
+     * Product type configuration
      *
-     * @var \Magento\Catalog\Helper\Product\Configuration
+     * @var \Magento\Catalog\Model\ProductTypes\ConfigInterface
      */
-    protected $_configurationHelper;
+    protected $_productTypeConfig;
 
     /**
      * @param \Magento\Core\Model\EntityFactory $entityFactory
@@ -74,10 +76,10 @@ class AssociatedProduct
      * @param \Magento\Customer\Model\Session $customerSession
      * @param \Magento\Stdlib\DateTime $dateTime
      * @param \Magento\Core\Model\Registry $registryManager
-     * @param \Magento\Catalog\Model\Product\Type\Configurable $productType
-     * @param \Magento\Catalog\Helper\Product\Configuration $configurationHelper
+     * @param \Magento\ConfigurableProduct\Model\Product\Type\Configurable $productType
+     * @param \Magento\Catalog\Model\ProductTypes\ConfigInterface $productTypeConfig
      * @param \Zend_Db_Adapter_Abstract $connection
-     * 
+     *
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
@@ -100,13 +102,13 @@ class AssociatedProduct
         \Magento\Customer\Model\Session $customerSession,
         \Magento\Stdlib\DateTime $dateTime,
         \Magento\Core\Model\Registry $registryManager,
-        \Magento\Catalog\Model\Product\Type\Configurable $productType,
-        \Magento\Catalog\Helper\Product\Configuration $configurationHelper,
+        \Magento\ConfigurableProduct\Model\Product\Type\Configurable $productType,
+        \Magento\Catalog\Model\ProductTypes\ConfigInterface $productTypeConfig,
         $connection = null
     ) {
         $this->_registryManager = $registryManager;
         $this->_productType = $productType;
-        $this->_configurationHelper = $configurationHelper;
+        $this->_productTypeConfig = $productTypeConfig;
         parent::__construct(
             $entityFactory,
             $logger,
@@ -133,7 +135,7 @@ class AssociatedProduct
     /**
      * Get product type
      *
-     * @return \Magento\Catalog\Model\Product\Type\Configurable
+     * @return \Magento\ConfigurableProduct\Model\Product\Type\Configurable
      */
     public function getProductType()
     {
@@ -159,7 +161,7 @@ class AssociatedProduct
     {
         parent::_initSelect();
 
-        $allowedProductTypes = $this->_configurationHelper->getConfigurableAllowedTypes();
+        $allowedProductTypes = $this->_productTypeConfig->getComposableTypes();
 
         $this->addAttributeToSelect('name')
             ->addAttributeToSelect('price')
@@ -169,7 +171,17 @@ class AssociatedProduct
             ->addFieldToFilter('type_id', $allowedProductTypes)
             ->addFieldToFilter('entity_id', array('neq' => $this->getProduct()->getId()))
             ->addFilterByRequiredOptions()
-            ->joinAttribute('name', 'catalog_product/name', 'entity_id', null, 'inner');
+            ->joinAttribute('name', 'catalog_product/name', 'entity_id', null, 'inner')
+            ->joinTable(
+                array('cisi' => 'cataloginventory_stock_item'),
+                'product_id=entity_id',
+                array(
+                    'qty' => 'qty',
+                    'inventory_in_stock' => 'is_in_stock',
+                ),
+                null,
+                'left'
+            );
 
         return $this;
     }
diff --git a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Price/Configurable.php b/app/code/Magento/ConfigurableProduct/Model/Resource/Product/Indexer/Price/Configurable.php
similarity index 92%
rename from app/code/Magento/Catalog/Model/Resource/Product/Indexer/Price/Configurable.php
rename to app/code/Magento/ConfigurableProduct/Model/Resource/Product/Indexer/Price/Configurable.php
index a343dd24369..440333395a6 100644
--- a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/Price/Configurable.php
+++ b/app/code/Magento/ConfigurableProduct/Model/Resource/Product/Indexer/Price/Configurable.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Configurable Products Price Indexer Resource model
+ *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -18,21 +20,10 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Catalog
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-
-/**
- * Configurable Products Price Indexer Resource model
- *
- * @category    Magento
- * @package     Magento_Catalog
- * @author      Magento Core Team <core@magentocommerce.com>
- */
-namespace Magento\Catalog\Model\Resource\Product\Indexer\Price;
+namespace Magento\ConfigurableProduct\Model\Resource\Product\Indexer\Price;
 
 class Configurable
     extends \Magento\Catalog\Model\Resource\Product\Indexer\Price\DefaultPrice
@@ -40,7 +31,7 @@ class Configurable
     /**
      * Reindex temporary (price result data) for all products
      *
-     * @return \Magento\Catalog\Model\Resource\Product\Indexer\Price\Configurable
+     * @return \Magento\ConfigurableProduct\Model\Resource\Product\Indexer\Price\Configurable
      */
     public function reindexAll()
     {
@@ -63,7 +54,7 @@ class Configurable
      * Reindex temporary (price result data) for defined product(s)
      *
      * @param int|array $entityIds
-     * @return \Magento\Catalog\Model\Resource\Product\Indexer\Price\Configurable
+     * @return \Magento\ConfigurableProduct\Model\Resource\Product\Indexer\Price\Configurable
      */
     public function reindexEntity($entityIds)
     {
@@ -104,7 +95,7 @@ class Configurable
     /**
      * Prepare table structure for custom option temporary aggregation data
      *
-     * @return \Magento\Catalog\Model\Resource\Product\Indexer\Price\Configurable
+     * @return \Magento\ConfigurableProduct\Model\Resource\Product\Indexer\Price\Configurable
      */
     protected function _prepareConfigurableOptionAggregateTable()
     {
@@ -115,7 +106,7 @@ class Configurable
     /**
      * Prepare table structure for custom option prices data
      *
-     * @return \Magento\Catalog\Model\Resource\Product\Indexer\Price\Configurable
+     * @return \Magento\ConfigurableProduct\Model\Resource\Product\Indexer\Price\Configurable
      */
     protected function _prepareConfigurableOptionPriceTable()
     {
@@ -127,7 +118,8 @@ class Configurable
      * Calculate minimal and maximal prices for configurable product options
      * and apply it to final price
      *
-     * @return \Magento\Catalog\Model\Resource\Product\Indexer\Price\Configurable
+     * @return \Magento\ConfigurableProduct\Model\Resource\Product\Indexer\Price\Configurable
+     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
      */
     protected function _applyConfigurableOption()
     {
diff --git a/app/code/Magento/Catalog/Model/Resource/Product/Type/Configurable.php b/app/code/Magento/ConfigurableProduct/Model/Resource/Product/Type/Configurable.php
similarity index 97%
rename from app/code/Magento/Catalog/Model/Resource/Product/Type/Configurable.php
rename to app/code/Magento/ConfigurableProduct/Model/Resource/Product/Type/Configurable.php
index a4d19b4faeb..5a5a8d07aa3 100644
--- a/app/code/Magento/Catalog/Model/Resource/Product/Type/Configurable.php
+++ b/app/code/Magento/ConfigurableProduct/Model/Resource/Product/Type/Configurable.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Configurable product type resource model
+ *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -18,20 +20,11 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Catalog
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-namespace Magento\Catalog\Model\Resource\Product\Type;
+namespace Magento\ConfigurableProduct\Model\Resource\Product\Type;
 
-/**
- * Configurable product type resource model
- *
- * @category    Magento
- * @package     Magento_Catalog
- * @author      Magento Core Team <core@magentocommerce.com>
- */
 class Configurable extends \Magento\Core\Model\Resource\Db\AbstractDb
 {
     /**
@@ -120,6 +113,7 @@ class Configurable extends \Magento\Core\Model\Resource\Db\AbstractDb
      * @param int $parentId
      * @param bool $required
      * @return array
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
     public function getChildrenIds($parentId, $required = true)
     {
diff --git a/app/code/Magento/Catalog/Model/Resource/Product/Type/Configurable/Attribute.php b/app/code/Magento/ConfigurableProduct/Model/Resource/Product/Type/Configurable/Attribute.php
similarity index 93%
rename from app/code/Magento/Catalog/Model/Resource/Product/Type/Configurable/Attribute.php
rename to app/code/Magento/ConfigurableProduct/Model/Resource/Product/Type/Configurable/Attribute.php
index bd6af62c4a8..c04921bd510 100644
--- a/app/code/Magento/Catalog/Model/Resource/Product/Type/Configurable/Attribute.php
+++ b/app/code/Magento/ConfigurableProduct/Model/Resource/Product/Type/Configurable/Attribute.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Catalog super product attribute resource model
+ *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -18,20 +20,11 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Catalog
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-namespace Magento\Catalog\Model\Resource\Product\Type\Configurable;
+namespace Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable;
 
-/**
- * Catalog super product attribute resource model
- *
- * @category    Magento
- * @package     Magento_Catalog
- * @author      Magento Core Team <core@magentocommerce.com>
- */
 class Attribute extends \Magento\Core\Model\Resource\Db\AbstractDb
 {
     /**
@@ -102,7 +95,7 @@ class Attribute extends \Magento\Core\Model\Resource\Db\AbstractDb
     /**
      * Save Custom labels for Attribute name
      *
-     * @param \Magento\Catalog\Model\Product\Type\Configurable\Attribute $attribute
+     * @param \Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute $attribute
      * @return $this
      */
     public function saveLabel($attribute)
@@ -144,8 +137,11 @@ class Attribute extends \Magento\Core\Model\Resource\Db\AbstractDb
     /**
      * Save Options prices (Depends from price save scope)
      *
-     * @param \Magento\Catalog\Model\Product\Type\Configurable\Attribute $attribute
+     * @param \Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute $attribute
      * @return $this
+     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
+     * @SuppressWarnings(PHPMD.NPathComplexity)
+     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
      */
     public function savePrices($attribute)
     {
@@ -301,7 +297,7 @@ class Attribute extends \Magento\Core\Model\Resource\Db\AbstractDb
 
         $bind = array(
             'attribute_set_id' => $setId,
-            'type_id'          => \Magento\Catalog\Model\Product\Type::TYPE_CONFIGURABLE,
+            'type_id'          => \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE,
         );
 
         return $adapter->fetchCol($select, $bind);
@@ -310,10 +306,12 @@ class Attribute extends \Magento\Core\Model\Resource\Db\AbstractDb
     /**
      * Get configurable attribute id by product id and attribute id
      *
-     * @param \Magento\Catalog\Model\Product\Type\Configurable\Attribute $attribute
+     * @param \Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute $attribute
      * @param mixed $productId
      * @param mixed $attributeId
+     *
      * @return string
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
     public function getIdByProductIdAndAttributeId($attribute, $productId, $attributeId)
     {
diff --git a/app/code/Magento/Catalog/Model/Resource/Product/Type/Configurable/Attribute/Collection.php b/app/code/Magento/ConfigurableProduct/Model/Resource/Product/Type/Configurable/Attribute/Collection.php
similarity index 92%
rename from app/code/Magento/Catalog/Model/Resource/Product/Type/Configurable/Attribute/Collection.php
rename to app/code/Magento/ConfigurableProduct/Model/Resource/Product/Type/Configurable/Attribute/Collection.php
index 10880d8c55c..845f425bd98 100644
--- a/app/code/Magento/Catalog/Model/Resource/Product/Type/Configurable/Attribute/Collection.php
+++ b/app/code/Magento/ConfigurableProduct/Model/Resource/Product/Type/Configurable/Attribute/Collection.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Catalog Configurable Product Attribute Collection
+ *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -18,16 +20,12 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Catalog
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-namespace Magento\Catalog\Model\Resource\Product\Type\Configurable\Attribute;
+namespace Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute;
 
 /**
- * Catalog Configurable Product Attribute Collection
- *
  * @SuppressWarnings(PHPMD.LongVariable)
  */
 class Collection
@@ -64,7 +62,7 @@ class Collection
     /**
      * Catalog product type configurable
      *
-     * @var \Magento\Catalog\Model\Product\Type\Configurable
+     * @var \Magento\ConfigurableProduct\Model\Product\Type\Configurable
      */
     protected $_productTypeConfigurable;
 
@@ -81,9 +79,9 @@ class Collection
      * @param \Magento\Data\Collection\Db\FetchStrategyInterface $fetchStrategy
      * @param \Magento\Event\ManagerInterface $eventManager
      * @param \Magento\Core\Model\StoreManagerInterface $storeManager
-     * @param \Magento\Catalog\Model\Product\Type\Configurable $catalogProductTypeConfigurable
+     * @param \Magento\ConfigurableProduct\Model\Product\Type\Configurable $catalogProductTypeConfigurable
      * @param \Magento\Catalog\Helper\Data $catalogData
-     * @param \Magento\Catalog\Model\Resource\Product\Type\Configurable\Attribute $resource
+     * @param \Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute $resource
      * @param \Zend_Db_Adapter_Abstract $connection
      */
     public function __construct(
@@ -92,9 +90,9 @@ class Collection
         \Magento\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
         \Magento\Event\ManagerInterface $eventManager,
         \Magento\Core\Model\StoreManagerInterface $storeManager,
-        \Magento\Catalog\Model\Product\Type\Configurable $catalogProductTypeConfigurable,
+        \Magento\ConfigurableProduct\Model\Product\Type\Configurable $catalogProductTypeConfigurable,
         \Magento\Catalog\Helper\Data $catalogData,
-        \Magento\Catalog\Model\Resource\Product\Type\Configurable\Attribute $resource,
+        \Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute $resource,
         $connection = null
     ) {
         $this->_storeManager = $storeManager;
@@ -111,8 +109,8 @@ class Collection
     protected function _construct()
     {
         $this->_init(
-            'Magento\Catalog\Model\Product\Type\Configurable\Attribute',
-            'Magento\Catalog\Model\Resource\Product\Type\Configurable\Attribute'
+            'Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute',
+            'Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute'
         );
         $this->_labelTable = $this->getTable('catalog_product_super_attribute_label');
         $this->_priceTable = $this->getTable('catalog_product_super_attribute_pricing');
@@ -133,7 +131,7 @@ class Collection
     /**
      * Get product type
      *
-     * @return \Magento\Catalog\Model\Product\Type\Configurable
+     * @return \Magento\ConfigurableProduct\Model\Product\Type\Configurable
      */
     private function getProductType()
     {
@@ -261,6 +259,8 @@ class Collection
      * Load attribute prices information
      *
      * @return $this
+     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
+     * @SuppressWarnings(PHPMD.NPathComplexity)
      */
     protected function _loadPrices()
     {
diff --git a/app/code/Magento/Catalog/Model/Resource/Product/Type/Configurable/Product/Collection.php b/app/code/Magento/ConfigurableProduct/Model/Resource/Product/Type/Configurable/Product/Collection.php
similarity index 86%
rename from app/code/Magento/Catalog/Model/Resource/Product/Type/Configurable/Product/Collection.php
rename to app/code/Magento/ConfigurableProduct/Model/Resource/Product/Type/Configurable/Product/Collection.php
index ac31f521daf..3780886d12f 100644
--- a/app/code/Magento/Catalog/Model/Resource/Product/Type/Configurable/Product/Collection.php
+++ b/app/code/Magento/ConfigurableProduct/Model/Resource/Product/Type/Configurable/Product/Collection.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Catalog super product link collection
+ *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -18,20 +20,11 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Catalog
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-namespace Magento\Catalog\Model\Resource\Product\Type\Configurable\Product;
+namespace Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Product;
 
-/**
- * Catalog super product link collection
- *
- * @category    Magento
- * @package     Magento_Catalog
- * @author      Magento Core Team <core@magentocommerce.com>
- */
 class Collection
     extends \Magento\Catalog\Model\Resource\Product\Collection
 {
@@ -55,8 +48,7 @@ class Collection
 
     /**
      * Init select
-     *
-     * @return $this|\Magento\Catalog\Model\Resource\Product\Collection
+     * @return $this|\Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Product\Collection
      */
     protected function _initSelect()
     {
diff --git a/app/code/Magento/ConfigurableProduct/Model/Resource/Setup/PropertyMapper.php b/app/code/Magento/ConfigurableProduct/Model/Resource/Setup/PropertyMapper.php
new file mode 100644
index 00000000000..9aa25a16a77
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/Model/Resource/Setup/PropertyMapper.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Configurable product attribute property mapper
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\ConfigurableProduct\Model\Resource\Setup;
+
+use Magento\Eav\Model\Entity\Setup\PropertyMapperAbstract;
+
+class PropertyMapper extends PropertyMapperAbstract
+{
+    /**
+     * Map input attribute properties to storage representation
+     *
+     * @param array $input
+     * @param int $entityTypeId
+     *
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+     *
+     * @return array
+     */
+    public function map(array $input, $entityTypeId)
+    {
+        return array('is_configurable' => $this->_getValue($input, 'is_configurable', 1),);
+    }
+} 
diff --git a/app/code/Magento/Catalog/Block/Product/Configurable/AttributeSelector.php b/app/code/Magento/ConfigurableProduct/Model/SuggestedAttributeList.php
similarity index 72%
rename from app/code/Magento/Catalog/Block/Product/Configurable/AttributeSelector.php
rename to app/code/Magento/ConfigurableProduct/Model/SuggestedAttributeList.php
index 238ff0a6d00..c312a7f3952 100644
--- a/app/code/Magento/Catalog/Block/Product/Configurable/AttributeSelector.php
+++ b/app/code/Magento/ConfigurableProduct/Model/SuggestedAttributeList.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * List of suggested attributes
+ *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -18,20 +20,12 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Catalog
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ConfigurableProduct\Model;
 
-namespace Magento\Catalog\Block\Product\Configurable;
-
-/**
- * Select attributes suitable for product variations generation
- *
- * @SuppressWarnings(PHPMD.LongVariable)
- */
-class AttributeSelector extends \Magento\Backend\Block\Template
+class SuggestedAttributeList
 {
     /**
      * Attribute collection factory
@@ -48,20 +42,15 @@ class AttributeSelector extends \Magento\Backend\Block\Template
     protected $_resourceHelper;
 
     /**
-     * @param \Magento\Backend\Block\Template\Context $context
      * @param \Magento\Catalog\Model\Resource\Product\Attribute\CollectionFactory $attributeColFactory
      * @param \Magento\Catalog\Model\Resource\Helper $resourceHelper
-     * @param array $data
      */
     public function __construct(
-        \Magento\Backend\Block\Template\Context $context,
         \Magento\Catalog\Model\Resource\Product\Attribute\CollectionFactory $attributeColFactory,
-        \Magento\Catalog\Model\Resource\Helper $resourceHelper,
-        array $data = array()
+        \Magento\Catalog\Model\Resource\Helper $resourceHelper
     ) {
         $this->_attributeColFactory = $attributeColFactory;
         $this->_resourceHelper = $resourceHelper;
-        parent::__construct($context, $data);
     }
 
     /**
@@ -77,7 +66,7 @@ class AttributeSelector extends \Magento\Backend\Block\Template
         $collection = $this->_attributeColFactory->create();
         $collection->addFieldToFilter('frontend_input', 'select')
             ->addFieldToFilter('frontend_label', array('like' => $escapedLabelPart))
-            ->addFieldToFilter('is_configurable', 1)
+            ->addFieldToFilter('is_configurable', array(array("eq" => 1), array('null' => true)))
             ->addFieldToFilter('is_user_defined', 1)
             ->addFieldToFilter('is_global', \Magento\Catalog\Model\Resource\Eav\Attribute::SCOPE_GLOBAL);
 
@@ -85,7 +74,7 @@ class AttributeSelector extends \Magento\Backend\Block\Template
         $types = array(
             \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE,
             \Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL,
-            \Magento\Catalog\Model\Product\Type::TYPE_CONFIGURABLE,
+            \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE,
         );
         foreach ($collection->getItems() as $id => $attribute) {
             /** @var $attribute \Magento\Catalog\Model\Resource\Eav\Attribute */
@@ -100,29 +89,4 @@ class AttributeSelector extends \Magento\Backend\Block\Template
         }
         return $result;
     }
-
-    /**
-     * Attribute set creation action URL
-     *
-     * @return string
-     */
-    public function getAttributeSetCreationUrl()
-    {
-        return $this->getUrl('*/product_set/save');
-    }
-
-    /**
-     * Get options for suggest widget
-     *
-     * @return array
-     */
-    public function getSuggestWidgetOptions()
-    {
-        return array(
-            'source' => $this->getUrl('*/product_attribute/suggestConfigurableAttributes'),
-            'minLength' => 0,
-            'className' => 'category-select',
-            'showAll' => true,
-        );
-    }
 }
diff --git a/app/code/Magento/ConfigurableProduct/data/configurableproduct_setup/data-install-1.0.0.0.php b/app/code/Magento/ConfigurableProduct/data/configurableproduct_setup/data-install-1.0.0.0.php
new file mode 100644
index 00000000000..f282af99393
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/data/configurableproduct_setup/data-install-1.0.0.0.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+/** @var $installer \Magento\Catalog\Model\Resource\Setup */
+$installer = $this;
+
+$attributes = array(
+    'country_of_manufacture',
+    'group_price',
+    'minimal_price',
+    'msrp',
+    'msrp_enabled',
+    'msrp_display_actual_price_type',
+    'price',
+    'special_price',
+    'special_from_date',
+    'special_to_date',
+    'tier_price',
+    'weight',
+);
+foreach ($attributes as $attributeCode) {
+    $relatedProductTypes = explode(
+        ',',
+        $installer->getAttribute(\Magento\Catalog\Model\Product::ENTITY, $attributeCode, 'apply_to')
+    );
+    if (!in_array(\Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE, $relatedProductTypes)) {
+        $relatedProductTypes[] = \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE;
+        $installer->updateAttribute(
+            \Magento\Catalog\Model\Product::ENTITY,
+            $attributeCode,
+            'apply_to',
+            implode(',', $relatedProductTypes)
+        );
+    }
+}
diff --git a/app/code/Magento/ConfigurableProduct/etc/adminhtml/di.xml b/app/code/Magento/ConfigurableProduct/etc/adminhtml/di.xml
new file mode 100644
index 00000000000..7da7b520a19
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/etc/adminhtml/di.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <type name="Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper">
+        <plugin name="configurable" type="Magento\ConfigurableProduct\Controller\Adminhtml\Product\Initialization\Helper\Plugin\Configurable" sortOrder="50" />
+    </type>
+    <type name="Magento\Catalog\Controller\Adminhtml\Product\Builder">
+        <plugin name="configurable" type="Magento\ConfigurableProduct\Controller\Adminhtml\Product\Builder\Plugin" sortOrder="50" />
+    </type>
+    <type name="Magento\Catalog\Model\Product\Validator">
+        <plugin name="configurable" type="Magento\ConfigurableProduct\Model\Product\Validator\Plugin" sortOrder="50" />
+    </type>
+    <type name="Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper\Plugin\Handler\Composite">
+        <arguments>
+            <argument name="handlers" xsi:type="array">
+                <item name="configurableProducts" xsi:type="string">Magento\ConfigurableProduct\Controller\Adminhtml\Product\Initialization\Helper\Plugin\Handler\ProductType\Configurable</item>
+            </argument>
+        </arguments>
+    </type>
+    <type name="Magento\ConfigurableProduct\Block\Adminhtml\Product\Attribute\Edit\Tab\Variations\Main">
+        <arguments>
+            <argument name="inputTypeFactory" xsi:type="object">Magento\Catalog\Model\System\Config\Source\InputtypeFactory</argument>
+        </arguments>
+    </type>
+</config>
diff --git a/dev/tests/unit/testsuite/Magento/Interception/Custom/Module/etc/frontend/di.xml b/app/code/Magento/ConfigurableProduct/etc/adminhtml/events.xml
similarity index 73%
rename from dev/tests/unit/testsuite/Magento/Interception/Custom/Module/etc/frontend/di.xml
rename to app/code/Magento/ConfigurableProduct/etc/adminhtml/events.xml
index 80d58bd71d7..db2dc61024f 100644
--- a/dev/tests/unit/testsuite/Magento/Interception/Custom/Module/etc/frontend/di.xml
+++ b/app/code/Magento/ConfigurableProduct/etc/adminhtml/events.xml
@@ -24,10 +24,7 @@
  */
 -->
 <config>
-    <type name="Magento\Interception\Custom\Module\Model\Item">
-        <plugin name="simple_plugin" disabled="true" />
-    </type>
-    <type name="Magento\Interception\Custom\Module\Model\Item\Enhanced">
-        <plugin name="advanced_plugin" type="Magento\Interception\Custom\Module\Model\ItemPlugin\Advanced" sortOrder="5"/>
-    </type>
+    <event name="product_attribute_form_build">
+        <observer name="configurable" instance="Magento\ConfigurableProduct\Block\Adminhtml\Product\Attribute\Edit\Tab\Advanced\Observer" method="observe" />
+    </event>
 </config>
diff --git a/dev/tests/unit/testsuite/Magento/Interception/Custom/Module/etc/di.xml b/app/code/Magento/ConfigurableProduct/etc/adminhtml/routes.xml
similarity index 83%
rename from dev/tests/unit/testsuite/Magento/Interception/Custom/Module/etc/di.xml
rename to app/code/Magento/ConfigurableProduct/etc/adminhtml/routes.xml
index 7662d53d33f..0369a00ccc3 100644
--- a/dev/tests/unit/testsuite/Magento/Interception/Custom/Module/etc/di.xml
+++ b/app/code/Magento/ConfigurableProduct/etc/adminhtml/routes.xml
@@ -24,7 +24,9 @@
  */
 -->
 <config>
-    <type name="Magento\Interception\Custom\Module\Model\Item">
-        <plugin name="simple_plugin" type="Magento\Interception\Custom\Module\Model\ItemPlugin\Simple" sortOrder="10"/>
-    </type>
+    <router id="admin">
+        <route id="catalog" frontName="catalog">
+            <module name="Magento_ConfigurableProduct" />
+        </route>
+    </router>
 </config>
diff --git a/app/code/Magento/ConfigurableProduct/etc/adminhtml/system.xml b/app/code/Magento/ConfigurableProduct/etc/adminhtml/system.xml
new file mode 100644
index 00000000000..79bb5023b51
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/etc/adminhtml/system.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<config>
+    <system>
+        <section id="checkout">
+            <group id="cart">
+                <field id="configurable_product_image" translate="label" type="select" sortOrder="4" showInDefault="1" showInWebsite="1" showInStore="1">
+                    <label>Configurable Product Image</label>
+                    <source_model>Magento\Catalog\Model\Config\Source\Product\Thumbnail</source_model>
+                </field>
+            </group>
+        </section>
+    </system>
+</config>
diff --git a/app/code/Magento/ConfigurableProduct/etc/config.xml b/app/code/Magento/ConfigurableProduct/etc/config.xml
new file mode 100644
index 00000000000..c5a6237875d
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/etc/config.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<config>
+    <default>
+        <checkout>
+            <cart>
+                <configurable_product_image>parent</configurable_product_image>
+            </cart>
+        </checkout>
+    </default>
+</config>
diff --git a/app/code/Magento/ConfigurableProduct/etc/di.xml b/app/code/Magento/ConfigurableProduct/etc/di.xml
new file mode 100644
index 00000000000..8c9db29c3a1
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/etc/di.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <type name="Magento\CatalogInventory\Model\Quote\Item\QuantityValidator\Initializer\Option">
+        <plugin name="configurable_product" type="Magento\ConfigurableProduct\Model\Quote\Item\QuantityValidator\Initializer\Option\Plugin\ConfigurableProduct" sortOrder="50" />
+    </type>
+    <type name="Magento\Catalog\Model\Product\CartConfiguration">
+        <plugin name="configurable_product" type="Magento\ConfigurableProduct\Model\Product\CartConfiguration\Plugin\Configurable" sortOrder="50" />
+    </type>
+    <type name="Magento\Sales\Model\Order\Admin\Item">
+        <plugin name="configurable_product" type="Magento\ConfigurableProduct\Model\Order\Admin\Item\Plugin\Configurable" sortOrder="50" />
+    </type>
+    <type name="Magento\Catalog\Helper\Product\Configuration">
+        <plugin name="confiburable_product" type="Magento\ConfigurableProduct\Helper\Product\Configuration\Plugin" sortOrder="50" />
+    </type>
+    <type name="Magento\Catalog\Model\Entity\Product\Attribute\Group\AttributeMapperInterface">
+        <plugin name="configurable_product" type="Magento\ConfigurableProduct\Model\Entity\Product\Attribute\Group\AttributeMapper\Plugin" sortOrder="50" />
+    </type>
+    <type name="Magento\Catalog\Model\Product\TypeTransitionManager">
+        <plugin name="configurable_product_transition" type="Magento\ConfigurableProduct\Model\Product\TypeTransitionManager\Plugin\Configurable" sortOrder="50" />
+        <arguments>
+            <argument name="compatibleTypes" xsi:type="array">
+                <item name="configurable" xsi:type="const">Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE</item>
+            </argument>
+        </arguments>
+    </type>
+    <type name="Magento\Sales\Model\Resource\Report\Bestsellers">
+        <arguments>
+            <argument name="ignoredProductTypes" xsi:type="array">
+                <item name="configurable" xsi:type="const">\Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE</item>
+            </argument>
+        </arguments>
+    </type>
+    <type name="Magento\Module\Updater\SetupFactory">
+        <arguments>
+            <argument name="resourceTypes" xsi:type="array">
+                <item name="configurableproduct_setup" xsi:type="string">Magento\Catalog\Model\Resource\Setup</item>
+            </argument>
+        </arguments>
+    </type>
+    <type name="Magento\ImportExport\Model\Export\RowCustomizer\Composite">
+        <arguments>
+            <argument name="customizers" xsi:type="array">
+                <item name="configurableProduct" xsi:type="string">Magento\ConfigurableProduct\Model\Export\RowCustomizer</item>
+            </argument>
+        </arguments>
+    </type>
+    <type name="Magento\Eav\Model\Entity\Setup\PropertyMapper\Composite">
+        <arguments>
+            <argument name="propertyMappers" xsi:type="array">
+                <item name="configurable" xsi:type="string">Magento\ConfigurableProduct\Model\Resource\Setup\PropertyMapper</item>
+            </argument>
+        </arguments>
+    </type>
+    <type name="Magento\Catalog\Model\Attribute\LockValidatorComposite">
+        <arguments>
+            <argument name="validators" xsi:type="array">
+                <item name="configurable" xsi:type="string">Magento\ConfigurableProduct\Model\Attribute\LockValidator</item>
+            </argument>
+        </arguments>
+    </type>
+    <type name="Magento\Catalog\Model\Product\Type">
+        <plugin name="configurable_output" type="Magento\ConfigurableProduct\Model\Product\Type\Plugin" />
+    </type>
+</config>
diff --git a/app/code/Magento/ConfigurableProduct/etc/eav_attributes.xml b/app/code/Magento/ConfigurableProduct/etc/eav_attributes.xml
new file mode 100644
index 00000000000..d1a407ac25d
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/etc/eav_attributes.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<config>
+    <entity type="catalog_product">
+        <attribute code="status">
+            <field code="is_configurable" locked="true" />
+        </attribute>
+        <attribute code="visibility">
+            <field code="is_configurable" locked="true" />
+        </attribute>
+    </entity>
+</config>
diff --git a/app/code/Magento/ConfigurableProduct/etc/export.xml b/app/code/Magento/ConfigurableProduct/etc/export.xml
new file mode 100644
index 00000000000..8e14066781c
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/etc/export.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<config>
+    <productType name="configurable" model="Magento\ConfigurableProduct\Model\Export\Entity\Product\Type\Configurable" />
+</config>
diff --git a/app/code/Magento/ConfigurableProduct/etc/import.xml b/app/code/Magento/ConfigurableProduct/etc/import.xml
new file mode 100644
index 00000000000..c7896805daa
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/etc/import.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<config>
+    <productType name="configurable" model="Magento\ConfigurableProduct\Model\Import\Entity\Product\Type\Configurable" />
+</config>
diff --git a/app/code/Magento/ConfigurableProduct/etc/module.xml b/app/code/Magento/ConfigurableProduct/etc/module.xml
new file mode 100644
index 00000000000..e672a24aa1e
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/etc/module.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<config>
+    <module name="Magento_ConfigurableProduct" version="1.0.0.0" active="true">
+        <sequence>
+            <module name="Magento_Catalog"/>
+            <module name="Magento_CatalogInventory"/>
+            <module name="Magento_Sales" />
+            <module name="Magento_Checkout" />
+            <module name="Magento_ImportExport" />
+        </sequence>
+        <depends>
+            <module name="Magento_Catalog" />
+            <module name="Magento_CatalogInventory" />
+            <module name="Magento_Sales" />
+            <module name="Magento_Core" />
+            <module name="Magento_Tax" />
+            <module name="Magento_Checkout" />
+            <module name="Magento_Wishlist" />
+            <module name="Magento_Theme" />
+            <module name="Magento_Backend" />
+            <module name="Magento_Eav" />
+            <module name="Magento_Cms" />
+            <module name="Magento_ImportExport" />
+            <module name="Magento_Customer" />
+            <module name="Magento_CatalogRule" />
+        </depends>
+    </module>
+</config>
diff --git a/app/code/Magento/ConfigurableProduct/etc/product_types.xml b/app/code/Magento/ConfigurableProduct/etc/product_types.xml
new file mode 100644
index 00000000000..8c9baabfaa9
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/etc/product_types.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<config>
+    <type name="configurable" label="Configurable Product" modelInstance="Magento\ConfigurableProduct\Model\Product\Type\Configurable" composite='true' indexPriority="30">
+        <priceModel instance="Magento\ConfigurableProduct\Model\Product\Type\Configurable\Price" />
+        <indexerModel instance="Magento\ConfigurableProduct\Model\Resource\Product\Indexer\Price\Configurable" />
+        <stockIndexerModel instance="Magento\ConfigurableProduct\Model\Resource\Indexer\Stock\Configurable" />
+        <customAttributes>
+            <attribute name="refundable" value="true"/>
+        </customAttributes>
+    </type>
+</config>
diff --git a/app/code/Magento/ConfigurableProduct/etc/sales.xml b/app/code/Magento/ConfigurableProduct/etc/sales.xml
new file mode 100644
index 00000000000..ee5cf9d088b
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/etc/sales.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<config>
+    <order>
+        <available_product_type name="configurable"/>
+    </order>
+</config>
diff --git a/app/code/Magento/ConfigurableProduct/i18n/de_DE.csv b/app/code/Magento/ConfigurableProduct/i18n/de_DE.csv
new file mode 100644
index 00000000000..789fd602d63
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/i18n/de_DE.csv
@@ -0,0 +1,16 @@
+"Configurable Product","Konfigurierbare Produkte"
+"Configurable Product Settings","Konfigurierbare Produkteinstellungen"
+"Configurable Product Image","Konfigurierbares Produktbild"
+"This attribute is used in configurable products","Dieses Attribut wird für konfigurierbare Produkte verwendet"
+"Attribute '%s' used in configurable products","Attribut '%s' wird für konfigurierbare Produkte verwendet"
+"Select Configurable Attributes","Konfigurierbare Merkmale auswählen"
+"Configure Product","Produkt konfigurieren"
+"Copy From Configurable","Aus konfigurierbaren Produkteinstellungen kopieren"
+"Product with this combination of attributes already associated to configurable.","Produktkombination mit diesen Attributen existiert bereits im konfigurierbaren Produkt."
+"Scope must not be changed, because the attribute is used in configurable products.","Der Umfang darf nicht geändert werden, da dieses Attribut bei konfigurierbaren Produkten verwendet wird."
+"This attribute is used in configurable products.","Das Attribut wurde in konfigurierbaren Produkten verwendet."
+"This attribute is used in configurable products. You cannot remove it from the attribute set.","Diese Eigenschaft wird für konfigurierbare Produkte benötigt. Sie können sie nicht aus dem Eigenschaftenset entfernen."
+"This group contains attributes, used in configurable products. Please move these attributes to another group and try again.","Diese Gruppe enthält Eigenschaften, die für konfigurierbare Produkte benutzt werden. Bitte verschieben Sie diese Eigenschaften in eine andere Gruppe und versuchen Sie es noch einmal."
+"Use To Create Configurable Product","Verwenden um konfigurierbares Produkt zu erstellen"
+"Wrong product type to extract configurable options.","Falscher Produkt-Typ, um konfigurierbare Optionen zu extrahieren."
+
diff --git a/app/code/Magento/ConfigurableProduct/i18n/en_US.csv b/app/code/Magento/ConfigurableProduct/i18n/en_US.csv
new file mode 100644
index 00000000000..afd577b8268
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/i18n/en_US.csv
@@ -0,0 +1,17 @@
+"Configurable Product","Configurable Product"
+"Configurable Product Settings","Configurable Product Settings"
+"Configurable Product Image","Configurable Product Image"
+"Attribute '%s' used in configurable products","Attribute '%s' used in configurable products"
+"This attribute is used in configurable products","This attribute is used in configurable products"
+"Select Configurable Attributes","Select Configurable Attributes"
+"Configure Product","Configure Product"
+"Copy From Configurable","Copy From Configurable"
+"Product with this combination of attributes already associated to configurable.","Product with this combination of attributes already associated to configurable."
+"Scope must not be changed, because the attribute is used in configurable products.","Scope must not be changed, because the attribute is used in configurable products."
+"Select Configurable Attributes ","Select Configurable Attributes "
+"This attribute is used in configurable products.","This attribute is used in configurable products."
+"This attribute is used in configurable products. You cannot remove it from the attribute set.","This attribute is used in configurable products. You cannot remove it from the attribute set."
+"This group contains attributes, used in configurable products. Please move these attributes to another group and try again.","This group contains attributes, used in configurable products. Please move these attributes to another group and try again."
+"Use To Create Configurable Product","Use To Create Configurable Product"
+"Wrong product type to extract configurable options.","Wrong product type to extract configurable options."
+
diff --git a/app/code/Magento/ConfigurableProduct/i18n/es_ES.csv b/app/code/Magento/ConfigurableProduct/i18n/es_ES.csv
new file mode 100644
index 00000000000..6aba9b65ee4
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/i18n/es_ES.csv
@@ -0,0 +1,15 @@
+"Configurable Product","Producto Configurable"
+"Configurable Product Settings","Parametrización de Producto Configurable"
+"Configurable Product Image","Imagen configurable del producto"
+"Attribute '%s' used in configurable products","Campo ""%s"" utilizado en productos configurables"
+"This attribute is used in configurable products","Este atributo se utiliza en productos configurables"
+"Select Configurable Attributes","Seleccionar atributos configurables"
+"Configure Product","Configurar Producto"
+"Copy From Configurable","Copiar desde Configurable"
+"Product with this combination of attributes already associated to configurable.","El producto con esta combinación de atributos ya ha sido asociado a configurables."
+"Scope must not be changed, because the attribute is used in configurable products.","No se puede cambiar el ámbito de aplicación, dado que el atributo se utiliza en productos configurables."
+"This attribute is used in configurable products.","Este atributo se utiliza en productos configurables."
+"This attribute is used in configurable products. You cannot remove it from the attribute set.","Este atributo se utiliza en productos configurables. No es posible eliminarlo del conjunto de atributos."
+"This group contains attributes, used in configurable products. Please move these attributes to another group and try again.","Este grupo contiene atributos utilizados en productos configurables. Páselos a otro grupo y vuelva a intentarlo."
+"Use To Create Configurable Product","Utilizar para crear producto configurable"
+"Wrong product type to extract configurable options.","Tipo de producto incorrecto para extraer opciones configurables."
diff --git a/app/code/Magento/ConfigurableProduct/i18n/fr_FR.csv b/app/code/Magento/ConfigurableProduct/i18n/fr_FR.csv
new file mode 100644
index 00000000000..c9591bb41bf
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/i18n/fr_FR.csv
@@ -0,0 +1,16 @@
+"Configurable Product","Produit configurable"
+"Configurable Product Settings","Réglages du produit configurable"
+"Configurable Product Image","Image de produit configurable"
+"Attribute '%s' used in configurable products","L'attribut ""%s"" est utilisé dans les produits configurables"
+"This attribute is used in configurable products","Cet attribut est utilisé pour des produits configurables"
+"Select Configurable Attributes","Sélectionner les attributs configurables"
+"Configure Product","Configurer produit"
+"Copy From Configurable","Copier depuis configurable"
+"Product with this combination of attributes already associated to configurable.","Les produits avec cette combinaison d'attributs sont déjà associés à configurable."
+"Scope must not be changed, because the attribute is used in configurable products.","Le champ ne doit pas être changé, car l'attribut est utilisé dans des produits configurables."
+"Select Configurable Attributes ","Sélectionner les attributs configurables"
+"This attribute is used in configurable products.","Cet attribut est utilisé dans les produits configurables."
+"This attribute is used in configurable products. You cannot remove it from the attribute set.","L'attribut est utilisé dans des produits paramétrables. Vous ne pouvez pas le retirer de la série d'attributs."
+"This group contains attributes, used in configurable products. Please move these attributes to another group and try again.","Le groupe contient des attributs, utilisés dans des produits paramétrables. Veuillez déplacer ces attributs vers un autre groupe et réessayer."
+"Use To Create Configurable Product","Permet de créer des produits configurables"
+"Wrong product type to extract configurable options.","Mauvais type de produit pour extraire des options configurables."
diff --git a/app/code/Magento/ConfigurableProduct/i18n/nl_NL.csv b/app/code/Magento/ConfigurableProduct/i18n/nl_NL.csv
new file mode 100644
index 00000000000..8922e9076f9
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/i18n/nl_NL.csv
@@ -0,0 +1,16 @@
+"Configurable Product","Configureerbaar Product"
+"Configurable Product Settings","Configureerbare Productinstellingen"
+"Configurable Product Image","Instelbare productafbeelding"
+"Attribute '%s' used in configurable products","Attribuut '%s' gebruikt in configureerbare producten"
+"This attribute is used in configurable products","Dit attribuut wordt gebruikt in configureerbare producten"
+"Select Configurable Attributes","Selecteer Configureerbare Attributen"
+"Configure Product","Product instellen"
+"Copy From Configurable","Kopieer Van Configureerbaar"
+"Product with this combination of attributes already associated to configurable.","Product met deze combinatie van attributen is reeds geassocieerd met configureerbaar."
+"Scope must not be changed, because the attribute is used in configurable products.","Reikwijdte moet niet veranderd worden, omdat de attribuut gebruikt wordt door configureerbare producten."
+"Select Configurable Attributes ","Selecteer Configureerbare Attributen"
+"This attribute is used in configurable products.","Dit kenmerk wordt gebruikt in configureerbare producten."
+"This attribute is used in configurable products. You cannot remove it from the attribute set.","Dit attribuut wordt gebruikt in configureerbare producten. U kunt het niet verwijderen uit de attributenreeks."
+"This group contains attributes, used in configurable products. Please move these attributes to another group and try again.","Deze groep bevat attributen die gebruikt worden in configureerbare producten. Verplaats deze attributen naar een andere groep en probeer het opnieuw."
+"Use To Create Configurable Product","Gebruik Om Configureerbaar Product Te Creëren"
+"Wrong product type to extract configurable options.","Verkeerd producttype om configureerbare opties van af te nemen."
diff --git a/app/code/Magento/ConfigurableProduct/i18n/pt_BR.csv b/app/code/Magento/ConfigurableProduct/i18n/pt_BR.csv
new file mode 100644
index 00000000000..ea2c452a5de
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/i18n/pt_BR.csv
@@ -0,0 +1,16 @@
+"Configurable Product","Produto Configurável"
+"Configurable Product Settings","Características do Produto Configurável"
+"Configurable Product Image","Imagem Configurável de Produto"
+"Attribute '%s' used in configurable products","Atributo '%s' usado em produtos configuráveis"
+"This attribute is used in configurable products","Este atributo é utilizado em produtos configuráveis"
+"Select Configurable Attributes","Selecionar Atributos Configuráveis"
+"Configure Product","Configurar Produto"
+"Copy From Configurable","Copiar de Configurável"
+"Product with this combination of attributes already associated to configurable.","O produto com esta combinação de atributos já está associado aos configuráveis."
+"Scope must not be changed, because the attribute is used in configurable products.","O limite não pode ser alterado, porque o atributo é usado em produtos configuráveis."
+"Select Configurable Attributes ","Selecionar Atributos Configuráveis"
+"This attribute is used in configurable products.","O atributo é usado em produtos configuráveis."
+"This attribute is used in configurable products. You cannot remove it from the attribute set.","Este atributo é usado em produtos configuráveis​​. Você não pode removê-lo do conjunto de atributos."
+"This group contains attributes, used in configurable products. Please move these attributes to another group and try again.","Este grupo contém atributos, usados ​​em produtos configuráveis. Por favor mova esses atributos para outro grupo e tente novamente."
+"Use To Create Configurable Product","Use Para Criar Produto Configurável"
+"Wrong product type to extract configurable options.","Tipo de produto errado para extrair opções configuráveis."
diff --git a/app/code/Magento/ConfigurableProduct/i18n/zh_CN.csv b/app/code/Magento/ConfigurableProduct/i18n/zh_CN.csv
new file mode 100644
index 00000000000..41eef6d67fb
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/i18n/zh_CN.csv
@@ -0,0 +1,16 @@
+"Configurable Product","可配置的产品"
+"Configurable Product Settings","可配置的产品设置"
+"Configurable Product Image","可配置产品图片"
+"This attribute is used in configurable products","该属性已用于可配置产品"
+"Attribute '%s' used in configurable products","配置产品中使用的属性 '%s'"
+"Select Configurable Attributes","选择可配置属性"
+"Configure Product","配置产品"
+"Copy From Configurable","从配置中复制"
+"Product with this combination of attributes already associated to configurable.","具有此属性组合的产品已与可配置产品关联。"
+"Scope must not be changed, because the attribute is used in configurable products.","范围不能更改,因为可配置产品中使用了属性。"
+"Select Configurable Attributes ","选择可配置属性"
+"This attribute is used in configurable products.","该属性已用于可配置产品。"
+"This attribute is used in configurable products. You cannot remove it from the attribute set.","该属性用于可配置的产品。您无法从属性集中将其删除。"
+"This group contains attributes, used in configurable products. Please move these attributes to another group and try again.","该群组包含用于可配置产品的属性。请移动这些属性到另一群组并重试。"
+"Use To Create Configurable Product","用于创建可配置的产品"
+"Wrong product type to extract configurable options.","错误的产品类型来提取可配置选项。"
diff --git a/app/code/Magento/ConfigurableProduct/sql/configurable_setup/install-1.0.0.0.php b/app/code/Magento/ConfigurableProduct/sql/configurable_setup/install-1.0.0.0.php
new file mode 100644
index 00000000000..58cd871e894
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/sql/configurable_setup/install-1.0.0.0.php
@@ -0,0 +1,258 @@
+<?php
+/**
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+$installer = $this;
+/* @var $installer \Magento\Catalog\Model\Resource\Setup */
+
+$installer->startSetup();
+
+/**
+ * Create table 'catalog_product_super_attribute'
+ */
+$table = $installer->getConnection()
+    ->newTable($installer->getTable('catalog_product_super_attribute'))
+    ->addColumn('product_super_attribute_id', \Magento\DB\Ddl\Table::TYPE_INTEGER, null, array(
+        'identity'  => true,
+        'unsigned'  => true,
+        'nullable'  => false,
+        'primary'   => true,
+    ), 'Product Super Attribute ID')
+    ->addColumn('product_id', \Magento\DB\Ddl\Table::TYPE_INTEGER, null, array(
+        'unsigned'  => true,
+        'nullable'  => false,
+        'default'   => '0',
+    ), 'Product ID')
+    ->addColumn('attribute_id', \Magento\DB\Ddl\Table::TYPE_SMALLINT, null, array(
+        'unsigned'  => true,
+        'nullable'  => false,
+        'default'   => '0',
+    ), 'Attribute ID')
+    ->addColumn('position', \Magento\DB\Ddl\Table::TYPE_SMALLINT, null, array(
+        'unsigned'  => true,
+        'nullable'  => false,
+        'default'   => '0',
+    ), 'Position')
+    ->addIndex($installer->getIdxName('catalog_product_super_attribute', array('product_id')),
+        array('product_id'))
+    ->addIndex(
+        $installer->getIdxName(
+            'catalog_product_super_attribute',
+            array('product_id', 'attribute_id'),
+            \Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE
+        ),
+        array('product_id', 'attribute_id'),
+        array('type' => \Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE)
+    )
+    ->addForeignKey(
+        $installer->getFkName('catalog_product_super_attribute', 'product_id', 'catalog_product_entity', 'entity_id'),
+        'product_id', $installer->getTable('catalog_product_entity'), 'entity_id',
+        \Magento\DB\Ddl\Table::ACTION_CASCADE, \Magento\DB\Ddl\Table::ACTION_NO_ACTION)
+    ->setComment('Catalog Product Super Attribute Table');
+$installer->getConnection()->createTable($table);
+
+/**
+ * Create table 'catalog_product_super_attribute_label'
+ */
+$table = $installer->getConnection()
+    ->newTable($installer->getTable('catalog_product_super_attribute_label'))
+    ->addColumn('value_id', \Magento\DB\Ddl\Table::TYPE_INTEGER, null, array(
+        'identity'  => true,
+        'unsigned'  => true,
+        'nullable'  => false,
+        'primary'   => true,
+    ), 'Value ID')
+    ->addColumn('product_super_attribute_id', \Magento\DB\Ddl\Table::TYPE_INTEGER, null, array(
+        'unsigned'  => true,
+        'nullable'  => false,
+        'default'   => '0',
+    ), 'Product Super Attribute ID')
+    ->addColumn('store_id', \Magento\DB\Ddl\Table::TYPE_SMALLINT, null, array(
+        'unsigned'  => true,
+        'nullable'  => false,
+        'default'   => '0',
+    ), 'Store ID')
+    ->addColumn('use_default', \Magento\DB\Ddl\Table::TYPE_SMALLINT, null, array(
+        'unsigned'  => true,
+        'default'   => '0',
+    ), 'Use Default Value')
+    ->addColumn('value', \Magento\DB\Ddl\Table::TYPE_TEXT, 255, array(
+    ), 'Value')
+    ->addIndex(
+        $installer->getIdxName(
+            'catalog_product_super_attribute_label',
+            array('product_super_attribute_id', 'store_id'),
+            \Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE
+        ),
+        array('product_super_attribute_id', 'store_id'),
+        array('type' => \Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE))
+    ->addIndex($installer->getIdxName('catalog_product_super_attribute_label', array('product_super_attribute_id')),
+        array('product_super_attribute_id'))
+    ->addIndex($installer->getIdxName('catalog_product_super_attribute_label', array('store_id')),
+        array('store_id'))
+    ->addForeignKey(
+        $installer->getFkName(
+            'catalog_product_super_attribute_label',
+            'product_super_attribute_id',
+            'catalog_product_super_attribute',
+            'product_super_attribute_id'
+        ),
+        'product_super_attribute_id', $installer->getTable('catalog_product_super_attribute'),
+        'product_super_attribute_id',
+        \Magento\DB\Ddl\Table::ACTION_CASCADE, \Magento\DB\Ddl\Table::ACTION_CASCADE)
+    ->addForeignKey(
+        $installer->getFkName('catalog_product_super_attribute_label', 'store_id', 'core_store', 'store_id'),
+        'store_id', $installer->getTable('core_store'), 'store_id',
+        \Magento\DB\Ddl\Table::ACTION_CASCADE, \Magento\DB\Ddl\Table::ACTION_CASCADE)
+    ->setComment('Catalog Product Super Attribute Label Table');
+$installer->getConnection()->createTable($table);
+
+/**
+ * Create table 'catalog_product_super_attribute_pricing'
+ */
+$table = $installer->getConnection()
+    ->newTable($installer->getTable('catalog_product_super_attribute_pricing'))
+    ->addColumn('value_id', \Magento\DB\Ddl\Table::TYPE_INTEGER, null, array(
+        'identity'  => true,
+        'unsigned'  => true,
+        'nullable'  => false,
+        'primary'   => true,
+    ), 'Value ID')
+    ->addColumn('product_super_attribute_id', \Magento\DB\Ddl\Table::TYPE_INTEGER, null, array(
+        'unsigned'  => true,
+        'nullable'  => false,
+        'default'   => '0',
+    ), 'Product Super Attribute ID')
+    ->addColumn('value_index', \Magento\DB\Ddl\Table::TYPE_TEXT, 255, array(
+        'nullable'  => true,
+        'default'   => null,
+    ), 'Value Index')
+    ->addColumn('is_percent', \Magento\DB\Ddl\Table::TYPE_SMALLINT, null, array(
+        'unsigned'  => true,
+        'default'   => '0',
+    ), 'Is Percent')
+    ->addColumn('pricing_value', \Magento\DB\Ddl\Table::TYPE_DECIMAL, '12,4', array(
+    ), 'Pricing Value')
+    ->addColumn('website_id', \Magento\DB\Ddl\Table::TYPE_SMALLINT, null, array(
+        'unsigned'  => true,
+        'nullable'  => false,
+        'default'   => '0',
+    ), 'Website ID')
+    ->addIndex($installer->getIdxName('catalog_product_super_attribute_pricing', array('product_super_attribute_id')),
+        array('product_super_attribute_id'))
+    ->addIndex($installer->getIdxName('catalog_product_super_attribute_pricing', array('website_id')),
+        array('website_id'))
+    ->addIndex(
+        $installer->getIdxName(
+            'catalog_product_super_attribute_pricing',
+            array('product_super_attribute_id', 'value_index', 'website_id'),
+            \Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE
+        ),
+        array('product_super_attribute_id', 'value_index', 'website_id'),
+        array('type' => \Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE)
+    )
+    ->addForeignKey(
+        $installer->getFkName(
+            'catalog_product_super_attribute_pricing',
+            'website_id',
+            'core_website',
+            'website_id'
+        ),
+        'website_id', $installer->getTable('core_website'), 'website_id',
+        \Magento\DB\Ddl\Table::ACTION_CASCADE, \Magento\DB\Ddl\Table::ACTION_CASCADE)
+    ->addForeignKey(
+        $installer->getFkName(
+            'catalog_product_super_attribute_pricing',
+            'product_super_attribute_id',
+            'catalog_product_super_attribute',
+            'product_super_attribute_id'
+        ),
+        'product_super_attribute_id',
+        $installer->getTable('catalog_product_super_attribute'),
+        'product_super_attribute_id',
+        \Magento\DB\Ddl\Table::ACTION_CASCADE, \Magento\DB\Ddl\Table::ACTION_CASCADE)
+    ->setComment('Catalog Product Super Attribute Pricing Table');
+$installer->getConnection()->createTable($table);
+
+/**
+ * Create table 'catalog_product_super_link'
+ */
+$table = $installer->getConnection()
+    ->newTable($installer->getTable('catalog_product_super_link'))
+    ->addColumn('link_id', \Magento\DB\Ddl\Table::TYPE_INTEGER, null, array(
+        'identity'  => true,
+        'unsigned'  => true,
+        'nullable'  => false,
+        'primary'   => true,
+    ), 'Link ID')
+    ->addColumn('product_id', \Magento\DB\Ddl\Table::TYPE_INTEGER, null, array(
+        'unsigned'  => true,
+        'nullable'  => false,
+        'default'   => '0',
+    ), 'Product ID')
+    ->addColumn('parent_id', \Magento\DB\Ddl\Table::TYPE_INTEGER, null, array(
+        'unsigned'  => true,
+        'nullable'  => false,
+        'default'   => '0',
+    ), 'Parent ID')
+    ->addIndex($installer->getIdxName('catalog_product_super_link', array('parent_id')),
+        array('parent_id'))
+    ->addIndex($installer->getIdxName('catalog_product_super_link', array('product_id')),
+        array('product_id'))
+    ->addIndex($installer->getIdxName(
+            'catalog_product_super_link',
+            array('product_id', 'parent_id'),
+            \Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE
+        ),
+        array('product_id', 'parent_id'),
+        array('type' => \Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE)
+    )
+    ->addForeignKey(
+        $installer->getFkName('catalog_product_super_link', 'product_id', 'catalog_product_entity', 'entity_id'),
+        'product_id',
+        $installer->getTable('catalog_product_entity'),
+        'entity_id',
+        \Magento\DB\Ddl\Table::ACTION_CASCADE, \Magento\DB\Ddl\Table::ACTION_CASCADE
+    )
+    ->addForeignKey(
+        $installer->getFkName('catalog_product_super_link', 'parent_id', 'catalog_product_entity', 'entity_id'),
+        'parent_id',
+        $installer->getTable('catalog_product_entity'),
+        'entity_id',
+        \Magento\DB\Ddl\Table::ACTION_CASCADE, \Magento\DB\Ddl\Table::ACTION_CASCADE)
+    ->setComment('Catalog Product Super Link Table');
+$installer->getConnection()->createTable($table);
+
+$table = $installer->getConnection()->addColumn(
+    $installer->getTable('catalog_eav_attribute'),
+    'is_configurable',
+    array(
+        'type'      => \Magento\DB\Ddl\Table::TYPE_SMALLINT,
+        'unsigned'  => true,
+        'default'   => null,
+        'comment'   => 'Can be used to create configurable product'
+    )
+);
+
+$installer->endSetup();
diff --git a/app/code/Magento/Catalog/view/adminhtml/catalog/product-variation.js b/app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product-variation.js
similarity index 99%
rename from app/code/Magento/Catalog/view/adminhtml/catalog/product-variation.js
rename to app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product-variation.js
index 877e4f47df0..cb982176324 100644
--- a/app/code/Magento/Catalog/view/adminhtml/catalog/product-variation.js
+++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product-variation.js
@@ -17,8 +17,6 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Mage
- * @package     Magento_Adminhtml
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
diff --git a/app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/attribute.js b/app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/attribute.js
new file mode 100644
index 00000000000..f7f8bd30e01
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/attribute.js
@@ -0,0 +1,35 @@
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+
+(function ($) {
+$.widget("mage.configurableAttribute", $.mage.productAttributes, {
+        _prepareUrl: function() {
+            var name = $('#configurable-attribute-selector').val();
+            return this.options.url +
+                (/\?/.test(this.options.url) ? '&' : '?') +
+                'set=' + window.encodeURIComponent($('#attribute_set_id').val()) +
+                '&attribute[frontend_label]=' +
+                window.encodeURIComponent(name);
+        }
+    });
+})(jQuery);
\ No newline at end of file
diff --git a/app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/attribute/js.phtml b/app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/attribute/js.phtml
new file mode 100644
index 00000000000..f63b776c8e3
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/attribute/js.phtml
@@ -0,0 +1,50 @@
+<?php
+/**
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+?>
+<script type="text/javascript">
+function checkIsConfigurableVisibility()
+{
+    if (!$('is_configurable') || !$('is_global') || !$('frontend_input')) return;
+    if ($F('is_global')==1 && $F('frontend_input')=='select') {
+        setRowVisibility('is_configurable', true);
+    } else {
+        setRowVisibility('is_configurable', false);
+    }
+}
+
+switchDefaultValueField = switchDefaultValueField.wrap(function(original) {
+    original();
+    checkIsConfigurableVisibility();
+});
+
+showDefaultRows = showDefaultRows.wrap(function(original) {
+    original();
+    setRowVisibility('is_configurable', true);
+});
+
+if($('frontend_input')){
+    Event.observe($('is_global'), 'change', checkIsConfigurableVisibility);
+}
+</script>
diff --git a/app/code/Magento/Catalog/view/adminhtml/catalog/product/attribute/new/created.phtml b/app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/attribute/new/created.phtml
similarity index 93%
rename from app/code/Magento/Catalog/view/adminhtml/catalog/product/attribute/new/created.phtml
rename to app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/attribute/new/created.phtml
index 406be6cfaae..1a3a1022c80 100644
--- a/app/code/Magento/Catalog/view/adminhtml/catalog/product/attribute/new/created.phtml
+++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/attribute/new/created.phtml
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
-/** @var $this \Magento\Catalog\Block\Adminhtml\Product\Attribute\NewAttribute\Product\Created */
+/** @var $this \Magento\ConfigurableProduct\Block\Adminhtml\Product\Attribute\NewAttribute\Product\Created */
 ?>
 <script type="text/javascript">
 (function ($) {
diff --git a/app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/attribute/set/js.phtml b/app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/attribute/set/js.phtml
new file mode 100644
index 00000000000..9c706d108ba
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/attribute/set/js.phtml
@@ -0,0 +1,65 @@
+<?php
+/**
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+?>
+<script type="text/javascript">
+    ConfigurableNodeExists = function(currentNode) {
+        for (var i in currentNode.childNodes ) {
+            if (currentNode.childNodes[i].id) {
+                child = editSet.currentNode.childNodes[i];
+                if (child.attributes.is_configurable) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    };
+    var editSet = editSet;
+
+    editSet.submit = editSet.submit.wrap(function(original) {
+        if (editSet.currentNode){
+            if (ConfigurableNodeExists(editSet.currentNode)) {
+                alert('<?php echo $this->escapeJsQuote(__('This group contains attributes used in configurable products. Please move these attributes to another group and try again.')) ?>');
+                return;
+            }
+        }
+        return original();
+    });
+
+    editSet.rightBeforeAppend = editSet.rightBeforeAppend.wrap(function(original, tree, nodeThis, node, newParent) {
+        if (node.attributes.is_configurable == 1) {
+            alert('<?php echo $this->escapeJsQuote(__('This attribute is used in configurable products. You cannot remove it from the attribute set.')) ?>');
+            return false;
+        }
+        return original(tree, nodeThis, node, newParent);
+    });
+
+    editSet.rightBeforeInsert = editSet.rightBeforeInsert.wrap(function(original, tree, nodeThis, node, newParent) {
+        if (node.attributes.is_configurable == 1) {
+            alert('<?php echo $this->escapeJsQuote(__('This attribute is used in configurable products. You cannot remove it from the attribute set.')) ?>');
+            return false;
+        }
+        return original(tree, nodeThis, node, newParent);
+    });
+</script>
diff --git a/app/code/Magento/Catalog/view/adminhtml/catalog/product/composite/fieldset/configurable.phtml b/app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/composite/fieldset/configurable.phtml
similarity index 94%
rename from app/code/Magento/Catalog/view/adminhtml/catalog/product/composite/fieldset/configurable.phtml
rename to app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/composite/fieldset/configurable.phtml
index 8f05f0a5eb3..62fbcba2d27 100644
--- a/app/code/Magento/Catalog/view/adminhtml/catalog/product/composite/fieldset/configurable.phtml
+++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/composite/fieldset/configurable.phtml
@@ -18,14 +18,12 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    design
- * @package     default_default
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
  ?>
 
-<?php /* @var $this \Magento\Catalog\Block\Adminhtml\Product\Composite\Fieldset\Configurable */ ?>
+<?php /* @var $this \Magento\ConfigurableProduct\Block\Adminhtml\Product\Composite\Fieldset\Configurable */ ?>
 <?php $_product = $this->getProduct(); ?>
 <?php $_attributes = $this->decorateArray($this->getAllowAttributes()); ?>
 <?php $_skipSaleableCheck = $this->helper('Magento\Catalog\Helper\Product')->getSkipSaleableCheck(); ?>
diff --git a/app/code/Magento/Catalog/view/adminhtml/catalog/product/edit/super/attribute-js-template.phtml b/app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/edit/super/attribute-js-template.phtml
similarity index 100%
rename from app/code/Magento/Catalog/view/adminhtml/catalog/product/edit/super/attribute-js-template.phtml
rename to app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/edit/super/attribute-js-template.phtml
diff --git a/app/code/Magento/Catalog/view/adminhtml/catalog/product/edit/super/attribute-template.phtml b/app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/edit/super/attribute-template.phtml
similarity index 100%
rename from app/code/Magento/Catalog/view/adminhtml/catalog/product/edit/super/attribute-template.phtml
rename to app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/edit/super/attribute-template.phtml
diff --git a/app/code/Magento/Catalog/view/adminhtml/catalog/product/edit/super/config.phtml b/app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/edit/super/config.phtml
similarity index 96%
rename from app/code/Magento/Catalog/view/adminhtml/catalog/product/edit/super/config.phtml
rename to app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/edit/super/config.phtml
index 1112dc21677..dc5c36e6e41 100644
--- a/app/code/Magento/Catalog/view/adminhtml/catalog/product/edit/super/config.phtml
+++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/edit/super/config.phtml
@@ -23,7 +23,9 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
- /** @var $this \Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config */
+ /** @var $this \Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config */
+
+use \Magento\ConfigurableProduct\Model\Product\Type\Configurable;
 ?>
 <div class="entry-edit form-inline" id="<?php echo $this->getId() ?>">
     <div class="fieldset-wrapper collapsable-wrapper" id="<?php echo $this->getId() ?>-wrapper" data-panel="product-variations">
@@ -68,7 +70,7 @@ jQuery(function($) {
         qtyField = $('#qty'),
         currentProductTemplateControl = $('#product-template-suggest-container .actions-split > .action-toggle'),
         attributesInput = $("input[name='attributes[]']", variationsContainer),
-        hasVariations = <?php echo ($this->getProduct()->isConfigurable() || $this->getRequest()->has('attributes')) ? 'true' : 'false' ?>,
+        hasVariations = <?php echo ($this->getProduct()->getTypeId() == Configurable::TYPE_CODE || $this->getRequest()->has('attributes')) ? 'true' : 'false' ?>,
         isLocked = function (element) {
             return element.is('[data-locked]');
         },
diff --git a/app/code/Magento/Catalog/view/adminhtml/catalog/product/edit/super/generator.phtml b/app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/edit/super/generator.phtml
similarity index 94%
rename from app/code/Magento/Catalog/view/adminhtml/catalog/product/edit/super/generator.phtml
rename to app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/edit/super/generator.phtml
index cf1a127a405..ad2b287dd13 100644
--- a/app/code/Magento/Catalog/view/adminhtml/catalog/product/edit/super/generator.phtml
+++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/edit/super/generator.phtml
@@ -21,7 +21,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
-/** @var $this \Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config */
+/** @var $this \Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config */
 ?>
 <div data-role="product-variations-generator">
     <!-- Configurable Attributes list -->
diff --git a/app/code/Magento/Catalog/view/adminhtml/catalog/product/edit/super/matrix.phtml b/app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/edit/super/matrix.phtml
similarity index 99%
rename from app/code/Magento/Catalog/view/adminhtml/catalog/product/edit/super/matrix.phtml
rename to app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/edit/super/matrix.phtml
index af9b5022075..7edc4d88309 100644
--- a/app/code/Magento/Catalog/view/adminhtml/catalog/product/edit/super/matrix.phtml
+++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/catalog/product/edit/super/matrix.phtml
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
-/** @var $this \Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config\Matrix */
+/** @var $this \Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config\Matrix */
 ?>
 <?php
 $variations = $this->getVariations();
diff --git a/pub/lib/varien/configurable.js b/app/code/Magento/ConfigurableProduct/view/adminhtml/js/configurable.js
similarity index 99%
rename from pub/lib/varien/configurable.js
rename to app/code/Magento/ConfigurableProduct/view/adminhtml/js/configurable.js
index b36883ca68c..2c076cbf9b6 100644
--- a/pub/lib/varien/configurable.js
+++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/js/configurable.js
@@ -17,8 +17,6 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Varien
- * @package     js
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
diff --git a/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_attribute_edit.xml b/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_attribute_edit.xml
new file mode 100644
index 00000000000..0183956ef82
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_attribute_edit.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <referenceContainer name="js">
+        <block class="Magento\Backend\Block\Template" name="attribute_edit_js_configurable" template="Magento_ConfigurableProduct::catalog/product/attribute/js.phtml" after="attribute_edit_js"/>
+    </referenceContainer>
+</layout>
diff --git a/app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_attribute_edit_product_tab_variations_popup.xml b/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_attribute_edit_product_tab_variations_popup.xml
similarity index 93%
rename from app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_attribute_edit_product_tab_variations_popup.xml
rename to app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_attribute_edit_product_tab_variations_popup.xml
index 7167a47b18c..fe6399e2452 100644
--- a/app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_attribute_edit_product_tab_variations_popup.xml
+++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_attribute_edit_product_tab_variations_popup.xml
@@ -30,7 +30,7 @@
             <argument name="template" xsi:type="string">Magento_Catalog::catalog/product/attribute/form.phtml</argument>
         </arguments>
         <container name="form" label="Form">
-            <block class="Magento\Catalog\Block\Adminhtml\Product\Attribute\Edit\Tab\Variations\Main" as="main"/>
+            <block class="Magento\ConfigurableProduct\Block\Adminhtml\Product\Attribute\Edit\Tab\Variations\Main" as="main"/>
             <block class="Magento\Eav\Block\Adminhtml\Attribute\Edit\Options\Options" as="advanced-options"/>
             <block class="Magento\Catalog\Block\Adminhtml\Product\Attribute\Edit\Tab\Advanced" as="options"/>
             <block class="Magento\Eav\Block\Adminhtml\Attribute\Edit\Options\Labels" as="labels"/>
diff --git a/app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_configurable.xml b/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_configurable.xml
similarity index 57%
rename from app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_configurable.xml
rename to app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_configurable.xml
index 90d1e25d483..77eb7386260 100644
--- a/app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_configurable.xml
+++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_configurable.xml
@@ -26,11 +26,11 @@
 <layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <update handle="catalog_product_superconfig_config"/>
     <referenceBlock name="product_tabs">
-        <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config" name="admin.product.edit.tab.super.config.grid.container">
-            <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config" template="Magento_Catalog::catalog/product/edit/super/generator.phtml" name="product-variations-generator" as="generator">
-                <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config" template="Magento_Catalog::catalog/product/edit/super/attribute-js-template.phtml" as="template"/>
-                <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config\Attribute" template="Magento_Catalog::catalog/product/edit/super/attribute-template.phtml" as="attribute-renderer"/>
-                <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config\Matrix" template="Magento_Catalog::catalog/product/edit/super/matrix.phtml" as="matrix"/>
+        <block class="Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config" name="admin.product.edit.tab.super.config.grid.container">
+            <block class="Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config" template="Magento_ConfigurableProduct::catalog/product/edit/super/generator.phtml" name="product-variations-generator" as="generator">
+                <block class="Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config" template="Magento_ConfigurableProduct::catalog/product/edit/super/attribute-js-template.phtml" as="template"/>
+                <block class="Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config\Attribute" template="Magento_ConfigurableProduct::catalog/product/edit/super/attribute-template.phtml" as="attribute-renderer"/>
+                <block class="Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config\Matrix" template="Magento_ConfigurableProduct::catalog/product/edit/super/matrix.phtml" as="matrix"/>
             </block>
         </block>
         <action method="addTab">
diff --git a/app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_configurable_new.xml b/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_downloadable.xml
similarity index 57%
rename from app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_configurable_new.xml
rename to app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_downloadable.xml
index 90d1e25d483..77eb7386260 100644
--- a/app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_configurable_new.xml
+++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_downloadable.xml
@@ -26,11 +26,11 @@
 <layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <update handle="catalog_product_superconfig_config"/>
     <referenceBlock name="product_tabs">
-        <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config" name="admin.product.edit.tab.super.config.grid.container">
-            <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config" template="Magento_Catalog::catalog/product/edit/super/generator.phtml" name="product-variations-generator" as="generator">
-                <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config" template="Magento_Catalog::catalog/product/edit/super/attribute-js-template.phtml" as="template"/>
-                <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config\Attribute" template="Magento_Catalog::catalog/product/edit/super/attribute-template.phtml" as="attribute-renderer"/>
-                <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config\Matrix" template="Magento_Catalog::catalog/product/edit/super/matrix.phtml" as="matrix"/>
+        <block class="Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config" name="admin.product.edit.tab.super.config.grid.container">
+            <block class="Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config" template="Magento_ConfigurableProduct::catalog/product/edit/super/generator.phtml" name="product-variations-generator" as="generator">
+                <block class="Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config" template="Magento_ConfigurableProduct::catalog/product/edit/super/attribute-js-template.phtml" as="template"/>
+                <block class="Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config\Attribute" template="Magento_ConfigurableProduct::catalog/product/edit/super/attribute-template.phtml" as="attribute-renderer"/>
+                <block class="Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config\Matrix" template="Magento_ConfigurableProduct::catalog/product/edit/super/matrix.phtml" as="matrix"/>
             </block>
         </block>
         <action method="addTab">
diff --git a/app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_generatevariations.xml b/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_generatevariations_index.xml
similarity index 55%
rename from app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_generatevariations.xml
rename to app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_generatevariations_index.xml
index 39301cff333..b4f2e422b94 100644
--- a/app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_generatevariations.xml
+++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_generatevariations_index.xml
@@ -25,10 +25,10 @@
 -->
 <layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <container name="root" label="Root" output="1">
-        <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config" template="Magento_Catalog::catalog/product/edit/super/generator.phtml" name="product-variations-generator" as="generator">
-            <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config" template="Magento_Catalog::catalog/product/edit/super/attribute-js-template.phtml" as="template"/>
-            <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config\Attribute" template="Magento_Catalog::catalog/product/edit/super/attribute-template.phtml" as="attribute-renderer"/>
-            <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config\Matrix" template="Magento_Catalog::catalog/product/edit/super/matrix.phtml" as="matrix"/>
+        <block class="Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config" template="Magento_ConfigurableProduct::catalog/product/edit/super/generator.phtml" name="product-variations-generator" as="generator">
+            <block class="Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config" template="Magento_ConfigurableProduct::catalog/product/edit/super/attribute-js-template.phtml" as="template"/>
+            <block class="Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config\Attribute" template="Magento_ConfigurableProduct::catalog/product/edit/super/attribute-template.phtml" as="attribute-renderer"/>
+            <block class="Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config\Matrix" template="Magento_ConfigurableProduct::catalog/product/edit/super/matrix.phtml" as="matrix"/>
         </block>
     </container>
 </layout>
diff --git a/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_new.xml b/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_new.xml
new file mode 100644
index 00000000000..c9d4adc0156
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_new.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <referenceContainer name="js">
+        <block class="Magento\ConfigurableProduct\Block\Product\Configurable\AttributeSelector" template="product/configurable/attribute-selector/js.phtml"/>
+        <block class="Magento\ConfigurableProduct\Block\Product\Configurable\AttributeSelector" template="product/configurable/affected-attribute-set-selector/js.phtml"/>
+        <block class="Magento\View\Element\Template" template="Magento_ConfigurableProduct::product/configurable/stock/disabler.phtml"/>
+    </referenceContainer>
+    <referenceBlock name="head">
+        <block class="Magento\Theme\Block\Html\Head\Script" name="magento-adminhtml-catalog-product-variation-js">
+            <arguments>
+                <argument name="file" xsi:type="string">Magento_ConfigurableProduct::catalog/product-variation.js</argument>
+            </arguments>
+        </block>
+        <block class="Magento\Theme\Block\Html\Head\Css" name="magento-configurableproduct-product-product-css">
+            <arguments>
+                <argument name="file" xsi:type="string">Magento_ConfigurableProduct::product/product.css</argument>
+            </arguments>
+        </block>
+    </referenceBlock>
+    <referenceContainer name="content">
+        <block class="Magento\View\Element\Template" name="affected-attribute-set-form" template="Magento_ConfigurableProduct::product/configurable/affected-attribute-set-selector/form.phtml"/>
+    </referenceContainer>
+</layout>
diff --git a/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_set_edit.xml b/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_set_edit.xml
new file mode 100644
index 00000000000..63132fb60ee
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_set_edit.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <referenceContainer name="content">
+        <block class="Magento\Backend\Block\Template"
+               name="adminhtml.catalog.product.set.edit.configurable"
+               template="Magento_ConfigurableProduct::catalog/product/attribute/set/js.phtml"
+               after="adminhtml.catalog.product.set.edit"/>
+    </referenceContainer>
+</layout>
diff --git a/app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_simple.xml b/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_simple.xml
similarity index 57%
rename from app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_simple.xml
rename to app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_simple.xml
index 90d1e25d483..77eb7386260 100644
--- a/app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_simple.xml
+++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_simple.xml
@@ -26,11 +26,11 @@
 <layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <update handle="catalog_product_superconfig_config"/>
     <referenceBlock name="product_tabs">
-        <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config" name="admin.product.edit.tab.super.config.grid.container">
-            <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config" template="Magento_Catalog::catalog/product/edit/super/generator.phtml" name="product-variations-generator" as="generator">
-                <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config" template="Magento_Catalog::catalog/product/edit/super/attribute-js-template.phtml" as="template"/>
-                <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config\Attribute" template="Magento_Catalog::catalog/product/edit/super/attribute-template.phtml" as="attribute-renderer"/>
-                <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config\Matrix" template="Magento_Catalog::catalog/product/edit/super/matrix.phtml" as="matrix"/>
+        <block class="Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config" name="admin.product.edit.tab.super.config.grid.container">
+            <block class="Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config" template="Magento_ConfigurableProduct::catalog/product/edit/super/generator.phtml" name="product-variations-generator" as="generator">
+                <block class="Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config" template="Magento_ConfigurableProduct::catalog/product/edit/super/attribute-js-template.phtml" as="template"/>
+                <block class="Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config\Attribute" template="Magento_ConfigurableProduct::catalog/product/edit/super/attribute-template.phtml" as="attribute-renderer"/>
+                <block class="Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config\Matrix" template="Magento_ConfigurableProduct::catalog/product/edit/super/matrix.phtml" as="matrix"/>
             </block>
         </block>
         <action method="addTab">
diff --git a/app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_superconfig_config.xml b/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_superconfig_config.xml
similarity index 73%
rename from app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_superconfig_config.xml
rename to app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_superconfig_config.xml
index d766f63f42b..c35943b652a 100644
--- a/app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_superconfig_config.xml
+++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_superconfig_config.xml
@@ -28,16 +28,16 @@
         <block class="Magento\Backend\Block\Widget\Grid" name="admin.product.edit.tab.super.config.grid" as="grid">
             <arguments>
                 <argument name="id" xsi:type="string">configurable_associated_products_grid</argument>
-                <argument name="dataSource" xsi:type="object">Magento\Catalog\Model\Resource\Product\Collection\AssociatedProduct</argument>
+                <argument name="dataSource" xsi:type="object">Magento\ConfigurableProduct\Model\Resource\Product\Collection\AssociatedProduct</argument>
                 <argument name="use_ajax" xsi:type="string">true</argument>
                 <argument name="default_sort" xsi:type="string">entity_id</argument>
                 <argument name="default_dir" xsi:type="string">DESC</argument>
                 <argument name="save_parameters_in_session" xsi:type="string">0</argument>
-                <argument name="grid_url" xsi:type="url" path="*/*/superConfig">
+                <argument name="grid_url" xsi:type="url" path="*/product_superConfig/index">
                     <param name="_current">1</param>
                 </argument>
             </arguments>
-            <block class="Magento\Catalog\Block\Product\Configurable\AssociatedSelector\Backend\Grid\ColumnSet" as="grid.columnSet" name="admin.product.edit.tab.super.config.grid.columnSet">
+            <block class="Magento\ConfigurableProduct\Block\Product\Configurable\AssociatedSelector\Backend\Grid\ColumnSet" as="grid.columnSet" name="admin.product.edit.tab.super.config.grid.columnSet">
                 <arguments>
                     <argument name="id" xsi:type="string">super_product_links</argument>
                 </arguments>
@@ -50,7 +50,7 @@
                         <argument name="id" xsi:type="string">entity_id</argument>
                         <argument name="filter" xsi:type="string">0</argument>
                         <argument name="sortable" xsi:type="string">1</argument>
-                        <argument name="renderer" xsi:type="string">Magento\Catalog\Block\Product\Configurable\AssociatedSelector\Renderer\Id</argument>
+                        <argument name="renderer" xsi:type="string">Magento\ConfigurableProduct\Block\Product\Configurable\AssociatedSelector\Renderer\Id</argument>
                     </arguments>
                 </block>
                 <block class="Magento\Backend\Block\Widget\Grid\Column" as="name">
@@ -95,6 +95,27 @@
                         <argument name="sortable" xsi:type="string">1</argument>
                     </arguments>
                 </block>
+                <block class="Magento\Backend\Block\Widget\Grid\Column" as="inventory_in_stock" after="admin.product.edit.tab.super.config.grid.sku">
+                    <arguments>
+                        <argument name="header" xsi:type="string" translate="true">Stock Availability</argument>
+                        <argument name="type" xsi:type="string">text</argument>
+                        <argument name="index" xsi:type="string">inventory_in_stock</argument>
+                        <argument name="id" xsi:type="string">inventory_in_stock</argument>
+                        <argument name="filter" xsi:type="string">0</argument>
+                        <argument name="sortable" xsi:type="string">1</argument>
+                        <argument name="renderer" xsi:type="string">Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config\Grid\Renderer\Inventory</argument>
+                    </arguments>
+                </block>
+                <block class="Magento\Backend\Block\Widget\Grid\Column" as="qty" after="admin.product.edit.tab.super.config.grid.sku">
+                    <arguments>
+                        <argument name="header" xsi:type="string" translate="true">Qty</argument>
+                        <argument name="type" xsi:type="string">text</argument>
+                        <argument name="index" xsi:type="string">qty</argument>
+                        <argument name="id" xsi:type="string">qty</argument>
+                        <argument name="filter" xsi:type="string">0</argument>
+                        <argument name="sortable" xsi:type="string">1</argument>
+                    </arguments>
+                </block>
             </block>
         </block>
     </referenceBlock>
diff --git a/app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_superconfig.xml b/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_superconfig_index.xml
similarity index 100%
rename from app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_superconfig.xml
rename to app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_superconfig_index.xml
diff --git a/app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_view_type_configurable.xml b/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_view_type_configurable.xml
similarity index 80%
rename from app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_view_type_configurable.xml
rename to app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_view_type_configurable.xml
index 49bb3926aad..dd453628225 100644
--- a/app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_view_type_configurable.xml
+++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_view_type_configurable.xml
@@ -25,6 +25,6 @@
 -->
 <layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <referenceBlock name="product.composite.fieldset">
-        <block class="Magento\Catalog\Block\Adminhtml\Product\Composite\Fieldset\Configurable" name="product.composite.fieldset.configurable" before="product.composite.fieldset.options" template="catalog/product/composite/fieldset/configurable.phtml"/>
+        <block class="Magento\ConfigurableProduct\Block\Adminhtml\Product\Composite\Fieldset\Configurable" name="product.composite.fieldset.configurable" before="product.composite.fieldset.options" template="catalog/product/composite/fieldset/configurable.phtml"/>
     </referenceBlock>
 </layout>
diff --git a/app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_virtual.xml b/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_virtual.xml
similarity index 57%
rename from app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_virtual.xml
rename to app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_virtual.xml
index 90d1e25d483..77eb7386260 100644
--- a/app/code/Magento/Catalog/view/adminhtml/layout/catalog_product_virtual.xml
+++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/catalog_product_virtual.xml
@@ -26,11 +26,11 @@
 <layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <update handle="catalog_product_superconfig_config"/>
     <referenceBlock name="product_tabs">
-        <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config" name="admin.product.edit.tab.super.config.grid.container">
-            <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config" template="Magento_Catalog::catalog/product/edit/super/generator.phtml" name="product-variations-generator" as="generator">
-                <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config" template="Magento_Catalog::catalog/product/edit/super/attribute-js-template.phtml" as="template"/>
-                <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config\Attribute" template="Magento_Catalog::catalog/product/edit/super/attribute-template.phtml" as="attribute-renderer"/>
-                <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config\Matrix" template="Magento_Catalog::catalog/product/edit/super/matrix.phtml" as="matrix"/>
+        <block class="Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config" name="admin.product.edit.tab.super.config.grid.container">
+            <block class="Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config" template="Magento_ConfigurableProduct::catalog/product/edit/super/generator.phtml" name="product-variations-generator" as="generator">
+                <block class="Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config" template="Magento_ConfigurableProduct::catalog/product/edit/super/attribute-js-template.phtml" as="template"/>
+                <block class="Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config\Attribute" template="Magento_ConfigurableProduct::catalog/product/edit/super/attribute-template.phtml" as="attribute-renderer"/>
+                <block class="Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config\Matrix" template="Magento_ConfigurableProduct::catalog/product/edit/super/matrix.phtml" as="matrix"/>
             </block>
         </block>
         <action method="addTab">
diff --git a/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/default.xml b/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/default.xml
new file mode 100644
index 00000000000..cbb93350c3b
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/layout/default.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <referenceBlock name="head">
+        <block class="Magento\Theme\Block\Html\Head\Script" name="configurable-config-js">
+            <arguments>
+                <argument name="file" xsi:type="string">Magento_ConfigurableProduct::js/configurable.js</argument>
+            </arguments>
+        </block>
+        <block class="Magento\Theme\Block\Html\Head\Script" name="configurable-js">
+            <arguments>
+                <argument name="file" xsi:type="string">Magento_ConfigurableProduct::catalog/product/attribute.js</argument>
+            </arguments>
+        </block>
+    </referenceBlock>
+</layout>
diff --git a/app/code/Magento/Catalog/view/adminhtml/product/configurable/affected-attribute-set-selector/form.phtml b/app/code/Magento/ConfigurableProduct/view/adminhtml/product/configurable/affected-attribute-set-selector/form.phtml
similarity index 97%
rename from app/code/Magento/Catalog/view/adminhtml/product/configurable/affected-attribute-set-selector/form.phtml
rename to app/code/Magento/ConfigurableProduct/view/adminhtml/product/configurable/affected-attribute-set-selector/form.phtml
index 6fd1247e061..80a8d5ce50f 100644
--- a/app/code/Magento/Catalog/view/adminhtml/product/configurable/affected-attribute-set-selector/form.phtml
+++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/product/configurable/affected-attribute-set-selector/form.phtml
@@ -18,8 +18,6 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    design
- * @package     default_default
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
diff --git a/app/code/Magento/Catalog/view/adminhtml/product/configurable/affected-attribute-set-selector/js.phtml b/app/code/Magento/ConfigurableProduct/view/adminhtml/product/configurable/affected-attribute-set-selector/js.phtml
similarity index 97%
rename from app/code/Magento/Catalog/view/adminhtml/product/configurable/affected-attribute-set-selector/js.phtml
rename to app/code/Magento/ConfigurableProduct/view/adminhtml/product/configurable/affected-attribute-set-selector/js.phtml
index e9bf868148c..90a189437c7 100644
--- a/app/code/Magento/Catalog/view/adminhtml/product/configurable/affected-attribute-set-selector/js.phtml
+++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/product/configurable/affected-attribute-set-selector/js.phtml
@@ -18,12 +18,10 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    design
- * @package     default_default
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
-/* @var $this \Magento\Catalog\Block\Product\Configurable\AttributeSelector */
+/* @var $this \Magento\ConfigurableProduct\Block\Product\Configurable\AttributeSelector */
 ?>
 <script type="text/javascript">
 jQuery(function($) {
diff --git a/app/code/Magento/Catalog/view/adminhtml/product/configurable/attribute-selector/js.phtml b/app/code/Magento/ConfigurableProduct/view/adminhtml/product/configurable/attribute-selector/js.phtml
similarity index 92%
rename from app/code/Magento/Catalog/view/adminhtml/product/configurable/attribute-selector/js.phtml
rename to app/code/Magento/ConfigurableProduct/view/adminhtml/product/configurable/attribute-selector/js.phtml
index c8be0e4f1f2..bbdc2ac7a59 100644
--- a/app/code/Magento/Catalog/view/adminhtml/product/configurable/attribute-selector/js.phtml
+++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/product/configurable/attribute-selector/js.phtml
@@ -18,13 +18,11 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    design
- * @package     default_default
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 
-/** @var $this \Magento\Catalog\Block\Product\Configurable\AttributeSelector */
+/** @var $this \Magento\ConfigurableProduct\Block\Product\Configurable\AttributeSelector */
 ?>
 <script type="text/javascript">
 jQuery(function($) {
diff --git a/app/code/Magento/ConfigurableProduct/view/adminhtml/product/configurable/stock/disabler.phtml b/app/code/Magento/ConfigurableProduct/view/adminhtml/product/configurable/stock/disabler.phtml
new file mode 100644
index 00000000000..3aa73044427
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/product/configurable/stock/disabler.phtml
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+?>
+<script type="text/javascript">
+jQuery(function($) {
+    $('#product_info_tabs_product-details_content').on('stockbeforedisable', function(e) {
+        if (e.productType === 'configurable' && $('[data-panel=product-variations]').is('.opened')) {
+            e.stopImmediatePropagation();
+            return false;
+        }
+    });
+ });
+</script>
diff --git a/app/code/Magento/ConfigurableProduct/view/adminhtml/product/product.css b/app/code/Magento/ConfigurableProduct/view/adminhtml/product/product.css
new file mode 100644
index 00000000000..4cd33c03aaf
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/product/product.css
@@ -0,0 +1,317 @@
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+
+/* Variations Search Field */
+#variations-search-field {
+    margin-bottom: 16px;
+}
+
+#variations-search-field > .control {
+    position: relative;
+    width: 42%;
+}
+
+#variations-search-field > .control > input {
+    padding-right: 25px;
+}
+
+#configurable-attributes-container .field-variation > .label {
+    margin-left: -7px;
+}
+
+#configurable-attributes-container .field-variation > .control {
+    width: 43%;
+}
+
+#configurable-attributes-container {
+    margin-bottom: 23px;
+}
+
+#configurable-attributes-container .col-name {
+    width: 65%;
+}
+
+#configurable-attributes-container .col-include {
+    width: 80px;
+}
+
+#configurable-attributes-container .col-actions {
+    width: 80px;
+}
+
+#configurable-attributes-container .col-change-price {
+    width: 150px;
+}
+
+#configurable-attributes-container .field-change-pricing .field {
+    float: left;
+}
+
+#configurable-attributes-container .field-change-pricing .field-pricing-value {
+    width: 75px;
+}
+
+#configurable-attributes-container .field-change-pricing .action-toggle {
+    min-width: 40px;
+}
+
+@media screen and (max-width: 960px) {
+    [class^="fields-group-"] .field {
+        width: auto !important;
+    }
+}
+
+#configurable-attributes-container .field-pricing-value .control {
+    width: 75px;
+}
+
+#configurable-attributes-container .field-pricing-value .pricing-value {
+    width: 100%;
+    padding: 4px;
+    border-right: none;
+    border-radius: 4px 0 0 4px;
+}
+
+#configurable-attributes-container .field-pricing-measure select {
+    border-radius: 0 4px 4px 0;
+}
+
+/* "Generate Variations" button */
+.generate {
+    margin-bottom: 18px;
+}
+
+#product-variations-matrix > .title {
+    margin-bottom: 10px;
+}
+
+/* Variations Image Uploader */
+.eq-ie8 .actions-image-uploader .action-upload {
+    filter: none;
+}
+
+.actions-image-uploader .action-toggle,
+.actions-image-uploader .action-toggle:hover,
+.actions-image-uploader .action-toggle:active,
+.actions-image-uploader .action-toggle:focus,
+.actions-image-uploader .action-toggle[disabled] {
+    position: relative;
+    height: 33px;
+    padding-left: 2px;
+    padding-right: 2px;
+    background: #fff;
+    filter: none;
+    color: #888;
+}
+
+.actions-image-uploader.active .action-toggle {
+    border-radius: 0 5px 0 0;
+}
+
+.actions-image-uploader.active .action-toggle:after {
+    position: absolute;
+    left: 0;
+    right: 0;
+    bottom: -1px;
+    height: 1px;
+    background: #fff;
+    z-index: 991;
+    content: '';
+}
+
+.actions-image-uploader .dropdown-menu {
+    margin-top: -1px;
+    border-radius: 3px 0 3px 3px;
+}
+
+#product-variations-matrix img.variation {
+    position: relative;
+    border: 0;
+    width: 32px;
+    height: 32px;
+    z-index: 2;
+}
+
+#product-variations-matrix .action-upload {
+    position: relative;
+    border: 1px solid #b7b2a7;
+    background: #fff;
+    border-radius: 0;
+    padding: 0;
+    width: 31px;
+    height: 31px;
+    line-height: 31px;
+    text-align: center;
+    color: #9f9a91;
+    overflow: hidden;
+    cursor: default;
+    filter: none;
+}
+
+#product-variations-matrix .action-upload input[type="file"] {
+    position: absolute;
+    left: 0;
+    top: 0;
+    width: 31px;
+    height: 31px;
+    background: none;
+    border: 500px solid transparent;
+    font-size: 10em;
+    z-index: 3;
+    cursor: pointer;
+}
+
+#product-variations-matrix .action-upload:hover {
+    color: #7e7e7e;
+}
+
+#product-variations-matrix .action-upload:before {
+    font-family: 'MUI-Icons';
+    font-style: normal;
+    speak: none;
+    font-weight: normal;
+    -webkit-font-smoothing: antialiased;
+    content: '\e02d'; /* plus icon */
+    font-size: 22px;
+    position: absolute;
+    left: 0;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    z-index: 1;
+    text-align: center;
+}
+
+#product-variations-matrix .action-upload.loading:before {
+    content: '';
+}
+
+#product-variations-matrix .action-upload.loading:after {
+    left: 0;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    margin: 0;
+    width: 31px;
+    height: 31px;
+    z-index: 4;
+}
+
+#product-variations-matrix .action-upload span,
+#product-variations-matrix .action-choose span {
+    display: none;
+}
+
+#product-variations-matrix .action-choose,
+#product-variations-matrix .action-choose:hover,
+#product-variations-matrix .action-choose[disabled] {
+    color: #b8b3a7;
+    float: right;
+    margin: 6px 0 0 5px;
+}
+
+#product-variations-matrix .action-choose:hover {
+    color: #7e7e7e;
+}
+
+#product-variations-matrix .action-choose:before {
+    font-family: 'MUI-Icons';
+    font-style: normal;
+    speak: none;
+    font-weight: normal;
+    -webkit-font-smoothing: antialiased;
+    content: '\e03f'; /* user icon */
+}
+
+#product-variations-matrix .col-name > a + .action-choose:before {
+    content: '\e040'; /* user icon */
+    color: #a09a8c;
+}
+
+#product-variations-matrix .col-name > input {
+    width: 88%;
+}
+
+#product-variations-matrix .col-actions {
+    width: 60px;
+}
+
+#product-variations-matrix .col-name {
+    width: 30%;
+}
+
+#product-variations-matrix .col-sku {
+    width: 20%;
+}
+
+#product-variations-matrix .col-display,
+#product-variations-matrix .col-qty,
+#product-variations-matrix .col-weight {
+    width: 5%;
+}
+
+/* Select Associated Product popup window */
+#configurable_associated_products_grid .filter-actions,
+#configurable_associated_products_grid .filter {
+    display: none;
+}
+
+#product_options_container .data-table td,
+#attribute-tier_price-container .data-table td,
+#attribute-group_price-container .data-table td {
+    vertical-align: top;
+}
+
+#product_options_container .product-option-scope-checkbox {
+    margin: 10px 5px 10px 0;
+}
+
+#product_options_container .select + .product-option-scope-checkbox {
+    margin: 0 5px;
+}
+
+#allow_open_amount {
+    margin-top: 8px;
+}
+
+.mage-new-category-dialog .ui-dialog-content .fieldset {
+    padding: 0;
+    margin: 0;
+}
+
+.mage-new-category-dialog .ui-dialog-content .label {
+    width: 25%;
+}
+
+.mage-new-category-dialog .ui-dialog-content .control {
+    width: 75%;
+}
+
+.mage-new-category-dialog .ui-dialog-buttonset {
+    text-align: left;
+}
+
+.mage-new-category-dialog .ui-dialog-buttonset .action-create {
+    margin: 0 0 0 25%;
+    vertical-align: middle;
+}
diff --git a/app/code/Magento/Catalog/view/frontend/js/configurable.js b/app/code/Magento/ConfigurableProduct/view/frontend/js/configurable.js
similarity index 99%
rename from app/code/Magento/Catalog/view/frontend/js/configurable.js
rename to app/code/Magento/ConfigurableProduct/view/frontend/js/configurable.js
index 3b7f566f9c9..659e2976ba6 100644
--- a/app/code/Magento/Catalog/view/frontend/js/configurable.js
+++ b/app/code/Magento/ConfigurableProduct/view/frontend/js/configurable.js
@@ -17,8 +17,6 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    frontend configurable product price option
- * @package     mage
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
diff --git a/app/code/Magento/Catalog/view/frontend/layout/catalog_product_view_type_configurable.xml b/app/code/Magento/ConfigurableProduct/view/frontend/layout/catalog_product_view_type_configurable.xml
similarity index 70%
rename from app/code/Magento/Catalog/view/frontend/layout/catalog_product_view_type_configurable.xml
rename to app/code/Magento/ConfigurableProduct/view/frontend/layout/catalog_product_view_type_configurable.xml
index 4e39cd69263..dad76b26279 100644
--- a/app/code/Magento/Catalog/view/frontend/layout/catalog_product_view_type_configurable.xml
+++ b/app/code/Magento/ConfigurableProduct/view/frontend/layout/catalog_product_view_type_configurable.xml
@@ -30,10 +30,12 @@
         </action>
     </referenceBlock>
     <referenceContainer name="product.info.type">
-        <block class="Magento\Catalog\Block\Product\View\Type\Configurable" name="product.info.configurable" as="product_type_data" template="product/view/type/default.phtml"/>
-        <container name="product.info.configurable.extra" after="product.info.configurable" as="product_type_data_extra" label="Product Extra Info"/>
+        <block class="Magento\ConfigurableProduct\Block\Product\View\Type\Configurable" name="product.info.configurable" as="product_type_data" template="Magento_Catalog::product/view/type/default.phtml"/>
+        <container name="product.info.configurable.extra" after="product.info.configurable" as="product_type_data_extra" label="Product Extra Info">
+            <block class="Magento\ConfigurableProduct\Block\Stockqty\Type\Configurable" template="Magento_CatalogInventory::stockqty/composite.phtml"/>
+        </container>
     </referenceContainer>
     <referenceBlock name="product.info.options.wrapper">
-        <block class="Magento\Catalog\Block\Product\View\Type\Configurable" name="product.info.options.configurable" as="options_configurable" before="-" template="product/view/type/options/configurable.phtml"/>
+        <block class="Magento\ConfigurableProduct\Block\Product\View\Type\Configurable" name="product.info.options.configurable" as="options_configurable" before="-" template="product/view/type/options/configurable.phtml"/>
     </referenceBlock>
 </layout>
diff --git a/app/code/Magento/Checkout/view/frontend/layout/checkout_cart_configure_type_configurable.xml b/app/code/Magento/ConfigurableProduct/view/frontend/layout/checkout_cart_configure_type_configurable.xml
similarity index 100%
rename from app/code/Magento/Checkout/view/frontend/layout/checkout_cart_configure_type_configurable.xml
rename to app/code/Magento/ConfigurableProduct/view/frontend/layout/checkout_cart_configure_type_configurable.xml
diff --git a/app/code/Magento/ConfigurableProduct/view/frontend/layout/checkout_cart_item_renderers.xml b/app/code/Magento/ConfigurableProduct/view/frontend/layout/checkout_cart_item_renderers.xml
new file mode 100644
index 00000000000..d4d2fe36593
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/view/frontend/layout/checkout_cart_item_renderers.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <referenceBlock name="checkout.cart.item.renderers">
+        <block class="Magento\ConfigurableProduct\Block\Cart\Item\Renderer\Configurable" as="configurable" template="Magento_Checkout::cart/item/default.phtml" cacheable="false"/>
+    </referenceBlock>
+</layout>
+
diff --git a/app/code/Magento/ConfigurableProduct/view/frontend/layout/checkout_cart_sidebar_item_renderers.xml b/app/code/Magento/ConfigurableProduct/view/frontend/layout/checkout_cart_sidebar_item_renderers.xml
new file mode 100644
index 00000000000..6a24c4f2e33
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/view/frontend/layout/checkout_cart_sidebar_item_renderers.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <referenceBlock name="checkout.cart.sidebar.item.renderers">
+        <block class="Magento\ConfigurableProduct\Block\Cart\Item\Renderer\Configurable" as="configurable" template="Magento_Checkout::cart/sidebar/default.phtml" cacheable="false"/>
+    </referenceBlock>
+</layout>
diff --git a/app/code/Magento/ConfigurableProduct/view/frontend/layout/checkout_onepage_review_item_renderers.xml b/app/code/Magento/ConfigurableProduct/view/frontend/layout/checkout_onepage_review_item_renderers.xml
new file mode 100644
index 00000000000..728fb7d9a9a
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/view/frontend/layout/checkout_onepage_review_item_renderers.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <referenceBlock name="checkout.onepage.review.item.renderers">
+        <block class="Magento\ConfigurableProduct\Block\Cart\Item\Renderer\Configurable" as="configurable" template="Magento_Checkout::onepage/review/item.phtml" cacheable="false"/>
+    </referenceBlock>
+</layout>
diff --git a/app/code/Magento/Catalog/view/frontend/product/view/type/options/configurable.phtml b/app/code/Magento/ConfigurableProduct/view/frontend/product/view/type/options/configurable.phtml
similarity index 91%
rename from app/code/Magento/Catalog/view/frontend/product/view/type/options/configurable.phtml
rename to app/code/Magento/ConfigurableProduct/view/frontend/product/view/type/options/configurable.phtml
index 1f2901cde90..ac6a10e3b3d 100644
--- a/app/code/Magento/Catalog/view/frontend/product/view/type/options/configurable.phtml
+++ b/app/code/Magento/ConfigurableProduct/view/frontend/product/view/type/options/configurable.phtml
@@ -24,7 +24,7 @@
 ?>
 
 <?php
-/** @var $this Magento\Catalog\Block\Product\View\Type\Configurable*/
+/** @var $this \Magento\ConfigurableProduct\Block\Product\View\Type\Configurable*/
 $_product    = $this->getProduct();
 $_attributes = $this->decorateArray($this->getAllowAttributes());
 ?>
@@ -49,7 +49,7 @@ $_attributes = $this->decorateArray($this->getAllowAttributes());
     <script type="text/javascript">
         (function ($) {
             head.js("<?php echo $this->getViewFileUrl('jquery/jquery.parsequery.js') ?>",
-                "<?php echo $this->getViewFileUrl('Magento_Catalog::js/configurable.js') ?>", function () {
+                "<?php echo $this->getViewFileUrl('Magento_ConfigurableProduct::js/configurable.js') ?>", function () {
                     $('#product_addtocart_form').configurable({"spConfig":<?php echo $this->getJsonConfig() ?>});
                 })
         })(jQuery);
diff --git a/app/code/Magento/Connect/etc/di.xml b/app/code/Magento/Connect/etc/di.xml
index 7cae66287ef..601214d243e 100644
--- a/app/code/Magento/Connect/etc/di.xml
+++ b/app/code/Magento/Connect/etc/di.xml
@@ -23,15 +23,15 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <virtualType name="Magento\Connect\Model\Session\Storage" type="Magento\Session\Storage">
-        <param name="namespace">
-            <value>adminhtml</value>
-        </param>
+        <arguments>
+            <argument name="namespace" xsi:type="string">adminhtml</argument>
+        </arguments>
     </virtualType>
     <type name="Magento\Connect\Model\Session">
-        <param name="storage">
-            <instance type="Magento\Connect\Model\Session\Storage" />
-        </param>
+        <arguments>
+            <argument name="storage" xsi:type="object">Magento\Connect\Model\Session\Storage</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Contacts/Controller/Index.php b/app/code/Magento/Contacts/Controller/Index.php
index c478a9bc6e9..591d5e791e8 100644
--- a/app/code/Magento/Contacts/Controller/Index.php
+++ b/app/code/Magento/Contacts/Controller/Index.php
@@ -60,6 +60,8 @@ class Index extends \Magento\App\Action\Action
 
     /**
      * Show Contact Us page
+     *
+     * @return void
      */
     public function indexAction()
     {
@@ -74,6 +76,7 @@ class Index extends \Magento\App\Action\Action
     /**
      * Post user question
      *
+     * @return void
      * @throws \Exception
      */
     public function postAction()
diff --git a/app/code/Magento/Contacts/Helper/Data.php b/app/code/Magento/Contacts/Helper/Data.php
index 1f0f077656c..c68c052e379 100644
--- a/app/code/Magento/Contacts/Helper/Data.php
+++ b/app/code/Magento/Contacts/Helper/Data.php
@@ -67,11 +67,21 @@ class Data extends \Magento\App\Helper\AbstractHelper
         parent::__construct($context);
     }
 
+    /**
+     * Check if enabled
+     *
+     * @return string|null
+     */
     public function isEnabled()
     {
         return $this->_coreStoreConfig->getConfig( self::XML_PATH_ENABLED );
     }
 
+    /**
+     * Get user name
+     *
+     * @return string
+     */
     public function getUserName()
     {
         if (!$this->_customerSession->isLoggedIn()) {
@@ -81,6 +91,11 @@ class Data extends \Magento\App\Helper\AbstractHelper
         return trim($customer->getName());
     }
 
+    /**
+     * Get user email
+     *
+     * @return string
+     */
     public function getUserEmail()
     {
         if (!$this->_customerSession->isLoggedIn()) {
diff --git a/app/code/Magento/Contacts/Model/System/Config/Backend/Links.php b/app/code/Magento/Contacts/Model/System/Config/Backend/Links.php
index 93006b4f009..f2076dc9c33 100644
--- a/app/code/Magento/Contacts/Model/System/Config/Backend/Links.php
+++ b/app/code/Magento/Contacts/Model/System/Config/Backend/Links.php
@@ -35,7 +35,7 @@ class Links extends \Magento\Backend\Model\Config\Backend\Cache
     /**
      * Cache tags to clean
      *
-     * @var array
+     * @var string[]
      */
     protected $_cacheTags = array(\Magento\Core\Model\Store::CACHE_TAG, \Magento\Cms\Model\Block::CACHE_TAG);
 
diff --git a/app/code/Magento/Contacts/etc/frontend/di.xml b/app/code/Magento/Contacts/etc/frontend/di.xml
index 4047b3ff462..e22d810d8e2 100644
--- a/app/code/Magento/Contacts/etc/frontend/di.xml
+++ b/app/code/Magento/Contacts/etc/frontend/di.xml
@@ -23,12 +23,12 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Core\Model\Url\SecurityInfo">
-        <param name="secureUrlList">
-            <array>
-                <item key="contacts"><value>/contacts/</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="secureUrlList" xsi:type="array">
+                <item name="contacts" xsi:type="string">/contacts/</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Core/Model/App.php b/app/code/Magento/Core/Model/App.php
index 4c74f1300c6..4a9ab1d2800 100644
--- a/app/code/Magento/Core/Model/App.php
+++ b/app/code/Magento/Core/Model/App.php
@@ -50,7 +50,7 @@ class App implements \Magento\AppInterface
     /**
      * Magento version
      */
-    const VERSION = '2.0.0.0-dev65';
+    const VERSION = '2.0.0.0-dev66';
 
     /**
      * Application run code
@@ -516,7 +516,7 @@ class App implements \Magento\AppInterface
             'revision'  => '0',
             'patch'     => '0',
             'stability' => 'dev',
-            'number'    => '65',
+            'number'    => '66',
         );
     }
 }
diff --git a/app/code/Magento/Core/Model/Layout.php b/app/code/Magento/Core/Model/Layout.php
index 3c75f5b1110..c90435005f5 100644
--- a/app/code/Magento/Core/Model/Layout.php
+++ b/app/code/Magento/Core/Model/Layout.php
@@ -143,9 +143,14 @@ class Layout extends \Magento\Simplexml\Config implements \Magento\View\LayoutIn
     protected $_nameIncrement = array();
 
     /**
-     * @var \Magento\Core\Model\Layout\Argument\Processor
+     * @var \Magento\View\Layout\Argument\Parser
      */
-    protected $_argumentProcessor;
+    protected $argumentParser;
+
+    /**
+     * @var \Magento\Data\Argument\InterpreterInterface
+     */
+    protected $argumentInterpreter;
 
     /**
      * @var \Magento\Core\Model\Layout\ScheduledStructure
@@ -219,7 +224,8 @@ class Layout extends \Magento\Simplexml\Config implements \Magento\View\LayoutIn
      * @param \Magento\View\DesignInterface $design
      * @param \Magento\View\Element\BlockFactory $blockFactory
      * @param \Magento\Data\Structure $structure
-     * @param \Magento\Core\Model\Layout\Argument\Processor $argumentProcessor
+     * @param \Magento\View\Layout\Argument\Parser $argumentParser
+     * @param \Magento\Data\Argument\InterpreterInterface $argumentInterpreter
      * @param \Magento\Core\Model\Layout\ScheduledStructure $scheduledStructure
      * @param \Magento\Core\Model\Store\Config $coreStoreConfig
      * @param \Magento\App\State $appState
@@ -235,7 +241,8 @@ class Layout extends \Magento\Simplexml\Config implements \Magento\View\LayoutIn
         \Magento\View\DesignInterface $design,
         \Magento\View\Element\BlockFactory $blockFactory,
         \Magento\Data\Structure $structure,
-        \Magento\Core\Model\Layout\Argument\Processor $argumentProcessor,
+        \Magento\View\Layout\Argument\Parser $argumentParser,
+        \Magento\Data\Argument\InterpreterInterface $argumentInterpreter,
         \Magento\Core\Model\Layout\ScheduledStructure $scheduledStructure,
         \Magento\Core\Model\Store\Config $coreStoreConfig,
         \Magento\App\State $appState,
@@ -250,7 +257,8 @@ class Layout extends \Magento\Simplexml\Config implements \Magento\View\LayoutIn
         $this->_appState = $appState;
         $this->_area = $area;
         $this->_structure = $structure;
-        $this->_argumentProcessor = $argumentProcessor;
+        $this->argumentParser = $argumentParser;
+        $this->argumentInterpreter = $argumentInterpreter;
         $this->_elementClass = 'Magento\View\Layout\Element';
         $this->setXml(simplexml_load_string('<layout/>', $this->_elementClass));
         $this->_renderingOutput = new \Magento\Object;
@@ -547,33 +555,35 @@ class Layout extends \Magento\Simplexml\Config implements \Magento\View\LayoutIn
     }
 
     /**
-     * Parse argument nodes and create prepared array of items
+     * Parse argument nodes and return their array representation
      *
      * @param \Magento\View\Layout\Element $node
      * @return array
      */
     protected function _parseArguments(\Magento\View\Layout\Element $node)
     {
-        $arguments = array();
-        foreach ($node->xpath('argument') as $argument) {
-            /** @var $argument \Magento\View\Layout\Element */
-            $argumentName = (string)$argument['name'];
-            $arguments[$argumentName] = $this->_argumentProcessor->parse($argument);
+        $nodeDom = dom_import_simplexml($node);
+        $result = array();
+        foreach ($nodeDom->childNodes as $argumentNode) {
+            if ($argumentNode instanceof \DOMElement && $argumentNode->nodeName == 'argument') {
+                $argumentName = $argumentNode->getAttribute('name');
+                $result[$argumentName] = $this->argumentParser->parse($argumentNode);
+            }
         }
-        return $arguments;
+        return $result;
     }
 
     /**
-     * Process arguments
+     * Compute and return argument values
      *
      * @param array $arguments
      * @return array
      */
-    protected function _processArguments(array $arguments)
+    protected function _evaluateArguments(array $arguments)
     {
         $result = array();
-        foreach ($arguments as $name => $argument) {
-            $result[$name] = $this->_argumentProcessor->process($argument);
+        foreach ($arguments as $argumentName => $argumentData) {
+            $result[$argumentName] = $this->argumentInterpreter->evaluate($argumentData);
         }
         return $result;
     }
@@ -835,7 +845,7 @@ class Layout extends \Magento\Simplexml\Config implements \Magento\View\LayoutIn
         // create block
         $className = (string)$node['class'];
 
-        $arguments = $this->_processArguments($args);
+        $arguments = $this->_evaluateArguments($args);
 
         $block = $this->_createBlock($className, $elementName,
             array('data' => $arguments));
@@ -916,7 +926,7 @@ class Layout extends \Magento\Simplexml\Config implements \Magento\View\LayoutIn
         $block = $this->getBlock($parentName);
         if (!empty($block)) {
             $args = $this->_parseArguments($node);
-            $args = $this->_processArguments($args);
+            $args = $this->_evaluateArguments($args);
             call_user_func_array(array($block, $method), $args);
         }
 
diff --git a/app/code/Magento/Core/Model/Layout/Argument/AbstractHandler.php b/app/code/Magento/Core/Model/Layout/Argument/AbstractHandler.php
deleted file mode 100644
index 2250c718bc8..00000000000
--- a/app/code/Magento/Core/Model/Layout/Argument/AbstractHandler.php
+++ /dev/null
@@ -1,137 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Core
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-namespace Magento\Core\Model\Layout\Argument;
-
-/**
- * Layout object abstract argument
- *
- * @category    Magento
- * @package     Magento_Core
- * @author      Magento Core Team <core@magentocommerce.com>
- */
-
-abstract class AbstractHandler implements \Magento\View\Layout\Argument\HandlerInterface
-{
-    /**
-     * @var \Magento\ObjectManager
-     */
-    protected $_objectManager;
-
-    /**
-     * Retrieve value from argument
-     *
-     * @param \Magento\View\Layout\Element $argument
-     * @return string|null
-     */
-    protected function _getArgumentValue(\Magento\View\Layout\Element $argument)
-    {
-        if ($this->_isUpdater($argument)) {
-            return null;
-        }
-        if (isset($argument->value)) {
-            $value = $argument->value;
-        } else {
-            $value = $argument;
-        }
-        return trim((string)$value);
-    }
-
-    /**
-     * Check whether updater used and value not overwritten
-     *
-     * @param \Magento\View\Layout\Element $argument
-     * @return bool
-     */
-    protected function _isUpdater(\Magento\View\Layout\Element $argument)
-    {
-        $updaters = $argument->xpath('./updater');
-        if (!empty($updaters) && !isset($argument->value)) {
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Retrieve xsi:type attribute value from argument
-     *
-     * @param \Magento\View\Layout\Element $argument
-     * @return string
-     */
-    protected function _getArgumentType(\Magento\View\Layout\Element $argument)
-    {
-        return (string)$argument->attributes('xsi', true)->type;
-    }
-
-    /**
-     * Parse argument node
-     * @param \Magento\View\Layout\Element $argument
-     * @return array
-     */
-    public function parse(\Magento\View\Layout\Element $argument)
-    {
-        $result = array();
-        $updaters = array();
-        $result['type'] = $this->_getArgumentType($argument);
-        foreach ($argument->xpath('./updater') as $updaterNode) {
-            /** @var $updaterNode \Magento\View\Layout\Element */
-            $updaters[uniqid() . '_' . mt_rand()] = trim((string)$updaterNode);
-        }
-
-        $result = !empty($updaters) ? $result + array('updaters' => $updaters) : $result;
-        $argumentValue = $this->_getArgumentValue($argument);
-        if (isset($argumentValue)) {
-            $result = array_merge_recursive($result, array(
-                'value' => $argumentValue
-            ));
-        }
-        return $result;
-    }
-
-    /**
-     * Validate parsed argument before processing
-     *
-     * @param array $argument
-     * @return void
-     * @throws \InvalidArgumentException
-     */
-    protected function _validate(array $argument)
-    {
-        if (!isset($argument['value'])) {
-            throw new \InvalidArgumentException(
-                'Value is required for argument. ' . $this->_getArgumentInfo($argument)
-            );
-        }
-    }
-
-    /**
-     * @param array $argument
-     * @return string
-     */
-    protected function _getArgumentInfo($argument)
-    {
-        return  'Argument: ' . json_encode($argument);
-    }
-}
diff --git a/app/code/Magento/Core/Model/Layout/Argument/Handler/ArrayHandler.php b/app/code/Magento/Core/Model/Layout/Argument/Handler/ArrayHandler.php
deleted file mode 100644
index b2cb67d4035..00000000000
--- a/app/code/Magento/Core/Model/Layout/Argument/Handler/ArrayHandler.php
+++ /dev/null
@@ -1,117 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Core
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-namespace Magento\Core\Model\Layout\Argument\Handler;
-
-/**
- * Layout argument. Type Array
- *
- * @category    Magento
- * @package     Magento_Core
- * @author      Magento Core Team <core@magentocommerce.com>
- */
-
-class ArrayHandler extends \Magento\Core\Model\Layout\Argument\AbstractHandler
-{
-    /**
-     * @var \Magento\View\Layout\Argument\HandlerFactory
-     */
-    protected $_handlerFactory;
-
-    /**
-     * @param \Magento\View\Layout\Argument\HandlerFactory $handlerFactory
-     */
-    public function __construct(
-        \Magento\View\Layout\Argument\HandlerFactory $handlerFactory
-    ) {
-        $this->_handlerFactory = $handlerFactory;
-    }
-
-    /**
-     * Process Array argument
-     *
-     * @param array $argument
-     * @throws \InvalidArgumentException
-     * @return array
-     */
-    public function process(array $argument)
-    {
-        $this->_validate($argument);
-        $result = array();
-        foreach ($argument['value'] as $name => $item) {
-            $result[$name] = $this->_handlerFactory
-                ->getArgumentHandlerByType($item['type'])
-                ->process($item);
-        }
-        return $result;
-    }
-
-    /**
-     * @param array $argument
-     * @return void
-     * @throws \InvalidArgumentException
-     */
-    protected function _validate(array $argument)
-    {
-        parent::_validate($argument);
-        $items = $argument['value'];
-        if (!is_array($items)) {
-            throw new \InvalidArgumentException(
-                'Passed value has incorrect format. ' . $this->_getArgumentInfo($argument)
-            );
-        }
-        foreach ($items as $name => $item) {
-            if (!is_array($item) || !isset($item['type']) || !isset($item['value'])) {
-                throw new \InvalidArgumentException(
-                    'Array item: "' . $name . '" has incorrect format. ' . $this->_getArgumentInfo($argument)
-                );
-            }
-        }
-    }
-
-    /**
-     * Retrieve value from Array argument
-     *
-     * @param \Magento\View\Layout\Element $argument
-     * @return array|null
-     */
-    protected function _getArgumentValue(\Magento\View\Layout\Element $argument)
-    {
-        $items = $argument->xpath('item');
-        if ($this->_isUpdater($argument) && empty($items)) {
-            return null;
-        }
-        $result = array();
-        /** @var $item \Magento\View\Layout\Element */
-        foreach ($items as $item) {
-            $itemName = (string)$item['name'];
-            $itemType = $this->_getArgumentType($item);
-            $result[$itemName] = $this->_handlerFactory
-                ->getArgumentHandlerByType($itemType)
-                ->parse($item);
-        }
-        return $result;
-    }
-}
diff --git a/app/code/Magento/Core/Model/Layout/Argument/Handler/Helper.php b/app/code/Magento/Core/Model/Layout/Argument/Handler/Helper.php
deleted file mode 100644
index ade6fb9c60f..00000000000
--- a/app/code/Magento/Core/Model/Layout/Argument/Handler/Helper.php
+++ /dev/null
@@ -1,113 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Core
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-
-/**
- * Layout argument. Type helper.
- *
- * @category    Magento
- * @package     Magento_Core
- * @author      Magento Core Team <core@magentocommerce.com>
- */
-namespace Magento\Core\Model\Layout\Argument\Handler;
-
-class Helper extends \Magento\Core\Model\Layout\Argument\AbstractHandler
-{
-    /**
-     * @var \Magento\ObjectManager
-     */
-    protected $_objectManager;
-
-    /**
-     * @param \Magento\ObjectManager $objectManager
-     */
-    public function __construct(\Magento\ObjectManager $objectManager)
-    {
-        $this->_objectManager = $objectManager;
-    }
-
-    /**
-     * Process argument value
-     *
-     * @param array $argument
-     * @return mixed
-     * @throws \InvalidArgumentException
-     */
-    public function process(array $argument)
-    {
-        $this->_validate($argument);
-        $value = $argument['value'];
-
-        $helper = $this->_objectManager->get($value['helperClass']);
-        return call_user_func_array(array($helper, $value['helperMethod']), $value['params']);
-    }
-
-    /**
-     * @param array $argument
-     * @return void
-     * @throws \InvalidArgumentException
-     */
-    protected function _validate(array $argument)
-    {
-        parent::_validate($argument);
-        $value = $argument['value'];
-
-        if (!isset($value['helperClass']) || !isset($value['helperMethod'])) {
-            throw new \InvalidArgumentException(
-                'Passed helper has incorrect format. ' . $this->_getArgumentInfo($argument)
-            );
-        }
-        if (!method_exists($value['helperClass'], $value['helperMethod'])) {
-            throw new \InvalidArgumentException(
-                'Helper method "' . $value['helperClass'] . '::' . $value['helperMethod'] . '" does not exist.'
-                . ' ' . $this->_getArgumentInfo($argument)
-            );
-        }
-    }
-
-    /**
-     * Retrieve value from argument
-     *
-     * @param \Magento\View\Layout\Element $argument
-     * @return array
-     */
-    protected function _getArgumentValue(\Magento\View\Layout\Element $argument)
-    {
-        $value = array(
-            'helperClass' => '',
-            'helperMethod' => '',
-            'params' => array(),
-        );
-
-        list($value['helperClass'], $value['helperMethod']) = explode('::', $argument['helper']);
-
-        if (isset($argument->param)) {
-            foreach ($argument->param as $param) {
-                $value['params'][] = (string)$param;
-            }
-        }
-        return $value;
-    }
-}
diff --git a/app/code/Magento/Core/Model/Layout/Argument/Handler/Object.php b/app/code/Magento/Core/Model/Layout/Argument/Handler/Object.php
deleted file mode 100644
index b6dca35fc95..00000000000
--- a/app/code/Magento/Core/Model/Layout/Argument/Handler/Object.php
+++ /dev/null
@@ -1,107 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Core
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-
-/**
- * Layout argument. Type object
- *
- * @category    Magento
- * @package     Magento_Core
- * @author      Magento Core Team <core@magentocommerce.com>
- */
-namespace Magento\Core\Model\Layout\Argument\Handler;
-
-class Object extends \Magento\Core\Model\Layout\Argument\AbstractHandler
-{
-    /**
-     * @var \Magento\ObjectManager
-     */
-    protected $_objectManager;
-
-    /**
-     * @param \Magento\ObjectManager $objectManager
-     */
-    public function __construct(\Magento\ObjectManager $objectManager)
-    {
-        $this->_objectManager = $objectManager;
-    }
-
-    /**
-     * Process argument value
-     *
-     * @param array $argument
-     * @return mixed
-     * @throws \InvalidArgumentException
-     */
-    public function process(array $argument)
-    {
-        $this->_validate($argument);
-        $value = $argument['value'];
-
-        return $this->_objectManager->create($value['object']);
-    }
-
-    /**
-     * Validate argument
-     *
-     * @param array $argument
-     * @return void
-     * @throws \InvalidArgumentException
-     */
-    protected function _validate(array $argument)
-    {
-        parent::_validate($argument);
-        $value = $argument['value'];
-
-        if (!isset($value['object'])) {
-            throw new \InvalidArgumentException(
-                'Passed value has incorrect format. ' . $this->_getArgumentInfo($argument)
-            );
-        }
-
-        if (!is_subclass_of($value['object'], 'Magento\Data\Collection')) {
-            throw new \InvalidArgumentException(
-                'Incorrect data source model. ' . $this->_getArgumentInfo($argument)
-            );
-        }
-    }
-
-    /**
-     * Retrieve value from argument
-     *
-     * @param \Magento\View\Layout\Element $argument
-     * @return array|null
-     */
-    protected function _getArgumentValue(\Magento\View\Layout\Element $argument)
-    {
-        $value = parent::_getArgumentValue($argument);
-        if (!isset($value)) {
-            return null;
-        }
-        return array(
-            'object' => $value
-        );
-    }
-}
diff --git a/app/code/Magento/Core/Model/Layout/Argument/Handler/Options.php b/app/code/Magento/Core/Model/Layout/Argument/Handler/Options.php
deleted file mode 100644
index b91fc541ce9..00000000000
--- a/app/code/Magento/Core/Model/Layout/Argument/Handler/Options.php
+++ /dev/null
@@ -1,108 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Core
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-
-/**
- * Layout argument. Type options
- *
- * @category    Magento
- * @package     Magento_Core
- * @author      Magento Core Team <core@magentocommerce.com>
- */
-namespace Magento\Core\Model\Layout\Argument\Handler;
-
-class Options extends \Magento\Core\Model\Layout\Argument\AbstractHandler
-{
-    /**
-     * @var \Magento\ObjectManager
-     */
-    protected $_objectManager;
-
-    /**
-     * @param \Magento\ObjectManager $objectManager
-     */
-    public function __construct(\Magento\ObjectManager $objectManager)
-    {
-        $this->_objectManager = $objectManager;
-    }
-
-    /**
-     * Process Option argument
-     *
-     * @param array $argument
-     * @return array
-     * @throws \InvalidArgumentException
-     */
-    public function process(array $argument)
-    {
-        $this->_validate($argument);
-
-        $optionsModel = $this->_objectManager->create($argument['value']['model']);
-
-        $options = $optionsModel->toOptionArray();
-        $result = array();
-
-        foreach ($options as $value => $label) {
-            if (is_array($label)) {
-                $result[] = $label;
-            } else {
-                $result[] = array('value' => $value, 'label' => $label);
-            }
-        }
-
-        return $result;
-    }
-
-    /**
-     * @param \Magento\View\Layout\Element $argument
-     * @return array
-     */
-    protected function _getArgumentValue(\Magento\View\Layout\Element $argument)
-    {
-        return array('model' => (string)$argument['model']);
-    }
-
-    /**
-     * @param array $argument
-     * @throws \InvalidArgumentException
-     */
-    protected function _validate(array $argument)
-    {
-        parent::_validate($argument);
-        $value = $argument['value'];
-
-        if (!isset($value['model'])) {
-            throw new \InvalidArgumentException(
-                'Passed value has incorrect format. ' . $this->_getArgumentInfo($argument)
-            );
-        }
-
-        if (!is_subclass_of($value['model'], 'Magento\Core\Model\Option\ArrayInterface')) {
-            throw new \InvalidArgumentException(
-                'Incorrect options model. ' . $this->_getArgumentInfo($argument)
-            );
-        }
-    }
-}
diff --git a/app/code/Magento/Core/Model/Layout/Argument/Handler/String.php b/app/code/Magento/Core/Model/Layout/Argument/Handler/String.php
deleted file mode 100644
index aa3f5e67ac7..00000000000
--- a/app/code/Magento/Core/Model/Layout/Argument/Handler/String.php
+++ /dev/null
@@ -1,97 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Core
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-
-/**
- * Layout argument. Type string.
- *
- * @category    Magento
- * @package     Magento_Core
- * @author      Magento Core Team <core@magentocommerce.com>
- */
-namespace Magento\Core\Model\Layout\Argument\Handler;
-
-class String extends \Magento\Core\Model\Layout\Argument\AbstractHandler
-{
-    /**
-     * Process argument value
-     *
-     * @param array $argument
-     * @return string
-     * @throws \InvalidArgumentException
-     */
-    public function process(array $argument)
-    {
-        $this->_validate($argument);
-        $value = $argument['value'];
-
-        if (!empty($value['translate'])) {
-            $value['string'] = __($value['string']);
-        }
-
-        return $value['string'];
-    }
-
-    /**
-     * @param array $argument
-     * @return void
-     * @throws \InvalidArgumentException
-     */
-    protected function _validate(array $argument)
-    {
-        parent::_validate($argument);
-
-        if (!isset($argument['value']['string'])) {
-            throw new \InvalidArgumentException(
-                'Passed value has incorrect format. ' . $this->_getArgumentInfo($argument)
-            );
-        }
-
-        if (!is_string($argument['value']['string'])) {
-            throw new \InvalidArgumentException(
-                'Value is not string argument. ' . $this->_getArgumentInfo($argument)
-            );
-        }
-    }
-
-    /**
-     * Retrieve value from argument
-     *
-     * @param \Magento\View\Layout\Element $argument
-     * @return array|null
-     */
-    protected function _getArgumentValue(\Magento\View\Layout\Element $argument)
-    {
-        $value = parent::_getArgumentValue($argument);
-        if (!isset($value)) {
-            return null;
-        }
-        $result = array('string' => $value);
-        if ($argument->getAttribute('translate')) {
-            $result['translate'] = true;
-        }
-        return $result;
-    }
-}
diff --git a/app/code/Magento/Core/Model/Layout/Argument/Handler/Url.php b/app/code/Magento/Core/Model/Layout/Argument/Handler/Url.php
deleted file mode 100644
index 850313f1d1e..00000000000
--- a/app/code/Magento/Core/Model/Layout/Argument/Handler/Url.php
+++ /dev/null
@@ -1,102 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Core
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-
-/**
- * Layout argument. Type url
- *
- * @category    Magento
- * @package     Magento_Core
- * @author      Magento Core Team <core@magentocommerce.com>
- */
-namespace Magento\Core\Model\Layout\Argument\Handler;
-
-class Url extends \Magento\Core\Model\Layout\Argument\AbstractHandler
-{
-    /**
-     * @var \Magento\UrlInterface
-     */
-    protected $_urlModel;
-
-    /**
-     * @param \Magento\UrlInterface $urlModel
-     */
-    public function __construct(\Magento\UrlInterface  $urlModel)
-    {
-        $this->_urlModel = $urlModel;
-    }
-
-    /**
-     * Generate url
-     *
-     * @param array $argument
-     * @return string
-     * @throws \InvalidArgumentException
-     */
-    public function process(array $argument)
-    {
-        $this->_validate($argument);
-        $value = $argument['value'];
-
-        return $this->_urlModel->getUrl($value['path'], $value['params']);
-    }
-
-    /**
-     * @param array $argument
-     * @return void
-     * @throws \InvalidArgumentException
-     */
-    protected function _validate(array $argument)
-    {
-        parent::_validate($argument);
-        $value = $argument['value'];
-
-        if (!isset($value['path'])) {
-            throw new \InvalidArgumentException(
-                'Passed value has incorrect format. ' . $this->_getArgumentInfo($argument)
-            );
-        }
-    }
-
-    /**
-     * @param $argument
-     * @return array
-     */
-    protected function _getArgumentValue(\Magento\View\Layout\Element $argument)
-    {
-        $result = array(
-            'path' => (string)$argument['path'],
-            'params' => array()
-        );
-
-        if (isset($argument->param)) {
-            foreach ($argument->param as $param) {
-                $result['params'][(string)$param['name']] = (string)$param;
-            }
-        }
-
-        return $result;
-    }
-}
diff --git a/app/code/Magento/Core/Model/Layout/Argument/Processor.php b/app/code/Magento/Core/Model/Layout/Argument/Processor.php
deleted file mode 100644
index 63d65f3c19b..00000000000
--- a/app/code/Magento/Core/Model/Layout/Argument/Processor.php
+++ /dev/null
@@ -1,108 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Core
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-namespace Magento\Core\Model\Layout\Argument;
-
-/**
- * Layout argument processor
- *
- * @category    Magento
- * @package     Magento_Core
- * @author      Magento Core Team <core@magentocommerce.com>
- */
-
-class Processor
-{
-    /**
-     * @var \Magento\View\Layout\Argument\HandlerFactory
-     */
-    protected $_handlerFactory;
-
-    /**
-     * @var \Magento\Core\Model\Layout\Argument\Updater
-     */
-    protected $_argumentUpdater;
-
-    /**
-     * Argument handlers object list
-     *
-     * @var array
-     */
-    protected $_argumentHandlers = array();
-
-    /**
-     * @param \Magento\Core\Model\Layout\Argument\Updater $argumentUpdater
-     * @param \Magento\View\Layout\Argument\HandlerFactory $handlerFactory
-     */
-    public function __construct(
-        \Magento\Core\Model\Layout\Argument\Updater $argumentUpdater,
-        \Magento\View\Layout\Argument\HandlerFactory $handlerFactory
-    ) {
-        $this->_handlerFactory  = $handlerFactory;
-        $this->_argumentUpdater = $argumentUpdater;
-    }
-
-    /**
-     * Parse given argument
-     *
-     * @param \Magento\View\Layout\Element $argument
-     * @throws \InvalidArgumentException
-     * @return array
-     */
-    public function parse(\Magento\View\Layout\Element $argument)
-    {
-        $type = $this->_getArgumentType($argument);
-        $handler = $this->_handlerFactory->getArgumentHandlerByType($type);
-        return $handler->parse($argument);
-    }
-
-    /**
-     * Process given argument
-     *
-     * @param array $argument
-     * @throws \InvalidArgumentException
-     * @return mixed
-     */
-    public function process(array $argument)
-    {
-        $handler = $this->_handlerFactory->getArgumentHandlerByType($argument['type']);
-        $result = $handler->process($argument);
-        if (!empty($argument['updaters'])) {
-            $result = $this->_argumentUpdater->applyUpdaters($result, $argument['updaters']);
-        }
-        return $result;
-    }
-
-    /**
-     * Get Argument's XSI type
-     *
-     * @param \Magento\View\Layout\Element $argument
-     * @return string
-     */
-    protected function _getArgumentType(\Magento\View\Layout\Element $argument)
-    {
-        return (string)$argument->attributes('xsi', true)->type;
-    }
-}
diff --git a/app/code/Magento/Core/Model/Layout/Merge.php b/app/code/Magento/Core/Model/Layout/Merge.php
index 56761d4d6a3..462de34af71 100644
--- a/app/code/Magento/Core/Model/Layout/Merge.php
+++ b/app/code/Magento/Core/Model/Layout/Merge.php
@@ -48,6 +48,11 @@ class Merge implements \Magento\View\Layout\ProcessorInterface
      */
     const XPATH_HANDLE_DECLARATION = '/layout[@*]';
 
+    /**
+     * Name of an attribute that stands for data type of node values
+     */
+    const TYPE_ATTRIBUTE = 'xsi:type';
+
     /**
      * @var \Magento\Core\Model\Theme
      */
diff --git a/app/code/Magento/Core/Model/Mview/View/State.php b/app/code/Magento/Core/Model/Mview/View/State.php
index 6fbe79dd4c5..9960ca50529 100644
--- a/app/code/Magento/Core/Model/Mview/View/State.php
+++ b/app/code/Magento/Core/Model/Mview/View/State.php
@@ -70,7 +70,7 @@ class State extends \Magento\Core\Model\AbstractModel implements \Magento\Mview\
      * Fill object with state data by view ID
      *
      * @param string $viewId
-     * @return void
+     * @return $this
      */
     public function loadByView($viewId)
     {
@@ -78,12 +78,13 @@ class State extends \Magento\Core\Model\AbstractModel implements \Magento\Mview\
         if (!$this->getId()) {
             $this->setViewId($viewId);
         }
+        return $this;
     }
 
     /**
      * Processing object before save data
      *
-     * @return void
+     * @return $this
      */
     protected function _beforeSave()
     {
diff --git a/app/code/Magento/Core/Model/Option/ArrayInterface.php b/app/code/Magento/Core/Model/Option/ArrayInterface.php
index fb24f45cefe..4a7a45ac284 100644
--- a/app/code/Magento/Core/Model/Option/ArrayInterface.php
+++ b/app/code/Magento/Core/Model/Option/ArrayInterface.php
@@ -18,25 +18,15 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Core
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+
 namespace Magento\Core\Model\Option;
 
 /**
- * Option array interface
- *
- * @category    Magento
- * @package     Magento_Core
- * @author      Magento Core Team <core@magentocommerce.com>
+ * @todo Remove in favor of the ancestor interface
  */
-interface ArrayInterface
+interface ArrayInterface extends \Magento\Data\OptionSourceInterface
 {
-    /**
-     * Return option array
-     * @return array
-     */
-    public function toOptionArray();
 }
diff --git a/app/code/Magento/Core/Model/Resource/AbstractResource.php b/app/code/Magento/Core/Model/Resource/AbstractResource.php
index ec28b5e2ebb..46a19258ca0 100644
--- a/app/code/Magento/Core/Model/Resource/AbstractResource.php
+++ b/app/code/Magento/Core/Model/Resource/AbstractResource.php
@@ -249,7 +249,7 @@ abstract class AbstractResource
         $fieldsetColumns = $object->getFieldset();
         if (!empty($fieldsetColumns)) {
             $readAdapter = $this->_getReadAdapter();
-            if ($readAdapter instanceof \Magento\Db\Adapter\AdapterInterface) {
+            if ($readAdapter instanceof \Magento\DB\Adapter\AdapterInterface) {
                 $entityTableColumns = $readAdapter->describeTable($tableName);
                 $columns = array_intersect($fieldsetColumns, array_keys($entityTableColumns));
             }
diff --git a/app/code/Magento/Core/etc/di.xml b/app/code/Magento/Core/etc/di.xml
index 0cc5c46fe96..aa5c0d89c8f 100644
--- a/app/code/Magento/Core/etc/di.xml
+++ b/app/code/Magento/Core/etc/di.xml
@@ -23,7 +23,7 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <preference for="Magento\Acl\CacheInterface" type="Magento\Core\Model\Acl\Cache" />
     <preference for="Magento\Module\Updater\SetupInterface" type="Magento\Core\Model\Resource\Setup" />
     <preference for="Magento\Module\ResourceResolverInterface" type="Magento\Module\ResourceResolver" />
@@ -78,459 +78,389 @@
     <preference for="Magento\BaseScopeResolverInterface" type="Magento\Core\Model\BaseScopeResolver" />
     <preference for="Magento\Less\PreProcessor\ErrorHandlerInterface" type="Magento\Less\PreProcessor\ErrorHandler" />
     <type name="Magento\Translate\Inline">
-        <param name="templateFileName">
-            <value>Magento_Core::translate_inline.phtml</value>
-        </param>
-        <param name="translatorRoute">
-            <value>core/ajax/translate</value>
-        </param>
+        <arguments>
+            <argument name="templateFileName" xsi:type="string">Magento_Core::translate_inline.phtml</argument>
+            <argument name="translatorRoute" xsi:type="string">core/ajax/translate</argument>
+        </arguments>
     </type>
     <type name="Magento\App\DefaultPath\DefaultPath">
-        <param name="parts">
-            <array>
-                <item key="module"><value>core</value></item>
-                <item key="controller"><value>index</value></item>
-                <item key="action"><value>index</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="parts" xsi:type="array">
+                <item name="module" xsi:type="string">core</item>
+                <item name="controller" xsi:type="string">index</item>
+                <item name="action" xsi:type="string">index</item>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\App\AreaList">
-        <param name="areas">
-            <array>
-                <item key="frontend">
-                    <array>
-                        <item key="frontName"><value/></item>
-                        <item key="router"><value>standard</value></item>
-                    </array>
+        <arguments>
+            <argument name="areas" xsi:type="array">
+                <item name="frontend" xsi:type="array">
+                    <item name="frontName" xsi:type="string"></item>
+                    <item name="router" xsi:type="string">standard</item>
                 </item>
-            </array>
-        </param>
-        <param name="default">
-            <value>frontend</value>
-        </param>
+            </argument>
+            <argument name="default" xsi:type="string">frontend</argument>
+        </arguments>
     </type>
     <type name="Magento\Data\Structure" shared="false" />
     <type name="Magento\Data\Collection\Db\FetchStrategy\Cache">
-        <param name="cache">
-            <instance type="Magento\App\Cache\Type\Collection" />
-        </param>
-        <param name="cacheIdPrefix">
-            <value>collection_</value>
-        </param>
-        <param name="cacheLifetime">
-            <value>86400</value>
-        </param>
+        <arguments>
+            <argument name="cache" xsi:type="object">Magento\App\Cache\Type\Collection</argument>
+            <argument name="cacheIdPrefix" xsi:type="string">collection_</argument>
+            <argument name="cacheLifetime" xsi:type="string">86400</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\Store">
-        <param name="isCustomEntryPoint">
-            <value type="argument">Magento\Core\Model\Store::CUSTOM_ENTRY_POINT_PARAM</value>
-        </param>
-        <param name="url">
-            <instance type="Magento\UrlInterface" shared="false"/>
-        </param>
+        <arguments>
+            <argument name="isCustomEntryPoint" xsi:type="init_parameter">Magento\Core\Model\Store::CUSTOM_ENTRY_POINT_PARAM</argument>
+            <argument name="url" xsi:type="object" shared="false">Magento\UrlInterface</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\Acl\Cache">
-        <param name="cacheKey">
-            <value>global_acl_resources</value>
-        </param>
+        <arguments>
+            <argument name="cacheKey" xsi:type="string">global_acl_resources</argument>
+        </arguments>
     </type>
     <virtualType name="Magento\Core\Model\Resource\Website\Collection\FetchStrategy" type="Magento\Data\Collection\Db\FetchStrategy\Cache">
-        <param name="cache">
-            <instance type="Magento\App\Cache\Type\Collection" />
-        </param>
-        <param name="cacheIdPrefix">
-            <value>app_</value>
-        </param>
-        <param name="cacheTags">
-            <array>
-                <item key="storeTag"><value type="const">Magento\Core\Model\Website::CACHE_TAG</value></item>
-            </array>
-        </param>
-        <param name="cacheLifetime">
-            <value type="bool">false</value>
-        </param>
+        <arguments>
+            <argument name="cache" xsi:type="object">Magento\App\Cache\Type\Collection</argument>
+            <argument name="cacheIdPrefix" xsi:type="string">app_</argument>
+            <argument name="cacheTags" xsi:type="array">
+                <item name="storeTag" xsi:type="const">Magento\Core\Model\Website::CACHE_TAG</item>
+            </argument>
+            <argument name="cacheLifetime" xsi:type="boolean">false</argument>
+        </arguments>
     </virtualType>
     <virtualType name="Magento\Core\Model\Resource\Store\Group\Collection\FetchStrategy" type="Magento\Data\Collection\Db\FetchStrategy\Cache">
-        <param name="cache">
-            <instance type="Magento\App\Cache\Type\Collection" />
-        </param>
-        <param name="cacheIdPrefix">
-            <value>app_</value>
-        </param>
-        <param name="cacheTags">
-            <array>
-                <item key="storeTag"><value type="const">Magento\Core\Model\Store\Group::CACHE_TAG</value></item>
-            </array>
-        </param>
-        <param name="cacheLifetime">
-            <value type="bool">false</value>
-        </param>
+        <arguments>
+            <argument name="cache" xsi:type="object">Magento\App\Cache\Type\Collection</argument>
+            <argument name="cacheIdPrefix" xsi:type="string">app_</argument>
+            <argument name="cacheTags" xsi:type="array">
+                <item name="storeTag" xsi:type="const">Magento\Core\Model\Store\Group::CACHE_TAG</item>
+            </argument>
+            <argument name="cacheLifetime" xsi:type="boolean">false</argument>
+        </arguments>
     </virtualType>
     <virtualType name="Magento\Core\Model\Resource\Store\Collection\FetchStrategy" type="Magento\Data\Collection\Db\FetchStrategy\Cache">
-        <param name="cache">
-            <instance type="Magento\App\Cache\Type\Collection" />
-        </param>
-        <param name="cacheIdPrefix">
-            <value>app_</value>
-        </param>
-        <param name="cacheTags">
-            <array>
-                <item key="storeTag"><value type="const">Magento\Core\Model\Store::CACHE_TAG</value></item>
-            </array>
-        </param>
-        <param name="cacheLifetime">
-            <value type="bool">false</value>
-        </param>
+        <arguments>
+            <argument name="cache" xsi:type="object">Magento\App\Cache\Type\Collection</argument>
+            <argument name="cacheIdPrefix" xsi:type="string">app_</argument>
+            <argument name="cacheTags" xsi:type="array">
+                <item name="storeTag" xsi:type="const">Magento\Core\Model\Store::CACHE_TAG</item>
+            </argument>
+            <argument name="cacheLifetime" xsi:type="boolean">false</argument>
+        </arguments>
     </virtualType>
     <type name="Magento\Core\Model\Resource\Website\Collection">
-        <param name="fetchStrategy">
-            <instance type="Magento\Core\Model\Resource\Website\Collection\FetchStrategy" />
-        </param>
+        <arguments>
+            <argument name="fetchStrategy" xsi:type="object">Magento\Core\Model\Resource\Website\Collection\FetchStrategy</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\Resource\Store\Group\Collection">
-        <param name="fetchStrategy">
-            <instance type="Magento\Core\Model\Resource\Store\Group\Collection\FetchStrategy" />
-        </param>
+        <arguments>
+            <argument name="fetchStrategy" xsi:type="object">Magento\Core\Model\Resource\Store\Group\Collection\FetchStrategy</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\Resource\Store\Collection">
-        <param name="fetchStrategy">
-            <instance type="Magento\Core\Model\Resource\Store\Collection\FetchStrategy" />
-        </param>
+        <arguments>
+            <argument name="fetchStrategy" xsi:type="object">Magento\Core\Model\Resource\Store\Collection\FetchStrategy</argument>
+        </arguments>
     </type>
     <type name="Magento\View\Asset\Collection" shared="false" />
     <type name="Magento\Core\Model\Theme\Collection" shared="false" />
     <type name="Magento\Core\Model\Layout\Merge">
-        <param name="fileSource">
-            <instance type="Magento\View\Layout\File\Source\Aggregated" />
-        </param>
-        <param name="cache">
-            <instance type="Magento\App\Cache\Type\Layout" />
-        </param>
+        <arguments>
+            <argument name="fileSource" xsi:type="object">Magento\View\Layout\File\Source\Aggregated</argument>
+            <argument name="cache" xsi:type="object">Magento\App\Cache\Type\Layout</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\Resource\Layout\Update">
-        <param name="cache">
-            <instance type="Magento\App\Cache\Type\Layout" />
-        </param>
+        <arguments>
+            <argument name="cache" xsi:type="object">Magento\App\Cache\Type\Layout</argument>
+        </arguments>
     </type>
     <virtualType name="layoutFileSourceBaseFiltered" type="Magento\View\Layout\File\Source\Decorator\ModuleOutput">
-        <param name="subject">
-            <instance type="Magento\View\Layout\File\Source\Base" />
-        </param>
+        <arguments>
+            <argument name="subject" xsi:type="object">Magento\View\Layout\File\Source\Base</argument>
+        </arguments>
     </virtualType>
     <virtualType name="layoutFileSourceBaseSorted" type="Magento\View\Layout\File\Source\Decorator\ModuleDependency">
-        <param name="subject">
-            <instance type="layoutFileSourceBaseFiltered" />
-        </param>
+        <arguments>
+            <argument name="subject" xsi:type="object">layoutFileSourceBaseFiltered</argument>
+        </arguments>
     </virtualType>
     <virtualType name="layoutFileSourceThemeFiltered" type="Magento\View\Layout\File\Source\Decorator\ModuleOutput">
-        <param name="subject">
-            <instance type="Magento\View\Layout\File\Source\Theme" />
-        </param>
+        <arguments>
+            <argument name="subject" xsi:type="object">Magento\View\Layout\File\Source\Theme</argument>
+        </arguments>
     </virtualType>
     <virtualType name="layoutFileSourceThemeSorted" type="Magento\View\Layout\File\Source\Decorator\ModuleDependency">
-        <param name="subject">
-            <instance type="layoutFileSourceThemeFiltered" />
-        </param>
+        <arguments>
+            <argument name="subject" xsi:type="object">layoutFileSourceThemeFiltered</argument>
+        </arguments>
     </virtualType>
     <virtualType name="layoutFileSourceOverrideBaseFiltered" type="Magento\View\Layout\File\Source\Decorator\ModuleOutput">
-        <param name="subject">
-            <instance type="Magento\View\Layout\File\Source\Override\Base" />
-        </param>
+        <arguments>
+            <argument name="subject" xsi:type="object">Magento\View\Layout\File\Source\Override\Base</argument>
+        </arguments>
     </virtualType>
     <virtualType name="layoutFileSourceOverrideBaseSorted" type="Magento\View\Layout\File\Source\Decorator\ModuleDependency">
-        <param name="subject">
-            <instance type="layoutFileSourceOverrideBaseFiltered" />
-        </param>
+        <arguments>
+            <argument name="subject" xsi:type="object">layoutFileSourceOverrideBaseFiltered</argument>
+        </arguments>
     </virtualType>
     <virtualType name="layoutFileSourceOverrideThemeFiltered" type="Magento\View\Layout\File\Source\Decorator\ModuleOutput">
-        <param name="subject">
-            <instance type="Magento\View\Layout\File\Source\Override\Theme" />
-        </param>
+        <arguments>
+            <argument name="subject" xsi:type="object">Magento\View\Layout\File\Source\Override\Theme</argument>
+        </arguments>
     </virtualType>
     <virtualType name="layoutFileSourceOverrideThemeSorted" type="Magento\View\Layout\File\Source\Decorator\ModuleDependency">
-        <param name="subject">
-            <instance type="layoutFileSourceOverrideThemeFiltered" />
-        </param>
+        <arguments>
+            <argument name="subject" xsi:type="object">layoutFileSourceOverrideThemeFiltered</argument>
+        </arguments>
     </virtualType>
     <type name="Magento\View\Layout\File\Source\Aggregated">
-        <param name="baseFiles">
-            <instance type="layoutFileSourceBaseSorted" />
-        </param>
-        <param name="themeFiles">
-            <instance type="layoutFileSourceThemeSorted" />
-        </param>
-        <param name="overrideBaseFiles">
-            <instance type="layoutFileSourceOverrideBaseSorted" />
-        </param>
-        <param name="overrideThemeFiles">
-            <instance type="layoutFileSourceOverrideThemeSorted" />
-        </param>
+        <arguments>
+            <argument name="baseFiles" xsi:type="object">layoutFileSourceBaseSorted</argument>
+            <argument name="themeFiles" xsi:type="object">layoutFileSourceThemeSorted</argument>
+            <argument name="overrideBaseFiles" xsi:type="object">layoutFileSourceOverrideBaseSorted</argument>
+            <argument name="overrideThemeFiles" xsi:type="object">layoutFileSourceOverrideThemeSorted</argument>
+        </arguments>
     </type>
     <type name="Magento\View\Design\Theme\Image">
-        <param name="uploader">
-            <instance type="Magento\View\Design\Theme\Image\Uploader\Proxy" />
-        </param>
+        <arguments>
+            <argument name="uploader" xsi:type="object">Magento\View\Design\Theme\Image\Uploader\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Phrase\Renderer\Composite">
-        <param name="renderers">
-            <instance type="Magento\Phrase\Renderer\Translate" />
-        </param>
+        <arguments>
+            <argument name="renderers" xsi:type="array">
+                <item name="translation" xsi:type="object">Magento\Phrase\Renderer\Translate</item>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Phrase\Renderer\Translate">
-        <param name="translator">
-            <instance type="Magento\Translate" />
-        </param>
+        <arguments>
+            <argument name="translator" xsi:type="object">Magento\Translate</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\Translate\Inline\Parser">
-        <param name="inputFilter">
-            <instance type="Magento\Core\Model\Input\Filter\MaliciousCode" />
-        </param>
+        <arguments>
+            <argument name="inputFilter" xsi:type="object">Magento\Core\Model\Input\Filter\MaliciousCode</argument>
+        </arguments>
     </type>
     <type name="Magento\App\Config\ScopePool">
-        <param name="cache">
-            <instance type="Magento\App\Cache\Type\Config" />
-        </param>
+        <arguments>
+            <argument name="cache" xsi:type="object">Magento\App\Cache\Type\Config</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\Config\Scope\Reader\Website">
-        <param name="scopePool">
-            <instance type="Magento\App\Config\ScopePool\Proxy" />
-        </param>
+        <arguments>
+            <argument name="scopePool" xsi:type="object">Magento\App\Config\ScopePool\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\Config\Scope\Reader\Store">
-        <param name="scopePool">
-            <instance type="Magento\App\Config\ScopePool\Proxy" />
-        </param>
+        <arguments>
+            <argument name="scopePool" xsi:type="object">Magento\App\Config\ScopePool\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\App\Config\Initial\SchemaLocator">
-        <param name="moduleName">
-            <value>Magento_Core</value>
-        </param>
+        <arguments>
+            <argument name="moduleName" xsi:type="string">Magento_Core</argument>
+        </arguments>
     </type>
     <type name="Magento\App\Config\Initial\Reader">
-        <param name="converter">
-            <instance type="Magento\App\Config\Initial\Converter" />
-        </param>
+        <arguments>
+            <argument name="converter" xsi:type="object">Magento\App\Config\Initial\Converter</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\Config\Scope\ReaderPool">
-        <param name="default">
-            <instance type="Magento\Core\Model\Config\Scope\Reader\DefaultReader" />
-        </param>
-        <param name="website">
-            <instance type="Magento\Core\Model\Config\Scope\Reader\Website" />
-        </param>
-        <param name="store">
-            <instance type="Magento\Core\Model\Config\Scope\Reader\Store" />
-        </param>
+        <arguments>
+            <argument name="default" xsi:type="object">Magento\Core\Model\Config\Scope\Reader\DefaultReader</argument>
+            <argument name="website" xsi:type="object">Magento\Core\Model\Config\Scope\Reader\Website</argument>
+            <argument name="store" xsi:type="object">Magento\Core\Model\Config\Scope\Reader\Store</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\App\Router\Base">
-        <param name="routerId">
-            <value>standard</value>
-        </param>
+        <arguments>
+            <argument name="routerId" xsi:type="string">standard</argument>
+        </arguments>
     </type>
     <type name="Magento\App\Router\NoRouteHandlerList">
-        <param name="handlerClassesList">
-            <array>
-                <item key="default">
-                    <array>
-                        <item key="instance"><value>Magento\Core\App\Router\NoRouteHandler</value></item>
-                        <item key="sortOrder"><value>100</value></item>
-                    </array>
+        <arguments>
+            <argument name="handlerClassesList" xsi:type="array">
+                <item name="default" xsi:type="array">
+                    <item name="instance" xsi:type="string">Magento\Core\App\Router\NoRouteHandler</item>
+                    <item name="sortOrder" xsi:type="string">100</item>
                 </item>
-            </array>
-        </param>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\Session\Validator">
-        <param name="skippedUserAgentList">
-            <array>
-                <item key="flash"><value>Shockwave Flash</value></item>
-                <item key="flash_mac"><value><![CDATA[Adobe Flash Player\s{1,}\w{1,10}]]></value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="skippedUserAgentList" xsi:type="array">
+                <item name="flash" xsi:type="string">Shockwave Flash</item>
+                <item name="flash_mac" xsi:type="string"><![CDATA[Adobe Flash Player\s{1,}\w{1,10}]]></item>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\View\Design">
-        <param name="themes">
-            <array>
-                <item key="frontend"><value>magento_plushe</value></item>
-                <item key="adminhtml"><value>magento_backend</value></item>
-                <item key="install"><value>magento_basic</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="themes" xsi:type="array">
+                <item name="frontend" xsi:type="string">magento_plushe</item>
+                <item name="adminhtml" xsi:type="string">magento_backend</item>
+                <item name="install" xsi:type="string">magento_basic</item>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\View\Publisher">
-        <param name="preProcessor">
-            <instance type="Magento\View\Asset\PreProcessor\Composite" />
-        </param>
-        <param name="allowDuplication">
-            <value type="bool">true</value>
-        </param>
+        <arguments>
+            <argument name="preProcessor" xsi:type="object">Magento\View\Asset\PreProcessor\Composite</argument>
+            <argument name="allowDuplication" xsi:type="boolean">true</argument>
+        </arguments>
     </type>
     <type name="Magento\View\Asset\PreProcessor\Composite">
-        <param name="preProcessorsConfig">
-            <array>
-                <item key="css_preprocessor">
-                    <array>
-                        <item key="class"><value>Magento\Css\PreProcessor\Composite</value></item>
-                        <item key="asset_type"><value>css</value></item>
-                    </array>
+        <arguments>
+            <argument name="preProcessorsConfig" xsi:type="array">
+                <item name="css_preprocessor" xsi:type="array">
+                    <item name="class" xsi:type="string">Magento\Css\PreProcessor\Composite</item>
+                    <item name="asset_type" xsi:type="string">css</item>
                 </item>
-            </array>
-        </param>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Css\PreProcessor\Composite">
-        <param name="preProcessors">
-            <array>
-                <item key="css_source_processor"><value>Magento\Css\PreProcessor\Less</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="preProcessors" xsi:type="array">
+                <item name="css_source_processor" xsi:type="string">Magento\Css\PreProcessor\Less</item>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Object\Copy\Config\Reader">
-        <param name="fileName">
-            <value>fieldset.xml</value>
-        </param>
-        <param name="schemaLocator">
-            <instance type="Magento\Object\Copy\Config\SchemaLocator" />
-        </param>
+        <arguments>
+            <argument name="fileName" xsi:type="string">fieldset.xml</argument>
+            <argument name="schemaLocator" xsi:type="object">Magento\Object\Copy\Config\SchemaLocator</argument>
+        </arguments>
     </type>
     <type name="Magento\Object\Copy\Config\SchemaLocator">
-        <param name="schema">
-            <value>lib/Magento/Object/etc/fieldset.xsd</value>
-        </param>
-        <param name="perFileSchema">
-            <value>lib/Magento/Object/etc/fieldset_file.xsd</value>
-        </param>
+        <arguments>
+            <argument name="schema" xsi:type="string">lib/Magento/Object/etc/fieldset.xsd</argument>
+            <argument name="perFileSchema" xsi:type="string">lib/Magento/Object/etc/fieldset_file.xsd</argument>
+        </arguments>
     </type>
     <type name="Magento\Object\Copy\Config\Data">
-        <param name="reader">
-            <instance type="Magento\Object\Copy\Config\Reader" />
-        </param>
-        <param name="cacheId">
-            <value>fieldset_config</value>
-        </param>
+        <arguments>
+            <argument name="reader" xsi:type="object">Magento\Object\Copy\Config\Reader</argument>
+            <argument name="cacheId" xsi:type="string">fieldset_config</argument>
+        </arguments>
     </type>
     <type name="Magento\Locale\Hierarchy\Config">
-        <param name="reader">
-            <instance type="Magento\Core\Model\Locale\Hierarchy\Config\Reader" />
-        </param>
+        <arguments>
+            <argument name="reader" xsi:type="object">Magento\Core\Model\Locale\Hierarchy\Config\Reader</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\Resource\Helper">
-        <param name="modulePrefix">
-            <value>core</value>
-        </param>
+        <arguments>
+            <argument name="modulePrefix" xsi:type="string">core</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Helper\Data">
-        <param name="locale">
-            <instance type="Magento\Core\Model\Locale\Proxy" />
-        </param>
+        <arguments>
+            <argument name="locale" xsi:type="object">Magento\Core\Model\Locale\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\Resource\Setup\Migration">
-        <param name="confPathToMapFile">
-            <value>app/etc/aliases_to_classes_map.json</value>
-        </param>
+        <arguments>
+            <argument name="confPathToMapFile" xsi:type="string">app/etc/aliases_to_classes_map.json</argument>
+        </arguments>
     </type>
     <type name="Magento\Encryption\Encryptor">
-        <param name="cryptKey">
-            <value type="argument">Magento\Encryption\Encryptor::PARAM_CRYPT_KEY</value>
-        </param>
+        <arguments>
+            <argument name="cryptKey" xsi:type="init_parameter">Magento\Encryption\Encryptor::PARAM_CRYPT_KEY</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\Session\Config">
-        <param name="savePath">
-            <value type="argument">Magento\Core\Model\Session\Config::PARAM_SESSION_SAVE_PATH</value>
-        </param>
-        <param name="cacheLimiter">
-            <value type="argument">Magento\Core\Model\Session\Config::PARAM_SESSION_CACHE_LIMITER</value>
-        </param>
-        <param name="saveMethod">
-            <value type="argument">Magento\Core\Model\Session\Config::PARAM_SESSION_SAVE_METHOD</value>
-        </param>
+        <arguments>
+            <argument name="savePath" xsi:type="init_parameter">Magento\Core\Model\Session\Config::PARAM_SESSION_SAVE_PATH</argument>
+            <argument name="cacheLimiter" xsi:type="init_parameter">Magento\Core\Model\Session\Config::PARAM_SESSION_CACHE_LIMITER</argument>
+            <argument name="saveMethod" xsi:type="init_parameter">Magento\Core\Model\Session\Config::PARAM_SESSION_SAVE_METHOD</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\StoreManager">
-        <param name="request">
-            <instance type="Magento\App\Request\Http\Proxy" />
-        </param>
-        <param name="helper">
-            <instance type="Magento\Core\Helper\Data\Proxy" />
-        </param>
+        <arguments>
+            <argument name="request" xsi:type="object">Magento\App\Request\Http\Proxy</argument>
+            <argument name="helper" xsi:type="object">Magento\Core\Helper\Data\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\Config\Scope\Processor\Placeholder">
-        <param name="request">
-            <instance type="Magento\App\Request\Http\Proxy" />
-        </param>
+        <arguments>
+            <argument name="request" xsi:type="object">Magento\App\Request\Http\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\App\Helper\Context">
-        <param name="urlBuilder">
-            <instance type="Magento\UrlInterface\Proxy" />
-        </param>
-        <param name='httpRequest'>
-            <instance type="Magento\App\Request\Http\Proxy" />
-        </param>
+        <arguments>
+            <argument name="urlBuilder" xsi:type="object">Magento\UrlInterface\Proxy</argument>
+            <argument name="httpRequest" xsi:type="object">Magento\App\Request\Http\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Helper\File\Storage">
-        <param name="storage">
-            <instance type="Magento\Core\Model\File\Storage\Proxy" />
-        </param>
+        <arguments>
+            <argument name="storage" xsi:type="object">Magento\Core\Model\File\Storage\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Helper\File\Storage\Database">
-        <param name="fileStorage">
-            <instance type="Magento\Core\Model\File\Storage\File\Proxy" />
-        </param>
+        <arguments>
+            <argument name="fileStorage" xsi:type="object">Magento\Core\Model\File\Storage\File\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\View\TemplateEngineFactory">
         <plugin name="debug_hints" type="Magento\Core\Model\TemplateEngine\Plugin\DebugHints" sortOrder="10"/>
-        <param name="engines">
-            <array>
-                <item key="phtml"><value>Magento\View\TemplateEngine\Php</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="engines" xsi:type="array">
+                <item name="phtml" xsi:type="string">Magento\View\TemplateEngine\Php</item>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Image">
-        <param name="adapter">
-            <instance type="Magento\Image\Adapter\Gd2"/>
-        </param>
+        <arguments>
+            <argument name="adapter" xsi:type="object">Magento\Image\Adapter\Gd2</argument>
+        </arguments>
     </type>
     <type name="Magento\View\Layout\PageType\Config\Reader">
-        <param name="fileName">
-            <value>page_types.xml</value>
-        </param>
-        <param name="converter">
-            <instance type="Magento\View\Layout\PageType\Config\Converter" />
-        </param>
-        <param name="schemaLocator">
-            <instance type="Magento\View\Layout\PageType\Config\SchemaLocator" />
-        </param>
-        <param name="defaultScope">
-            <value>frontend</value>
-        </param>
+        <arguments>
+            <argument name="fileName" xsi:type="string">page_types.xml</argument>
+            <argument name="converter" xsi:type="object">Magento\View\Layout\PageType\Config\Converter</argument>
+            <argument name="schemaLocator" xsi:type="object">Magento\View\Layout\PageType\Config\SchemaLocator</argument>
+            <argument name="defaultScope" xsi:type="string">frontend</argument>
+        </arguments>
     </type>
     <virtualType name="Magento\View\Layout\PageType\Config\Data" type="Magento\Config\Data">
-        <param name='reader'>
-            <instance type="Magento\View\Layout\PageType\Config\Reader" />
-        </param>
-        <param name="cacheId">
-            <value>page_types_config</value>
-        </param>
+        <arguments>
+            <argument name="reader" xsi:type="object">Magento\View\Layout\PageType\Config\Reader</argument>
+            <argument name="cacheId" xsi:type="string">page_types_config</argument>
+        </arguments>
     </virtualType>
     <type name="Magento\View\Layout\PageType\Config">
-        <param name="dataStorage">
-            <instance type="Magento\View\Layout\PageType\Config\Data" />
-        </param>
+        <arguments>
+            <argument name="dataStorage" xsi:type="object">Magento\View\Layout\PageType\Config\Data</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\Store\Storage\Db">
-        <param name="url">
-            <instance type="Magento\Backend\Model\UrlInterface\Proxy" />
-        </param>
+        <arguments>
+            <argument name="url" xsi:type="object">Magento\Backend\Model\UrlInterface\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\App">
-        <param name="frontController">
-            <instance type="Magento\App\FrontController\Proxy" />
-        </param>
+        <arguments>
+            <argument name="frontController" xsi:type="object">Magento\App\FrontController\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\App\Area">
-        <param name="translator">
-            <instance type="Magento\Translate" />
-        </param>
-        <param name="design">
-            <instance type="Magento\Core\Model\Design\Proxy" />
-        </param>
+        <arguments>
+            <argument name="translator" xsi:type="object">Magento\Translate</argument>
+            <argument name="design" xsi:type="object">Magento\Core\Model\Design\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\App\FrontController">
         <plugin name="install" type="Magento\Module\FrontController\Plugin\Install" sortOrder="40"/>
@@ -544,81 +474,73 @@
         <plugin name="designLoader" type="Magento\Core\App\Action\Plugin\Design" sortOrder="30"/>
     </type>
     <type name="Magento\Core\Model\Locale">
-        <param name="dateModel">
-            <instance type="Magento\Core\Model\Date\Proxy" />
-        </param>
+        <arguments>
+            <argument name="dateModel" xsi:type="object">Magento\Core\Model\Date\Proxy</argument>
+        </arguments>
     </type>
     <virtualType name="Magento\Core\Model\Session\Storage" type="Magento\Session\Storage">
-        <param name="namespace">
-            <value>core</value>
-        </param>
+        <arguments>
+            <argument name="namespace" xsi:type="string">core</argument>
+        </arguments>
     </virtualType>
     <type name="Magento\Core\Model\Session">
-        <param name="storage">
-            <instance type="Magento\Core\Model\Session\Storage" />
-        </param>
+        <arguments>
+            <argument name="storage" xsi:type="object">Magento\Core\Model\Session\Storage</argument>
+        </arguments>
     </type>
     <virtualType name="Magento\Message\Session\Storage" type="Magento\Session\Storage">
-        <param name="namespace">
-            <value>message</value>
-        </param>
+        <arguments>
+            <argument name="namespace" xsi:type="string">message</argument>
+        </arguments>
     </virtualType>
     <type name="Magento\Message\Session">
-        <param name="storage">
-            <instance type="Magento\Message\Session\Storage" />
-        </param>
+        <arguments>
+            <argument name="storage" xsi:type="object">Magento\Message\Session\Storage</argument>
+        </arguments>
     </type>
     <type name="Magento\View\Asset\MergeService">
         <plugin name="cleanMergedJsCss" type="Magento\Core\Model\Asset\Plugin\CleanMergedJsCss"/>
     </type>
     <type name="Magento\Core\Model\Url\ScopeResolver">
-        <param name="areaCode">
-            <value>frontend</value>
-        </param>
+        <arguments>
+            <argument name="areaCode" xsi:type="string">frontend</argument>
+        </arguments>
     </type>
     <type name="Magento\Less\PreProcessor\Instruction\MagentoImport">
-        <param name="fileSource">
-            <instance type="Magento\Less\File\Source\Aggregated" />
-        </param>
+        <arguments>
+            <argument name="fileSource" xsi:type="object">Magento\Less\File\Source\Aggregated</argument>
+        </arguments>
     </type>
     <type name="Magento\Less\File\Source\Aggregated">
-        <param name="libraryFiles">
-            <instance type="Magento\Less\File\Source\Library" />
-        </param>
-        <param name="baseFiles">
-            <instance type="Magento\Less\File\Source\Base" />
-        </param>
-        <param name="themeFiles">
-            <instance type="Magento\Less\File\Source\Theme" />
-        </param>
+        <arguments>
+            <argument name="libraryFiles" xsi:type="object">Magento\Less\File\Source\Library</argument>
+            <argument name="baseFiles" xsi:type="object">Magento\Less\File\Source\Base</argument>
+            <argument name="themeFiles" xsi:type="object">Magento\Less\File\Source\Theme</argument>
+        </arguments>
     </type>
     <type name="Magento\Css\PreProcessor\Less">
         <plugin name="process_less" type="Magento\Css\PreProcessor\Cache\Plugin" sortOrder="10"/>
     </type>
     <type name="Magento\Less\PreProcessor">
         <plugin name="process_less_instructions" type="Magento\Css\PreProcessor\Cache\Plugin" sortOrder="10"/>
-        <param name="preProcessors">
-            <array>
-                <item key="import">
-                    <array>
-                        <item key="class"><value>Magento\Less\PreProcessor\Instruction\Import</value></item>
-                    </array>
+        <arguments>
+            <argument name="preProcessors" xsi:type="array">
+                <item name="import" xsi:type="array">
+                    <item name="class" xsi:type="string">Magento\Less\PreProcessor\Instruction\Import</item>
                 </item>
-                <item key="magento_import">
-                    <array>
-                        <item key="class"><value>Magento\Less\PreProcessor\Instruction\MagentoImport</value></item>
-                    </array>
+                <item name="magento_import" xsi:type="array">
+                    <item name="class" xsi:type="string">Magento\Less\PreProcessor\Instruction\MagentoImport</item>
                 </item>
-            </array>
-        </param>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\App\Config\Initial\Converter">
-        <param name="nodeMap">
-            <array>
-                <item key="default"><value>/config/default</value></item>
-                <item key="stores"><value>/config/stores</value></item>
-                <item key="websites"><value>/config/websites</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="nodeMap" xsi:type="array">
+                <item name="default" xsi:type="string">/config/default</item>
+                <item name="stores" xsi:type="string">/config/stores</item>
+                <item name="websites" xsi:type="string">/config/websites</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Core/etc/frontend/di.xml b/app/code/Magento/Core/etc/frontend/di.xml
index 9b1c51a1565..7142bb9148b 100644
--- a/app/code/Magento/Core/etc/frontend/di.xml
+++ b/app/code/Magento/Core/etc/frontend/di.xml
@@ -23,16 +23,16 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Core\Model\Session">
-        <param name="sessionName">
-            <value>frontend</value>
-        </param>
+        <arguments>
+            <argument name="sessionName" xsi:type="string">frontend</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\Layout">
-        <param name="area">
-            <value>frontend</value>
-        </param>
+        <arguments>
+            <argument name="area" xsi:type="string">frontend</argument>
+        </arguments>
     </type>
     <type name="Magento\App\FrontController">
         <plugin name="requestPreprocessor" type="Magento\Core\App\FrontController\Plugin\RequestPreprocessor" sortOrder="50"/>
@@ -42,23 +42,19 @@
         <plugin name="lastUrl" type="Magento\Core\App\Action\Plugin\LastUrl" sortOrder="70"/>
     </type>
     <type name="Magento\App\RouterList" shared="true">
-        <param name="routerList">
-            <array>
-                <item key="standard">
-                    <array>
-                        <item key="instance"><value>Magento\Core\App\Router\Base</value></item>
-                        <item key="disable"><value type="bool">false</value></item>
-                        <item key="sortOrder"><value>20</value></item>
-                    </array>
+        <arguments>
+            <argument name="routerList" xsi:type="array">
+                <item name="standard" xsi:type="array">
+                    <item name="instance" xsi:type="string">Magento\Core\App\Router\Base</item>
+                    <item name="disable" xsi:type="boolean">false</item>
+                    <item name="sortOrder" xsi:type="string">20</item>
                 </item>
-                <item key="default">
-                    <array>
-                        <item key="instance"><value>Magento\App\Router\DefaultRouter</value></item>
-                        <item key="disable"><value type="bool">false</value></item>
-                        <item key="sortOrder"><value>100</value></item>
-                    </array>
+                <item name="default" xsi:type="array">
+                    <item name="instance" xsi:type="string">Magento\App\Router\DefaultRouter</item>
+                    <item name="disable" xsi:type="boolean">false</item>
+                    <item name="sortOrder" xsi:type="string">100</item>
                 </item>
-            </array>
-        </param>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Core/etc/layouts.xsd b/app/code/Magento/Core/etc/layouts.xsd
index a03c770d642..e982e10f9b3 100644
--- a/app/code/Magento/Core/etc/layouts.xsd
+++ b/app/code/Magento/Core/etc/layouts.xsd
@@ -27,7 +27,7 @@
 -->
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
 
-    <xs:redefine schemaLocation="types.xsd">
+    <xs:redefine schemaLocation="../../../../../lib/Magento/Data/etc/argument/types.xsd">
         <xs:complexType name="argumentType" abstract="true" mixed="true">
             <xs:complexContent>
                 <xs:extension base="argumentType">
@@ -39,6 +39,44 @@
         </xs:complexType>
     </xs:redefine>
 
+    <xs:complexType name="options">
+        <xs:complexContent>
+            <xs:extension base="argumentType">
+                <xs:attribute name="model" use="required"/>
+            </xs:extension>
+        </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="url" mixed="true">
+        <xs:complexContent>
+            <xs:extension base="argumentType">
+                <xs:sequence minOccurs="0">
+                    <xs:element name="param" minOccurs="0" maxOccurs="unbounded">
+                        <xs:complexType mixed="true">
+                            <xs:attribute name="name" type="xs:string" use="required"/>
+                        </xs:complexType>
+                    </xs:element>
+                </xs:sequence>
+                <xs:attribute name="path" use="required"/>
+            </xs:extension>
+        </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="helper" mixed="true">
+        <xs:complexContent>
+            <xs:extension base="argumentType">
+                <xs:sequence minOccurs="0">
+                    <xs:element name="param" minOccurs="0" maxOccurs="unbounded">
+                        <xs:complexType mixed="true">
+                            <xs:attribute name="name" type="xs:string" use="required"/>
+                        </xs:complexType>
+                    </xs:element>
+                </xs:sequence>
+                <xs:attribute name="helper" use="required"/>
+            </xs:extension>
+        </xs:complexContent>
+    </xs:complexType>
+
     <xs:complexType name="layoutType">
         <xs:annotation>
             <xs:documentation>
@@ -65,12 +103,6 @@
         </xs:attribute>
     </xs:complexType>
 
-    <xs:complexType name="argumentsType">
-        <xs:sequence>
-            <xs:element ref="argument" minOccurs="0" maxOccurs="unbounded"/>
-        </xs:sequence>
-    </xs:complexType>
-
     <xs:complexType name="updaterType">
         <xs:annotation>
             <xs:documentation>
@@ -85,13 +117,6 @@
         </xs:simpleContent>
     </xs:complexType>
 
-    <xs:element name="argument" type="argumentType">
-        <xs:key name="argumentItemName">
-            <xs:selector xpath="item"></xs:selector>
-            <xs:field xpath="@name"></xs:field>
-        </xs:key>
-    </xs:element>
-
     <xs:element type="actionType" name="action">
         <xs:annotation>
             <xs:documentation>
@@ -111,7 +136,7 @@
             </xs:documentation>
         </xs:annotation>
         <xs:key name="blockArgumentName">
-            <xs:selector xpath="./argumens/argument"></xs:selector>
+            <xs:selector xpath="./arguments/argument"></xs:selector>
             <xs:field xpath="@name"></xs:field>
         </xs:key>
     </xs:element>
@@ -123,7 +148,7 @@
             </xs:documentation>
         </xs:annotation>
         <xs:unique name="referenceBlockArgumentName">
-            <xs:selector xpath="./argumens/argument"></xs:selector>
+            <xs:selector xpath="./arguments/argument"></xs:selector>
             <xs:field xpath="@name"></xs:field>
         </xs:unique>
     </xs:element>
@@ -242,7 +267,12 @@
             </xs:documentation>
         </xs:annotation>
         <xs:sequence>
-            <xs:element ref="argument" minOccurs="0" maxOccurs="unbounded"/>
+            <xs:element name="argument" type="argumentType" minOccurs="0" maxOccurs="unbounded">
+                <xs:key name="actionArgumentItemName">
+                    <xs:selector xpath="item"></xs:selector>
+                    <xs:field xpath="@name"></xs:field>
+                </xs:key>
+            </xs:element>
         </xs:sequence>
         <xs:attribute type="xs:string" name="method" use="required"/>
         <xs:attribute type="xs:string" name="ifconfig" use="optional"/>
diff --git a/app/code/Magento/Core/etc/types.xsd b/app/code/Magento/Core/etc/types.xsd
deleted file mode 100644
index 3c3e9554a26..00000000000
--- a/app/code/Magento/Core/etc/types.xsd
+++ /dev/null
@@ -1,123 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Academic Free License (AFL 3.0)
- * that is bundled with this package in the file LICENSE_AFL.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/afl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Core
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
- */
--->
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" >
-
-    <xs:complexType name="argumentType" abstract="true" mixed="true">
-        <xs:attribute name="name" use="required"/>
-    </xs:complexType>
-
-    <xs:complexType name="simpleType" mixed="true">
-        <xs:complexContent>
-            <xs:extension base="argumentType">
-                <xs:sequence>
-                    <xs:element name="value" type="xs:string" minOccurs="0" maxOccurs="1"/>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="complexType" mixed="true">
-        <xs:complexContent>
-            <xs:extension base="argumentType"/>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="array" mixed="true">
-        <xs:complexContent>
-            <xs:extension base="complexType">
-                <xs:sequence>
-                    <xs:element name="item" type="argumentType" minOccurs="0" maxOccurs="unbounded"/>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="string" mixed="true">
-        <xs:complexContent>
-            <xs:extension base="simpleType">
-                <xs:attribute name="translate" use="optional" fixed="true" type="xs:boolean"/>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="boolean" mixed="true">
-        <xs:complexContent>
-            <xs:extension base="simpleType"/>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="object" mixed="true">
-        <xs:complexContent>
-            <xs:extension base="simpleType"/>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="number" mixed="true">
-        <xs:complexContent>
-            <xs:extension base="simpleType"/>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="options" mixed="true">
-        <xs:complexContent>
-            <xs:extension base="complexType">
-                <xs:attribute name="model" use="required"/>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="url" mixed="true">
-        <xs:complexContent>
-            <xs:extension base="complexType">
-                <xs:sequence minOccurs="0">
-                    <xs:element name="param" minOccurs="0" maxOccurs="unbounded">
-                        <xs:complexType mixed="true">
-                            <xs:attribute name="name" type="xs:string" use="required"/>
-                        </xs:complexType>
-                    </xs:element>
-                </xs:sequence>
-                <xs:attribute name="path" use="required"/>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="helper" mixed="true">
-        <xs:complexContent>
-            <xs:extension base="complexType">
-                <xs:sequence minOccurs="0">
-                    <xs:element name="param" minOccurs="0" maxOccurs="unbounded">
-                        <xs:complexType mixed="true">
-                            <xs:attribute name="name" type="xs:string" use="required"/>
-                        </xs:complexType>
-                    </xs:element>
-                </xs:sequence>
-                <xs:attribute name="helper" use="required"/>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-</xs:schema>
diff --git a/app/code/Magento/Cron/Model/Observer.php b/app/code/Magento/Cron/Model/Observer.php
index 67beb5ba9bb..6bd676bb828 100644
--- a/app/code/Magento/Cron/Model/Observer.php
+++ b/app/code/Magento/Cron/Model/Observer.php
@@ -138,10 +138,7 @@ class Observer
         foreach ($jobGroupsRoot as $groupId => $jobsRoot) {
             if (
                 $this->_request->getParam('group') === null
-                && $this->_coreStoreConfig->getConfig(
-                    'system/cron/' . $groupId . '/use_separate_process',
-                    'default'
-                ) == 1
+                && $this->_coreStoreConfig->getConfig('system/cron/' . $groupId . '/use_separate_process') == 1
             ) {
                 $this->_shell->executeInBackground(
                     '"' . PHP_BINARY . '" -f ' . BP . DIRECTORY_SEPARATOR
@@ -192,8 +189,7 @@ class Observer
     protected function _runJob($scheduledTime, $currentTime, $jobConfig, $schedule, $groupId)
     {
         $scheduleLifetime = (int)$this->_coreStoreConfig->getConfig(
-            'system/cron/' . $groupId . '/' . self::XML_PATH_SCHEDULE_LIFETIME,
-            'default'
+            'system/cron/' . $groupId . '/' . self::XML_PATH_SCHEDULE_LIFETIME
         );
         $scheduleLifetime = $scheduleLifetime * self::SECONDS_IN_MINUTE;
         if ($scheduledTime < $currentTime - $scheduleLifetime) {
@@ -258,8 +254,7 @@ class Observer
          */
         $lastRun = (int)$this->_app->loadCache(self::CACHE_KEY_LAST_SCHEDULE_GENERATE_AT);
         $rawSchedulePeriod = (int)$this->_coreStoreConfig->getConfig(
-            'system/cron/' . $groupId . '/' . self::XML_PATH_SCHEDULE_GENERATE_EVERY,
-            'default'
+            'system/cron/' . $groupId . '/' . self::XML_PATH_SCHEDULE_GENERATE_EVERY
         );
         $schedulePeriod = $rawSchedulePeriod * self::SECONDS_IN_MINUTE;
         if ($lastRun > time() - $schedulePeriod) {
@@ -298,8 +293,7 @@ class Observer
     protected function _generateJobs($jobs, $exists, $groupId)
     {
         $scheduleAheadFor = (int)$this->_coreStoreConfig->getConfig(
-            'system/cron/' . $groupId . '/' . self::XML_PATH_SCHEDULE_AHEAD_FOR,
-            'default'
+            'system/cron/' . $groupId . '/' . self::XML_PATH_SCHEDULE_AHEAD_FOR
         );
         $scheduleAheadFor = $scheduleAheadFor * self::SECONDS_IN_MINUTE;
         /**
@@ -310,7 +304,7 @@ class Observer
         foreach ($jobs as $jobCode => $jobConfig) {
             $cronExpr = null;
             if (isset($jobConfig['config_path'])) {
-                $cronExpr = $this->_coreStoreConfig->getConfig($jobConfig['config_path'], 'default');
+                $cronExpr = $this->_coreStoreConfig->getConfig($jobConfig['config_path']);
             } elseif (empty($cronExpr) && isset($jobConfig['schedule'])) {
                 $cronExpr = $jobConfig['schedule'];
             }
@@ -352,8 +346,7 @@ class Observer
         // check if history cleanup is needed
         $lastCleanup = (int)$this->_app->loadCache(self::CACHE_KEY_LAST_HISTORY_CLEANUP_AT);
         $historyCleanUp = (int)$this->_coreStoreConfig->getConfig(
-            'system/cron/' . $groupId . '/' . self::XML_PATH_HISTORY_CLEANUP_EVERY,
-            'default'
+            'system/cron/' . $groupId . '/' . self::XML_PATH_HISTORY_CLEANUP_EVERY
         );
         if ($lastCleanup > time() - $historyCleanUp * self::SECONDS_IN_MINUTE) {
             return $this;
@@ -370,12 +363,10 @@ class Observer
             )))->load();
 
         $historySuccess = (int)$this->_coreStoreConfig->getConfig(
-            'system/cron/' . $groupId . '/' . self::XML_PATH_HISTORY_SUCCESS,
-            'default'
+            'system/cron/' . $groupId . '/' . self::XML_PATH_HISTORY_SUCCESS
         );
         $historyFailure = (int)$this->_coreStoreConfig->getConfig(
-            'system/cron/' . $groupId . '/' . self::XML_PATH_HISTORY_FAILURE,
-            'default'
+            'system/cron/' . $groupId . '/' . self::XML_PATH_HISTORY_FAILURE
         );
         $historyLifetimes = array(
             Schedule::STATUS_SUCCESS => $historySuccess * self::SECONDS_IN_MINUTE,
diff --git a/app/code/Magento/Cron/etc/adminhtml/system.xml b/app/code/Magento/Cron/etc/adminhtml/system.xml
index 631feee5370..933bd18b17a 100644
--- a/app/code/Magento/Cron/etc/adminhtml/system.xml
+++ b/app/code/Magento/Cron/etc/adminhtml/system.xml
@@ -33,25 +33,25 @@
                 <comment>For correct URLs generated during cron runs please make sure that Web &gt; Secure and Unsecure Base URLs are explicitly set.</comment>
                 <group id="template" translate="label" type="text" sortOrder="10" showInDefault="1" showInWebsite="0" showInStore="0">
                     <label>Cron configuration options for group: </label>
-                    <field id="schedule_generate_every" translate="label" type="text" sortOrder="10" showInDefault="1" showInWebsite="1" showInStore="1">
+                    <field id="schedule_generate_every" translate="label" type="text" sortOrder="10" showInDefault="1" showInWebsite="0" showInStore="0">
                         <label>Generate Schedules Every</label>
                     </field>
-                    <field id="schedule_ahead_for" translate="label" type="text" sortOrder="20" showInDefault="1" showInWebsite="1" showInStore="1">
+                    <field id="schedule_ahead_for" translate="label" type="text" sortOrder="20" showInDefault="1" showInWebsite="0" showInStore="0">
                         <label>Schedule Ahead for</label>
                     </field>
-                    <field id="schedule_lifetime" translate="label" type="text" sortOrder="30" showInDefault="1" showInWebsite="1" showInStore="1">
+                    <field id="schedule_lifetime" translate="label" type="text" sortOrder="30" showInDefault="1" showInWebsite="0" showInStore="0">
                         <label>Missed if Not Run Within</label>
                     </field>
-                    <field id="history_cleanup_every" translate="label" type="text" sortOrder="40" showInDefault="1" showInWebsite="1" showInStore="1">
+                    <field id="history_cleanup_every" translate="label" type="text" sortOrder="40" showInDefault="1" showInWebsite="0" showInStore="0">
                         <label>History Cleanup Every</label>
                     </field>
-                    <field id="history_success_lifetime" translate="label" type="text" sortOrder="50" showInDefault="1" showInWebsite="1" showInStore="1">
+                    <field id="history_success_lifetime" translate="label" type="text" sortOrder="50" showInDefault="1" showInWebsite="0" showInStore="0">
                         <label>Success History Lifetime</label>
                     </field>
-                    <field id="history_failure_lifetime" translate="label" type="text" sortOrder="60" showInDefault="1" showInWebsite="1" showInStore="1">
+                    <field id="history_failure_lifetime" translate="label" type="text" sortOrder="60" showInDefault="1" showInWebsite="0" showInStore="0">
                         <label>Failure History Lifetime</label>
                     </field>
-                    <field id="use_separate_process" translate="label" type="select" sortOrder="70" showInDefault="1" showInWebsite="1" showInStore="1">
+                    <field id="use_separate_process" translate="label" type="select" sortOrder="70" showInDefault="1" showInWebsite="0" showInStore="0">
                         <label>Use Separate Process</label>
                         <source_model>Magento\Backend\Model\Config\Source\Yesno</source_model>
                     </field>
diff --git a/app/code/Magento/Cron/etc/di.xml b/app/code/Magento/Cron/etc/di.xml
index 07ffb555717..d6014e064c4 100644
--- a/app/code/Magento/Cron/etc/di.xml
+++ b/app/code/Magento/Cron/etc/di.xml
@@ -23,12 +23,12 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <preference for="Magento\Cron\Model\ConfigInterface" type="Magento\Cron\Model\Config" />
     <type name="Magento\Cron\Model\Config\Reader\Db">
-        <param name="defaultReader">
-            <instance type="Magento\Core\Model\Config\Scope\Reader\DefaultReader" />
-        </param>
+        <arguments>
+            <argument name="defaultReader" xsi:type="object">Magento\Core\Model\Config\Scope\Reader\DefaultReader</argument>
+        </arguments>
     </type>
     <type name="Magento\App\Cron">
         <plugin name="application_initializer" type="Magento\Cron\App\Cron\Plugin\ApplicationInitializer" sortOrder="10"/>
diff --git a/app/code/Magento/CurrencySymbol/Block/Adminhtml/System/Currency.php b/app/code/Magento/CurrencySymbol/Block/Adminhtml/System/Currency.php
index b65276b1471..6191c7c7413 100644
--- a/app/code/Magento/CurrencySymbol/Block/Adminhtml/System/Currency.php
+++ b/app/code/Magento/CurrencySymbol/Block/Adminhtml/System/Currency.php
@@ -36,8 +36,16 @@ namespace Magento\CurrencySymbol\Block\Adminhtml\System;
 
 class Currency extends \Magento\Backend\Block\Template
 {
+    /**
+     * @var string
+     */
     protected $_template = 'system/currency/rates.phtml';
 
+    /**
+     * Prepare layout
+     *
+     * @return \Magento\View\Element\AbstractBlock
+     */
     protected function _prepareLayout()
     {
         $this->addChild('save_button', 'Magento\Backend\Block\Widget\Button', array(
@@ -67,36 +75,71 @@ class Currency extends \Magento\Backend\Block\Template
         return parent::_prepareLayout();
     }
 
+    /**
+     * Get header
+     *
+     * @return string
+     */
     public function getHeader()
     {
         return __('Manage Currency Rates');
     }
 
+    /**
+     * Get save button html
+     *
+     * @return string
+     */
     public function getSaveButtonHtml()
     {
         return $this->getChildHtml('save_button');
     }
 
+    /**
+     * Get reset button html
+     *
+     * @return string
+     */
     public function getResetButtonHtml()
     {
         return $this->getChildHtml('reset_button');
     }
 
+    /**
+     * Get import button html
+     *
+     * @return string
+     */
     public function getImportButtonHtml()
     {
         return $this->getChildHtml('import_button');
     }
 
+    /**
+     * Get services html
+     *
+     * @return string
+     */
     public function getServicesHtml()
     {
         return $this->getChildHtml('import_services');
     }
 
+    /**
+     * Get rates matrix html
+     *
+     * @return string
+     */
     public function getRatesMatrixHtml()
     {
         return $this->getChildHtml('rates_matrix');
     }
 
+    /**
+     * Get import form action url
+     *
+     * @return string
+     */
     public function getImportFormAction()
     {
         return $this->getUrl('adminhtml/*/fetchRates');
diff --git a/app/code/Magento/CurrencySymbol/Block/Adminhtml/System/Currency/Rate/Matrix.php b/app/code/Magento/CurrencySymbol/Block/Adminhtml/System/Currency/Rate/Matrix.php
index c0ed8424841..6125cb83de9 100644
--- a/app/code/Magento/CurrencySymbol/Block/Adminhtml/System/Currency/Rate/Matrix.php
+++ b/app/code/Magento/CurrencySymbol/Block/Adminhtml/System/Currency/Rate/Matrix.php
@@ -35,6 +35,9 @@ namespace Magento\CurrencySymbol\Block\Adminhtml\System\Currency\Rate;
 
 class Matrix extends \Magento\Backend\Block\Template
 {
+    /**
+     * @var string
+     */
     protected $_template = 'system/currency/rate/matrix.phtml';
 
     /**
@@ -56,6 +59,11 @@ class Matrix extends \Magento\Backend\Block\Template
         parent::__construct($context, $data);
     }
 
+    /**
+     * Prepare layout
+     *
+     * @return \Magento\View\Element\AbstractBlock
+     */
     protected function _prepareLayout()
     {
         $newRates = $this->_backendSession->getRates();
@@ -88,11 +96,22 @@ class Matrix extends \Magento\Backend\Block\Template
         return parent::_prepareLayout();
     }
 
+    /**
+     * Get rates form action
+     *
+     * @return string
+     */
     public function getRatesFormAction()
     {
         return $this->getUrl('adminhtml/*/saveRates');
     }
 
+    /**
+     * Prepare rates
+     *
+     * @param array $array
+     * @return array
+     */
     protected function _prepareRates($array)
     {
         if (!is_array($array)) {
diff --git a/app/code/Magento/CurrencySymbol/Block/Adminhtml/System/Currency/Rate/Services.php b/app/code/Magento/CurrencySymbol/Block/Adminhtml/System/Currency/Rate/Services.php
index f31a03dc27f..f16299c212f 100644
--- a/app/code/Magento/CurrencySymbol/Block/Adminhtml/System/Currency/Rate/Services.php
+++ b/app/code/Magento/CurrencySymbol/Block/Adminhtml/System/Currency/Rate/Services.php
@@ -37,7 +37,7 @@ namespace Magento\CurrencySymbol\Block\Adminhtml\System\Currency\Rate;
 class Services extends \Magento\Backend\Block\Template
 {
     /**
-     * @inherit
+     * @var string
      */
     protected $_template = 'system/currency/rate/services.phtml';
 
diff --git a/app/code/Magento/CurrencySymbol/Block/Adminhtml/System/Currencysymbol.php b/app/code/Magento/CurrencySymbol/Block/Adminhtml/System/Currencysymbol.php
index b30c0378925..fca389b8567 100644
--- a/app/code/Magento/CurrencySymbol/Block/Adminhtml/System/Currencysymbol.php
+++ b/app/code/Magento/CurrencySymbol/Block/Adminhtml/System/Currencysymbol.php
@@ -56,6 +56,8 @@ class Currencysymbol extends \Magento\Backend\Block\Widget\Form
 
     /**
      * Constructor. Initialization required variables for class instance.
+     *
+     * @return void
      */
     protected function _construct()
     {
diff --git a/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency.php b/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency.php
index 819e79d8666..2c642e25910 100644
--- a/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency.php
+++ b/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency.php
@@ -57,7 +57,7 @@ class Currency extends \Magento\Backend\App\Action
     /**
      * Init currency by currency code from request
      *
-     * @return \Magento\CurrencySymbol\Controller\Adminhtml\System\Currency
+     * @return $this
      */
     protected function _initCurrency()
     {
@@ -70,6 +70,8 @@ class Currency extends \Magento\Backend\App\Action
 
     /**
      * Currency management main page
+     *
+     * @return void
      */
     public function indexAction()
     {
@@ -81,6 +83,12 @@ class Currency extends \Magento\Backend\App\Action
         $this->_view->renderLayout();
     }
 
+    /**
+     * Fetch rates action
+     *
+     * @return void
+     * @throws \Exception|\Magento\Core\Exception
+     */
     public function fetchRatesAction()
     {
         /** @var \Magento\Backend\Model\Session $backendSession */
@@ -117,6 +125,11 @@ class Currency extends \Magento\Backend\App\Action
         $this->_redirect('adminhtml/*/');
     }
 
+    /**
+     * Save rates action
+     *
+     * @return void
+     */
     public function saveRatesAction()
     {
         $data = $this->getRequest()->getParam('rate');
@@ -147,6 +160,11 @@ class Currency extends \Magento\Backend\App\Action
         $this->_redirect('adminhtml/*/');
     }
 
+    /**
+     * Check if allowed
+     *
+     * @return bool
+     */
     protected function _isAllowed()
     {
         return $this->_authorization->isAllowed('Magento_CurrencySymbol::currency_rates');
diff --git a/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currencysymbol.php b/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currencysymbol.php
index 7f4514e40f4..210bd14aea7 100644
--- a/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currencysymbol.php
+++ b/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currencysymbol.php
@@ -37,6 +37,8 @@ class Currencysymbol extends \Magento\Backend\App\Action
 {
     /**
      * Show Currency Symbols Management dialog
+     *
+     * @return void
      */
     public function indexAction()
     {
@@ -58,6 +60,8 @@ class Currencysymbol extends \Magento\Backend\App\Action
 
     /**
      * Save custom Currency symbol
+     *
+     * @return void
      */
     public function saveAction()
     {
@@ -83,6 +87,8 @@ class Currencysymbol extends \Magento\Backend\App\Action
 
     /**
      * Resets custom Currency symbol for all store views, websites and default value
+     *
+     * @return void
      */
     public function resetAction()
     {
@@ -93,7 +99,7 @@ class Currencysymbol extends \Magento\Backend\App\Action
     /**
      * Check the permission to run it
      *
-     * @return boolean
+     * @return bool
      */
     protected function _isAllowed()
     {
diff --git a/app/code/Magento/CurrencySymbol/Model/Observer.php b/app/code/Magento/CurrencySymbol/Model/Observer.php
index fce53e4b18d..6b4f8bbb210 100644
--- a/app/code/Magento/CurrencySymbol/Model/Observer.php
+++ b/app/code/Magento/CurrencySymbol/Model/Observer.php
@@ -55,7 +55,7 @@ class Observer
      * Generate options for currency displaying with custom currency symbol
      *
      * @param \Magento\Event\Observer $observer
-     * @return \Magento\CurrencySymbol\Model\Observer
+     * @return $this
      */
     public function currencyDisplayOptions(\Magento\Event\Observer $observer)
     {
diff --git a/app/code/Magento/CurrencySymbol/Model/System/Currencysymbol.php b/app/code/Magento/CurrencySymbol/Model/System/Currencysymbol.php
index b51223d0cf5..8b3f02ba2ab 100644
--- a/app/code/Magento/CurrencySymbol/Model/System/Currencysymbol.php
+++ b/app/code/Magento/CurrencySymbol/Model/System/Currencysymbol.php
@@ -45,14 +45,14 @@ class Currencysymbol
     /**
      * Store id
      *
-     * @var string | null
+     * @var string|null
      */
     protected $_storeId;
 
     /**
      * Website id
      *
-     * @var string | null
+     * @var string|null
      */
     protected $_websiteId;
     /**
@@ -159,8 +159,8 @@ class Currencysymbol
     /**
      * Sets store Id
      *
-     * @param  $storeId
-     * @return \Magento\CurrencySymbol\Model\System\Currencysymbol
+     * @param  string|null $storeId
+     * @return $this
      */
     public function setStoreId($storeId=null)
     {
@@ -173,8 +173,8 @@ class Currencysymbol
     /**
      * Sets website Id
      *
-     * @param  $websiteId
-     * @return \Magento\CurrencySymbol\Model\System\Currencysymbol
+     * @param string|null $websiteId
+     * @return $this
      */
     public function setWebsiteId($websiteId=null)
     {
@@ -266,7 +266,7 @@ class Currencysymbol
      * Saves currency symbol to config
      *
      * @param  $symbols array
-     * @return \Magento\CurrencySymbol\Model\System\Currencysymbol
+     * @return $this
      */
     public function setCurrencySymbolsData($symbols=array())
     {
@@ -309,8 +309,8 @@ class Currencysymbol
     /**
      * Returns custom currency symbol by currency code
      *
-     * @param  $code
-     * @return bool|string
+     * @param string $code
+     * @return string|false
      */
     public function getCurrencySymbol($code)
     {
@@ -325,7 +325,7 @@ class Currencysymbol
     /**
      * Clear translate cache
      *
-     * @return \Magento\CurrencySymbol\Model\System\Currencysymbol
+     * @return $this
      */
     public function clearCache()
     {
diff --git a/app/code/Magento/Customer/Block/Account/Dashboard/Info.php b/app/code/Magento/Customer/Block/Account/Dashboard/Info.php
index 686dacd266f..453dc7217b2 100644
--- a/app/code/Magento/Customer/Block/Account/Dashboard/Info.php
+++ b/app/code/Magento/Customer/Block/Account/Dashboard/Info.php
@@ -106,18 +106,18 @@ class Info extends \Magento\View\Element\Template
 
         $customer = $this->getCustomer();
 
-        if ($this->_metadataService->getCustomerAttributeMetadata('prefix')->isVisible()
-            && $customer->getPrefix()) {
+        $prefixMetadata = $this->_getAttributeMetadata('prefix');
+        if (!is_null($prefixMetadata) && $prefixMetadata->isVisible() && $customer->getPrefix()) {
             $name .= $customer->getPrefix() . ' ';
         }
         $name .= $customer->getFirstname();
-        if ($this->_metadataService->getCustomerAttributeMetadata('middlename')->isVisible()
-            && $customer->getMiddlename()) {
+        $midNameMetadata = $this->_getAttributeMetadata('middlename');
+        if (!is_null($midNameMetadata) && $midNameMetadata->isVisible() && $customer->getMiddlename()) {
             $name .= ' ' . $customer->getMiddlename();
         }
         $name .=  ' ' . $customer->getLastname();
-        if ($this->_metadataService->getCustomerAttributeMetadata('suffix')->isVisible()
-            && $customer->getSuffix()) {
+        $suffixMetadata = $this->_getAttributeMetadata('suffix');
+        if (!is_null($suffixMetadata) && $suffixMetadata->isVisible() && $customer->getSuffix()) {
             $name .= ' ' . $customer->getSuffix();
         }
         return $name;
@@ -172,4 +172,17 @@ class Info extends \Magento\View\Element\Template
     {
         return $this->_subscriberFactory->create();
     }
+
+    /**
+     * @param $attributeCode
+     * @return \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata|null
+     */
+    protected function _getAttributeMetadata($attributeCode)
+    {
+        try {
+            return $this->_metadataService->getCustomerAttributeMetadata($attributeCode);
+        } catch (NoSuchEntityException $e) {
+            return null;
+        }
+    }
 }
diff --git a/app/code/Magento/Customer/Block/Adminhtml/Edit.php b/app/code/Magento/Customer/Block/Adminhtml/Edit.php
index a3a360d2dda..558a52328ee 100644
--- a/app/code/Magento/Customer/Block/Adminhtml/Edit.php
+++ b/app/code/Magento/Customer/Block/Adminhtml/Edit.php
@@ -116,7 +116,7 @@ class Edit extends \Magento\Backend\Block\Widget\Form\Container
     }
 
     /**
-     * Prepare form html. Add block for configurable product modification interface
+     * Prepare form html. Add block for composite product modification interface
      *
      * @return string
      */
diff --git a/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/Addresses.php b/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/Addresses.php
index 70e9d59dcea..6cb63bba68b 100644
--- a/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/Addresses.php
+++ b/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/Addresses.php
@@ -59,6 +59,11 @@ class Addresses extends \Magento\Backend\Block\Widget\Form\Generic
      */
     protected $_customerHelper;
 
+    /**
+     * @var \Magento\Directory\Helper\Data
+     */
+    protected $_directoryHelper;
+
     /**
      * @param \Magento\Backend\Block\Template\Context $context
      * @param \Magento\Core\Model\Registry $registry
@@ -71,6 +76,7 @@ class Addresses extends \Magento\Backend\Block\Widget\Form\Generic
      * @param \Magento\Core\Model\System\Store $systemStore
      * @param \Magento\Backend\Helper\Addresses $adminhtmlAddresses
      * @param \Magento\Customer\Helper\Data $customerHelper
+     * @param \Magento\Directory\Helper\Data $directoryHelper
      * @param array $data
      *
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
@@ -87,6 +93,7 @@ class Addresses extends \Magento\Backend\Block\Widget\Form\Generic
         \Magento\Core\Model\System\Store $systemStore,
         \Magento\Backend\Helper\Addresses $adminhtmlAddresses,
         \Magento\Customer\Helper\Data $customerHelper,
+        \Magento\Directory\Helper\Data $directoryHelper,
         array $data = array()
     ) {
         $this->_customerHelper = $customerHelper;
@@ -97,6 +104,7 @@ class Addresses extends \Magento\Backend\Block\Widget\Form\Generic
         $this->_addressFactory = $addressFactory;
         $this->_customerFactory = $customerFactory;
         $this->_systemStore = $systemStore;
+        $this->_directoryHelper = $directoryHelper;
         parent::__construct($context, $registry, $formFactory, $data);
     }
 
@@ -264,11 +272,6 @@ class Addresses extends \Magento\Backend\Block\Widget\Form\Generic
         return $this->getChildHtml('add_address_button');
     }
 
-    public function getTemplatePrefix()
-    {
-        return '_template_';
-    }
-
     /**
      * Return predefined additional element types
      *
@@ -283,25 +286,6 @@ class Addresses extends \Magento\Backend\Block\Widget\Form\Generic
         );
     }
 
-    /**
-     * Return JSON object with countries associated to possible websites
-     *
-     * @return string
-     */
-    public function getDefaultCountriesJson()
-    {
-        $websites = $this->_systemStore->getWebsiteValuesForForm(false, true);
-        $result = array();
-        foreach ($websites as $website) {
-            $result[$website['value']] = $this->_storeManager->getWebsite($website['value'])
-                ->getConfig(
-                    \Magento\Core\Helper\Data::XML_PATH_DEFAULT_COUNTRY
-                );
-        }
-
-        return $this->_jsonEncoder->encode($result);
-    }
-
     /**
      * Add specified values to name prefix element values
      *
@@ -329,4 +313,74 @@ class Addresses extends \Magento\Backend\Block\Widget\Form\Generic
         }
         return $this;
     }
+
+    /**
+     * Returns the template prefix
+     *
+     * @return string
+     */
+    public function getTemplatePrefix()
+    {
+        return '_template_';
+    }
+
+    /**
+     * Return array with countries associated to possible websites
+     *
+     * @return array
+     */
+    public function getDefaultCountries()
+    {
+        $websites = $this->_systemStore->getWebsiteValuesForForm(false, true);
+        $result = array();
+        foreach ($websites as $website) {
+            $result[$website['value']] = $this->_storeManager->getWebsite($website['value'])
+                ->getConfig(
+                    \Magento\Core\Helper\Data::XML_PATH_DEFAULT_COUNTRY
+                );
+        }
+
+        return $result;
+    }
+
+    /**
+     * Return ISO2 country codes, which have optional Zip/Postal pre-configured
+     *
+     * @return array
+     */
+    public function getOptionalZipCountries()
+    {
+        return $this->_directoryHelper->getCountriesWithOptionalZip();
+    }
+
+    /**
+     * Returns the list of countries, for which region is required
+     *
+     * @return array
+     */
+    public function getRequiredStateForCountries()
+    {
+        return $this->_directoryHelper->getCountriesWithStatesRequired();
+    }
+
+    /**
+     * eturn, whether non-required state should be shown
+     *
+     * @return int 1 if should be shown, and 0 if not.
+     */
+    public function getShowAllRegions()
+    {
+        return (string)$this->_directoryHelper->isShowNonRequiredState() ? 1 : 0;
+    }
+
+    /**
+     * Encode the $data into JSON format.
+     *
+     * @param object|array $data
+     * @return string
+     */
+    public function jsonEncode($data)
+    {
+        return $this->_jsonEncoder->encode($data);
+    }
 }
diff --git a/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/View/Grid/Renderer/Item.php b/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/View/Grid/Renderer/Item.php
index a3cd5ca4711..c95bcf39bbc 100644
--- a/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/View/Grid/Renderer/Item.php
+++ b/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/View/Grid/Renderer/Item.php
@@ -137,7 +137,7 @@ class Item
         return $this->_productConfig->getFormattedOptionValue($option, $params);
     }
 
-    /*
+    /**
      * Renders item product name and its configuration
      *
      * @param \Magento\Catalog\Model\Product\Configuration\Item\ItemInterface $item
diff --git a/app/code/Magento/Customer/Block/Widget/AbstractWidget.php b/app/code/Magento/Customer/Block/Widget/AbstractWidget.php
index a4174d634e2..bba542057a2 100644
--- a/app/code/Magento/Customer/Block/Widget/AbstractWidget.php
+++ b/app/code/Magento/Customer/Block/Widget/AbstractWidget.php
@@ -91,10 +91,14 @@ class AbstractWidget extends \Magento\View\Element\Template
      * Retrieve customer attribute instance
      *
      * @param string $attributeCode
-     * @return \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata
+     * @return \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata|null
      */
     protected function _getAttribute($attributeCode)
     {
-        return $this->_attributeMetadata->getAttributeMetadata('customer', $attributeCode);
+        try {
+            return $this->_attributeMetadata->getAttributeMetadata('customer', $attributeCode);
+        } catch (\Magento\Exception\NoSuchEntityException $e) {
+            return null;
+        }
     }
 }
diff --git a/app/code/Magento/Customer/Block/Widget/Dob.php b/app/code/Magento/Customer/Block/Widget/Dob.php
index e6a47a60973..dd528d21cf0 100644
--- a/app/code/Magento/Customer/Block/Widget/Dob.php
+++ b/app/code/Magento/Customer/Block/Widget/Dob.php
@@ -49,12 +49,14 @@ class Dob extends \Magento\Customer\Block\Widget\AbstractWidget
 
     public function isEnabled()
     {
-        return (bool)$this->_getAttribute('dob')->isVisible();
+        $attributeMetadata = $this->_getAttribute('dob');
+        return $attributeMetadata ? (bool)$attributeMetadata->isVisible() : false;
     }
 
     public function isRequired()
     {
-        return (bool)$this->_getAttribute('dob')->isRequired();
+        $attributeMetadata = $this->_getAttribute('dob');
+        return $attributeMetadata ? (bool)$attributeMetadata->isRequired() : false;
     }
 
     public function setDate($date)
@@ -128,22 +130,34 @@ class Dob extends \Magento\Customer\Block\Widget\AbstractWidget
     /**
      * Return minimal date range value
      *
-     * @return string
+     * @return string|null
      */
     public function getMinDateRange()
     {
-        $rules = $this->_getAttribute('dob')->getValidationRules();
-        return isset($rules[self::MIN_DATE_RANGE_KEY]) ? date("Y/m/d", $rules[self::MIN_DATE_RANGE_KEY]) : null;
+        $dob = $this->_getAttribute('dob');
+        if (!is_null($dob)) {
+            $rules = $this->_getAttribute('dob')->getValidationRules();
+            if (isset($rules[self::MIN_DATE_RANGE_KEY])) {
+                return date("Y/m/d", $rules[self::MIN_DATE_RANGE_KEY]);
+            }
+        }
+        return null;
     }
 
     /**
      * Return maximal date range value
      *
-     * @return string
+     * @return string|null
      */
     public function getMaxDateRange()
     {
-        $rules = $this->_getAttribute('dob')->getValidationRules();
-        return isset($rules[self::MAX_DATE_RANGE_KEY]) ? date("Y/m/d", $rules[self::MAX_DATE_RANGE_KEY]) : null;
+        $dob = $this->_getAttribute('dob');
+        if (!is_null($dob)) {
+            $rules = $this->_getAttribute('dob')->getValidationRules();
+            if (isset($rules[self::MAX_DATE_RANGE_KEY])) {
+                return date("Y/m/d", $rules[self::MAX_DATE_RANGE_KEY]);
+            }
+        }
+        return null;
     }
 }
diff --git a/app/code/Magento/Customer/Block/Widget/Gender.php b/app/code/Magento/Customer/Block/Widget/Gender.php
index 7344c552504..673128c50f2 100644
--- a/app/code/Magento/Customer/Block/Widget/Gender.php
+++ b/app/code/Magento/Customer/Block/Widget/Gender.php
@@ -83,7 +83,7 @@ class Gender extends \Magento\Customer\Block\Widget\AbstractWidget
      */
     public function isEnabled()
     {
-        return (bool)$this->_getAttribute('gender')->isVisible();
+        return $this->_getAttribute('gender') ? (bool)$this->_getAttribute('gender')->isVisible() : false;
     }
 
     /**
@@ -93,7 +93,7 @@ class Gender extends \Magento\Customer\Block\Widget\AbstractWidget
      */
     public function isRequired()
     {
-        return (bool)$this->_getAttribute('gender')->isRequired();
+        return $this->_getAttribute('gender') ? (bool)$this->_getAttribute('gender')->isRequired() : false;
     }
 
     /**
diff --git a/app/code/Magento/Customer/Block/Widget/Name.php b/app/code/Magento/Customer/Block/Widget/Name.php
index 2118dc9d47f..3429244ca5b 100644
--- a/app/code/Magento/Customer/Block/Widget/Name.php
+++ b/app/code/Magento/Customer/Block/Widget/Name.php
@@ -80,7 +80,7 @@ class Name extends \Magento\Customer\Block\Widget\AbstractWidget
      */
     public function showPrefix()
     {
-        return (bool)$this->_getAttribute('prefix')->isVisible();
+        return $this->_isAttributeVisible('prefix');
     }
 
     /**
@@ -90,7 +90,7 @@ class Name extends \Magento\Customer\Block\Widget\AbstractWidget
      */
     public function isPrefixRequired()
     {
-        return (bool)$this->_getAttribute('prefix')->isRequired();
+        return $this->_isAttributeRequired('prefix');
     }
 
     /**
@@ -116,7 +116,7 @@ class Name extends \Magento\Customer\Block\Widget\AbstractWidget
      */
     public function showMiddlename()
     {
-        return (bool)$this->_getAttribute('middlename')->isVisible();
+        return $this->_isAttributeVisible('middlename');
     }
 
     /**
@@ -126,7 +126,7 @@ class Name extends \Magento\Customer\Block\Widget\AbstractWidget
      */
     public function isMiddlenameRequired()
     {
-        return (bool)$this->_getAttribute('middlename')->isRequired();
+        return $this->_isAttributeRequired('middlename');
     }
 
     /**
@@ -136,7 +136,7 @@ class Name extends \Magento\Customer\Block\Widget\AbstractWidget
      */
     public function showSuffix()
     {
-        return (bool)$this->_getAttribute('suffix')->isVisible();
+        return $this->_isAttributeVisible('suffix');
     }
 
     /**
@@ -146,7 +146,7 @@ class Name extends \Magento\Customer\Block\Widget\AbstractWidget
      */
     public function isSuffixRequired()
     {
-        return (bool)$this->_getAttribute('suffix')->isRequired();
+        return $this->_isAttributeRequired('suffix');
     }
 
     /**
@@ -195,7 +195,7 @@ class Name extends \Magento\Customer\Block\Widget\AbstractWidget
      * Retrieve customer or customer address attribute instance
      *
      * @param string $attributeCode
-     * @return \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata
+     * @return \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata|null
      */
     protected function _getAttribute($attributeCode)
     {
@@ -205,7 +205,11 @@ class Name extends \Magento\Customer\Block\Widget\AbstractWidget
             return parent::_getAttribute($attributeCode);
         }
 
-        $attribute = $this->_attributeMetadata->getAttributeMetadata('customer_address', $attributeCode);
+        try {
+            $attribute = $this->_attributeMetadata->getAttributeMetadata('customer_address', $attributeCode);
+        } catch (\Magento\Exception\NoSuchEntityException $e) {
+            return null;
+        }
 
         if ($this->getForceUseCustomerRequiredAttributes() && $attribute && !$attribute->isRequired()) {
             $customerAttribute = parent::_getAttribute($attributeCode);
@@ -228,4 +232,24 @@ class Name extends \Magento\Customer\Block\Widget\AbstractWidget
         $attribute = $this->_getAttribute($attributeCode);
         return $attribute ? __($attribute->getStoreLabel()) : '';
     }
+
+    /**
+     * @param string $attributeCode
+     * @return bool
+     */
+    private function _isAttributeRequired($attributeCode)
+    {
+        $attributeMetadata = $this->_getAttribute($attributeCode);
+        return $attributeMetadata ? (bool)$attributeMetadata->isRequired() : false;
+    }
+
+    /**
+     * @param string $attributeCode
+     * @return bool
+     */
+    private function _isAttributeVisible($attributeCode)
+    {
+        $attributeMetadata = $this->_getAttribute($attributeCode);
+        return $attributeMetadata ? (bool)$attributeMetadata->isVisible() : false;
+    }
 }
diff --git a/app/code/Magento/Customer/Block/Widget/Taxvat.php b/app/code/Magento/Customer/Block/Widget/Taxvat.php
index 23092ae05bd..c5ad13a4558 100644
--- a/app/code/Magento/Customer/Block/Widget/Taxvat.php
+++ b/app/code/Magento/Customer/Block/Widget/Taxvat.php
@@ -60,12 +60,12 @@ class Taxvat extends \Magento\Customer\Block\Widget\AbstractWidget
 
     public function isEnabled()
     {
-        return (bool)$this->_getAttribute('taxvat')->isVisible();
+        return $this->_getAttribute('taxvat') ? (bool)$this->_getAttribute('taxvat')->isVisible() : false;
     }
 
     public function isRequired()
     {
-        return (bool)$this->_getAttribute('taxvat')->isRequired();
+        return $this->_getAttribute('taxvat') ? (bool)$this->_getAttribute('taxvat')->isRequired() : false;
     }
 
     public function getCustomer()
diff --git a/app/code/Magento/Customer/Model/Resource/Group/Grid/ServiceCollection.php b/app/code/Magento/Customer/Model/Resource/Group/Grid/ServiceCollection.php
index ec77a2d11fe..e4134d6f2fc 100644
--- a/app/code/Magento/Customer/Model/Resource/Group/Grid/ServiceCollection.php
+++ b/app/code/Magento/Customer/Model/Resource/Group/Grid/ServiceCollection.php
@@ -31,6 +31,22 @@ use Magento\Customer\Service\V1\Dto\SearchCriteria;
 
 class ServiceCollection extends \Magento\Data\Collection
 {
+    /**
+     * Filters on specific fields
+     *
+     * Each filter has the following structure
+     * <pre>
+     * [
+     *     'field'     => $field,
+     *     'condition' => $condition,
+     * ]
+     * </pre>
+     * @see addFieldToFilter() for more information on conditions
+     *
+     * @var array
+     */
+    protected $fieldFilters = [];
+
     /**
      * @var \Magento\Customer\Service\V1\CustomerGroupServiceInterface
      */
@@ -64,12 +80,65 @@ class ServiceCollection extends \Magento\Data\Collection
         $this->searchCriteriaBuilder = $searchCriteriaBuilder;
     }
 
+    /**
+     * Add field filter to collection
+     *
+     * If $condition integer or string - exact value will be filtered ('eq' condition)
+     *
+     * If $condition is array - one of the following structures is expected:
+     * <pre>
+     * - ["from" => $fromValue, "to" => $toValue]
+     * - ["eq" => $equalValue]
+     * - ["neq" => $notEqualValue]
+     * - ["like" => $likeValue]
+     * - ["in" => [$inValues]]
+     * - ["nin" => [$notInValues]]
+     * - ["notnull" => $valueIsNotNull]
+     * - ["null" => $valueIsNull]
+     * - ["moreq" => $moreOrEqualValue]
+     * - ["gt" => $greaterValue]
+     * - ["lt" => $lessValue]
+     * - ["gteq" => $greaterOrEqualValue]
+     * - ["lteq" => $lessOrEqualValue]
+     * - ["finset" => $valueInSet]
+     * - ["regexp" => $regularExpression]
+     * - ["seq" => $stringValue]
+     * - ["sneq" => $stringValue]
+     * </pre>
+     *
+     * If non matched - sequential parallel arrays are expected and OR conditions
+     * will be built using above mentioned structure.
+     *
+     * Example:
+     * <pre>
+     * $field = ['age', 'name'];
+     * $condition = [42, ['like' => 'Mage']];
+     * </pre>
+     * The above would find where age equal to 42 OR name like %Mage%.
+     *
+     * @param string|array $field
+     * @param string|int|array $condition
+     * @throws \Magento\Exception if some error in the input could be detected.
+     * @return $this
+     */
+    public function addFieldToFilter($field, $condition)
+    {
+        if (is_array($field) && count($field) != count($condition)) {
+            throw new \Magento\Exception('When passing in a field array there must be a matching condition array.');
+        }
+        $this->fieldFilters[] = [
+            'field'     => $field,
+            'condition' => $condition,
+        ];
+        return $this;
+    }
+
     /**
      * Load customer group collection data from service
      *
      * @param bool $printQuery
      * @param bool $logQuery
-     * @return  \Magento\Data\Collection
+     * @return \Magento\Data\Collection
      */
     public function loadData($printQuery = false, $logQuery = false)
     {
@@ -89,26 +158,57 @@ class ServiceCollection extends \Magento\Data\Collection
         return $this;
     }
 
-    public function addFieldToFilter($field, $condition)
-    {
-        // TODO this is broken until the Widget/Grid can be re-written not to have db logic in it
-        return $this;
-    }
-
+    /**
+     * Creates a search criteria DTO based on the array of field filters.
+     *
+     * @return SearchCriteria
+     */
     protected function getSearchCriteria()
     {
-        foreach ($this->_filters as $filter) {
-            $this->filerBuilder->setField($filter['field'])
-                ->setValue($filter['value'])
-                ->setConditionType($filter['type']);
-            $this->searchCriteriaBuilder->addFilter($this->filterBuilder->create());
+        foreach ($this->fieldFilters as $filter) {
+            if (!is_array($filter['field'])) {
+                // just one field
+                $this->searchCriteriaBuilder->addFilter($this->createFilterDto($filter['field'], $filter['condition']));
+            } else {
+                // array of fields, put filters in array to use 'or' group
+                /** @var Filter[] $orGroupFilters */
+                $orGroupFilters = [];
+                foreach ($filter['field'] as $index => $field) {
+                    $orGroupFilters[] = $this->createFilterDto($field, $filter['condition'][$index]);
+                }
+                $this->searchCriteriaBuilder->addOrGroup($orGroupFilters);
+            }
         }
         foreach ($this->_orders as $field => $direction) {
             $this->searchCriteriaBuilder->addSortOrder(
-                $field, $direction == 'ASC' ? SearchCriteria::SORT_ASC : SearchCriteria::SORT_DESC);
+                $field,
+                $direction == 'ASC' ? SearchCriteria::SORT_ASC : SearchCriteria::SORT_DESC
+            );
         }
         $this->searchCriteriaBuilder->setCurrentPage($this->_curPage);
         $this->searchCriteriaBuilder->setPageSize($this->_pageSize);
         return $this->searchCriteriaBuilder->create();
     }
+
+    /**
+     * Creates a filter DTO for given field/condition
+     *
+     * @param string $field Field for new filter
+     * @param string|array $condition Condition for new filter.
+     * @return Filter
+     */
+    protected function createFilterDto($field, $condition)
+    {
+        $this->filterBuilder->setField($field);
+
+        if (is_array($condition)) {
+            $this->filterBuilder->setValue(reset($condition));
+            $this->filterBuilder->setConditionType(key($condition));
+        } else {
+            // not an array, just use eq as condition type and given value
+            $this->filterBuilder->setConditionType('eq');
+            $this->filterBuilder->setValue($condition);
+        }
+        return $this->filterBuilder->create();
+    }
 }
diff --git a/app/code/Magento/Customer/Model/Resource/Setup.php b/app/code/Magento/Customer/Model/Resource/Setup.php
index 26b71e2ee72..195f8af1300 100644
--- a/app/code/Magento/Customer/Model/Resource/Setup.php
+++ b/app/code/Magento/Customer/Model/Resource/Setup.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Customer resource setup model
+ *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -18,20 +20,9 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Customer
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-
-/**
- * Customer resource setup model
- *
- * @category    Magento
- * @package     Magento_Customer
- * @author      Magento Core Team <core@magentocommerce.com>
- */
 namespace Magento\Customer\Model\Resource;
 
 class Setup extends \Magento\Eav\Model\Entity\Setup
@@ -42,8 +33,8 @@ class Setup extends \Magento\Eav\Model\Entity\Setup
     protected $_eavConfig;
 
     /**
-     * @param \Magento\Core\Model\Resource\Setup\Context $context
-     * @param string $resourceName
+     * @param \Magento\Eav\Model\Entity\Setup\Context $context
+     * @param $resourceName
      * @param \Magento\App\CacheInterface $cache
      * @param \Magento\Eav\Model\Resource\Entity\Attribute\Group\CollectionFactory $attrGroupCollectionFactory
      * @param \Magento\Eav\Model\Config $eavConfig
@@ -51,7 +42,7 @@ class Setup extends \Magento\Eav\Model\Entity\Setup
      * @param string $connectionName
      */
     public function __construct(
-        \Magento\Core\Model\Resource\Setup\Context $context,
+        \Magento\Eav\Model\Entity\Setup\Context $context,
         $resourceName,
         \Magento\App\CacheInterface $cache,
         \Magento\Eav\Model\Resource\Entity\Attribute\Group\CollectionFactory $attrGroupCollectionFactory,
@@ -60,29 +51,9 @@ class Setup extends \Magento\Eav\Model\Entity\Setup
         $connectionName = ''
     ) {
         $this->_eavConfig = $eavConfig;
-        parent::__construct($context, $resourceName, $cache, $attrGroupCollectionFactory, $moduleName, $connectionName);
-    }
-
-    /**
-     * Prepare customer attribute values to save in additional table
-     *
-     * @param array $attr
-     * @return array
-     */
-    protected function _prepareValues($attr)
-    {
-        $data = parent::_prepareValues($attr);
-        $data = array_merge($data, array(
-            'is_visible'                => $this->_getValue($attr, 'visible', 1),
-            'is_system'                 => $this->_getValue($attr, 'system', 1),
-            'input_filter'              => $this->_getValue($attr, 'input_filter', null),
-            'multiline_count'           => $this->_getValue($attr, 'multiline_count', 0),
-            'validate_rules'            => $this->_getValue($attr, 'validate_rules', null),
-            'data_model'                => $this->_getValue($attr, 'data', null),
-            'sort_order'                => $this->_getValue($attr, 'position', 0)
-        ));
-
-        return $data;
+        parent::__construct(
+            $context, $resourceName, $cache, $attrGroupCollectionFactory, $moduleName, $connectionName
+        );
     }
 
     /**
diff --git a/app/code/Magento/Customer/Model/Resource/Setup/PropertyMapper.php b/app/code/Magento/Customer/Model/Resource/Setup/PropertyMapper.php
new file mode 100644
index 00000000000..659eafcec84
--- /dev/null
+++ b/app/code/Magento/Customer/Model/Resource/Setup/PropertyMapper.php
@@ -0,0 +1,51 @@
+<?php
+/**
+ * Customer attribute property mapper
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Customer\Model\Resource\Setup;
+
+use Magento\Eav\Model\Entity\Setup\PropertyMapperAbstract;
+
+class PropertyMapper extends PropertyMapperAbstract
+{
+    /**
+     * Map input attribute properties to storage representation
+     *
+     * @param array $input
+     * @param int $entityTypeId
+     * @return array
+     */
+    public function map(array $input, $entityTypeId)
+    {
+        return array(
+            'is_visible'                => $this->_getValue($input, 'visible', 1),
+            'is_system'                 => $this->_getValue($input, 'system', 1),
+            'input_filter'              => $this->_getValue($input, 'input_filter', null),
+            'multiline_count'           => $this->_getValue($input, 'multiline_count', 0),
+            'validate_rules'            => $this->_getValue($input, 'validate_rules', null),
+            'data_model'                => $this->_getValue($input, 'data', null),
+            'sort_order'                => $this->_getValue($input, 'position', 0)
+        );
+    }
+} 
diff --git a/app/code/Magento/Customer/Service/V1/CustomerGroupService.php b/app/code/Magento/Customer/Service/V1/CustomerGroupService.php
index 4b01a680922..2afd66448bf 100644
--- a/app/code/Magento/Customer/Service/V1/CustomerGroupService.php
+++ b/app/code/Magento/Customer/Service/V1/CustomerGroupService.php
@@ -29,8 +29,14 @@ use Magento\Core\Model\Store\Config as StoreConfig;
 use Magento\Customer\Model\Group as CustomerGroupModel;
 use Magento\Customer\Model\GroupFactory;
 use Magento\Customer\Model\Resource\Group\Collection;
+use Magento\Exception\InputException;
 use Magento\Exception\NoSuchEntityException;
 
+/**
+ * Class CustomerGroupService
+ *
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
 class CustomerGroupService implements CustomerGroupServiceInterface
 {
     /**
@@ -105,24 +111,12 @@ class CustomerGroupService implements CustomerGroupServiceInterface
         $groups = array();
         /** @var Collection $collection */
         $collection = $this->_groupFactory->create()->getCollection();
-        foreach ($searchCriteria->getFilters() as $filter) {
-            $collection->addFilter($filter->getField(), $filter->getValue(), $filter->getConditionType());
-        }
+        $this->addFiltersToCollection($searchCriteria->getFilters(), $collection);
         $this->_searchResultsBuilder->setTotalCount($collection->getSize());
         $sortOrders = $searchCriteria->getSortOrders();
         if ($sortOrders) {
             foreach ($searchCriteria->getSortOrders() as $field => $direction) {
-                switch($field) {
-                    case 'id' :
-                        $field = 'customer_group_id';
-                        break;
-                    case 'code':
-                        $field = 'customer_group_code';
-                        break;
-                    case "tax_class_id":
-                    default:
-                        break;
-                }
+                $field = $this->translateField($field);
                 $collection->addOrder($field, $direction == Dto\SearchCriteria::SORT_ASC ? 'ASC' : 'DESC');
             }
         }
@@ -140,6 +134,84 @@ class CustomerGroupService implements CustomerGroupServiceInterface
         return $this->_searchResultsBuilder->create();
     }
 
+    /**
+     * Adds some filters from a filter group to a collection.
+     *
+     * @param Dto\Search\FilterGroupInterface $filterGroup
+     * @param Collection $collection
+     * @throws \Magento\Exception\InputException
+     */
+    protected function addFiltersToCollection(Dto\Search\FilterGroupInterface $filterGroup, Collection $collection)
+    {
+        if (strcasecmp($filterGroup->getGroupType(), 'AND')) {
+            throw new InputException('Only AND grouping is currently supported for filters.');
+        }
+
+        foreach ($filterGroup->getFilters() as $filter) {
+            $this->addFilterToCollection($collection, $filter);
+        }
+
+        foreach ($filterGroup->getGroups() as $group) {
+            $this->addFilterGroupToCollection($collection, $group);
+        }
+    }
+
+    /**
+     * Helper function that adds a filter to the collection
+     *
+     * @param Collection $collection
+     * @param Dto\Filter $filter
+     * @return string
+     */
+    protected function addFilterToCollection(Collection $collection, Dto\Filter $filter)
+    {
+        $field = $this->translateField($filter->getField());
+        $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq';
+        $collection->addFieldToFilter($field, [$condition => $filter->getValue()]);
+    }
+
+    /**
+     * Helper function that adds a FilterGroup to the collection.
+     *
+     * @param Collection $collection
+     * @param Dto\Search\FilterGroupInterface $group
+     * @throws \Magento\Exception\InputException
+     */
+    protected function addFilterGroupToCollection(Collection $collection, Dto\Search\FilterGroupInterface $group)
+    {
+        if (strcasecmp($group->getGroupType(), 'OR')) {
+            throw new InputException('The only nested groups currently supported for filters are of type OR.');
+        }
+        $fields = [];
+        $conditions = [];
+        foreach ($group->getFilters() as $filter) {
+            $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq';
+            $fields[] = $this->translateField($filter->getField());
+            $conditions[] = [$condition => $filter->getValue()];
+        }
+        if ($fields) {
+            $collection->addFieldToFilter($fields, $conditions);
+        }
+    }
+
+    /**
+     * Translates a field name to a DB column name for use in collection queries.
+     *
+     * @param string $field a field name that should be translated to a DB column name.
+     * @return string
+     */
+    protected function translateField($field)
+    {
+        switch ($field) {
+            case 'code':
+                return 'customer_group_code';
+            case 'id':
+                return 'customer_group_id';
+            default:
+                return $field;
+        }
+    }
+
     /**
      * {@inheritdoc}
      */
diff --git a/app/code/Magento/Customer/Service/V1/CustomerGroupServiceInterface.php b/app/code/Magento/Customer/Service/V1/CustomerGroupServiceInterface.php
index d9787eb92ef..56981c4699f 100644
--- a/app/code/Magento/Customer/Service/V1/CustomerGroupServiceInterface.php
+++ b/app/code/Magento/Customer/Service/V1/CustomerGroupServiceInterface.php
@@ -25,6 +25,7 @@
  */
 namespace Magento\Customer\Service\V1;
 
+use Magento\Exception\InputException;
 use Magento\Exception\NoSuchEntityException;
 
 interface CustomerGroupServiceInterface
@@ -48,8 +49,8 @@ interface CustomerGroupServiceInterface
 
     /**
      * @param Dto\SearchCriteria $searchCriteria
-     *
-     * @return Dto\SearchResults
+     * @throws InputException if there is a problem with the input
+     * @return Dto\SearchResults containing Dto\CustomerGroup objects
      */
     public function searchGroups(Dto\SearchCriteria $searchCriteria);
 
diff --git a/app/code/Magento/Customer/Service/V1/CustomerMetadataService.php b/app/code/Magento/Customer/Service/V1/CustomerMetadataService.php
index 1372bbe0bdb..4740fa2e76f 100644
--- a/app/code/Magento/Customer/Service/V1/CustomerMetadataService.php
+++ b/app/code/Magento/Customer/Service/V1/CustomerMetadataService.php
@@ -1,7 +1,5 @@
 <?php
 /**
- * EAV attribute metadata service
- *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -26,7 +24,13 @@
 namespace Magento\Customer\Service\V1;
 
 use Magento\Eav\Model\Entity\Attribute\AbstractAttribute;
+use Magento\Exception\NoSuchEntityException;
 
+/**
+ * EAV attribute metadata service
+ *
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
 class CustomerMetadataService implements CustomerMetadataServiceInterface
 {
     /**
@@ -80,11 +84,7 @@ class CustomerMetadataService implements CustomerMetadataServiceInterface
     }
 
     /**
-     * Retrieve EAV attribute metadata
-     *
-     * @param   mixed $entityType
-     * @param   mixed $attributeCode
-     * @return Dto\Eav\AttributeMetadata
+     * {@inheritdoc}
      */
     public function getAttributeMetadata($entityType, $attributeCode)
     {
@@ -95,18 +95,18 @@ class CustomerMetadataService implements CustomerMetadataServiceInterface
 
         /** @var AbstractAttribute $attribute */
         $attribute = $this->_eavConfig->getAttribute($entityType, $attributeCode);
-        $attributeMetadata = $this->_createMetadataAttribute($attribute);
-        $dtoCache[$attributeCode] = $attributeMetadata;
-        return $attributeMetadata;
+        if ($attribute) {
+            $attributeMetadata = $this->_createMetadataAttribute($attribute);
+            $dtoCache[$attributeCode] = $attributeMetadata;
+            return $attributeMetadata;
+        } else {
+            throw (new NoSuchEntityException('entityType', $entityType))
+                ->addField('attributeCode', $attributeCode);
+        }
     }
 
     /**
-     * Returns all known attributes metadata for a given entity type and attribute set
-     *
-     * @param string $entityType
-     * @param int $attributeSetId
-     * @param int $storeId
-     * @return Dto\Eav\AttributeMetadata[]
+     * {@inheritdoc}
      */
     public function getAllAttributeSetMetadata($entityType, $attributeSetId = 0, $storeId = null)
     {
@@ -121,17 +121,17 @@ class CustomerMetadataService implements CustomerMetadataServiceInterface
 
         $attributesMetadata = [];
         foreach ($attributeCodes as $attributeCode) {
-            $attributesMetadata[] = $this->getAttributeMetadata($entityType, $attributeCode);
+            try {
+                $attributesMetadata[] = $this->getAttributeMetadata($entityType, $attributeCode);
+            } catch (NoSuchEntityException $e) {
+                //If no such entity, skip
+            }
         }
         return $attributesMetadata;
     }
 
     /**
-     * Retrieve all attributes for entityType filtered by form code
-     *
-     * @param $entityType
-     * @param $formCode
-     * @return Dto\Eav\AttributeMetadata[]
+     * {@inheritdoc}
      */
     public function getAttributes($entityType, $formCode)
     {
diff --git a/app/code/Magento/Customer/Service/V1/CustomerMetadataServiceInterface.php b/app/code/Magento/Customer/Service/V1/CustomerMetadataServiceInterface.php
index bea359eafe4..fcbc2f37c58 100644
--- a/app/code/Magento/Customer/Service/V1/CustomerMetadataServiceInterface.php
+++ b/app/code/Magento/Customer/Service/V1/CustomerMetadataServiceInterface.php
@@ -24,6 +24,8 @@
 
 namespace Magento\Customer\Service\V1;
 
+use Magento\Exception\NoSuchEntityException;
+
 /**
  * Manipulate Customer Metadata Attributes *
  */
@@ -38,6 +40,7 @@ interface CustomerMetadataServiceInterface
      * @param   mixed $entityType
      * @param   mixed $attributeCode
      * @return Dto\Eav\AttributeMetadata
+     * @throws NoSuchEntityException
      */
     public function getAttributeMetadata($entityType, $attributeCode);
 
@@ -65,6 +68,7 @@ interface CustomerMetadataServiceInterface
      *
      * @param string $attributeCode
      * @return Dto\Eav\AttributeMetadata
+     * @throws NoSuchEntityException
      */
     public function getCustomerAttributeMetadata($attributeCode);
 
@@ -80,6 +84,7 @@ interface CustomerMetadataServiceInterface
      *
      * @param string $attributeCode
      * @return Dto\Eav\AttributeMetadata
+     * @throws NoSuchEntityException
      */
     public function getAddressAttributeMetadata($attributeCode);
 
diff --git a/app/code/Magento/Customer/Service/V1/CustomerService.php b/app/code/Magento/Customer/Service/V1/CustomerService.php
index 05a79899755..bd96debbe00 100644
--- a/app/code/Magento/Customer/Service/V1/CustomerService.php
+++ b/app/code/Magento/Customer/Service/V1/CustomerService.php
@@ -27,6 +27,7 @@ namespace Magento\Customer\Service\V1;
 use Magento\Customer\Model\Converter;
 use Magento\Customer\Model\Customer as CustomerModel;
 use Magento\Exception\InputException;
+use Magento\Exception\NoSuchEntityException;
 use Magento\Validator\ValidatorException;
 
 /**
@@ -123,20 +124,36 @@ class CustomerService implements CustomerServiceInterface
             $exception->addError(InputException::INVALID_FIELD_VALUE, 'email', $customerModel->getEmail());
         }
 
-        $dob = $this->_customerMetadataService->getCustomerAttributeMetadata('dob');
-        if ($dob->isRequired() && '' == trim($customerModel->getDob())) {
+        $dob = $this->_getAttributeMetadata('dob');
+        if (!is_null($dob) && $dob->isRequired() && '' == trim($customerModel->getDob())) {
             $exception->addError(InputException::REQUIRED_FIELD, 'dob', '');
         }
-        $taxvat = $this->_customerMetadataService->getCustomerAttributeMetadata('taxvat');
-        if ($taxvat->isRequired() && '' == trim($customerModel->getTaxvat())) {
+
+        $taxvat = $this->_getAttributeMetadata('taxvat');
+        if (!is_null($taxvat) && $taxvat->isRequired() && '' == trim($customerModel->getTaxvat())) {
             $exception->addError(InputException::REQUIRED_FIELD, 'taxvat', '');
         }
-        $gender = $this->_customerMetadataService->getCustomerAttributeMetadata('gender');
-        if ($gender->isRequired() && '' == trim($customerModel->getGender())) {
+
+        $gender = $this->_getAttributeMetadata('gender');
+        if (!is_null($gender) && $gender->isRequired() && '' == trim($customerModel->getGender())) {
             $exception->addError(InputException::REQUIRED_FIELD, 'gender', '');
         }
+
         if ($exception->getErrors()) {
             throw $exception;
         }
     }
+
+    /**
+     * @param $attributeCode
+     * @return Dto\Eav\AttributeMetadata|null
+     */
+    protected function _getAttributeMetadata($attributeCode)
+    {
+        try {
+            return $this->_customerMetadataService->getCustomerAttributeMetadata($attributeCode);
+        } catch (NoSuchEntityException $e) {
+            return null;
+        }
+    }
 }
diff --git a/app/code/Magento/Customer/Service/V1/Dto/Filter.php b/app/code/Magento/Customer/Service/V1/Dto/Filter.php
index be4afba2ec1..d7d6dd71eed 100644
--- a/app/code/Magento/Customer/Service/V1/Dto/Filter.php
+++ b/app/code/Magento/Customer/Service/V1/Dto/Filter.php
@@ -36,7 +36,7 @@ class Filter extends \Magento\Service\Entity\AbstractDto
     }
 
     /**
-     * @return string
+     * @return string | string[]
      */
     public function getValue()
     {
diff --git a/app/code/Magento/Customer/Service/V1/Dto/FilterBuilder.php b/app/code/Magento/Customer/Service/V1/Dto/FilterBuilder.php
index 844234137c6..8ddf34f3494 100644
--- a/app/code/Magento/Customer/Service/V1/Dto/FilterBuilder.php
+++ b/app/code/Magento/Customer/Service/V1/Dto/FilterBuilder.php
@@ -1,7 +1,5 @@
 <?php
 /**
- * Customer Service Address Interface
- *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -25,19 +23,13 @@
  */
 namespace Magento\Customer\Service\V1\Dto;
 
-class FilterBuilder extends \Magento\Service\Entity\AbstractDtoBuilder
-{
-    /**
-     * Initializes the builder.
-     */
-    public function __construct()
-    {
-        parent::__construct();
-
-        // special constructor to set default values
-        $this->_data['condition_type'] = 'and';
-    }
+use Magento\Service\Entity\AbstractDtoBuilder;
 
+/**
+ * Builder for Filter DTO.
+ */
+class FilterBuilder extends AbstractDtoBuilder
+{
     /**
      * @param string $field
      * @return FilterBuilder
@@ -49,7 +41,7 @@ class FilterBuilder extends \Magento\Service\Entity\AbstractDtoBuilder
     }
 
     /**
-     * @param string $value
+     * @param string | string[] $value
      * @return FilterBuilder
      */
     public function setValue($value)
diff --git a/app/code/Magento/Customer/Service/V1/Dto/Search/AbstractFilterGroup.php b/app/code/Magento/Customer/Service/V1/Dto/Search/AbstractFilterGroup.php
new file mode 100644
index 00000000000..e4d42f1ea46
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/Dto/Search/AbstractFilterGroup.php
@@ -0,0 +1,68 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Customer\Service\V1\Dto\Search;
+
+use Magento\Service\Entity\AbstractDto;
+
+/**
+ * Groups two or more filters together using a logical group type
+ */
+abstract class AbstractFilterGroup extends AbstractDto implements FilterGroupInterface
+{
+    const FILTERS = 'filters';
+    const GROUPS = 'groups';
+
+    /**
+     * {@inheritdoc}
+     */
+    public function __construct(array $data)
+    {
+        parent::__construct($data);
+        $this->_data['group_type'] = $this->getGroupType();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFilters()
+    {
+        $filters = $this->_get(self::FILTERS);
+        return is_null($filters) ? [] : $filters;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getGroups()
+    {
+        $groups = $this->_get(self::GROUPS);
+        return is_null($groups) ? [] : $groups;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public abstract function getGroupType();
+}
diff --git a/app/code/Magento/Customer/Service/V1/Dto/Search/AbstractFilterGroupBuilder.php b/app/code/Magento/Customer/Service/V1/Dto/Search/AbstractFilterGroupBuilder.php
new file mode 100644
index 00000000000..4fb43b9fa08
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/Dto/Search/AbstractFilterGroupBuilder.php
@@ -0,0 +1,82 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Customer\Service\V1\Dto\Search;
+
+use Magento\Customer\Service\V1\Dto\Filter;
+use Magento\Service\Entity\AbstractDtoBuilder;
+
+/**
+ * Abstract Builder for AbstractFilterGroup DTOs.
+ */
+abstract class AbstractFilterGroupBuilder extends AbstractDtoBuilder
+{
+    /**
+     * @param Filter $filter
+     * @return $this
+     */
+    public function addFilter(Filter $filter)
+    {
+        if (!isset($this->_data[AbstractFilterGroup::FILTERS])
+            || !is_array($this->_data[AbstractFilterGroup::FILTERS])
+        ) {
+            $this->_data[AbstractFilterGroup::FILTERS] = [];
+        }
+        $this->_data[AbstractFilterGroup::FILTERS][] = $filter;
+        return $this;
+    }
+
+    /**
+     * @param Filter[] $filters
+     * @return $this
+     */
+    public function setFilters($filters)
+    {
+        return $this->_set(AbstractFilterGroup::FILTERS, $filters);
+    }
+
+    /**
+     * @param FilterGroupInterface $group
+     * @return $this
+     */
+    public function addGroup(FilterGroupInterface $group)
+    {
+        if (!isset($this->_data[AbstractFilterGroup::GROUPS])
+            || !is_array($this->_data[AbstractFilterGroup::GROUPS])
+        ) {
+            $this->_data[AbstractFilterGroup::GROUPS] = [];
+        }
+        $this->_data[AbstractFilterGroup::GROUPS][] = $group;
+        return $this;
+    }
+
+    /**
+     * @param FilterGroupInterface[] $groups
+     * @return $this
+     */
+    public function setGroups($groups)
+    {
+        return $this->_set(AbstractFilterGroup::GROUPS, $groups);
+    }
+}
diff --git a/app/code/Magento/ImportExport/Model/Export/Entity/Product/Type/Configurable.php b/app/code/Magento/Customer/Service/V1/Dto/Search/AndGroup.php
similarity index 70%
rename from app/code/Magento/ImportExport/Model/Export/Entity/Product/Type/Configurable.php
rename to app/code/Magento/Customer/Service/V1/Dto/Search/AndGroup.php
index 5d46a6c9d73..90b76674447 100644
--- a/app/code/Magento/ImportExport/Model/Export/Entity/Product/Type/Configurable.php
+++ b/app/code/Magento/Customer/Service/V1/Dto/Search/AndGroup.php
@@ -18,22 +18,24 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_ImportExport
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
+namespace Magento\Customer\Service\V1\Dto\Search;
+
+use Magento\Service\Entity\AbstractDto;
+
 /**
- * Export entity product type configurable model
- *
- * @category    Magento
- * @package     Magento_ImportExport
- * @author      Magento Core Team <core@magentocommerce.com>
+ * Groups two or more filters together using logical AND.
  */
-namespace Magento\ImportExport\Model\Export\Entity\Product\Type;
-
-class Configurable
-    extends \Magento\ImportExport\Model\Export\Entity\Product\Type\AbstractType
+class AndGroup extends AbstractFilterGroup
 {
+    /**
+     * {@inheritdoc}
+     */
+    public function getGroupType()
+    {
+        return 'AND';
+    }
 }
diff --git a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/TestOptions.php b/app/code/Magento/Customer/Service/V1/Dto/Search/AndGroupBuilder.php
similarity index 78%
rename from dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/TestOptions.php
rename to app/code/Magento/Customer/Service/V1/Dto/Search/AndGroupBuilder.php
index 91240c38c15..4cecdd2f14c 100644
--- a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/TestOptions.php
+++ b/app/code/Magento/Customer/Service/V1/Dto/Search/AndGroupBuilder.php
@@ -18,18 +18,18 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Core
- * @subpackage  unit_tests
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
-namespace Magento\Core\Model\Layout\Argument\Handler;
+namespace Magento\Customer\Service\V1\Dto\Search;
 
-class TestOptions implements \Magento\Core\Model\Option\ArrayInterface
+use Magento\Customer\Service\V1\Dto\Filter;
+use Magento\Service\Entity\AbstractDtoBuilder;
+
+/**
+ * Builder for AndGroup DTO.
+ */
+class AndGroupBuilder extends AbstractFilterGroupBuilder
 {
-    public function toOptionArray()
-    {
-    }
 }
diff --git a/app/code/Magento/Customer/Service/V1/Dto/Search/FilterGroupInterface.php b/app/code/Magento/Customer/Service/V1/Dto/Search/FilterGroupInterface.php
new file mode 100644
index 00000000000..05db0ad5252
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/Dto/Search/FilterGroupInterface.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Customer\Service\V1\Dto\Search;
+
+use Magento\Customer\Service\V1\Dto\Filter;
+
+/**
+ * Groups two or more filters together using a logical group type
+ */
+interface FilterGroupInterface
+{
+    /**
+     * Returns a list of filters in this group
+     *
+     * @return Filter[]
+     */
+    public function getFilters();
+
+    /**
+     * Returns a list of filter groups in this group
+     *
+     * @return FilterGroupInterface[]
+     */
+    public function getGroups();
+
+    /**
+     * Returns the grouping type such as 'OR' or 'AND'.
+     *
+     * @return string
+     */
+    public function getGroupType();
+}
diff --git a/app/code/Magento/Customer/Service/V1/Dto/Search/OrGroup.php b/app/code/Magento/Customer/Service/V1/Dto/Search/OrGroup.php
new file mode 100644
index 00000000000..88726338f70
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/Dto/Search/OrGroup.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Customer\Service\V1\Dto\Search;
+
+use Magento\Service\Entity\AbstractDto;
+
+/**
+ * Groups two or more filters together using logical OR.
+ */
+class OrGroup extends AbstractFilterGroup
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getGroupType()
+    {
+        return 'OR';
+    }
+}
diff --git a/app/code/Magento/Customer/Service/V1/Dto/Search/OrGroupBuilder.php b/app/code/Magento/Customer/Service/V1/Dto/Search/OrGroupBuilder.php
new file mode 100644
index 00000000000..8178d52f1a0
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/Dto/Search/OrGroupBuilder.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Customer\Service\V1\Dto\Search;
+
+use Magento\Customer\Service\V1\Dto\Filter;
+use Magento\Service\Entity\AbstractDtoBuilder;
+
+/**
+ * Builder for OrGroup DTO.
+ */
+class OrGroupBuilder extends AbstractFilterGroupBuilder
+{
+}
diff --git a/app/code/Magento/Customer/Service/V1/Dto/SearchCriteria.php b/app/code/Magento/Customer/Service/V1/Dto/SearchCriteria.php
index 49b378c6c46..a4d34392833 100644
--- a/app/code/Magento/Customer/Service/V1/Dto/SearchCriteria.php
+++ b/app/code/Magento/Customer/Service/V1/Dto/SearchCriteria.php
@@ -1,7 +1,5 @@
 <?php
 /**
- * Customer Service Address Interface
- *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -25,15 +23,18 @@
  */
 namespace Magento\Customer\Service\V1\Dto;
 
-use Magento\Customer\Service\V1\Dto\Filter;
+use Magento\Service\Entity\AbstractDto;
 
-class SearchCriteria extends \Magento\Service\Entity\AbstractDto
+/**
+ * DTO for SearchCriteria
+ */
+class SearchCriteria extends AbstractDto
 {
     const SORT_ASC = 1;
     const SORT_DESC = -1;
 
     /**
-     * @return Filter[]
+     * @return \Magento\Customer\Service\V1\Dto\Search\FilterGroupInterface
      */
     public function getFilters()
     {
diff --git a/app/code/Magento/Customer/Service/V1/Dto/SearchCriteriaBuilder.php b/app/code/Magento/Customer/Service/V1/Dto/SearchCriteriaBuilder.php
index 559135790f3..cac3e67ed05 100644
--- a/app/code/Magento/Customer/Service/V1/Dto/SearchCriteriaBuilder.php
+++ b/app/code/Magento/Customer/Service/V1/Dto/SearchCriteriaBuilder.php
@@ -1,7 +1,5 @@
 <?php
 /**
- * Customer Service Address Interface
- *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -25,25 +23,60 @@
  */
 namespace Magento\Customer\Service\V1\Dto;
 
-use Magento\Customer\Service\V1\Dto\Filter;
+use Magento\Customer\Service\V1\Dto\Search\OrGroupBuilder;
+use Magento\Service\Entity\AbstractDtoBuilder;
 
-class SearchCriteriaBuilder extends \Magento\Service\Entity\AbstractDtoBuilder
+/**
+ * Builder for SearchCriteria DTO
+ */
+class SearchCriteriaBuilder extends AbstractDtoBuilder
 {
+    /**
+     * {@inheritdoc}
+     */
+    public function create()
+    {
+        $this->_data['filters'] = $this->getFilterGroup()->create();
+        return parent::create();
+    }
     /**
      * @param Filter $filter
      *
      * @return SearchCriteriaBuilder
      */
-    public function addFilter($filter)
+    public function addFilter(Filter $filter)
     {
-        if (!isset($this->_data['filters'])) {
-            $this->_data['filters'] = array();
-        }
+        $this->getFilterGroup()->addFilter($filter);
+        return $this;
+    }
 
-        $this->_data['filters'][] = $filter;
+    /**
+     * Add an OR grouping of filters to this SearchCriteria.
+     *
+     * @param Filter[] $filters
+     * @return $this
+     */
+    public function addOrGroup($filters)
+    {
+        $orGroup = new OrGroupBuilder();
+        foreach ($filters as $filter) {
+            $orGroup->addFilter($filter);
+        }
+        $this->getFilterGroup()->addGroup($orGroup->create());
         return $this;
     }
 
+    /**
+     * @return Search\AndGroupBuilder
+     */
+    private function getFilterGroup()
+    {
+        if (!isset($this->_data['filters'])) {
+            $this->_data['filters'] = new Search\AndGroupBuilder();
+        }
+        return $this->_data['filters'];
+    }
+
     /**
      * @param string $field
      * @param int $direction
diff --git a/app/code/Magento/Customer/Service/V1/Dto/SearchResults.php b/app/code/Magento/Customer/Service/V1/Dto/SearchResults.php
index 27f53ba92e5..169acb8c802 100644
--- a/app/code/Magento/Customer/Service/V1/Dto/SearchResults.php
+++ b/app/code/Magento/Customer/Service/V1/Dto/SearchResults.php
@@ -35,7 +35,7 @@ class SearchResults extends \Magento\Service\Entity\AbstractDto
      */
     public function getItems()
     {
-        return $this->_get('items');
+        return is_null($this->_get('items')) ? [] : $this->_get('items');
     }
 
     /**
diff --git a/app/code/Magento/Customer/etc/adminhtml/di.xml b/app/code/Magento/Customer/etc/adminhtml/di.xml
index 725ee804bea..9a7a3f34e50 100644
--- a/app/code/Magento/Customer/etc/adminhtml/di.xml
+++ b/app/code/Magento/Customer/etc/adminhtml/di.xml
@@ -23,16 +23,16 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <preference for="Magento\Customer\Model\Customer" type="Magento\Customer\Model\Backend\Customer" />
     <type name="Magento\Customer\Model\Session">
-        <param name="sessionName">
-            <value>adminhtml</value>
-        </param>
+        <arguments>
+            <argument name="sessionName" xsi:type="string">adminhtml</argument>
+        </arguments>
     </type>
     <type name="Magento\Customer\Model\Resource\Customer\Collection">
-        <param name="modelName">
-            <value>Magento\Customer\Model\Backend\Customer</value>
-        </param>
+        <arguments>
+            <argument name="modelName" xsi:type="string">Magento\Customer\Model\Backend\Customer</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Customer/etc/di.xml b/app/code/Magento/Customer/etc/di.xml
index 486515cdbc3..af77b9fdd88 100644
--- a/app/code/Magento/Customer/etc/di.xml
+++ b/app/code/Magento/Customer/etc/di.xml
@@ -23,7 +23,7 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <preference for="Magento\Customer\Service\V1\CustomerServiceInterface"
                 type="Magento\Customer\Service\V1\CustomerService" />
     <preference for="Magento\Customer\Service\V1\CustomerAddressServiceInterface"
@@ -35,40 +35,34 @@
     <preference for="Magento\Customer\Service\V1\CustomerMetadataServiceInterface"
                 type="Magento\Customer\Service\V1\CustomerMetadataService" />
     <type name="Magento\Customer\Model\Session">
-        <param name="configShare">
-            <instance type="Magento\Customer\Model\Config\Share\Proxy" />
-        </param>
-        <param name="customerData">
-            <instance type="Magento\Customer\Helper\Data\Proxy" />
-        </param>
-        <param name="customerResource">
-            <instance type="Magento\Customer\Model\Resource\Customer\Proxy" />
-        </param>
-        <param name="storage">
-            <instance type="Magento\Customer\Model\Session\Storage" />
-        </param>
+        <arguments>
+            <argument name="configShare" xsi:type="object">Magento\Customer\Model\Config\Share\Proxy</argument>
+            <argument name="customerData" xsi:type="object">Magento\Customer\Helper\Data\Proxy</argument>
+            <argument name="customerResource" xsi:type="object">Magento\Customer\Model\Resource\Customer\Proxy</argument>
+            <argument name="storage" xsi:type="object">Magento\Customer\Model\Session\Storage</argument>
+        </arguments>
     </type>
     <type name="Magento\Module\Updater\SetupFactory">
-        <param name="resourceTypes">
-            <array>
-                <item key="customer_setup"><value>Magento\Customer\Model\Resource\Setup</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="resourceTypes" xsi:type="array">
+                <item name="customer_setup" xsi:type="string">Magento\Customer\Model\Resource\Setup</item>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Customer\Helper\Address">
-        <param name="addressConfig">
-            <instance type="Magento\Customer\Model\Address\Config\Proxy" />
-        </param>
+        <arguments>
+            <argument name="addressConfig" xsi:type="object">Magento\Customer\Model\Address\Config\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Customer\Model\Config\Share">
-        <param name="customerResource">
-            <instance type="Magento\Customer\Model\Resource\Customer\Proxy" />
-        </param>
+        <arguments>
+            <argument name="customerResource" xsi:type="object">Magento\Customer\Model\Resource\Customer\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Customer\Model\Customer">
-        <param name="customerData">
-            <instance type="Magento\Customer\Helper\Data\Proxy" />
-        </param>
+        <arguments>
+            <argument name="customerData" xsi:type="object">Magento\Customer\Helper\Data\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Customer\Service\V1\Dto\AddressBuilder" shared="false" />
     <type name="Magento\Customer\Service\V1\Dto\CustomerBuilder" shared="false" />
@@ -81,4 +75,11 @@
     <type name="Magento\Customer\Service\V1\Dto\Response\CreateCustomerAccountResponseBuilder" shared="false" />
     <type name="Magento\Customer\Service\V1\Dto\SearchCriteriaBuilder" shared="false" />
     <type name="Magento\Customer\Service\V1\Dto\SearchResultsBuilder" shared="false" />
+    <type name="Magento\Eav\Model\Entity\Setup\PropertyMapper\Composite">
+        <arguments>
+            <argument name="propertyMappers" xsi:type="array">
+                <item name="customer" xsi:type="string">Magento\Customer\Model\Resource\Setup\PropertyMapper</item>
+            </argument>
+        </arguments>
+    </type>
 </config>
diff --git a/app/code/Magento/Customer/etc/frontend/di.xml b/app/code/Magento/Customer/etc/frontend/di.xml
index c74382804f4..1747860ebbe 100644
--- a/app/code/Magento/Customer/etc/frontend/di.xml
+++ b/app/code/Magento/Customer/etc/frontend/di.xml
@@ -23,26 +23,26 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Customer\Model\Session">
-        <param name="sessionName">
-            <value>frontend</value>
-        </param>
+        <arguments>
+            <argument name="sessionName" xsi:type="string">frontend</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\Url\SecurityInfo">
-        <param name="secureUrlList">
-            <array>
-                <item key="customer"><value>/customer/</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="secureUrlList" xsi:type="array">
+                <item name="customer" xsi:type="string">/customer/</item>
+            </argument>
+        </arguments>
     </type>
     <virtualType name="customerAccountInitSession" type="Magento\Core\App\Action\Plugin\Session">
-        <param name="cookieCheckActions">
-            <array>
-                <item key="customerLogin"><value>loginPost</value></item>
-                <item key="customerCreate"><value>createpost</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="cookieCheckActions" xsi:type="array">
+                <item name="customerLogin" xsi:type="string">loginPost</item>
+                <item name="customerCreate" xsi:type="string">createpost</item>
+            </argument>
+        </arguments>
     </virtualType>
     <type name="Magento\Customer\Controller\Account">
         <plugin name="sessionInitializer" type="customerAccountInitSession" />
diff --git a/app/code/Magento/Customer/view/adminhtml/layout/customer_index_edit.xml b/app/code/Magento/Customer/view/adminhtml/layout/customer_index_edit.xml
index 977836cabab..6224e40f32a 100644
--- a/app/code/Magento/Customer/view/adminhtml/layout/customer_index_edit.xml
+++ b/app/code/Magento/Customer/view/adminhtml/layout/customer_index_edit.xml
@@ -34,11 +34,6 @@
                 <argument name="file" xsi:type="string">Magento_Catalog::catalog/product/composite/configure.js</argument>
             </arguments>
         </block>
-        <block class="Magento\Theme\Block\Html\Head\Script" name="varien-configurable-js">
-            <arguments>
-                <argument name="file" xsi:type="string">varien/configurable.js</argument>
-            </arguments>
-        </block>
         <block class="Magento\Theme\Block\Html\Head\Script" name="magento-adminhtml-customer-edit-tab-js-addresses.js">
             <arguments>
                 <argument name="file" xsi:type="string">Magento_Customer::edit/tab/js/addresses.js</argument>
diff --git a/app/code/Magento/Customer/view/adminhtml/tab/addresses.phtml b/app/code/Magento/Customer/view/adminhtml/tab/addresses.phtml
index 7e6405f4403..e14743187ee 100644
--- a/app/code/Magento/Customer/view/adminhtml/tab/addresses.phtml
+++ b/app/code/Magento/Customer/view/adminhtml/tab/addresses.phtml
@@ -24,6 +24,7 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 ?>
+<?php /* @var $this \Magento\Customer\Block\Adminhtml\Edit\Tab\Addresses */ ?>
 <script data-template="tab-address-content" type="text/x-jquery-tmpl">
     <div>
         {{if prefix || firstname || middlename || lastname || suffix}}
@@ -50,15 +51,21 @@
         <span><?php echo __('Customer Addresses') ?></span>
     </legend>
     <br />
-
-    <div id="address-tabs" data-mage-init='{"addressTabs":{"itemCount": <?php echo count($addressCollection) ?>,
-            deleteConfirmPrompt: "<?php echo __('Are you sure you want to delete this address?') ?>",
-            regionsUrl: "<?php echo $this->getRegionsUrl(); ?>",
-            optionalZipCountries: <?php echo $this->helper("Magento\Directory\Helper\Data")->getCountriesWithOptionalZip(true) ?>,
-            requiredStateForCountries: <?php echo $this->helper('Magento\Directory\Helper\Data')->getCountriesWithStatesRequired(true) ?>,
-            showAllRegions: <?php echo (string)$this->helper('Magento\Directory\Helper\Data')->isShowNonRequiredState() ? 1 : 0; ?>,
-            defaultCountries: <?php echo $this->getDefaultCountriesJson(); ?>,
-            templatePrefix: "<?php echo $this->getTemplatePrefix() ?>" }}'>
+    <?php
+    $mageInitializationData = $this->jsonEncode([
+        'addressTabs' => [
+            'itemCount'                     => count($addressCollection),
+            'deleteConfirmPrompt'           => __('Are you sure you want to delete this address?'),
+            'regionsUrl'                    => $this->getRegionsUrl(),
+            'optionalZipCountries'          => $this->getOptionalZipCountries(),
+            'requiredStateForCountries'     => $this->getRequiredStateForCountries(),
+            'showAllRegions'                => $this->getShowAllRegions(),
+            'defaultCountries'              => $this->getDefaultCountries(),
+            'templatePrefix'                => $this->getTemplatePrefix(),
+        ]
+    ]);
+    ?>
+    <div id="address-tabs" data-mage-init='<?= $this->escapeHtml($mageInitializationData)?>'>
         <ul class="address-list" id="address_list">
             <?php $_iterator = 0; ?>
             <?php if(count($addressCollection)): ?>
diff --git a/lib/Magento/Phrase/Renderer/Factory.php b/app/code/Magento/DesignEditor/Model/AreaEmulator.php
similarity index 68%
rename from lib/Magento/Phrase/Renderer/Factory.php
rename to app/code/Magento/DesignEditor/Model/AreaEmulator.php
index 611d9139c35..2033f6233bc 100644
--- a/lib/Magento/Phrase/Renderer/Factory.php
+++ b/app/code/Magento/DesignEditor/Model/AreaEmulator.php
@@ -1,7 +1,5 @@
 <?php
 /**
- * Renderers Factory
- *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -23,20 +21,17 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-namespace Magento\Phrase\Renderer;
 
-class Factory
+namespace Magento\DesignEditor\Model;
+
+class AreaEmulator
 {
     /**
-     * Object manager
-     *
      * @var \Magento\ObjectManager
      */
     protected $_objectManager;
 
     /**
-     * Constructor
-     *
      * @param \Magento\ObjectManager $objectManager
      */
     public function __construct(\Magento\ObjectManager $objectManager)
@@ -45,19 +40,20 @@ class Factory
     }
 
     /**
-     * Create renderer
-     *
-     * @param string $className
-     * @return \Magento\Phrase\RendererInterface
-     * @throws \InvalidArgumentException
+     * @param string $areaCode
      */
-    public function create($className)
+    public function emulateLayoutArea($areaCode)
     {
-        $renderer = $this->_objectManager->get($className);
-
-        if (!$renderer instanceof \Magento\Phrase\RendererInterface) {
-            throw new \InvalidArgumentException('Wrong renderer ' . $className);
-        }
-        return $renderer;
+        $configuration = array(
+            'Magento\Core\Model\Layout' => array(
+                'arguments' => array(
+                    'area' => array(
+                        \Magento\ObjectManager\Config\Reader\Dom::TYPE_ATTRIBUTE => 'string',
+                        'value' => $areaCode
+                    )
+                )
+            )
+        );
+        $this->_objectManager->configure($configuration);
     }
 }
diff --git a/app/code/Magento/DesignEditor/Model/State.php b/app/code/Magento/DesignEditor/Model/State.php
index 3ad7b65e20e..a79f6bd8ad9 100644
--- a/app/code/Magento/DesignEditor/Model/State.php
+++ b/app/code/Magento/DesignEditor/Model/State.php
@@ -30,11 +30,6 @@ namespace Magento\DesignEditor\Model;
  */
 class State
 {
-    /**
-     * Name of layout classes that will be used as main layout
-     */
-    const LAYOUT_NAVIGATION_CLASS_NAME = 'Magento\Core\Model\Layout';
-
     /**
      * Url model classes that will be used instead of \Magento\UrlInterface in navigation vde modes
      */
@@ -58,9 +53,9 @@ class State
     protected $_backendSession;
 
     /**
-     * @var \Magento\Core\Model\Layout\Factory
+     * @var AreaEmulator
      */
-    protected $_layoutFactory;
+    protected $_areaEmulator;
 
     /**
      * @var \Magento\DesignEditor\Model\Url\Factory
@@ -98,7 +93,7 @@ class State
 
     /**
      * @param \Magento\Backend\Model\Session $backendSession
-     * @param \Magento\Core\Model\Layout\Factory $layoutFactory
+     * @param AreaEmulator $areaEmulator
      * @param \Magento\DesignEditor\Model\Url\Factory $urlModelFactory
      * @param \Magento\App\Cache\StateInterface $cacheState
      * @param \Magento\DesignEditor\Helper\Data $dataHelper
@@ -109,7 +104,7 @@ class State
      */
     public function __construct(
         \Magento\Backend\Model\Session $backendSession,
-        \Magento\Core\Model\Layout\Factory $layoutFactory,
+        AreaEmulator $areaEmulator,
         \Magento\DesignEditor\Model\Url\Factory $urlModelFactory,
         \Magento\App\Cache\StateInterface $cacheState,
         \Magento\DesignEditor\Helper\Data $dataHelper,
@@ -119,7 +114,7 @@ class State
         \Magento\Core\Model\StoreManagerInterface $storeManager
     ) {
         $this->_backendSession  = $backendSession;
-        $this->_layoutFactory   = $layoutFactory;
+        $this->_areaEmulator    = $areaEmulator;
         $this->_urlModelFactory = $urlModelFactory;
         $this->_cacheState      = $cacheState;
         $this->_dataHelper      = $dataHelper;
@@ -146,7 +141,7 @@ class State
             $this->_backendSession->setData(self::CURRENT_MODE_SESSION_KEY, $mode);
         }
         $this->_injectUrlModel($mode);
-        $this->_injectLayout($mode, $areaCode);
+        $this->_emulateArea($mode, $areaCode);
         $this->_setTheme();
         $this->_disableCache();
     }
@@ -165,18 +160,18 @@ class State
     }
 
     /**
-     * Create layout instance that will be used as main layout for whole system
+     * Emulate environment of an area
      *
      * @param string $mode
      * @param string $areaCode
      * @return void
      */
-    protected function _injectLayout($mode, $areaCode)
+    protected function _emulateArea($mode, $areaCode)
     {
         switch ($mode) {
             case self::MODE_NAVIGATION:
             default:
-                $this->_layoutFactory->createLayout(array('area' => $areaCode), self::LAYOUT_NAVIGATION_CLASS_NAME);
+                $this->_areaEmulator->emulateLayoutArea($areaCode);
                 break;
         }
     }
diff --git a/app/code/Magento/DesignEditor/etc/adminhtml/di.xml b/app/code/Magento/DesignEditor/etc/adminhtml/di.xml
index cf4edb73dda..8f517c0e9cf 100644
--- a/app/code/Magento/DesignEditor/etc/adminhtml/di.xml
+++ b/app/code/Magento/DesignEditor/etc/adminhtml/di.xml
@@ -23,10 +23,10 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\DesignEditor\Block\Adminhtml\Editor\Tools\Files\Content\Files">
-        <param name="storageHelper">
-            <instance type="Magento\Theme\Helper\Storage\Proxy" />
-        </param>
+        <arguments>
+            <argument name="storageHelper" xsi:type="object">Magento\Theme\Helper\Storage\Proxy</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/DesignEditor/etc/di.xml b/app/code/Magento/DesignEditor/etc/di.xml
index b60f4b20bdd..d1025ff1691 100644
--- a/app/code/Magento/DesignEditor/etc/di.xml
+++ b/app/code/Magento/DesignEditor/etc/di.xml
@@ -23,24 +23,22 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\DesignEditor\Controller\Varien\Router\Standard">
-        <param name="routerId">
-            <value>vde</value>
-        </param>
+        <arguments>
+            <argument name="routerId" xsi:type="string">vde</argument>
+        </arguments>
     </type>
     <type name="Magento\Theme\Model\CopyService">
         <plugin name="design_editor_theme_copy_service_plugin" type="Magento\DesignEditor\Model\Plugin\ThemeCopyService"/>
     </type>
     <type name="Magento\DesignEditor\Helper\Data">
-        <param name="frontName">
-            <value>vde</value>
-        </param>
-        <param name="disabledCacheTypes">
-            <array>
-                <item key="block_html"><value>block_html</value></item>
-                <item key="configType"><value>config</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="frontName" xsi:type="string">vde</argument>
+            <argument name="disabledCacheTypes" xsi:type="array">
+                <item name="block_html" xsi:type="string">block_html</item>
+                <item name="configType" xsi:type="string">config</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/DesignEditor/etc/frontend/di.xml b/app/code/Magento/DesignEditor/etc/frontend/di.xml
index fe9b602f093..3b165063312 100644
--- a/app/code/Magento/DesignEditor/etc/frontend/di.xml
+++ b/app/code/Magento/DesignEditor/etc/frontend/di.xml
@@ -23,18 +23,16 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\App\RouterList">
-        <param name="routerList">
-            <array>
-                <item key="vde">
-                    <array>
-                        <item key="instance"><value>Magento\DesignEditor\Controller\Varien\Router\Standard</value></item>
-                        <item key="disable"><value type="bool">false</value></item>
-                        <item key="sortOrder"><value>40</value></item>
-                    </array>
+        <arguments>
+            <argument name="routerList" xsi:type="array">
+                <item name="vde" xsi:type="array">
+                    <item name="instance" xsi:type="string">Magento\DesignEditor\Controller\Varien\Router\Standard</item>
+                    <item name="disable" xsi:type="boolean">false</item>
+                    <item name="sortOrder" xsi:type="string">40</item>
                 </item>
-            </array>
-        </param>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Directory/data/directory_setup/data-install-1.6.0.0.php b/app/code/Magento/Directory/data/directory_setup/data-install-1.6.0.0.php
index 5d445806b80..ab8271d1ebb 100644
--- a/app/code/Magento/Directory/data/directory_setup/data-install-1.6.0.0.php
+++ b/app/code/Magento/Directory/data/directory_setup/data-install-1.6.0.0.php
@@ -138,7 +138,7 @@ $data = array(
     array('DE', 'THE', 'Thüringen'), array('AT', 'WI', 'Wien'), array('AT', 'NO', 'Niederösterreich'),
     array('AT', 'OO', 'Oberösterreich'), array('AT', 'SB', 'Salzburg'), array('AT', 'KN', 'Kärnten'),
     array('AT', 'ST', 'Steiermark'), array('AT', 'TI', 'Tirol'), array('AT', 'BL', 'Burgenland'),
-    array('AT', 'VB', 'Voralberg'), array('CH', 'AG', 'Aargau'), array('CH', 'AI', 'Appenzell Innerrhoden'),
+    array('AT', 'VB', 'Vorarlberg'), array('CH', 'AG', 'Aargau'), array('CH', 'AI', 'Appenzell Innerrhoden'),
     array('CH', 'AR', 'Appenzell Ausserrhoden'), array('CH', 'BE', 'Bern'), array('CH', 'BL', 'Basel-Landschaft'),
     array('CH', 'BS', 'Basel-Stadt'), array('CH', 'FR', 'Freiburg'), array('CH', 'GE', 'Genf'),
     array('CH', 'GL', 'Glarus'), array('CH', 'GR', 'Graubünden'), array('CH', 'JU', 'Jura'),
diff --git a/app/code/Magento/Directory/etc/di.xml b/app/code/Magento/Directory/etc/di.xml
index dd708713e14..de45c212f54 100644
--- a/app/code/Magento/Directory/etc/di.xml
+++ b/app/code/Magento/Directory/etc/di.xml
@@ -23,25 +23,23 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Directory\Model\Resource\Country\Collection" shared="false" />
     <type name="Magento\Directory\Model\Currency\Import\Config">
-        <param name="servicesConfig">
-            <array>
-                <item key="webservicex">
-                    <array>
-                        <item key="label"><value>Webservicex</value></item>
-                        <item key="class"><value>Magento\Directory\Model\Currency\Import\Webservicex</value></item>
-                    </array>
+        <arguments>
+            <argument name="servicesConfig" xsi:type="array">
+                <item name="webservicex" xsi:type="array">
+                    <item name="label" xsi:type="string">Webservicex</item>
+                    <item name="class" xsi:type="string">Magento\Directory\Model\Currency\Import\Webservicex</item>
                 </item>
-            </array>
-        </param>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Module\Updater\SetupFactory">
-        <param name="resourceTypes">
-            <array>
-                <item key="directory_setup"><value>Magento\Directory\Model\Resource\Setup</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="resourceTypes" xsi:type="array">
+                <item name="directory_setup" xsi:type="string">Magento\Directory\Model\Resource\Setup</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Downloadable/Model/Observer.php b/app/code/Magento/Downloadable/Model/Observer.php
index 9be8023eda3..9d96e05c9a3 100644
--- a/app/code/Magento/Downloadable/Model/Observer.php
+++ b/app/code/Magento/Downloadable/Model/Observer.php
@@ -126,34 +126,6 @@ class Observer
 
         return $this;
     }
-    /**
-     * Change product type on the fly depending on selected options
-     *
-     * @param  \Magento\Event\Observer $observer
-     * @return \Magento\Downloadable\Model\Observer
-     */
-    public function transitionProductType(\Magento\Event\Observer $observer)
-    {
-        $request = $observer->getEvent()->getRequest();
-        $product = $observer->getEvent()->getProduct();
-        $downloadable = $request->getPost('downloadable');
-        $isTransitionalType = $product->getTypeId() === \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE
-            || $product->getTypeId() === \Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL
-            || $product->getTypeId() === \Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE;
-
-        if ($isTransitionalType) {
-            if ($product->hasIsVirtual()) {
-                if ($downloadable) {
-                    $product->setTypeId(\Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE);
-                } else {
-                    $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL);
-                }
-            } else {
-                $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE);
-            }
-        }
-        return $this;
-    }
 
     /**
      * Save data from order to purchased links
diff --git a/app/code/Magento/Downloadable/Model/Product/TypeTransitionManager/Plugin/Downloadable.php b/app/code/Magento/Downloadable/Model/Product/TypeTransitionManager/Plugin/Downloadable.php
new file mode 100644
index 00000000000..7d1ffbaa3ec
--- /dev/null
+++ b/app/code/Magento/Downloadable/Model/Product/TypeTransitionManager/Plugin/Downloadable.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Plugin for product type transition manager
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Downloadable\Model\Product\TypeTransitionManager\Plugin;
+
+use Magento\App\RequestInterface,
+    Magento\Code\Plugin\InvocationChain;
+
+class Downloadable
+{
+    /**
+     * Request instance
+     *
+     * @var \Magento\App\RequestInterface
+     */
+    protected $request;
+
+    /**
+     * @param RequestInterface $request
+     */
+    public function __construct(
+        RequestInterface $request
+    ) {
+        $this->request = $request;
+    }
+
+    /**
+     * Change product type to downloadable if needed
+     *
+     * @param array $arguments
+     * @param InvocationChain $invocationChain
+     */
+    public function aroundProcessProduct(array $arguments, InvocationChain $invocationChain)
+    {
+        /** @var \Magento\Catalog\Model\Product $product */
+        $product = $arguments[0];
+        $isTypeCompatible = in_array($product->getTypeId(), array(
+            \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE,
+            \Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL,
+            \Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE,
+        ));
+        $hasDownloadableData = $this->request->getPost('downloadable');
+        if ($isTypeCompatible && $hasDownloadableData && $product->hasIsVirtual()) {
+            $product->setTypeId(\Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE);
+            return;
+        }
+        $invocationChain->proceed($arguments);
+    }
+}
diff --git a/app/code/Magento/Downloadable/etc/adminhtml/di.xml b/app/code/Magento/Downloadable/etc/adminhtml/di.xml
index 9b7e3391548..84b35f86752 100644
--- a/app/code/Magento/Downloadable/etc/adminhtml/di.xml
+++ b/app/code/Magento/Downloadable/etc/adminhtml/di.xml
@@ -23,15 +23,15 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper">
         <plugin name="Downloadable" type="Magento\Downloadable\Controller\Adminhtml\Product\Initialization\Helper\Plugin\Downloadable" sortOrder="70" />
     </type>
     <type name="Magento\Catalog\Model\Product\CopyConstructor\Composite">
-        <param name="constructors">
-            <array>
-                <item key="downloadable"><value>Magento\Downloadable\Model\Product\CopyConstructor\Downloadable</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="constructors" xsi:type="array">
+                <item name="downloadable" xsi:type="string">Magento\Downloadable\Model\Product\CopyConstructor\Downloadable</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Downloadable/etc/adminhtml/events.xml b/app/code/Magento/Downloadable/etc/adminhtml/events.xml
index 189e9c81a74..8acd54d7157 100644
--- a/app/code/Magento/Downloadable/etc/adminhtml/events.xml
+++ b/app/code/Magento/Downloadable/etc/adminhtml/events.xml
@@ -30,7 +30,4 @@
     <event name="sales_order_save_commit_after">
         <observer name="downloadable_observer" instance="Magento\Downloadable\Model\Observer" method="setLinkStatus" />
     </event>
-    <event name="catalog_product_transition_product_type">
-        <observer name="downloadable_type_transition" instance="Magento\Downloadable\Model\Observer" method="transitionProductType" />
-    </event>
 </config>
diff --git a/app/code/Magento/Downloadable/etc/di.xml b/app/code/Magento/Downloadable/etc/di.xml
index 51067a60ba8..689982d45b9 100644
--- a/app/code/Magento/Downloadable/etc/di.xml
+++ b/app/code/Magento/Downloadable/etc/di.xml
@@ -23,25 +23,33 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Downloadable\Helper\Download">
-        <param name="coreFileStorageDb">
-            <instance type="Magento\Core\Helper\File\Storage\Database\Proxy" />
-        </param>
+        <arguments>
+            <argument name="coreFileStorageDb" xsi:type="object">Magento\Core\Helper\File\Storage\Database\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Catalog\Helper\Product">
-        <param name="typeSwitcherLabel">
-            <value>Virtual / Downloadable</value>
-        </param>
+        <arguments>
+            <argument name="typeSwitcherLabel" xsi:type="string">Virtual / Downloadable</argument>
+        </arguments>
     </type>
     <type name="Magento\Module\Updater\SetupFactory">
-        <param name="resourceTypes">
-            <array>
-                <item key="downloadable_setup"><value>Magento\Catalog\Model\Resource\Setup</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="resourceTypes" xsi:type="array">
+                <item name="downloadable_setup" xsi:type="string">Magento\Catalog\Model\Resource\Setup</item>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Catalog\Model\Product\CartConfiguration">
         <plugin name="Downloadable" type="Magento\Downloadable\Model\Product\CartConfiguration\Plugin\Downloadable" />
     </type>
+    <type name="Magento\Catalog\Model\Product\TypeTransitionManager">
+        <plugin name="downloadable_product_transition" type="Magento\Downloadable\Model\Product\TypeTransitionManager\Plugin\Downloadable" />
+        <arguments>
+            <argument name="compatibleTypes" xsi:type="array">
+                <item name="downloadable" xsi:type="const">Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE</item>
+            </argument>
+        </arguments>
+    </type>
 </config>
diff --git a/app/code/Magento/Downloadable/etc/frontend/di.xml b/app/code/Magento/Downloadable/etc/frontend/di.xml
index 5bfe97b5686..f2e4202fb3f 100644
--- a/app/code/Magento/Downloadable/etc/frontend/di.xml
+++ b/app/code/Magento/Downloadable/etc/frontend/di.xml
@@ -23,13 +23,13 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Core\Model\Url\SecurityInfo">
-        <param name="secureUrlList">
-            <array>
-                <item key="downloadable"><value>/downloadable/customer/</value></item>
-                <item key="downloadable_download"><value>/downloadable/download/</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="secureUrlList" xsi:type="array">
+                <item name="downloadable" xsi:type="string">/downloadable/customer/</item>
+                <item name="downloadable_download" xsi:type="string">/downloadable/download/</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Downloadable/sql/downloadable_setup/install-1.6.0.0.php b/app/code/Magento/Downloadable/sql/downloadable_setup/install-1.6.0.0.php
index fd9d8fd568e..9937cc09565 100644
--- a/app/code/Magento/Downloadable/sql/downloadable_setup/install-1.6.0.0.php
+++ b/app/code/Magento/Downloadable/sql/downloadable_setup/install-1.6.0.0.php
@@ -457,7 +457,6 @@ $installer->addAttribute(\Magento\Catalog\Model\Product::ENTITY, 'links_purchase
     'visible_on_front'        => false,
     'unique'                  => false,
     'apply_to'                => 'downloadable',
-    'is_configurable'         => false,
     'used_in_product_listing' => true
 ));
 
@@ -480,7 +479,6 @@ $installer->addAttribute(\Magento\Catalog\Model\Product::ENTITY, 'samples_title'
     'visible_on_front'  => false,
     'unique'            => false,
     'apply_to'          => 'downloadable',
-    'is_configurable'   => false
 ));
 
 $installer->addAttribute(\Magento\Catalog\Model\Product::ENTITY, 'links_title', array(
@@ -502,7 +500,6 @@ $installer->addAttribute(\Magento\Catalog\Model\Product::ENTITY, 'links_title',
     'visible_on_front'  => false,
     'unique'            => false,
     'apply_to'          => 'downloadable',
-    'is_configurable'   => false
 ));
 
 $installer->addAttribute(\Magento\Catalog\Model\Product::ENTITY, 'links_exist', array(
@@ -524,7 +521,6 @@ $installer->addAttribute(\Magento\Catalog\Model\Product::ENTITY, 'links_exist',
     'visible_on_front'          => false,
     'unique'                    => false,
     'apply_to'                  => 'downloadable',
-    'is_configurable'           => false,
     'used_in_product_listing'   => 1
 ));
 
diff --git a/app/code/Magento/Downloadable/view/adminhtml/layout/catalog_product_downloadable.xml b/app/code/Magento/Downloadable/view/adminhtml/layout/catalog_product_downloadable.xml
index 6604955417f..b993d8e7f46 100644
--- a/app/code/Magento/Downloadable/view/adminhtml/layout/catalog_product_downloadable.xml
+++ b/app/code/Magento/Downloadable/view/adminhtml/layout/catalog_product_downloadable.xml
@@ -24,20 +24,10 @@
  */
 -->
 <layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-    <update handle="catalog_product_superconfig_config"/>
     <referenceBlock name="product_tabs">
         <action method="addTab">
             <argument name="name" xsi:type="string">downloadable_items</argument>
             <argument name="block" xsi:type="string">Magento\Downloadable\Block\Adminhtml\Catalog\Product\Edit\Tab\Downloadable</argument>
         </action>
     </referenceBlock>
-    <referenceContainer name="product-type-tabs">
-        <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config" name="admin.product.edit.tab.super.config.grid.container">
-            <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config" template="Magento_Catalog::catalog/product/edit/super/generator.phtml" name="product-variations-generator" as="generator">
-                <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config" template="Magento_Catalog::catalog/product/edit/super/attribute-js-template.phtml" as="template"/>
-                <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config\Attribute" template="Magento_Catalog::catalog/product/edit/super/attribute-template.phtml" as="attribute-renderer"/>
-                <block class="Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config\Matrix" template="Magento_Catalog::catalog/product/edit/super/matrix.phtml" as="matrix"/>
-            </block>
-        </block>
-    </referenceContainer>
 </layout>
diff --git a/app/code/Magento/Eav/Model/Entity/AbstractEntity.php b/app/code/Magento/Eav/Model/Entity/AbstractEntity.php
index d67aca2d8c2..a2b7a1400e9 100644
--- a/app/code/Magento/Eav/Model/Entity/AbstractEntity.php
+++ b/app/code/Magento/Eav/Model/Entity/AbstractEntity.php
@@ -496,10 +496,6 @@ abstract class AbstractEntity extends \Magento\Core\Model\Resource\AbstractResou
 
         $attribute = $attributeInstance;
 
-        if (empty($attributeId)) {
-            $attributeId = $attribute->getAttributeId();
-        }
-
         if (!$attribute->getAttributeCode()) {
             $attribute->setAttributeCode($attributeCode);
         }
diff --git a/app/code/Magento/Eav/Model/Entity/Attribute/AbstractAttribute.php b/app/code/Magento/Eav/Model/Entity/Attribute/AbstractAttribute.php
index 3612ed9b620..e62a57013b2 100644
--- a/app/code/Magento/Eav/Model/Entity/Attribute/AbstractAttribute.php
+++ b/app/code/Magento/Eav/Model/Entity/Attribute/AbstractAttribute.php
@@ -650,12 +650,7 @@ abstract class AbstractAttribute
         if ($this->usesSource() && $this->getBackendType() != self::TYPE_STATIC) {
             return $this->getSource()->getFlatColums();
         }
-
-        if ($this->_coreData->useDbCompatibleMode()) {
-            return $this->_getFlatColumnsOldDefinition();
-        } else {
-            return $this->_getFlatColumnsDdlDefinition();
-        }
+        return $this->_getFlatColumnsDdlDefinition();
     }
 
     /**
diff --git a/app/code/Magento/Eav/Model/Entity/Attribute/Config/Reader.php b/app/code/Magento/Eav/Model/Entity/Attribute/Config/Reader.php
index 88bd6f997c5..1b24b335629 100644
--- a/app/code/Magento/Eav/Model/Entity/Attribute/Config/Reader.php
+++ b/app/code/Magento/Eav/Model/Entity/Attribute/Config/Reader.php
@@ -33,9 +33,9 @@ class Reader extends \Magento\Config\Reader\Filesystem
      * @var array
      */
     protected $_idAttributes = array(
-        'config/entity' => 'type',
-        'config/entity/attribute' => 'code',
-        'config/entity/attribute/field' => 'code'
+        '/config/entity' => 'type',
+        '/config/entity/attribute' => 'code',
+        '/config/entity/attribute/field' => 'code'
     );
 
     /**
diff --git a/app/code/Magento/Eav/Model/Entity/Attribute/Source/Boolean.php b/app/code/Magento/Eav/Model/Entity/Attribute/Source/Boolean.php
index 832419e40d4..fde4daefacb 100644
--- a/app/code/Magento/Eav/Model/Entity/Attribute/Source/Boolean.php
+++ b/app/code/Magento/Eav/Model/Entity/Attribute/Source/Boolean.php
@@ -124,16 +124,10 @@ class Boolean extends \Magento\Eav\Model\Entity\Attribute\Source\AbstractSource
             'default'   => null,
             'extra'     => null
         );
-
-        if ($this->_coreData->useDbCompatibleMode()) {
-            $column['type']     = 'tinyint(1)';
-            $column['is_null']  = true;
-        } else {
-            $column['type']     = \Magento\DB\Ddl\Table::TYPE_SMALLINT;
-            $column['length']   = 1;
-            $column['nullable'] = true;
-            $column['comment']  = $attributeCode . ' column';
-        }
+        $column['type']     = \Magento\DB\Ddl\Table::TYPE_SMALLINT;
+        $column['length']   = 1;
+        $column['nullable'] = true;
+        $column['comment']  = $attributeCode . ' column';
 
         return array($attributeCode => $column);
     }
diff --git a/app/code/Magento/Eav/Model/Entity/Attribute/Source/Table.php b/app/code/Magento/Eav/Model/Entity/Attribute/Source/Table.php
index cc598aeea43..3d234fc3804 100644
--- a/app/code/Magento/Eav/Model/Entity/Attribute/Source/Table.php
+++ b/app/code/Magento/Eav/Model/Entity/Attribute/Source/Table.php
@@ -182,45 +182,26 @@ class Table extends \Magento\Eav\Model\Entity\Attribute\Source\AbstractSource
         $attributeCode = $this->getAttribute()->getAttributeCode();
         $isMulti = $this->getAttribute()->getFrontend()->getInputType() == 'multiselect';
 
-        if ($this->_coreData->useDbCompatibleMode()) {
-            $columns[$attributeCode] = array(
-                'type'      => $isMulti ? 'varchar(255)' : 'int',
-                'unsigned'  => false,
-                'is_null'   => true,
-                'default'   => null,
-                'extra'     => null
-            );
-            if (!$isMulti) {
-                $columns[$attributeCode . '_value'] = array(
-                    'type'      => 'varchar(255)',
-                    'unsigned'  => false,
-                    'is_null'   => true,
-                    'default'   => null,
-                    'extra'     => null
-                );
-            }
-        } else {
-            $type = ($isMulti) ? \Magento\DB\Ddl\Table::TYPE_TEXT : \Magento\DB\Ddl\Table::TYPE_INTEGER;
-            $columns[$attributeCode] = array(
-                'type'      => $type,
-                'length'    => $isMulti ? '255' : null,
+        $type = ($isMulti) ? \Magento\DB\Ddl\Table::TYPE_TEXT : \Magento\DB\Ddl\Table::TYPE_INTEGER;
+        $columns[$attributeCode] = array(
+            'type'      => $type,
+            'length'    => $isMulti ? '255' : null,
+            'unsigned'  => false,
+            'nullable'   => true,
+            'default'   => null,
+            'extra'     => null,
+            'comment'   => $attributeCode . ' column'
+        );
+        if (!$isMulti) {
+            $columns[$attributeCode . '_value'] = array(
+                'type'      => \Magento\DB\Ddl\Table::TYPE_TEXT,
+                'length'    => 255,
                 'unsigned'  => false,
-                'nullable'   => true,
+                'nullable'  => true,
                 'default'   => null,
                 'extra'     => null,
                 'comment'   => $attributeCode . ' column'
             );
-            if (!$isMulti) {
-                $columns[$attributeCode . '_value'] = array(
-                    'type'      => \Magento\DB\Ddl\Table::TYPE_TEXT,
-                    'length'    => 255,
-                    'unsigned'  => false,
-                    'nullable'  => true,
-                    'default'   => null,
-                    'extra'     => null,
-                    'comment'   => $attributeCode . ' column'
-                );
-            }
         }
 
         return $columns;
diff --git a/app/code/Magento/Eav/Model/Entity/Setup.php b/app/code/Magento/Eav/Model/Entity/Setup.php
index b4ee2645db2..b573cefa3c5 100644
--- a/app/code/Magento/Eav/Model/Entity/Setup.php
+++ b/app/code/Magento/Eav/Model/Entity/Setup.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * EAV Entity Setup Model
+ *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -18,20 +20,11 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Eav
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 namespace Magento\Eav\Model\Entity;
 
-/**
- * EAV Entity Setup Model
- *
- * @category   Magento
- * @package    Magento_Eav
- * @author     Magento Core Team <core@magentocommerce.com>
- */
 class Setup extends \Magento\Core\Model\Resource\Setup
 {
     /**
@@ -45,24 +38,29 @@ class Setup extends \Magento\Core\Model\Resource\Setup
     protected $_attrGroupCollectionFactory;
 
     /**
-     * @param \Magento\Core\Model\Resource\Setup\Context $context
-     * @param string $resourceName
+     * @var Setup\PropertyMapperInterface
+     */
+    protected $attributeMapper;
+
+    /**
+     * @param Setup\Context $context
+     * @param $resourceName
      * @param \Magento\App\CacheInterface $cache
      * @param \Magento\Eav\Model\Resource\Entity\Attribute\Group\CollectionFactory $attrGroupCollectionFactory
      * @param string $moduleName
      * @param string $connectionName
      */
     public function __construct(
-        \Magento\Core\Model\Resource\Setup\Context $context,
+        \Magento\Eav\Model\Entity\Setup\Context $context,
         $resourceName,
         \Magento\App\CacheInterface $cache,
         \Magento\Eav\Model\Resource\Entity\Attribute\Group\CollectionFactory $attrGroupCollectionFactory,
         $moduleName = 'Magento_Eav',
         $connectionName = ''
     ) {
-
         $this->_cache = $cache;
         $this->_attrGroupCollectionFactory = $attrGroupCollectionFactory;
+        $this->attributeMapper = $context->getAttributeMapper();
         parent::__construct($context, $resourceName, $moduleName, $connectionName);
     }
 
@@ -108,7 +106,7 @@ class Setup extends \Magento\Core\Model\Resource\Setup
     }
 
     /**
-     * @return \Magento\Eav\Model\Resource\Entity\Attribute\Group\CollectionFactory
+     * @return \Magento\Eav\Model\Resource\Entity\Attribute\Group\Collection
      */
     public function getAttributeGroupCollectionFactory()
     {
@@ -656,36 +654,6 @@ class Setup extends \Magento\Core\Model\Resource\Setup
         return isset($array[$key]) ? $array[$key] : $default;
     }
 
-    /**
-     * Prepare attribute values to save
-     *
-     * @param array $attr
-     * @return array
-     */
-    protected function _prepareValues($attr)
-    {
-        $data = array(
-            'backend_model'   => $this->_getValue($attr, 'backend'),
-            'backend_type'    => $this->_getValue($attr, 'type', 'varchar'),
-            'backend_table'   => $this->_getValue($attr, 'table'),
-            'frontend_model'  => $this->_getValue($attr, 'frontend'),
-            'frontend_input'  => $this->_getValue($attr, 'input', 'text'),
-            'frontend_label'  => $this->_getValue($attr, 'label'),
-            'frontend_class'  => $this->_getValue($attr, 'frontend_class'),
-            'source_model'    => $this->_getValue($attr, 'source'),
-            'is_required'     => $this->_getValue($attr, 'required', 1),
-            'is_user_defined' => $this->_getValue($attr, 'user_defined', 0),
-            'default_value'   => $this->_getValue($attr, 'default'),
-            'is_unique'       => $this->_getValue($attr, 'unique', 0),
-            'note'            => $this->_getValue($attr, 'note'),
-            'is_global'       => $this->_getValue($attr, 'global',
-                                     \Magento\Catalog\Model\Resource\Eav\Attribute::SCOPE_GLOBAL
-                                 ),
-        );
-
-        return $data;
-    }
-
     /**
      * Validate attribute data before insert into table
      *
@@ -721,13 +689,14 @@ class Setup extends \Magento\Core\Model\Resource\Setup
     public function addAttribute($entityTypeId, $code, array $attr)
     {
         $entityTypeId = $this->getEntityTypeId($entityTypeId);
-        $data = array_merge(
+
+        $data = array_replace(
             array(
                 'entity_type_id' => $entityTypeId,
                 'attribute_code' => $code
             ),
-            $this->_prepareValues($attr)
-         );
+            $this->attributeMapper->map($attr, $entityTypeId)
+        );
 
         $this->_validateAttributeData($data);
 
diff --git a/app/code/Magento/Eav/Model/Entity/Setup/Context.php b/app/code/Magento/Eav/Model/Entity/Setup/Context.php
new file mode 100644
index 00000000000..904fc4f563b
--- /dev/null
+++ b/app/code/Magento/Eav/Model/Entity/Setup/Context.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Eav setup context object
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Eav\Model\Entity\Setup;
+
+class Context extends \Magento\Core\Model\Resource\Setup\Context
+{
+    /**
+     * @var PropertyMapperInterface
+     */
+    protected $attributeMapper;
+
+    /**
+     * @param \Magento\Logger $logger
+     * @param \Magento\Event\ManagerInterface $eventManager
+     * @param \Magento\App\Resource $resource
+     * @param \Magento\Module\Dir\Reader $modulesReader
+     * @param \Magento\Module\ModuleListInterface $moduleList
+     * @param \Magento\Core\Model\Resource\Resource $resourceResource
+     * @param \Magento\Core\Model\Resource\Setup\MigrationFactory $migrationFactory
+     * @param \Magento\Core\Model\Resource\Theme\CollectionFactory $themeResourceFactory
+     * @param \Magento\Core\Model\Theme\CollectionFactory $themeFactory
+     * @param \Magento\Encryption\EncryptorInterface $encryptor
+     * @param \Magento\App\Filesystem $filesystem
+     * @param PropertyMapperInterface $attributeMapper
+     */
+    public function __construct(
+        \Magento\Logger $logger,
+        \Magento\Event\ManagerInterface $eventManager,
+        \Magento\App\Resource $resource,
+        \Magento\Module\Dir\Reader $modulesReader,
+        \Magento\Module\ModuleListInterface $moduleList,
+        \Magento\Core\Model\Resource\Resource $resourceResource,
+        \Magento\Core\Model\Resource\Setup\MigrationFactory $migrationFactory,
+        \Magento\Core\Model\Resource\Theme\CollectionFactory $themeResourceFactory,
+        \Magento\Core\Model\Theme\CollectionFactory $themeFactory,
+        \Magento\Encryption\EncryptorInterface $encryptor,
+        \Magento\App\Filesystem $filesystem,
+        PropertyMapperInterface $attributeMapper
+    ) {
+        $this->attributeMapper = $attributeMapper;
+        parent::__construct(
+            $logger, $eventManager, $resource, $modulesReader, $moduleList, $resourceResource,
+            $migrationFactory, $themeResourceFactory, $themeFactory, $encryptor, $filesystem
+        );
+    }
+
+    /**
+     * @return PropertyMapperInterface
+     */
+    public function getAttributeMapper()
+    {
+        return $this->attributeMapper;
+    }
+}
diff --git a/app/code/Magento/Eav/Model/Entity/Setup/PropertyMapper.php b/app/code/Magento/Eav/Model/Entity/Setup/PropertyMapper.php
new file mode 100644
index 00000000000..a88c9dfcb2f
--- /dev/null
+++ b/app/code/Magento/Eav/Model/Entity/Setup/PropertyMapper.php
@@ -0,0 +1,58 @@
+<?php
+/**
+ * Default entity attribute mapper
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Eav\Model\Entity\Setup;
+
+use  \Magento\Catalog\Model\Resource\Eav\Attribute;
+
+class PropertyMapper extends PropertyMapperAbstract
+{
+    /**
+     * Map input attribute properties to storage representation
+     *
+     * @param array $input
+     * @param int $entityTypeId
+     * @return array
+     */
+    public function map(array $input, $entityTypeId)
+    {
+        return array(
+            'backend_model'   => $this->_getValue($input, 'backend'),
+            'backend_type'    => $this->_getValue($input, 'type', 'varchar'),
+            'backend_table'   => $this->_getValue($input, 'table'),
+            'frontend_model'  => $this->_getValue($input, 'frontend'),
+            'frontend_input'  => $this->_getValue($input, 'input', 'text'),
+            'frontend_label'  => $this->_getValue($input, 'label'),
+            'frontend_class'  => $this->_getValue($input, 'frontend_class'),
+            'source_model'    => $this->_getValue($input, 'source'),
+            'is_required'     => $this->_getValue($input, 'required', 1),
+            'is_user_defined' => $this->_getValue($input, 'user_defined', 0),
+            'default_value'   => $this->_getValue($input, 'default'),
+            'is_unique'       => $this->_getValue($input, 'unique', 0),
+            'note'            => $this->_getValue($input, 'note'),
+            'is_global'       => $this->_getValue($input, 'global', Attribute::SCOPE_GLOBAL),
+        );
+    }
+} 
diff --git a/app/code/Magento/Eav/Model/Entity/Setup/PropertyMapper/Composite.php b/app/code/Magento/Eav/Model/Entity/Setup/PropertyMapper/Composite.php
new file mode 100644
index 00000000000..8f377f61654
--- /dev/null
+++ b/app/code/Magento/Eav/Model/Entity/Setup/PropertyMapper/Composite.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * Composite attribute property mapper
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Eav\Model\Entity\Setup\PropertyMapper;
+
+use Magento\Eav\Model\Entity\Setup\PropertyMapperInterface;
+use Magento\ObjectManager;
+
+class Composite implements PropertyMapperInterface
+{
+    /**
+     * @var \Magento\ObjectManager
+     */
+    protected $objectManager;
+
+    /**
+     * @var array
+     */
+    protected $propertyMappers;
+
+    /**
+     * @param ObjectManager $objectManager
+     * @param array $propertyMappers
+     */
+    public function __construct(ObjectManager $objectManager, array $propertyMappers = array())
+    {
+        $this->objectManager = $objectManager;
+        $this->propertyMappers = $propertyMappers;
+    }
+
+    /**
+     * Map input attribute properties to storage representation
+     *
+     * @param array $input
+     * @param int $entityTypeId
+     * @return array
+     * @throws \InvalidArgumentException
+     */
+    public function map(array $input, $entityTypeId)
+    {
+        $data = array();
+        foreach ($this->propertyMappers as $class) {
+            if (!is_subclass_of($class, '\Magento\Eav\Model\Entity\Setup\PropertyMapperInterface')) {
+                throw new \InvalidArgumentException(
+                    'Property mapper ' . $class . ' must'
+                        . ' implement \Magento\Eav\Model\Entity\Setup\PropertyMapperInterface'
+                );
+            }
+            $data = array_replace($data, $this->objectManager->get($class)->map($input, $entityTypeId));
+        }
+        return $data;
+    }
+}
diff --git a/app/code/Magento/Eav/Model/Entity/Setup/PropertyMapperAbstract.php b/app/code/Magento/Eav/Model/Entity/Setup/PropertyMapperAbstract.php
new file mode 100644
index 00000000000..9401d95a8fb
--- /dev/null
+++ b/app/code/Magento/Eav/Model/Entity/Setup/PropertyMapperAbstract.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Abstract attribute property mapper
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Eav\Model\Entity\Setup;
+
+abstract class PropertyMapperAbstract implements PropertyMapperInterface
+{
+    /**
+     * Retrieve value from array by key or return default value
+     *
+     * @param array $array
+     * @param string $key
+     * @param string $default
+     * @return string
+     */
+    protected function _getValue($array, $key, $default = null)
+    {
+        if (isset($array[$key]) && is_bool($array[$key])) {
+            $array[$key] = (int) $array[$key];
+        }
+        return isset($array[$key]) ? $array[$key] : $default;
+    }
+}
diff --git a/app/code/Magento/Eav/Model/Entity/Setup/PropertyMapperInterface.php b/app/code/Magento/Eav/Model/Entity/Setup/PropertyMapperInterface.php
new file mode 100644
index 00000000000..d65918ebb69
--- /dev/null
+++ b/app/code/Magento/Eav/Model/Entity/Setup/PropertyMapperInterface.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Attribute property mapper interface
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Eav\Model\Entity\Setup;
+
+interface PropertyMapperInterface
+{
+    /**
+     * Map input attribute properties to storage representation
+     *
+     * @param array $input
+     * @param int $entityTypeId
+     * @return array
+     */
+    public function map(array $input, $entityTypeId);
+}
diff --git a/app/code/Magento/Eav/etc/di.xml b/app/code/Magento/Eav/etc/di.xml
index 8bc8259daaa..6d861d66641 100644
--- a/app/code/Magento/Eav/etc/di.xml
+++ b/app/code/Magento/Eav/etc/di.xml
@@ -23,17 +23,25 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <preference for="Magento\Eav\Model\Entity\Setup\PropertyMapperInterface" type="Magento\Eav\Model\Entity\Setup\PropertyMapper\Composite" />
     <type name="Magento\Eav\Model\Resource\Helper">
-        <param name="modulePrefix">
-            <value>eav</value>
-        </param>
+        <arguments>
+            <argument name="modulePrefix" xsi:type="string">eav</argument>
+        </arguments>
     </type>
     <type name="Magento\Module\Updater\SetupFactory">
-        <param name="resourceTypes">
-            <array>
-                <item key="eav_setup"><value>Magento\Eav\Model\Entity\Setup</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="resourceTypes" xsi:type="array">
+                <item name="eav_setup" xsi:type="string">Magento\Eav\Model\Entity\Setup</item>
+            </argument>
+        </arguments>
+    </type>
+    <type name="Magento\Eav\Model\Entity\Setup\PropertyMapper\Composite">
+        <arguments>
+            <argument name="propertyMappers" xsi:type="array">
+                <item name="default" xsi:type="string">Magento\Eav\Model\Entity\Setup\PropertyMapper</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Eav/i18n/de_DE.csv b/app/code/Magento/Eav/i18n/de_DE.csv
index 21f775bb6bb..22a5a022bea 100644
--- a/app/code/Magento/Eav/i18n/de_DE.csv
+++ b/app/code/Magento/Eav/i18n/de_DE.csv
@@ -35,7 +35,6 @@
 "An error occurred while loading the collection, aborting. Error: %s","Fehler beim Laden der Zusammenstellung, Abbruch. Fehler: %s"
 "An error occurred while saving a record, aborting. Error: ","Fehler beim Speichern eines Eintrags, Abbruch. Fehler:"
 "Attempt to add an invalid object","Versuch, ein ungültiges Objekt hinzuzufügen"
-"Attribute '%s' used in configurable products","Attribut '%s' wird für konfigurierbare Produkte verwendet"
 "Attribute Code","Attributcode"
 "Attribute Label","Attributlabel"
 "Attribute Properties","Attributeigenschaften"
@@ -111,7 +110,6 @@
 "The attribute code \'%s\' is reserved by system. Please try another attribute code","Der Attributcode \'%s\' wurde vom System reserviert. Bitte probieren Sie einen anderen Attributcode aus."
 "The value of attribute ""%s"" must be unique","Der Wert des Attributs ""%s"" muss einzigartig sein."
 "The value of attribute ""%s"" must be unique.","Der Wert des Attributs ""%s"" muss einzigartig sein."
-"This attribute is used in configurable products","Dieses Attribut wird für konfigurierbare Produkte verwendet"
 "URL","URL"
 "Unique Value","Einmaliger Wert"
 "Unique Value (not shared with other products)","Einmaliger Wert (nicht mit anderen Produkten geteilt)"
diff --git a/app/code/Magento/Eav/i18n/en_US.csv b/app/code/Magento/Eav/i18n/en_US.csv
index d8af90a97d5..cc86ab14969 100644
--- a/app/code/Magento/Eav/i18n/en_US.csv
+++ b/app/code/Magento/Eav/i18n/en_US.csv
@@ -35,7 +35,6 @@
 "An error occurred while loading the collection, aborting. Error: %s","An error occurred while loading the collection, aborting. Error: %s"
 "An error occurred while saving a record, aborting. Error: ","An error occurred while saving a record, aborting. Error: "
 "Attempt to add an invalid object","Attempt to add an invalid object"
-"Attribute '%s' used in configurable products","Attribute '%s' used in configurable products"
 "Attribute Code","Attribute Code"
 "Attribute Label","Attribute Label"
 "Attribute Properties","Attribute Properties"
@@ -111,7 +110,6 @@
 "The attribute code \'%s\' is reserved by system. Please try another attribute code","The attribute code \'%s\' is reserved by system. Please try another attribute code"
 "The value of attribute ""%s"" must be unique","The value of attribute ""%s"" must be unique"
 "The value of attribute ""%s"" must be unique.","The value of attribute ""%s"" must be unique."
-"This attribute is used in configurable products","This attribute is used in configurable products"
 "URL","URL"
 "Unique Value","Unique Value"
 "Unique Value (not shared with other products)","Unique Value (not shared with other products)"
diff --git a/app/code/Magento/Eav/i18n/es_ES.csv b/app/code/Magento/Eav/i18n/es_ES.csv
index bf2f97f95a7..0bd271735d9 100644
--- a/app/code/Magento/Eav/i18n/es_ES.csv
+++ b/app/code/Magento/Eav/i18n/es_ES.csv
@@ -35,7 +35,6 @@
 "An error occurred while loading the collection, aborting. Error: %s","Se produjo un error al cargar la recopilación. Se anulará la operación. Error: %s"
 "An error occurred while saving a record, aborting. Error: ","Se produjo un error al guardar un registro. Se anulará la operación. Error: %s"
 "Attempt to add an invalid object","Intento de añadir un objeto inválido"
-"Attribute '%s' used in configurable products","Campo ""%s"" utilizado en productos configurables"
 "Attribute Code","Código de atributo"
 "Attribute Label","Etiqueta de atributo"
 "Attribute Properties","Propiedades de atributo"
@@ -111,7 +110,6 @@
 "The attribute code \'%s\' is reserved by system. Please try another attribute code","El código de atributo \'%s\' está reservado por el sistema. Por favor, prueba con otro código de atributo"
 "The value of attribute ""%s"" must be unique","El valor del atributo ""%s"" tiene que ser único"
 "The value of attribute ""%s"" must be unique.","El valor del atributo ""%s"" tiene que ser único."
-"This attribute is used in configurable products","Este atributo se utiliza en productos configurables"
 "URL","URL"
 "Unique Value","Valor único"
 "Unique Value (not shared with other products)","Valor único (no se comparte con otros productos)"
diff --git a/app/code/Magento/Eav/i18n/fr_FR.csv b/app/code/Magento/Eav/i18n/fr_FR.csv
index 362ffd80088..bed65a5677c 100644
--- a/app/code/Magento/Eav/i18n/fr_FR.csv
+++ b/app/code/Magento/Eav/i18n/fr_FR.csv
@@ -35,7 +35,6 @@
 "An error occurred while loading the collection, aborting. Error: %s","Une erreur est survenue lors du chargement de la collection. Erreur : %s"
 "An error occurred while saving a record, aborting. Error: ","Une erreur est survenue lors de la sauvegarde d'un enregistrement. Erreur :"
 "Attempt to add an invalid object","Tentative d'ajout d'un objet invalide"
-"Attribute '%s' used in configurable products","L'attribut ""%s"" est utilisé dans les produits configurables"
 "Attribute Code","Code d'attribut"
 "Attribute Label","Label d'attribut"
 "Attribute Properties","Propriétés d'attribut"
@@ -111,7 +110,6 @@
 "The attribute code \'%s\' is reserved by system. Please try another attribute code","Le code d'attribut  \'%s\' est réservé par le système. Veuillez essayer un autre code"
 "The value of attribute ""%s"" must be unique","La valeur de l'attribut ""%s"" doit être unique"
 "The value of attribute ""%s"" must be unique.","La valeur de l'attribut ""%s"" doit être unique."
-"This attribute is used in configurable products","Cet attribut est utilisé pour des produits configurables"
 "URL","URL"
 "Unique Value","Valeur unique"
 "Unique Value (not shared with other products)","Valeur unique (non partagée avec d'autres produits)"
diff --git a/app/code/Magento/Eav/i18n/nl_NL.csv b/app/code/Magento/Eav/i18n/nl_NL.csv
index e83bb50735d..0e58223045a 100644
--- a/app/code/Magento/Eav/i18n/nl_NL.csv
+++ b/app/code/Magento/Eav/i18n/nl_NL.csv
@@ -35,7 +35,6 @@
 "An error occurred while loading the collection, aborting. Error: %s","Er is een fout opgetreden tijdens het laden van de collectie, afbreken. Fout: %s"
 "An error occurred while saving a record, aborting. Error: ","Er is een fout opgetreden tijdens het opslaan van een record, afbreken. Fout:"
 "Attempt to add an invalid object","Poging een ongeldig object toe te voegen"
-"Attribute '%s' used in configurable products","Attribuut '%s' gebruikt in configureerbare producten"
 "Attribute Code","Attribuutcode"
 "Attribute Label","Attribuutlabel"
 "Attribute Properties","Attribuut Eigenschappen"
@@ -111,7 +110,6 @@
 "The attribute code \'%s\' is reserved by system. Please try another attribute code","De attribuutcode \'%s\' is door het systeem gereserveerd. Probeer alsjeblieft een andere attribuutcode."
 "The value of attribute ""%s"" must be unique","De waarde van attribuut ""%s"" moet uniek zijn"
 "The value of attribute ""%s"" must be unique.","De waarde van attribute ""%s"" moet uniek zijn."
-"This attribute is used in configurable products","Dit attribuut wordt gebruikt in configureerbare producten"
 "URL","URL"
 "Unique Value","Unieke waarde"
 "Unique Value (not shared with other products)","Unieke waarde (niet gedeeld met andere producten)"
diff --git a/app/code/Magento/Eav/i18n/pt_BR.csv b/app/code/Magento/Eav/i18n/pt_BR.csv
index 62edf153aa6..4629f833bce 100644
--- a/app/code/Magento/Eav/i18n/pt_BR.csv
+++ b/app/code/Magento/Eav/i18n/pt_BR.csv
@@ -35,7 +35,6 @@
 "An error occurred while loading the collection, aborting. Error: %s","Ocorreu um erro ao carregar a coleção, abortando. Erro: %s"
 "An error occurred while saving a record, aborting. Error: ","Ocorreu um erro ao salvar um registro, abortando. Erro:"
 "Attempt to add an invalid object","Tentativa de adicionar um objeto inválido"
-"Attribute '%s' used in configurable products","Atributo '%s' usado em produtos configuráveis"
 "Attribute Code","Código do Atributo"
 "Attribute Label","Etiqueta do Atributo"
 "Attribute Properties","Propriedades do Atributo"
@@ -111,7 +110,6 @@
 "The attribute code \'%s\' is reserved by system. Please try another attribute code","O código de atributo \'%s\' é reservado pelo sistema. Tente outro código de atributo"
 "The value of attribute ""%s"" must be unique","O valor do atributo ""%s"" tem de ser único."
 "The value of attribute ""%s"" must be unique.","O valor do atributo ""%s"" tem de ser único."
-"This attribute is used in configurable products","Este atributo é utilizado em produtos configuráveis"
 "URL","URL"
 "Unique Value","Valor Único"
 "Unique Value (not shared with other products)","Valor Único (não compartilhado com outros produtos)"
diff --git a/app/code/Magento/Eav/i18n/zh_CN.csv b/app/code/Magento/Eav/i18n/zh_CN.csv
index f6691f540f4..5d54aa8a219 100644
--- a/app/code/Magento/Eav/i18n/zh_CN.csv
+++ b/app/code/Magento/Eav/i18n/zh_CN.csv
@@ -35,7 +35,6 @@
 "An error occurred while loading the collection, aborting. Error: %s","加载集合时出错,正在忽略。错误:%s"
 "An error occurred while saving a record, aborting. Error: ","保存记录时出错,正在忽略。错误:"
 "Attempt to add an invalid object","尝试添加的对象无效"
-"Attribute '%s' used in configurable products","配置产品中使用的属性 '%s'"
 "Attribute Code","属性代码"
 "Attribute Label","属性标签"
 "Attribute Properties","属性的属性"
@@ -111,7 +110,6 @@
 "The attribute code \'%s\' is reserved by system. Please try another attribute code","属性代码‘%s’已被系统预留。请尝试另一个属性代码"
 "The value of attribute ""%s"" must be unique","属性“%s”的值必须为唯一"
 "The value of attribute ""%s"" must be unique.","属性“%s”的值必须为唯一。"
-"This attribute is used in configurable products","该属性已用于可配置产品"
 "URL","URL"
 "Unique Value","唯一数值"
 "Unique Value (not shared with other products)","唯一数值(不与其它产品共享)"
diff --git a/app/code/Magento/GiftMessage/Model/Resource/Setup.php b/app/code/Magento/GiftMessage/Model/Resource/Setup.php
index 9f320c800a0..b68ea5089cb 100644
--- a/app/code/Magento/GiftMessage/Model/Resource/Setup.php
+++ b/app/code/Magento/GiftMessage/Model/Resource/Setup.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Gift Message resource setup
+ *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -18,15 +20,9 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_GiftMessage
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-/**
- * Gift Message resource setup
- */
 namespace Magento\GiftMessage\Model\Resource;
 
 class Setup extends \Magento\Sales\Model\Resource\Setup
@@ -37,7 +33,7 @@ class Setup extends \Magento\Sales\Model\Resource\Setup
     protected $_catalogSetupFactory;
 
     /**
-     * @param \Magento\Core\Model\Resource\Setup\Context $context
+     * @param \Magento\Eav\Model\Entity\Setup\Context $context
      * @param string $resourceName
      * @param \Magento\App\CacheInterface $cache
      * @param \Magento\Eav\Model\Resource\Entity\Attribute\Group\CollectionFactory $attrGroupCollectionFactory
@@ -47,7 +43,7 @@ class Setup extends \Magento\Sales\Model\Resource\Setup
      * @param string $connectionName
      */
     public function __construct(
-        \Magento\Core\Model\Resource\Setup\Context $context,
+        \Magento\Eav\Model\Entity\Setup\Context $context,
         $resourceName,
         \Magento\App\CacheInterface $cache,
         \Magento\Eav\Model\Resource\Entity\Attribute\Group\CollectionFactory $attrGroupCollectionFactory,
@@ -57,7 +53,9 @@ class Setup extends \Magento\Sales\Model\Resource\Setup
         $connectionName = ''
     ) {
         $this->_catalogSetupFactory = $catalogSetupFactory;
-        parent::__construct($context, $resourceName, $cache, $attrGroupCollectionFactory, $config, $moduleName, $connectionName);
+        parent::__construct(
+            $context, $resourceName, $cache, $attrGroupCollectionFactory, $config, $moduleName, $connectionName
+        );
     }
 
     /**
diff --git a/app/code/Magento/GiftMessage/etc/di.xml b/app/code/Magento/GiftMessage/etc/di.xml
index a8f808469b9..f79cf514794 100644
--- a/app/code/Magento/GiftMessage/etc/di.xml
+++ b/app/code/Magento/GiftMessage/etc/di.xml
@@ -23,12 +23,12 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Module\Updater\SetupFactory">
-        <param name="resourceTypes">
-            <array>
-                <item key="giftmessage_setup"><value>Magento\GiftMessage\Model\Resource\Setup</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="resourceTypes" xsi:type="array">
+                <item name="giftmessage_setup" xsi:type="string">Magento\GiftMessage\Model\Resource\Setup</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/GiftMessage/sql/giftmessage_setup/install-1.6.0.0.php b/app/code/Magento/GiftMessage/sql/giftmessage_setup/install-1.6.0.0.php
index 4ada148edd4..81a332fcf76 100644
--- a/app/code/Magento/GiftMessage/sql/giftmessage_setup/install-1.6.0.0.php
+++ b/app/code/Magento/GiftMessage/sql/giftmessage_setup/install-1.6.0.0.php
@@ -97,7 +97,6 @@ $installer->createGiftMessageSetup(array('resourceName' => 'catalog_setup'))->ad
         'default'       => '',
         'apply_to'      => '',
         'input_renderer'   => 'Magento\GiftMessage\Block\Adminhtml\Product\Helper\Form\Config',
-        'is_configurable'  => 0,
         'visible_on_front' => false
     )
 );
diff --git a/app/code/Magento/GoogleCheckout/etc/di.xml b/app/code/Magento/GoogleCheckout/etc/di.xml
index c88a94d607b..c3a7d2ca8ea 100644
--- a/app/code/Magento/GoogleCheckout/etc/di.xml
+++ b/app/code/Magento/GoogleCheckout/etc/di.xml
@@ -23,12 +23,12 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Module\Updater\SetupFactory">
-        <param name="resourceTypes">
-            <array>
-                <item key="googlecheckout_setup"><value>Magento\Catalog\Model\Resource\Setup</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="resourceTypes" xsi:type="array">
+                <item name="googlecheckout_setup" xsi:type="string">Magento\Catalog\Model\Resource\Setup</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/GoogleCheckout/etc/frontend/di.xml b/app/code/Magento/GoogleCheckout/etc/frontend/di.xml
index 2f41f0a3319..aca0736b75e 100644
--- a/app/code/Magento/GoogleCheckout/etc/frontend/di.xml
+++ b/app/code/Magento/GoogleCheckout/etc/frontend/di.xml
@@ -23,14 +23,14 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Core\Model\Url\SecurityInfo">
-        <param name="secureUrlList">
-            <array>
-                <item key="googlecheckout_redirect"><value>/googlecheckout/redirect/</value></item>
-                <item key="googlecheckout_beacon"><value>/googlecheckout/api/beacon/</value></item>
-                <item key="googlecheckout_api"><value>/googlecheckout/api/</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="secureUrlList" xsi:type="array">
+                <item name="googlecheckout_redirect" xsi:type="string">/googlecheckout/redirect/</item>
+                <item name="googlecheckout_beacon" xsi:type="string">/googlecheckout/api/beacon/</item>
+                <item name="googlecheckout_api" xsi:type="string">/googlecheckout/api/</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/GoogleCheckout/sql/googlecheckout_setup/install-1.6.0.0.php b/app/code/Magento/GoogleCheckout/sql/googlecheckout_setup/install-1.6.0.0.php
index 2adedc74616..270a25719b8 100644
--- a/app/code/Magento/GoogleCheckout/sql/googlecheckout_setup/install-1.6.0.0.php
+++ b/app/code/Magento/GoogleCheckout/sql/googlecheckout_setup/install-1.6.0.0.php
@@ -74,7 +74,6 @@ $installer->addAttribute(\Magento\Catalog\Model\Product::ENTITY, 'enable_googlec
     'visible_on_front'  => false,
     'unique'            => false,
     'apply_to'          => '',
-    'is_configurable'   => false
 ));
 
 /**
diff --git a/app/code/Magento/GoogleShopping/etc/di.xml b/app/code/Magento/GoogleShopping/etc/di.xml
index 89f94b870f9..a39b7653fce 100644
--- a/app/code/Magento/GoogleShopping/etc/di.xml
+++ b/app/code/Magento/GoogleShopping/etc/di.xml
@@ -23,22 +23,22 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <virtualType name="Magento\GoogleShopping\Model\Resource\Helper" type="Magento\Core\Model\Resource\Helper">
-        <param name="modulePrefix">
-            <value>Core</value>
-        </param>
+        <arguments>
+            <argument name="modulePrefix" xsi:type="string">Core</argument>
+        </arguments>
     </virtualType>
     <type name="Magento\GoogleShopping\Model\Resource\Item\Collection">
-        <param name="resourceHelper">
-            <instance type="Magento\GoogleShopping\Model\Resource\Helper" />
-        </param>
+        <arguments>
+            <argument name="resourceHelper" xsi:type="object">Magento\GoogleShopping\Model\Resource\Helper</argument>
+        </arguments>
     </type>
     <type name="Magento\Module\Updater\SetupFactory">
-        <param name="resourceTypes">
-            <array>
-                <item key="googleshopping_setup"><value>Magento\GoogleShopping\Model\Resource\Setup</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="resourceTypes" xsi:type="array">
+                <item name="googleshopping_setup" xsi:type="string">Magento\GoogleShopping\Model\Resource\Setup</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/GroupedProduct/Model/Product/Type/Grouped.php b/app/code/Magento/GroupedProduct/Model/Product/Type/Grouped.php
index d5c0707de2f..2bac6613980 100644
--- a/app/code/Magento/GroupedProduct/Model/Product/Type/Grouped.php
+++ b/app/code/Magento/GroupedProduct/Model/Product/Type/Grouped.php
@@ -53,26 +53,26 @@ class Grouped extends \Magento\Catalog\Model\Product\Type\AbstractType
      *
      * @var string
      */
-    protected $_keyStatusFilters        = '_cache_instance_status_filters';
+    protected $_keyStatusFilters = '_cache_instance_status_filters';
 
     /**
      * Product is composite properties
      *
      * @var bool
      */
-    protected $_isComposite             = true;
+    protected $_isComposite = true;
 
     /**
-     * Product is configurable
+     * Product is possible to configure
      *
      * @var bool
      */
-    protected $_canConfigure            = true;
+    protected $_canConfigure = true;
 
     /**
      * Catalog product status
      *
-     * @var \Magento\Catalog\Model\Product\Status
+     * @var \Magento\Catalog\Model\Product\Attribute\Source\Status
      */
     protected $_catalogProductStatus;
 
@@ -108,7 +108,7 @@ class Grouped extends \Magento\Catalog\Model\Product\Type\AbstractType
      * @param \Magento\Logger $logger
      * @param \Magento\GroupedProduct\Model\Resource\Product\Link $catalogProductLink
      * @param \Magento\Core\Model\StoreManagerInterface $storeManager
-     * @param \Magento\Catalog\Model\Product\Status $catalogProductStatus
+     * @param \Magento\Catalog\Model\Product\Attribute\Source\Status $catalogProductStatus
      * @param \Magento\App\State $appState
      * @param array $data
      *
@@ -127,7 +127,7 @@ class Grouped extends \Magento\Catalog\Model\Product\Type\AbstractType
         \Magento\Logger $logger,
         \Magento\GroupedProduct\Model\Resource\Product\Link $catalogProductLink,
         \Magento\Core\Model\StoreManagerInterface $storeManager,
-        \Magento\Catalog\Model\Product\Status $catalogProductStatus,
+        \Magento\Catalog\Model\Product\Attribute\Source\Status $catalogProductStatus,
         \Magento\App\State $appState,
         array $data = array()
     ) {
@@ -272,8 +272,8 @@ class Grouped extends \Magento\Catalog\Model\Product\Type\AbstractType
     {
         if (!$product->hasData($this->_keyStatusFilters)) {
             return array(
-                \Magento\Catalog\Model\Product\Status::STATUS_ENABLED,
-                \Magento\Catalog\Model\Product\Status::STATUS_DISABLED
+                \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED,
+                \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_DISABLED
             );
         }
         return $product->getData($this->_keyStatusFilters);
diff --git a/app/code/Magento/GroupedProduct/Model/Product/Type/Plugin.php b/app/code/Magento/GroupedProduct/Model/Product/Type/Plugin.php
index 6809c5fc3ec..a77bf06d464 100644
--- a/app/code/Magento/GroupedProduct/Model/Product/Type/Plugin.php
+++ b/app/code/Magento/GroupedProduct/Model/Product/Type/Plugin.php
@@ -45,14 +45,14 @@ class Plugin
     /**
      * Remove grouped product from list of visible product types
      *
-     * @param string $result
-     * @return mixed
+     * @param array $result
+     * @return array
      */
     public function afterGetOptionArray($result)
     {
         if (!$this->moduleManager->isOutputEnabled('Magento_GroupedProduct')) {
-            unset($result[\Magento\GroupedProduct\Model\Product\Type\Grouped::TYPE_CODE]);
+            unset($result[Grouped::TYPE_CODE]);
         }
         return $result;
     }
-} 
+}
diff --git a/app/code/Magento/GroupedProduct/Model/Resource/Indexer/Stock/Grouped.php b/app/code/Magento/GroupedProduct/Model/Resource/Indexer/Stock/Grouped.php
index 39d5f8fdf48..79fbf34a85f 100644
--- a/app/code/Magento/GroupedProduct/Model/Resource/Indexer/Stock/Grouped.php
+++ b/app/code/Magento/GroupedProduct/Model/Resource/Indexer/Stock/Grouped.php
@@ -34,22 +34,12 @@
  */
 namespace Magento\GroupedProduct\Model\Resource\Indexer\Stock;
 
+use \Magento\Catalog\Model\Product\Attribute\Source\Status as ProductStatus;
+
 class Grouped extends \Magento\CatalogInventory\Model\Resource\Indexer\Stock\DefaultStock
 {
     /**
-     * Reindex stock data for defined configurable product ids
-     *
-     * @param int|array $entityIds
-     * @return $this
-     */
-    public function reindexEntity($entityIds)
-    {
-        $this->_updateIndex($entityIds);
-        return $this;
-    }
-
-    /**
-     * Get the select object for get stock status by product ids
+     * Get the select object for get stock status by grouped product ids
      *
      * @param int|array $entityIds
      * @param bool $usePrimaryTable use primary or temporary index table
@@ -91,19 +81,21 @@ class Grouped extends \Magento\CatalogInventory\Model\Resource\Indexer\Stock\Def
             ->group(array('e.entity_id', 'cw.website_id', 'cis.stock_id'));
 
         // add limitation of status
-        $psExpr = $this->_addAttributeToSelect($select, 'status', 'e.entity_id', 'cs.store_id');
-        $psCond = $adapter->quoteInto($psExpr . '=?', \Magento\Catalog\Model\Product\Status::STATUS_ENABLED);
+        $productStatusExpr = $this->_addAttributeToSelect($select, 'status', 'e.entity_id', 'cs.store_id');
+        $productStatusCond = $adapter->quoteInto(
+            $productStatusExpr . '=?', ProductStatus::STATUS_ENABLED
+        );
 
         if ($this->_isManageStock()) {
-            $statusExpr = $adapter->getCheckSql('cisi.use_config_manage_stock = 0 AND cisi.manage_stock = 0',
+            $statusExpression = $adapter->getCheckSql('cisi.use_config_manage_stock = 0 AND cisi.manage_stock = 0',
                 1, 'cisi.is_in_stock');
         } else {
-            $statusExpr = $adapter->getCheckSql('cisi.use_config_manage_stock = 0 AND cisi.manage_stock = 1',
+            $statusExpression = $adapter->getCheckSql('cisi.use_config_manage_stock = 0 AND cisi.manage_stock = 1',
                 'cisi.is_in_stock', 1);
         }
 
-        $optExpr = $adapter->getCheckSql("{$psCond} AND le.required_options = 0", 'i.stock_status', 0);
-        $stockStatusExpr = $adapter->getLeastSql(array("MAX({$optExpr})", "MIN({$statusExpr})"));
+        $optExpr = $adapter->getCheckSql("{$productStatusCond} AND le.required_options = 0", 'i.stock_status', 0);
+        $stockStatusExpr = $adapter->getLeastSql(array("MAX({$optExpr})", "MIN({$statusExpression})"));
 
         $select->columns(array(
             'status' => $stockStatusExpr
diff --git a/app/code/Magento/GroupedProduct/etc/adminhtml/di.xml b/app/code/Magento/GroupedProduct/etc/adminhtml/di.xml
index c55b86bc6d9..5098413360f 100644
--- a/app/code/Magento/GroupedProduct/etc/adminhtml/di.xml
+++ b/app/code/Magento/GroupedProduct/etc/adminhtml/di.xml
@@ -23,7 +23,7 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <preference for="Magento\GroupedProduct\Model\Product\Type\Grouped" type="Magento\GroupedProduct\Model\Product\Type\Grouped\Backend" />
     <type name="Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper\ProductLinks">
         <plugin name="GroupedProduct" type="Magento\GroupedProduct\Controller\Adminhtml\Product\Initialization\Helper\ProductLinks\Plugin\Grouped" />
@@ -32,20 +32,13 @@
         <plugin name="GroupedProduct" type="Magento\GroupedProduct\Block\Adminhtml\Order\Create\Sidebar" sortOrder="100"/>
     </type>
     <type name="Magento\Catalog\Model\Product\CopyConstructor\Composite">
-        <param name="constructors">
-            <array>
-                <item key="grouped"><value>Magento\GroupedProduct\Model\Product\CopyConstructor\Grouped</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="constructors" xsi:type="array">
+                <item name="grouped" xsi:type="string">Magento\GroupedProduct\Model\Product\CopyConstructor\Grouped</item>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Sales\Model\AdminOrder\Product\Quote\Initializer">
         <plugin name="sales_adminorder_quote_initializer_plugin" type="Magento\GroupedProduct\Model\Sales\AdminOrder\Product\Quote\Plugin\Initializer" sortOrder="100"/>
     </type>
-    <type name="Magento\CatalogInventory\Block\Adminhtml\Form\Field\Stock">
-        <param name="complexProductTypes">
-            <array>
-                <item key="grouped"><value type="const">Magento\GroupedProduct\Model\Product\Type\Grouped::TYPE_CODE</value></item>
-            </array>
-        </param>
-    </type>
 </config>
diff --git a/app/code/Magento/GroupedProduct/etc/di.xml b/app/code/Magento/GroupedProduct/etc/di.xml
index ec5064f7831..98d6c5a6f1c 100644
--- a/app/code/Magento/GroupedProduct/etc/di.xml
+++ b/app/code/Magento/GroupedProduct/etc/di.xml
@@ -23,41 +23,41 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Module\Updater\SetupFactory">
-        <param name="resourceTypes">
-            <array>
-                <item key="groupedproduct_setup"><value>Magento\Catalog\Model\Resource\Setup</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="resourceTypes" xsi:type="array">
+                <item name="groupedproduct_setup" xsi:type="string">Magento\Catalog\Model\Resource\Setup</item>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Sales\Model\Quote\Item\RelatedProducts">
-        <param name="relatedProductTypes">
-            <array>
-                <item key="grouped"><value type="const">Magento\GroupedProduct\Model\Product\Type\Grouped::TYPE_CODE</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="relatedProductTypes" xsi:type="array">
+                <item name="grouped" xsi:type="const">Magento\GroupedProduct\Model\Product\Type\Grouped::TYPE_CODE</item>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Catalog\Model\Product\LinkTypeProvider">
-        <param name="linkTypes">
-            <array>
-                <item key="associated"><value type="const">Magento\GroupedProduct\Model\Resource\Product\Link::LINK_TYPE_GROUPED</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="linkTypes" xsi:type="array">
+                <item name="associated" xsi:type="const">Magento\GroupedProduct\Model\Resource\Product\Link::LINK_TYPE_GROUPED</item>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Sales\Model\Resource\Report\Bestsellers">
-        <param name="ignoredProductTypes">
-            <array>
-                <item key="grouped"><value type="const">Magento\GroupedProduct\Model\Product\Type\Grouped::TYPE_CODE</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="ignoredProductTypes" xsi:type="array">
+                <item name="grouped" xsi:type="const">Magento\GroupedProduct\Model\Product\Type\Grouped::TYPE_CODE</item>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Catalog\Model\Product\CatalogPrice">
-        <param name="priceModelPool">
-            <array>
-                <item key="grouped"><value>Magento\GroupedProduct\Model\Product\CatalogPrice</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="priceModelPool" xsi:type="array">
+                <item name="grouped" xsi:type="string">Magento\GroupedProduct\Model\Product\CatalogPrice</item>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Catalog\Model\Product\Type">
         <plugin name="grouped_output" type="Magento\GroupedProduct\Model\Product\Type\Plugin" />
@@ -66,5 +66,3 @@
         <plugin name="isProductConfigured" type="Magento\GroupedProduct\Model\Product\Cart\Configuration\Plugin\Grouped" />
     </type>
 </config>
-
-
diff --git a/app/code/Magento/GroupedProduct/etc/frontend/di.xml b/app/code/Magento/GroupedProduct/etc/frontend/di.xml
index ff50a6003c6..de05a978bc2 100644
--- a/app/code/Magento/GroupedProduct/etc/frontend/di.xml
+++ b/app/code/Magento/GroupedProduct/etc/frontend/di.xml
@@ -23,29 +23,25 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Catalog\Block\Product\AbstractProduct">
-        <param name="priceBlockTypes">
-            <array>
-                <item key="grouped">
-                    <array>
-                        <item key="block"><value>Magento\Catalog\Block\Product\Price</value></item>
-                        <item key="template"><value>Magento_GroupedProduct::product/price.phtml</value></item>
-                    </array>
+        <arguments>
+            <argument name="priceBlockTypes" xsi:type="array">
+                <item name="grouped" xsi:type="array">
+                    <item name="block" xsi:type="string">Magento\Catalog\Block\Product\Price</item>
+                    <item name="template" xsi:type="string">Magento_GroupedProduct::product/price.phtml</item>
                 </item>
-            </array>
-        </param>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Catalog\Block\Product\Price\Template">
-        <param name="priceBlockTypes">
-            <array>
-                <item key="grouped">
-                    <array>
-                        <item key="block"><value>Magento\Catalog\Block\Product\Price</value></item>
-                        <item key="template"><value>Magento_GroupedProduct::product/price.phtml</value></item>
-                    </array>
+        <arguments>
+            <argument name="priceBlockTypes" xsi:type="array">
+                <item name="grouped" xsi:type="array">
+                    <item name="block" xsi:type="string">Magento\Catalog\Block\Product\Price</item>
+                    <item name="template" xsi:type="string">Magento_GroupedProduct::product/price.phtml</item>
                 </item>
-            </array>
-        </param>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/GroupedProduct/etc/product_types.xml b/app/code/Magento/GroupedProduct/etc/product_types.xml
index 997fd427cfc..19648bf6011 100644
--- a/app/code/Magento/GroupedProduct/etc/product_types.xml
+++ b/app/code/Magento/GroupedProduct/etc/product_types.xml
@@ -31,6 +31,7 @@
         <customAttributes>
             <attribute name="is_real_product" value="false"/>
             <attribute name="refundable" value="true"/>
+            <attribute name="taxable" value="false"/>
             <attribute name="is_product_set" value="true"/>
         </customAttributes>
     </type>
diff --git a/app/code/Magento/GroupedProduct/view/adminhtml/layout/catalog_product_new.xml b/app/code/Magento/GroupedProduct/view/adminhtml/layout/catalog_product_new.xml
new file mode 100644
index 00000000000..4deca7611be
--- /dev/null
+++ b/app/code/Magento/GroupedProduct/view/adminhtml/layout/catalog_product_new.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <referenceContainer name="js">
+        <block class="Magento\View\Element\Template" template="Magento_GroupedProduct::product/stock/disabler.phtml"/>
+    </referenceContainer>
+</layout>
diff --git a/app/code/Magento/GroupedProduct/view/adminhtml/product/stock/disabler.phtml b/app/code/Magento/GroupedProduct/view/adminhtml/product/stock/disabler.phtml
new file mode 100644
index 00000000000..45dc2b63868
--- /dev/null
+++ b/app/code/Magento/GroupedProduct/view/adminhtml/product/stock/disabler.phtml
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+?>
+<script type="text/javascript">
+jQuery(function($) {
+    $('#product_info_tabs_product-details_content').on('stockbeforedisable', function(e) {
+        if (e.productType === 'grouped') {
+            e.stopImmediatePropagation();
+            return false;
+        }
+    });
+ });
+</script>
diff --git a/app/code/Magento/ImportExport/Block/Adminhtml/Export/Edit/Form.php b/app/code/Magento/ImportExport/Block/Adminhtml/Export/Edit/Form.php
index 050608917ce..1a55dfc2404 100644
--- a/app/code/Magento/ImportExport/Block/Adminhtml/Export/Edit/Form.php
+++ b/app/code/Magento/ImportExport/Block/Adminhtml/Export/Edit/Form.php
@@ -69,7 +69,7 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic
     /**
      * Prepare form before rendering HTML.
      *
-     * @return \Magento\ImportExport\Block\Adminhtml\Export\Edit\Form
+     * @return $this
      */
     protected function _prepareForm()
     {
diff --git a/app/code/Magento/ImportExport/Block/Adminhtml/Export/Filter.php b/app/code/Magento/ImportExport/Block/Adminhtml/Export/Filter.php
index 45c3c075d5e..54d5044f8e8 100644
--- a/app/code/Magento/ImportExport/Block/Adminhtml/Export/Filter.php
+++ b/app/code/Magento/ImportExport/Block/Adminhtml/Export/Filter.php
@@ -23,6 +23,9 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Block\Adminhtml\Export;
+
+use Magento\Eav\Model\Entity\Attribute;
 
 /**
  * Export filter block
@@ -31,8 +34,6 @@
  * @package     Magento_ImportExport
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\ImportExport\Block\Adminhtml\Export;
-
 class Filter extends \Magento\Backend\Block\Widget\Grid\Extended
 {
     /**
@@ -67,6 +68,8 @@ class Filter extends \Magento\Backend\Block\Widget\Grid\Extended
 
     /**
      * Set grid parameters.
+     *
+     * @return void
      */
     protected function _construct()
     {
@@ -86,11 +89,11 @@ class Filter extends \Magento\Backend\Block\Widget\Grid\Extended
     /**
      * Date 'from-to' filter HTML with values
      *
-     * @param \Magento\Eav\Model\Entity\Attribute $attribute
+     * @param Attribute $attribute
      * @param mixed $value
      * @return string
      */
-    protected function _getDateFromToHtmlWithValue(\Magento\Eav\Model\Entity\Attribute $attribute, $value)
+    protected function _getDateFromToHtmlWithValue(Attribute $attribute, $value)
     {
         $arguments = array(
             'name'         => $this->getFilterElementName($attribute->getAttributeCode()) . '[]',
@@ -119,11 +122,11 @@ class Filter extends \Magento\Backend\Block\Widget\Grid\Extended
     /**
      * Input text filter HTML with value
      *
-     * @param \Magento\Eav\Model\Entity\Attribute $attribute
+     * @param Attribute $attribute
      * @param mixed $value
      * @return string
      */
-    protected function _getInputHtmlWithValue(\Magento\Eav\Model\Entity\Attribute $attribute, $value)
+    protected function _getInputHtmlWithValue(Attribute $attribute, $value)
     {
         $html = '<input type="text" name="' . $this->getFilterElementName($attribute->getAttributeCode())
              . '" class="input-text input-text-export-filter"';
@@ -136,11 +139,11 @@ class Filter extends \Magento\Backend\Block\Widget\Grid\Extended
     /**
      * Multiselect field filter HTML with selected values
      *
-     * @param \Magento\Eav\Model\Entity\Attribute $attribute
+     * @param Attribute $attribute
      * @param mixed $value
      * @return string
      */
-    protected function _getMultiSelectHtmlWithValue(\Magento\Eav\Model\Entity\Attribute $attribute, $value)
+    protected function _getMultiSelectHtmlWithValue(Attribute $attribute, $value)
     {
         if ($attribute->getFilterOptions()) {
             $options = $attribute->getFilterOptions();
@@ -176,11 +179,11 @@ class Filter extends \Magento\Backend\Block\Widget\Grid\Extended
     /**
      * Number 'from-to' field filter HTML with selected value.
      *
-     * @param \Magento\Eav\Model\Entity\Attribute $attribute
+     * @param Attribute $attribute
      * @param mixed $value
      * @return string
      */
-    protected function _getNumberFromToHtmlWithValue(\Magento\Eav\Model\Entity\Attribute $attribute, $value)
+    protected function _getNumberFromToHtmlWithValue(Attribute $attribute, $value)
     {
         $fromValue = null;
         $toValue = null;
@@ -201,11 +204,11 @@ class Filter extends \Magento\Backend\Block\Widget\Grid\Extended
     /**
      * Select field filter HTML with selected value.
      *
-     * @param \Magento\Eav\Model\Entity\Attribute $attribute
+     * @param Attribute $attribute
      * @param mixed $value
      * @return string
      */
-    protected function _getSelectHtmlWithValue(\Magento\Eav\Model\Entity\Attribute $attribute, $value)
+    protected function _getSelectHtmlWithValue(Attribute $attribute, $value)
     {
         if ($attribute->getFilterOptions()) {
             $options = array();
@@ -245,7 +248,7 @@ class Filter extends \Magento\Backend\Block\Widget\Grid\Extended
     /**
      * Add columns to grid
      *
-     * @return \Magento\ImportExport\Block\Adminhtml\Export\Filter
+     * @return $this
      */
     protected function _prepareColumns()
     {
@@ -298,12 +301,12 @@ class Filter extends \Magento\Backend\Block\Widget\Grid\Extended
      * Create filter fields for 'Filter' column.
      *
      * @param mixed $value
-     * @param \Magento\Eav\Model\Entity\Attribute $row
+     * @param Attribute $row
      * @param \Magento\Object $column
      * @param boolean $isExport
      * @return string
      */
-    public function decorateFilter($value, \Magento\Eav\Model\Entity\Attribute $row, \Magento\Object $column, $isExport)
+    public function decorateFilter($value, Attribute $row, \Magento\Object $column, $isExport)
     {
         $value  = null;
         $values = $column->getValues();
@@ -354,8 +357,8 @@ class Filter extends \Magento\Backend\Block\Widget\Grid\Extended
     /**
      * Get row edit URL.
      *
-     * @param $row
-     * @return string|boolean
+     * @param Attribute $row
+     * @return string|false
      */
     public function getRowUrl($row)
     {
diff --git a/app/code/Magento/ImportExport/Block/Adminhtml/Import/Edit/Form.php b/app/code/Magento/ImportExport/Block/Adminhtml/Import/Edit/Form.php
index a1b32ae1c88..d28fdd28762 100644
--- a/app/code/Magento/ImportExport/Block/Adminhtml/Import/Edit/Form.php
+++ b/app/code/Magento/ImportExport/Block/Adminhtml/Import/Edit/Form.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Block\Adminhtml\Import\Edit;
 
 /**
  * Import edit form block
@@ -31,8 +32,6 @@
  * @package     Magento_ImportExport
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\ImportExport\Block\Adminhtml\Import\Edit;
-
 class Form extends \Magento\Backend\Block\Widget\Form\Generic
 {
     /**
@@ -79,7 +78,7 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic
     /**
      * Add fieldsets
      *
-     * @return \Magento\ImportExport\Block\Adminhtml\Import\Edit\Form
+     * @return $this
      */
     protected function _prepareForm()
     {
diff --git a/app/code/Magento/ImportExport/Block/Adminhtml/Import/Frame/Result.php b/app/code/Magento/ImportExport/Block/Adminhtml/Import/Frame/Result.php
index 33b21cbe43d..5533daf68b0 100644
--- a/app/code/Magento/ImportExport/Block/Adminhtml/Import/Frame/Result.php
+++ b/app/code/Magento/ImportExport/Block/Adminhtml/Import/Frame/Result.php
@@ -23,6 +23,9 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Block\Adminhtml\Import\Frame;
+
+use Magento\View\Element\Template;
 
 /**
  * Import frame result block.
@@ -31,10 +34,6 @@
  * @package     Magento_ImportExport
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\ImportExport\Block\Adminhtml\Import\Frame;
-
-use Magento\View\Element\Template;
-
 class Result extends \Magento\Backend\Block\Template
 {
     /**
@@ -88,7 +87,7 @@ class Result extends \Magento\Backend\Block\Template
      * @param string $actionName
      * @param string $elementId
      * @param mixed $value OPTIONAL
-     * @return \Magento\ImportExport\Block\Adminhtml\Import\Frame\Result
+     * @return $this
      */
     public function addAction($actionName, $elementId, $value = null)
     {
@@ -112,7 +111,7 @@ class Result extends \Magento\Backend\Block\Template
      * Add error message.
      *
      * @param string $message Error message
-     * @return \Magento\ImportExport\Block\Adminhtml\Import\Frame\Result
+     * @return $this
      */
     public function addError($message)
     {
@@ -129,9 +128,9 @@ class Result extends \Magento\Backend\Block\Template
     /**
      * Add notice message.
      *
-     * @param mixed $message Message text
-     * @param boolean $appendImportButton OPTIONAL Append import button to message?
-     * @return \Magento\ImportExport\Block\Adminhtml\Import\Frame\Result
+     * @param string[]|string $message Message text
+     * @param bool $appendImportButton OPTIONAL Append import button to message?
+     * @return $this
      */
     public function addNotice($message, $appendImportButton = false)
     {
@@ -148,9 +147,9 @@ class Result extends \Magento\Backend\Block\Template
     /**
      * Add success message.
      *
-     * @param mixed $message Message text
-     * @param boolean $appendImportButton OPTIONAL Append import button to message?
-     * @return \Magento\ImportExport\Block\Adminhtml\Import\Frame\Result
+     * @param string[]|string $message Message text
+     * @param bool $appendImportButton OPTIONAL Append import button to message?
+     * @return $this
      */
     public function addSuccess($message, $appendImportButton = false)
     {
diff --git a/app/code/Magento/ImportExport/Controller/Adminhtml/Export.php b/app/code/Magento/ImportExport/Controller/Adminhtml/Export.php
index 45c7456ec2b..a51466d3c16 100644
--- a/app/code/Magento/ImportExport/Controller/Adminhtml/Export.php
+++ b/app/code/Magento/ImportExport/Controller/Adminhtml/Export.php
@@ -55,7 +55,7 @@ class Export extends \Magento\Backend\App\Action
     /**
      * Initialize layout.
      *
-     * @return \Magento\ImportExport\Controller\Adminhtml\Export
+     * @return $this
      */
     protected function _initAction()
     {
@@ -79,7 +79,7 @@ class Export extends \Magento\Backend\App\Action
     /**
      * Load data with filter applying and create file for download.
      *
-     * @return \Magento\ImportExport\Controller\Adminhtml\Export
+     * @return $this
      */
     public function exportAction()
     {
diff --git a/app/code/Magento/ImportExport/Controller/Adminhtml/Import.php b/app/code/Magento/ImportExport/Controller/Adminhtml/Import.php
index b4df770b8db..565a174c744 100644
--- a/app/code/Magento/ImportExport/Controller/Adminhtml/Import.php
+++ b/app/code/Magento/ImportExport/Controller/Adminhtml/Import.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Controller\Adminhtml;
 
 /**
  * Import controller
@@ -31,8 +32,6 @@
  * @package     Magento_ImportExport
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\ImportExport\Controller\Adminhtml;
-
 class Import extends \Magento\Backend\App\Action
 {
     /**
@@ -47,7 +46,7 @@ class Import extends \Magento\Backend\App\Action
     /**
      * Initialize layout.
      *
-     * @return \Magento\ImportExport\Controller\Adminhtml\Import
+     * @return $this
      */
     protected function _initAction()
     {
@@ -69,6 +68,8 @@ class Import extends \Magento\Backend\App\Action
 
     /**
      * Index action
+     *
+     * @return void
      */
     public function indexAction()
     {
@@ -82,6 +83,8 @@ class Import extends \Magento\Backend\App\Action
 
     /**
      * Start import process action
+     *
+     * @return void
      */
     public function startAction()
     {
@@ -114,6 +117,8 @@ class Import extends \Magento\Backend\App\Action
 
     /**
      * Validate uploaded files action
+     *
+     * @return void
      */
     public function validateAction()
     {
@@ -184,6 +189,7 @@ class Import extends \Magento\Backend\App\Action
      *
      * @param \Magento\ImportExport\Model\Import $import
      * @param \Magento\ImportExport\Block\Adminhtml\Import\Frame\Result $resultBlock
+     * @return void
      */
     protected function _processValidationError(\Magento\ImportExport\Model\Import $import,
         \Magento\ImportExport\Block\Adminhtml\Import\Frame\Result $resultBlock
diff --git a/app/code/Magento/ImportExport/Helper/Data.php b/app/code/Magento/ImportExport/Helper/Data.php
index b4bf91330bb..a428ae7fb4c 100644
--- a/app/code/Magento/ImportExport/Helper/Data.php
+++ b/app/code/Magento/ImportExport/Helper/Data.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Helper;
 
 /**
  * ImportExport data helper
@@ -31,8 +32,6 @@
  * @package     Magento_ImportExport
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\ImportExport\Helper;
-
 class Data extends \Magento\Core\Helper\Data
 {
     /**#@+
@@ -95,7 +94,7 @@ class Data extends \Magento\Core\Helper\Data
     /**
      * Get valid path masks to files for importing/exporting
      *
-     * @return array
+     * @return string[]
      */
     public function getLocalValidPaths()
     {
diff --git a/app/code/Magento/ImportExport/Model/AbstractModel.php b/app/code/Magento/ImportExport/Model/AbstractModel.php
index 03cd96f6f3b..280c9619e49 100644
--- a/app/code/Magento/ImportExport/Model/AbstractModel.php
+++ b/app/code/Magento/ImportExport/Model/AbstractModel.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model;
 
 /**
  * Operation abstract class
@@ -31,14 +32,12 @@
  * @package     Magento_ImportExport
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\ImportExport\Model;
-
 abstract class AbstractModel extends \Magento\Object
 {
     /**
      * Enable loging
      *
-     * @var boolean
+     * @var bool
      */
     protected $_debugMode = false;
 
@@ -51,14 +50,14 @@ abstract class AbstractModel extends \Magento\Object
     /**
      * Fields that should be replaced in debug with '***'
      *
-     * @var array
+     * @var string[]
      */
     protected $_debugReplacePrivateDataKeys = array();
 
     /**
      * Contains all log information
      *
-     * @var array
+     * @var string[]
      */
     protected $_logTrace = array();
 
@@ -100,7 +99,7 @@ abstract class AbstractModel extends \Magento\Object
      * Log file dir: var/log/import_export/%Y/%m/%d/%time%_%operation_type%_%entity_type%.log
      *
      * @param mixed $debugData
-     * @return \Magento\ImportExport\Model\AbstractModel
+     * @return $this
      */
     public function addLogComment($debugData)
     {
@@ -136,7 +135,7 @@ abstract class AbstractModel extends \Magento\Object
     /**
      * Return human readable debug trace.
      *
-     * @return array
+     * @return string
      */
     public function getFormatedLogTrace()
     {
diff --git a/app/code/Magento/ImportExport/Model/Export.php b/app/code/Magento/ImportExport/Model/Export.php
index e4f8bcd7e8f..8fa57ee1feb 100644
--- a/app/code/Magento/ImportExport/Model/Export.php
+++ b/app/code/Magento/ImportExport/Model/Export.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model;
 
 /**
  * Export model
@@ -31,8 +32,6 @@
  * @package     Magento_ImportExport
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\ImportExport\Model;
-
 class Export extends \Magento\ImportExport\Model\AbstractModel
 {
     const FILTER_ELEMENT_GROUP = 'export_filter';
@@ -102,8 +101,8 @@ class Export extends \Magento\ImportExport\Model\AbstractModel
     /**
      * Create instance of entity adapter and return it
      *
-     * @throws \Magento\Core\Exception
      * @return \Magento\ImportExport\Model\Export\Entity\AbstractEntity|\Magento\ImportExport\Model\Export\AbstractEntity
+     * @throws \Magento\Core\Exception
      */
     protected function _getEntityAdapter()
     {
@@ -147,8 +146,8 @@ class Export extends \Magento\ImportExport\Model\AbstractModel
     /**
      * Get writer object.
      *
-     * @throws \Magento\Core\Exception
      * @return \Magento\ImportExport\Model\Export\Adapter\AbstractAdapter
+     * @throws \Magento\Core\Exception
      */
     protected function _getWriter()
     {
@@ -181,8 +180,8 @@ class Export extends \Magento\ImportExport\Model\AbstractModel
     /**
      * Export data.
      *
-     * @throws \Magento\Core\Exception
      * @return string
+     * @throws \Magento\Core\Exception
      */
     public function export()
     {
@@ -227,8 +226,8 @@ class Export extends \Magento\ImportExport\Model\AbstractModel
      *
      * @static
      * @param \Magento\Eav\Model\Entity\Attribute $attribute
-     * @throws \Exception
      * @return string
+     * @throws \Magento\Core\Exception
      */
     public static function getAttributeFilterType(\Magento\Eav\Model\Entity\Attribute $attribute)
     {
@@ -263,8 +262,8 @@ class Export extends \Magento\ImportExport\Model\AbstractModel
     /**
      * Override standard entity getter.
      *
-     * @throw \Exception
      * @return string
+     * @throws \Magento\Core\Exception
      */
     public function getEntity()
     {
@@ -287,8 +286,8 @@ class Export extends \Magento\ImportExport\Model\AbstractModel
     /**
      * Override standard entity getter.
      *
-     * @throw \Exception
      * @return string
+     * @throws \Magento\Core\Exception
      */
     public function getFileFormat()
     {
diff --git a/app/code/Magento/ImportExport/Model/Export/AbstractEntity.php b/app/code/Magento/ImportExport/Model/Export/AbstractEntity.php
index 1df32a9cb7b..4020258f9dc 100644
--- a/app/code/Magento/ImportExport/Model/Export/AbstractEntity.php
+++ b/app/code/Magento/ImportExport/Model/Export/AbstractEntity.php
@@ -23,6 +23,9 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model\Export;
+
+use Magento\ImportExport\Model\Export\Adapter\AbstractAdapter;
 
 /**
  * Export entity abstract model
@@ -31,8 +34,6 @@
  * @package     Magento_ImportExport
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\ImportExport\Model\Export;
-
 abstract class AbstractEntity
 {
     /**#@+
@@ -113,7 +114,7 @@ abstract class AbstractEntity
     /**
      * Source model
      *
-     * @var \Magento\ImportExport\Model\Export\Adapter\AbstractAdapter
+     * @var AbstractAdapter
      */
     protected $_writer;
 
@@ -134,7 +135,7 @@ abstract class AbstractEntity
     /**
      * Disabled attributes
      *
-     * @var array
+     * @var string[]
      */
     protected $_disabledAttributes = array();
 
@@ -200,7 +201,7 @@ abstract class AbstractEntity
     /**
      * Initialize stores hash
      *
-     * @return \Magento\ImportExport\Model\Export\AbstractEntity
+     * @return $this
      */
     protected function _initStores()
     {
@@ -217,7 +218,7 @@ abstract class AbstractEntity
      * Initialize website values
      *
      * @param bool $withDefault
-     * @return \Magento\ImportExport\Model\Export\AbstractEntity
+     * @return $this
      */
     protected function _initWebsites($withDefault = false)
     {
@@ -233,7 +234,7 @@ abstract class AbstractEntity
      *
      * @param string $errorCode Error code or simply column name
      * @param int $errorRowNum Row number
-     * @return \Magento\ImportExport\Model\Export\AbstractEntity
+     * @return $this
      */
     public function addRowError($errorCode, $errorRowNum)
     {
@@ -250,7 +251,7 @@ abstract class AbstractEntity
      *
      * @param string $errorCode Error code
      * @param string $message Message template
-     * @return \Magento\ImportExport\Model\Export\AbstractEntity
+     * @return $this
      */
     public function addMessageTemplate($errorCode, $message)
     {
@@ -270,6 +271,7 @@ abstract class AbstractEntity
      * Export one item
      *
      * @param \Magento\Core\Model\AbstractModel $item
+     * @return void
      */
     abstract public function exportItem($item);
 
@@ -277,6 +279,7 @@ abstract class AbstractEntity
      * Iterate through given collection page by page and export items
      *
      * @param \Magento\Data\Collection\Db $collection
+     * @return void
      */
     protected function _exportCollectionByPages(\Magento\Data\Collection\Db $collection)
     {
@@ -395,8 +398,8 @@ abstract class AbstractEntity
     /**
      * Inner writer object getter
      *
-     * @throws \Exception
-     * @return \Magento\ImportExport\Model\Export\Adapter\AbstractAdapter
+     * @return AbstractAdapter
+     * @throws \Magento\Core\Exception
      */
     public function getWriter()
     {
@@ -410,8 +413,8 @@ abstract class AbstractEntity
     /**
      * Set parameters
      *
-     * @param array $parameters
-     * @return \Magento\ImportExport\Model\Export\AbstractEntity
+     * @param string[] $parameters
+     * @return $this
      */
     public function setParameters(array $parameters)
     {
@@ -423,10 +426,10 @@ abstract class AbstractEntity
     /**
      * Writer model setter
      *
-     * @param \Magento\ImportExport\Model\Export\Adapter\AbstractAdapter $writer
-     * @return \Magento\ImportExport\Model\Export\AbstractEntity
+     * @param AbstractAdapter $writer
+     * @return $this
      */
-    public function setWriter(\Magento\ImportExport\Model\Export\Adapter\AbstractAdapter $writer)
+    public function setWriter(AbstractAdapter $writer)
     {
         $this->_writer = $writer;
 
@@ -437,6 +440,7 @@ abstract class AbstractEntity
      * Set export file name
      *
      * @param null|string $fileName
+     * @return void
      */
     public function setFileName($fileName)
     {
@@ -456,7 +460,7 @@ abstract class AbstractEntity
     /**
      * Retrieve list of disabled attributes codes
      *
-     * @return array
+     * @return string[]
      */
     public function getDisabledAttributes()
     {
diff --git a/app/code/Magento/ImportExport/Model/Export/Adapter/AbstractAdapter.php b/app/code/Magento/ImportExport/Model/Export/Adapter/AbstractAdapter.php
index 449cf6ec2ac..27b06401a00 100644
--- a/app/code/Magento/ImportExport/Model/Export/Adapter/AbstractAdapter.php
+++ b/app/code/Magento/ImportExport/Model/Export/Adapter/AbstractAdapter.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model\Export\Adapter;
 
 /**
  * Abstract adapter model
@@ -31,8 +32,6 @@
  * @package     Magento_ImportExport
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\ImportExport\Model\Export\Adapter;
-
 abstract class AbstractAdapter
 {
     /**
@@ -58,7 +57,7 @@ abstract class AbstractAdapter
      * Constructor
      *
      * @param \Magento\App\Filesystem $filesystem
-     * @param null                $destination
+     * @param string|null $destination
      * @throws \Magento\Core\Exception
      */
     public function __construct(\Magento\App\Filesystem $filesystem, $destination = null)
@@ -87,7 +86,7 @@ abstract class AbstractAdapter
     /**
      * Method called as last step of object instance creation. Can be overridden in child classes.
      *
-     * @return \Magento\ImportExport\Model\Export\Adapter\AbstractAdapter
+     * @return $this
      */
     protected function _init()
     {
@@ -128,7 +127,7 @@ abstract class AbstractAdapter
      * Set column names
      *
      * @param array $headerColumns
-     * @return \Magento\ImportExport\Model\Export\Adapter\AbstractAdapter
+     * @return $this
      */
     public function setHeaderCols(array $headerColumns)
     {
@@ -139,7 +138,7 @@ abstract class AbstractAdapter
      * Write row data to source file
      *
      * @param array $rowData
-     * @return \Magento\ImportExport\Model\Export\Adapter\AbstractAdapter
+     * @return $this
      */
     abstract public function writeRow(array $rowData);
 }
diff --git a/app/code/Magento/ImportExport/Model/Export/Adapter/Csv.php b/app/code/Magento/ImportExport/Model/Export/Adapter/Csv.php
index b47efe23c32..ffa460a98cc 100644
--- a/app/code/Magento/ImportExport/Model/Export/Adapter/Csv.php
+++ b/app/code/Magento/ImportExport/Model/Export/Adapter/Csv.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model\Export\Adapter;
 
 /**
  * Export adapter csv.
@@ -31,8 +32,6 @@
  * @package     Magento_ImportExport
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\ImportExport\Model\Export\Adapter;
-
 class Csv extends \Magento\ImportExport\Model\Export\Adapter\AbstractAdapter
 {
     /**
@@ -58,8 +57,6 @@ class Csv extends \Magento\ImportExport\Model\Export\Adapter\AbstractAdapter
 
     /**
      * Object destructor.
-     *
-     * @return void
      */
     public function __destruct()
     {
@@ -71,7 +68,7 @@ class Csv extends \Magento\ImportExport\Model\Export\Adapter\AbstractAdapter
     /**
      * Method called as last step of object instance creation. Can be overrided in child classes.
      *
-     * @return \Magento\ImportExport\Model\Export\Adapter\AbstractAdapter
+     * @return $this
      */
     protected function _init()
     {
@@ -104,7 +101,7 @@ class Csv extends \Magento\ImportExport\Model\Export\Adapter\AbstractAdapter
      *
      * @param array $headerColumns
      * @throws \Exception
-     * @return \Magento\ImportExport\Model\Export\Adapter\AbstractAdapter
+     * @return $this
      */
     public function setHeaderCols(array $headerColumns)
     {
@@ -125,7 +122,7 @@ class Csv extends \Magento\ImportExport\Model\Export\Adapter\AbstractAdapter
      *
      * @param array $rowData
      * @throws \Exception
-     * @return \Magento\ImportExport\Model\Export\Adapter\AbstractAdapter
+     * @return $this
      */
     public function writeRow(array $rowData)
     {
diff --git a/app/code/Magento/ImportExport/Model/Export/Entity/AbstractEav.php b/app/code/Magento/ImportExport/Model/Export/Entity/AbstractEav.php
index 503a148518e..e1f89b4160b 100644
--- a/app/code/Magento/ImportExport/Model/Export/Entity/AbstractEav.php
+++ b/app/code/Magento/ImportExport/Model/Export/Entity/AbstractEav.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model\Export\Entity;
 
 /**
  * Export EAV entity abstract model
@@ -31,8 +32,6 @@
  * @package     Magento_ImportExport
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\ImportExport\Model\Export\Entity;
-
 abstract class AbstractEav
     extends \Magento\ImportExport\Model\Export\AbstractEntity
 {
@@ -60,14 +59,14 @@ abstract class AbstractEav
     /**
      * Attributes with index (not label) value
      *
-     * @var array
+     * @var string[]
      */
     protected $_indexValueAttributes = array();
 
     /**
      * Permanent entity columns
      *
-     * @var array
+     * @var string[]
      */
     protected $_permanentAttributes = array();
 
@@ -137,7 +136,7 @@ abstract class AbstractEav
     /**
      * Initialize attribute option values
      *
-     * @return \Magento\ImportExport\Model\Export\Entity\AbstractEav
+     * @return $this
      */
     protected function _initAttributeValues()
     {
diff --git a/app/code/Magento/ImportExport/Model/Export/Entity/AbstractEntity.php b/app/code/Magento/ImportExport/Model/Export/Entity/AbstractEntity.php
index 21b7aa6357f..9c0a0c0e7f5 100644
--- a/app/code/Magento/ImportExport/Model/Export/Entity/AbstractEntity.php
+++ b/app/code/Magento/ImportExport/Model/Export/Entity/AbstractEntity.php
@@ -23,6 +23,9 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model\Export\Entity;
+
+use Magento\ImportExport\Model\Export\Adapter\AbstractAdapter;
 
 /**
  * Export entity abstract model
@@ -31,8 +34,6 @@
  * @package     Magento_ImportExport
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\ImportExport\Model\Export\Entity;
-
 abstract class AbstractEntity
 {
     /**
@@ -60,7 +61,7 @@ abstract class AbstractEntity
     /**
      * Array of attributes codes which are disabled for export.
      *
-     * @var array
+     * @var string[]
      */
     protected $_disabledAttrs = array();
 
@@ -102,7 +103,7 @@ abstract class AbstractEntity
     /**
      * Attributes with index (not label) value.
      *
-     * @var array
+     * @var string[]
      */
     protected $_indexValueAttributes = array();
 
@@ -123,14 +124,14 @@ abstract class AbstractEntity
     /**
      * Column names that holds values with particular meaning.
      *
-     * @var array
+     * @var string[]
      */
     protected $_specialAttributes = array();
 
     /**
      * Permanent entity columns.
      *
-     * @var array
+     * @var string[]
      */
     protected $_permanentAttributes = array();
 
@@ -151,7 +152,7 @@ abstract class AbstractEntity
     /**
      * Source model.
      *
-     * @var \Magento\ImportExport\Model\Export\Adapter\AbstractAdapter
+     * @var AbstractAdapter
      */
     protected $_writer;
 
@@ -187,7 +188,7 @@ abstract class AbstractEntity
     /**
      * Initialize stores hash.
      *
-     * @return \Magento\ImportExport\Model\Export\Entity\AbstractEntity
+     * @return $this
      */
     protected function _initStores()
     {
@@ -202,7 +203,7 @@ abstract class AbstractEntity
     /**
      * Get header columns
      *
-     * @return array
+     * @return string[]
      */
     abstract protected function _getHeaderColumns();
 
@@ -243,7 +244,7 @@ abstract class AbstractEntity
     /**
      * Initialize attribute option values.
      *
-     * @return \Magento\ImportExport\Model\Export\Entity\AbstractEntity
+     * @return $this
      */
     protected function _initAttrValues()
     {
@@ -290,11 +291,11 @@ abstract class AbstractEntity
                         $to   = array_shift($exportFilter[$attrCode]);
 
                         if (is_scalar($from) && !empty($from)) {
-                            $date = $this->_locale->date($from,null,null,false)->toString('MM/dd/YYYY');
+                            $date = $this->_locale->date($from, null, null, false)->toString('MM/dd/YYYY');
                             $collection->addAttributeToFilter($attrCode, array('from' => $date, 'date' => true));
                         }
                         if (is_scalar($to) && !empty($to)) {
-                            $date = $this->_locale->date($to,null,null,false)->toString('MM/dd/YYYY');
+                            $date = $this->_locale->date($to, null, null, false)->toString('MM/dd/YYYY');
                             $collection->addAttributeToFilter($attrCode, array('to' => $date, 'date' => true));
                         }
                     }
@@ -492,8 +493,8 @@ abstract class AbstractEntity
     /**
      * Inner writer object getter.
      *
-     * @throws \Exception
-     * @return \Magento\ImportExport\Model\Export\Adapter\AbstractAdapter
+     * @return AbstractAdapter
+     * @throws \Magento\Core\Exception
      */
     public function getWriter()
     {
@@ -507,7 +508,7 @@ abstract class AbstractEntity
      * Set parameters.
      *
      * @param array $parameters
-     * @return \Magento\ImportExport\Model\Export\Entity\AbstractEntity
+     * @return $this
      */
     public function setParameters(array $parameters)
     {
@@ -519,10 +520,10 @@ abstract class AbstractEntity
     /**
      * Writer model setter.
      *
-     * @param \Magento\ImportExport\Model\Export\Adapter\AbstractAdapter $writer
-     * @return \Magento\ImportExport\Model\Export\Entity\AbstractEntity
+     * @param AbstractAdapter $writer
+     * @return $this
      */
-    public function setWriter(\Magento\ImportExport\Model\Export\Adapter\AbstractAdapter $writer)
+    public function setWriter(AbstractAdapter $writer)
     {
         $this->_writer = $writer;
 
diff --git a/app/code/Magento/ImportExport/Model/Export/Entity/Eav/Customer.php b/app/code/Magento/ImportExport/Model/Export/Entity/Eav/Customer.php
index 3741754b580..6a5c0fe1349 100644
--- a/app/code/Magento/ImportExport/Model/Export/Entity/Eav/Customer.php
+++ b/app/code/Magento/ImportExport/Model/Export/Entity/Eav/Customer.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model\Export\Entity\Eav;
 
 /**
  * Export entity customer model
@@ -33,8 +34,6 @@
  *
  * @method \Magento\Customer\Model\Resource\Attribute\Collection getAttributeCollection() getAttributeCollection()
  */
-namespace Magento\ImportExport\Model\Export\Entity\Eav;
-
 class Customer
     extends \Magento\ImportExport\Model\Export\Entity\AbstractEav
 {
@@ -75,21 +74,21 @@ class Customer
     /**
      * Array of attributes codes which are disabled for export
      *
-     * @var array
+     * @var string[]
      */
     protected $_disabledAttributes = array('default_billing', 'default_shipping');
 
     /**
      * Attributes with index (not label) value.
      *
-     * @var array
+     * @var string[]
      */
     protected $_indexValueAttributes = array('group_id', 'website_id', 'store_id');
 
     /**
      * Permanent entity columns.
      *
-     * @var array
+     * @var string[]
      */
     protected $_permanentAttributes = array(self::COLUMN_EMAIL, self::COLUMN_WEBSITE, self::COLUMN_STORE);
 
@@ -160,7 +159,7 @@ class Customer
     }
 
     /**
-     * @inheritdoc
+     * {@inheritdoc}
      */
     protected function _getHeaderColumns()
     {
@@ -172,7 +171,7 @@ class Customer
      * Export given customer data
      *
      * @param \Magento\Customer\Model\Customer $item
-     * @return string
+     * @return void
      */
     public function exportItem($item)
     {
diff --git a/app/code/Magento/ImportExport/Model/Export/Entity/Eav/Customer/Address.php b/app/code/Magento/ImportExport/Model/Export/Entity/Eav/Customer/Address.php
index 4123d5bdc3c..5af383d2744 100644
--- a/app/code/Magento/ImportExport/Model/Export/Entity/Eav/Customer/Address.php
+++ b/app/code/Magento/ImportExport/Model/Export/Entity/Eav/Customer/Address.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model\Export\Entity\Eav\Customer;
 
 /**
  * Export customer address entity model
@@ -34,8 +35,6 @@
  *
  * @method \Magento\Customer\Model\Resource\Address\Attribute\Collection getAttributeCollection() getAttributeCollection()
  */
-namespace Magento\ImportExport\Model\Export\Entity\Eav\Customer;
-
 class Address
     extends \Magento\ImportExport\Model\Export\Entity\AbstractEav
 {
@@ -72,7 +71,7 @@ class Address
     /**
      * Permanent entity columns
      *
-     * @var array
+     * @var string[]
      */
     protected $_permanentAttributes = array(self::COLUMN_WEBSITE, self::COLUMN_EMAIL, self::COLUMN_ADDRESS_ID);
 
@@ -108,7 +107,9 @@ class Address
     protected $_customerEntity;
 
     /**
-     * Existing customers information. In form of:
+     * Existing customers information.
+     *
+     * In form of:
      *
      * [customer e-mail] => array(
      *    [website id 1] => customer_id 1,
@@ -171,7 +172,7 @@ class Address
     /**
      * Initialize existent customers data
      *
-     * @return \Magento\ImportExport\Model\Export\Entity\Eav\Customer\Address
+     * @return $this
      */
     protected function _initCustomers()
     {
@@ -194,7 +195,7 @@ class Address
     }
 
     /**
-     * @inheritdoc
+     * {@inheritdoc}
      */
     protected function _getHeaderColumns()
     {
@@ -238,7 +239,7 @@ class Address
      * Export given customer address data plus related customer data (required for import)
      *
      * @param \Magento\Customer\Model\Address $item
-     * @return string
+     * @return void
      */
     public function exportItem($item)
     {
@@ -267,7 +268,7 @@ class Address
      * Set parameters (push filters from post into export customer model)
      *
      * @param array $parameters
-     * @return \Magento\ImportExport\Model\Export\Entity\Eav\Customer\Address
+     * @return $this
      */
     public function setParameters(array $parameters)
     {
diff --git a/app/code/Magento/ImportExport/Model/Export/Entity/Product.php b/app/code/Magento/ImportExport/Model/Export/Entity/Product.php
index faa47c20c42..1475244aa55 100644
--- a/app/code/Magento/ImportExport/Model/Export/Entity/Product.php
+++ b/app/code/Magento/ImportExport/Model/Export/Entity/Product.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model\Export\Entity;
 
 /**
  * Export entity product model
@@ -31,13 +32,12 @@
  * @package     Magento_ImportExport
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\ImportExport\Model\Export\Entity;
-
 class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
 {
     /**
      * Attributes that should be exported
-     * @var array
+     *
+     * @var string[]
      */
     protected $_bannedAttributes = array('media_gallery');
 
@@ -83,7 +83,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
     /**
      * Attributes with index (not label) value.
      *
-     * @var array
+     * @var string[]
      */
     protected $_indexValueAttributes = array(
         'status',
@@ -97,7 +97,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
     /**
      * Permanent entity columns.
      *
-     * @var array
+     * @var string[]
      */
     protected $_permanentAttributes = array(self::COL_SKU);
 
@@ -124,6 +124,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
 
     /**
      * Attribute types
+     *
      * @var array
      */
     protected $_attributeTypes = array();
@@ -203,6 +204,11 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
      */
     protected $_linkTypeProvider;
 
+    /**
+     * @var \Magento\ImportExport\Model\Export\RowCustomizerInterface
+     */
+    protected $rowCustomizer;
+
     /**
      * @param \Magento\Core\Model\LocaleInterface $locale
      * @param \Magento\Eav\Model\Config $config
@@ -217,8 +223,9 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
      * @param \Magento\CatalogInventory\Model\Resource\Stock\ItemFactory $itemFactory
      * @param \Magento\Catalog\Model\Resource\Product\Option\CollectionFactory $optionColFactory
      * @param \Magento\Catalog\Model\Resource\Product\Attribute\CollectionFactory $attributeColFactory
-     * @param \Magento\ImportExport\Model\Export\Entity\Product\Type\Factory $_typeFactory
+     * @param Product\Type\Factory $_typeFactory
      * @param \Magento\Catalog\Model\Product\LinkTypeProvider $linkTypeProvider
+     * @param \Magento\ImportExport\Model\Export\RowCustomizerInterface $rowCustomizer
      */
     public function __construct(
         \Magento\Core\Model\LocaleInterface $locale,
@@ -235,7 +242,8 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
         \Magento\Catalog\Model\Resource\Product\Option\CollectionFactory $optionColFactory,
         \Magento\Catalog\Model\Resource\Product\Attribute\CollectionFactory $attributeColFactory,
         \Magento\ImportExport\Model\Export\Entity\Product\Type\Factory $_typeFactory,
-        \Magento\Catalog\Model\Product\LinkTypeProvider $linkTypeProvider
+        \Magento\Catalog\Model\Product\LinkTypeProvider $linkTypeProvider,
+        \Magento\ImportExport\Model\Export\RowCustomizerInterface $rowCustomizer
     ) {
         $this->_entityCollection = $collection;
         $this->_exportConfig = $exportConfig;
@@ -249,7 +257,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
         $this->_attributeColFactory = $attributeColFactory;
         $this->_typeFactory = $_typeFactory;
         $this->_linkTypeProvider = $linkTypeProvider;
-
+        $this->rowCustomizer = $rowCustomizer;
 
         parent::__construct($locale, $config, $resource, $storeManager);
 
@@ -264,7 +272,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
     /**
      * Initialize attribute sets code-to-id pairs.
      *
-     * @return \Magento\ImportExport\Model\Export\Entity\Product
+     * @return $this
      */
     protected function _initAttributeSets()
     {
@@ -278,7 +286,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
     /**
      * Initialize categories ID to text-path hash.
      *
-     * @return \Magento\ImportExport\Model\Export\Entity\Product
+     * @return $this
      */
     protected function _initCategories()
     {
@@ -306,7 +314,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
      * Initialize product type models.
      *
      * @throws \Magento\Core\Exception
-     * @return \Magento\ImportExport\Model\Export\Entity\Product
+     * @return $this
      */
     protected function _initTypeModels()
     {
@@ -339,7 +347,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
     /**
      * Initialize website values.
      *
-     * @return \Magento\ImportExport\Model\Export\Entity\Product
+     * @return $this
      */
     protected function _initWebsites()
     {
@@ -353,7 +361,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
     /**
      * Prepare products tier prices
      *
-     * @param  array $productIds
+     * @param  int[] $productIds
      * @return array
      */
     protected function _prepareTierPrices(array $productIds)
@@ -385,7 +393,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
     /**
      * Prepare products group prices
      *
-     * @param  array $productIds
+     * @param  int[] $productIds
      * @return array
      */
     protected function _prepareGroupPrices(array $productIds)
@@ -417,7 +425,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
     /**
      * Prepare products media gallery
      *
-     * @param  array $productIds
+     * @param  int[] $productIds
      * @return array
      */
     protected function _prepareMediaGallery(array $productIds)
@@ -458,7 +466,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
     /**
      * Prepare catalog inventory
      *
-     * @param  array $productIds
+     * @param  int[] $productIds
      * @return array
      */
     protected function _prepareCatalogInventory(array $productIds)
@@ -486,7 +494,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
     /**
      * Prepare product links
      *
-     * @param  array $productIds
+     * @param  int[] $productIds
      * @return array
      */
     protected function _prepareLinks(array $productIds)
@@ -553,8 +561,8 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
     /**
      * Update data row with information about categories. Return true, if data row was updated
      *
-     * @param array $dataRow
-     * @param array $rowCategories
+     * @param array &$dataRow
+     * @param array &$rowCategories
      * @param int $productId
      * @return bool
      */
@@ -576,7 +584,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
     }
 
     /**
-     * @inheritdoc
+     * {@inheritdoc}
      */
     public function _getHeaderColumns()
     {
@@ -587,10 +595,10 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
      * Set headers columns
      *
      * @param array $customOptionsData
-     * @param array $configurableData
      * @param array $stockItemRows
+     * @return void
      */
-    protected function _setHeaderColumns($customOptionsData, $configurableData, $stockItemRows)
+    protected function _setHeaderColumns($customOptionsData, $stockItemRows)
     {
         if (!$this->_headerColumns) {
             $customOptCols = array(
@@ -626,13 +634,6 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
             if ($customOptionsData) {
                 $this->_headerColumns = array_merge($this->_headerColumns, $customOptCols);
             }
-            // have we merge configurable products data
-            if ($configurableData) {
-                $this->_headerColumns = array_merge($this->_headerColumns, array(
-                    '_super_products_sku', '_super_attribute_code',
-                    '_super_attribute_option', '_super_attribute_price_corr'
-                ));
-            }
         }
     }
 
@@ -691,6 +692,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
      *
      * @param int $page
      * @param int $pageSize
+     * @return void
      */
     protected function _paginateCollection($page, $pageSize)
     {
@@ -832,35 +834,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
                 $linkIdColPrefix[$linkTypeId] = '_' . $linkTypeName . '_';
             }
 
-            $configurableProductsCollection = $this->_entityCollection;
-            $configurableProductsCollection->addAttributeToFilter(
-                'entity_id',
-                array(
-                    'in'    => $productIds
-                )
-            )->addAttributeToFilter(
-                'type_id',
-                array(
-                    'eq'    => \Magento\Catalog\Model\Product\Type\Configurable::TYPE_CODE
-                )
-            );
-            $configurableData = array();
-            while ($product = $configurableProductsCollection->fetchItem()) {
-                $productAttributesOptions = $product->getTypeInstance()->getConfigurableOptions($product);
-
-                foreach ($productAttributesOptions as $productAttributeOption) {
-                    $configurableData[$product->getId()] = array();
-                    foreach ($productAttributeOption as $optionValues) {
-                        $priceType = $optionValues['pricing_is_percent'] ? '%' : '';
-                        $configurableData[$product->getId()][] = array(
-                            '_super_products_sku'           => $optionValues['sku'],
-                            '_super_attribute_code'         => $optionValues['attribute_code'],
-                            '_super_attribute_option'       => $optionValues['option_title'],
-                            '_super_attribute_price_corr'   => $optionValues['pricing_value'] . $priceType
-                        );
-                    }
-                }
-            }
+            $this->rowCustomizer->prepareData($this->_entityCollection, $productIds);
 
             // prepare custom options information
             $customOptionsData    = array();
@@ -952,7 +926,8 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
             }
             unset($customOptionsDataPre);
 
-            $this->_setHeaderColumns($customOptionsData, $configurableData, $stockItemRows);
+            $this->_setHeaderColumns($customOptionsData, $stockItemRows);
+            $this->_headerColumns = $this->rowCustomizer->addHeaderColumns($this->_headerColumns);
 
             foreach ($dataRows as $productId => &$productData) {
                 foreach ($productData as $storeId => &$dataRow) {
@@ -994,9 +969,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
                     if (!empty($customOptionsData[$productId])) {
                         $dataRow = array_merge($dataRow, array_shift($customOptionsData[$productId]));
                     }
-                    if (!empty($configurableData[$productId])) {
-                        $dataRow = array_merge($dataRow, array_shift($configurableData[$productId]));
-                    }
+                    $dataRow = $this->rowCustomizer->addData($dataRow, $productId);
                     if (!empty($rowMultiselects[$productId])) {
                         foreach ($rowMultiselects[$productId] as $attrKey => $attrVal) {
                             if (!empty($rowMultiselects[$productId][$attrKey])) {
@@ -1032,9 +1005,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
                 if (!empty($customOptionsData[$productId])) {
                     $additionalRowsCount = max($additionalRowsCount, count($customOptionsData[$productId]));
                 }
-                if (!empty($configurableData[$productId])) {
-                    $additionalRowsCount = max($additionalRowsCount, count($configurableData[$productId]));
-                }
+                $additionalRowsCount = $this->rowCustomizer->getAdditionalRowsCount($additionalRowsCount, $productId);
                 if (!empty($rowMultiselects[$productId])) {
                     foreach ($rowMultiselects[$productId] as $attributes) {
                         $additionalRowsCount = max($additionalRowsCount, count($attributes));
@@ -1073,9 +1044,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
                         if (!empty($customOptionsData[$productId])) {
                             $dataRow = array_merge($dataRow, array_shift($customOptionsData[$productId]));
                         }
-                        if (!empty($configurableData[$productId])) {
-                            $dataRow = array_merge($dataRow, array_shift($configurableData[$productId]));
-                        }
+                        $dataRow = $this->rowCustomizer->addData($dataRow, $productId);
                         if (!empty($rowMultiselects[$productId])) {
                             foreach ($rowMultiselects[$productId] as $attrKey => $attrVal) {
                                 if (!empty($rowMultiselects[$productId][$attrKey])) {
@@ -1147,7 +1116,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
     /**
      * Initialize attribute option values and types.
      *
-     * @return \Magento\ImportExport\Model\Export\Entity\Product
+     * @return $this
      */
     protected function _initAttributes()
     {
diff --git a/app/code/Magento/ImportExport/Model/Export/Entity/Product/Type/AbstractType.php b/app/code/Magento/ImportExport/Model/Export/Entity/Product/Type/AbstractType.php
index 39c8c401651..5a17433fb21 100644
--- a/app/code/Magento/ImportExport/Model/Export/Entity/Product/Type/AbstractType.php
+++ b/app/code/Magento/ImportExport/Model/Export/Entity/Product/Type/AbstractType.php
@@ -23,6 +23,9 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model\Export\Entity\Product\Type;
+
+use Magento\Catalog\Model\Resource\Eav\Attribute;
 
 /**
  * Export entity product type abstract model
@@ -31,8 +34,6 @@
  * @package     Magento_ImportExport
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\ImportExport\Model\Export\Entity\Product\Type;
-
 abstract class AbstractType
 {
     /**
@@ -45,21 +46,21 @@ abstract class AbstractType
     /**
      * Array of attributes codes which are disabled for export.
      *
-     * @var array
+     * @var string[]
      */
     protected $_disabledAttrs = array();
 
     /**
      * Attributes with index (not label) value.
      *
-     * @var array
+     * @var string[]
      */
     protected $_indexValueAttributes = array();
 
     /**
      * Return disabled attributes codes.
      *
-     * @return array
+     * @return string[]
      */
     public function getDisabledAttrs()
     {
@@ -69,7 +70,7 @@ abstract class AbstractType
     /**
      * Get attribute codes with index (not label) value.
      *
-     * @return array
+     * @return string[]
      */
     public function getIndexValueAttributes()
     {
@@ -89,10 +90,10 @@ abstract class AbstractType
     /**
      * Add additional data to attribute.
      *
-     * @param \Magento\Catalog\Model\Resource\Eav\Attribute $attribute
-     * @return boolean
+     * @param Attribute $attribute
+     * @return bool
      */
-    public function overrideAttribute(\Magento\Catalog\Model\Resource\Eav\Attribute $attribute)
+    public function overrideAttribute(Attribute $attribute)
     {
         if (!empty($this->_attributeOverrides[$attribute->getAttributeCode()])) {
             $data = $this->_attributeOverrides[$attribute->getAttributeCode()];
diff --git a/app/code/Magento/ImportExport/Model/Export/Entity/Product/Type/Simple.php b/app/code/Magento/ImportExport/Model/Export/Entity/Product/Type/Simple.php
index 99f54c2c38b..b0d05284ab7 100644
--- a/app/code/Magento/ImportExport/Model/Export/Entity/Product/Type/Simple.php
+++ b/app/code/Magento/ImportExport/Model/Export/Entity/Product/Type/Simple.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model\Export\Entity\Product\Type;
 
 /**
  * Export entity product type simple model
@@ -31,8 +32,6 @@
  * @package     Magento_ImportExport
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\ImportExport\Model\Export\Entity\Product\Type;
-
 class Simple
     extends \Magento\ImportExport\Model\Export\Entity\Product\Type\AbstractType
 {
@@ -51,7 +50,7 @@ class Simple
     /**
      * Array of attributes codes which are disabled for export.
      *
-     * @var array
+     * @var string[]
      */
     protected $_disabledAttrs = array(
         'old_id',
diff --git a/app/code/Magento/ImportExport/Model/Export/RowCustomizer/Composite.php b/app/code/Magento/ImportExport/Model/Export/RowCustomizer/Composite.php
new file mode 100644
index 00000000000..21245dbd1cd
--- /dev/null
+++ b/app/code/Magento/ImportExport/Model/Export/RowCustomizer/Composite.php
@@ -0,0 +1,110 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ImportExport\Model\Export\RowCustomizer;
+
+use Magento\ImportExport\Model\Export\RowCustomizerInterface;
+use Magento\ObjectManager;
+
+class Composite implements RowCustomizerInterface
+{
+    /**
+     * @var \Magento\ObjectManager
+     */
+    protected $objectManager;
+
+    /**
+     * @var array
+     */
+    protected $customizers;
+
+    /**
+     * @param ObjectManager $objectManager
+     * @param array $customizers
+     */
+    public function __construct(ObjectManager $objectManager, $customizers = array())
+    {
+        $this->objectManager = $objectManager;
+        $this->customizers = $customizers;
+    }
+
+    /**
+     * Prepare data for export
+     *
+     * @param mixed $collection
+     * @param int $productIds
+     * @return mixed|void
+     */
+    public function prepareData($collection, $productIds)
+    {
+        foreach ($this->customizers as $className) {
+            $this->objectManager->get($className)->prepareData($collection, $productIds);
+        }
+    }
+
+    /**
+     * Set headers columns
+     *
+     * @param array $columns
+     * @return array
+     */
+    public function addHeaderColumns($columns)
+    {
+        foreach ($this->customizers as $className) {
+            $columns = $this->objectManager->get($className)->addHeaderColumns($columns);
+        }
+        return $columns;
+    }
+
+    /**
+     * Add data for export
+     *
+     * @param array $dataRow
+     * @param int $productId
+     * @return array
+     */
+    public function addData($dataRow, $productId)
+    {
+        foreach ($this->customizers as $className) {
+            $dataRow = $this->objectManager->get($className)->addData($dataRow, $productId);
+        }
+        return $dataRow;
+    }
+
+    /**
+     * Calculate the largest links block
+     *
+     * @param array $additionalRowsCount
+     * @param int $productId
+     * @return array|mixed
+     */
+    public function getAdditionalRowsCount($additionalRowsCount, $productId)
+    {
+        foreach ($this->customizers as $className) {
+            $additionalRowsCount =
+                $this->objectManager->get($className)->getAdditionalRowsCount($additionalRowsCount, $productId);
+        }
+        return $additionalRowsCount;
+    }
+}
diff --git a/app/code/Magento/ImportExport/Model/Export/RowCustomizerInterface.php b/app/code/Magento/ImportExport/Model/Export/RowCustomizerInterface.php
new file mode 100644
index 00000000000..f34339eca18
--- /dev/null
+++ b/app/code/Magento/ImportExport/Model/Export/RowCustomizerInterface.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ImportExport\Model\Export;
+
+/**
+ * Interface RowCustomizerInterface
+ */
+interface RowCustomizerInterface
+{
+    /**
+     * Prepare data for export
+     *
+     * @param mixed $collection
+     * @param int $productIds
+     * @return mixed
+     */
+    public function prepareData($collection, $productIds);
+
+    /**
+     * Set headers columns
+     *
+     * @param array $columns
+     * @return mixed
+     */
+    public function addHeaderColumns($columns);
+
+    /**
+     * Add data for export
+     *
+     * @param array $dataRow
+     * @param int $productId
+     * @return mixed
+     */
+    public function addData($dataRow, $productId);
+
+    /**
+     * Calculate the largest links block
+     *
+     * @param array $additionalRowsCount
+     * @param int $productId
+     * @return mixed
+     */
+    public function getAdditionalRowsCount($additionalRowsCount, $productId);
+
+}
diff --git a/app/code/Magento/ImportExport/Model/Import.php b/app/code/Magento/ImportExport/Model/Import.php
index b021dade7e6..7aa86b28ba5 100644
--- a/app/code/Magento/ImportExport/Model/Import.php
+++ b/app/code/Magento/ImportExport/Model/Import.php
@@ -23,6 +23,9 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model;
+
+use Magento\HTTP\Adapter\FileTransferFactory;
 
 /**
  * Import model
@@ -34,10 +37,6 @@
  * @method string getBehavior() getBehavior()
  * @method \Magento\ImportExport\Model\Import setEntity() setEntity(string $value)
  */
-namespace Magento\ImportExport\Model;
-
-use Magento\HTTP\Adapter\FileTransferFactory;
-
 class Import extends \Magento\ImportExport\Model\AbstractModel
 {
     /**#@+
@@ -79,7 +78,6 @@ class Import extends \Magento\ImportExport\Model\AbstractModel
      protected static $_entityInvalidatedIndexes = array (
         'catalog_product' => array (
             'catalog_product_price',
-            'catalog_category_product',
             'catalogsearch_fulltext',
             'catalog_product_flat',
         )
@@ -143,13 +141,13 @@ class Import extends \Magento\ImportExport\Model\AbstractModel
      * @param \Magento\Core\Model\Log\AdapterFactory $adapterFactory
      * @param \Magento\ImportExport\Helper\Data $importExportData
      * @param \Magento\App\ConfigInterface $coreConfig
-     * @param Import\ConfigInterface $importConfig
-     * @param Import\Entity\Factory $entityFactory
-     * @param Resource\Import\Data $importData
-     * @param Export\Adapter\CsvFactory $csvFactory
-     * @param FileTransferFactory $httpFactory
+     * @param \Magento\ImportExport\Model\Import\ConfigInterface $importConfig
+     * @param \Magento\ImportExport\Model\Import\Entity\Factory $entityFactory
+     * @param \Magento\ImportExport\Model\Resource\Import\Data $importData
+     * @param \Magento\ImportExport\Model\Export\Adapter\CsvFactory $csvFactory
+     * @param \Magento\HTTP\Adapter\FileTransferFactory $httpFactory
      * @param \Magento\Core\Model\File\UploaderFactory $uploaderFactory
-     * @param Source\Import\Behavior\Factory $behaviorFactory
+     * @param \Magento\ImportExport\Model\Source\Import\Behavior\Factory $behaviorFactory
      * @param \Magento\Index\Model\Indexer $indexer
      * @param array $data
      */
@@ -244,7 +242,7 @@ class Import extends \Magento\ImportExport\Model\AbstractModel
      * Return operation result messages
      *
      * @param bool $validationResult
-     * @return array
+     * @return string[]
      */
     public function getOperationResultMessages($validationResult)
     {
@@ -385,7 +383,7 @@ class Import extends \Magento\ImportExport\Model\AbstractModel
     /**
      * Returns entity model noticees.
      *
-     * @return array
+     * @return string[]
      */
     public function getNotices()
     {
@@ -617,7 +615,7 @@ class Import extends \Magento\ImportExport\Model\AbstractModel
     /**
      * Invalidate indexes by process codes.
      *
-     * @return \Magento\ImportExport\Model\Import
+     * @return $this
      */
     public function invalidateIndex()
     {
@@ -647,6 +645,7 @@ class Import extends \Magento\ImportExport\Model\AbstractModel
      * )
      *
      * @return array
+     * @throws \Magento\Core\Exception
      */
     public function getEntityBehaviors()
     {
diff --git a/app/code/Magento/ImportExport/Model/Import/AbstractEntity.php b/app/code/Magento/ImportExport/Model/Import/AbstractEntity.php
index 46c2166614e..74df5b4d817 100644
--- a/app/code/Magento/ImportExport/Model/Import/AbstractEntity.php
+++ b/app/code/Magento/ImportExport/Model/Import/AbstractEntity.php
@@ -23,9 +23,10 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\ImportExport\Model\Import;
 
+use Magento\ImportExport\Model\Import\AbstractSource;
+
 /**
  * Import entity abstract model
  */
@@ -121,7 +122,7 @@ abstract class AbstractEntity
     /**
      * Notice messages
      *
-     * @var array
+     * @var string[]
      */
     protected $_notices = array();
 
@@ -149,14 +150,14 @@ abstract class AbstractEntity
     /**
      * Column names that holds values with particular meaning
      *
-     * @var array
+     * @var string[]
      */
     protected $_specialAttributes = array(self::COLUMN_ACTION);
 
     /**
      * Permanent entity columns
      *
-     * @var array
+     * @var string[]
      */
     protected $_permanentAttributes = array();
 
@@ -195,7 +196,7 @@ abstract class AbstractEntity
     /**
      * Source model
      *
-     * @var \Magento\ImportExport\Model\Import\AbstractSource
+     * @var AbstractSource
      */
     protected $_source;
 
@@ -209,7 +210,7 @@ abstract class AbstractEntity
     /**
      * List of available behaviors
      *
-     * @var array
+     * @var string[]
      */
     protected $_availableBehaviors = array(
         \Magento\ImportExport\Model\Import::BEHAVIOR_ADD_UPDATE,
@@ -318,7 +319,7 @@ abstract class AbstractEntity
     /**
      * Validate data rows and save bunches to DB
      *
-     * @return \Magento\ImportExport\Model\Import\AbstractEntity
+     * @return $this
      */
     protected function _saveValidatedBunches()
     {
@@ -378,7 +379,7 @@ abstract class AbstractEntity
      * @param string $errorCode Error code or simply column name
      * @param int $errorRowNum Row number
      * @param string $columnName OPTIONAL Column name
-     * @return \Magento\ImportExport\Model\Import\AbstractEntity
+     * @return $this
      */
     public function addRowError($errorCode, $errorRowNum, $columnName = null)
     {
@@ -395,7 +396,7 @@ abstract class AbstractEntity
      *
      * @param string $errorCode Error code
      * @param string $message Message template
-     * @return \Magento\ImportExport\Model\Import\AbstractEntity
+     * @return $this
      */
     public function addMessageTemplate($errorCode, $message)
     {
@@ -502,7 +503,7 @@ abstract class AbstractEntity
     /**
      * Returns model notices
      *
-     * @return array
+     * @return string[]
      */
     public function getNotices()
     {
@@ -532,8 +533,8 @@ abstract class AbstractEntity
     /**
      * Source object getter
      *
-     * @throws \Exception
-     * @return \Magento\ImportExport\Model\Import\AbstractSource
+     * @return AbstractSource
+     * @throws \Magento\Core\Exception
      */
     public function getSource()
     {
@@ -571,7 +572,7 @@ abstract class AbstractEntity
      * @param array $attributeParams Attribute params
      * @param array $rowData Row data
      * @param int $rowNumber
-     * @return boolean
+     * @return bool
      */
     public function isAttributeValid($attributeCode, array $attributeParams, array $rowData, $rowNumber)
     {
@@ -657,7 +658,7 @@ abstract class AbstractEntity
      *
      * @param array $rowData
      * @param int $rowNumber
-     * @return boolean
+     * @return bool
      */
     abstract public function validateRow(array $rowData, $rowNumber);
 
@@ -665,7 +666,7 @@ abstract class AbstractEntity
      * Set data from outside to change behavior
      *
      * @param array $parameters
-     * @return \Magento\ImportExport\Model\Import\AbstractEntity
+     * @return $this
      */
     public function setParameters(array $parameters)
     {
@@ -676,10 +677,10 @@ abstract class AbstractEntity
     /**
      * Source model setter
      *
-     * @param \Magento\ImportExport\Model\Import\AbstractSource $source
-     * @return \Magento\ImportExport\Model\Import\AbstractEntity
+     * @param AbstractSource $source
+     * @return $this
      */
-    public function setSource(\Magento\ImportExport\Model\Import\AbstractSource $source)
+    public function setSource(AbstractSource $source)
     {
         $this->_source = $source;
         $this->_dataValidated = false;
@@ -690,8 +691,8 @@ abstract class AbstractEntity
     /**
      * Validate data
      *
-     * @throws \Exception
-     * @return \Magento\ImportExport\Model\Import\AbstractEntity
+     * @return $this
+     * @throws \Magento\Core\Exception
      */
     public function validateData()
     {
diff --git a/app/code/Magento/ImportExport/Model/Import/AbstractSource.php b/app/code/Magento/ImportExport/Model/Import/AbstractSource.php
index 8ee5062b569..9eabb0f3bd1 100644
--- a/app/code/Magento/ImportExport/Model/Import/AbstractSource.php
+++ b/app/code/Magento/ImportExport/Model/Import/AbstractSource.php
@@ -23,12 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model\Import;
 
 /**
  * Data source with columns for Magento_ImportExport
  */
-namespace Magento\ImportExport\Model\Import;
-
 abstract class AbstractSource implements \SeekableIterator
 {
     /**
@@ -105,6 +104,8 @@ abstract class AbstractSource implements \SeekableIterator
 
     /**
      * Move forward to next element (\Iterator interface)
+     *
+     * @return void
      */
     public function next()
     {
@@ -123,7 +124,7 @@ abstract class AbstractSource implements \SeekableIterator
      *
      * Return array or false on error
      *
-     * @return array|bool
+     * @return array|false
      */
     abstract protected function _getNextRow();
 
@@ -150,6 +151,8 @@ abstract class AbstractSource implements \SeekableIterator
 
     /**
      * Rewind the \Iterator to the first element (\Iterator interface)
+     *
+     * @return void
      */
     public function rewind()
     {
@@ -162,6 +165,7 @@ abstract class AbstractSource implements \SeekableIterator
      * Seeks to a position (Seekable interface)
      *
      * @param int $position The position to seek to 0 or more
+     * @return void
      * @throws \OutOfBoundsException
      */
     public function seek($position)
diff --git a/app/code/Magento/ImportExport/Model/Import/Adapter.php b/app/code/Magento/ImportExport/Model/Import/Adapter.php
index 1e59936dd01..1a97f963fc9 100644
--- a/app/code/Magento/ImportExport/Model/Import/Adapter.php
+++ b/app/code/Magento/ImportExport/Model/Import/Adapter.php
@@ -23,6 +23,10 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model\Import;
+
+use Magento\Filesystem\Directory\Write;
+use Magento\ImportExport\Model\Import\AbstractSource;
 
 /**
  * Import adapter model
@@ -31,18 +35,16 @@
  * @package     Magento_ImportExport
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\ImportExport\Model\Import;
-
 class Adapter
 {
     /**
      * Adapter factory. Checks for availability, loads and create instance of import adapter object.
      *
      * @param string $type Adapter type ('csv', 'xml' etc.)
-     * @param \Magento\Filesystem\Directory\Write $directory
+     * @param Write $directory
      * @param mixed $options OPTIONAL Adapter constructor options
-     * @throws \Exception
-     * @return \Magento\ImportExport\Model\Import\AbstractSource
+     * @return AbstractSource
+     * @throws \Magento\Core\Exception
      */
     public static function factory($type, $directory, $options = null)
     {
@@ -56,7 +58,7 @@ class Adapter
         }
         $adapter = new $adapterClass($options, $directory);
 
-        if (! $adapter instanceof \Magento\ImportExport\Model\Import\AbstractSource) {
+        if (! $adapter instanceof AbstractSource) {
             throw new \Magento\Core\Exception(
                 __('Adapter must be an instance of \Magento\ImportExport\Model\Import\AbstractSource')
             );
@@ -68,8 +70,8 @@ class Adapter
      * Create adapter instance for specified source file.
      *
      * @param string $source Source file path.
-     * @param \Magento\Filesystem\Directory\Write $directory
-     * @return \Magento\ImportExport\Model\Import\AbstractSource
+     * @param Write $directory
+     * @return AbstractSource
      */
     public static function findAdapterFor($source, $directory)
     {
diff --git a/app/code/Magento/ImportExport/Model/Import/Entity/AbstractEav.php b/app/code/Magento/ImportExport/Model/Import/Entity/AbstractEav.php
index 5aa348c3386..bfa31636b22 100644
--- a/app/code/Magento/ImportExport/Model/Import/Entity/AbstractEav.php
+++ b/app/code/Magento/ImportExport/Model/Import/Entity/AbstractEav.php
@@ -23,12 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model\Import\Entity;
 
 /**
  * Import EAV entity abstract model
  */
-namespace Magento\ImportExport\Model\Import\Entity;
-
 abstract class AbstractEav
     extends \Magento\ImportExport\Model\Import\AbstractEntity
 {
@@ -135,8 +134,8 @@ abstract class AbstractEav
     /**
      * Retrieve website id by code or false when website code not exists
      *
-     * @param $websiteCode
-     * @return bool|int
+     * @param string $websiteCode
+     * @return int|false
      */
     public function getWebsiteId($websiteCode)
     {
@@ -151,7 +150,7 @@ abstract class AbstractEav
      * Initialize website values
      *
      * @param bool $withDefault
-     * @return \Magento\ImportExport\Model\Import\Entity\AbstractEav
+     * @return $this
      */
     protected function _initWebsites($withDefault = false)
     {
@@ -166,7 +165,7 @@ abstract class AbstractEav
      * Initialize stores data
      *
      * @param bool $withDefault
-     * @return \Magento\ImportExport\Model\Import\Entity\AbstractEav
+     * @return $this
      */
     protected function _initStores($withDefault = false)
     {
@@ -180,7 +179,7 @@ abstract class AbstractEav
     /**
      * Initialize entity attributes
      *
-     * @return \Magento\ImportExport\Model\Import\Entity\AbstractEav
+     * @return $this
      */
     protected function _initAttributes()
     {
diff --git a/app/code/Magento/ImportExport/Model/Import/Entity/AbstractEntity.php b/app/code/Magento/ImportExport/Model/Import/Entity/AbstractEntity.php
index 92489d63948..69e9e6fa43f 100644
--- a/app/code/Magento/ImportExport/Model/Import/Entity/AbstractEntity.php
+++ b/app/code/Magento/ImportExport/Model/Import/Entity/AbstractEntity.php
@@ -23,9 +23,10 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\ImportExport\Model\Import\Entity;
 
+use Magento\ImportExport\Model\Import\AbstractSource;
+
 /**
  * Import entity abstract model
  */
@@ -119,7 +120,7 @@ abstract class AbstractEntity
     /**
      * Notice messages.
      *
-     * @var array
+     * @var string[]
      */
     protected $_notices = array();
 
@@ -133,14 +134,14 @@ abstract class AbstractEntity
     /**
      * Column names that holds values with particular meaning.
      *
-     * @var array
+     * @var string[]
      */
     protected $_specialAttributes = array();
 
     /**
      * Permanent entity columns.
      *
-     * @var array
+     * @var string[]
      */
     protected $_permanentAttributes = array();
 
@@ -179,7 +180,7 @@ abstract class AbstractEntity
     /**
      * Source model.
      *
-     * @var \Magento\ImportExport\Model\Import\AbstractSource
+     * @var AbstractSource
      */
     protected $_source;
 
@@ -249,7 +250,7 @@ abstract class AbstractEntity
     /**
      * Inner source object getter.
      *
-     * @return \Magento\ImportExport\Model\Import\AbstractSource
+     * @return AbstractSource
      * @throws \Magento\Core\Exception
      */
     protected function _getSource()
@@ -303,7 +304,7 @@ abstract class AbstractEntity
     /**
      * Validate data rows and save bunches to DB.
      *
-     * @return \Magento\ImportExport\Model\Import\Entity\AbstractEntity
+     * @return $this|void
      */
     protected function _saveValidatedBunches()
     {
@@ -361,7 +362,7 @@ abstract class AbstractEntity
      * @param string $errorCode Error code or simply column name
      * @param int $errorRowNum Row number.
      * @param string $colName OPTIONAL Column name.
-     * @return \Magento\ImportExport\Model\Import\AbstractSource
+     * @return $this
      */
     public function addRowError($errorCode, $errorRowNum, $colName = null)
     {
@@ -378,7 +379,7 @@ abstract class AbstractEntity
      *
      * @param string $errorCode Error code
      * @param string $message Message template
-     * @return \Magento\ImportExport\Model\Import\Entity\AbstractEntity
+     * @return $this
      */
     public function addMessageTemplate($errorCode, $message)
     {
@@ -513,7 +514,7 @@ abstract class AbstractEntity
     /**
      * Returns model notices.
      *
-     * @return array
+     * @return string[]
      */
     public function getNotices()
     {
@@ -543,8 +544,8 @@ abstract class AbstractEntity
     /**
      * Source object getter.
      *
-     * @throws \Exception
-     * @return \Magento\ImportExport\Model\Import\AbstractSource
+     * @return AbstractSource
+     * @throws \Magento\Core\Exception
      */
     public function getSource()
     {
@@ -674,7 +675,7 @@ abstract class AbstractEntity
      * Set data from outside to change behavior. I.e. for setting some default parameters etc.
      *
      * @param array $params
-     * @return \Magento\ImportExport\Model\Import\Entity\AbstractEntity
+     * @return $this
      */
     public function setParameters(array $params)
     {
@@ -685,10 +686,10 @@ abstract class AbstractEntity
     /**
      * Source model setter.
      *
-     * @param \Magento\ImportExport\Model\Import\AbstractSource $source
-     * @return \Magento\ImportExport\Model\Import\Entity\AbstractEntity
+     * @param AbstractSource $source
+     * @return $this
      */
-    public function setSource(\Magento\ImportExport\Model\Import\AbstractSource $source)
+    public function setSource(AbstractSource $source)
     {
         $this->_source = $source;
         $this->_dataValidated = false;
@@ -699,8 +700,8 @@ abstract class AbstractEntity
     /**
      * Validate data.
      *
-     * @throws \Exception
-     * @return \Magento\ImportExport\Model\Import\Entity\AbstractEntity
+     * @return $this
+     * @throws \Magento\Core\Exception
      */
     public function validateData()
     {
diff --git a/app/code/Magento/ImportExport/Model/Import/Entity/CustomerComposite.php b/app/code/Magento/ImportExport/Model/Import/Entity/CustomerComposite.php
index e1d7658227c..7248132c0bc 100644
--- a/app/code/Magento/ImportExport/Model/Import/Entity/CustomerComposite.php
+++ b/app/code/Magento/ImportExport/Model/Import/Entity/CustomerComposite.php
@@ -77,7 +77,7 @@ class CustomerComposite
     /**
      * Column names that holds values with particular meaning
      *
-     * @var array
+     * @var string[]
      */
     protected $_specialAttributes = array(
         \Magento\ImportExport\Model\Import\Entity\Eav\Customer::COLUMN_WEBSITE,
@@ -89,7 +89,7 @@ class CustomerComposite
     /**
      * Permanent entity columns
      *
-     * @var array
+     * @var string[]
      */
     protected $_permanentAttributes = array(
         \Magento\ImportExport\Model\Import\Entity\Eav\Customer::COLUMN_EMAIL,
@@ -99,14 +99,14 @@ class CustomerComposite
     /**
      * Customer attributes
      *
-     * @var array
+     * @var string[]
      */
     protected $_customerAttributes = array();
 
     /**
      * Address attributes
      *
-     * @var array
+     * @var string[]
      */
     protected $_addressAttributes = array();
 
@@ -225,7 +225,7 @@ class CustomerComposite
     /**
      * Collect customer attributes
      *
-     * @return \Magento\ImportExport\Model\Import\Entity\CustomerComposite
+     * @return $this
      */
     protected function _initCustomerAttributes()
     {
@@ -240,7 +240,7 @@ class CustomerComposite
     /**
      * Collect address attributes
      *
-     * @return \Magento\ImportExport\Model\Import\Entity\CustomerComposite
+     * @return $this
      */
     protected function _initAddressAttributes()
     {
@@ -255,7 +255,7 @@ class CustomerComposite
     /**
      * Import data rows
      *
-     * @return boolean
+     * @return bool
      */
     protected function _importData()
     {
@@ -282,7 +282,7 @@ class CustomerComposite
      *
      * @param array $rowData
      * @param int $rowNumber
-     * @return boolean
+     * @return bool
      */
     public function validateRow(array $rowData, $rowNumber)
     {
@@ -400,7 +400,7 @@ class CustomerComposite
      * Set data from outside to change behavior
      *
      * @param array $parameters
-     * @return \Magento\ImportExport\Model\Import\Entity\CustomerComposite
+     * @return $this
      */
     public function setParameters(array $parameters)
     {
diff --git a/app/code/Magento/ImportExport/Model/Import/Entity/Eav/AbstractCustomer.php b/app/code/Magento/ImportExport/Model/Import/Entity/Eav/AbstractCustomer.php
index dd1a0524a87..940d55e4e6e 100644
--- a/app/code/Magento/ImportExport/Model/Import/Entity/Eav/AbstractCustomer.php
+++ b/app/code/Magento/ImportExport/Model/Import/Entity/Eav/AbstractCustomer.php
@@ -57,7 +57,7 @@ abstract class AbstractCustomer extends \Magento\ImportExport\Model\Import\Entit
      * For example, when entity attribute has own validation and import procedures
      * or just to deny this attribute processing.
      *
-     * @var array
+     * @var string[]
      */
     protected $_ignoredAttributes = array('website_id', 'store_id', 'default_billing', 'default_shipping');
 
@@ -132,7 +132,7 @@ abstract class AbstractCustomer extends \Magento\ImportExport\Model\Import\Entit
      * Initialize existent customers data
      *
      * @param array $data
-     * @return \Magento\ImportExport\Model\Import\Entity\Eav\AbstractCustomer
+     * @return $this
      */
     protected function _initCustomers(array $data)
     {
@@ -169,7 +169,7 @@ abstract class AbstractCustomer extends \Magento\ImportExport\Model\Import\Entit
      *
      * @param array $rowData
      * @param int $rowNumber
-     * @return boolean
+     * @return bool
      */
     public function validateRow(array $rowData, $rowNumber)
     {
@@ -211,7 +211,7 @@ abstract class AbstractCustomer extends \Magento\ImportExport\Model\Import\Entit
      *
      * @param array $rowData
      * @param int $rowNumber
-     * @return boolean
+     * @return bool
      */
     protected function _checkUniqueKey(array $rowData, $rowNumber)
     {
diff --git a/app/code/Magento/ImportExport/Model/Import/Entity/Eav/Customer.php b/app/code/Magento/ImportExport/Model/Import/Entity/Eav/Customer.php
index be33c954734..a246a9fcfbc 100644
--- a/app/code/Magento/ImportExport/Model/Import/Entity/Eav/Customer.php
+++ b/app/code/Magento/ImportExport/Model/Import/Entity/Eav/Customer.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model\Import\Entity\Eav;
 
 /**
  * Import entity customer model
@@ -34,8 +35,6 @@
  * @todo finish moving dependencies to constructor in the scope of
  * @todo https://wiki.magento.com/display/MAGE2/Technical+Debt+%28Team-Donetsk-B%29
  */
-namespace Magento\ImportExport\Model\Import\Entity\Eav;
-
 class Customer
     extends \Magento\ImportExport\Model\Import\Entity\Eav\AbstractCustomer
 {
@@ -94,7 +93,7 @@ class Customer
      * For example, when entity attribute has own validation and import procedures
      * or just to deny this attribute processing.
      *
-     * @var array
+     * @var string[]
      */
     protected $_ignoredAttributes = array('website_id', 'store_id');
 
@@ -210,7 +209,7 @@ class Customer
      *
      * @param array $entitiesToCreate Rows for insert
      * @param array $entitiesToUpdate Rows for update
-     * @return \Magento\ImportExport\Model\Import\Entity\Eav\Customer
+     * @return $this
      */
     protected function _saveCustomerEntities(array $entitiesToCreate, array $entitiesToUpdate)
     {
@@ -233,7 +232,7 @@ class Customer
      * Save customer attributes.
      *
      * @param array $attributesData
-     * @return \Magento\ImportExport\Model\Import\Entity\Eav\Customer
+     * @return $this
      */
     protected function _saveCustomerAttributes(array $attributesData)
     {
@@ -259,7 +258,7 @@ class Customer
      * Delete list of customers
      *
      * @param array $entitiesToDelete customers id list
-     * @return \Magento\ImportExport\Model\Import\Entity\Eav\Customer
+     * @return $this
      */
     protected function _deleteCustomerEntities(array $entitiesToDelete)
     {
@@ -375,7 +374,7 @@ class Customer
     /**
      * Import data rows
      *
-     * @return boolean
+     * @return bool
      */
     protected function _importData()
     {
@@ -440,7 +439,7 @@ class Customer
      *
      * @param array $rowData
      * @param int $rowNumber
-     * @return null
+     * @return void
      */
     protected function _validateRowForUpdate(array $rowData, $rowNumber)
     {
@@ -481,7 +480,7 @@ class Customer
      *
      * @param array $rowData
      * @param int $rowNumber
-     * @return null
+     * @return void
      */
     protected function _validateRowForDelete(array $rowData, $rowNumber)
     {
diff --git a/app/code/Magento/ImportExport/Model/Import/Entity/Eav/Customer/Address.php b/app/code/Magento/ImportExport/Model/Import/Entity/Eav/Customer/Address.php
index b454acc2ff4..1d6bb834362 100644
--- a/app/code/Magento/ImportExport/Model/Import/Entity/Eav/Customer/Address.php
+++ b/app/code/Magento/ImportExport/Model/Import/Entity/Eav/Customer/Address.php
@@ -87,14 +87,14 @@ class Address
     /**
      * Permanent entity columns
      *
-     * @var array
+     * @var string[]
      */
     protected $_permanentAttributes = array(self::COLUMN_WEBSITE, self::COLUMN_EMAIL, self::COLUMN_ADDRESS_ID);
 
     /**
      * Existing addresses
      *
-     * [customer ID] => array(
+     * Example Array: [customer ID] => array(
      *     address ID 1,
      *     address ID 2,
      *     ...
@@ -108,7 +108,7 @@ class Address
     /**
      * Attributes with index (not label) value
      *
-     * @var array
+     * @var string[]
      */
     protected $_indexValueAttributes = array(self::COLUMN_COUNTRY_ID);
 
@@ -122,7 +122,7 @@ class Address
     /**
      * Countries and regions
      *
-     * array(
+     * Example array: array(
      *   [country_id_lowercased_1] => array(
      *     [region_code_lowercased_1]         => region_id_1,
      *     [region_default_name_lowercased_1] => region_id_1,
@@ -147,7 +147,7 @@ class Address
     /**
      * Column names that holds values with particular meaning
      *
-     * @var array
+     * @var string[]
      */
     protected $_specialAttributes = array(
         self::COLUMN_ACTION,
@@ -355,7 +355,7 @@ class Address
     /**
      * Initialize existent addresses data
      *
-     * @return \Magento\ImportExport\Model\Import\Entity\Eav\Customer\Address
+     * @return $this
      */
     protected function _initAddresses()
     {
@@ -376,7 +376,7 @@ class Address
     /**
      * Initialize country regions hash for clever recognition
      *
-     * @return \Magento\ImportExport\Model\Import\Entity\Eav\Customer\Address
+     * @return $this
      */
     protected function _initCountryRegions()
     {
@@ -543,7 +543,7 @@ class Address
      * Update and insert data in entity table
      *
      * @param array $entityRows Rows for insert
-     * @return \Magento\ImportExport\Model\Import\Entity\Eav\Customer\Address
+     * @return $this
      */
     protected function _saveAddressEntities(array $entityRows)
     {
@@ -557,7 +557,7 @@ class Address
      * Save customer address attributes
      *
      * @param array $attributesData
-     * @return \Magento\ImportExport\Model\Import\Entity\Eav\Customer\Address
+     * @return $this
      */
     protected function _saveAddressAttributes(array $attributesData)
     {
@@ -582,7 +582,7 @@ class Address
      * Save customer default addresses
      *
      * @param array $defaults
-     * @return \Magento\ImportExport\Model\Import\Entity\Eav\Customer\Address
+     * @return $this
      */
     protected function _saveCustomerDefaults(array $defaults)
     {
@@ -611,7 +611,7 @@ class Address
      * Delete data from entity table
      *
      * @param array $entityRowIds Row IDs for delete
-     * @return \Magento\ImportExport\Model\Import\Entity\Eav\Customer\Address
+     * @return $this
      */
     protected function _deleteAddressEntities(array $entityRowIds)
     {
@@ -648,7 +648,7 @@ class Address
      *
      * @param array $rowData
      * @param int $rowNumber
-     * @return null
+     * @return void
      */
     protected function _validateRowForUpdate(array $rowData, $rowNumber)
     {
@@ -700,7 +700,7 @@ class Address
      *
      * @param array $rowData
      * @param int $rowNumber
-     * @return null
+     * @return void
      */
     protected function _validateRowForDelete(array $rowData, $rowNumber)
     {
diff --git a/app/code/Magento/ImportExport/Model/Import/Entity/Product.php b/app/code/Magento/ImportExport/Model/Import/Entity/Product.php
index 5a6bffeb3ac..da14db92302 100644
--- a/app/code/Magento/ImportExport/Model/Import/Entity/Product.php
+++ b/app/code/Magento/ImportExport/Model/Import/Entity/Product.php
@@ -132,7 +132,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
     /**
      * Attributes with index (not label) value.
      *
-     * @var array
+     * @var string[]
      */
     protected $_indexValueAttributes = array(
         'status',
@@ -216,7 +216,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
     /**
      * Column names that holds values with particular meaning.
      *
-     * @var array
+     * @var string[]
      */
     protected $_specialAttributes = array(
         '_store', '_attribute_set', '_type', self::COL_CATEGORY, self::COL_ROOT_CATEGORY, '_product_websites',
@@ -234,7 +234,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
     /**
      * Column names that holds images files names
      *
-     * @var array
+     * @var string[]
      */
     protected $_imagesArrayKeys = array(
         '_media_image', 'image', 'small_image', 'thumbnail'
@@ -243,7 +243,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
     /**
      * Permanent entity columns.
      *
-     * @var array
+     * @var string[]
      */
     protected $_permanentAttributes = array(self::COL_SKU);
 
@@ -520,7 +520,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
      * Set import parameters
      *
      * @param array $params
-     * @return \Magento\ImportExport\Model\Import\Entity\Product
+     * @return $this
      */
     public function setParameters(array $params)
     {
@@ -533,7 +533,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
     /**
      * Delete products.
      *
-     * @return \Magento\ImportExport\Model\Import\Entity\Product
+     * @return $this
      */
     protected function _deleteProducts()
     {
@@ -584,7 +584,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
     /**
      * Initialize attribute sets code-to-id pairs.
      *
-     * @return \Magento\ImportExport\Model\Import\Entity\Product
+     * @return $this
      */
     protected function _initAttributeSets()
     {
@@ -599,7 +599,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
     /**
      * Initialize categories text-path to ID hash.
      *
-     * @return \Magento\ImportExport\Model\Import\Entity\Product
+     * @return $this
      */
     protected function _initCategories()
     {
@@ -630,7 +630,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
     /**
      * Initialize customer groups.
      *
-     * @return \Magento\ImportExport\Model\Import\Entity\Product
+     * @return $this
      */
     protected function _initCustomerGroups()
     {
@@ -643,7 +643,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
     /**
      * Initialize existent product SKUs.
      *
-     * @return \Magento\ImportExport\Model\Import\Entity\Product
+     * @return $this
      */
     protected function _initSkus()
     {
@@ -664,7 +664,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
     /**
      * Initialize stores hash.
      *
-     * @return \Magento\ImportExport\Model\Import\Entity\Product
+     * @return $this
      */
     protected function _initStores()
     {
@@ -678,8 +678,8 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
     /**
      * Initialize product type models.
      *
-     * @throws \Exception
-     * @return \Magento\ImportExport\Model\Import\Entity\Product
+     * @return $this
+     * @throws \Magento\Core\Exception
      */
     protected function _initTypeModels()
     {
@@ -710,7 +710,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
     /**
      * Initialize website values.
      *
-     * @return \Magento\ImportExport\Model\Import\Entity\Product
+     * @return $this
      */
     protected function _initWebsites()
     {
@@ -901,7 +901,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
      * Gather and save information about product links.
      * Must be called after ALL products saving done.
      *
-     * @return \Magento\ImportExport\Model\Import\Entity\Product
+     * @return $this
      */
     protected function _saveLinks()
     {
@@ -1013,7 +1013,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
      * Save product attributes.
      *
      * @param array $attributesData
-     * @return \Magento\ImportExport\Model\Import\Entity\Product
+     * @return $this
      */
     protected function _saveProductAttributes(array $attributesData)
     {
@@ -1054,7 +1054,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
      * Save product categories.
      *
      * @param array $categoriesData
-     * @return \Magento\ImportExport\Model\Import\Entity\Product
+     * @return $this
      */
     protected function _saveProductCategories(array $categoriesData)
     {
@@ -1093,7 +1093,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
      *
      * @param array $entityRowsIn Row for insert
      * @param array $entityRowsUp Row for update
-     * @return \Magento\ImportExport\Model\Import\Entity\Product
+     * @return $this
      */
     protected function _saveProductEntity(array $entityRowsIn, array $entityRowsUp)
     {
@@ -1126,7 +1126,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
     /**
      * Gather and save information about product entities.
      *
-     * @return \Magento\ImportExport\Model\Import\Entity\Product
+     * @return $this
      */
     protected function _saveProducts()
     {
@@ -1342,7 +1342,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
      * Save product tier prices.
      *
      * @param array $tierPriceData
-     * @return \Magento\ImportExport\Model\Import\Entity\Product
+     * @return $this
      */
     protected function _saveProductTierPrices(array $tierPriceData)
     {
@@ -1381,7 +1381,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
      * Save product group prices.
      *
      * @param array $groupPriceData
-     * @return \Magento\ImportExport\Model\Import\Entity\Product
+     * @return $this
      */
     protected function _saveProductGroupPrices(array $groupPriceData)
     {
@@ -1418,6 +1418,9 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
 
     /**
      * Returns an object for upload a media files
+     *
+     * @return \Magento\ImportExport\Model\Import\Uploader
+     * @throws \Magento\Core\Exception
      */
     protected function _getUploader()
     {
@@ -1462,7 +1465,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
      * Save product media gallery.
      *
      * @param array $mediaGalleryData
-     * @return \Magento\ImportExport\Model\Import\Entity\Product
+     * @return $this
      */
     protected function _saveMediaGallery(array $mediaGalleryData)
     {
@@ -1543,7 +1546,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
      * Save product websites.
      *
      * @param array $websiteData
-     * @return \Magento\ImportExport\Model\Import\Entity\Product
+     * @return $this
      */
     protected function _saveProductWebsites(array $websiteData)
     {
@@ -1583,7 +1586,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
     /**
      * Stock item saving.
      *
-     * @return \Magento\ImportExport\Model\Import\Entity\Product
+     * @return $this
      */
     protected function _saveStockItem()
     {
@@ -1864,7 +1867,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
     /**
      * Validate data rows and save bunches to DB
      *
-     * @return \Magento\ImportExport\Model\Import\Entity\Product
+     * @return $this
      */
     protected function _saveValidatedBunches()
     {
@@ -1885,7 +1888,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
     /**
      * Get array of affected products
      *
-     * @return array
+     * @return int[]
      */
     public function getAffectedEntityIds()
     {
diff --git a/app/code/Magento/ImportExport/Model/Import/Entity/Product/Option.php b/app/code/Magento/ImportExport/Model/Import/Entity/Product/Option.php
index f6319687be0..b565fa5fbb7 100644
--- a/app/code/Magento/ImportExport/Model/Import/Entity/Product/Option.php
+++ b/app/code/Magento/ImportExport/Model/Import/Entity/Product/Option.php
@@ -368,7 +368,7 @@ class Option extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
     /**
      * Initialization of error message templates
      *
-     * @return \Magento\ImportExport\Model\Import\Entity\Product\Option
+     * @return $this
      */
     protected function _initMessageTemplates()
     {
@@ -414,7 +414,7 @@ class Option extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
      * Initialize table names
      *
      * @param array $data
-     * @return \Magento\ImportExport\Model\Import\Entity\Product\Option
+     * @return $this
      */
     protected function _initTables(array $data)
     {
@@ -435,7 +435,7 @@ class Option extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
      * Initialize stores data
      *
      * @param array $data
-     * @return \Magento\ImportExport\Model\Import\Entity\Product\Option
+     * @return $this
      */
     protected function _initStores(array $data)
     {
@@ -454,7 +454,8 @@ class Option extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
      * Initialize source entities and collections
      *
      * @param array $data
-     * @return \Magento\ImportExport\Model\Import\Entity\Product\Option
+     * @return $this
+     * @throws \Magento\Core\Exception
      */
     protected function _initSourceEntities(array $data)
     {
@@ -496,7 +497,7 @@ class Option extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
     /**
      * Load exiting custom options data
      *
-     * @return \Magento\ImportExport\Model\Import\Entity\Product\Option
+     * @return $this
      */
     protected function _initOldCustomOptions()
     {
@@ -714,6 +715,7 @@ class Option extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
      *
      * @param string $errorCode
      * @param array $errorNumbers
+     * @return void
      */
     protected function _addRowsErrors($errorCode, array $errorNumbers)
     {
@@ -769,7 +771,8 @@ class Option extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
      * Save validated option data
      *
      * @param array $rowData
-     * @param $rowNumber
+     * @param int $rowNumber
+     * @return void
      */
     protected function _saveNewOptionData(array $rowData, $rowNumber)
     {
@@ -974,8 +977,8 @@ class Option extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
     /**
      * Checks that complex options contain values
      *
-     * @param array $options
-     * @param array $titles
+     * @param array &$options
+     * @param array &$titles
      * @param array $typeValues
      * @return bool
      */
@@ -1063,7 +1066,7 @@ class Option extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
     /**
      * Load data of existed products
      *
-     * @return \Magento\ImportExport\Model\Import\Entity\Product\Option
+     * @return $this
      */
     protected function _initProductsSku()
     {
@@ -1081,10 +1084,10 @@ class Option extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
      * Collect custom option main data to import
      *
      * @param array $rowData
-     * @param int $prevOptionId
-     * @param int $nextOptionId
-     * @param array $products
-     * @param array $prices
+     * @param int &$prevOptionId
+     * @param int &$nextOptionId
+     * @param array &$products
+     * @param array &$prices
      * @return array|null
      */
     protected function _collectOptionMainData(array $rowData, &$prevOptionId, &$nextOptionId, array &$products,
@@ -1114,11 +1117,12 @@ class Option extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
      * Collect custom option type data to import
      *
      * @param array $rowData
-     * @param int $prevOptionId
-     * @param int $nextValueId
-     * @param array $typeValues
-     * @param array $typePrices
-     * @param array $typeTitles
+     * @param int &$prevOptionId
+     * @param int &$nextValueId
+     * @param array &$typeValues
+     * @param array &$typePrices
+     * @param array &$typeTitles
+     * @return void
      */
     protected function _collectOptionTypeData(array $rowData, &$prevOptionId, &$nextValueId, array &$typeValues,
         array &$typePrices, array &$typeTitles
@@ -1159,7 +1163,8 @@ class Option extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
      *
      * @param array $rowData
      * @param int $prevOptionId
-     * @param array $titles
+     * @param array &$titles
+     * @return void
      */
     protected function _collectOptionTitle(array $rowData, $prevOptionId, array &$titles)
     {
@@ -1176,11 +1181,11 @@ class Option extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
     /**
      * Find duplicated custom options and update existing options data
      *
-     * @param array $options
-     * @param array $titles
-     * @param array $prices
-     * @param array $typeValues
-     * @return \Magento\ImportExport\Model\Import\Entity\Product\Option
+     * @param array &$options
+     * @param array &$titles
+     * @param array &$prices
+     * @param array &$typeValues
+     * @return $this
      */
     protected function _compareOptionsWithExisting(array &$options, array &$titles, array &$prices, array &$typeValues)
     {
@@ -1361,7 +1366,7 @@ class Option extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
      *
      * @param array $rowData
      * @param int $optionTypeId
-     * @return array|bool
+     * @return array|false
      */
     protected function _getSpecificTypeData(array $rowData, $optionTypeId)
     {
@@ -1397,7 +1402,7 @@ class Option extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
      * Delete custom options for products
      *
      * @param array $productIds
-     * @return \Magento\ImportExport\Model\Import\Entity\Product\Option
+     * @return $this
      */
     protected function _deleteEntities(array $productIds)
     {
@@ -1412,7 +1417,7 @@ class Option extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
      * Delete custom option type values
      *
      * @param array $optionIds
-     * @return \Magento\ImportExport\Model\Import\Entity\Product\Option
+     * @return $this
      */
     protected function _deleteSpecificTypeValues(array $optionIds)
     {
@@ -1426,8 +1431,8 @@ class Option extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
     /**
      * Save custom options main info
      *
-     * @param array $options options data
-     * @return \Magento\ImportExport\Model\Import\Entity\Product\Option
+     * @param array $options Options data
+     * @return $this
      */
     protected function _saveOptions(array $options)
     {
@@ -1439,8 +1444,8 @@ class Option extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
     /**
      * Save custom option titles
      *
-     * @param array $titles option titles data
-     * @return \Magento\ImportExport\Model\Import\Entity\Product\Option
+     * @param array $titles Option titles data
+     * @return $this
      */
     protected function _saveTitles(array $titles)
     {
@@ -1467,8 +1472,8 @@ class Option extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
     /**
      * Save custom option prices
      *
-     * @param array $prices option prices data
-     * @return \Magento\ImportExport\Model\Import\Entity\Product\Option
+     * @param array $prices Option prices data
+     * @return $this
      */
     protected function _savePrices(array $prices)
     {
@@ -1485,8 +1490,8 @@ class Option extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
     /**
      * Save custom option type values
      *
-     * @param array $typeValues option type values
-     * @return \Magento\ImportExport\Model\Import\Entity\Product\Option
+     * @param array $typeValues Option type values
+     * @return $this
      */
     protected function _saveSpecificTypeValues(array $typeValues)
     {
@@ -1512,7 +1517,7 @@ class Option extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
      * Save custom option type prices
      *
      * @param array $typePrices option type prices
-     * @return \Magento\ImportExport\Model\Import\Entity\Product\Option
+     * @return $this
      */
     protected function _saveSpecificTypePrices(array $typePrices)
     {
@@ -1537,8 +1542,8 @@ class Option extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
     /**
      * Save custom option type titles
      *
-     * @param array $typeTitles option type titles
-     * @return \Magento\ImportExport\Model\Import\Entity\Product\Option
+     * @param array $typeTitles Option type titles
+     * @return $this
      */
     protected function _saveSpecificTypeTitles(array $typeTitles)
     {
@@ -1565,8 +1570,8 @@ class Option extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity
     /**
      * Update product data which related to custom options information
      *
-     * @param array $data product data which will be updated
-     * @return \Magento\ImportExport\Model\Import\Entity\Product\Option
+     * @param array $data Product data which will be updated
+     * @return $this
      */
     protected function _updateProducts(array $data)
     {
diff --git a/app/code/Magento/ImportExport/Model/Import/Entity/Product/Type/AbstractType.php b/app/code/Magento/ImportExport/Model/Import/Entity/Product/Type/AbstractType.php
index 134de573e95..91669247a11 100644
--- a/app/code/Magento/ImportExport/Model/Import/Entity/Product/Type/AbstractType.php
+++ b/app/code/Magento/ImportExport/Model/Import/Entity/Product/Type/AbstractType.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model\Import\Entity\Product\Type;
 
 /**
  * Import entity abstract product type model
@@ -31,14 +32,12 @@
  * @package     Magento_ImportExport
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\ImportExport\Model\Import\Entity\Product\Type;
-
 abstract class AbstractType
 {
     /**
      * Product type attribute sets and attributes parameters.
      *
-     * [attr_set_name_1] => array(
+     * Example: [attr_set_name_1] => array(
      *     [attr_code_1] => array(
      *         'options' => array(),
      *         'type' => 'text', 'price', 'textarea', 'select', etc.
@@ -55,14 +54,14 @@ abstract class AbstractType
     /**
      * Attributes' codes which will be allowed anyway, independently from its visibility property.
      *
-     * @var array
+     * @var string[]
      */
     protected $_forcedAttributesCodes = array();
 
     /**
      * Attributes with index (not label) value.
      *
-     * @var array
+     * @var string[]
      */
     protected $_indexValueAttributes = array();
 
@@ -76,7 +75,7 @@ abstract class AbstractType
     /**
      * Column names that holds values with particular meaning.
      *
-     * @var array
+     * @var string[]
      */
     protected $_specialAttributes = array();
 
@@ -88,7 +87,7 @@ abstract class AbstractType
     protected $_entityModel;
 
     /**
-     * Product type (simple, configurable, etc.).
+     * Product type (simple, etc.).
      *
      * @var string
      */
@@ -141,9 +140,10 @@ abstract class AbstractType
      *
      * @param string $attrSetName Name of attribute set.
      * @param array $attrParams Refined attribute parameters.
+     * @param mixed $attribute
      * @return \Magento\ImportExport\Model\Import\Entity\Product\Type\AbstractType
      */
-    protected function _addAttributeParams($attrSetName, array $attrParams)
+    protected function _addAttributeParams($attrSetName, array $attrParams, $attribute)
     {
         if (!$attrParams['apply_to'] || in_array($this->_type, $attrParams['apply_to'])) {
             $this->_attributes[$attrSetName][$attrParams['code']] = $attrParams;
@@ -169,7 +169,7 @@ abstract class AbstractType
     /**
      * Initialize attributes parameters for all attributes' sets.
      *
-     * @return \Magento\ImportExport\Model\Import\Entity\Product\Type\AbstractType
+     * @return $this
      */
     protected function _initAttributes()
     {
@@ -189,7 +189,6 @@ abstract class AbstractType
                         $attributesCache[$attributeId] = array(
                             'id'               => $attributeId,
                             'code'             => $attributeCode,
-                            'for_configurable' => $attribute->getIsConfigurable(),
                             'is_global'        => $attribute->getIsGlobal(),
                             'is_required'      => $attribute->getIsRequired(),
                             'is_unique'        => $attribute->getIsUnique(),
@@ -203,7 +202,9 @@ abstract class AbstractType
                                                       ->getAttributeOptions($attribute, $this->_indexValueAttributes)
                         );
                     }
-                    $this->_addAttributeParams($attributeSet->getAttributeSetName(), $attributesCache[$attributeId]);
+                    $this->_addAttributeParams(
+                        $attributeSet->getAttributeSetName(), $attributesCache[$attributeId], $attribute
+                    );
                 }
             }
         }
@@ -247,7 +248,7 @@ abstract class AbstractType
     /**
      * Particular attribute names getter.
      *
-     * @return array
+     * @return string[]
      */
     public function getParticularAttributes()
     {
@@ -259,8 +260,8 @@ abstract class AbstractType
      *
      * @param array $rowData
      * @param int $rowNum
-     * @param boolean $isNewProduct OPTIONAL
-     * @return boolean
+     * @param bool $isNewProduct Optional
+     * @return bool
      */
     public function isRowValid(array $rowData, $rowNum, $isNewProduct = true)
     {
@@ -353,7 +354,7 @@ abstract class AbstractType
     /**
      * Save product type specific data.
      *
-     * @return \Magento\ImportExport\Model\Import\Entity\Product\Type\AbstractType
+     * @return $this
      */
     public function saveData()
     {
diff --git a/app/code/Magento/ImportExport/Model/Import/Entity/Product/Type/Factory.php b/app/code/Magento/ImportExport/Model/Import/Entity/Product/Type/Factory.php
index 32f102cfd89..f8230206f49 100644
--- a/app/code/Magento/ImportExport/Model/Import/Entity/Product/Type/Factory.php
+++ b/app/code/Magento/ImportExport/Model/Import/Entity/Product/Type/Factory.php
@@ -23,12 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model\Import\Entity\Product\Type;
 
 /**
  * Import product type factory
  */
-namespace Magento\ImportExport\Model\Import\Entity\Product\Type;
-
 class Factory
 {
     /**
diff --git a/app/code/Magento/ImportExport/Model/Import/Entity/Product/Type/Simple.php b/app/code/Magento/ImportExport/Model/Import/Entity/Product/Type/Simple.php
index 35f69c1367b..8f0b0b26ca6 100644
--- a/app/code/Magento/ImportExport/Model/Import/Entity/Product/Type/Simple.php
+++ b/app/code/Magento/ImportExport/Model/Import/Entity/Product/Type/Simple.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model\Import\Entity\Product\Type;
 
 /**
  * Import entity simple product type
@@ -31,15 +32,13 @@
  * @package     Magento_ImportExport
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\ImportExport\Model\Import\Entity\Product\Type;
-
 class Simple
     extends \Magento\ImportExport\Model\Import\Entity\Product\Type\AbstractType
 {
     /**
      * Attributes' codes which will be allowed anyway, independently from its visibility property.
      *
-     * @var array
+     * @var string[]
      */
     protected $_forcedAttributesCodes = array(
         'related_tgtr_position_behavior', 'related_tgtr_position_limit',
diff --git a/app/code/Magento/ImportExport/Model/Import/Source/Csv.php b/app/code/Magento/ImportExport/Model/Import/Source/Csv.php
index a5fafa4e6f9..33ec7eaa367 100644
--- a/app/code/Magento/ImportExport/Model/Import/Source/Csv.php
+++ b/app/code/Magento/ImportExport/Model/Import/Source/Csv.php
@@ -23,12 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model\Import\Source;
 
 /**
  * CSV import adapter
  */
-namespace Magento\ImportExport\Model\Import\Source;
-
 class Csv extends \Magento\ImportExport\Model\Import\AbstractSource
 {
     /**
@@ -95,6 +94,8 @@ class Csv extends \Magento\ImportExport\Model\Import\AbstractSource
 
     /**
      * Rewind the \Iterator to the first element (\Iterator interface)
+     *
+     * @return void
      */
     public function rewind()
     {
diff --git a/app/code/Magento/ImportExport/Model/Import/Uploader.php b/app/code/Magento/ImportExport/Model/Import/Uploader.php
index c5829d581ca..004c759e951 100644
--- a/app/code/Magento/ImportExport/Model/Import/Uploader.php
+++ b/app/code/Magento/ImportExport/Model/Import/Uploader.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model\Import;
 
 /**
  * Import entity product model
@@ -31,18 +32,29 @@
  * @package     Magento_ImportExport
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\ImportExport\Model\Import;
-
 class Uploader extends \Magento\Core\Model\File\Uploader
 {
+
+    /**
+     * @var string
+     */
     protected $_tmpDir  = '';
+
+    /**
+     * @var string
+     */
     protected $_destDir = '';
+
+    /**
+     * @var array
+     */
     protected $_allowedMimeTypes = array(
         'jpg' => 'image/jpeg',
         'jpeg' => 'image/jpeg',
         'gif' => 'image/gif',
         'png' => 'image/png'
     );
+
     const DEFAULT_FILE_TYPE = 'application/octet-stream';
 
     /**
@@ -60,6 +72,7 @@ class Uploader extends \Magento\Core\Model\File\Uploader
      * @param \Magento\Core\Helper\File\Storage $coreFileStorage
      * @param \Magento\Image\AdapterFactory $imageFactory
      * @param \Magento\Core\Model\File\Validator\NotProtectedExtension $validator
+     * @param \Magento\App\Filesystem $filesystem
      * @param string $filePath
      */
     public function __construct(
@@ -82,6 +95,8 @@ class Uploader extends \Magento\Core\Model\File\Uploader
 
     /**
      * Initiate uploader defoult settings
+     *
+     * @return void
      */
     public function init()
     {
@@ -113,6 +128,7 @@ class Uploader extends \Magento\Core\Model\File\Uploader
      * Prepare information about the file for moving
      *
      * @param string $filePath
+     * @return void
      * @throws \Magento\Core\Exception
      */
     protected function _setUploadFile($filePath)
@@ -145,6 +161,9 @@ class Uploader extends \Magento\Core\Model\File\Uploader
 
     /**
      * Validate uploaded file by type and etc.
+     *
+     * @return void
+     * @throws \Exception
      */
     protected function _validateFile()
     {
diff --git a/app/code/Magento/ImportExport/Model/Resource/CollectionByPagesIterator.php b/app/code/Magento/ImportExport/Model/Resource/CollectionByPagesIterator.php
index 50ceb6e046c..de083c7bc7f 100644
--- a/app/code/Magento/ImportExport/Model/Resource/CollectionByPagesIterator.php
+++ b/app/code/Magento/ImportExport/Model/Resource/CollectionByPagesIterator.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model\Resource;
 
 /**
  * Collection by pages iterator
@@ -31,8 +32,6 @@
  * @package     Magento_ImportExport
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\ImportExport\Model\Resource;
-
 class CollectionByPagesIterator
 {
     /**
@@ -41,6 +40,7 @@ class CollectionByPagesIterator
      * @param \Magento\Data\Collection\Db $collection Collection to load page by page
      * @param int $pageSize Number of items to fetch from db in one query
      * @param array $callbacks Array of callbacks which should be applied to each collection item
+     * @return void
      */
     public function iterate(\Magento\Data\Collection\Db $collection, $pageSize, array $callbacks)
     {
diff --git a/app/code/Magento/ImportExport/Model/Resource/Customer/Storage.php b/app/code/Magento/ImportExport/Model/Resource/Customer/Storage.php
index af7fc916f0b..8d17fd2b378 100644
--- a/app/code/Magento/ImportExport/Model/Resource/Customer/Storage.php
+++ b/app/code/Magento/ImportExport/Model/Resource/Customer/Storage.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model\Resource\Customer;
 
 /**
  * Customer storage
@@ -30,10 +31,7 @@
  * @category    Magento
  * @package     Magento_ImportExport
  * @author      Magento Core Team <core@magentocommerce.com>
- *
  */
-namespace Magento\ImportExport\Model\Resource\Customer;
-
 class Storage
 {
     /**
@@ -97,6 +95,8 @@ class Storage
 
     /**
      * Load needed data from customer collection
+     *
+     * @return void
      */
     public function load()
     {
@@ -118,7 +118,7 @@ class Storage
      * Add customer to array
      *
      * @param \Magento\Object|\Magento\Customer\Model\Customer $customer
-     * @return \Magento\ImportExport\Model\Resource\Customer\Storage
+     * @return $this
      */
     public function addCustomer(\Magento\Object $customer)
     {
diff --git a/app/code/Magento/ImportExport/Model/Resource/Import/CustomerComposite/Data.php b/app/code/Magento/ImportExport/Model/Resource/Import/CustomerComposite/Data.php
index 0b741a6b1ce..f8509a7bd72 100644
--- a/app/code/Magento/ImportExport/Model/Resource/Import/CustomerComposite/Data.php
+++ b/app/code/Magento/ImportExport/Model/Resource/Import/CustomerComposite/Data.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model\Resource\Import\CustomerComposite;
 
 /**
  * ImportExport customer_composite entity import data abstract resource model
@@ -31,8 +32,6 @@
  * @package     Magento_ImportExport
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\ImportExport\Model\Resource\Import\CustomerComposite;
-
 class Data extends \Magento\ImportExport\Model\Resource\Import\Data
 {
     /**
@@ -98,7 +97,7 @@ class Data extends \Magento\ImportExport\Model\Resource\Import\Data
      * Prepare row
      *
      * @param array $rowData
-     * @return array
+     * @return array|null
      */
     protected function _prepareRow(array $rowData)
     {
diff --git a/app/code/Magento/ImportExport/Model/Resource/Import/Data.php b/app/code/Magento/ImportExport/Model/Resource/Import/Data.php
index bcb600097ae..31e2959f679 100644
--- a/app/code/Magento/ImportExport/Model/Resource/Import/Data.php
+++ b/app/code/Magento/ImportExport/Model/Resource/Import/Data.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model\Resource\Import;
 
 /**
  * ImportExport import data resource model
@@ -31,8 +32,6 @@
  * @package     Magento_ImportExport
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\ImportExport\Model\Resource\Import;
-
 class Data
     extends \Magento\Core\Model\Resource\Db\AbstractDb
     implements \IteratorAggregate
@@ -66,6 +65,8 @@ class Data
 
     /**
      * Resource initialization
+     *
+     * @return void
      */
     protected function _construct()
     {
@@ -130,10 +131,9 @@ class Data
     /**
      * Return request data from import data table
      *
-     * @throws \Magento\Core\Exception
-     *
      * @param string $code parameter name
      * @return string
+     * @throws \Magento\Core\Exception
      */
     public function getUniqueColumnData($code)
     {
diff --git a/app/code/Magento/ImportExport/Model/Source/Export/Entity.php b/app/code/Magento/ImportExport/Model/Source/Export/Entity.php
index 731ba08b907..46b88ad7f9e 100644
--- a/app/code/Magento/ImportExport/Model/Source/Export/Entity.php
+++ b/app/code/Magento/ImportExport/Model/Source/Export/Entity.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model\Source\Export;
 
 /**
  * Source export entity model
@@ -31,8 +32,6 @@
  * @package     Magento_ImportExport
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\ImportExport\Model\Source\Export;
-
 class Entity implements \Magento\Core\Model\Option\ArrayInterface
 {
     /**
@@ -50,9 +49,7 @@ class Entity implements \Magento\Core\Model\Option\ArrayInterface
     }
 
     /**
-     * Prepare and return array of export entities ids and their names
-     *
-     * @return array
+     * {@inheritdoc}
      */
     public function toOptionArray()
     {
diff --git a/app/code/Magento/ImportExport/Model/Source/Export/Format.php b/app/code/Magento/ImportExport/Model/Source/Export/Format.php
index 048b38763a0..a4e4a257587 100644
--- a/app/code/Magento/ImportExport/Model/Source/Export/Format.php
+++ b/app/code/Magento/ImportExport/Model/Source/Export/Format.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model\Source\Export;
 
 /**
  * Source model of export file formats
@@ -31,8 +32,6 @@
  * @package     Magento_ImportExport
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\ImportExport\Model\Source\Export;
-
 class Format implements \Magento\Core\Model\Option\ArrayInterface
 {
     /**
@@ -50,9 +49,7 @@ class Format implements \Magento\Core\Model\Option\ArrayInterface
     }
 
     /**
-     * Prepare and return array of import entities ids and their names
-     *
-     * @return array
+     * {@inheritdoc}
      */
     public function toOptionArray()
     {
diff --git a/app/code/Magento/ImportExport/Model/Source/Import/AbstractBehavior.php b/app/code/Magento/ImportExport/Model/Source/Import/AbstractBehavior.php
index e73457cae61..0e10b6b0bf1 100644
--- a/app/code/Magento/ImportExport/Model/Source/Import/AbstractBehavior.php
+++ b/app/code/Magento/ImportExport/Model/Source/Import/AbstractBehavior.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model\Source\Import;
 
 /**
  * Source import behavior model
@@ -31,8 +32,6 @@
  * @package     Magento_ImportExport
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\ImportExport\Model\Source\Import;
-
 abstract class AbstractBehavior implements \Magento\Core\Model\Option\ArrayInterface
 {
     /**
diff --git a/app/code/Magento/ImportExport/Model/Source/Import/Behavior/Basic.php b/app/code/Magento/ImportExport/Model/Source/Import/Behavior/Basic.php
index 5d69d2075ba..a3ecc1ee422 100644
--- a/app/code/Magento/ImportExport/Model/Source/Import/Behavior/Basic.php
+++ b/app/code/Magento/ImportExport/Model/Source/Import/Behavior/Basic.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model\Source\Import\Behavior;
 
 /**
  * Import behavior source model used in import for product and customer import entities.
@@ -32,15 +33,11 @@
  * @package     Magento_ImportExport
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\ImportExport\Model\Source\Import\Behavior;
-
 class Basic
     extends \Magento\ImportExport\Model\Source\Import\AbstractBehavior
 {
     /**
-     * Get possible behaviours
-     *
-     * @return array
+     * {@inheritdoc}
      */
     public function toArray()
     {
@@ -55,9 +52,7 @@ class Basic
     }
 
     /**
-     * Get current behaviour code
-     *
-     * @return string
+     * {@inheritdoc}
      */
     public function getCode()
     {
diff --git a/app/code/Magento/ImportExport/Model/Source/Import/Behavior/Custom.php b/app/code/Magento/ImportExport/Model/Source/Import/Behavior/Custom.php
index b7c238ad0af..218e4a1ec6c 100644
--- a/app/code/Magento/ImportExport/Model/Source/Import/Behavior/Custom.php
+++ b/app/code/Magento/ImportExport/Model/Source/Import/Behavior/Custom.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model\Source\Import\Behavior;
 
 /**
  * Import behavior source model used for customers' components import entities.
@@ -32,15 +33,11 @@
  * @package     Magento_ImportExport
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\ImportExport\Model\Source\Import\Behavior;
-
 class Custom
     extends \Magento\ImportExport\Model\Source\Import\AbstractBehavior
 {
     /**
-     * Get possible behaviours
-     *
-     * @return array
+     * {@inheritdoc}
      */
     public function toArray()
     {
@@ -55,9 +52,7 @@ class Custom
     }
 
     /**
-     * Get current behaviour code
-     *
-     * @return string
+     * {@inheritdoc}
      */
     public function getCode()
     {
diff --git a/app/code/Magento/ImportExport/Model/Source/Import/Entity.php b/app/code/Magento/ImportExport/Model/Source/Import/Entity.php
index 64f8e2f5eb7..2a87f47c216 100644
--- a/app/code/Magento/ImportExport/Model/Source/Import/Entity.php
+++ b/app/code/Magento/ImportExport/Model/Source/Import/Entity.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ImportExport\Model\Source\Import;
 
 /**
  * Source import entity model
@@ -31,8 +32,6 @@
  * @package     Magento_ImportExport
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\ImportExport\Model\Source\Import;
-
 class Entity implements \Magento\Core\Model\Option\ArrayInterface
 {
     /**
@@ -50,9 +49,7 @@ class Entity implements \Magento\Core\Model\Option\ArrayInterface
     }
 
     /**
-     * Prepare and return array of import entities ids and their names
-     *
-     * @return array
+     * {@inheritdoc}
      */
     public function toOptionArray()
     {
diff --git a/app/code/Magento/ImportExport/etc/di.xml b/app/code/Magento/ImportExport/etc/di.xml
index cc968cfe539..1e7ac25c2a2 100644
--- a/app/code/Magento/ImportExport/etc/di.xml
+++ b/app/code/Magento/ImportExport/etc/di.xml
@@ -26,4 +26,5 @@
 <config>
     <preference for="Magento\ImportExport\Model\Import\ConfigInterface" type="Magento\ImportExport\Model\Import\Config" />
     <preference for="Magento\ImportExport\Model\Export\ConfigInterface" type="Magento\ImportExport\Model\Export\Config" />
+    <preference for="Magento\ImportExport\Model\Export\RowCustomizerInterface" type="Magento\ImportExport\Model\Export\RowCustomizer\Composite" />
 </config>
diff --git a/app/code/Magento/ImportExport/etc/export.xml b/app/code/Magento/ImportExport/etc/export.xml
index e00dbe36566..a7699122270 100644
--- a/app/code/Magento/ImportExport/etc/export.xml
+++ b/app/code/Magento/ImportExport/etc/export.xml
@@ -28,7 +28,6 @@
     <entity name="customer" label="Customers Main File" model="Magento\ImportExport\Model\Export\Entity\Eav\Customer" />
     <entity name="customer_address" label="Customer Addresses" model="Magento\ImportExport\Model\Export\Entity\Eav\Customer\Address" />
     <productType name="simple" model="Magento\ImportExport\Model\Export\Entity\Product\Type\Simple" />
-    <productType name="configurable" model="Magento\ImportExport\Model\Export\Entity\Product\Type\Configurable" />
     <productType name="virtual" model="Magento\ImportExport\Model\Export\Entity\Product\Type\Simple" />
     <fileFormat name="csv" label="CSV" model="Magento\ImportExport\Model\Export\Adapter\Csv" />
 </config>
diff --git a/app/code/Magento/ImportExport/etc/import.xml b/app/code/Magento/ImportExport/etc/import.xml
index 5442215c390..034bc576544 100644
--- a/app/code/Magento/ImportExport/etc/import.xml
+++ b/app/code/Magento/ImportExport/etc/import.xml
@@ -29,6 +29,5 @@
     <entity name="customer" label="Customers Main File" model="Magento\ImportExport\Model\Import\Entity\Eav\Customer" behaviorModel="Magento\ImportExport\Model\Source\Import\Behavior\Custom" />
     <entity name="customer_address" label="Customer Addresses" model="Magento\ImportExport\Model\Import\Entity\Eav\Customer\Address" behaviorModel="Magento\ImportExport\Model\Source\Import\Behavior\Custom" />
     <productType name="simple" model="Magento\ImportExport\Model\Import\Entity\Product\Type\Simple" />
-    <productType name="configurable" model="Magento\ImportExport\Model\Import\Entity\Product\Type\Configurable" />
     <productType name="virtual" model="Magento\ImportExport\Model\Import\Entity\Product\Type\Simple" />
 </config>
diff --git a/app/code/Magento/ImportExport/sql/importexport_setup/install-1.6.0.0.php b/app/code/Magento/ImportExport/sql/importexport_setup/install-1.6.0.0.php
index 63815645091..fef35f1c117 100644
--- a/app/code/Magento/ImportExport/sql/importexport_setup/install-1.6.0.0.php
+++ b/app/code/Magento/ImportExport/sql/importexport_setup/install-1.6.0.0.php
@@ -52,48 +52,6 @@ $table = $installer->getConnection()
     ->setComment('Import Data Table');
 $installer->getConnection()->createTable($table);
 
-/**
- * Add unique key for parent-child pairs which makes easier configurable products import
- */
-$installer->getConnection()->addIndex(
-    $installer->getTable('catalog_product_super_link'),
-    $installer->getIdxName(
-        'catalog_product_super_link',
-        array('product_id', 'parent_id'),
-        \Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE
-    ),
-    array('product_id', 'parent_id'),
-    \Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE
-);
-
-/**
- * Add unique key for 'catalog_product_super_attribute' table
- */
-$installer->getConnection()->addIndex(
-    $installer->getTable('catalog_product_super_attribute'),
-    $installer->getIdxName(
-        'catalog_product_super_attribute',
-        array('product_id', 'attribute_id'),
-        \Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE
-    ),
-    array('product_id', 'attribute_id'),
-    \Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE
-);
-
-/**
- * Add unique key for 'catalog_product_super_attribute_pricing' table
- */
-$installer->getConnection()->addIndex(
-    $installer->getTable('catalog_product_super_attribute_pricing'),
-    $installer->getIdxName(
-        'catalog_product_super_attribute_pricing',
-        array('product_super_attribute_id', 'value_index', 'website_id'),
-        \Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE
-    ),
-    array('product_super_attribute_id', 'value_index', 'website_id'),
-    \Magento\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE
-);
-
 /**
  * Add unique key for 'catalog_product_link_attribute_int' table
  */
diff --git a/app/code/Magento/Index/App/Shell/ErrorHandler.php b/app/code/Magento/Index/App/Shell/ErrorHandler.php
index 2813a8980bf..78494934de7 100644
--- a/app/code/Magento/Index/App/Shell/ErrorHandler.php
+++ b/app/code/Magento/Index/App/Shell/ErrorHandler.php
@@ -21,6 +21,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+
 namespace Magento\Index\App\Shell;
 
 class ErrorHandler
diff --git a/app/code/Magento/Index/etc/adminhtml/di.xml b/app/code/Magento/Index/etc/adminhtml/di.xml
index 5994d510e99..337dccd9074 100644
--- a/app/code/Magento/Index/etc/adminhtml/di.xml
+++ b/app/code/Magento/Index/etc/adminhtml/di.xml
@@ -23,12 +23,12 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\AdminNotification\Model\System\MessageList">
-        <param name="messages">
-            <array>
-                <item key="indexer"><value>Magento\Index\Model\System\Message\IndexOutdated</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="messages" xsi:type="array">
+                <item name="indexer" xsi:type="string">Magento\Index\Model\System\Message\IndexOutdated</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Index/etc/di.xml b/app/code/Magento/Index/etc/di.xml
index 97736214cee..b956cf13449 100644
--- a/app/code/Magento/Index/etc/di.xml
+++ b/app/code/Magento/Index/etc/di.xml
@@ -23,13 +23,13 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <preference for="Magento\Index\Model\Indexer\ConfigInterface" type="Magento\Index\Model\Indexer\Config" />
     <type name="Magento\Module\Updater\SetupFactory">
-        <param name="resourceTypes">
-            <array>
-                <item key="index_setup"><value>Magento\Index\Model\Resource\Setup</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="resourceTypes" xsi:type="array">
+                <item name="index_setup" xsi:type="string">Magento\Index\Model\Resource\Setup</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Indexer/App/Indexer.php b/app/code/Magento/Indexer/App/Indexer.php
index 478e6454979..a12ea34d2f9 100644
--- a/app/code/Magento/Indexer/App/Indexer.php
+++ b/app/code/Magento/Indexer/App/Indexer.php
@@ -39,32 +39,29 @@ class Indexer implements \Magento\LauncherInterface
     protected $filesystem;
 
     /**
-     * @var \Magento\App\Console\Response
+     * @var \Magento\Index\Model\IndexerFactory
      */
-    protected $response;
+    protected $_indexerFactory;
 
     /**
-     * @param $reportDir
+     * @param string $reportDir
      * @param \Magento\Filesystem $filesystem
      * @param \Magento\Indexer\Model\Processor $processor
-     * @param \Magento\App\Console\Response $response
      */
     public function __construct(
         $reportDir,
         \Magento\Filesystem $filesystem,
-        \Magento\Indexer\Model\Processor $processor,
-        \Magento\App\Console\Response $response
+        \Magento\Indexer\Model\Processor $processor
     ) {
         $this->reportDir = $reportDir;
         $this->filesystem = $filesystem;
         $this->processor = $processor;
-        $this->response = $response;
     }
 
     /**
      * Run application
      *
-     * @return \Magento\App\ResponseInterface
+     * @return int
      */
     public function launch()
     {
@@ -77,8 +74,7 @@ class Indexer implements \Magento\LauncherInterface
 
         /* Regenerate all indexers */
         $this->processor->reindexAll();
-        $this->response->setCode(0);
 
-        return $this->response;
+        return 0;
     }
 }
diff --git a/app/code/Magento/Indexer/Block/Backend/Grid/ItemsUpdater.php b/app/code/Magento/Indexer/Block/Backend/Grid/ItemsUpdater.php
index 1f47d7e64e7..ad5d1da1ab8 100644
--- a/app/code/Magento/Indexer/Block/Backend/Grid/ItemsUpdater.php
+++ b/app/code/Magento/Indexer/Block/Backend/Grid/ItemsUpdater.php
@@ -24,7 +24,7 @@
 
 namespace Magento\Indexer\Block\Backend\Grid;
 
-class ItemsUpdater implements \Magento\Core\Model\Layout\Argument\UpdaterInterface
+class ItemsUpdater implements \Magento\View\Layout\Argument\UpdaterInterface
 {
     /**
      * @var \Magento\AuthorizationInterface
diff --git a/app/code/Magento/Indexer/Model/Config.php b/app/code/Magento/Indexer/Model/Config.php
index ff786f783be..c716feefe6c 100644
--- a/app/code/Magento/Indexer/Model/Config.php
+++ b/app/code/Magento/Indexer/Model/Config.php
@@ -59,12 +59,4 @@ class Config implements ConfigInterface
     {
         return $this->configData->get($indexerId);
     }
-
-    /**
-     * @return array
-     */
-    public function getIndexerIds()
-    {
-        return array_keys($this->get());
-    }
 }
diff --git a/app/code/Magento/Indexer/Model/Indexer.php b/app/code/Magento/Indexer/Model/Indexer.php
index 2e5f0b61878..1e55c57d28b 100644
--- a/app/code/Magento/Indexer/Model/Indexer.php
+++ b/app/code/Magento/Indexer/Model/Indexer.php
@@ -167,10 +167,7 @@ class Indexer extends \Magento\Object implements IndexerInterface
     {
         if (!$this->state) {
             $this->state = $this->stateFactory->create();
-            $this->state->load($this->getId(), 'indexer_id');
-            if (!$this->state->getId()) {
-                $this->state->setIndexerId($this->getId());
-            }
+            $this->state->loadByIndexer($this->getId());
         }
         return $this->state;
     }
@@ -247,7 +244,9 @@ class Indexer extends \Magento\Object implements IndexerInterface
      */
     public function invalidate()
     {
-        $this->getState()->setStatus(Indexer\State::STATUS_INVALID)->save();
+        $state = $this->getState();
+        $state->setStatus(Indexer\State::STATUS_INVALID);
+        $state->save();
     }
 
     /**
@@ -298,22 +297,20 @@ class Indexer extends \Magento\Object implements IndexerInterface
     public function reindexAll()
     {
         if ($this->getState()->getStatus() != Indexer\State::STATUS_WORKING) {
-            $this->getState()
-                ->setStatus(Indexer\State::STATUS_WORKING)
-                ->save();
+            $state = $this->getState();
+            $state->setStatus(Indexer\State::STATUS_WORKING);
+            $state->save();
             if ($this->getView()->isEnabled()) {
                 $this->getView()->suspend();
             }
             try {
                 $this->getActionInstance()->executeFull();
-                $this->getState()
-                    ->setStatus(Indexer\State::STATUS_VALID)
-                    ->save();
+                $state->setStatus(Indexer\State::STATUS_VALID);
+                $state->save();
                 $this->getView()->resume();
             } catch (\Exception $exception) {
-                $this->getState()
-                    ->setStatus(Indexer\State::STATUS_INVALID)
-                    ->save();
+                $state->setStatus(Indexer\State::STATUS_INVALID);
+                $state->save();
                 $this->getView()->resume();
                 throw $exception;
             }
diff --git a/app/code/Magento/Indexer/Model/Indexer/State.php b/app/code/Magento/Indexer/Model/Indexer/State.php
index bcee2f9b957..c85db8e4b5a 100644
--- a/app/code/Magento/Indexer/Model/Indexer/State.php
+++ b/app/code/Magento/Indexer/Model/Indexer/State.php
@@ -28,7 +28,6 @@ namespace Magento\Indexer\Model\Indexer;
  * @method string getIndexerId()
  * @method \Magento\Indexer\Model\Indexer\State setIndexerId($value)
  * @method string getStatus()
- * @method \Magento\Indexer\Model\Indexer\State setStatus($value)
  * @method string getUpdated()
  * @method \Magento\Indexer\Model\Indexer\State setUpdated($value)
  */
@@ -75,6 +74,32 @@ class State extends \Magento\Core\Model\AbstractModel
         parent::__construct($context, $registry, $resource, $resourceCollection, $data);
     }
 
+    /**
+     * Fill object with state data by view ID
+     *
+     * @param string $indexerId
+     * @return $this
+     */
+    public function loadByIndexer($indexerId)
+    {
+        $this->load($indexerId, 'indexer_id');
+        if (!$this->getId()) {
+            $this->setIndexerId($indexerId);
+        }
+        return $this;
+    }
+
+    /**
+     * Status setter
+     *
+     * @param string $status
+     * @return $this
+     */
+    public function setStatus($status)
+    {
+        return parent::setStatus($status);
+    }
+
     protected function _beforeSave()
     {
         $this->setUpdated(time());
diff --git a/app/code/Magento/Indexer/etc/di.xml b/app/code/Magento/Indexer/etc/di.xml
index fc6a11d8398..b15526ee5fc 100644
--- a/app/code/Magento/Indexer/etc/di.xml
+++ b/app/code/Magento/Indexer/etc/di.xml
@@ -23,22 +23,22 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <preference for="Magento\Indexer\Model\ConfigInterface" type="Magento\Indexer\Model\Config" />
     <preference for="Magento\Indexer\Model\IndexerInterface" type="Magento\Indexer\Model\Indexer" />
     <type name="Magento\Indexer\Model\Indexer">
-        <param name="view">
-            <instance type="Magento\Mview\View" shared="false"/>
-        </param>
+        <arguments>
+            <argument name="view" xsi:type="object" shared="false">Magento\Mview\View</argument>
+        </arguments>
     </type>
     <type name="Magento\Indexer\Model\Config">
-        <param name="configData">
-            <instance type="Magento\Indexer\Model\Config\Data\Proxy"/>
-        </param>
+        <arguments>
+            <argument name="configData" xsi:type="object">Magento\Indexer\Model\Config\Data\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Indexer\Model\Config\Data">
-        <param name="stateCollection">
-            <instance type="Magento\Indexer\Model\Resource\Indexer\State\Collection" shared="false"/>
-        </param>
+        <arguments>
+            <argument name="stateCollection" xsi:type="object" shared="false">Magento\Indexer\Model\Resource\Indexer\State\Collection</argument>
+        </arguments>
     </type>
-</config>
\ No newline at end of file
+</config>
diff --git a/app/code/Magento/Install/etc/di.xml b/app/code/Magento/Install/etc/di.xml
index e9504dd992f..f7779ab6f7f 100644
--- a/app/code/Magento/Install/etc/di.xml
+++ b/app/code/Magento/Install/etc/di.xml
@@ -23,137 +23,121 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <preference for="Magento\View\Design\Theme\ListInterface" type="Magento\Core\Model\Theme\Collection" />
     <virtualType name="Magento\Install\Model\Session\Storage" type="Magento\Session\Storage">
-        <param name="namespace">
-            <value>install</value>
-        </param>
+        <arguments>
+            <argument name="namespace" xsi:type="string">install</argument>
+        </arguments>
     </virtualType>
     <virtualType name="Magento\Install\Model\Session" type="Magento\Session\Generic">
-        <param name="storage">
-            <instance type="Magento\Install\Model\Session\Storage" />
-        </param>
+        <arguments>
+            <argument name="storage" xsi:type="object">Magento\Install\Model\Session\Storage</argument>
+        </arguments>
     </virtualType>
     <type name="Magento\Install\Block\Begin">
-        <param name="eulaFile">
-            <value>LICENSE.html</value>
-        </param>
-        <param name='session'>
-            <instance type="Magento\Install\Model\Session" />
-        </param>
+        <arguments>
+            <argument name="eulaFile" xsi:type="string">LICENSE.html</argument>
+            <argument name="session" xsi:type="object">Magento\Install\Model\Session</argument>
+        </arguments>
     </type>
     <type name="Magento\Install\Block\End">
-        <param name="cryptKey">
-            <value type="argument">Magento\Encryption\Encryptor::PARAM_CRYPT_KEY</value>
-        </param>
-        <param name='session'>
-            <instance type="Magento\Install\Model\Session" />
-        </param>
+        <arguments>
+            <argument name="cryptKey" xsi:type="init_parameter">Magento\Encryption\Encryptor::PARAM_CRYPT_KEY</argument>
+            <argument name="session" xsi:type="object">Magento\Install\Model\Session</argument>
+        </arguments>
     </type>
     <type name="Magento\Install\Model\Installer\Db">
-        <param name="dbConfig">
-            <array>
-                <item key="mysql4">
-                    <array>
-                        <item key="type"><value>pdo_mysql</value></item>
-                        <item key="initStatements"><value>SET NAMES utf8</value></item>
-                        <item key="min_version"><value>4.1.20</value></item>
-                    </array>
+        <arguments>
+            <argument name="dbConfig" xsi:type="array">
+                <item name="mysql4" xsi:type="array">
+                    <item name="type" xsi:type="string">pdo_mysql</item>
+                    <item name="initStatements" xsi:type="string">SET NAMES utf8</item>
+                    <item name="min_version" xsi:type="string">4.1.20</item>
                 </item>
-            </array>
-        </param>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Install\Model\Installer\Db\AbstractDb">
-        <param name="dbExtensions">
-            <array>
-                <item key="mysql4">
-                    <array>
-                        <item key="pdo"><value>pdo_mysql</value></item>
-                    </array>
+        <arguments>
+            <argument name="dbExtensions" xsi:type="array">
+                <item name="mysql4" xsi:type="array">
+                    <item name="pdo" xsi:type="string">pdo_mysql</item>
                 </item>
-            </array>
-        </param>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Install\Model\Config\Reader">
-        <param name="fileName">
-            <value>install_wizard.xml</value>
-        </param>
-        <param name="converter">
-            <instance type="Magento\Install\Model\Config\Converter" />
-        </param>
-        <param name="schemaLocator">
-            <instance type="Magento\Install\Model\Config\SchemaLocator" />
-        </param>
+        <arguments>
+            <argument name="fileName" xsi:type="string">install_wizard.xml</argument>
+            <argument name="converter" xsi:type="object">Magento\Install\Model\Config\Converter</argument>
+            <argument name="schemaLocator" xsi:type="object">Magento\Install\Model\Config\SchemaLocator</argument>
+        </arguments>
     </type>
     <type name="Magento\Install\Model\Config\Data">
-        <param name='reader'>
-            <instance type="Magento\Install\Model\Config\Reader" />
-        </param>
-        <param name="cacheId">
-            <value>install_wizard_config</value>
-        </param>
+        <arguments>
+            <argument name="reader" xsi:type="object">Magento\Install\Model\Config\Reader</argument>
+            <argument name="cacheId" xsi:type="string">install_wizard_config</argument>
+        </arguments>
     </type>
     <type name="Magento\Install\Block\AbstractBlock">
-        <param name='session'>
-            <instance type="Magento\Install\Model\Session" />
-        </param>
+        <arguments>
+            <argument name="session" xsi:type="object">Magento\Install\Model\Session</argument>
+        </arguments>
     </type>
     <type name="Magento\Install\Block\Config">
-        <param name='session'>
-            <instance type="Magento\Install\Model\Session" />
-        </param>
+        <arguments>
+            <argument name="session" xsi:type="object">Magento\Install\Model\Session</argument>
+        </arguments>
     </type>
     <type name="Magento\Install\Block\Locale">
-        <param name='session'>
-            <instance type="Magento\Install\Model\Session" />
-        </param>
+        <arguments>
+            <argument name="session" xsi:type="object">Magento\Install\Model\Session</argument>
+        </arguments>
     </type>
     <type name="Magento\Install\Block\Db\Main">
-        <param name='session'>
-            <instance type="Magento\Install\Model\Session" />
-        </param>
+        <arguments>
+            <argument name="session" xsi:type="object">Magento\Install\Model\Session</argument>
+        </arguments>
     </type>
     <type name="Magento\Install\Block\Db\Type">
-        <param name='session'>
-            <instance type="Magento\Install\Model\Session" />
-        </param>
+        <arguments>
+            <argument name="session" xsi:type="object">Magento\Install\Model\Session</argument>
+        </arguments>
     </type>
     <type name="Magento\Install\Controller\Wizard">
-        <param name='session'>
-            <instance type="Magento\Install\Model\Session" />
-        </param>
+        <arguments>
+            <argument name="session" xsi:type="object">Magento\Install\Model\Session</argument>
+        </arguments>
     </type>
     <type name="Magento\Install\Model\Installer">
-        <param name='session'>
-            <instance type="Magento\Install\Model\Session" />
-        </param>
+        <arguments>
+            <argument name="session" xsi:type="object">Magento\Install\Model\Session</argument>
+        </arguments>
     </type>
     <type name="Magento\Install\Model\Observer">
-        <param name='session'>
-            <instance type="Magento\Install\Model\Session" />
-        </param>
+        <arguments>
+            <argument name="session" xsi:type="object">Magento\Install\Model\Session</argument>
+        </arguments>
     </type>
     <type name="Magento\Install\Model\Installer\AbstractInstaller">
-        <param name="installer">
-            <instance type="Magento\Install\Model\Installer\Proxy" />
-        </param>
+        <arguments>
+            <argument name="installer" xsi:type="object">Magento\Install\Model\Installer\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\App\AreaList">
-        <param name="areas">
-            <array>
-                <item key="install">
-                    <array>
-                        <item key="frontName"><value>install</value></item>
-                        <item key="router"><value>install</value></item>
-                    </array>
+        <arguments>
+            <argument name="areas" xsi:type="array">
+                <item name="install" xsi:type="array">
+                    <item name="frontName" xsi:type="string">install</item>
+                    <item name="router" xsi:type="string">install</item>
                 </item>
-            </array>
-        </param>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Backend\Model\Url\ScopeResolver" shared="false">
-        <param name="areaCode">
-            <value>adminhtml</value>
-        </param>
+        <arguments>
+            <argument name="areaCode" xsi:type="string">adminhtml</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Install/etc/frontend/di.xml b/app/code/Magento/Install/etc/frontend/di.xml
index 08ed9dee82e..ac8b2ce22d6 100644
--- a/app/code/Magento/Install/etc/frontend/di.xml
+++ b/app/code/Magento/Install/etc/frontend/di.xml
@@ -23,22 +23,22 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Core\Model\Url\SecurityInfo">
-        <param name="secureUrlList">
-            <array>
-                <item key="install"><value>/install/wizard/checkSecureHost</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="secureUrlList" xsi:type="array">
+                <item name="install" xsi:type="string">/install/wizard/checkSecureHost</item>
+            </argument>
+        </arguments>
     </type>
     <virtualType name="Magento\Install\Model\Session\Storage" type="Magento\Session\Storage">
-        <param name="namespace">
-            <value>install</value>
-        </param>
+        <arguments>
+            <argument name="namespace" xsi:type="string">install</argument>
+        </arguments>
     </virtualType>
     <type name="Magento\Install\Model\Session">
-        <param name="storage">
-            <instance type="Magento\Install\Model\Session\Storage" />
-        </param>
+        <arguments>
+            <argument name="storage" xsi:type="object">Magento\Install\Model\Session\Storage</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Install/etc/install/di.xml b/app/code/Magento/Install/etc/install/di.xml
index fdd72048ef3..5b85715138c 100644
--- a/app/code/Magento/Install/etc/install/di.xml
+++ b/app/code/Magento/Install/etc/install/di.xml
@@ -23,20 +23,18 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <preference for="Magento\Core\Model\Theme" type="Magento\Core\Model\Theme\Data" />
     <type name="Magento\App\RouterList" shared="true">
-        <param name="routerList">
-            <array>
-                <item key="install">
-                    <array>
-                        <item key="instance"><value>Magento\Core\App\Router\Base</value></item>
-                        <item key="disable"><value type="bool">false</value></item>
-                        <item key="sortOrder"><value>20</value></item>
-                    </array>
+        <arguments>
+            <argument name="routerList" xsi:type="array">
+                <item name="install" xsi:type="array">
+                    <item name="instance" xsi:type="string">Magento\Core\App\Router\Base</item>
+                    <item name="disable" xsi:type="boolean">false</item>
+                    <item name="sortOrder" xsi:type="string">20</item>
                 </item>
-            </array>
-        </param>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Install\Controller\Action">
         <plugin name="installInitializer" disabled="true" />
diff --git a/app/code/Magento/Integration/Block/Adminhtml/Integration.php b/app/code/Magento/Integration/Block/Adminhtml/Integration.php
index 5be5af6b502..97b339e0aa9 100644
--- a/app/code/Magento/Integration/Block/Adminhtml/Integration.php
+++ b/app/code/Magento/Integration/Block/Adminhtml/Integration.php
@@ -30,6 +30,8 @@ class Integration extends \Magento\Backend\Block\Widget\Grid\Container
 {
     /**
      * Define actions available on the integrations grid page.
+     *
+     * @return void
      */
     protected function _construct()
     {
diff --git a/app/code/Magento/Integration/Block/Adminhtml/Integration/Activate/Permissions/Tabs.php b/app/code/Magento/Integration/Block/Adminhtml/Integration/Activate/Permissions/Tabs.php
index e8c47b63f0c..4a5412e97a6 100644
--- a/app/code/Magento/Integration/Block/Adminhtml/Integration/Activate/Permissions/Tabs.php
+++ b/app/code/Magento/Integration/Block/Adminhtml/Integration/Activate/Permissions/Tabs.php
@@ -29,8 +29,14 @@ use Magento\Backend\Block\Widget\Tabs as TabsWidget;
 
 class Tabs extends TabsWidget
 {
+    /**
+     * @var string
+     */
     protected $_template = 'Magento_Backend::widget/tabshoriz.phtml';
 
+    /**
+     * @return void
+     */
     protected function _construct()
     {
         parent::_construct();
diff --git a/app/code/Magento/Integration/Block/Adminhtml/Integration/Edit.php b/app/code/Magento/Integration/Block/Adminhtml/Integration/Edit.php
index 5572482fda7..b0382acaa5d 100644
--- a/app/code/Magento/Integration/Block/Adminhtml/Integration/Edit.php
+++ b/app/code/Magento/Integration/Block/Adminhtml/Integration/Edit.php
@@ -23,7 +23,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Integration\Block\Adminhtml\Integration;
 
 use Magento\Integration\Block\Adminhtml\Integration\Edit\Tab\Info;
@@ -63,6 +62,7 @@ class Edit extends \Magento\Backend\Block\Widget\Form\Container
     /**
      * Initialize Integration edit page
      *
+     * @return void
      */
     protected function _construct()
     {
diff --git a/app/code/Magento/Integration/Block/Adminhtml/Integration/Edit/Form.php b/app/code/Magento/Integration/Block/Adminhtml/Integration/Edit/Form.php
index 11b5b49b041..f02e362e0b5 100644
--- a/app/code/Magento/Integration/Block/Adminhtml/Integration/Edit/Form.php
+++ b/app/code/Magento/Integration/Block/Adminhtml/Integration/Edit/Form.php
@@ -23,7 +23,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Integration\Block\Adminhtml\Integration\Edit;
 
 use Magento\Integration\Block\Adminhtml\Integration\Edit\Tab\Info;
@@ -37,7 +36,7 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic
     /**
      * Prepare form before rendering HTML
      *
-     * @return \Magento\Backend\Block\Widget\Form
+     * @return $this
      */
     protected function _prepareForm()
     {
diff --git a/app/code/Magento/Integration/Block/Adminhtml/Integration/Edit/Tab/Info.php b/app/code/Magento/Integration/Block/Adminhtml/Integration/Edit/Tab/Info.php
index 983e6189a30..1bb290265b9 100644
--- a/app/code/Magento/Integration/Block/Adminhtml/Integration/Edit/Tab/Info.php
+++ b/app/code/Magento/Integration/Block/Adminhtml/Integration/Edit/Tab/Info.php
@@ -23,7 +23,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Integration\Block\Adminhtml\Integration\Edit\Tab;
 
 use Magento\Integration\Controller\Adminhtml\Integration;
@@ -54,7 +53,7 @@ class Info extends \Magento\Backend\Block\Widget\Form\Generic
     /**
      * Set form id prefix, declare fields for integration info
      *
-     * @return \Magento\Integration\Block\Adminhtml\Integration\Edit\Tab\Info
+     * @return $this
      */
     protected function _prepareForm()
     {
@@ -114,6 +113,7 @@ class Info extends \Magento\Backend\Block\Widget\Form\Generic
      *
      * @param \Magento\Data\Form $form
      * @param array $integrationData
+     * @return void
      */
     protected function _addGeneralFieldset($form, $integrationData)
     {
@@ -183,6 +183,7 @@ class Info extends \Magento\Backend\Block\Widget\Form\Generic
      *
      * @param \Magento\Data\Form $form
      * @param array $integrationData
+     * @return void
      */
     protected function _addDetailsFieldset($form, $integrationData)
     {
diff --git a/app/code/Magento/Integration/Block/Adminhtml/Integration/Edit/Tabs.php b/app/code/Magento/Integration/Block/Adminhtml/Integration/Edit/Tabs.php
index 36cb4da946f..35d93a5e6d4 100644
--- a/app/code/Magento/Integration/Block/Adminhtml/Integration/Edit/Tabs.php
+++ b/app/code/Magento/Integration/Block/Adminhtml/Integration/Edit/Tabs.php
@@ -23,7 +23,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Integration\Block\Adminhtml\Integration\Edit;
 
 class Tabs extends \Magento\Backend\Block\Widget\Tabs
@@ -31,6 +30,7 @@ class Tabs extends \Magento\Backend\Block\Widget\Tabs
     /**
      * Initialize integration edit page tabs
      *
+     * @return void
      */
     protected function _construct()
     {
diff --git a/app/code/Magento/Integration/Block/Adminhtml/Integration/Tokens.php b/app/code/Magento/Integration/Block/Adminhtml/Integration/Tokens.php
index ee6acec1dec..7b8ab03f1c8 100644
--- a/app/code/Magento/Integration/Block/Adminhtml/Integration/Tokens.php
+++ b/app/code/Magento/Integration/Block/Adminhtml/Integration/Tokens.php
@@ -21,7 +21,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Integration\Block\Adminhtml\Integration;
 
 use \Magento\Integration\Controller\Adminhtml\Integration as IntegrationController;
@@ -45,7 +44,7 @@ class Tokens extends \Magento\Backend\Block\Widget\Form\Generic
     /**
      * Set form id prefix, declare fields for integration consumer modal
      *
-     * @return \Magento\Backend\Block\Widget\Form
+     * @return $this
      */
     protected function _prepareForm()
     {
diff --git a/app/code/Magento/Integration/Block/Adminhtml/Widget/Grid/Column/Renderer/Button.php b/app/code/Magento/Integration/Block/Adminhtml/Widget/Grid/Column/Renderer/Button.php
index 0c7b3523e3c..f35a0491742 100644
--- a/app/code/Magento/Integration/Block/Adminhtml/Widget/Grid/Column/Renderer/Button.php
+++ b/app/code/Magento/Integration/Block/Adminhtml/Widget/Grid/Column/Renderer/Button.php
@@ -21,7 +21,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Integration\Block\Adminhtml\Widget\Grid\Column\Renderer;
 
 use Magento\Backend\Block\Widget\Grid\Column\Renderer\AbstractRenderer;
@@ -36,7 +35,7 @@ use Magento\Object;
 class Button extends AbstractRenderer
 {
     /**
-     * {@inheritDoc}
+     * {@inheritdoc}
      */
     public function render(Object $row)
     {
diff --git a/app/code/Magento/Integration/Block/Adminhtml/Widget/Grid/Column/Renderer/Button/Delete.php b/app/code/Magento/Integration/Block/Adminhtml/Widget/Grid/Column/Renderer/Button/Delete.php
index 9896fc326c4..859f259ec53 100644
--- a/app/code/Magento/Integration/Block/Adminhtml/Widget/Grid/Column/Renderer/Button/Delete.php
+++ b/app/code/Magento/Integration/Block/Adminhtml/Widget/Grid/Column/Renderer/Button/Delete.php
@@ -23,7 +23,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Integration\Block\Adminhtml\Widget\Grid\Column\Renderer\Button;
 
 use Magento\Integration\Block\Adminhtml\Widget\Grid\Column\Renderer\Button;
diff --git a/app/code/Magento/Integration/Block/Adminhtml/Widget/Grid/Column/Renderer/Button/Edit.php b/app/code/Magento/Integration/Block/Adminhtml/Widget/Grid/Column/Renderer/Button/Edit.php
index 254c12603e3..63bd02d88eb 100644
--- a/app/code/Magento/Integration/Block/Adminhtml/Widget/Grid/Column/Renderer/Button/Edit.php
+++ b/app/code/Magento/Integration/Block/Adminhtml/Widget/Grid/Column/Renderer/Button/Edit.php
@@ -23,7 +23,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Integration\Block\Adminhtml\Widget\Grid\Column\Renderer\Button;
 
 use Magento\Object;
diff --git a/app/code/Magento/Integration/Block/Adminhtml/Widget/Grid/Column/Renderer/Link.php b/app/code/Magento/Integration/Block/Adminhtml/Widget/Grid/Column/Renderer/Link.php
index d2d83a89eff..484627d7d63 100644
--- a/app/code/Magento/Integration/Block/Adminhtml/Widget/Grid/Column/Renderer/Link.php
+++ b/app/code/Magento/Integration/Block/Adminhtml/Widget/Grid/Column/Renderer/Link.php
@@ -23,7 +23,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Integration\Block\Adminhtml\Widget\Grid\Column\Renderer;
 
 use Magento\Backend\Block\Widget\Grid\Column\Renderer\AbstractRenderer;
diff --git a/app/code/Magento/Integration/Block/Adminhtml/Widget/Grid/Column/Renderer/Link/Activate.php b/app/code/Magento/Integration/Block/Adminhtml/Widget/Grid/Column/Renderer/Link/Activate.php
index 78f5acf2586..b0126f467be 100644
--- a/app/code/Magento/Integration/Block/Adminhtml/Widget/Grid/Column/Renderer/Link/Activate.php
+++ b/app/code/Magento/Integration/Block/Adminhtml/Widget/Grid/Column/Renderer/Link/Activate.php
@@ -23,7 +23,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Integration\Block\Adminhtml\Widget\Grid\Column\Renderer\Link;
 
 use Magento\Integration\Model\Integration;
diff --git a/app/code/Magento/Integration/Controller/Adminhtml/Integration.php b/app/code/Magento/Integration/Controller/Adminhtml/Integration.php
index bafd4426caa..e394cb01c39 100644
--- a/app/code/Magento/Integration/Controller/Adminhtml/Integration.php
+++ b/app/code/Magento/Integration/Controller/Adminhtml/Integration.php
@@ -103,6 +103,8 @@ class Integration extends Action
 
     /**
      * Integrations grid.
+     *
+     * @return void
      */
     public function indexAction()
     {
@@ -115,6 +117,8 @@ class Integration extends Action
 
     /**
      * AJAX integrations grid.
+     *
+     * @return void
      */
     public function gridAction()
     {
@@ -134,6 +138,8 @@ class Integration extends Action
 
     /**
      * New integration action.
+     *
+     * @return void
      */
     public function newAction()
     {
@@ -152,6 +158,8 @@ class Integration extends Action
 
     /**
      * Edit integration action.
+     *
+     * @return void
      */
     public function editAction()
     {
@@ -199,7 +207,8 @@ class Integration extends Action
     /**
      * Save integration action.
      *
-     * TODO: Fix cyclomatic complexity.
+     * @return void
+     * @todo: Fix cyclomatic complexity.
      * @SuppressWarnings(PHPMD.CyclomaticComplexity)
      */
     public function saveAction()
@@ -271,6 +280,8 @@ class Integration extends Action
 
     /**
      * Show permissions popup.
+     *
+     * @return void
      */
     public function permissionsDialogAction()
     {
@@ -310,6 +321,8 @@ class Integration extends Action
 
     /**
      * Delete the integration.
+     *
+     * @return void
      */
     public function deleteAction()
     {
@@ -353,6 +366,8 @@ class Integration extends Action
 
     /**
      * Show tokens popup for simple tokens
+     *
+     * @return void
      */
     public function tokensDialogAction()
     {
@@ -386,6 +401,8 @@ class Integration extends Action
 
     /**
      * Post consumer credentials for Oauth integration.
+     *
+     * @return void
      */
     public function tokensExchangeAction()
     {
@@ -427,6 +444,8 @@ class Integration extends Action
 
     /**
      * Close window after callback has succeeded
+     *
+     * @return void
      */
     public function loginSuccessCallbackAction()
     {
@@ -435,6 +454,8 @@ class Integration extends Action
 
     /**
      * Redirect merchant to 'Edit integration' or 'New integration' if error happened during integration save.
+     *
+     * @return void
      */
     protected function _redirectOnSaveError()
     {
@@ -470,6 +491,7 @@ class Integration extends Action
      *
      * @param boolean $isReauthorize Is a re-authorization flow
      * @param string $integrationName Integration name
+     * @return void
      */
     protected function _setActivationSuccessMsg($isReauthorize, $integrationName)
     {
@@ -483,6 +505,7 @@ class Integration extends Action
      *
      * @param bool   $isReauthorize
      * @param string $integrationName
+     * @return void
      */
     protected function _setActivationFailedMsg($isReauthorize, $integrationName)
     {
@@ -496,6 +519,7 @@ class Integration extends Action
      *
      * @param bool   $isReauthorize
      * @param string $integrationName
+     * @return void
      */
     protected function _setActivationInProcessMsg($isReauthorize, $integrationName)
     {
diff --git a/app/code/Magento/Integration/Controller/Token.php b/app/code/Magento/Integration/Controller/Token.php
index d4e94a287f6..cbf7c610e0b 100644
--- a/app/code/Magento/Integration/Controller/Token.php
+++ b/app/code/Magento/Integration/Controller/Token.php
@@ -21,7 +21,6 @@
  * @copyright  Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Integration\Controller;
 
 use Magento\Integration\Service\OauthV1Interface as IntegrationOauthService;
@@ -68,6 +67,8 @@ class Token extends \Magento\App\Action\Action
 
     /**
      *  Initiate RequestToken request operation
+     *
+     * @return void
      */
     public function requestAction()
     {
@@ -89,6 +90,8 @@ class Token extends \Magento\App\Action\Action
 
     /**
      * Initiate AccessToken request operation
+     *
+     * @return void
      */
     public function accessAction()
     {
diff --git a/app/code/Magento/Integration/Helper/Data.php b/app/code/Magento/Integration/Helper/Data.php
index 57cd3360350..ef0d6ca369b 100644
--- a/app/code/Magento/Integration/Helper/Data.php
+++ b/app/code/Magento/Integration/Helper/Data.php
@@ -21,7 +21,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Integration\Helper;
 
 use Magento\Integration\Model\Integration as IntegrationModel;
@@ -54,7 +53,7 @@ class Data extends \Magento\App\Helper\AbstractHelper
     /**
      * Check if integration is created using config file
      *
-     * @param $integrationData
+     * @param array $integrationData
      * @return bool true if integration is created using Config file
      */
     public function isConfigType($integrationData)
diff --git a/app/code/Magento/Integration/Helper/Oauth/Data.php b/app/code/Magento/Integration/Helper/Oauth/Data.php
index d8e5874f063..ad06d845de9 100644
--- a/app/code/Magento/Integration/Helper/Oauth/Data.php
+++ b/app/code/Magento/Integration/Helper/Oauth/Data.php
@@ -21,12 +21,11 @@
  * @copyright  Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Integration\Helper\Oauth;
 
 /**
  * OAuth View Helper for Controllers
  */
-namespace Magento\Integration\Helper\Oauth;
-
 class Data
 {
     /** @var \Magento\Core\Model\Store\Config */
diff --git a/app/code/Magento/Integration/Model/Cache/Type.php b/app/code/Magento/Integration/Model/Cache/Type.php
index b4041869e4f..d4711826353 100644
--- a/app/code/Magento/Integration/Model/Cache/Type.php
+++ b/app/code/Magento/Integration/Model/Cache/Type.php
@@ -23,12 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Integration\Model\Cache;
 
 /**
  * System / Cache Management / Cache type "Integration Configuration"
  */
-namespace Magento\Integration\Model\Cache;
-
 class Type extends \Magento\Cache\Frontend\Decorator\TagScope
 {
     /**
diff --git a/app/code/Magento/Integration/Model/Config.php b/app/code/Magento/Integration/Model/Config.php
index a0815b31c9e..37b2270eb28 100644
--- a/app/code/Magento/Integration/Model/Config.php
+++ b/app/code/Magento/Integration/Model/Config.php
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * Magento
  *
@@ -22,7 +21,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Integration\Model;
 
 use Magento\Integration\Model\Cache\Type;
diff --git a/app/code/Magento/Integration/Model/Integration.php b/app/code/Magento/Integration/Model/Integration.php
index 03790f3189f..9af81d5aa46 100644
--- a/app/code/Magento/Integration/Model/Integration.php
+++ b/app/code/Magento/Integration/Model/Integration.php
@@ -21,7 +21,6 @@
  * @copyright  Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Integration\Model;
 
 /**
@@ -113,7 +112,7 @@ class Integration extends \Magento\Core\Model\AbstractModel
     /**
      * Prepare data to be saved to database
      *
-     * @return Integration
+     * @return $this
      */
     protected function _beforeSave()
     {
@@ -129,7 +128,7 @@ class Integration extends \Magento\Core\Model\AbstractModel
      * Load integration by oAuth consumer ID.
      *
      * @param int $consumerId
-     * @return Integration
+     * @return $this
      */
     public function loadByConsumerId($consumerId)
     {
diff --git a/app/code/Magento/Integration/Model/Oauth/Consumer.php b/app/code/Magento/Integration/Model/Oauth/Consumer.php
index 1378f2f0820..b477341532c 100644
--- a/app/code/Magento/Integration/Model/Oauth/Consumer.php
+++ b/app/code/Magento/Integration/Model/Oauth/Consumer.php
@@ -21,7 +21,6 @@
  * @copyright  Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Integration\Model\Oauth;
 
 use Magento\Oauth\ConsumerInterface;
@@ -94,7 +93,7 @@ class Consumer extends \Magento\Core\Model\AbstractModel implements ConsumerInte
     /**
      * BeforeSave actions
      *
-     * @return Consumer
+     * @return $this
      */
     protected function _beforeSave()
     {
@@ -147,7 +146,7 @@ class Consumer extends \Magento\Core\Model\AbstractModel implements ConsumerInte
      * Load consumer data by consumer key.
      *
      * @param string $key
-     * @return Consumer
+     * @return $this
      */
     public function loadByKey($key)
     {
diff --git a/app/code/Magento/Integration/Model/Oauth/Consumer/Factory.php b/app/code/Magento/Integration/Model/Oauth/Consumer/Factory.php
index 1b318e4b0c2..7189b820293 100644
--- a/app/code/Magento/Integration/Model/Oauth/Consumer/Factory.php
+++ b/app/code/Magento/Integration/Model/Oauth/Consumer/Factory.php
@@ -23,7 +23,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Integration\Model\Oauth\Consumer;
 
 class Factory
diff --git a/app/code/Magento/Integration/Model/Oauth/Consumer/Validator/KeyLength.php b/app/code/Magento/Integration/Model/Oauth/Consumer/Validator/KeyLength.php
index 3782a2bde2d..8941f3e55a2 100644
--- a/app/code/Magento/Integration/Model/Oauth/Consumer/Validator/KeyLength.php
+++ b/app/code/Magento/Integration/Model/Oauth/Consumer/Validator/KeyLength.php
@@ -23,6 +23,7 @@
  * @copyright  Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Integration\Model\Oauth\Consumer\Validator;
 
 /**
  * Validate OAuth keys
@@ -31,8 +32,6 @@
  * @package    Magento_Oauth
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Integration\Model\Oauth\Consumer\Validator;
-
 class KeyLength extends \Zend_Validate_StringLength
 {
     /**
@@ -71,7 +70,7 @@ class KeyLength extends \Zend_Validate_StringLength
     /**
      * Init validation failure message template definitions
      *
-     * @return \Magento\Integration\Model\Oauth\Consumer\Validator\KeyLength
+     * @return $this
      */
     protected function _initMessageTemplates()
     {
@@ -97,8 +96,8 @@ class KeyLength extends \Zend_Validate_StringLength
     /**
      * Set length
      *
-     * @param $length
-     * @return \Magento\Integration\Model\Oauth\Consumer\Validator\KeyLength
+     * @param int|null $length
+     * @return $this
      */
     public function setLength($length)
     {
@@ -140,7 +139,7 @@ class KeyLength extends \Zend_Validate_StringLength
      * Set key name
      *
      * @param string $name
-     * @return \Magento\Integration\Model\Oauth\Consumer\Validator\KeyLength
+     * @return $this
      */
     public function setName($name)
     {
diff --git a/app/code/Magento/Integration/Model/Oauth/Nonce.php b/app/code/Magento/Integration/Model/Oauth/Nonce.php
index 7b03705afc5..0e2d8caf8fd 100644
--- a/app/code/Magento/Integration/Model/Oauth/Nonce.php
+++ b/app/code/Magento/Integration/Model/Oauth/Nonce.php
@@ -21,7 +21,6 @@
  * @copyright  Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Integration\Model\Oauth;
 
 /**
@@ -76,9 +75,9 @@ class Nonce extends \Magento\Core\Model\AbstractModel
     }
 
     /**
-     * "After save" actions
+     * The "After save" actions
      *
-     * @return \Magento\Integration\Model\Oauth\Nonce
+     * @return $this
      */
     protected function _afterSave()
     {
diff --git a/app/code/Magento/Integration/Model/Oauth/Nonce/Generator.php b/app/code/Magento/Integration/Model/Oauth/Nonce/Generator.php
index ada650e692a..fd2e8d823e8 100644
--- a/app/code/Magento/Integration/Model/Oauth/Nonce/Generator.php
+++ b/app/code/Magento/Integration/Model/Oauth/Nonce/Generator.php
@@ -21,7 +21,6 @@
  * @copyright  Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Integration\Model\Oauth\Nonce;
 
 use Magento\Oauth\OauthInterface;
@@ -30,16 +29,24 @@ use Magento\Oauth\NonceGeneratorInterface;
 
 class Generator implements NonceGeneratorInterface
 {
-    /** @var \Magento\Oauth\Helper\Oauth */
+    /**
+     * @var \Magento\Oauth\Helper\Oauth
+     */
     protected $_oauthHelper;
 
-    /** @var  \Magento\Integration\Model\Oauth\Nonce\Factory */
+    /**
+     * @var  \Magento\Integration\Model\Oauth\Nonce\Factory
+     */
     protected $_nonceFactory;
 
-    /** @var  int */
+    /**
+     * @var  int
+     */
     protected $_nonceLength;
 
-    /** @var \Magento\Core\Model\Date */
+    /**
+     * @var \Magento\Core\Model\Date
+     */
     protected $_date;
 
     /**
diff --git a/app/code/Magento/Integration/Model/Oauth/Token.php b/app/code/Magento/Integration/Model/Oauth/Token.php
index d6371b0309f..3f38e219c58 100644
--- a/app/code/Magento/Integration/Model/Oauth/Token.php
+++ b/app/code/Magento/Integration/Model/Oauth/Token.php
@@ -21,7 +21,6 @@
  * @copyright  Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Integration\Model\Oauth;
 
 use Magento\Oauth\Helper\Oauth as OauthHelper;
@@ -75,22 +74,34 @@ class Token extends \Magento\Core\Model\AbstractModel
     const USER_TYPE_CUSTOMER = 'customer';
     /**#@- */
 
-    /** @var OauthHelper */
+    /**
+     * @var OauthHelper
+     */
     protected $_oauthHelper;
 
-    /** @var \Magento\Integration\Helper\Oauth\Data */
+    /**
+     * @var \Magento\Integration\Helper\Oauth\Data
+     */
     protected $_oauthData;
 
-    /** @var \Magento\Integration\Model\Oauth\Consumer\Factory */
+    /**
+     * @var \Magento\Integration\Model\Oauth\Consumer\Factory
+     */
     protected $_consumerFactory;
 
-    /** @var \Magento\Url\Validator */
+    /**
+     * @var \Magento\Url\Validator
+     */
     protected $_urlValidator;
 
-    /** @var Consumer\Validator\KeyLengthFactory */
+    /**
+     * @var Consumer\Validator\KeyLengthFactory
+     */
     protected $_keyLengthFactory;
 
-    /** @var \Magento\Stdlib\DateTime */
+    /**
+     * @var \Magento\Stdlib\DateTime
+     */
     protected $_dateTime;
 
     /**
@@ -142,9 +153,9 @@ class Token extends \Magento\Core\Model\AbstractModel
     }
 
     /**
-     * "After save" actions
+     * The "After save" actions
      *
-     * @return Token
+     * @return $this
      */
     protected function _afterSave()
     {
@@ -161,7 +172,7 @@ class Token extends \Magento\Core\Model\AbstractModel
      * Generate an oauth_verifier for a consumer, if the consumer doesn't already have one.
      *
      * @param int $consumerId - The id of the consumer associated with the verifier to be generated.
-     * @return Token
+     * @return $this
      */
     public function createVerifierToken($consumerId)
     {
@@ -186,7 +197,7 @@ class Token extends \Magento\Core\Model\AbstractModel
      *
      * @param int $userId Authorization user identifier
      * @param string $userType Authorization user type
-     * @return Token
+     * @return $this
      * @throws OauthException
      */
     public function authorize($userId, $userType)
@@ -217,7 +228,7 @@ class Token extends \Magento\Core\Model\AbstractModel
     /**
      * Convert token to access type
      *
-     * @return Token
+     * @return $this
      * @throws OauthException
      */
     public function convertToAccess()
@@ -239,7 +250,7 @@ class Token extends \Magento\Core\Model\AbstractModel
      *
      * @param int $entityId Token identifier
      * @param string $callbackUrl Callback URL
-     * @return Token
+     * @return $this
      */
     public function createRequestToken($entityId, $callbackUrl)
     {
@@ -288,7 +299,7 @@ class Token extends \Magento\Core\Model\AbstractModel
     /**
      * Before save actions
      *
-     * @return \Magento\Integration\Model\Oauth\Consumer
+     * @return $this
      */
     protected function _beforeSave()
     {
@@ -304,7 +315,7 @@ class Token extends \Magento\Core\Model\AbstractModel
     /**
      * Validate data
      *
-     * @return array|bool
+     * @return bool
      * @throws OauthException Throw exception on fail validation
      */
     public function validate()
@@ -372,7 +383,7 @@ class Token extends \Magento\Core\Model\AbstractModel
      * Set the token's verifier.
      *
      * @param string $verifier
-     * @return Token
+     * @return $this
      */
     public function setVerifier($verifier)
     {
diff --git a/app/code/Magento/Integration/Model/Oauth/Token/Provider.php b/app/code/Magento/Integration/Model/Oauth/Token/Provider.php
index d55f24d6fb0..0fea2d6c0f0 100644
--- a/app/code/Magento/Integration/Model/Oauth/Token/Provider.php
+++ b/app/code/Magento/Integration/Model/Oauth/Token/Provider.php
@@ -29,16 +29,24 @@ use Magento\Oauth\TokenProviderInterface;
 
 class Provider implements TokenProviderInterface
 {
-    /** @var \Magento\Integration\Model\Oauth\Consumer\Factory */
+    /**
+     * @var \Magento\Integration\Model\Oauth\Consumer\Factory
+     */
     protected $_consumerFactory;
 
-    /** @var \Magento\Integration\Model\Oauth\Token\Factory */
+    /**
+     * @var \Magento\Integration\Model\Oauth\Token\Factory
+     */
     protected $_tokenFactory;
 
-    /** @var  \Magento\Integration\Helper\Oauth\Data */
+    /**
+     * @var  \Magento\Integration\Helper\Oauth\Data
+     */
     protected $_dataHelper;
 
-    /** @var \Magento\Core\Model\Date */
+    /**
+     * @var \Magento\Core\Model\Date
+     */
     protected $_date;
 
     /**
@@ -204,6 +212,7 @@ class Provider implements TokenProviderInterface
      *
      * @param string $oauthVerifier
      * @param string $tokenVerifier
+     * @return void
      * @throws \Magento\Oauth\Exception
      */
     protected function _validateVerifierParam($oauthVerifier, $tokenVerifier)
diff --git a/app/code/Magento/Integration/Model/Resource/Integration/Collection.php b/app/code/Magento/Integration/Model/Resource/Integration/Collection.php
index 30ac7a95fe3..fce8300e2f9 100644
--- a/app/code/Magento/Integration/Model/Resource/Integration/Collection.php
+++ b/app/code/Magento/Integration/Model/Resource/Integration/Collection.php
@@ -30,6 +30,8 @@ class Collection extends \Magento\Core\Model\Resource\Db\Collection\AbstractColl
 {
     /**
      * Resource collection initialization.
+     *
+     * @return void
      */
     protected function _construct()
     {
diff --git a/app/code/Magento/Integration/Model/Resource/Oauth/Consumer.php b/app/code/Magento/Integration/Model/Resource/Oauth/Consumer.php
index f19e671b4e6..3ea3130308d 100644
--- a/app/code/Magento/Integration/Model/Resource/Oauth/Consumer.php
+++ b/app/code/Magento/Integration/Model/Resource/Oauth/Consumer.php
@@ -21,7 +21,6 @@
  * @copyright  Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Integration\Model\Resource\Oauth;
 
 class Consumer extends \Magento\Core\Model\Resource\Db\AbstractDb
@@ -55,7 +54,7 @@ class Consumer extends \Magento\Core\Model\Resource\Db\AbstractDb
      * Set updated_at automatically before saving
      *
      * @param \Magento\Core\Model\AbstractModel $object
-     * @return \Magento\Integration\Model\Resource\Oauth\Consumer
+     * @return $this
      */
     public function _beforeSave(\Magento\Core\Model\AbstractModel $object)
     {
@@ -67,7 +66,7 @@ class Consumer extends \Magento\Core\Model\Resource\Db\AbstractDb
      * Delete all Nonce entries associated with the consumer
      *
      * @param \Magento\Core\Model\AbstractModel $object
-     * @return \Magento\Integration\Model\Resource\Oauth\Consumer
+     * @return $this
      */
     public function _afterDelete(\Magento\Core\Model\AbstractModel $object)
     {
diff --git a/app/code/Magento/Integration/Model/Resource/Oauth/Consumer/Collection.php b/app/code/Magento/Integration/Model/Resource/Oauth/Consumer/Collection.php
index c8b2cc8bacd..c1b68152867 100644
--- a/app/code/Magento/Integration/Model/Resource/Oauth/Consumer/Collection.php
+++ b/app/code/Magento/Integration/Model/Resource/Oauth/Consumer/Collection.php
@@ -23,6 +23,7 @@
  * @copyright  Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Integration\Model\Resource\Oauth\Consumer;
 
 /**
  * OAuth Application resource collection model
@@ -31,8 +32,6 @@
  * @package     Magento_Oauth
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Integration\Model\Resource\Oauth\Consumer;
-
 class Collection extends \Magento\Core\Model\Resource\Db\Collection\AbstractCollection
 {
     /**
diff --git a/app/code/Magento/Integration/Model/Resource/Oauth/Nonce.php b/app/code/Magento/Integration/Model/Resource/Oauth/Nonce.php
index b887e5d43db..0691b258002 100644
--- a/app/code/Magento/Integration/Model/Resource/Oauth/Nonce.php
+++ b/app/code/Magento/Integration/Model/Resource/Oauth/Nonce.php
@@ -23,14 +23,13 @@
  * @copyright  Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Integration\Model\Resource\Oauth;
 
 /**
  * oAuth nonce resource model
  *
  * @author Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Integration\Model\Resource\Oauth;
-
 class Nonce extends \Magento\Core\Model\Resource\Db\AbstractDb
 {
     /**
diff --git a/app/code/Magento/Integration/Model/Resource/Oauth/Nonce/Collection.php b/app/code/Magento/Integration/Model/Resource/Oauth/Nonce/Collection.php
index 9c00825a506..028c66ae051 100644
--- a/app/code/Magento/Integration/Model/Resource/Oauth/Nonce/Collection.php
+++ b/app/code/Magento/Integration/Model/Resource/Oauth/Nonce/Collection.php
@@ -23,6 +23,7 @@
  * @copyright  Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Integration\Model\Resource\Oauth\Nonce;
 
 /**
  * OAuth nonce resource collection model
@@ -31,8 +32,6 @@
  * @package     Magento_Oauth
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Integration\Model\Resource\Oauth\Nonce;
-
 class Collection extends \Magento\Core\Model\Resource\Db\Collection\AbstractCollection
 {
     /**
diff --git a/app/code/Magento/Integration/Model/Resource/Oauth/Token.php b/app/code/Magento/Integration/Model/Resource/Oauth/Token.php
index 7ab4840fad4..9278ad1d86c 100644
--- a/app/code/Magento/Integration/Model/Resource/Oauth/Token.php
+++ b/app/code/Magento/Integration/Model/Resource/Oauth/Token.php
@@ -23,13 +23,11 @@
  * @copyright  Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Integration\Model\Resource\Oauth;
 
 /**
  * OAuth token resource model
  */
-
-namespace Magento\Integration\Model\Resource\Oauth;
-
 class Token extends \Magento\Core\Model\Resource\Db\AbstractDb
 {
     /**
@@ -49,6 +47,8 @@ class Token extends \Magento\Core\Model\Resource\Db\AbstractDb
 
     /**
      * Initialize resource model
+     *
+     * @return void
      */
     protected function _construct()
     {
diff --git a/app/code/Magento/Integration/Model/Resource/Oauth/Token/Collection.php b/app/code/Magento/Integration/Model/Resource/Oauth/Token/Collection.php
index 6ff36cb0cc5..c6c35dbc934 100644
--- a/app/code/Magento/Integration/Model/Resource/Oauth/Token/Collection.php
+++ b/app/code/Magento/Integration/Model/Resource/Oauth/Token/Collection.php
@@ -23,14 +23,13 @@
  * @copyright  Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Integration\Model\Resource\Oauth\Token;
 
 /**
  * OAuth token resource collection model
  *
  * @author Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Integration\Model\Resource\Oauth\Token;
-
 class Collection extends \Magento\Core\Model\Resource\Db\Collection\AbstractCollection
 {
     /**
@@ -48,7 +47,7 @@ class Collection extends \Magento\Core\Model\Resource\Db\Collection\AbstractColl
      *
      * Method use for show applications list (token-consumer)
      *
-     * @return \Magento\Integration\Model\Resource\Oauth\Token\Collection
+     * @return $this
      */
     public function joinConsumerAsApplication()
     {
@@ -66,7 +65,7 @@ class Collection extends \Magento\Core\Model\Resource\Db\Collection\AbstractColl
      * Add filter by admin ID
      *
      * @param int $adminId
-     * @return \Magento\Integration\Model\Resource\Oauth\Token\Collection
+     * @return $this
      */
     public function addFilterByAdminId($adminId)
     {
@@ -78,7 +77,7 @@ class Collection extends \Magento\Core\Model\Resource\Db\Collection\AbstractColl
      * Add filter by customer ID
      *
      * @param int $customerId
-     * @return \Magento\Integration\Model\Resource\Oauth\Token\Collection
+     * @return $this
      */
     public function addFilterByCustomerId($customerId)
     {
@@ -90,7 +89,7 @@ class Collection extends \Magento\Core\Model\Resource\Db\Collection\AbstractColl
      * Add filter by consumer ID
      *
      * @param int $consumerId
-     * @return \Magento\Integration\Model\Resource\Oauth\Token\Collection
+     * @return $this
      */
     public function addFilterByConsumerId($consumerId)
     {
@@ -102,7 +101,7 @@ class Collection extends \Magento\Core\Model\Resource\Db\Collection\AbstractColl
      * Add filter by type
      *
      * @param string $type
-     * @return \Magento\Integration\Model\Resource\Oauth\Token\Collection
+     * @return $this
      */
     public function addFilterByType($type)
     {
@@ -114,7 +113,7 @@ class Collection extends \Magento\Core\Model\Resource\Db\Collection\AbstractColl
      * Add filter by ID
      *
      * @param array|int $tokenId
-     * @return \Magento\Integration\Model\Resource\Oauth\Token\Collection
+     * @return $this
      */
     public function addFilterById($tokenId)
     {
@@ -126,7 +125,7 @@ class Collection extends \Magento\Core\Model\Resource\Db\Collection\AbstractColl
      * Add filter by "Is Revoked" status
      *
      * @param bool|int $flag
-     * @return \Magento\Integration\Model\Resource\Oauth\Token\Collection
+     * @return $this
      */
     public function addFilterByRevoked($flag)
     {
diff --git a/app/code/Magento/Integration/Model/Resource/Setup.php b/app/code/Magento/Integration/Model/Resource/Setup.php
index 38fcdf0b1cc..4b4c2d585c1 100644
--- a/app/code/Magento/Integration/Model/Resource/Setup.php
+++ b/app/code/Magento/Integration/Model/Resource/Setup.php
@@ -21,16 +21,17 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Integration\Model\Resource;
 
+use Magento\Integration\Model\Manager;
+
 /**
  * Resource Setup Model
  */
 class Setup extends \Magento\Core\Model\Resource\Setup
 {
     /**
-     * @var  \Magento\Integration\Model\Manager
+     * @var  Manager
      */
     protected $_integrationManager;
 
@@ -38,16 +39,16 @@ class Setup extends \Magento\Core\Model\Resource\Setup
      * Construct resource Setup Model
      *
      * @param \Magento\Core\Model\Resource\Setup\Context $context
-     * @param \Magento\Integration\Model\Manager $integrationManager
      * @param string $resourceName
-     * @param $moduleName
+     * @param Manager $integrationManager
+     * @param string $moduleName
      * @param string $connectionName
      *
      */
     public function __construct(
         \Magento\Core\Model\Resource\Setup\Context $context,
         $resourceName,
-        \Magento\Integration\Model\Manager $integrationManager,
+        Manager $integrationManager,
         $moduleName = 'Magento_Integration',
         $connectionName = ''
     ) {
diff --git a/app/code/Magento/Integration/Service/IntegrationV1.php b/app/code/Magento/Integration/Service/IntegrationV1.php
index 916099b69d3..7fc3158b481 100644
--- a/app/code/Magento/Integration/Service/IntegrationV1.php
+++ b/app/code/Magento/Integration/Service/IntegrationV1.php
@@ -21,7 +21,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Integration\Service;
 
 use Magento\Integration\Model\Integration\Factory as IntegrationFactory;
@@ -35,10 +34,14 @@ use Magento\Integration\Service\OauthV1Interface as IntegrationOauthService;
  */
 class IntegrationV1 implements \Magento\Integration\Service\IntegrationV1Interface
 {
-    /** @var IntegrationFactory */
+    /**
+     * @var IntegrationFactory
+     */
     protected $_integrationFactory;
 
-    /** @var IntegrationOauthService */
+    /**
+     * @var IntegrationOauthService
+     */
     protected $_oauthService;
 
     /**
@@ -130,6 +133,7 @@ class IntegrationV1 implements \Magento\Integration\Service\IntegrationV1Interfa
      * Check if an integration exists by the name
      *
      * @param string $name
+     * @return void
      * @throws \Magento\Integration\Exception
      */
     private function _checkIntegrationByName($name)
@@ -160,6 +164,7 @@ class IntegrationV1 implements \Magento\Integration\Service\IntegrationV1Interfa
      * Add oAuth consumer key and secret.
      *
      * @param IntegrationModel $integration
+     * @return void
      */
     protected function _addOauthConsumerData(IntegrationModel $integration)
     {
@@ -174,6 +179,7 @@ class IntegrationV1 implements \Magento\Integration\Service\IntegrationV1Interfa
      * Add oAuth token and token secret.
      *
      * @param IntegrationModel $integration
+     * @return void
      */
     protected function _addOauthTokenData(IntegrationModel $integration)
     {
diff --git a/app/code/Magento/Integration/Service/IntegrationV1Interface.php b/app/code/Magento/Integration/Service/IntegrationV1Interface.php
index 87892cbcbaa..716c643d22e 100644
--- a/app/code/Magento/Integration/Service/IntegrationV1Interface.php
+++ b/app/code/Magento/Integration/Service/IntegrationV1Interface.php
@@ -79,7 +79,7 @@ interface IntegrationV1Interface
      *
      * @param int $integrationId
      * @return array Integration data
-     * @throws \Magento\Integration\Exception if the integration does not exist or cannot be deleted
+     * @throws \Magento\Integration\Exception If the integration does not exist or cannot be deleted
      */
     public function delete($integrationId);
 }
diff --git a/app/code/Magento/Integration/Service/OauthV1.php b/app/code/Magento/Integration/Service/OauthV1.php
index 8d10ed3238f..32db47c8b60 100644
--- a/app/code/Magento/Integration/Service/OauthV1.php
+++ b/app/code/Magento/Integration/Service/OauthV1.php
@@ -21,7 +21,6 @@
  * @copyright  Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Integration\Service;
 
 use Magento\Oauth\OauthInterface;
@@ -41,28 +40,44 @@ use Magento\Integration\Model\Oauth\Consumer as ConsumerModel;
  */
 class OauthV1 implements OauthV1Interface
 {
-    /** @var  \Magento\Core\Model\StoreManagerInterface */
+    /**
+     * @var  \Magento\Core\Model\StoreManagerInterface
+     */
     protected $_storeManager;
 
-    /** @var  ConsumerFactory */
+    /**
+     * @var  ConsumerFactory
+     */
     protected $_consumerFactory;
 
-    /** @var  TokenFactory */
+    /**
+     * @var  TokenFactory
+     */
     protected $_tokenFactory;
 
-    /** @var  IntegrationOauthHelper */
+    /**
+     * @var  IntegrationOauthHelper
+     */
     protected $_dataHelper;
 
-    /** @var  \Magento\HTTP\ZendClient */
+    /**
+     * @var  \Magento\HTTP\ZendClient
+     */
     protected $_httpClient;
 
-    /** @var \Magento\Logger */
+    /**
+     * @var \Magento\Logger
+     */
     protected $_logger;
 
-    /** @var OauthHelper */
+    /**
+     * @var OauthHelper
+     */
     protected $_oauthHelper;
 
-    /** @var TokenProvider */
+    /**
+     * @var TokenProvider
+     */
     protected $_tokenProvider;
 
     /**
diff --git a/app/code/Magento/Integration/Service/OauthV1Interface.php b/app/code/Magento/Integration/Service/OauthV1Interface.php
index 0d08b1fdc24..09c49f2e87b 100644
--- a/app/code/Magento/Integration/Service/OauthV1Interface.php
+++ b/app/code/Magento/Integration/Service/OauthV1Interface.php
@@ -21,7 +21,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Integration\Service;
 
 use \Magento\Integration\Model\Oauth\Token as Token;
diff --git a/app/code/Magento/Integration/etc/di.xml b/app/code/Magento/Integration/etc/di.xml
index 1a151155b43..5b2d1459a48 100644
--- a/app/code/Magento/Integration/etc/di.xml
+++ b/app/code/Magento/Integration/etc/di.xml
@@ -23,20 +23,20 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <preference for="Magento\Integration\Service\IntegrationV1Interface" type="Magento\Integration\Service\IntegrationV1" />
     <preference for="Magento\Integration\Service\OauthV1Interface" type="Magento\Integration\Service\OauthV1" />
     <preference for="Magento\Oauth\ConsumerInterface" type="Magento\Integration\Model\Oauth\Consumer"/>
     <preference for="Magento\Oauth\NonceGeneratorInterface" type="Magento\Integration\Model\Oauth\Nonce\Generator"/>
     <preference for="Magento\Oauth\TokenProviderInterface" type="Magento\Integration\Model\Oauth\Token\Provider"/>
     <type name="Magento\Integration\Model\Oauth\Nonce\Generator">
-        <param name="date">
-            <instance type="Magento\Core\Model\Date\Proxy"/>
-        </param>
+        <arguments>
+            <argument name="date" xsi:type="object">Magento\Core\Model\Date\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Integration\Model\Oauth\Token\Provider">
-        <param name="date">
-            <instance type="Magento\Core\Model\Date\Proxy"/>
-        </param>
+        <arguments>
+            <argument name="date" xsi:type="object">Magento\Core\Model\Date\Proxy</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Log/etc/di.xml b/app/code/Magento/Log/etc/di.xml
index 6fa6f57f52d..16fced0caf8 100644
--- a/app/code/Magento/Log/etc/di.xml
+++ b/app/code/Magento/Log/etc/di.xml
@@ -23,19 +23,19 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Log\Model\Shell\Command\Clean">
-        <param name="storeManager">
-            <instance type="Magento\Core\Model\StoreManager\Proxy" />
-        </param>
+        <arguments>
+            <argument name="storeManager" xsi:type="object">Magento\Core\Model\StoreManager\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Log\Model\Visitor">
-        <param name="ignoredUserAgents">
-            <array>
-                <item key="google1"><value>Googlebot/1.0 (googlebot@googlebot.com http://googlebot.com/)</value></item>
-                <item key="google2"><value>Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)</value></item>
-                <item key="google3"><value>Googlebot/2.1 (+http://www.googlebot.com/bot.html)</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="ignoredUserAgents" xsi:type="array">
+                <item name="google1" xsi:type="string">Googlebot/1.0 (googlebot@googlebot.com http://googlebot.com/)</item>
+                <item name="google2" xsi:type="string">Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)</item>
+                <item name="google3" xsi:type="string">Googlebot/2.1 (+http://www.googlebot.com/bot.html)</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Multishipping/Block/Checkout/Link.php b/app/code/Magento/Multishipping/Block/Checkout/Link.php
index 3e905e54906..69cda28dc81 100644
--- a/app/code/Magento/Multishipping/Block/Checkout/Link.php
+++ b/app/code/Magento/Multishipping/Block/Checkout/Link.php
@@ -18,45 +18,35 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Checkout
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
+namespace Magento\Multishipping\Block\Checkout;
+
 /**
  * Multishipping cart link
  */
-namespace Magento\Multishipping\Block\Checkout;
-
 class Link extends \Magento\View\Element\Template
 {
     /**
-     * Checkout data
+     * Multishipping helper
      *
-     * @var \Magento\Checkout\Helper\Data
-     */
-    protected $_checkoutData;
-
-    /**
-     * @var \Magento\Checkout\Model\Session
+     * @var \Magento\Multishipping\Helper\Data
      */
-    protected $_checkoutSession;
+    protected $helper;
 
     /**
      * @param \Magento\View\Element\Template\Context $context
-     * @param \Magento\Checkout\Helper\Data $checkoutData
-     * @param \Magento\Checkout\Model\Session $checkoutSession
+     * @param \Magento\Multishipping\Helper\Data $helper
      * @param array $data
      */
     public function __construct(
         \Magento\View\Element\Template\Context $context,
-        \Magento\Checkout\Helper\Data $checkoutData,
-        \Magento\Checkout\Model\Session $checkoutSession,
+        \Magento\Multishipping\Helper\Data $helper,
         array $data = array()
     ) {
-        $this->_checkoutData = $checkoutData;
-        $this->_checkoutSession = $checkoutSession;
+        $this->helper = $helper;
         parent::__construct($context, $data);
         $this->_isScopePrivate = true;
     }
@@ -74,7 +64,7 @@ class Link extends \Magento\View\Element\Template
      */
     public function getQuote()
     {
-        return $this->_checkoutSession->getQuote();
+        return $this->helper->getQuote();
     }
 
     /**
@@ -82,7 +72,7 @@ class Link extends \Magento\View\Element\Template
      */
     public function _toHtml()
     {
-        if (!$this->_checkoutData->isMultishippingCheckoutAvailable()) {
+        if (!$this->helper->isMultishippingCheckoutAvailable()) {
             return '';
         }
         return parent::_toHtml();
diff --git a/app/code/Magento/Multishipping/Controller/Checkout.php b/app/code/Magento/Multishipping/Controller/Checkout.php
index 9ba39980235..6272f1848a7 100644
--- a/app/code/Magento/Multishipping/Controller/Checkout.php
+++ b/app/code/Magento/Multishipping/Controller/Checkout.php
@@ -126,7 +126,7 @@ class Checkout extends \Magento\Checkout\Controller\Action
                 $this->_actionFlag->set('', self::FLAG_NO_DISPATCH, true);
             }
 
-            if (!$this->_objectManager->get('Magento\Checkout\Helper\Data')->isMultishippingCheckoutAvailable()) {
+            if (!$this->_objectManager->get('Magento\Multishipping\Helper\Data')->isMultishippingCheckoutAvailable()) {
                 $error = $this->_getCheckout()->getMinimumAmountError();
                 $this->messageManager->addError($error);
                 $this->getResponse()->setRedirect($this->_getHelper()->getCartUrl());
diff --git a/app/code/Magento/Multishipping/Helper/Data.php b/app/code/Magento/Multishipping/Helper/Data.php
new file mode 100644
index 00000000000..3c5efa0c356
--- /dev/null
+++ b/app/code/Magento/Multishipping/Helper/Data.php
@@ -0,0 +1,110 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Multishipping\Helper;
+
+/**
+ * Data helper
+ */
+class Data extends \Magento\App\Helper\AbstractHelper
+{
+    /**#@+
+     * Xml paths for multishipping checkout
+     **/
+    const XML_PATH_CHECKOUT_MULTIPLE_AVAILABLE = 'multishipping/options/checkout_multiple';
+    const XML_PATH_CHECKOUT_MULTIPLE_MAXIMUM_QUANTITY = 'multishipping/options/checkout_multiple_maximum_qty';
+    /**#@-*/
+
+    /**
+     * Core store config
+     *
+     * @var \Magento\Core\Model\Store\Config
+     */
+    protected $coreStoreConfig;
+
+    /**
+     * Checkout session
+     *
+     * @var \Magento\Checkout\Model\Session
+     */
+    protected $checkoutSession;
+
+    /**
+     * Construct
+     *
+     * @param \Magento\App\Helper\Context $context
+     * @param \Magento\Core\Model\Store\Config $coreStoreConfig
+     * @param \Magento\Checkout\Model\Session $checkoutSession
+     */
+    public function __construct(
+        \Magento\App\Helper\Context $context,
+        \Magento\Core\Model\Store\Config $coreStoreConfig,
+        \Magento\Checkout\Model\Session $checkoutSession
+    ) {
+        $this->coreStoreConfig = $coreStoreConfig;
+        $this->checkoutSession = $checkoutSession;
+        parent::__construct($context);
+    }
+
+    /**
+     * Retrieve checkout quote
+     *
+     * @return \Magento\Sales\Model\Quote
+     */
+    public function getQuote()
+    {
+        return $this->checkoutSession->getQuote();
+    }
+
+    /**
+     * Get maximum quantity allowed for shipping to multiple addresses
+     *
+     * @return int
+     */
+    public function getMaximumQty()
+    {
+        return (int)$this->coreStoreConfig->getConfig(self::XML_PATH_CHECKOUT_MULTIPLE_MAXIMUM_QUANTITY);
+    }
+
+    /**
+     * Check if multishipping checkout is available
+     * There should be a valid quote in checkout session. If not, only the config value will be returned
+     *
+     * @return bool
+     */
+    public function isMultishippingCheckoutAvailable()
+    {
+        $quote = $this->getQuote();
+        $isMultiShipping = $this->coreStoreConfig->getConfigFlag(self::XML_PATH_CHECKOUT_MULTIPLE_AVAILABLE);
+        if (!$quote || !$quote->hasItems()) {
+            return $isMultiShipping;
+        }
+        return $isMultiShipping
+            && !$quote->hasItemsWithDecimalQty()
+            && $quote->validateMinimumAmount(true)
+            && ($quote->getItemsSummaryQty() - $quote->getItemVirtualQty() > 0)
+            && ($quote->getItemsSummaryQty() <= $this->getMaximumQty())
+            && !$quote->hasNominalItems();
+    }
+}
diff --git a/app/code/Magento/Multishipping/Model/Checkout/Type/Multishipping.php b/app/code/Magento/Multishipping/Model/Checkout/Type/Multishipping.php
index 7654d157f0c..e6f33650156 100644
--- a/app/code/Magento/Multishipping/Model/Checkout/Type/Multishipping.php
+++ b/app/code/Magento/Multishipping/Model/Checkout/Type/Multishipping.php
@@ -81,6 +81,11 @@ class Multishipping extends \Magento\Checkout\Model\Type\AbstractType
      */
     protected $paymentSpecification;
 
+    /**
+     * @var \Magento\Multishipping\Helper\Data
+     */
+    protected $helper;
+
     /**
      * @param \Magento\Checkout\Model\Session $checkoutSession
      * @param \Magento\Customer\Model\Session $customerSession
@@ -92,6 +97,7 @@ class Multishipping extends \Magento\Checkout\Model\Type\AbstractType
      * @param \Magento\Sales\Model\Convert\Quote $quote
      * @param \Magento\Core\Model\StoreManagerInterface $storeManager
      * @param \Magento\Payment\Model\Method\SpecificationInterface $paymentSpecification
+     * @param \Magento\Multishipping\Helper\Data $helper
      * @param array $data
      */
     public function __construct(
@@ -105,6 +111,7 @@ class Multishipping extends \Magento\Checkout\Model\Type\AbstractType
         \Magento\Sales\Model\Convert\Quote $quote,
         \Magento\Core\Model\StoreManagerInterface $storeManager,
         \Magento\Payment\Model\Method\SpecificationInterface $paymentSpecification,
+        \Magento\Multishipping\Helper\Data $helper,
         array $data = array()
     ) {
         $this->_eventManager = $eventManager;
@@ -114,6 +121,7 @@ class Multishipping extends \Magento\Checkout\Model\Type\AbstractType
         $this->_quote = $quote;
         $this->_storeManager = $storeManager;
         $this->paymentSpecification = $paymentSpecification;
+        $this->helper = $helper;
         parent::__construct($checkoutSession, $customerSession, $orderFactory, $data);
         $this->_init();
     }
@@ -292,7 +300,7 @@ class Multishipping extends \Magento\Checkout\Model\Type\AbstractType
                 }
             }
 
-            $maxQty = (int)$this->_coreStoreConfig->getConfig('shipping/option/checkout_multiple_maximum_qty');
+            $maxQty = $this->helper->getMaximumQty();
             if ($allQty > $maxQty) {
                 throw new \Magento\Core\Exception(__('Maximum qty allowed for Shipping to multiple addresses is %1', $maxQty));
             }
diff --git a/app/code/Magento/Multishipping/etc/adminhtml/acl.xml b/app/code/Magento/Multishipping/etc/adminhtml/acl.xml
new file mode 100644
index 00000000000..e1c4ee0c5db
--- /dev/null
+++ b/app/code/Magento/Multishipping/etc/adminhtml/acl.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<config>
+    <acl>
+        <resources>
+            <resource id="Magento_Adminhtml::admin">
+                <resource id="Magento_Adminhtml::stores">
+                    <resource id="Magento_Adminhtml::stores_settings">
+                        <resource id="Magento_Adminhtml::config">
+                            <resource id="Magento_Multishipping::config_multishipping" title="Multishipping Settings Section" sortOrder="6" />
+                        </resource>
+                    </resource>
+                </resource>
+            </resource>
+        </resources>
+    </acl>
+</config>
diff --git a/app/code/Magento/Multishipping/etc/adminhtml/system.xml b/app/code/Magento/Multishipping/etc/adminhtml/system.xml
new file mode 100644
index 00000000000..5a1477ecc5c
--- /dev/null
+++ b/app/code/Magento/Multishipping/etc/adminhtml/system.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<config>
+    <system>
+        <section id="multishipping" translate="label" type="text" sortOrder="311" showInDefault="1" showInWebsite="1" showInStore="0">
+            <label>Multishipping Settings</label>
+            <tab>sales</tab>
+            <resource>Magento_Multishipping::config_multishipping</resource>
+            <group id="options" translate="label" type="text" sortOrder="2" showInDefault="1" showInWebsite="1" showInStore="0">
+                <label>Options</label>
+                <field id="checkout_multiple" translate="label" type="select" sortOrder="1" showInDefault="1" showInWebsite="1" showInStore="0">
+                    <label>Allow Shipping to Multiple Addresses</label>
+                    <source_model>Magento\Backend\Model\Config\Source\Yesno</source_model>
+                </field>
+                <field id="checkout_multiple_maximum_qty" translate="label" type="text" sortOrder="2" showInDefault="1" showInWebsite="1" showInStore="0">
+                    <label>Maximum Qty Allowed for Shipping to Multiple Addresses</label>
+                    <validate>validate-number</validate>
+                </field>
+            </group>
+        </section>
+    </system>
+</config>
diff --git a/app/code/Magento/Multishipping/etc/config.xml b/app/code/Magento/Multishipping/etc/config.xml
new file mode 100644
index 00000000000..351eb358ef6
--- /dev/null
+++ b/app/code/Magento/Multishipping/etc/config.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<config>
+    <default>
+        <multishipping>
+            <options>
+                <checkout_multiple>1</checkout_multiple>
+                <checkout_multiple_maximum_qty>100</checkout_multiple_maximum_qty>
+            </options>
+        </multishipping>
+    </default>
+</config>
diff --git a/app/code/Magento/Multishipping/etc/frontend/di.xml b/app/code/Magento/Multishipping/etc/frontend/di.xml
index 559def86f8b..5c18ed52179 100644
--- a/app/code/Magento/Multishipping/etc/frontend/di.xml
+++ b/app/code/Magento/Multishipping/etc/frontend/di.xml
@@ -23,34 +23,30 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Core\Model\Url\SecurityInfo">
-        <param name="secureUrlList">
-            <array>
-                <item key="multishipping_checkout"><value>/multishipping/checkout</value></item>
-            </array>
-        </param>
-    </type>
-    <type name="Magento\Multishipping\Model\Checkout\Type\Multishipping">
-        <param name="paymentSpecification">
-            <instance type="Magento\Payment\Model\Method\Specification\Composite" />
-        </param>
+        <arguments>
+            <argument name="secureUrlList" xsi:type="array">
+                <item name="multishipping_checkout" xsi:type="string">/multishipping/checkout</item>
+            </argument>
+        </arguments>
     </type>
+    <virtualType name="multishippingPaymentSpecification" type="Magento\Payment\Model\Method\Specification\Composite">
+        <arguments>
+            <argument name="specifications" xsi:type="array">
+                <item name="enabled" xsi:type="string">Magento\Multishipping\Model\Payment\Method\Specification\Enabled</item>
+                <item name="3dsecure" xsi:type="string">Magento\Multishipping\Model\Payment\Method\Specification\Is3DSecure</item>
+            </argument>
+        </arguments>
+    </virtualType>
     <type name="Magento\Multishipping\Block\Checkout\Billing">
-        <param name="paymentSpecification">
-            <instance type="Magento\Payment\Model\Method\Specification\Composite" />
-        </param>
+        <arguments>
+            <argument name="paymentSpecification" xsi:type="object">multishippingPaymentSpecification</argument>
+        </arguments>
     </type>
-    <type name="Magento\Payment\Model\Method\Specification\Composite">
-        <param name="specifications">
-            <array>
-                <item key="enabled">
-                    <value>Magento\Multishipping\Model\Payment\Method\Specification\Enabled</value>
-                </item>
-                <item key="3dsecure">
-                    <value>Magento\Multishipping\Model\Payment\Method\Specification\Is3DSecure</value>
-                </item>
-            </array>
-        </param>
+    <type name="Magento\Multishipping\Model\Checkout\Type\Multishipping">
+        <arguments>
+            <argument name="paymentSpecification" xsi:type="object">multishippingPaymentSpecification</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Newsletter/Block/Adminhtml/Queue/Edit/Form.php b/app/code/Magento/Newsletter/Block/Adminhtml/Queue/Edit/Form.php
index 9fc76b5c5d4..ccc52cbe309 100644
--- a/app/code/Magento/Newsletter/Block/Adminhtml/Queue/Edit/Form.php
+++ b/app/code/Magento/Newsletter/Block/Adminhtml/Queue/Edit/Form.php
@@ -25,6 +25,8 @@
  */
 namespace Magento\Newsletter\Block\Adminhtml\Queue\Edit;
 
+use Magento\Newsletter\Model\Queue;
+
 /**
  * Newsletter queue edit form
  *
@@ -82,8 +84,7 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic
      */
     protected function _prepareForm()
     {
-        /* @var $queue \Magento\Newsletter\Model\Queue */
-        $queue = $this->_queueFactory->create();
+        $queue = $this->getQueue();
 
         /** @var \Magento\Data\Form $form */
         $form = $this->_formFactory->create();
@@ -96,7 +97,7 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic
         $dateFormat = $this->_locale->getDateFormat(\Magento\Core\Model\LocaleInterface::FORMAT_TYPE_MEDIUM);
         $timeFormat = $this->_locale->getTimeFormat(\Magento\Core\Model\LocaleInterface::FORMAT_TYPE_MEDIUM);
 
-        if ($queue->getQueueStatus() == \Magento\Newsletter\Model\Queue::STATUS_NEVER) {
+        if ($queue->getQueueStatus() == Queue::STATUS_NEVER) {
             $fieldset->addField('date', 'date', array(
                 'name'      =>    'start_at',
                 'date_format' => $dateFormat,
@@ -203,7 +204,7 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic
                 'container_id'  => 'field_newsletter_styles',
                 'value'         => $queue->getTemplate()->getTemplateStyles()
             ));
-        } elseif (\Magento\Newsletter\Model\Queue::STATUS_NEVER != $queue->getQueueStatus()) {
+        } elseif (Queue::STATUS_NEVER != $queue->getQueueStatus()) {
             $fieldset->addField('text', 'textarea', array(
                 'name'      =>    'text',
                 'label'     =>    __('Message'),
@@ -244,4 +245,18 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic
         $this->setForm($form);
         return $this;
     }
+
+    /**
+     * Retrieve queue object
+     *
+     * @return Queue
+     */
+    protected function getQueue()
+    {
+        $queue = $this->_coreRegistry->registry('current_queue');
+        if (!$queue) {
+            $queue = $this->_queueFactory->create();
+        }
+        return $queue;
+    }
 }
diff --git a/app/code/Magento/Newsletter/etc/adminhtml/di.xml b/app/code/Magento/Newsletter/etc/adminhtml/di.xml
index c801e9b9d1e..d133501e47b 100644
--- a/app/code/Magento/Newsletter/etc/adminhtml/di.xml
+++ b/app/code/Magento/Newsletter/etc/adminhtml/di.xml
@@ -23,10 +23,10 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Newsletter\Model\Session">
-        <param name="sessionName">
-            <value>adminhtml</value>
-        </param>
+        <arguments>
+            <argument name="sessionName" xsi:type="string">adminhtml</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Newsletter/etc/di.xml b/app/code/Magento/Newsletter/etc/di.xml
index 59bd5710317..c63f65fd68c 100644
--- a/app/code/Magento/Newsletter/etc/di.xml
+++ b/app/code/Magento/Newsletter/etc/di.xml
@@ -23,22 +23,22 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Module\Updater\SetupFactory">
-        <param name="resourceTypes">
-            <array>
-                <item key="newsletter_setup"><value>Magento\Newsletter\Model\Resource\Setup</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="resourceTypes" xsi:type="array">
+                <item name="newsletter_setup" xsi:type="string">Magento\Newsletter\Model\Resource\Setup</item>
+            </argument>
+        </arguments>
     </type>
     <virtualType name="Magento\Newsletter\Model\Session\Storage" type="Magento\Session\Storage">
-        <param name="namespace">
-            <value>newsletter</value>
-        </param>
+        <arguments>
+            <argument name="namespace" xsi:type="string">newsletter</argument>
+        </arguments>
     </virtualType>
     <type name="Magento\Newsletter\Model\Session">
-        <param name="storage">
-            <instance type="Magento\Newsletter\Model\Session\Storage" />
-        </param>
+        <arguments>
+            <argument name="storage" xsi:type="object">Magento\Newsletter\Model\Session\Storage</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Newsletter/etc/frontend/di.xml b/app/code/Magento/Newsletter/etc/frontend/di.xml
index e008d19a030..db04f6defa0 100644
--- a/app/code/Magento/Newsletter/etc/frontend/di.xml
+++ b/app/code/Magento/Newsletter/etc/frontend/di.xml
@@ -23,17 +23,17 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Newsletter\Model\Session">
-        <param name="sessionName">
-            <value>frontend</value>
-        </param>
+        <arguments>
+            <argument name="sessionName" xsi:type="string">frontend</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\Url\SecurityInfo">
-        <param name="secureUrlList">
-            <array>
-                <item key="newsletter_manage"><value>/newsletter/manage/</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="secureUrlList" xsi:type="array">
+                <item name="newsletter_manage" xsi:type="string">/newsletter/manage/</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Ogone/Block/Form.php b/app/code/Magento/Ogone/Block/Form.php
index 0439d364e65..e091285ff4c 100644
--- a/app/code/Magento/Ogone/Block/Form.php
+++ b/app/code/Magento/Ogone/Block/Form.php
@@ -23,12 +23,12 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-
 namespace Magento\Ogone\Block;
 
 class Form extends \Magento\Payment\Block\Form\Cc
 {
+    /**
+     * @var string
+     */
     protected $_template = 'form.phtml';
-
 }
diff --git a/app/code/Magento/Ogone/Block/Info.php b/app/code/Magento/Ogone/Block/Info.php
index 99addaaaffb..e4e1be1015f 100644
--- a/app/code/Magento/Ogone/Block/Info.php
+++ b/app/code/Magento/Ogone/Block/Info.php
@@ -23,13 +23,15 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Ogone\Block;
 
 /**
- * Ogone payment iformation block
+ * Ogone payment information block
  */
-namespace Magento\Ogone\Block;
-
 class Info extends \Magento\Payment\Block\Info\Cc
 {
+    /**
+     * @var string
+     */
     protected $_template = 'info.phtml';
 }
diff --git a/app/code/Magento/Ogone/Block/Paypage.php b/app/code/Magento/Ogone/Block/Paypage.php
index a0494dd20f0..5cd2dcd6b40 100644
--- a/app/code/Magento/Ogone/Block/Paypage.php
+++ b/app/code/Magento/Ogone/Block/Paypage.php
@@ -23,11 +23,12 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-
 namespace Magento\Ogone\Block;
 
 class Paypage extends \Magento\View\Element\Template
 {
+    /**
+     * @var string
+     */
     protected $_template = 'paypage.phtml';
 }
diff --git a/app/code/Magento/Ogone/Controller/Api.php b/app/code/Magento/Ogone/Controller/Api.php
index 9a2cbcebfaf..06ce5bf7960 100644
--- a/app/code/Magento/Ogone/Controller/Api.php
+++ b/app/code/Magento/Ogone/Controller/Api.php
@@ -23,16 +23,19 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Ogone\Controller;
+
+use \Magento\Sales\Model\Order;
 
 /**
  * Ogone Api Controller
  */
-namespace Magento\Ogone\Controller;
-
 class Api extends \Magento\App\Action\Action
 {
     /**
      * Order instance
+     *
+     * @var Order
      */
     protected $_order;
 
@@ -82,9 +85,9 @@ class Api extends \Magento\App\Action\Action
     }
 
     /**
-     * Return order instance loaded by increment id'
+     * Return order instance loaded by increment id
      *
-     * @return \Magento\Sales\Model\Order
+     * @return Order
      */
     protected function _getOrder()
     {
@@ -136,7 +139,9 @@ class Api extends \Magento\App\Action\Action
     }
 
     /**
-     * Load place from layout to make POST on ogone
+     * Load place from layout to make POST on Ogone
+     *
+     * @return void
      */
     public function placeformAction()
     {
@@ -166,7 +171,9 @@ class Api extends \Magento\App\Action\Action
     }
 
     /**
-     * Display our pay page, need to ogone payment with external pay page mode
+     * Display our pay page, need to Ogone payment with external pay page mode
+     *
+     * @return void
      */
     public function paypageAction()
     {
@@ -175,8 +182,9 @@ class Api extends \Magento\App\Action\Action
     }
 
     /**
-     * Action to control postback data from ogone
+     * Action to control postback data from Ogone
      *
+     * @return null|false
      */
     public function postBackAction()
     {
@@ -189,8 +197,9 @@ class Api extends \Magento\App\Action\Action
     }
 
     /**
-     * Action to process ogone offline data
+     * Action to process Ogone offline data
      *
+     * @return null|false
      */
     public function offlineProcessAction()
     {
@@ -202,7 +211,9 @@ class Api extends \Magento\App\Action\Action
     }
 
     /**
-     * Made offline ogone data processing, depending of incoming statuses
+     * Made offline Ogone data processing, depending of incoming statuses
+     *
+     * @return void
      */
     protected function _ogoneProcess()
     {
@@ -230,10 +241,11 @@ class Api extends \Magento\App\Action\Action
     }
 
     /**
-     * when payment gateway accept the payment, it will land to here
-     * need to change order status as processed ogone
+     * When payment gateway accept the payment, it will land to here
+     * need to change order status as processed Ogone
      * update transaction id
      *
+     * @return void
      */
     public function acceptAction()
     {
@@ -246,6 +258,8 @@ class Api extends \Magento\App\Action\Action
 
     /**
      * Process success action by accept url
+     *
+     * @return void
      */
     protected function _acceptProcess()
     {
@@ -282,7 +296,9 @@ class Api extends \Magento\App\Action\Action
     }
 
     /**
-     * Process Configured Payment Action: Direct Sale, create invoce if state is Pending
+     * Process Configured Payment Action: Direct Sale, create invoice if state is Pending
+     *
+     * @return void
      */
     protected function _processDirectSale()
     {
@@ -340,6 +356,8 @@ class Api extends \Magento\App\Action\Action
     /**
      * Process Configured Payment Actions: Authorized, Default operation
      * just place order
+     *
+     * @return void
      */
     protected function _processAuthorize()
     {
@@ -374,12 +392,12 @@ class Api extends \Magento\App\Action\Action
     }
 
     /**
-     * We get some CC info from ogone, so we must save it
+     * We get some CC info from Ogone, so we must save it
      *
      * @param \Magento\Sales\Model\Order $order
      * @param array $ccInfo
      *
-     * @return \Magento\Ogone\Controller\Api
+     * @return $this
      */
     protected function _prepareCCInfo($order, $ccInfo)
     {
@@ -393,11 +411,12 @@ class Api extends \Magento\App\Action\Action
 
 
     /**
-     * the payment result is uncertain
+     * The payment result is uncertain
      * exception status can be 52 or 92
-     * need to change order status as processing ogone
+     * need to change order status as processing Ogone
      * update transaction id
      *
+     * @return void
      */
     public function exceptionAction()
     {
@@ -409,7 +428,9 @@ class Api extends \Magento\App\Action\Action
     }
 
     /**
-     * Process exception action by ogone exception url
+     * Process exception action by Ogone exception url
+     *
+     * @return void
      */
     public function _exceptionProcess()
     {
@@ -458,10 +479,11 @@ class Api extends \Magento\App\Action\Action
     }
 
     /**
-     * when payment got decline
+     * When payment got decline
      * need to change order status to cancelled
      * take the user back to shopping cart
      *
+     * @return void
      */
     public function declineAction()
     {
@@ -474,7 +496,9 @@ class Api extends \Magento\App\Action\Action
     }
 
     /**
-     * Process decline action by ogone decline url
+     * Process decline action by Ogone decline url
+     *
+     * @return void
      */
     protected function _declineProcess()
     {
@@ -485,11 +509,11 @@ class Api extends \Magento\App\Action\Action
     }
 
     /**
-     * when user cancel the payment
+     * When user cancel the payment
      * change order status to cancelled
-     * need to rediect user to shopping cart
+     * need to redirect user to shopping cart
      *
-     * @return \Magento\Ogone\Controller\Api
+     * @return void
      */
     public function cancelAction()
     {
@@ -504,7 +528,7 @@ class Api extends \Magento\App\Action\Action
     /**
      * Process cancel action by cancel url
      *
-     * @return \Magento\Ogone\Controller\Api
+     * @return $this
      */
     public function _cancelProcess()
     {
@@ -519,7 +543,7 @@ class Api extends \Magento\App\Action\Action
      *
      * @param string $status
      * @param string $comment
-     * @return \Magento\Ogone\Controller\Api
+     * @return void|$this
      */
     protected function _cancelOrder($status, $comment='')
     {
diff --git a/app/code/Magento/Ogone/Model/Api.php b/app/code/Magento/Ogone/Model/Api.php
index d54fdbcb25d..ccc601ae586 100644
--- a/app/code/Magento/Ogone/Model/Api.php
+++ b/app/code/Magento/Ogone/Model/Api.php
@@ -23,7 +23,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Ogone\Model;
 
 /**
@@ -38,13 +37,30 @@ class Api extends \Magento\Payment\Model\Method\AbstractMethod
      */
     const PAYMENT_CODE = 'ogone';
 
+    /**
+     * @var string
+     */
     protected $_code  = self::PAYMENT_CODE;
+
+    /**
+     * @var string
+     */
     protected $_formBlockType = 'Magento\Ogone\Block\Form';
+
+    /**
+     * @var string
+     */
     protected $_infoBlockType = 'Magento\Ogone\Block\Info';
-    protected $_config = null;
 
     /**
+     * @var Config|null
+     */
+    protected $_config = null;
+
+    /**#@+
      * Availability options
+     *
+     * @var bool
      */
     protected $_isGateway               = false;
     protected $_canAuthorize            = true;
@@ -54,13 +70,14 @@ class Api extends \Magento\Payment\Model\Method\AbstractMethod
     protected $_canVoid                 = false;
     protected $_canUseInternal          = false;
     protected $_canUseCheckout          = true;
+    /**#@-*/
 
-    /**
+    /**#@+
      * "OUT" hash string components, correspond to the "IN" signature in Ogone.
      * "Out" relative to Magento, "in" relative to Ogone.
      *
      * @see Ogone eCommerce Advanced Technical Integration Guide v.5.0
-     * @var array
+     * @var string[]
      */
     protected static $_outAllMap = array(
         'ACCEPTURL', 'ADDMATCH', 'ADDRMATCH',
@@ -111,13 +128,14 @@ class Api extends \Magento\Payment\Model\Method\AbstractMethod
         'WIN3DS', 'WITHROOT',
     );
     protected static $_outShortMap = array('ORDERID', 'AMOUNT', 'CURRENCY', 'PSPID', 'OPERATION',);
+    /**#@-*/
 
-    /**
+    /**#@+
      * "IN" hash string components, correspond to the "OUT" signature in Ogone.
      * "In" relative to Magento, "out" relative to Ogone.
      *
      * @see Ogone eCommerce Advanced Technical Integration Guide v.5.0
-     * @var array
+     * @var string[]
      */
     protected static $_inAllMap = array(
         'AAVADDRESS', 'AAVCHECK', 'AAVZIP', 'ACCEPTANCE', 'ALIAS', 'AMOUNT', 'BRAND', 'CARDNO', 'CCCTY', 'CN',
@@ -132,6 +150,7 @@ class Api extends \Magento\Payment\Model\Method\AbstractMethod
         'DCC_INDICATOR', 'DCC_EXCHRATE', 'DCC_EXCHRATETS', 'DCC_CONVCCY', 'DCC_CONVAMOUNT', 'DCC_VALIDHOURS',
         'DCC_EXCHRATESOURCE', 'DCC_MARGINPERCENTAGE', 'DCC_COMMPERCENTAGE',
     );
+    /**#@-*/
 
     /* Ogone template modes */
     const TEMPLATE_OGONE            = 'ogone';
@@ -145,7 +164,7 @@ class Api extends \Magento\Payment\Model\Method\AbstractMethod
     const WAITING_AUTHORIZATION     = 'waiting_authorozation';
     const PROCESSED_OGONE_STATUS    = 'processed_ogone';
 
-    /* Ogone responce statuses */
+    /* Ogone response statuses */
     const OGONE_PAYMENT_REQUESTED_STATUS    = 9;
     const OGONE_PAYMENT_PROCESSING_STATUS   = 91;
     const OGONE_AUTH_UKNKOWN_STATUS         = 52;
@@ -233,7 +252,7 @@ class Api extends \Magento\Payment\Model\Method\AbstractMethod
     }
 
     /**
-     * Return ogone config instance
+     * Return Ogone config instance
      *
      * @return \Magento\Ogone\Model\Config
      */
@@ -243,7 +262,7 @@ class Api extends \Magento\Payment\Model\Method\AbstractMethod
     }
 
     /**
-     * Flag witch prevent automatic invoice creation
+     * Flag which prevent automatic invoice creation
      *
      * @return bool
      */
@@ -253,7 +272,7 @@ class Api extends \Magento\Payment\Model\Method\AbstractMethod
     }
 
     /**
-     * Redirect url to ogone submit form
+     * Redirect url to Ogone submit form
      *
      * @return string
      */
@@ -273,9 +292,9 @@ class Api extends \Magento\Payment\Model\Method\AbstractMethod
     }
 
     /**
-     * Rrepare params array to send it to gateway page via POST
+     * Prepare params array to send it to gateway page via POST
      *
-     * @param \Magento\Sales\Model\Order
+     * @param \Magento\Sales\Model\Order $order
      * @return array
      */
     public function getFormFields($order)
@@ -342,6 +361,7 @@ class Api extends \Magento\Payment\Model\Method\AbstractMethod
      * Debug specified order fields if needed
      *
      * @param \Magento\Sales\Model\Order $order
+     * @return void
      */
     public function debugOrder(\Magento\Sales\Model\Order $order)
     {
@@ -357,7 +377,7 @@ class Api extends \Magento\Payment\Model\Method\AbstractMethod
      * @param string $passPhrase
      * @param string $direction
      * @param bool|int $mapAllParams
-     * @param string $algorithm
+     * @param null|string $algorithm
      * @return string
      * @throws \Exception
      */
@@ -411,8 +431,11 @@ class Api extends \Magento\Payment\Model\Method\AbstractMethod
     }
 
     /**
-     * to translate UTF 8 to ISO 8859-1
+     * To translate UTF 8 to ISO 8859-1
      * Ogone system is only compatible with iso-8859-1 and does not (yet) fully support the utf-8
+     *
+     * @param string $text
+     * @return string
      */
     protected function _translate($text)
     {
@@ -422,7 +445,6 @@ class Api extends \Magento\Payment\Model\Method\AbstractMethod
     /**
      * Get Ogone Payment Action value
      *
-     * @param string
      * @return string
      */
     protected function _getOgonePaymentOperation()
@@ -437,9 +459,9 @@ class Api extends \Magento\Payment\Model\Method\AbstractMethod
     }
 
     /**
-     * get formated order description
+     * Get formatted order description
      *
-     * @param \Magento\Sales\Model\Order
+     * @param \Magento\Sales\Model\Order $order
      * @return string
      */
     protected function _getOrderDescription($order)
diff --git a/app/code/Magento/Ogone/Model/Config.php b/app/code/Magento/Ogone/Model/Config.php
index d868021c72c..84a1eb5b5bc 100644
--- a/app/code/Magento/Ogone/Model/Config.php
+++ b/app/code/Magento/Ogone/Model/Config.php
@@ -23,12 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Ogone\Model;
 
 /**
  * Config model
  */
-namespace Magento\Ogone\Model;
-
 class Config extends \Magento\Payment\Model\Config
 {
     const OGONE_PAYMENT_PATH = 'payment/ogone/';
@@ -67,11 +66,11 @@ class Config extends \Magento\Payment\Model\Config
     }
 
     /**
-     * Return ogone payment config information
+     * Return Ogone payment config information
      *
      * @param string $path
-     * @param int $storeId
-     * @return Simple_Xml
+     * @param int|null $storeId
+     * @return bool|null|string
      */
     public function getConfigData($path, $storeId=null)
     {
@@ -84,7 +83,7 @@ class Config extends \Magento\Payment\Model\Config
     /**
      * Return SHA1-in crypt key from config. Setup on admin place.
      *
-     * @param int $storeId
+     * @param int|null $storeId
      * @return string
      */
     public function getShaInCode($storeId=null)
@@ -94,7 +93,7 @@ class Config extends \Magento\Payment\Model\Config
 
     /**
      * Return SHA1-out crypt key from config. Setup on admin place.
-     * @param int $storeId
+     * @param int|null $storeId
      * @return string
      */
     public function getShaOutCode($storeId=null)
@@ -103,9 +102,9 @@ class Config extends \Magento\Payment\Model\Config
     }
 
     /**
-     * Return gateway path, get from confing. Setup on admin place.
+     * Return gateway path, get from config. Setup on admin place.
      *
-     * @param int $storeId
+     * @param int|null $storeId
      * @return string
      */
     public function getGatewayPath($storeId=null)
@@ -114,9 +113,9 @@ class Config extends \Magento\Payment\Model\Config
     }
 
     /**
-     * Get PSPID, affiliation name in ogone system
+     * Get PSPID, affiliation name in Ogone system
      *
-     * @param int $storeId
+     * @param int|null $storeId
      * @return string
      */
     public function getPSPID($storeId=null)
@@ -135,7 +134,7 @@ class Config extends \Magento\Payment\Model\Config
     }
 
     /**
-     * Return url which ogone system will use as accept
+     * Return url which Ogone system will use as accept
      *
      * @return string
      */
@@ -145,7 +144,7 @@ class Config extends \Magento\Payment\Model\Config
     }
 
     /**
-     * Return url which ogone system will use as decline url
+     * Return url which Ogone system will use as decline url
      *
      * @return string
      */
@@ -165,7 +164,7 @@ class Config extends \Magento\Payment\Model\Config
     }
 
     /**
-     * Return url which ogone system will use as cancel url
+     * Return url which Ogone system will use as cancel url
      *
      * @return string
      */
@@ -175,7 +174,7 @@ class Config extends \Magento\Payment\Model\Config
     }
 
     /**
-     * Return url which ogone system will use as our magento home url on ogone success page
+     * Return url which Ogone system will use as our magento home url on Ogone success page
      *
      * @return string
      */
diff --git a/app/code/Magento/Ogone/etc/frontend/di.xml b/app/code/Magento/Ogone/etc/frontend/di.xml
index ecab48a1d10..bea33e52822 100644
--- a/app/code/Magento/Ogone/etc/frontend/di.xml
+++ b/app/code/Magento/Ogone/etc/frontend/di.xml
@@ -23,12 +23,12 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Core\Model\Url\SecurityInfo">
-        <param name="secureUrlList">
-            <array>
-                <item key="ogone_api"><value>/ogone/api</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="secureUrlList" xsi:type="array">
+                <item name="ogone_api" xsi:type="string">/ogone/api</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Payment/Block/Form.php b/app/code/Magento/Payment/Block/Form.php
index 814346bac9c..e5072b40920 100644
--- a/app/code/Magento/Payment/Block/Form.php
+++ b/app/code/Magento/Payment/Block/Form.php
@@ -23,12 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Payment\Block;
 
 /**
  * Payment method form base block
  */
-namespace Magento\Payment\Block;
-
 class Form extends \Magento\View\Element\Template
 {
     /**
diff --git a/app/code/Magento/Payment/Block/Form/Banktransfer.php b/app/code/Magento/Payment/Block/Form/Banktransfer.php
index 5b332965bf4..e12fc3ef2f2 100644
--- a/app/code/Magento/Payment/Block/Form/Banktransfer.php
+++ b/app/code/Magento/Payment/Block/Form/Banktransfer.php
@@ -23,12 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Payment\Block\Form;
 
 /**
  * Block for Bank Transfer payment method form
  */
-namespace Magento\Payment\Block\Form;
-
 class Banktransfer extends \Magento\Payment\Block\Form
 {
 
@@ -39,6 +38,11 @@ class Banktransfer extends \Magento\Payment\Block\Form
      */
     protected $_instructions;
 
+    /**
+     * Bank transfer template
+     *
+     * @var string
+     */
     protected $_template = 'form/banktransfer.phtml';
 
     /**
diff --git a/app/code/Magento/Payment/Block/Form/Cashondelivery.php b/app/code/Magento/Payment/Block/Form/Cashondelivery.php
index c2cf64fea20..fc5c20fff30 100644
--- a/app/code/Magento/Payment/Block/Form/Cashondelivery.php
+++ b/app/code/Magento/Payment/Block/Form/Cashondelivery.php
@@ -23,12 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Payment\Block\Form;
 
 /**
  * Block for Cash On Delivery payment method form
  */
-namespace Magento\Payment\Block\Form;
-
 class Cashondelivery extends \Magento\Payment\Block\Form
 {
 
@@ -39,6 +38,11 @@ class Cashondelivery extends \Magento\Payment\Block\Form
      */
     protected $_instructions;
 
+    /**
+     * Cash on delivery template
+     *
+     * @var string
+     */
     protected $_template = 'form/cashondelivery.phtml';
 
     /**
diff --git a/app/code/Magento/Payment/Block/Form/Cc.php b/app/code/Magento/Payment/Block/Form/Cc.php
index 6f84044ba72..9105bc74dd6 100644
--- a/app/code/Magento/Payment/Block/Form/Cc.php
+++ b/app/code/Magento/Payment/Block/Form/Cc.php
@@ -21,7 +21,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Payment\Block\Form;
 
 class Cc extends \Magento\Payment\Block\Form
@@ -109,13 +108,13 @@ class Cc extends \Magento\Payment\Block\Form
     /**
      * Retrieve has verification configuration
      *
-     * @return boolean
+     * @return bool
      */
     public function hasVerification()
     {
         if ($this->getMethod()) {
             $configData = $this->getMethod()->getConfigData('useccv');
-            if(is_null($configData)){
+            if (is_null($configData)) {
                 return true;
             }
             return (bool) $configData;
@@ -123,9 +122,11 @@ class Cc extends \Magento\Payment\Block\Form
         return true;
     }
 
-    /*
-    * Whether switch/solo card type available
-    */
+    /**
+     * Whether switch/solo card type available
+     *
+     * @return bool
+     */
     public function hasSsCardType()
     {
         $availableTypes = explode(',', $this->getMethod()->getConfigData('cctypes'));
@@ -136,11 +137,12 @@ class Cc extends \Magento\Payment\Block\Form
         return false;
     }
 
-    /*
-    * solo/switch card start year
-    * @return array
-    */
-     public function getSsStartYears()
+    /**
+     * Solo/switch card start year
+     *
+     * @return array
+     */
+    public function getSsStartYears()
     {
         $years = array();
         $first = date("Y");
diff --git a/app/code/Magento/Payment/Block/Form/Ccsave.php b/app/code/Magento/Payment/Block/Form/Ccsave.php
index f3693a9c717..5b2b992c6b9 100644
--- a/app/code/Magento/Payment/Block/Form/Ccsave.php
+++ b/app/code/Magento/Payment/Block/Form/Ccsave.php
@@ -23,12 +23,15 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-
 namespace Magento\Payment\Block\Form;
 
 class Ccsave extends \Magento\Payment\Block\Form\Cc
 {
 
+    /**
+     * Cc save template
+     *
+     * @var string
+     */
     protected $_template = 'Magento_Payment::form/ccsave.phtml';
 }
diff --git a/app/code/Magento/Payment/Block/Form/Checkmo.php b/app/code/Magento/Payment/Block/Form/Checkmo.php
index a067be00911..6ab9151e758 100644
--- a/app/code/Magento/Payment/Block/Form/Checkmo.php
+++ b/app/code/Magento/Payment/Block/Form/Checkmo.php
@@ -23,11 +23,14 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-
 namespace Magento\Payment\Block\Form;
 
 class Checkmo extends \Magento\Payment\Block\Form
 {
+    /**
+     * Checkmo template
+     *
+     * @var string
+     */
     protected $_template = 'Magento_Payment::form/checkmo.phtml';
 }
diff --git a/app/code/Magento/Payment/Block/Form/Container.php b/app/code/Magento/Payment/Block/Form/Container.php
index 4b688ccc3af..ae1ff93ed96 100644
--- a/app/code/Magento/Payment/Block/Form/Container.php
+++ b/app/code/Magento/Payment/Block/Form/Container.php
@@ -23,7 +23,9 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Payment\Block\Form;
 
+use Magento\Payment\Model\Method\AbstractMethod;
 /**
  * Base container block for payment methods forms
  *
@@ -33,8 +35,6 @@
  * @package    Magento_Payment
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Payment\Block\Form;
-
 class Container extends \Magento\View\Element\Template
 {
     /**
@@ -58,6 +58,8 @@ class Container extends \Magento\View\Element\Template
 
     /**
      * Prepare children blocks
+     *
+     * @return $this
      */
     protected function _prepareLayout()
     {
@@ -77,14 +79,14 @@ class Container extends \Magento\View\Element\Template
     /**
      * Check payment method model
      *
-     * @param \Magento\Payment\Model\Method\AbstractMethod $method
+     * @param AbstractMethod $method
      * @return bool
      */
     protected function _canUseMethod($method)
     {
-        return $method->isApplicableToQuote($this->getQuote(), \Magento\Payment\Model\Method\AbstractMethod::CHECK_USE_FOR_COUNTRY
-            | \Magento\Payment\Model\Method\AbstractMethod::CHECK_USE_FOR_CURRENCY
-            | \Magento\Payment\Model\Method\AbstractMethod::CHECK_ORDER_TOTAL_MIN_MAX
+        return $method->isApplicableToQuote($this->getQuote(), AbstractMethod::CHECK_USE_FOR_COUNTRY
+            | AbstractMethod::CHECK_USE_FOR_CURRENCY
+            | AbstractMethod::CHECK_ORDER_TOTAL_MIN_MAX
         );
     }
 
@@ -93,8 +95,8 @@ class Container extends \Magento\View\Element\Template
      *
      * Redeclare this method in child classes for declaring method info instance
      *
-     * @param \Magento\Payment\Model\Method\AbstractMethod $method
-     * @return bool
+     * @param AbstractMethod $method
+     * @return $this
      */
     protected function _assignMethod($method)
     {
@@ -105,9 +107,9 @@ class Container extends \Magento\View\Element\Template
     /**
      * Declare template for payment method form block
      *
-     * @param   string $method
-     * @param   string $template
-     * @return  \Magento\Payment\Block\Form\Container
+     * @param string $method
+     * @param string $template
+     * @return $this
      */
     public function setMethodFormTemplate($method='', $template='')
     {
@@ -134,7 +136,7 @@ class Container extends \Magento\View\Element\Template
             foreach ($this->_paymentHelper->getStoreMethods($store, $quote) as $method) {
                 if ($this->_canUseMethod($method) && $method->isApplicableToQuote(
                     $quote,
-                    \Magento\Payment\Model\Method\AbstractMethod::CHECK_ZERO_TOTAL
+                    AbstractMethod::CHECK_ZERO_TOTAL
                 )) {
                     $this->_assignMethod($method);
                     $methods[] = $method;
@@ -148,7 +150,7 @@ class Container extends \Magento\View\Element\Template
     /**
      * Retrieve code of current payment method
      *
-     * @return mixed
+     * @return string|false
      */
     public function getSelectedMethodCode()
     {
diff --git a/app/code/Magento/Payment/Block/Form/Purchaseorder.php b/app/code/Magento/Payment/Block/Form/Purchaseorder.php
index 62cba7f9cb5..c4ea6c98329 100644
--- a/app/code/Magento/Payment/Block/Form/Purchaseorder.php
+++ b/app/code/Magento/Payment/Block/Form/Purchaseorder.php
@@ -23,13 +23,15 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-
 namespace Magento\Payment\Block\Form;
 
 class Purchaseorder extends \Magento\Payment\Block\Form
 {
-
+    /**
+     * Purchase order template
+     *
+     * @var string
+     */
     protected $_template = 'Magento_Payment::form/purchaseorder.phtml';
 
 }
diff --git a/app/code/Magento/Payment/Block/Info.php b/app/code/Magento/Payment/Block/Info.php
index d9fa8925f4b..f063fa85749 100644
--- a/app/code/Magento/Payment/Block/Info.php
+++ b/app/code/Magento/Payment/Block/Info.php
@@ -23,12 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Payment\Block;
 
 /**
  * Base payment iformation block
  */
-namespace Magento\Payment\Block;
-
 class Info extends \Magento\View\Element\Template
 {
     /**
@@ -38,6 +37,9 @@ class Info extends \Magento\View\Element\Template
      */
     protected $_paymentSpecificInformation = null;
 
+    /**
+     * @var string
+     */
     protected $_template = 'Magento_Payment::info/default.phtml';
 
     /**
@@ -156,7 +158,7 @@ class Info extends \Magento\View\Element\Template
     /**
      * Prepare information specific to current payment method
      *
-     * @param \Magento\Object|array $transport
+     * @param null|\Magento\Object|array $transport
      * @return \Magento\Object
      */
     protected function _prepareSpecificInformation($transport = null)
diff --git a/app/code/Magento/Payment/Block/Info/AbstractContainer.php b/app/code/Magento/Payment/Block/Info/AbstractContainer.php
index 492430b1d15..9b788b301ab 100644
--- a/app/code/Magento/Payment/Block/Info/AbstractContainer.php
+++ b/app/code/Magento/Payment/Block/Info/AbstractContainer.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Payment\Block\Info;
 
 /**
  * Payment information container block
@@ -31,8 +32,6 @@
  * @package    Magento_Payment
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Payment\Block\Info;
-
 abstract class AbstractContainer extends \Magento\View\Element\Template
 {
     /**
@@ -59,7 +58,7 @@ abstract class AbstractContainer extends \Magento\View\Element\Template
     /**
      * Add payment info block to layout
      *
-     * @return \Magento\Payment\Block\Info\AbstractContainer
+     * @return $this
      */
     protected function _prepareLayout()
     {
@@ -75,7 +74,7 @@ abstract class AbstractContainer extends \Magento\View\Element\Template
     /**
      * Retrieve info block name
      *
-     * @return unknown
+     * @return string|false
      */
     protected function _getInfoBlockName()
     {
@@ -95,9 +94,9 @@ abstract class AbstractContainer extends \Magento\View\Element\Template
     /**
      * Declare info block template
      *
-     * @param   string $method
-     * @param   string $template
-     * @return  \Magento\Payment\Block\Info\AbstractContainer
+     * @param string $method
+     * @param string $template
+     * @return $this
      */
     public function setInfoTemplate($method='', $template='')
     {
diff --git a/app/code/Magento/Payment/Block/Info/Cc.php b/app/code/Magento/Payment/Block/Info/Cc.php
index 8ed20eacebb..0fad0f8685f 100644
--- a/app/code/Magento/Payment/Block/Info/Cc.php
+++ b/app/code/Magento/Payment/Block/Info/Cc.php
@@ -23,12 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Payment\Block\Info;
 
 /**
  * Credit card generic payment info
  */
-namespace Magento\Payment\Block\Info;
-
 class Cc extends \Magento\Payment\Block\Info
 {
     /**
diff --git a/app/code/Magento/Payment/Block/Info/Ccsave.php b/app/code/Magento/Payment/Block/Info/Ccsave.php
index af5ba98e5c1..bc180c2d6c0 100644
--- a/app/code/Magento/Payment/Block/Info/Ccsave.php
+++ b/app/code/Magento/Payment/Block/Info/Ccsave.php
@@ -23,7 +23,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Payment\Block\Info;
 
 class Ccsave extends \Magento\Payment\Block\Info\Cc
@@ -34,6 +33,7 @@ class Ccsave extends \Magento\Payment\Block\Info\Cc
      * Expiration date and full number will show up only in secure mode (only for admin, not in emails or pdfs)
      *
      * @param \Magento\Object|array $transport
+     * @return \Magento\Object
      */
     protected function _prepareSpecificInformation($transport = null)
     {
diff --git a/app/code/Magento/Payment/Block/Info/Checkmo.php b/app/code/Magento/Payment/Block/Info/Checkmo.php
index 8a2f9a30d51..51c4f19d32d 100644
--- a/app/code/Magento/Payment/Block/Info/Checkmo.php
+++ b/app/code/Magento/Payment/Block/Info/Checkmo.php
@@ -23,16 +23,24 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-
 namespace Magento\Payment\Block\Info;
 
 class Checkmo extends \Magento\Payment\Block\Info
 {
 
+    /**
+     * @var string
+     */
     protected $_payableTo;
+
+    /**
+     * @var string
+     */
     protected $_mailingAddress;
 
+    /**
+     * @var string
+     */
     protected $_template = 'Magento_Payment::info/checkmo.phtml';
 
     /**
@@ -64,7 +72,7 @@ class Checkmo extends \Magento\Payment\Block\Info
     /**
      * Enter description here...
      *
-     * @return \Magento\Payment\Block\Info\Checkmo
+     * @return $this
      */
     protected function _convertAdditionalData()
     {
@@ -79,6 +87,9 @@ class Checkmo extends \Magento\Payment\Block\Info
         return $this;
     }
 
+    /**
+     * @return string
+     */
     public function toPdf()
     {
         $this->setTemplate('Magento_Payment::info/pdf/checkmo.phtml');
diff --git a/app/code/Magento/Payment/Block/Info/Instructions.php b/app/code/Magento/Payment/Block/Info/Instructions.php
index 1894e78cfd0..1a2a6de3cd2 100644
--- a/app/code/Magento/Payment/Block/Info/Instructions.php
+++ b/app/code/Magento/Payment/Block/Info/Instructions.php
@@ -23,12 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Payment\Block\Info;
 
 /**
  * Block for Bank Transfer payment generic info
  */
-namespace Magento\Payment\Block\Info;
-
 class Instructions extends \Magento\Payment\Block\Info
 {
     /**
@@ -38,6 +37,9 @@ class Instructions extends \Magento\Payment\Block\Info
      */
     protected $_instructions;
 
+    /**
+     * @var string
+     */
     protected $_template = 'info/instructions.phtml';
 
     /**
diff --git a/app/code/Magento/Payment/Block/Info/Purchaseorder.php b/app/code/Magento/Payment/Block/Info/Purchaseorder.php
index 60f062e81df..9f614668c4a 100644
--- a/app/code/Magento/Payment/Block/Info/Purchaseorder.php
+++ b/app/code/Magento/Payment/Block/Info/Purchaseorder.php
@@ -23,14 +23,18 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-
 namespace Magento\Payment\Block\Info;
 
 class Purchaseorder extends \Magento\Payment\Block\Info
 {
+    /**
+     * @var string
+     */
     protected $_template = 'Magento_Payment::info/purchaseorder.phtml';
 
+    /**
+     * @return string
+     */
     public function toPdf()
     {
         $this->setTemplate('Magento_Payment::info/pdf/purchaseorder.phtml');
diff --git a/app/code/Magento/Payment/Exception.php b/app/code/Magento/Payment/Exception.php
index 0c47b734755..61cd232295b 100644
--- a/app/code/Magento/Payment/Exception.php
+++ b/app/code/Magento/Payment/Exception.php
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Payment;
 
 /**
  * Payment exception
@@ -32,18 +32,26 @@
  * @package    Magento_Payment
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Payment;
-
 class Exception extends \Exception
 {
+    /**
+     * @var int|null
+     */
     protected $_code = null;
 
+    /**
+     * @param string|null $message
+     * @param int $code
+     */
     public function __construct($message = null, $code = 0)
     {
         $this->_code = $code;
         parent::__construct($message, 0);
     }
 
+    /**
+     * @return int|null
+     */
     public function getFields()
     {
         return $this->_code;
diff --git a/app/code/Magento/Payment/Helper/Data.php b/app/code/Magento/Payment/Helper/Data.php
index 17aefd45873..752f6451b1a 100644
--- a/app/code/Magento/Payment/Helper/Data.php
+++ b/app/code/Magento/Payment/Helper/Data.php
@@ -21,12 +21,18 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Payment\Helper;
+
+use Magento\Sales\Model\Quote;
+use Magento\Core\Model\Store;
+use Magento\Payment\Model\Method\AbstractMethod;
+use Magento\Payment\Block\Form;
+use Magento\Payment\Model\Info;
+use Magento\View\Element\Template;
 
 /**
  * Payment module base helper
  */
-namespace Magento\Payment\Helper;
-
 class Data extends \Magento\App\Helper\AbstractHelper
 {
     const XML_PATH_PAYMENT_METHODS = 'payment';
@@ -38,7 +44,9 @@ class Data extends \Magento\App\Helper\AbstractHelper
      */
     protected $_coreStoreConfig;
     
-    /** @var \Magento\Payment\Model\Config  */
+    /**
+     * @var \Magento\Payment\Model\Config
+     */
     protected $_paymentConfig;
 
     /**
@@ -109,8 +117,8 @@ class Data extends \Magento\App\Helper\AbstractHelper
     /**
      * Retrieve method model object
      *
-     * @param   string $code
-     * @return  \Magento\Payment\Model\Method\AbstractMethod|false
+     * @param string $code
+     * @return AbstractMethod|false
      */
     public function getMethodInstance($code)
     {
@@ -122,11 +130,11 @@ class Data extends \Magento\App\Helper\AbstractHelper
     /**
      * Get and sort available payment methods for specified or current store
      *
-     * array structure:
+     * Array structure:
      *  $index => \Magento\Simplexml\Element
      *
-     * @param mixed $store
-     * @param \Magento\Sales\Model\Quote $quote
+     * @param null|string|bool|int|Store $store
+     * @param Quote|null $quote
      * @return array
      */
     public function getStoreMethods($store = null, $quote = null)
@@ -156,6 +164,11 @@ class Data extends \Magento\App\Helper\AbstractHelper
         return $res;
     }
 
+    /**
+     * @param $mixed $a
+     * @param $mixed $b
+     * @return int
+     */
     protected function _sortMethods($a, $b)
     {
         if (is_object($a)) {
@@ -167,10 +180,10 @@ class Data extends \Magento\App\Helper\AbstractHelper
     /**
      * Retrieve payment method form html
      *
-     * @param   \Magento\Payment\Model\Method\AbstractMethod $method
-     * @return  \Magento\Payment\Block\Form
+     * @param AbstractMethod $method
+     * @return Form
      */
-    public function getMethodFormBlock(\Magento\Payment\Model\Method\AbstractMethod $method)
+    public function getMethodFormBlock(AbstractMethod $method)
     {
         $block = false;
         $blockType = $method->getFormBlockType();
@@ -184,10 +197,10 @@ class Data extends \Magento\App\Helper\AbstractHelper
     /**
      * Retrieve payment information block
      *
-     * @param  \Magento\Payment\Model\Info $info
-     * @return \Magento\View\Element\Template
+     * @param Info $info
+     * @return Template
      */
-    public function getInfoBlock(\Magento\Payment\Model\Info $info)
+    public function getInfoBlock(Info $info)
     {
         $blockType = $info->getMethodInstance()->getInfoBlockType();
         $block = $this->_layout->createBlock($blockType);
@@ -198,12 +211,12 @@ class Data extends \Magento\App\Helper\AbstractHelper
     /**
      * Render payment information block
      *
-     * @param  \Magento\Payment\Model\Info $info
-     * @param  int $storeId
+     * @param Info $info
+     * @param int $storeId
      * @return string
      * @throws \Exception
      */
-    public function getInfoBlockHtml(\Magento\Payment\Model\Info $info, $storeId)
+    public function getInfoBlockHtml(Info $info, $storeId)
     {
         $initialEnvironmentInfo = $this->_appEmulation->startEnvironmentEmulation($storeId);
 
@@ -271,6 +284,7 @@ class Data extends \Magento\App\Helper\AbstractHelper
      * @param bool $sorted
      * @param bool $asLabelValue
      * @param bool $withGroups
+     * @param Store|null $store
      * @return array
      */
     public function getPaymentMethodList($sorted = true, $asLabelValue = false, $withGroups = false, $store = null)
@@ -324,8 +338,8 @@ class Data extends \Magento\App\Helper\AbstractHelper
     /**
      * Returns value of Zero Subtotal Checkout / Enabled
      *
-     * @param mixed $store
-     * @return boolean
+     * @param null|string|bool|int|Store $store
+     * @return bool
      */
     public function isZeroSubTotal($store = null)
     {
@@ -336,7 +350,7 @@ class Data extends \Magento\App\Helper\AbstractHelper
     /**
      * Returns value of Zero Subtotal Checkout / New Order Status
      *
-     * @param mixed $store
+     * @param null|string|bool|int|Store $store
      * @return string
      */
     public function getZeroSubTotalOrderStatus($store = null)
@@ -348,7 +362,7 @@ class Data extends \Magento\App\Helper\AbstractHelper
     /**
      * Returns value of Zero Subtotal Checkout / Automatically Invoice All Items
      *
-     * @param mixed $store
+     * @param null|string|bool|int|Store $store
      * @return string
      */
     public function getZeroSubTotalPaymentAutomaticInvoice($store = null)
diff --git a/app/code/Magento/Payment/Model/Cart.php b/app/code/Magento/Payment/Model/Cart.php
index b475dad7d4e..6b6bcfb693d 100644
--- a/app/code/Magento/Payment/Model/Cart.php
+++ b/app/code/Magento/Payment/Model/Cart.php
@@ -21,12 +21,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Payment\Model;
 
 /**
  * Provide methods for collecting cart items information of specific sales model entity
  */
-namespace Magento\Payment\Model;
-
 class Cart
 {
     /**#@+
@@ -116,6 +115,7 @@ class Cart
      * Add amount to existing tax amount
      *
      * @param float $taxAmount
+     * @return void
      */
     public function addTax($taxAmount)
     {
@@ -126,6 +126,7 @@ class Cart
      * Set tax. Old value will be overwritten
      *
      * @param float $taxAmount
+     * @return void
      */
     public function setTax($taxAmount)
     {
@@ -146,6 +147,7 @@ class Cart
      * Add amount to existing discount amount
      *
      * @param float $discountAmount
+     * @return void
      */
     public function addDiscount($discountAmount)
     {
@@ -156,6 +158,7 @@ class Cart
      * Set discount. Old value will be overwritten
      *
      * @param float $discountAmount
+     * @return void
      */
     public function setDiscount($discountAmount)
     {
@@ -176,6 +179,7 @@ class Cart
      * Add amount to existing shipping amount
      *
      * @param float $shippingAmount
+     * @return void
      */
     public function addShipping($shippingAmount)
     {
@@ -186,6 +190,7 @@ class Cart
      * Set shipping. Old value will be overwritten
      *
      * @param float $shippingAmount
+     * @return void
      */
     public function setShipping($shippingAmount)
     {
@@ -206,6 +211,7 @@ class Cart
      * Add amount to existing subtotal amount
      *
      * @param float $subtotalAmount
+     * @return void
      */
     public function addSubtotal($subtotalAmount)
     {
@@ -229,6 +235,7 @@ class Cart
      * @param int $qty
      * @param float $amount
      * @param string|null $identifier
+     * @return void
      */
     public function addCustomItem($name, $qty, $amount, $identifier = null)
     {
@@ -260,6 +267,8 @@ class Cart
 
     /**
      * Specify that shipping should be transferred as cart item
+     *
+     * @return void
      */
     public function setTransferShippingAsItem()
     {
@@ -268,6 +277,8 @@ class Cart
 
     /**
      * Specify that discount should be transferred as cart item
+     *
+     * @return void
      */
     public function setTransferDiscountAsItem()
     {
@@ -276,6 +287,8 @@ class Cart
 
     /**
      * Collect all items, discounts, taxes, shipping to cart
+     *
+     * @return void
      */
     protected function _collectItemsAndAmounts()
     {
@@ -298,6 +311,8 @@ class Cart
 
     /**
      * Import items from sales model
+     *
+     * @return void
      */
     protected function _importItemsFromSalesModel()
     {
@@ -320,6 +335,8 @@ class Cart
 
     /**
      * Calculate subtotal from custom items
+     *
+     * @return void
      */
     protected function _calculateCustomItemsSubtotal()
     {
@@ -341,6 +358,7 @@ class Cart
     /**
      * @param string $flagType
      * @param bool $value
+     * @return void
      */
     protected function _setTransferFlag($flagType, $value)
     {
@@ -351,6 +369,7 @@ class Cart
     /**
      * @param string $amountType
      * @param float $amount
+     * @return void
      */
     protected function _setAmount($amountType, $amount)
     {
@@ -360,6 +379,7 @@ class Cart
     /**
      * @param string $amountType
      * @param float $amount
+     * @return void
      */
     protected function _addAmount($amountType, $amount)
     {
@@ -370,7 +390,7 @@ class Cart
      * Get amount of specified type
      *
      * @param string $amountType
-     * @return mixed
+     * @return float
      */
     protected function _getAmount($amountType)
     {
@@ -403,6 +423,8 @@ class Cart
 
     /**
      * Set all amount types to zero
+     *
+     * @return void
      */
     protected function _resetAmounts()
     {
diff --git a/app/code/Magento/Payment/Model/Cart/SalesModel/Factory.php b/app/code/Magento/Payment/Model/Cart/SalesModel/Factory.php
index b0170f49fc1..ed272b5683a 100644
--- a/app/code/Magento/Payment/Model/Cart/SalesModel/Factory.php
+++ b/app/code/Magento/Payment/Model/Cart/SalesModel/Factory.php
@@ -21,12 +21,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Payment\Model\Cart\SalesModel;
 
 /**
  * Factory for creating payment cart sales models
  */
-namespace Magento\Payment\Model\Cart\SalesModel;
-
 class Factory
 {
     /**
diff --git a/app/code/Magento/Payment/Model/Cart/SalesModel/Order.php b/app/code/Magento/Payment/Model/Cart/SalesModel/Order.php
index b13a728ab00..77e1d8e6b27 100644
--- a/app/code/Magento/Payment/Model/Cart/SalesModel/Order.php
+++ b/app/code/Magento/Payment/Model/Cart/SalesModel/Order.php
@@ -21,11 +21,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Payment\Model\Cart\SalesModel;
 
 /**
  * Wrapper for \Magento\Sales\Model\Order sales model
  */
-namespace Magento\Payment\Model\Cart\SalesModel;
 
 class Order implements \Magento\Payment\Model\Cart\SalesModel\SalesModelInterface
 {
@@ -45,9 +45,7 @@ class Order implements \Magento\Payment\Model\Cart\SalesModel\SalesModelInterfac
     }
 
     /**
-     * Get all items from shopping sales model
-     *
-     * @return array
+     * {@inheritdoc}
      */
     public function getAllItems()
     {
@@ -67,7 +65,7 @@ class Order implements \Magento\Payment\Model\Cart\SalesModel\SalesModelInterfac
     }
 
     /**
-     * @return float|null
+     * {@inheritdoc}
      */
     public function getBaseSubtotal()
     {
@@ -75,7 +73,7 @@ class Order implements \Magento\Payment\Model\Cart\SalesModel\SalesModelInterfac
     }
 
     /**
-     * @return float|null
+     * {@inheritdoc}
      */
     public function getBaseTaxAmount()
     {
@@ -83,7 +81,7 @@ class Order implements \Magento\Payment\Model\Cart\SalesModel\SalesModelInterfac
     }
 
     /**
-     * @return float|null
+     * {@inheritdoc}
      */
     public function getBaseShippingAmount()
     {
@@ -91,7 +89,7 @@ class Order implements \Magento\Payment\Model\Cart\SalesModel\SalesModelInterfac
     }
 
     /**
-     * @return float|null
+     * {@inheritdoc}
      */
     public function getBaseDiscountAmount()
     {
@@ -99,11 +97,7 @@ class Order implements \Magento\Payment\Model\Cart\SalesModel\SalesModelInterfac
     }
 
     /**
-     * Wrapper for \Magento\Object getDataUsingMethod method
-     *
-     * @param string $key
-     * @param mixed $args
-     * @return mixed
+     * {@inheritdoc}
      */
     public function getDataUsingMethod($key, $args = null)
     {
@@ -111,9 +105,7 @@ class Order implements \Magento\Payment\Model\Cart\SalesModel\SalesModelInterfac
     }
 
     /**
-     * Return object that contains tax related fields
-     *
-     * @return \Magento\Sales\Model\Order
+     * {@inheritdoc}
      */
     public function getTaxContainer()
     {
diff --git a/app/code/Magento/Payment/Model/Cart/SalesModel/Quote.php b/app/code/Magento/Payment/Model/Cart/SalesModel/Quote.php
index a858337a66c..1ff179bad3a 100644
--- a/app/code/Magento/Payment/Model/Cart/SalesModel/Quote.php
+++ b/app/code/Magento/Payment/Model/Cart/SalesModel/Quote.php
@@ -21,12 +21,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Payment\Model\Cart\SalesModel;
 
 /**
  * Wrapper for \Magento\Sales\Model\Quote sales model
  */
-namespace Magento\Payment\Model\Cart\SalesModel;
-
 class Quote implements \Magento\Payment\Model\Cart\SalesModel\SalesModelInterface
 {
     /**
@@ -52,9 +51,7 @@ class Quote implements \Magento\Payment\Model\Cart\SalesModel\SalesModelInterfac
     }
 
     /**
-     * Get all items from shopping sales model
-     *
-     * @return array
+     * {@inheritdoc}
      */
     public function getAllItems()
     {
@@ -74,7 +71,7 @@ class Quote implements \Magento\Payment\Model\Cart\SalesModel\SalesModelInterfac
     }
 
     /**
-     * @return float|null
+     * {@inheritdoc}
      */
     public function getBaseSubtotal()
     {
@@ -82,7 +79,7 @@ class Quote implements \Magento\Payment\Model\Cart\SalesModel\SalesModelInterfac
     }
 
     /**
-     * @return float|null
+     * {@inheritdoc}
      */
     public function getBaseTaxAmount()
     {
@@ -90,7 +87,7 @@ class Quote implements \Magento\Payment\Model\Cart\SalesModel\SalesModelInterfac
     }
 
     /**
-     * @return float|null
+     * {@inheritdoc}
      */
     public function getBaseShippingAmount()
     {
@@ -98,7 +95,7 @@ class Quote implements \Magento\Payment\Model\Cart\SalesModel\SalesModelInterfac
     }
 
     /**
-     * @return float|null
+     * {@inheritdoc}
      */
     public function getBaseDiscountAmount()
     {
@@ -106,11 +103,7 @@ class Quote implements \Magento\Payment\Model\Cart\SalesModel\SalesModelInterfac
     }
 
     /**
-     * Wrapper for \Magento\Object getDataUsingMethod method
-     *
-     * @param string $key
-     * @param mixed $args
-     * @return mixed
+     * {@inheritdoc}
      */
     public function getDataUsingMethod($key, $args = null)
     {
@@ -118,9 +111,7 @@ class Quote implements \Magento\Payment\Model\Cart\SalesModel\SalesModelInterfac
     }
 
     /**
-     * Return object that contains tax related fields
-     *
-     * @return \Magento\Sales\Model\Quote\Address
+     * {@inheritdoc}
      */
     public function getTaxContainer()
     {
diff --git a/app/code/Magento/Payment/Model/Cart/SalesModel/SalesModelInterface.php b/app/code/Magento/Payment/Model/Cart/SalesModel/SalesModelInterface.php
index 32bf03bd825..b26c1cab13f 100644
--- a/app/code/Magento/Payment/Model/Cart/SalesModel/SalesModelInterface.php
+++ b/app/code/Magento/Payment/Model/Cart/SalesModel/SalesModelInterface.php
@@ -21,12 +21,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Payment\Model\Cart\SalesModel;
 
 /**
  * Wrapper interface for accessing sales model data
  */
-namespace Magento\Payment\Model\Cart\SalesModel;
-
 interface SalesModelInterface
 {
     /**
diff --git a/app/code/Magento/Payment/Model/Config.php b/app/code/Magento/Payment/Model/Config.php
index 79c43050cac..4e9ee420fbd 100644
--- a/app/code/Magento/Payment/Model/Config.php
+++ b/app/code/Magento/Payment/Model/Config.php
@@ -23,14 +23,16 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Payment\Model;
+
+use Magento\Core\Model\Store;
+use Magento\Payment\Model\Method\AbstractMethod;
 
 /**
  * Payment configuration model
  *
  * Used for retrieving configuration data by payment models
  */
-namespace Magento\Payment\Model;
-
 class Config
 {
     /**
@@ -90,8 +92,8 @@ class Config
     /**
      * Retrieve active system payments
      *
-     * @param   mixed $store
-     * @return  array
+     * @param null|string|bool|int|Store $store
+     * @return array
      */
     public function getActiveMethods($store=null)
     {
@@ -113,7 +115,7 @@ class Config
     /**
      * Retrieve all system payments
      *
-     * @param mixed $store
+     * @param null|string|bool|int|Store $store
      * @return array
      */
     public function getAllMethods($store=null)
@@ -132,8 +134,8 @@ class Config
     /**
      * @param string $code
      * @param string $config
-     * @param mixed $store
-     * @return \Magento\Payment\Model\Method\AbstractMethod
+     * @param null|string|bool|int|Store $store
+     * @return AbstractMethod
      */
     protected function _getMethod($code, $config, $store = null)
     {
@@ -149,7 +151,7 @@ class Config
             return false;
         }
 
-        /** @var \Magento\Payment\Model\Method\AbstractMethod $method */
+        /** @var AbstractMethod $method */
         $method = $this->_methodFactory->create($modelName);
         $method->setId($code)->setStore($store);
         $this->_methods[$code] = $method;
diff --git a/app/code/Magento/Payment/Model/Config/Source/Allmethods.php b/app/code/Magento/Payment/Model/Config/Source/Allmethods.php
index b45156e1861..2f2e64f815e 100644
--- a/app/code/Magento/Payment/Model/Config/Source/Allmethods.php
+++ b/app/code/Magento/Payment/Model/Config/Source/Allmethods.php
@@ -23,7 +23,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Payment\Model\Config\Source;
 
 class Allmethods implements \Magento\Core\Model\Option\ArrayInterface
@@ -44,6 +43,9 @@ class Allmethods implements \Magento\Core\Model\Option\ArrayInterface
         $this->_paymentData = $paymentData;
     }
 
+    /**
+     * {@inheritdoc}
+     */
     public function toOptionArray()
     {
         return $this->_paymentData->getPaymentMethodList(true, true, true);
diff --git a/app/code/Magento/Payment/Model/Config/Source/Allowedmethods.php b/app/code/Magento/Payment/Model/Config/Source/Allowedmethods.php
index a4ff2d9d222..4e31b0e226a 100644
--- a/app/code/Magento/Payment/Model/Config/Source/Allowedmethods.php
+++ b/app/code/Magento/Payment/Model/Config/Source/Allowedmethods.php
@@ -21,7 +21,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Payment\Model\Config\Source;
 
 class Allowedmethods
@@ -48,6 +47,11 @@ class Allowedmethods
         $this->_paymentConfig = $paymentConfig;
     }
 
+    /**
+     * Get payment methods
+     *
+     * @return array
+     */
     protected function _getPaymentMethods()
     {
         return $this->_paymentConfig->getActiveMethods();
diff --git a/app/code/Magento/Payment/Model/Config/Source/Allspecificcountries.php b/app/code/Magento/Payment/Model/Config/Source/Allspecificcountries.php
index d20fa41f3d6..5cdb1435dd9 100644
--- a/app/code/Magento/Payment/Model/Config/Source/Allspecificcountries.php
+++ b/app/code/Magento/Payment/Model/Config/Source/Allspecificcountries.php
@@ -23,12 +23,13 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-
 namespace Magento\Payment\Model\Config\Source;
 
 class Allspecificcountries implements \Magento\Core\Model\Option\ArrayInterface
 {
+    /**
+     * {@inheritdoc}
+     */
     public function toOptionArray()
     {
         return array(
diff --git a/app/code/Magento/Payment/Model/Config/Source/Cctype.php b/app/code/Magento/Payment/Model/Config/Source/Cctype.php
index 92270c0c719..b40c33ab58b 100644
--- a/app/code/Magento/Payment/Model/Config/Source/Cctype.php
+++ b/app/code/Magento/Payment/Model/Config/Source/Cctype.php
@@ -21,7 +21,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Payment\Model\Config\Source;
 
 class Cctype implements \Magento\Core\Model\Option\ArrayInterface
@@ -43,6 +42,9 @@ class Cctype implements \Magento\Core\Model\Option\ArrayInterface
         $this->_paymentConfig = $paymentConfig;
     }
 
+    /**
+     * {@inheritdoc}
+     */
     public function toOptionArray()
     {
         $options =  array();
diff --git a/app/code/Magento/Payment/Model/Info.php b/app/code/Magento/Payment/Model/Info.php
index 9550376e1a8..248b7f5122c 100644
--- a/app/code/Magento/Payment/Model/Info.php
+++ b/app/code/Magento/Payment/Model/Info.php
@@ -23,12 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Payment\Model;
 
 /**
  * Payment information model
  */
-namespace Magento\Payment\Model;
-
 class Info extends \Magento\Core\Model\AbstractModel
 {
     /**
@@ -76,9 +75,9 @@ class Info extends \Magento\Core\Model\AbstractModel
     /**
      * Retrieve data
      *
-     * @param   string $key
-     * @param   mixed $index
-     * @return  mixed
+     * @param string $key
+     * @param mixed $index
+     * @return mixed
      */
     public function getData($key = '', $index = null)
     {
@@ -121,8 +120,8 @@ class Info extends \Magento\Core\Model\AbstractModel
     /**
      * Encrypt data
      *
-     * @param   string $data
-     * @return  string
+     * @param string $data
+     * @return string
      */
     public function encrypt($data)
     {
@@ -135,8 +134,8 @@ class Info extends \Magento\Core\Model\AbstractModel
     /**
      * Decrypt data
      *
-     * @param   string $data
-     * @return  string
+     * @param string $data
+     * @return string
      */
     public function decrypt($data)
     {
@@ -153,7 +152,7 @@ class Info extends \Magento\Core\Model\AbstractModel
      *
      * @param string|array $key
      * @param mixed $value
-     * @return \Magento\Payment\Model\Info
+     * @return $this
      * @throws \Magento\Core\Exception
      */
     public function setAdditionalInformation($key, $value = null)
@@ -189,7 +188,7 @@ class Info extends \Magento\Core\Model\AbstractModel
      * Unsetter for entire additional_information value or one of its element by key
      *
      * @param string $key
-     * @return \Magento\Payment\Model\Info
+     * @return $this
      */
     public function unsAdditionalInformation($key = null)
     {
@@ -204,7 +203,7 @@ class Info extends \Magento\Core\Model\AbstractModel
     /**
      * Check whether there is additional information by specified key
      *
-     * @param $key
+     * @param mixed|null $key
      * @return bool
      */
     public function hasAdditionalInformation($key = null)
@@ -217,6 +216,8 @@ class Info extends \Magento\Core\Model\AbstractModel
 
     /**
      * Make sure _additionalInformation is an array
+     *
+     * @return void
      */
     protected function _initAdditionalInformation()
     {
diff --git a/app/code/Magento/Payment/Model/Info/Exception.php b/app/code/Magento/Payment/Model/Info/Exception.php
index fa3e33e07cc..e154f274eb6 100644
--- a/app/code/Magento/Payment/Model/Info/Exception.php
+++ b/app/code/Magento/Payment/Model/Info/Exception.php
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Payment\Model\Info;
 
 /**
  * Core Session \Exception
@@ -34,7 +34,5 @@
  * @package    Magento_Payment
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Payment\Model\Info;
-
 class Exception extends \Magento\Core\Exception
 {}
diff --git a/app/code/Magento/Payment/Model/Method/AbstractMethod.php b/app/code/Magento/Payment/Model/Method/AbstractMethod.php
index 4a94fcc70f3..b62232252eb 100644
--- a/app/code/Magento/Payment/Model/Method/AbstractMethod.php
+++ b/app/code/Magento/Payment/Model/Method/AbstractMethod.php
@@ -21,12 +21,13 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Payment\Model\Method;
+use Magento\Sales\Model\Order\Invoice;
+use Magento\Sales\Model\Order\Payment;
 
 /**
  * Payment method abstract model
  */
-namespace Magento\Payment\Model\Method;
-
 abstract class AbstractMethod extends \Magento\Object
 {
     const ACTION_ORDER             = 'order';
@@ -67,26 +68,103 @@ abstract class AbstractMethod extends \Magento\Object
      */
     protected $_infoBlockType = 'Magento\Payment\Block\Info';
 
-    /**#@+
-     * Payment Method features
+    /**
+     * Payment Method feature
      *
      * @var bool
      */
     protected $_isGateway                   = false;
+
+    /**
+     * Payment Method feature
+     *
+     * @var bool
+     */
     protected $_canOrder                    = false;
+
+    /**
+     * Payment Method feature
+     *
+     * @var bool
+     */
     protected $_canAuthorize                = false;
+
+    /**
+     * Payment Method feature
+     *
+     * @var bool
+     */
     protected $_canCapture                  = false;
+
+    /**
+     * Payment Method feature
+     *
+     * @var bool
+     */
     protected $_canCapturePartial           = false;
+
+    /**
+     * Payment Method feature
+     *
+     * @var bool
+     */
     protected $_canRefund                   = false;
+
+    /**
+     * Payment Method feature
+     *
+     * @var bool
+     */
     protected $_canRefundInvoicePartial     = false;
+
+    /**
+     * Payment Method feature
+     *
+     * @var bool
+     */
     protected $_canVoid                     = false;
+
+    /**
+     * Payment Method feature
+     *
+     * @var bool
+     */
     protected $_canUseInternal              = true;
+
+    /**
+     * Payment Method feature
+     *
+     * @var bool
+     */
     protected $_canUseCheckout              = true;
+
+    /**
+     * Payment Method feature
+     *
+     * @var bool
+     */
     protected $_isInitializeNeeded          = false;
+
+    /**
+     * Payment Method feature
+     *
+     * @var bool
+     */
     protected $_canFetchTransactionInfo     = false;
+
+    /**
+     * Payment Method feature
+     *
+     * @var bool
+     */
     protected $_canReviewPayment            = false;
+
+    /**
+     * Payment Method feature
+     *
+     * @var bool
+     */
     protected $_canManageRecurringProfiles  = true;
-    /**#@-*/
 
     /**
      * TODO: whether a captured transaction may be voided by this gateway
@@ -288,7 +366,7 @@ abstract class AbstractMethod extends \Magento\Object
     }
 
     /**
-     * flag if we need to run payment initialize while order place
+     * Flag if we need to run payment initialize while order place
      *
      * @return bool
      */
@@ -322,7 +400,7 @@ abstract class AbstractMethod extends \Magento\Object
      * Check method for processing with base currency
      *
      * @param string $currencyCode
-     * @return boolean
+     * @return bool
      */
     public function canUseForCurrency($currencyCode)
     {
@@ -392,7 +470,7 @@ abstract class AbstractMethod extends \Magento\Object
     /**
      * Validate payment method information object
      *
-     * @return \Magento\Payment\Model\Method\AbstractMethod
+     * @return $this
      * @throws \Magento\Core\Exception
      */
     public function validate()
@@ -401,7 +479,7 @@ abstract class AbstractMethod extends \Magento\Object
           * to validate payment method is allowed for billing country or not
           */
          $paymentInfo = $this->getInfoInstance();
-         if ($paymentInfo instanceof \Magento\Sales\Model\Order\Payment) {
+         if ($paymentInfo instanceof Payment) {
              $billingCountry = $paymentInfo->getOrder()->getBillingAddress()->getCountryId();
          } else {
              $billingCountry = $paymentInfo->getQuote()->getBillingAddress()->getCountryId();
@@ -420,7 +498,7 @@ abstract class AbstractMethod extends \Magento\Object
      * @param \Magento\Object $payment
      * @param float $amount
      *
-     * @return \Magento\Payment\Model\Method\AbstractMethod
+     * @return $this
      * @throws \Magento\Core\Exception
      */
     public function order(\Magento\Object $payment, $amount)
@@ -437,7 +515,7 @@ abstract class AbstractMethod extends \Magento\Object
      * @param \Magento\Object $payment
      * @param float $amount
      *
-     * @return \Magento\Payment\Model\Method\AbstractMethod
+     * @return $this
      * @throws \Magento\Core\Exception
      */
     public function authorize(\Magento\Object $payment, $amount)
@@ -454,7 +532,7 @@ abstract class AbstractMethod extends \Magento\Object
      * @param \Magento\Object $payment
      * @param float $amount
      *
-     * @return \Magento\Payment\Model\Method\AbstractMethod
+     * @return $this
      * @throws \Magento\Core\Exception
      */
     public function capture(\Magento\Object $payment, $amount)
@@ -471,9 +549,9 @@ abstract class AbstractMethod extends \Magento\Object
      *
      * Candidate to be deprecated
      *
-     * @param \Magento\Sales\Model\Order\Invoice $invoice
-     * @param \Magento\Sales\Model\Order\Payment $payment
-     * @return \Magento\Payment\Model\Method\AbstractMethod
+     * @param Invoice $invoice
+     * @param Payment $payment
+     * @return $this
      */
     public function processInvoice($invoice, $payment)
     {
@@ -486,9 +564,9 @@ abstract class AbstractMethod extends \Magento\Object
      * Candidate to be deprecated:
      * there can be multiple refunds per payment, thus payment.refund_transaction_id doesn't make big sense
      *
-     * @param \Magento\Sales\Model\Order\Invoice $invoice
-     * @param \Magento\Sales\Model\Order\Payment $payment
-     * @return \Magento\Payment\Model\Method\AbstractMethod
+     * @param Invoice $invoice
+     * @param Payment $payment
+     * @return $this
      */
     public function processBeforeRefund($invoice, $payment)
     {
@@ -501,8 +579,7 @@ abstract class AbstractMethod extends \Magento\Object
      *
      * @param \Magento\Object $payment
      * @param float $amount
-     *
-     * @return \Magento\Payment\Model\Method\AbstractMethod
+     * @return $this
      * @throws \Magento\Core\Exception
      */
     public function refund(\Magento\Object $payment, $amount)
@@ -516,8 +593,8 @@ abstract class AbstractMethod extends \Magento\Object
     /**
      * Set transaction ID into creditmemo for informational purposes
      * @param \Magento\Sales\Model\Order\Creditmemo $creditmemo
-     * @param \Magento\Sales\Model\Order\Payment $payment
-     * @return \Magento\Payment\Model\Method\AbstractMethod
+     * @param Payment $payment
+     * @return $this
      */
     public function processCreditmemo($creditmemo, $payment)
     {
@@ -530,7 +607,7 @@ abstract class AbstractMethod extends \Magento\Object
      *
      * @param \Magento\Object $payment
      *
-     * @return \Magento\Payment\Model\Method\AbstractMethod
+     * @return $this
      */
     public function cancel(\Magento\Object $payment)
     {
@@ -541,8 +618,7 @@ abstract class AbstractMethod extends \Magento\Object
      * Void payment abstract method
      *
      * @param \Magento\Object $payment
-     *
-     * @return \Magento\Payment\Model\Method\AbstractMethod
+     * @return $this
      * @throws \Magento\Core\Exception
      */
     public function void(\Magento\Object $payment)
@@ -557,7 +633,6 @@ abstract class AbstractMethod extends \Magento\Object
      * Whether this method can accept or deny payment
      *
      * @param \Magento\Payment\Model\Info $payment
-     *
      * @return bool
      */
     public function canReviewPayment(\Magento\Payment\Model\Info $payment)
@@ -569,7 +644,7 @@ abstract class AbstractMethod extends \Magento\Object
      * Attempt to accept a payment that us under review
      *
      * @param \Magento\Payment\Model\Info $payment
-     * @return bool
+     * @return false
      * @throws \Magento\Core\Exception
      */
     public function acceptPayment(\Magento\Payment\Model\Info $payment)
@@ -584,7 +659,7 @@ abstract class AbstractMethod extends \Magento\Object
      * Attempt to deny a payment that us under review
      *
      * @param \Magento\Payment\Model\Info $payment
-     * @return bool
+     * @return false
      * @throws \Magento\Core\Exception
      */
     public function denyPayment(\Magento\Payment\Model\Info $payment)
@@ -625,15 +700,14 @@ abstract class AbstractMethod extends \Magento\Object
     /**
      * Assign data to info model instance
      *
-     * @param   mixed $data
-     * @return  \Magento\Payment\Model\Info
+     * @param array|\Magento\Object $data
+     * @return $this
      */
     public function assignData($data)
     {
         if (is_array($data)) {
             $this->getInfoInstance()->addData($data);
-        }
-        elseif ($data instanceof \Magento\Object) {
+        } elseif ($data instanceof \Magento\Object) {
             $this->getInfoInstance()->addData($data->getData());
         }
         return $this;
@@ -642,7 +716,7 @@ abstract class AbstractMethod extends \Magento\Object
     /**
      * Prepare info instance for save
      *
-     * @return \Magento\Payment\Model\Method\AbstractMethod
+     * @return $this
      */
     public function prepareSave()
     {
@@ -736,7 +810,7 @@ abstract class AbstractMethod extends \Magento\Object
      * @param string $paymentAction
      * @param object $stateObject
      *
-     * @return \Magento\Payment\Model\Method\AbstractMethod
+     * @return $this
      */
     public function initialize($paymentAction, $stateObject)
     {
@@ -758,6 +832,7 @@ abstract class AbstractMethod extends \Magento\Object
      * Log debug data to file
      *
      * @param mixed $debugData
+     * @return void
      */
     protected function _debug($debugData)
     {
@@ -783,6 +858,7 @@ abstract class AbstractMethod extends \Magento\Object
      * Used to call debug method from not Payment Method context
      *
      * @param mixed $debugData
+     * @return void
      */
     public function debugData($debugData)
     {
diff --git a/app/code/Magento/Payment/Model/Method/Banktransfer.php b/app/code/Magento/Payment/Model/Method/Banktransfer.php
index 61e56d4b59c..b326c76dddc 100644
--- a/app/code/Magento/Payment/Model/Method/Banktransfer.php
+++ b/app/code/Magento/Payment/Model/Method/Banktransfer.php
@@ -23,12 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Payment\Model\Method;
 
 /**
  * Bank Transfer payment method model
  */
-namespace Magento\Payment\Model\Method;
-
 class Banktransfer extends \Magento\Payment\Model\Method\AbstractMethod
 {
     const PAYMENT_METHOD_BANKTRANSFER_CODE = 'banktransfer';
@@ -46,6 +45,12 @@ class Banktransfer extends \Magento\Payment\Model\Method\AbstractMethod
      * @var string
      */
     protected $_formBlockType = 'Magento\Payment\Block\Form\Banktransfer';
+
+    /**
+     * Instructions block path
+     *
+     * @var string
+     */
     protected $_infoBlockType = 'Magento\Payment\Block\Info\Instructions';
 
     /**
@@ -57,5 +62,4 @@ class Banktransfer extends \Magento\Payment\Model\Method\AbstractMethod
     {
         return trim($this->getConfigData('instructions'));
     }
-
 }
diff --git a/app/code/Magento/Payment/Model/Method/Cashondelivery.php b/app/code/Magento/Payment/Model/Method/Cashondelivery.php
index d5bef07d614..70a536dff2d 100644
--- a/app/code/Magento/Payment/Model/Method/Cashondelivery.php
+++ b/app/code/Magento/Payment/Model/Method/Cashondelivery.php
@@ -23,12 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Payment\Model\Method;
 
 /**
  * Cash on delivery payment method model
  */
-namespace Magento\Payment\Model\Method;
-
 class Cashondelivery extends \Magento\Payment\Model\Method\AbstractMethod
 {
 
@@ -45,6 +44,12 @@ class Cashondelivery extends \Magento\Payment\Model\Method\AbstractMethod
      * @var string
      */
     protected $_formBlockType = 'Magento\Payment\Block\Form\Cashondelivery';
+
+    /**
+     * Info instructions block path
+     *
+     * @var string
+     */
     protected $_infoBlockType = 'Magento\Payment\Block\Info\Instructions';
 
     /**
diff --git a/app/code/Magento/Payment/Model/Method/Cc.php b/app/code/Magento/Payment/Model/Method/Cc.php
index 36672d0881e..a5879aab1a2 100644
--- a/app/code/Magento/Payment/Model/Method/Cc.php
+++ b/app/code/Magento/Payment/Model/Method/Cc.php
@@ -23,13 +23,23 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Payment\Model\Method;
 
 class Cc extends \Magento\Payment\Model\Method\AbstractMethod
 {
+    /**
+     * @var string
+     */
     protected $_formBlockType = 'Magento\Payment\Block\Form\Cc';
+
+    /**
+     * @var string
+     */
     protected $_infoBlockType = 'Magento\Payment\Block\Info\Cc';
+
+    /**
+     * @var bool
+     */
     protected $_canSaveCc     = false;
 
     /**
@@ -90,8 +100,8 @@ class Cc extends \Magento\Payment\Model\Method\AbstractMethod
     /**
      * Assign data to info model instance
      *
-     * @param   mixed $data
-     * @return  \Magento\Payment\Model\Info
+     * @param \Magento\Object|mixed $data
+     * @return $this
      */
     public function assignData($data)
     {
@@ -116,7 +126,7 @@ class Cc extends \Magento\Payment\Model\Method\AbstractMethod
     /**
      * Prepare info instance for save
      *
-     * @return \Magento\Payment\Model\Method\Cc
+     * @return $this
      */
     public function prepareSave()
     {
@@ -133,7 +143,7 @@ class Cc extends \Magento\Payment\Model\Method\AbstractMethod
     /**
      * Validate payment method information object
      *
-     * @return \Magento\Payment\Model\Method\Cc
+     * @return $this
      * @throws \Magento\Core\Exception
      * @SuppressWarnings(PHPMD.CyclomaticComplexity)
      * @SuppressWarnings(PHPMD.NPathComplexity)
@@ -230,6 +240,9 @@ class Cc extends \Magento\Payment\Model\Method\AbstractMethod
         return $this;
     }
 
+    /**
+     * @return bool
+     */
     public function hasVerification()
     {
         $configData = $this->getConfigData('useccv');
@@ -239,6 +252,9 @@ class Cc extends \Magento\Payment\Model\Method\AbstractMethod
         return (bool) $configData;
     }
 
+    /**
+     * @return array
+     */
     public function getVerificationRegEx()
     {
         $verificationExpList = array(
@@ -255,6 +271,11 @@ class Cc extends \Magento\Payment\Model\Method\AbstractMethod
         return $verificationExpList;
     }
 
+    /**
+     * @param string $expYear
+     * @param string $expMonth
+     * @return bool
+     */
     protected function _validateExpDate($expYear, $expMonth)
     {
         $date = $this->_locale->date();
@@ -266,6 +287,10 @@ class Cc extends \Magento\Payment\Model\Method\AbstractMethod
         return true;
     }
 
+    /**
+     * @param string $type
+     * @return bool
+     */
     public function otherCcType($type)
     {
         return $type=='OT';
@@ -314,7 +339,7 @@ class Cc extends \Magento\Payment\Model\Method\AbstractMethod
      * Other credit cart type number validation
      *
      * @param string $ccNumber
-     * @return boolean
+     * @return bool
      */
     public function validateCcNumOther($ccNumber)
     {
diff --git a/app/code/Magento/Payment/Model/Method/Ccsave.php b/app/code/Magento/Payment/Model/Method/Ccsave.php
index 834ba32ff1f..4e76d6b1475 100644
--- a/app/code/Magento/Payment/Model/Method/Ccsave.php
+++ b/app/code/Magento/Payment/Model/Method/Ccsave.php
@@ -23,14 +23,27 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-
 namespace Magento\Payment\Model\Method;
 
 class Ccsave extends \Magento\Payment\Model\Method\Cc
 {
+    /**
+     * @var string
+     */
     protected $_code        = 'ccsave';
+
+    /**
+     * @var bool
+     */
     protected $_canSaveCc   = true;
+
+    /**
+     * @var string
+     */
     protected $_formBlockType = 'Magento\Payment\Block\Form\Ccsave';
+
+    /**
+     * @var string
+     */
     protected $_infoBlockType = 'Magento\Payment\Block\Info\Ccsave';
 }
diff --git a/app/code/Magento/Payment/Model/Method/Checkmo.php b/app/code/Magento/Payment/Model/Method/Checkmo.php
index 942f9707d7b..33923f07059 100644
--- a/app/code/Magento/Payment/Model/Method/Checkmo.php
+++ b/app/code/Magento/Payment/Model/Method/Checkmo.php
@@ -23,21 +23,30 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-
 namespace Magento\Payment\Model\Method;
 
 class Checkmo extends \Magento\Payment\Model\Method\AbstractMethod
 {
+    /**
+     * @var string
+     */
     protected $_code  = 'checkmo';
+
+    /**
+     * @var string
+     */
     protected $_formBlockType = 'Magento\Payment\Block\Form\Checkmo';
+
+    /**
+     * @var string
+     */
     protected $_infoBlockType = 'Magento\Payment\Block\Info\Checkmo';
 
     /**
      * Assign data to info model instance
      *
-     * @param   mixed $data
-     * @return  \Magento\Payment\Model\Method\Checkmo
+     * @param mixed $data
+     * @return $this
      */
     public function assignData($data)
     {
@@ -54,11 +63,17 @@ class Checkmo extends \Magento\Payment\Model\Method\AbstractMethod
         return $this;
     }
 
+    /**
+     * @return string
+     */
     public function getPayableTo()
     {
         return $this->getConfigData('payable_to');
     }
 
+    /**
+     * @return string
+     */
     public function getMailingAddress()
     {
         return $this->getConfigData('mailing_address');
diff --git a/app/code/Magento/Payment/Model/Method/Factory.php b/app/code/Magento/Payment/Model/Method/Factory.php
index f609d61b15b..b67ffc9abd8 100644
--- a/app/code/Magento/Payment/Model/Method/Factory.php
+++ b/app/code/Magento/Payment/Model/Method/Factory.php
@@ -21,12 +21,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Payment\Model\Method;
 
 /**
  * Class \Magento\Payment\Model\Method\Factory
  */
-namespace Magento\Payment\Model\Method;
-
 class Factory
 {
     /**
diff --git a/app/code/Magento/Payment/Model/Method/Free.php b/app/code/Magento/Payment/Model/Method/Free.php
index c2478031f26..5d7d192ec94 100644
--- a/app/code/Magento/Payment/Model/Method/Free.php
+++ b/app/code/Magento/Payment/Model/Method/Free.php
@@ -23,12 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Payment\Model\Method;
 
 /**
  * Free payment method
  */
-namespace Magento\Payment\Model\Method;
-
 class Free extends \Magento\Payment\Model\Method\AbstractMethod
 {
     /**
@@ -40,6 +39,7 @@ class Free extends \Magento\Payment\Model\Method\AbstractMethod
 
     /**
      * Payment Method features
+     *
      * @var bool
      */
     protected $_canAuthorize = true;
diff --git a/app/code/Magento/Payment/Model/Method/Purchaseorder.php b/app/code/Magento/Payment/Model/Method/Purchaseorder.php
index 9c17db5e4f8..c7fa1394c2e 100644
--- a/app/code/Magento/Payment/Model/Method/Purchaseorder.php
+++ b/app/code/Magento/Payment/Model/Method/Purchaseorder.php
@@ -23,21 +23,30 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-
 namespace Magento\Payment\Model\Method;
 
 class Purchaseorder extends \Magento\Payment\Model\Method\AbstractMethod
 {
+    /**
+     * @var string
+     */
     protected $_code  = 'purchaseorder';
+
+    /**
+     * @var string
+     */
     protected $_formBlockType = 'Magento\Payment\Block\Form\Purchaseorder';
+
+    /**
+     * @var string
+     */
     protected $_infoBlockType = 'Magento\Payment\Block\Info\Purchaseorder';
 
     /**
      * Assign data to info model instance
      *
-     * @param   mixed $data
-     * @return  \Magento\Payment\Model\Method\Purchaseorder
+     * @param \Magento\Object|mixed $data
+     * @return $this
      */
     public function assignData($data)
     {
diff --git a/app/code/Magento/Payment/Model/Method/Specification/AbstractSpecification.php b/app/code/Magento/Payment/Model/Method/Specification/AbstractSpecification.php
index bfaae0f0cef..4e2d20d98ee 100644
--- a/app/code/Magento/Payment/Model/Method/Specification/AbstractSpecification.php
+++ b/app/code/Magento/Payment/Model/Method/Specification/AbstractSpecification.php
@@ -21,9 +21,7 @@
  * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Payment\Model\Method\Specification;
-
 use Magento\Payment\Model\Method\SpecificationInterface;
 use Magento\Payment\Model\Config as PaymentConfig;
 
diff --git a/app/code/Magento/Payment/Model/Method/Specification/Composite.php b/app/code/Magento/Payment/Model/Method/Specification/Composite.php
index 52c4bfd6912..be94aeb7d80 100644
--- a/app/code/Magento/Payment/Model/Method/Specification/Composite.php
+++ b/app/code/Magento/Payment/Model/Method/Specification/Composite.php
@@ -21,7 +21,6 @@
  * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Payment\Model\Method\Specification;
 
 use Magento\Payment\Model\Method\SpecificationInterface;
diff --git a/app/code/Magento/Payment/Model/Observer.php b/app/code/Magento/Payment/Model/Observer.php
index 2c7a1d8dc42..4d6ce7a61df 100644
--- a/app/code/Magento/Payment/Model/Observer.php
+++ b/app/code/Magento/Payment/Model/Observer.php
@@ -23,12 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Payment\Model;
 
 /**
  * Payment Observer
  */
-namespace Magento\Payment\Model;
-
 class Observer
 {
     /**
@@ -66,7 +65,7 @@ class Observer
      * Set forced canCreditmemo flag
      *
      * @param \Magento\Event\Observer $observer
-     * @return \Magento\Payment\Model\Observer
+     * @return $this
      */
     public function salesOrderBeforeSave($observer)
     {
@@ -110,6 +109,7 @@ class Observer
 
     /**
      * @param \Magento\Event\Observer $observer
+     * @return void
      */
     public function updateOrderStatusForPaymentMethods(\Magento\Event\Observer $observer)
     {
diff --git a/app/code/Magento/Payment/Model/Paygate/Result.php b/app/code/Magento/Payment/Model/Paygate/Result.php
index e0870c826e5..86858f47d77 100644
--- a/app/code/Magento/Payment/Model/Paygate/Result.php
+++ b/app/code/Magento/Payment/Model/Paygate/Result.php
@@ -23,8 +23,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-
 namespace Magento\Payment\Model\Paygate;
 
 class Result extends \Magento\Object
diff --git a/app/code/Magento/Payment/Model/Recurring/Profile/MethodInterface.php b/app/code/Magento/Payment/Model/Recurring/Profile/MethodInterface.php
index 09915846eaf..af59ace6010 100644
--- a/app/code/Magento/Payment/Model/Recurring/Profile/MethodInterface.php
+++ b/app/code/Magento/Payment/Model/Recurring/Profile/MethodInterface.php
@@ -23,12 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Payment\Model\Recurring\Profile;
 
 /**
  * Recurring profile gateway management interface
  */
-namespace Magento\Payment\Model\Recurring\Profile;
-
 interface MethodInterface
 {
     /**
diff --git a/app/code/Magento/Payment/Model/Source/Cctype.php b/app/code/Magento/Payment/Model/Source/Cctype.php
index 4156e5226bf..1ef747d47d0 100644
--- a/app/code/Magento/Payment/Model/Source/Cctype.php
+++ b/app/code/Magento/Payment/Model/Source/Cctype.php
@@ -21,12 +21,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Payment\Model\Source;
 
 /**
  * Payment CC Types Source Model
  */
-namespace Magento\Payment\Model\Source;
-
 class Cctype implements \Magento\Core\Model\Option\ArrayInterface
 {
     /**
@@ -66,8 +65,8 @@ class Cctype implements \Magento\Core\Model\Option\ArrayInterface
     /**
      * Setter for allowed types
      *
-     * @param $values
-     * @return \Magento\Payment\Model\Source\Cctype
+     * @param array $values
+     * @return $this
      */
     public function setAllowedTypes(array $values)
     {
@@ -75,6 +74,9 @@ class Cctype implements \Magento\Core\Model\Option\ArrayInterface
         return $this;
     }
 
+    /**
+     * {@inheritdoc}
+     */
     public function toOptionArray()
     {
         /**
diff --git a/app/code/Magento/Payment/Model/Source/Invoice.php b/app/code/Magento/Payment/Model/Source/Invoice.php
index f0aefd6a624..c0b8856366a 100644
--- a/app/code/Magento/Payment/Model/Source/Invoice.php
+++ b/app/code/Magento/Payment/Model/Source/Invoice.php
@@ -23,16 +23,18 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Payment\Model\Source;
 
 /**
  * Automatic invoice create source model
  *
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Payment\Model\Source;
-
 class Invoice implements \Magento\Core\Model\Option\ArrayInterface
 {
+    /**
+     * {@inheritdoc}
+     */
     public function toOptionArray()
     {
         return array(
diff --git a/app/code/Magento/Payment/etc/di.xml b/app/code/Magento/Payment/etc/di.xml
index 67192acaeea..65e25977d4a 100644
--- a/app/code/Magento/Payment/etc/di.xml
+++ b/app/code/Magento/Payment/etc/di.xml
@@ -23,29 +23,23 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Payment\Model\Config\Reader">
-        <param name="fileName">
-            <value>payment.xml</value>
-        </param>
-        <param name="converter">
-            <instance type="Magento\Payment\Model\Config\Converter" />
-        </param>
-        <param name="schemaLocator">
-            <instance type="Magento\Payment\Model\Config\SchemaLocator" />
-        </param>
+        <arguments>
+            <argument name="fileName" xsi:type="string">payment.xml</argument>
+            <argument name="converter" xsi:type="object">Magento\Payment\Model\Config\Converter</argument>
+            <argument name="schemaLocator" xsi:type="object">Magento\Payment\Model\Config\SchemaLocator</argument>
+        </arguments>
     </type>
     <virtualType name="Magento\Payment\Model\Config\Data" type="Magento\Config\Data">
-        <param name='reader'>
-            <instance type="Magento\Payment\Model\Config\Reader" />
-        </param>
-        <param name="cacheId">
-            <value>payment_config</value>
-        </param>
+        <arguments>
+            <argument name="reader" xsi:type="object">Magento\Payment\Model\Config\Reader</argument>
+            <argument name="cacheId" xsi:type="string">payment_config</argument>
+        </arguments>
     </virtualType>
     <type name="Magento\Payment\Model\Config">
-        <param name="dataStorage">
-            <instance type="Magento\Payment\Model\Config\Data" />
-        </param>
+        <arguments>
+            <argument name="dataStorage" xsi:type="object">Magento\Payment\Model\Config\Data</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Paypal/Model/Billing/Agreement/OrdersUpdater.php b/app/code/Magento/Paypal/Model/Billing/Agreement/OrdersUpdater.php
index acbe86a64b2..05777db75dc 100644
--- a/app/code/Magento/Paypal/Model/Billing/Agreement/OrdersUpdater.php
+++ b/app/code/Magento/Paypal/Model/Billing/Agreement/OrdersUpdater.php
@@ -27,7 +27,7 @@
  */
 namespace Magento\Paypal\Model\Billing\Agreement;
 
-class OrdersUpdater implements \Magento\Core\Model\Layout\Argument\UpdaterInterface
+class OrdersUpdater implements \Magento\View\Layout\Argument\UpdaterInterface
 {
     /**
      * @var \Magento\Core\Model\Registry
diff --git a/app/code/Magento/Paypal/etc/adminhtml/di.xml b/app/code/Magento/Paypal/etc/adminhtml/di.xml
index ab03f77ce1d..19a5e634fa4 100644
--- a/app/code/Magento/Paypal/etc/adminhtml/di.xml
+++ b/app/code/Magento/Paypal/etc/adminhtml/di.xml
@@ -23,36 +23,32 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <virtualType name="Magento\Paypal\Model\Session\Storage" type="Magento\Session\Storage">
-        <param name="namespace">
-            <value>paypal</value>
-        </param>
+        <arguments>
+            <argument name="namespace" xsi:type="string">paypal</argument>
+        </arguments>
     </virtualType>
     <virtualType name="Magento\Paypal\Model\Session" type="Magento\Session\Generic">
-        <param name="storage">
-            <instance type="Magento\Paypal\Model\Session\Storage" />
-        </param>
-        <param name="sessionName">
-            <value>adminhtml</value>
-        </param>
+        <arguments>
+            <argument name="storage" xsi:type="object">Magento\Paypal\Model\Session\Storage</argument>
+            <argument name="sessionName" xsi:type="string">adminhtml</argument>
+        </arguments>
     </virtualType>
     <virtualType name="Magento\Paypal\Model\PayflowSession\Storage" type="Magento\Session\Storage">
-        <param name="namespace">
-            <value>paypal_payflow</value>
-        </param>
+        <arguments>
+            <argument name="namespace" xsi:type="string">paypal_payflow</argument>
+        </arguments>
     </virtualType>
     <virtualType name="Magento\Paypal\Model\PayflowSession" type="Magento\Session\Generic">
-        <param name="storage">
-            <instance type="Magento\Paypal\Model\PayflowSession\Storage" />
-        </param>
-        <param name="sessionName">
-            <value>adminhtml</value>
-        </param>
+        <arguments>
+            <argument name="storage" xsi:type="object">Magento\Paypal\Model\PayflowSession\Storage</argument>
+            <argument name="sessionName" xsi:type="string">adminhtml</argument>
+        </arguments>
     </virtualType>
     <type name="Magento\Session\Generic">
-        <param name="sessionName">
-            <value>adminhtml</value>
-        </param>
+        <arguments>
+            <argument name="sessionName" xsi:type="string">adminhtml</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Paypal/etc/di.xml b/app/code/Magento/Paypal/etc/di.xml
index b8dfd1cb8c7..27d6855019b 100644
--- a/app/code/Magento/Paypal/etc/di.xml
+++ b/app/code/Magento/Paypal/etc/di.xml
@@ -23,12 +23,12 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Module\Updater\SetupFactory">
-        <param name="resourceTypes">
-            <array>
-                <item key="paypal_setup"><value>Magento\Sales\Model\Resource\Setup</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="resourceTypes" xsi:type="array">
+                <item name="paypal_setup" xsi:type="string">Magento\Sales\Model\Resource\Setup</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Paypal/etc/frontend/di.xml b/app/code/Magento/Paypal/etc/frontend/di.xml
index 6e1eb584d9d..4f7c5d9a0c5 100644
--- a/app/code/Magento/Paypal/etc/frontend/di.xml
+++ b/app/code/Magento/Paypal/etc/frontend/di.xml
@@ -23,46 +23,42 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <virtualType name="Magento\Paypal\Model\Session\Storage" type="Magento\Session\Storage">
-        <param name="namespace">
-            <value>paypal</value>
-        </param>
+        <arguments>
+            <argument name="namespace" xsi:type="string">paypal</argument>
+        </arguments>
     </virtualType>
     <virtualType name="Magento\Paypal\Model\Session" type="Magento\Session\Generic">
-        <param name="storage">
-            <instance type="Magento\Paypal\Model\Session\Storage" />
-        </param>
-        <param name="sessionName">
-            <value>frontend</value>
-        </param>
+        <arguments>
+            <argument name="storage" xsi:type="object">Magento\Paypal\Model\Session\Storage</argument>
+            <argument name="sessionName" xsi:type="string">frontend</argument>
+        </arguments>
     </virtualType>
     <virtualType name="Magento\Paypal\Model\PayflowSession\Storage" type="Magento\Session\Storage">
-        <param name="namespace">
-            <value>paypal_payflow</value>
-        </param>
+        <arguments>
+            <argument name="namespace" xsi:type="string">paypal_payflow</argument>
+        </arguments>
     </virtualType>
     <virtualType name="Magento\Paypal\Model\PayflowSession" type="Magento\Session\Generic">
-        <param name="storage">
-            <instance type="Magento\Paypal\Model\PayflowSession\Storage" />
-        </param>
-        <param name="sessionName">
-            <value>frontend</value>
-        </param>
+        <arguments>
+            <argument name="storage" xsi:type="object">Magento\Paypal\Model\PayflowSession\Storage</argument>
+            <argument name="sessionName" xsi:type="string">frontend</argument>
+        </arguments>
     </virtualType>
     <type name="Magento\Session\Generic">
-        <param name="sessionName">
-            <value>frontend</value>
-        </param>
+        <arguments>
+            <argument name="sessionName" xsi:type="string">frontend</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\Url\SecurityInfo">
-        <param name="secureUrlList">
-            <array>
-                <item key="paypal_express"><value>/paypal/express</value></item>
-                <item key="paypal_payflowexpress"><value>/paypal/payflowexpress</value></item>
-                <item key="paypal_standard"><value>/paypal/standard</value></item>
-                <item key="paypal_express_callbackshippingoptions"><value>paypal/express/callbackshippingoptions</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="secureUrlList" xsi:type="array">
+                <item name="paypal_express" xsi:type="string">/paypal/express</item>
+                <item name="paypal_payflowexpress" xsi:type="string">/paypal/payflowexpress</item>
+                <item name="paypal_standard" xsi:type="string">/paypal/standard</item>
+                <item name="paypal_express_callbackshippingoptions" xsi:type="string">paypal/express/callbackshippingoptions</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Persistent/Block/Form/Remember.php b/app/code/Magento/Persistent/Block/Form/Remember.php
index cc20670a59d..7ebb09b1c4a 100644
--- a/app/code/Magento/Persistent/Block/Form/Remember.php
+++ b/app/code/Magento/Persistent/Block/Form/Remember.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Persistent\Block\Form;
 
 /**
  * Remember Me block
@@ -31,9 +32,6 @@
  * @package     Magento_Persistent
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-
-namespace Magento\Persistent\Block\Form;
-
 class Remember extends \Magento\View\Element\Template
 {
     /**
diff --git a/app/code/Magento/Persistent/Block/Header/Additional.php b/app/code/Magento/Persistent/Block/Header/Additional.php
index 10bf7c675d7..399036ded93 100644
--- a/app/code/Magento/Persistent/Block/Header/Additional.php
+++ b/app/code/Magento/Persistent/Block/Header/Additional.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Persistent\Block\Header;
 
 /**
  * Remember Me block
@@ -31,9 +32,6 @@
  * @package     Magento_Persistent
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-
-namespace Magento\Persistent\Block\Header;
-
 class Additional extends \Magento\View\Element\Html\Link
 {
     /**
@@ -58,7 +56,7 @@ class Additional extends \Magento\View\Element\Html\Link
         $this->_isScopePrivate = true;
     }
 
-    /*
+    /**
      * Retrieve unset cookie link
      *
      * @return string
diff --git a/app/code/Magento/Persistent/Controller/Index.php b/app/code/Magento/Persistent/Controller/Index.php
index acbb084cd56..135f8b2f347 100644
--- a/app/code/Magento/Persistent/Controller/Index.php
+++ b/app/code/Magento/Persistent/Controller/Index.php
@@ -23,12 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Persistent\Controller;
 
 /**
  * Persistent front controller
  */
-namespace Magento\Persistent\Controller;
-
 class Index extends \Magento\App\Action\Action
 {
     /**
@@ -83,7 +82,7 @@ class Index extends \Magento\App\Action\Action
      * Set whether clear checkout session when logout
      *
      * @param bool $clear
-     * @return \Magento\Persistent\Controller\Index
+     * @return $this
      */
     public function setClearCheckoutSession($clear = true)
     {
@@ -103,6 +102,8 @@ class Index extends \Magento\App\Action\Action
 
     /**
      * Unset persistent cookie action
+     *
+     * @return void
      */
     public function unsetCookieAction()
     {
@@ -116,7 +117,7 @@ class Index extends \Magento\App\Action\Action
     /**
      * Revert all persistent data
      *
-     * @return \Magento\Persistent\Controller\Index
+     * @return $this
      */
     protected function _cleanup()
     {
@@ -133,6 +134,8 @@ class Index extends \Magento\App\Action\Action
 
     /**
      * Save onepage checkout method to be register
+     *
+     * @return void
      */
     public function saveMethodAction()
     {
@@ -153,6 +156,8 @@ class Index extends \Magento\App\Action\Action
     /**
      * Add appropriate session message and redirect to shopping cart
      * used for google checkout and paypal express checkout
+     *
+     * @return void
      */
     public function expressCheckoutAction()
     {
diff --git a/app/code/Magento/Persistent/Helper/Data.php b/app/code/Magento/Persistent/Helper/Data.php
index 6c214ca19ab..b764a90f033 100644
--- a/app/code/Magento/Persistent/Helper/Data.php
+++ b/app/code/Magento/Persistent/Helper/Data.php
@@ -48,7 +48,7 @@ class Data extends \Magento\Core\Helper\Data
     /**
      * Persistent session
      *
-     * @var \Magento\Persistent\Helper\Session
+     * @var Session
      */
     protected $_persistentSession;
 
@@ -97,7 +97,7 @@ class Data extends \Magento\Core\Helper\Data
         \Magento\App\State $appState,
         \Magento\Core\Helper\Url $coreUrl,
         \Magento\Checkout\Helper\Data $checkoutData,
-        \Magento\Persistent\Helper\Session $persistentSession,
+        Session $persistentSession,
         \Magento\Module\Dir\Reader $modulesReader,
         \Magento\Escaper $escaper,
         $dbCompatibleMode = true
@@ -228,7 +228,7 @@ class Data extends \Magento\Core\Helper\Data
     /**
      * Get create account url depends on checkout
      *
-     * @param  $url string
+     * @param  string $url
      * @return string
      */
     public function getCreateAccountUrl($url)
diff --git a/app/code/Magento/Persistent/Helper/Session.php b/app/code/Magento/Persistent/Helper/Session.php
index 515d3fa0b19..320f89ba776 100644
--- a/app/code/Magento/Persistent/Helper/Session.php
+++ b/app/code/Magento/Persistent/Helper/Session.php
@@ -181,6 +181,7 @@ class Session extends \Magento\Core\Helper\Data
      * Set "Remember Me" checked or not
      *
      * @param bool $checked
+     * @return void
      */
     public function setRememberMeChecked($checked = true)
     {
diff --git a/app/code/Magento/Persistent/Model/Factory.php b/app/code/Magento/Persistent/Model/Factory.php
index c2d294f7116..eb59f958eda 100644
--- a/app/code/Magento/Persistent/Model/Factory.php
+++ b/app/code/Magento/Persistent/Model/Factory.php
@@ -21,12 +21,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Persistent\Model;
 
 /**
  * Persistent Factory
  */
-namespace Magento\Persistent\Model;
-
 class Factory
 {
     /**
diff --git a/app/code/Magento/Persistent/Model/Observer.php b/app/code/Magento/Persistent/Model/Observer.php
index a569bfe8587..5c0e79c2872 100644
--- a/app/code/Magento/Persistent/Model/Observer.php
+++ b/app/code/Magento/Persistent/Model/Observer.php
@@ -23,7 +23,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Persistent\Model;
 
 /**
@@ -151,10 +150,10 @@ class Observer
      * @param \Magento\Checkout\Model\Session $checkoutSession
      * @param \Magento\Customer\Model\Session $customerSession
      * @param \Magento\UrlInterface $url
-     * @param SessionFactory $sessionFactory
+     * @param \Magento\Persistent\Model\SessionFactory $sessionFactory
      * @param \Magento\Sales\Model\QuoteFactory $quoteFactory
      * @param \Magento\Customer\Model\CustomerFactory $customerFactory
-     * @param Persistent\ConfigFactory $persistentConfigFactory
+     * @param \Magento\Persistent\Model\Persistent\ConfigFactory $persistentConfigFactory
      * @param \Magento\App\RequestInterface $requestHttp
      * @param \Magento\View\LayoutInterface $layout
      * @param \Magento\Escaper $escaper
@@ -200,7 +199,7 @@ class Observer
      * Apply persistent data
      *
      * @param \Magento\Event\Observer $observer
-     * @return \Magento\Persistent\Model\Observer
+     * @return $this
      */
     public function applyPersistentData($observer)
     {
@@ -221,7 +220,7 @@ class Observer
      * Apply persistent data to specific block
      *
      * @param \Magento\Event\Observer $observer
-     * @return \Magento\Persistent\Model\Observer
+     * @return $this
      */
     public function applyBlockPersistentData($observer)
     {
@@ -256,7 +255,7 @@ class Observer
      * Emulate 'welcome' block with persistent data
      *
      * @param \Magento\View\Element\AbstractBlock $block
-     * @return \Magento\Persistent\Model\Observer
+     * @return $this
      */
     public function emulateWelcomeBlock($block)
     {
@@ -271,6 +270,8 @@ class Observer
 
     /**
      * Emulate 'account links' block with persistent data
+     *
+     * @return void
      */
     protected function _applyAccountLinksPersistentData()
     {
@@ -283,6 +284,7 @@ class Observer
      * Emulate 'top links' block with persistent data
      *
      * @param \Magento\View\Element\AbstractBlock $block
+     * @return void
      */
     public function emulateTopLinks($block)
     {
@@ -294,6 +296,7 @@ class Observer
      * Emulate quote by persistent data
      *
      * @param \Magento\Event\Observer $observer
+     * @return void
      */
     public function emulateQuote($observer)
     {
@@ -327,6 +330,7 @@ class Observer
      * Set persistent data into quote
      *
      * @param \Magento\Event\Observer $observer
+     * @return void
      */
     public function setQuotePersistentData($observer)
     {
@@ -350,6 +354,7 @@ class Observer
      * Set quote to be loaded even if not active
      *
      * @param \Magento\Event\Observer $observer
+     * @return void
      */
     public function setLoadPersistentQuote($observer)
     {
@@ -366,6 +371,7 @@ class Observer
      * Prevent clear checkout session
      *
      * @param \Magento\Event\Observer $observer
+     * @return void
      */
     public function preventClearCheckoutSession($observer)
     {
@@ -380,6 +386,7 @@ class Observer
      * Make persistent quote to be guest
      *
      * @param \Magento\Event\Observer $observer
+     * @return void
      */
     public function makePersistentQuoteGuest($observer)
     {
@@ -415,6 +422,7 @@ class Observer
      * Reset session data when customer re-authenticates
      *
      * @param \Magento\Event\Observer $observer
+     * @return void
      */
     public function customerAuthenticatedEvent($observer)
     {
@@ -432,6 +440,7 @@ class Observer
      * Unset persistent cookie and make customer's quote as a guest
      *
      * @param \Magento\Event\Observer $observer
+     * @return void
      */
     public function removePersistentCookie($observer)
     {
@@ -452,6 +461,7 @@ class Observer
      * Disable guest checkout if we are in persistent mode
      *
      * @param \Magento\Event\Observer $observer
+     * @return void
      */
     public function disableGuestCheckout($observer)
     {
@@ -464,6 +474,7 @@ class Observer
      * Prevent express checkout with Google checkout and PayPal Express checkout
      *
      * @param \Magento\Event\Observer $observer
+     * @return void
      */
     public function preventExpressCheckout($observer)
     {
@@ -554,6 +565,7 @@ class Observer
      * Make quote to be guest
      *
      * @param bool $checkQuote Check quote to be persistent (not stolen)
+     * @return void
      */
     public function setQuoteGuest($checkQuote = false)
     {
@@ -593,6 +605,7 @@ class Observer
      * Check and clear session data if persistent session expired
      *
      * @param \Magento\Event\Observer $observer
+     * @return void
      */
     public function checkExpirePersistentQuote(\Magento\Event\Observer $observer)
     {
@@ -613,6 +626,9 @@ class Observer
         }
     }
 
+    /**
+     * @return void
+     */
     protected function _expirePersistentSession()
     {
         $quote = $this->_checkoutSession->setLoadInactive()->getQuote();
@@ -630,7 +646,7 @@ class Observer
      * Clear expired persistent sessions
      *
      * @param \Magento\Cron\Model\Schedule $schedule
-     * @return \Magento\Persistent\Model\Observer
+     * @return $this
      */
     public function clearExpiredCronJob(\Magento\Cron\Model\Schedule $schedule)
     {
@@ -650,6 +666,7 @@ class Observer
      * Update customer id and customer group id if user is in persistent session
      *
      * @param \Magento\Event\Observer $observer
+     * @return void
      */
     public function updateCustomerCookies(\Magento\Event\Observer $observer)
     {
@@ -669,7 +686,7 @@ class Observer
      * Set persistent data to customer session
      *
      * @param \Magento\Event\Observer $observer
-     * @return \Magento\Persistent\Model\Observer
+     * @return $this
      */
     public function emulateCustomer($observer)
     {
diff --git a/app/code/Magento/Persistent/Model/Observer/Session.php b/app/code/Magento/Persistent/Model/Observer/Session.php
index 1f03399b427..eceea97e8a2 100644
--- a/app/code/Magento/Persistent/Model/Observer/Session.php
+++ b/app/code/Magento/Persistent/Model/Observer/Session.php
@@ -23,9 +23,10 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Persistent\Model\Observer;
 
+use Magento\Event\Observer;
+
 /**
  * Persistent Session Observer
  */
@@ -99,7 +100,11 @@ class Session
         $this->_sessionFactory = $sessionFactory;
     }
 
-    public function synchronizePersistentOnLogin(\Magento\Event\Observer $observer)
+    /**
+     * @param Observer $observer
+     * @return void
+     */
+    public function synchronizePersistentOnLogin(Observer $observer)
     {
         /** @var $customer \Magento\Customer\Model\Customer */
         $customer = $observer->getEvent()->getCustomer();
@@ -148,9 +153,10 @@ class Session
     /**
      * Unload persistent session (if set in config)
      *
-     * @param \Magento\Event\Observer $observer
+     * @param Observer $observer
+     * @return void
      */
-    public function synchronizePersistentOnLogout(\Magento\Event\Observer $observer)
+    public function synchronizePersistentOnLogout(Observer $observer)
     {
         if (!$this->_persistentData->isEnabled() || !$this->_persistentData->getClearOnLogout()) {
             return;
@@ -172,9 +178,10 @@ class Session
     /**
      * Synchronize persistent session info
      *
-     * @param \Magento\Event\Observer $observer
+     * @param Observer $observer
+     * @return void
      */
-    public function synchronizePersistentInfo(\Magento\Event\Observer $observer)
+    public function synchronizePersistentInfo(Observer $observer)
     {
         if (!$this->_persistentData->isEnabled() || !$this->_persistentSession->isPersistent()) {
             return;
@@ -197,9 +204,10 @@ class Session
     /**
      * Set Checked status of "Remember Me"
      *
-     * @param \Magento\Event\Observer $observer
+     * @param Observer $observer
+     * @return void
      */
-    public function setRememberMeCheckedStatus(\Magento\Event\Observer $observer)
+    public function setRememberMeCheckedStatus(Observer $observer)
     {
         if (!$this->_persistentData->canProcess($observer)
             || !$this->_persistentData->isEnabled()
@@ -224,9 +232,10 @@ class Session
     /**
      * Renew persistent cookie
      *
-     * @param \Magento\Event\Observer $observer
+     * @param Observer $observer
+     * @return void
      */
-    public function renewCookie(\Magento\Event\Observer $observer)
+    public function renewCookie(Observer $observer)
     {
         if (!$this->_persistentData->canProcess($observer)
             || !$this->_persistentData->isEnabled()
diff --git a/app/code/Magento/Persistent/Model/Persistent/Config.php b/app/code/Magento/Persistent/Model/Persistent/Config.php
index eadc9b3b713..ef197c3ae48 100644
--- a/app/code/Magento/Persistent/Model/Persistent/Config.php
+++ b/app/code/Magento/Persistent/Model/Persistent/Config.php
@@ -23,13 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Persistent\Model\Persistent;
 
 /**
  * Persistent Config Model
  */
-namespace Magento\Persistent\Model\Persistent;
-
 class Config
 {
     /**
@@ -39,13 +37,19 @@ class Config
      */
     protected $_configFilePath;
 
-    /** @var \Magento\Config\DomFactory  */
+    /**
+     * @var \Magento\Config\DomFactory
+     */
     protected $_domFactory;
 
-    /** @var \Magento\Module\Dir\Reader  */
+    /**
+     * @var \Magento\Module\Dir\Reader
+     */
     protected $_moduleReader;
 
-    /** @var \DOMXPath  */
+    /**
+     * @var \DOMXPath
+     */
     protected $_configDomXPath = null;
 
     /**
@@ -104,7 +108,7 @@ class Config
      * Set path to config file that should be loaded
      *
      * @param string $path
-     * @return \Magento\Persistent\Model\Persistent\Config
+     * @return $this
      */
     public function setConfigFilePath($path)
     {
@@ -151,7 +155,7 @@ class Config
      * Get block's persistent config info.
      *
      * @param string $block
-     * @return $array
+     * @return array
      */
     public function getBlockConfigInfo($block)
     {
@@ -176,7 +180,7 @@ class Config
     /**
      * Convert Blocks
      *
-     * @param DomNodeList $blocks
+     * @param /DomNodeList $blocks
      * @return array
      */
     protected function _convertBlocksToArray($blocks)
@@ -186,7 +190,7 @@ class Config
             $referenceAttributes = $reference->attributes;
             $id = $referenceAttributes->getNamedItem('id')->nodeValue;
             $blocksArray[$id] = array();
-            /** @var $referenceSubNode DOMNode */
+            /** @var $referenceSubNode /DOMNode */
             foreach ($reference->childNodes as $referenceSubNode) {
                 switch ($referenceSubNode->nodeName) {
                     case 'name_in_layout':
@@ -205,7 +209,7 @@ class Config
     /**
      * Run all methods declared in persistent configuration
      *
-     * @return \Magento\Persistent\Model\Persistent\Config
+     * @return $this
      */
     public function fire()
     {
@@ -229,7 +233,7 @@ class Config
      *
      * @param array $info
      * @param bool $instance
-     * @return \Magento\Persistent\Model\Persistent\Config
+     * @return $this
      * @throws \Magento\Core\Exception
      */
     public function fireOne($info, $instance = false)
diff --git a/app/code/Magento/Persistent/Model/Resource/Session.php b/app/code/Magento/Persistent/Model/Resource/Session.php
index e8c8ae20b06..b54cf719def 100644
--- a/app/code/Magento/Persistent/Model/Resource/Session.php
+++ b/app/code/Magento/Persistent/Model/Resource/Session.php
@@ -23,19 +23,17 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Persistent\Model\Resource;
 
 /**
  * Persistent Session Resource Model
  */
-namespace Magento\Persistent\Model\Resource;
-
 class Session extends \Magento\Core\Model\Resource\Db\AbstractDb
 {
     /**
      * Use is object new method for object saving
      *
-     * @var boolean
+     * @var bool
      */
     protected $_useIsObjectNew = true;
 
@@ -62,6 +60,8 @@ class Session extends \Magento\Core\Model\Resource\Db\AbstractDb
 
     /**
      * Initialize connection and define main table and primary key
+     *
+     * @return void
      */
     protected function _construct()
     {
@@ -93,7 +93,7 @@ class Session extends \Magento\Core\Model\Resource\Db\AbstractDb
      * Delete customer persistent session by customer id
      *
      * @param int $customerId
-     * @return \Magento\Persistent\Model\Resource\Session
+     * @return $this
      */
     public function deleteByCustomerId($customerId)
     {
@@ -117,9 +117,9 @@ class Session extends \Magento\Core\Model\Resource\Db\AbstractDb
     /**
      * Delete expired persistent sessions
      *
-     * @param  $websiteId
-     * @param  $expiredBefore
-     * @return \Magento\Persistent\Model\Resource\Session
+     * @param  int $websiteId
+     * @param  string $expiredBefore A formatted date string
+     * @return $this
      */
     public function deleteExpired($websiteId, $expiredBefore)
     {
diff --git a/app/code/Magento/Persistent/Model/Session.php b/app/code/Magento/Persistent/Model/Session.php
index 3b9900655ca..a36d282b2f1 100644
--- a/app/code/Magento/Persistent/Model/Session.php
+++ b/app/code/Magento/Persistent/Model/Session.php
@@ -44,7 +44,7 @@ class Session extends \Magento\Core\Model\AbstractModel
     /**
      * Fields which model does not save into `info` db field
      *
-     * @var array
+     * @var string[]
      */
     protected $_unserializableFields = array('persistent_id', 'key', 'customer_id', 'website_id', 'info', 'updated_at');
 
@@ -140,6 +140,8 @@ class Session extends \Magento\Core\Model\AbstractModel
 
     /**
      * Define resource model
+     *
+     * @return void
      */
     protected function _construct()
     {
@@ -150,7 +152,7 @@ class Session extends \Magento\Core\Model\AbstractModel
      * Set if load expired persistent session
      *
      * @param bool $loadExpired
-     * @return \Magento\Persistent\Model\Session
+     * @return $this
      */
     public function setLoadExpired($loadExpired = true)
     {
@@ -183,7 +185,7 @@ class Session extends \Magento\Core\Model\AbstractModel
      * Serialize info for Resource Model to save
      * For new model check and set available cookie key
      *
-     * @return \Magento\Persistent\Model\Session
+     * @return $this
      */
     protected function _beforeSave()
     {
@@ -212,7 +214,7 @@ class Session extends \Magento\Core\Model\AbstractModel
     /**
      * Set model data from info field
      *
-     * @return \Magento\Persistent\Model\Session
+     * @return $this
      */
     protected function _afterLoad()
     {
@@ -230,7 +232,7 @@ class Session extends \Magento\Core\Model\AbstractModel
      * Get persistent session by cookie key
      *
      * @param string $key
-     * @return \Magento\Persistent\Model\Session
+     * @return $this
      */
     public function loadByCookieKey($key = null)
     {
@@ -248,7 +250,7 @@ class Session extends \Magento\Core\Model\AbstractModel
      * Load session model by specified customer id
      *
      * @param int $id
-     * @return \Magento\Core\Model\AbstractModel
+     * @return $this
      */
     public function loadByCustomerId($id)
     {
@@ -260,7 +262,7 @@ class Session extends \Magento\Core\Model\AbstractModel
      *
      * @param int $customerId
      * @param bool $clearCookie
-     * @return \Magento\Persistent\Model\Session
+     * @return $this
      */
     public function deleteByCustomerId($customerId, $clearCookie = true)
     {
@@ -274,7 +276,7 @@ class Session extends \Magento\Core\Model\AbstractModel
     /**
      * Remove persistent cookie
      *
-     * @return \Magento\Persistent\Model\Session
+     * @return $this
      */
     public function removePersistentCookie()
     {
@@ -286,7 +288,7 @@ class Session extends \Magento\Core\Model\AbstractModel
      * Delete expired persistent sessions for the website
      *
      * @param null|int $websiteId
-     * @return \Magento\Persistent\Model\Session
+     * @return $this
      */
     public function deleteExpired($websiteId = null)
     {
@@ -310,7 +312,7 @@ class Session extends \Magento\Core\Model\AbstractModel
     /**
      * Delete 'persistent' cookie
      *
-     * @return \Magento\Core\Model\AbstractModel
+     * @return $this
      */
     protected function _afterDeleteCommit()
     {
@@ -321,7 +323,7 @@ class Session extends \Magento\Core\Model\AbstractModel
     /**
      * Set `updated_at` to be always changed
      *
-     * @return \Magento\Persistent\Model\Session
+     * @return $this
      */
     public function save()
     {
diff --git a/app/code/Magento/Persistent/etc/di.xml b/app/code/Magento/Persistent/etc/di.xml
index 9dc5977bf07..3301a2b0512 100644
--- a/app/code/Magento/Persistent/etc/di.xml
+++ b/app/code/Magento/Persistent/etc/di.xml
@@ -23,10 +23,10 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Persistent\Helper\Data">
-        <param name="persistentSession">
-            <instance type="Magento\Persistent\Helper\Session\Proxy" />
-        </param>
+        <arguments>
+            <argument name="persistentSession" xsi:type="object">Magento\Persistent\Helper\Session\Proxy</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Persistent/etc/frontend/di.xml b/app/code/Magento/Persistent/etc/frontend/di.xml
index 8a467c2a49c..ef463b46d10 100644
--- a/app/code/Magento/Persistent/etc/frontend/di.xml
+++ b/app/code/Magento/Persistent/etc/frontend/di.xml
@@ -23,12 +23,12 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Core\Model\Url\SecurityInfo">
-        <param name="secureUrlList">
-            <array>
-                <item key="persistent_onepage_register"><value>/persistent/index/saveMethod</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="secureUrlList" xsi:type="array">
+                <item name="persistent_onepage_register" xsi:type="string">/persistent/index/saveMethod</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Rating/etc/adminhtml/di.xml b/app/code/Magento/Rating/etc/adminhtml/di.xml
index fceaa8ca512..23bfe762c78 100644
--- a/app/code/Magento/Rating/etc/adminhtml/di.xml
+++ b/app/code/Magento/Rating/etc/adminhtml/di.xml
@@ -23,10 +23,10 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Rating\Block\Adminhtml\Edit\Tab\Form">
-        <param name="session">
-            <instance type="Magento\Backend\Model\Session" />
-        </param>
+        <arguments>
+            <argument name="session" xsi:type="object">Magento\Backend\Model\Session</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/RecurringProfile/etc/di.xml b/app/code/Magento/RecurringProfile/etc/di.xml
index b335e08e299..4b01a188af7 100644
--- a/app/code/Magento/RecurringProfile/etc/di.xml
+++ b/app/code/Magento/RecurringProfile/etc/di.xml
@@ -23,12 +23,12 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Module\Updater\SetupFactory">
-        <param name="resourceTypes">
-            <array>
-                <item key="recurringprofile_setup"><value>Magento\Catalog\Model\Resource\Setup</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="resourceTypes" xsi:type="array">
+                <item name="recurringprofile_setup" xsi:type="string">Magento\Catalog\Model\Resource\Setup</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Reports/etc/adminhtml/di.xml b/app/code/Magento/Reports/etc/adminhtml/di.xml
index e000f72f4b7..fe6b8f762a4 100644
--- a/app/code/Magento/Reports/etc/adminhtml/di.xml
+++ b/app/code/Magento/Reports/etc/adminhtml/di.xml
@@ -23,15 +23,15 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <virtualType name="Magento\Reports\Model\Session">
-        <param name="sessionName">
-            <value>adminhtml</value>
-        </param>
+        <arguments>
+            <argument name="sessionName" xsi:type="string">adminhtml</argument>
+        </arguments>
     </virtualType>
     <type name="Magento\Reports\Model\Resource\Customer\Collection">
-        <param name="modelName">
-            <value>Magento\Customer\Model\Backend\Customer</value>
-        </param>
+        <arguments>
+            <argument name="modelName" xsi:type="string">Magento\Customer\Model\Backend\Customer</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Reports/etc/di.xml b/app/code/Magento/Reports/etc/di.xml
index cc274db9d33..690b794ba7a 100644
--- a/app/code/Magento/Reports/etc/di.xml
+++ b/app/code/Magento/Reports/etc/di.xml
@@ -23,30 +23,30 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Log\Model\Resource\Log">
         <plugin name="reportLog" type="Magento\Reports\Model\Plugin\Log" />
     </type>
     <type name="Magento\Module\Updater\SetupFactory">
-        <param name="resourceTypes">
-            <array>
-                <item key="reports_setup"><value>Magento\Reports\Model\Resource\Setup</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="resourceTypes" xsi:type="array">
+                <item name="reports_setup" xsi:type="string">Magento\Reports\Model\Resource\Setup</item>
+            </argument>
+        </arguments>
     </type>
     <virtualType name="Magento\Reports\Model\Session\Storage" type="Magento\Session\Storage">
-        <param name="namespace">
-            <value>reports</value>
-        </param>
+        <arguments>
+            <argument name="namespace" xsi:type="string">reports</argument>
+        </arguments>
     </virtualType>
     <virtualType name="Magento\Reports\Model\Session" type="Magento\Session\Generic">
-        <param name="storage">
-            <instance type="Magento\Reports\Model\Session\Storage" />
-        </param>
+        <arguments>
+            <argument name="storage" xsi:type="object">Magento\Reports\Model\Session\Storage</argument>
+        </arguments>
     </virtualType>
     <type name="Magento\Reports\Model\Product\Index\AbstractIndex">
-        <param name="reportSession">
-            <instance type="Magento\Reports\Model\Session" />
-        </param>
+        <arguments>
+            <argument name="reportSession" xsi:type="object">Magento\Reports\Model\Session</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Reports/etc/frontend/di.xml b/app/code/Magento/Reports/etc/frontend/di.xml
index ef9925b984a..0dc0050b8f7 100644
--- a/app/code/Magento/Reports/etc/frontend/di.xml
+++ b/app/code/Magento/Reports/etc/frontend/di.xml
@@ -23,10 +23,10 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <virtualType name="Magento\Reports\Model\Session">
-        <param name="sessionName">
-            <value>frontend</value>
-        </param>
+        <arguments>
+            <argument name="sessionName" xsi:type="string">frontend</argument>
+        </arguments>
     </virtualType>
 </config>
diff --git a/app/code/Magento/Review/Block/Adminhtml/Product/Grid.php b/app/code/Magento/Review/Block/Adminhtml/Product/Grid.php
index 7d5f69624dd..2d933839e9f 100644
--- a/app/code/Magento/Review/Block/Adminhtml/Product/Grid.php
+++ b/app/code/Magento/Review/Block/Adminhtml/Product/Grid.php
@@ -46,7 +46,7 @@ class Grid extends \Magento\Catalog\Block\Adminhtml\Product\Grid
      * @param \Magento\Eav\Model\Resource\Entity\Attribute\Set\CollectionFactory $setsFactory
      * @param \Magento\Catalog\Model\ProductFactory $productFactory
      * @param \Magento\Catalog\Model\Product\Type $type
-     * @param \Magento\Catalog\Model\Product\Status $status
+     * @param \Magento\Catalog\Model\Product\Attribute\Source\Status $status
      * @param \Magento\Catalog\Model\Product\Visibility $visibility
      * @param \Magento\Catalog\Helper\Data $catalogData
      * @param \Magento\Core\Model\Resource\Website\CollectionFactory $websitesFactory
@@ -61,7 +61,7 @@ class Grid extends \Magento\Catalog\Block\Adminhtml\Product\Grid
         \Magento\Eav\Model\Resource\Entity\Attribute\Set\CollectionFactory $setsFactory,
         \Magento\Catalog\Model\ProductFactory $productFactory,
         \Magento\Catalog\Model\Product\Type $type,
-        \Magento\Catalog\Model\Product\Status $status,
+        \Magento\Catalog\Model\Product\Attribute\Source\Status $status,
         \Magento\Catalog\Model\Product\Visibility $visibility,
         \Magento\Catalog\Helper\Data $catalogData,
         \Magento\Core\Model\Resource\Website\CollectionFactory $websitesFactory,
@@ -143,7 +143,7 @@ class Grid extends \Magento\Catalog\Block\Adminhtml\Product\Grid
                 'width'     => '90px',
                 'index'     => 'status',
                 'type'      => 'options',
-                'source'    => 'Magento\Catalog\Model\Product\Status',
+                'source'    => 'Magento\Catalog\Model\Product\Attribute\Source\Status',
                 'options'   => $this->_status->getOptionArray(),
         ));
 
diff --git a/app/code/Magento/Review/etc/adminhtml/di.xml b/app/code/Magento/Review/etc/adminhtml/di.xml
index ca4cb768028..5f2808de253 100644
--- a/app/code/Magento/Review/etc/adminhtml/di.xml
+++ b/app/code/Magento/Review/etc/adminhtml/di.xml
@@ -23,23 +23,21 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <virtualType name="Magento\Review\Model\Session\Storage" type="Magento\Session\Storage">
-        <param name="namespace">
-            <value>review</value>
-        </param>
+        <arguments>
+            <argument name="namespace" xsi:type="string">review</argument>
+        </arguments>
     </virtualType>
     <virtualType name="Magento\Review\Model\Session" type="Magento\Session\Generic">
-        <param name="storage">
-            <instance type="Magento\Review\Model\Session\Storage" />
-        </param>
-        <param name="sessionName">
-            <value>adminhtml</value>
-        </param>
+        <arguments>
+            <argument name="storage" xsi:type="object">Magento\Review\Model\Session\Storage</argument>
+            <argument name="sessionName" xsi:type="string">adminhtml</argument>
+        </arguments>
     </virtualType>
     <type name="Magento\Review\Block\Form">
-        <param name="reviewSession">
-            <instance type="Magento\Review\Model\Session" />
-        </param>
+        <arguments>
+            <argument name="reviewSession" xsi:type="object">Magento\Review\Model\Session</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Review/etc/frontend/di.xml b/app/code/Magento/Review/etc/frontend/di.xml
index 0959fd7c574..2c24dc7e6b7 100644
--- a/app/code/Magento/Review/etc/frontend/di.xml
+++ b/app/code/Magento/Review/etc/frontend/di.xml
@@ -23,43 +23,41 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <virtualType name="Magento\Review\Model\Session\Storage" type="Magento\Session\Storage">
-        <param name="namespace">
-            <value>review</value>
-        </param>
+        <arguments>
+            <argument name="namespace" xsi:type="string">review</argument>
+        </arguments>
     </virtualType>
     <virtualType name="Magento\Review\Model\Session" type="Magento\Session\Generic">
-        <param name="storage">
-            <instance type="Magento\Review\Model\Session\Storage" />
-        </param>
-        <param name="sessionName">
-            <value>frontend</value>
-        </param>
+        <arguments>
+            <argument name="storage" xsi:type="object">Magento\Review\Model\Session\Storage</argument>
+            <argument name="sessionName" xsi:type="string">frontend</argument>
+        </arguments>
     </virtualType>
     <type name="Magento\Review\Block\Form">
-        <param name="reviewSession">
-            <instance type="Magento\Review\Model\Session" />
-        </param>
+        <arguments>
+            <argument name="reviewSession" xsi:type="object">Magento\Review\Model\Session</argument>
+        </arguments>
     </type>
     <type name="Magento\Review\Controller\Product">
         <plugin name="sessionInitializer" type="reviewProductInitSession" />
-        <param name="reviewSession">
-            <instance type="Magento\Review\Model\Session" />
-        </param>
+        <arguments>
+            <argument name="reviewSession" xsi:type="object">Magento\Review\Model\Session</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\Url\SecurityInfo">
-        <param name="secureUrlList">
-            <array>
-                <item key="review_customer"><value>/review/customer/</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="secureUrlList" xsi:type="array">
+                <item name="review_customer" xsi:type="string">/review/customer/</item>
+            </argument>
+        </arguments>
     </type>
     <virtualType name="reviewProductInitSession" type="Magento\Core\App\Action\Plugin\Session">
-        <param name="cookieCheckActions">
-            <array>
-                <item key="productReviewPost"><value>post</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="cookieCheckActions" xsi:type="array">
+                <item name="productReviewPost" xsi:type="string">post</item>
+            </argument>
+        </arguments>
     </virtualType>
 </config>
diff --git a/app/code/Magento/Rss/Block/Catalog/NotifyStock.php b/app/code/Magento/Rss/Block/Catalog/NotifyStock.php
index 0f4c0062bb6..6019d053850 100644
--- a/app/code/Magento/Rss/Block/Catalog/NotifyStock.php
+++ b/app/code/Magento/Rss/Block/Catalog/NotifyStock.php
@@ -47,7 +47,7 @@ class NotifyStock extends \Magento\Backend\Block\AbstractBlock
     protected $_stockFactory;
 
     /**
-     * @var \Magento\Catalog\Model\Product\Status
+     * @var \Magento\Catalog\Model\Product\Attribute\Source\Status
      */
     protected $_productStatus;
 
@@ -61,7 +61,7 @@ class NotifyStock extends \Magento\Backend\Block\AbstractBlock
      * @param \Magento\Rss\Model\RssFactory $rssFactory
      * @param \Magento\Catalog\Model\ProductFactory $productFactory
      * @param \Magento\CatalogInventory\Model\Resource\StockFactory $stockFactory
-     * @param \Magento\Catalog\Model\Product\Status $productStatus
+     * @param \Magento\Catalog\Model\Product\Attribute\Source\Status $productStatus
      * @param \Magento\Core\Model\Resource\Iterator $resourceIterator
      * @param array $data
      */
@@ -70,7 +70,7 @@ class NotifyStock extends \Magento\Backend\Block\AbstractBlock
         \Magento\Rss\Model\RssFactory $rssFactory,
         \Magento\Catalog\Model\ProductFactory $productFactory,
         \Magento\CatalogInventory\Model\Resource\StockFactory $stockFactory,
-        \Magento\Catalog\Model\Product\Status $productStatus,
+        \Magento\Catalog\Model\Product\Attribute\Source\Status $productStatus,
         \Magento\Core\Model\Resource\Iterator $resourceIterator,
         array $data = array()
     ) {
diff --git a/app/code/Magento/Rule/Block/Actions.php b/app/code/Magento/Rule/Block/Actions.php
index 1ba3ae687f1..46c07c13a01 100644
--- a/app/code/Magento/Rule/Block/Actions.php
+++ b/app/code/Magento/Rule/Block/Actions.php
@@ -23,16 +23,20 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-
 namespace Magento\Rule\Block;
 
+use Magento\Data\Form\Element\AbstractElement;
+
 class Actions implements \Magento\Data\Form\Element\Renderer\RendererInterface
 {
-    public function render(\Magento\Data\Form\Element\AbstractElement $element)
+    /**
+     * @param AbstractElement $element
+     * @return string
+     */
+    public function render(AbstractElement $element)
     {
         if ($element->getRule() && $element->getRule()->getActions()) {
-           return $element->getRule()->getActions()->asHtmlRecursive();
+            return $element->getRule()->getActions()->asHtmlRecursive();
         }
         return '';
     }
diff --git a/app/code/Magento/Rule/Block/Conditions.php b/app/code/Magento/Rule/Block/Conditions.php
index b366ce4f473..462c7a2d0cd 100644
--- a/app/code/Magento/Rule/Block/Conditions.php
+++ b/app/code/Magento/Rule/Block/Conditions.php
@@ -23,16 +23,20 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-
 namespace Magento\Rule\Block;
 
+use Magento\Data\Form\Element\AbstractElement;
+
 class Conditions implements \Magento\Data\Form\Element\Renderer\RendererInterface
 {
-    public function render(\Magento\Data\Form\Element\AbstractElement $element)
+    /**
+     * @param AbstractElement $element
+     * @return string
+     */
+    public function render(AbstractElement $element)
     {
         if ($element->getRule() && $element->getRule()->getConditions()) {
-           return $element->getRule()->getConditions()->asHtmlRecursive();
+            return $element->getRule()->getConditions()->asHtmlRecursive();
         }
         return '';
     }
diff --git a/app/code/Magento/Rule/Block/Editable.php b/app/code/Magento/Rule/Block/Editable.php
index 784ccc5f3f4..0d908152e0a 100644
--- a/app/code/Magento/Rule/Block/Editable.php
+++ b/app/code/Magento/Rule/Block/Editable.php
@@ -26,18 +26,18 @@
 
 namespace Magento\Rule\Block;
 
+use Magento\Data\Form\Element\Renderer\RendererInterface;
 use Magento\View\Element\AbstractBlock;
 
-class Editable
-    extends \Magento\View\Element\AbstractBlock
-    implements \Magento\Data\Form\Element\Renderer\RendererInterface
+class Editable extends AbstractBlock implements RendererInterface
 {
     /**
      * Render element
      *
-     * @see \Magento\Data\Form\Element\Renderer\RendererInterface::render()
      * @param \Magento\Data\Form\Element\AbstractElement $element
      * @return string
+     *
+     * @see RendererInterface::render()
      */
     public function render(\Magento\Data\Form\Element\AbstractElement $element)
     {
diff --git a/app/code/Magento/Rule/Block/Newchild.php b/app/code/Magento/Rule/Block/Newchild.php
index fc3bcabc27a..9f806be42dd 100644
--- a/app/code/Magento/Rule/Block/Newchild.php
+++ b/app/code/Magento/Rule/Block/Newchild.php
@@ -27,10 +27,16 @@
 
 namespace Magento\Rule\Block;
 
+use Magento\Data\Form\Element\AbstractElement;
+
 class Newchild extends \Magento\View\Element\AbstractBlock
     implements \Magento\Data\Form\Element\Renderer\RendererInterface
 {
-    public function render(\Magento\Data\Form\Element\AbstractElement $element)
+    /**
+     * @param AbstractElement $element
+     * @return string
+     */
+    public function render(AbstractElement $element)
     {
         $element->addClass('element-value-changer');
         $html = '&nbsp;<span class="rule-param rule-param-new-child"' . ($element->getParamId() ? ' id="' . $element->getParamId() . '"' : '') . '>';
diff --git a/app/code/Magento/Rule/Model/AbstractModel.php b/app/code/Magento/Rule/Model/AbstractModel.php
index bd7f14ce2bf..a90309cd88a 100644
--- a/app/code/Magento/Rule/Model/AbstractModel.php
+++ b/app/code/Magento/Rule/Model/AbstractModel.php
@@ -29,6 +29,8 @@
  */
 namespace Magento\Rule\Model;
 
+use Magento\Core\Exception;
+
 abstract class AbstractModel extends \Magento\Core\Model\AbstractModel
 {
     /**
@@ -116,14 +118,15 @@ abstract class AbstractModel extends \Magento\Core\Model\AbstractModel
     /**
      * Prepare data before saving
      *
-     * @return \Magento\Rule\Model\AbstractModel
+     * @return $this
+     * @throws Exception
      */
     protected function _beforeSave()
     {
         // Check if discount amount not negative
         if ($this->hasDiscountAmount()) {
             if ((int)$this->getDiscountAmount() < 0) {
-                throw new \Magento\Core\Exception(__('Invalid discount amount.'));
+                throw new Exception(__('Invalid discount amount.'));
             }
         }
 
@@ -169,8 +172,7 @@ abstract class AbstractModel extends \Magento\Core\Model\AbstractModel
      * Set rule combine conditions model
      *
      * @param \Magento\Rule\Model\Condition\Combine $conditions
-     *
-     * @return \Magento\Rule\Model\AbstractModel
+     * @return $this
      */
     public function setConditions($conditions)
     {
@@ -208,8 +210,7 @@ abstract class AbstractModel extends \Magento\Core\Model\AbstractModel
      * Set rule actions model
      *
      * @param \Magento\Rule\Model\Action\Collection $actions
-     *
-     * @return \Magento\Rule\Model\AbstractModel
+     * @return $this
      */
     public function setActions($actions)
     {
@@ -247,8 +248,7 @@ abstract class AbstractModel extends \Magento\Core\Model\AbstractModel
      * Reset rule combine conditions
      *
      * @param null|\Magento\Rule\Model\Condition\Combine $conditions
-     *
-     * @return \Magento\Rule\Model\AbstractModel
+     * @return $this
      */
     protected function _resetConditions($conditions = null)
     {
@@ -265,8 +265,7 @@ abstract class AbstractModel extends \Magento\Core\Model\AbstractModel
      * Reset rule actions
      *
      * @param null|\Magento\Rule\Model\Action\Collection $actions
-     *
-     * @return \Magento\Rule\Model\AbstractModel
+     * @return $this
      */
     protected function _resetActions($actions = null)
     {
@@ -296,8 +295,7 @@ abstract class AbstractModel extends \Magento\Core\Model\AbstractModel
      * Initialize rule model data from array
      *
      * @param array $data
-     *
-     * @return \Magento\Rule\Model\AbstractModel
+     * @return $this
      */
     public function loadPost(array $data)
     {
@@ -318,7 +316,6 @@ abstract class AbstractModel extends \Magento\Core\Model\AbstractModel
      * Convert dates into \Zend_Date.
      *
      * @param array $data
-     *
      * @return array
      */
     protected function _convertFlatToRecursive(array $data)
@@ -362,7 +359,6 @@ abstract class AbstractModel extends \Magento\Core\Model\AbstractModel
      * Validate rule conditions to determine if rule can run
      *
      * @param \Magento\Object $object
-     *
      * @return bool
      */
     public function validate(\Magento\Object $object)
@@ -374,8 +370,7 @@ abstract class AbstractModel extends \Magento\Core\Model\AbstractModel
      * Validate rule data
      *
      * @param \Magento\Object $object
-     *
-     * @return bool|array - return true if validation passed successfully. Array with errors description otherwise
+     * @return bool|string[] - return true if validation passed successfully. Array with errors description otherwise
      */
     public function validateData(\Magento\Object $object)
     {
@@ -426,8 +421,7 @@ abstract class AbstractModel extends \Magento\Core\Model\AbstractModel
      * Set is rule can be deleted flag
      *
      * @param bool $value
-     *
-     * @return \Magento\Rule\Model\AbstractModel
+     * @return $this
      */
     public function setIsDeleteable($value)
     {
@@ -449,8 +443,7 @@ abstract class AbstractModel extends \Magento\Core\Model\AbstractModel
      * Set is readonly flag to rule
      *
      * @param bool $value
-     *
-     * @return \Magento\Rule\Model\AbstractModel
+     * @return $this
      */
     public function setIsReadonly($value)
     {
@@ -476,11 +469,10 @@ abstract class AbstractModel extends \Magento\Core\Model\AbstractModel
 
 
     /**
-     * @deprecated since 1.7.0.0
-     *
      * @param string $format
-     *
      * @return string
+     *
+     * @deprecated since 1.7.0.0
      */
     public function asString($format = '')
     {
@@ -488,9 +480,9 @@ abstract class AbstractModel extends \Magento\Core\Model\AbstractModel
     }
 
     /**
-     * @deprecated since 1.7.0.0
-     *
      * @return string
+     *
+     * @deprecated since 1.7.0.0
      */
     public function asHtml()
     {
@@ -500,11 +492,10 @@ abstract class AbstractModel extends \Magento\Core\Model\AbstractModel
     /**
      * Returns rule as an array for admin interface
      *
-     * @deprecated since 1.7.0.0
-     *
      * @param array $arrAttributes
-     *
      * @return array
+     *
+     * @deprecated since 1.7.0.0
      */
     public function asArray(array $arrAttributes = array())
     {
@@ -514,9 +505,9 @@ abstract class AbstractModel extends \Magento\Core\Model\AbstractModel
     /**
      * Combine website ids to string
      *
-     * @deprecated since 1.7.0.0
+     * @return $this
      *
-     * @return \Magento\Rule\Model\AbstractModel
+     * @deprecated since 1.7.0.0
      */
     protected function _prepareWebsiteIds()
     {
diff --git a/app/code/Magento/Rule/Model/Action/AbstractAction.php b/app/code/Magento/Rule/Model/Action/AbstractAction.php
index 0ce38384f26..163ea0d13e6 100644
--- a/app/code/Magento/Rule/Model/Action/AbstractAction.php
+++ b/app/code/Magento/Rule/Model/Action/AbstractAction.php
@@ -23,14 +23,15 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Rule\Model\Action;
 
+use Magento\Data\Form;
+use Magento\Data\Form\Element\AbstractElement;
 
 /**
  * Quote rule action abstract
  */
-namespace Magento\Rule\Model\Action;
-
-abstract class AbstractAction extends \Magento\Object implements \Magento\Rule\Model\Action\ActionInterface
+abstract class AbstractAction extends \Magento\Object implements ActionInterface
 {
     /**
      * @var \Magento\View\Url
@@ -69,6 +70,9 @@ abstract class AbstractAction extends \Magento\Object implements \Magento\Rule\M
         }
     }
 
+    /**
+     * @return Form
+     */
     public function getForm()
     {
         return $this->getRule()->getForm();
@@ -90,6 +94,9 @@ abstract class AbstractAction extends \Magento\Object implements \Magento\Rule\M
         return $out;
     }
 
+    /**
+     * @return string
+     */
     public function asXml()
     {
         $xml = "<type>" . $this->getType() . "</type>"
@@ -99,6 +106,10 @@ abstract class AbstractAction extends \Magento\Object implements \Magento\Rule\M
         return $xml;
     }
 
+    /**
+     * @param array $arr
+     * @return $this
+     */
     public function loadArray(array $arr)
     {
         $this->addData(array(
@@ -154,6 +165,9 @@ abstract class AbstractAction extends \Magento\Object implements \Magento\Rule\M
         return $this;
     }
 
+    /**
+     * @return array
+     */
     public function getOperatorSelectOptions()
     {
         $opt = array();
@@ -239,6 +253,9 @@ abstract class AbstractAction extends \Magento\Object implements \Magento\Rule\M
         return $str;
     }
 
+    /**
+     * @return AbstractElement
+     */
     public function getTypeElement()
     {
         return $this->getForm()->addField('action:' . $this->getId() . ':type', 'hidden', array(
@@ -248,6 +265,9 @@ abstract class AbstractAction extends \Magento\Object implements \Magento\Rule\M
         ));
     }
 
+    /**
+     * @return $this
+     */
     public function getAttributeElement()
     {
         return $this->getForm()->addField('action:' . $this->getId() . ':attribute', 'select', array(
@@ -258,6 +278,9 @@ abstract class AbstractAction extends \Magento\Object implements \Magento\Rule\M
         ))->setRenderer($this->_layout->getBlockSingleton('Magento\Rule\Block\Editable'));
     }
 
+    /**
+     * @return $this
+     */
     public function getOperatorElement()
     {
         return $this->getForm()->addField('action:' . $this->getId() . ':operator', 'select', array(
@@ -268,6 +291,9 @@ abstract class AbstractAction extends \Magento\Object implements \Magento\Rule\M
         ))->setRenderer($this->_layout->getBlockSingleton('Magento\Rule\Block\Editable'));
     }
 
+    /**
+     * @return $this
+     */
     public function getValueElement()
     {
         return $this->getForm()->addField('action:' . $this->getId() . ':value', 'text', array(
diff --git a/app/code/Magento/Rule/Model/Action/Collection.php b/app/code/Magento/Rule/Model/Action/Collection.php
index 341284daa21..aa77fad6742 100644
--- a/app/code/Magento/Rule/Model/Action/Collection.php
+++ b/app/code/Magento/Rule/Model/Action/Collection.php
@@ -27,7 +27,7 @@
 
 namespace Magento\Rule\Model\Action;
 
-class Collection extends \Magento\Rule\Model\Action\AbstractAction
+class Collection extends AbstractAction
 {
     /**
      * @var \Magento\Rule\Model\ActionFactory
@@ -78,6 +78,10 @@ class Collection extends \Magento\Rule\Model\Action\AbstractAction
         return $out;
     }
 
+    /**
+     * @param array $arr
+     * @return $this
+     */
     public function loadArray(array $arr)
     {
         if (!empty($arr['actions']) && is_array($arr['actions'])) {
@@ -93,7 +97,11 @@ class Collection extends \Magento\Rule\Model\Action\AbstractAction
         return $this;
     }
 
-    public function addAction(\Magento\Rule\Model\Action\ActionInterface $action)
+    /**
+     * @param ActionInterface $action
+     * @return $this
+     */
+    public function addAction(ActionInterface $action)
     {
         $actions = $this->getActions();
 
@@ -108,6 +116,9 @@ class Collection extends \Magento\Rule\Model\Action\AbstractAction
         return $this;
     }
 
+    /**
+     * @return string
+     */
     public function asHtml()
     {
         $html = $this->getTypeElement()->toHtml().'Perform following actions: ';
@@ -117,6 +128,9 @@ class Collection extends \Magento\Rule\Model\Action\AbstractAction
         return $html;
     }
 
+    /**
+     * @return $this
+     */
     public function getNewChildElement()
     {
         return $this->getForm()->addField('action:' . $this->getId() . ':new_child', 'select', array(
diff --git a/app/code/Magento/Rule/Model/Condition/AbstractCondition.php b/app/code/Magento/Rule/Model/Condition/AbstractCondition.php
index 174f658dd3f..773dfb07d1b 100644
--- a/app/code/Magento/Rule/Model/Condition/AbstractCondition.php
+++ b/app/code/Magento/Rule/Model/Condition/AbstractCondition.php
@@ -32,9 +32,10 @@
  */
 namespace Magento\Rule\Model\Condition;
 
-abstract class AbstractCondition
-    extends \Magento\Object
-    implements \Magento\Rule\Model\Condition\ConditionInterface
+use Magento\Data\Form;
+use Magento\Data\Form\Element\AbstractElement;
+
+abstract class AbstractCondition extends \Magento\Object implements ConditionInterface
 {
     /**
      * Defines which operators will be available for this condition
@@ -57,7 +58,7 @@ abstract class AbstractCondition
 
     /**
      * List of input types for values which should be array
-     * @var array
+     * @var string[]
      */
     protected $_arrayInputTypes = array();
 
@@ -77,10 +78,10 @@ abstract class AbstractCondition
     protected $_layout;
 
     /**
-     * @param \Magento\Rule\Model\Condition\Context $context
+     * @param Context $context
      * @param array $data
      */
-    public function __construct(\Magento\Rule\Model\Condition\Context $context, array $data = array())
+    public function __construct(Context $context, array $data = array())
     {
         $this->_viewUrl = $context->getViewUrl();
         $this->_locale = $context->getLocale();
@@ -153,6 +154,9 @@ abstract class AbstractCondition
         return $this->_defaultOperatorOptions;
     }
 
+    /**
+     * @return Form
+     */
     public function getForm()
     {
         return $this->getRule()->getForm();
@@ -454,6 +458,9 @@ abstract class AbstractCondition
         return $html;
     }
 
+    /**
+     * @return AbstractElement
+     */
     public function getTypeElement()
     {
         return $this->getForm()->addField($this->getPrefix() . '__' . $this->getId() . '__type', 'hidden', array(
@@ -464,11 +471,17 @@ abstract class AbstractCondition
         ));
     }
 
+    /**
+     * @return string
+     */
     public function getTypeElementHtml()
     {
         return $this->getTypeElement()->getHtml();
     }
 
+    /**
+     * @return $this
+     */
     public function getAttributeElement()
     {
         if (null === $this->getAttribute()) {
@@ -552,6 +565,9 @@ abstract class AbstractCondition
         return $this->_layout->getBlockSingleton('Magento\Rule\Block\Editable');
     }
 
+    /**
+     * @return $this
+     */
     public function getValueElement()
     {
         $elementParams = array(
@@ -641,7 +657,7 @@ abstract class AbstractCondition
     /**
      * Validate product attribute value for condition
      *
-     * @param   mixed $validatedValue product attribute value
+     * @param   object|array|int|string|float|bool $validatedValue product attribute value
      * @return  bool
      */
     public function validateAttribute($validatedValue)
diff --git a/app/code/Magento/Rule/Model/Condition/Combine.php b/app/code/Magento/Rule/Model/Condition/Combine.php
index b28be7e8374..c3e45cbd43b 100644
--- a/app/code/Magento/Rule/Model/Condition/Combine.php
+++ b/app/code/Magento/Rule/Model/Condition/Combine.php
@@ -27,7 +27,7 @@
 
 namespace Magento\Rule\Model\Condition;
 
-class Combine extends \Magento\Rule\Model\Condition\AbstractCondition
+class Combine extends AbstractCondition
 {
     /**
      * Store all used condition models
@@ -47,10 +47,10 @@ class Combine extends \Magento\Rule\Model\Condition\AbstractCondition
     protected $_logger;
 
     /**
-     * @param \Magento\Rule\Model\Condition\Context $context
+     * @param Context $context
      * @param array $data
      */
-    public function __construct(\Magento\Rule\Model\Condition\Context $context, array $data = array())
+    public function __construct(Context $context, array $data = array())
     {
         $this->_conditionFactory = $context->getConditionFactory();
         $this->_logger = $context->getLogger();
@@ -80,7 +80,7 @@ class Combine extends \Magento\Rule\Model\Condition\AbstractCondition
      * It's made by performance reasons to avoid initialization of same models each time when rules are being processed.
      *
      * @param  string $modelClass
-     * @return \Magento\Rule\Model\Condition\AbstractCondition|bool
+     * @return AbstractCondition|bool
      */
     protected function _getNewConditionModelInstance($modelClass)
     {
@@ -303,6 +303,9 @@ class Combine extends \Magento\Rule\Model\Condition\AbstractCondition
         return $html;
     }
 
+    /**
+     * @return $this
+     */
     public function getNewChildElement()
     {
         return $this->getForm()->addField($this->getPrefix() . '__' . $this->getId() . '__new_child', 'select', array(
@@ -403,7 +406,7 @@ class Combine extends \Magento\Rule\Model\Condition\AbstractCondition
      * Set conditions, if current prefix is undefined use 'conditions' key
      *
      * @param array $conditions
-     * @return \Magento\Rule\Model\Condition\Combine
+     * @return $this
      */
     public function setConditions($conditions)
     {
diff --git a/app/code/Magento/Rule/Model/Condition/Product/AbstractProduct.php b/app/code/Magento/Rule/Model/Condition/Product/AbstractProduct.php
index 1cf9877f03d..24f0f1817b3 100644
--- a/app/code/Magento/Rule/Model/Condition/Product/AbstractProduct.php
+++ b/app/code/Magento/Rule/Model/Condition/Product/AbstractProduct.php
@@ -152,7 +152,8 @@ abstract class AbstractProduct extends \Magento\Rule\Model\Condition\AbstractCon
     /**
      * Add special attributes
      *
-     * @param array $attributes
+     * @param array &$attributes
+     * @return void
      */
     protected function _addSpecialAttributes(array &$attributes)
     {
@@ -163,7 +164,7 @@ abstract class AbstractProduct extends \Magento\Rule\Model\Condition\AbstractCon
     /**
      * Load attribute options
      *
-     * @return \Magento\CatalogRule\Model\Rule\Condition\Product
+     * @return $this
      */
     public function loadAttributeOptions()
     {
@@ -194,7 +195,7 @@ abstract class AbstractProduct extends \Magento\Rule\Model\Condition\AbstractCon
      *  'value_select_options' - normal select array: array(array('value' => $value, 'label' => $label), ...)
      *  'value_option' - hashed array: array($value => $label, ...),
      *
-     * @return \Magento\CatalogRule\Model\Rule\Condition\Product
+     * @return $this
      */
     protected function _prepareValueOptions()
     {
@@ -249,7 +250,7 @@ abstract class AbstractProduct extends \Magento\Rule\Model\Condition\AbstractCon
     /**
      * Retrieve value by option
      *
-     * @param mixed $option
+     * @param string|null $option
      * @return string
      */
     public function getValueOption($option = null)
@@ -309,7 +310,7 @@ abstract class AbstractProduct extends \Magento\Rule\Model\Condition\AbstractCon
      * Collect validated attributes
      *
      * @param \Magento\Catalog\Model\Resource\Product\Collection $productCollection
-     * @return \Magento\CatalogRule\Model\Rule\Condition\Product
+     * @return $this
      */
     public function collectValidatedAttributes($productCollection)
     {
@@ -463,7 +464,7 @@ abstract class AbstractProduct extends \Magento\Rule\Model\Condition\AbstractCon
      * Load array
      *
      * @param array $arr
-     * @return \Magento\CatalogRule\Model\Rule\Condition\Product
+     * @return $this
      */
     public function loadArray($arr)
     {
diff --git a/app/code/Magento/Rule/Model/Renderer/Actions.php b/app/code/Magento/Rule/Model/Renderer/Actions.php
index 9c723fa514d..507a2de4aa0 100644
--- a/app/code/Magento/Rule/Model/Renderer/Actions.php
+++ b/app/code/Magento/Rule/Model/Renderer/Actions.php
@@ -27,12 +27,18 @@
 
 namespace Magento\Rule\Model\Renderer;
 
+use Magento\Data\Form\Element\AbstractElement;
+
 class Actions implements \Magento\Data\Form\Element\Renderer\RendererInterface
 {
-    public function render(\Magento\Data\Form\Element\AbstractElement $element)
+    /**
+     * @param AbstractElement $element
+     * @return string
+     */
+    public function render(AbstractElement $element)
     {
         if ($element->getRule() && $element->getRule()->getActions()) {
-           return $element->getRule()->getActions()->asHtmlRecursive();
+            return $element->getRule()->getActions()->asHtmlRecursive();
         }
         return '';
     }
diff --git a/app/code/Magento/Rule/Model/Renderer/Conditions.php b/app/code/Magento/Rule/Model/Renderer/Conditions.php
index 68d68baaa9d..c363b43bae2 100644
--- a/app/code/Magento/Rule/Model/Renderer/Conditions.php
+++ b/app/code/Magento/Rule/Model/Renderer/Conditions.php
@@ -27,12 +27,18 @@
 
 namespace Magento\Rule\Model\Renderer;
 
+use Magento\Data\Form\Element\AbstractElement;
+
 class Conditions implements \Magento\Data\Form\Element\Renderer\RendererInterface
 {
-    public function render(\Magento\Data\Form\Element\AbstractElement $element)
+    /**
+     * @param AbstractElement $element
+     * @return string
+     */
+    public function render(AbstractElement $element)
     {
         if ($element->getRule() && $element->getRule()->getConditions()) {
-           return $element->getRule()->getConditions()->asHtmlRecursive();
+            return $element->getRule()->getConditions()->asHtmlRecursive();
         }
         return '';
     }
diff --git a/app/code/Magento/Rule/Model/Resource/AbstractResource.php b/app/code/Magento/Rule/Model/Resource/AbstractResource.php
index 757d2e8e5ee..ffbaac6fa3d 100644
--- a/app/code/Magento/Rule/Model/Resource/AbstractResource.php
+++ b/app/code/Magento/Rule/Model/Resource/AbstractResource.php
@@ -61,8 +61,7 @@ abstract class AbstractResource extends \Magento\Core\Model\Resource\Db\Abstract
      * Prepare rule's active "from" and "to" dates
      *
      * @param \Magento\Core\Model\AbstractModel $object
-     *
-     * @return \Magento\Rule\Model\Resource\AbstractResource
+     * @return $this
      */
     public function _beforeSave(\Magento\Core\Model\AbstractModel $object)
     {
@@ -87,11 +86,11 @@ abstract class AbstractResource extends \Magento\Core\Model\Resource\Db\Abstract
     /**
      * Bind specified rules to entities
      *
-     * @param array|int|string $ruleIds
-     * @param array|int|string $entityIds
+     * @param int[]|int|string $ruleIds
+     * @param int[]|int|string $entityIds
      * @param string $entityType
-     *
-     * @return \Magento\Rule\Model\Resource\AbstractResource
+     * @return $this
+     * @throws \Exception
      */
     public function bindRuleToEntity($ruleIds, $entityIds, $entityType)
     {
@@ -141,12 +140,11 @@ abstract class AbstractResource extends \Magento\Core\Model\Resource\Db\Abstract
 
             $adapter->delete($this->getTable($entityInfo['associations_table']),
                 $adapter->quoteInto($entityInfo['rule_id_field']   . ' IN (?) AND ', $ruleIds) .
-                $adapter->quoteInto($entityInfo['entity_id_field'] . ' NOT IN (?)',  $entityIds)
+                $adapter->quoteInto($entityInfo['entity_id_field'] . ' NOT IN (?)', $entityIds)
             );
         } catch (\Exception $e) {
             $adapter->rollback();
             throw $e;
-
         }
 
         $adapter->commit();
@@ -157,11 +155,10 @@ abstract class AbstractResource extends \Magento\Core\Model\Resource\Db\Abstract
     /**
      * Unbind specified rules from entities
      *
-     * @param array|int|string $ruleIds
-     * @param array|int|string $entityIds
+     * @param int[]|int|string $ruleIds
+     * @param int[]|int|string $entityIds
      * @param string $entityType
-     *
-     * @return \Magento\Rule\Model\Resource\AbstractResource
+     * @return $this
      */
     public function unbindRuleFromEntity($ruleIds, $entityIds, $entityType)
     {
@@ -193,7 +190,6 @@ abstract class AbstractResource extends \Magento\Core\Model\Resource\Db\Abstract
      *
      * @param int $ruleId
      * @param string $entityType
-     *
      * @return array
      */
     public function getAssociatedEntityIds($ruleId, $entityType)
@@ -234,9 +230,8 @@ abstract class AbstractResource extends \Magento\Core\Model\Resource\Db\Abstract
      * of rule's associated entity by specified entity type
      *
      * @param string $entityType
-     *
-     * @throws \Magento\Core\Exception
      * @return array
+     * @throws \Magento\Core\Exception
      */
     protected function _getAssociatedEntityInfo($entityType)
     {
diff --git a/app/code/Magento/Rule/Model/Resource/Rule/Collection/AbstractCollection.php b/app/code/Magento/Rule/Model/Resource/Rule/Collection/AbstractCollection.php
index 47e871d3ea5..87533bdefc0 100644
--- a/app/code/Magento/Rule/Model/Resource/Rule/Collection/AbstractCollection.php
+++ b/app/code/Magento/Rule/Model/Resource/Rule/Collection/AbstractCollection.php
@@ -61,16 +61,16 @@ abstract class AbstractCollection
     /**
      * Quote rule environment
      *
-     * @deprecated after 1.6.1.0
-     *
      * @var \Magento\Rule\Model\Environment
+     *
+     * @deprecated after 1.6.1.0
      */
     protected $_env;
 
     /**
      * Add website ids to rules data
      *
-     * @return \Magento\Rule\Model\Resource\Rule\Collection\AbstractCollection
+     * @return $this
      */
     protected function _afterLoad()
     {
@@ -89,8 +89,7 @@ abstract class AbstractCollection
      * Init flag for adding rule website ids to collection result
      *
      * @param bool|null $flag
-     *
-     * @return \Magento\Rule\Model\Resource\Rule\Collection\AbstractCollection
+     * @return $this
      */
     public function addWebsitesToResult($flag = null)
     {
@@ -102,9 +101,8 @@ abstract class AbstractCollection
     /**
      * Limit rules collection by specific websites
      *
-     * @param int|array|\Magento\Core\Model\Website $websiteId
-     *
-     * @return \Magento\Rule\Model\Resource\Rule\Collection\AbstractCollection
+     * @param int|int[]|\Magento\Core\Model\Website $websiteId
+     * @return $this
      */
     public function addWebsiteFilter($websiteId)
     {
@@ -130,9 +128,8 @@ abstract class AbstractCollection
      * Provide support for website id filter
      *
      * @param string $field
-     * @param mixed $condition
-     *
-     * @return \Magento\Rule\Model\Resource\Rule\Collection\AbstractCollection
+     * @param null|string|array $condition
+     * @return $this
      */
     public function addFieldToFilter($field, $condition = null)
     {
@@ -144,13 +141,12 @@ abstract class AbstractCollection
         return $this;
     }
 
-   /**
-    * Filter collection to only active or inactive rules
-    *
-    * @param int $isActive
-    *
-    * @return \Magento\Rule\Model\Resource\Rule\Collection\AbstractCollection
-    */
+    /**
+     * Filter collection to only active or inactive rules
+     *
+     * @param int $isActive
+     * @return $this
+     */
     public function addIsActiveFilter($isActive = 1)
     {
         if (!$this->getFlag('is_active_filter')) {
@@ -187,10 +183,10 @@ abstract class AbstractCollection
     /**
      * Set environment for all rules in collection
      *
-     * @deprecated after 1.6.2.0
-     *
      * @param \Magento\Rule\Model\Environment $env
-     * @return \Magento\Rule\Model\Resource\Rule\Collection\AbstractCollection
+     * @return $this
+     *
+     * @deprecated after 1.6.2.0
      */
     public function setEnv( $env = null)
     {
@@ -201,9 +197,9 @@ abstract class AbstractCollection
     /**
      * Retrieve environment for the rules in collection
      *
-     * @deprecated after 1.6.2.0
+     * @return $this
      *
-     * @return \Magento\Rule\Model\Resource\Rule\Collection\AbstractCollection
+     * @deprecated after 1.6.2.0
      */
     public function getEnv()
     {
@@ -213,9 +209,9 @@ abstract class AbstractCollection
     /**
      * Set filter for the collection based on the environment
      *
-     * @deprecated after 1.6.2.0
+     * @return $this
      *
-     * @return \Magento\Rule\Model\Resource\Rule\Collection\AbstractCollection
+     * @deprecated after 1.6.2.0
      */
     public function setActiveFilter()
     {
@@ -225,9 +221,9 @@ abstract class AbstractCollection
     /**
      * Process the quote with all the rules in collection
      *
-     * @deprecated after 1.6.2.0
+     * @return $this
      *
-     * @return \Magento\Rule\Model\Resource\Rule\Collection\AbstractCollection
+     * @deprecated after 1.6.2.0
      */
     public function process()
     {
diff --git a/app/code/Magento/Rule/Model/Rule.php b/app/code/Magento/Rule/Model/Rule.php
index b61be631e55..eda4c0ae201 100644
--- a/app/code/Magento/Rule/Model/Rule.php
+++ b/app/code/Magento/Rule/Model/Rule.php
@@ -35,7 +35,7 @@
  */
 namespace Magento\Rule\Model;
 
-class Rule extends \Magento\Rule\Model\AbstractModel
+class Rule extends AbstractModel
 {
     /**
      * @var \Magento\Rule\Model\Condition\Combine
diff --git a/app/code/Magento/Sales/Block/Adminhtml/Items/Column/DefaultColumn.php b/app/code/Magento/Sales/Block/Adminhtml/Items/Column/DefaultColumn.php
index 2d7ee7311fa..07664004fce 100644
--- a/app/code/Magento/Sales/Block/Adminhtml/Items/Column/DefaultColumn.php
+++ b/app/code/Magento/Sales/Block/Adminhtml/Items/Column/DefaultColumn.php
@@ -105,9 +105,6 @@ class DefaultColumn extends \Magento\Backend\Block\Template
 
     public function getSku()
     {
-        /*if ($this->getItem()->getProductType() == \Magento\Catalog\Model\Product\Type::TYPE_CONFIGURABLE) {
-            return $this->getItem()->getProductOptionByCode('simple_sku');
-        }*/
         return $this->getItem()->getSku();
     }
 
diff --git a/app/code/Magento/Sales/Block/Adminhtml/Order/Create.php b/app/code/Magento/Sales/Block/Adminhtml/Order/Create.php
index b3f1bda1ce9..78609d3ce15 100644
--- a/app/code/Magento/Sales/Block/Adminhtml/Order/Create.php
+++ b/app/code/Magento/Sales/Block/Adminhtml/Order/Create.php
@@ -115,17 +115,6 @@ class Create extends \Magento\Backend\Block\Widget\Form\Container
         return $out;
     }
 
-    /**
-     * Prepare form html. Add block for configurable product modification interface
-     *
-     * @return string
-     */
-    public function getFormHtml()
-    {
-        $html = parent::getFormHtml();
-        return $html;
-    }
-
     public function getHeaderWidth()
     {
         return 'width: 70%;';
diff --git a/app/code/Magento/Sales/Block/Adminhtml/Order/Create/Items/Grid.php b/app/code/Magento/Sales/Block/Adminhtml/Order/Create/Items/Grid.php
index bd398b4ee90..e75c418e955 100644
--- a/app/code/Magento/Sales/Block/Adminhtml/Order/Create/Items/Grid.php
+++ b/app/code/Magento/Sales/Block/Adminhtml/Order/Create/Items/Grid.php
@@ -33,6 +33,8 @@
  */
 namespace Magento\Sales\Block\Adminhtml\Order\Create\Items;
 
+use \Magento\Catalog\Model\Product\Attribute\Source\Status as ProductStatus;
+
 class Grid extends \Magento\Sales\Block\Adminhtml\Order\Create\AbstractCreate
 {
     /**
@@ -121,7 +123,7 @@ class Grid extends \Magento\Sales\Block\Adminhtml\Order\Create\AbstractCreate
                 $item->setMessage($check->getMessage());
                 $item->setHasError($check->getHasError());
                 */
-                if ($item->getProduct()->getStatus() == \Magento\Catalog\Model\Product\Status::STATUS_DISABLED) {
+                if ($item->getProduct()->getStatus() == ProductStatus::STATUS_DISABLED) {
                     $item->setMessage(__('This product is disabled.'));
                     $item->setHasError(true);
                 }
diff --git a/app/code/Magento/Sales/Block/Items/AbstractItems.php b/app/code/Magento/Sales/Block/Items/AbstractItems.php
index 53bb39eedfe..c5e3f0da2c5 100644
--- a/app/code/Magento/Sales/Block/Items/AbstractItems.php
+++ b/app/code/Magento/Sales/Block/Items/AbstractItems.php
@@ -59,6 +59,7 @@ class AbstractItems extends \Magento\View\Element\Template
         $overriddenTemplates = $this->getOverriddenTemplates() ?: array();
         $template = isset($overriddenTemplates[$type]) ? $overriddenTemplates[$type] : $this->getRendererTemplate();
         $renderer = $rendererList->getRenderer($type, self::DEFAULT_TYPE, $template);
+        $renderer->setRenderedBlock($this);
         return $renderer;
     }
 
diff --git a/app/code/Magento/Sales/Model/Observer/Backend/CatalogProductQuote.php b/app/code/Magento/Sales/Model/Observer/Backend/CatalogProductQuote.php
index 1ebf27a64ed..0d65838b24c 100644
--- a/app/code/Magento/Sales/Model/Observer/Backend/CatalogProductQuote.php
+++ b/app/code/Magento/Sales/Model/Observer/Backend/CatalogProductQuote.php
@@ -46,7 +46,7 @@ class CatalogProductQuote
      */
     protected function _recollectQuotes($productId, $status)
     {
-        if ($status != \Magento\Catalog\Model\Product\Status::STATUS_ENABLED) {
+        if ($status != \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED) {
             $this->_quote->markQuotesRecollect($productId);
         }
     }
@@ -62,18 +62,6 @@ class CatalogProductQuote
         $this->_recollectQuotes($product->getId(), $product->getStatus());
     }
 
-    /**
-     * Catalog Mass Status update process
-     *
-     * @param \Magento\Event\Observer $observer
-     */
-    public function catalogProductStatusUpdate(\Magento\Event\Observer $observer)
-    {
-        $status = $observer->getEvent()->getStatus();
-        $productId  = $observer->getEvent()->getProductId();
-        $this->_recollectQuotes($productId, $status);
-    }
-
     /**
      * When deleting product, subtract it from all quotes quantities
      *
diff --git a/app/code/Magento/Sales/Model/Order.php b/app/code/Magento/Sales/Model/Order.php
index 2f71b7ffd85..c22fe82760b 100644
--- a/app/code/Magento/Sales/Model/Order.php
+++ b/app/code/Magento/Sales/Model/Order.php
@@ -992,7 +992,7 @@ class Order extends \Magento\Sales\Model\AbstractModel
             /*
              * @TODO ACPAOC: Use product collection here, but ensure that product
              * is loaded with order store id, otherwise there'll be problems with isSalable()
-             * for configurables, bundles and other composites
+             * for composite products
              *
              */
             /*
diff --git a/app/code/Magento/Sales/Model/Order/Admin/Item.php b/app/code/Magento/Sales/Model/Order/Admin/Item.php
new file mode 100644
index 00000000000..06ae345b6e3
--- /dev/null
+++ b/app/code/Magento/Sales/Model/Order/Admin/Item.php
@@ -0,0 +1,64 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Sales\Model\Order\Admin;
+
+class Item 
+{
+    /**
+     * Get item sku
+     *
+     * @param \Magento\Sales\Model\Order\Item $item
+     *
+     * @return string
+     */
+    public function getSku(\Magento\Sales\Model\Order\Item $item)
+    {
+        return $item->getSku();
+    }
+
+    /**
+     * Get item name
+     *
+     * @param \Magento\Sales\Model\Order\Item $item
+     *
+     * @return string
+     */
+    public function getName(\Magento\Sales\Model\Order\Item $item)
+    {
+        return $item->getName();
+    }
+
+    /**
+     * Get product id
+     *
+     * @param \Magento\Sales\Model\Order\Item $item
+     *
+     * @return int
+     */
+    public function getProductId(\Magento\Sales\Model\Order\Item $item)
+    {
+        return $item->getProductId();
+    }
+} 
diff --git a/app/code/Magento/Sales/Model/Order/Grid/Massaction/ItemsUpdater.php b/app/code/Magento/Sales/Model/Order/Grid/Massaction/ItemsUpdater.php
index 8ad547a4a6d..a1879395a85 100644
--- a/app/code/Magento/Sales/Model/Order/Grid/Massaction/ItemsUpdater.php
+++ b/app/code/Magento/Sales/Model/Order/Grid/Massaction/ItemsUpdater.php
@@ -18,22 +18,13 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Sales
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
-/**
- * Sales orders grid massaction items updater
- *
- * @category   Magento
- * @package    Magento_Sales
- * @author     Magento Core Team <core@magentocommerce.com>
- */
 namespace Magento\Sales\Model\Order\Grid\Massaction;
 
-class ItemsUpdater implements \Magento\Core\Model\Layout\Argument\UpdaterInterface
+class ItemsUpdater implements \Magento\View\Layout\Argument\UpdaterInterface
 {
     /**
      * @var \Magento\AuthorizationInterface
diff --git a/app/code/Magento/Sales/Model/Resource/Report/Bestsellers.php b/app/code/Magento/Sales/Model/Resource/Report/Bestsellers.php
index 5e6f50f1003..db35ab7b836 100644
--- a/app/code/Magento/Sales/Model/Resource/Report/Bestsellers.php
+++ b/app/code/Magento/Sales/Model/Resource/Report/Bestsellers.php
@@ -51,9 +51,7 @@ class Bestsellers extends \Magento\Sales\Model\Resource\Report\AbstractReport
      * @var array
      */
     protected $ignoredProductTypes = array(
-        \Magento\Catalog\Model\Product\Type::TYPE_CONFIGURABLE
-            => \Magento\Catalog\Model\Product\Type::TYPE_CONFIGURABLE,
-        \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE => \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE,
+        \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE => \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE
     );
 
     /**
diff --git a/app/code/Magento/Sales/Model/Resource/Setup.php b/app/code/Magento/Sales/Model/Resource/Setup.php
index 06de721bebb..d26a448a7d6 100644
--- a/app/code/Magento/Sales/Model/Resource/Setup.php
+++ b/app/code/Magento/Sales/Model/Resource/Setup.php
@@ -42,8 +42,8 @@ class Setup extends \Magento\Eav\Model\Entity\Setup
     protected $_encryptor;
 
     /**
-     * @param \Magento\Core\Model\Resource\Setup\Context $context
-     * @param string $resourceName
+     * @param \Magento\Eav\Model\Entity\Setup\Context $context
+     * @param $resourceName
      * @param \Magento\App\CacheInterface $cache
      * @param \Magento\Eav\Model\Resource\Entity\Attribute\Group\CollectionFactory $attrGroupCollectionFactory
      * @param \Magento\App\ConfigInterface $config
@@ -51,7 +51,7 @@ class Setup extends \Magento\Eav\Model\Entity\Setup
      * @param string $connectionName
      */
     public function __construct(
-        \Magento\Core\Model\Resource\Setup\Context $context,
+        \Magento\Eav\Model\Entity\Setup\Context $context,
         $resourceName,
         \Magento\App\CacheInterface $cache,
         \Magento\Eav\Model\Resource\Entity\Attribute\Group\CollectionFactory $attrGroupCollectionFactory,
diff --git a/app/code/Magento/Sales/etc/adminhtml/events.xml b/app/code/Magento/Sales/etc/adminhtml/events.xml
index 7b8070b6dff..15b1da6be0f 100644
--- a/app/code/Magento/Sales/etc/adminhtml/events.xml
+++ b/app/code/Magento/Sales/etc/adminhtml/events.xml
@@ -36,6 +36,9 @@
     <event name="catalog_product_save_after">
         <observer name="sales_quote" instance="Magento\Sales\Model\Observer\Backend\CatalogProductQuote" method="catalogProductSaveAfter" />
     </event>
+    <event name="payment_method_is_active">
+        <observer name="sales_billing_agreement" instance="Magento\Sales\Model\Observer\Backend\BillingAgreement" method="dispatch" />
+    </event>
     <event name="catalog_product_status_update">
         <observer name="sales_quote" instance="Magento\Sales\Model\Observer\Backend\CatalogProductQuote" method="catalogProductStatusUpdate" />
     </event>
diff --git a/app/code/Magento/Sales/etc/di.xml b/app/code/Magento/Sales/etc/di.xml
index 3c57eced987..a9908fac4ee 100644
--- a/app/code/Magento/Sales/etc/di.xml
+++ b/app/code/Magento/Sales/etc/di.xml
@@ -23,44 +23,38 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Sales\Model\Resource\Report" shared="false" />
     <type name="Magento\Sales\Model\Order\Pdf\Config\Reader">
-        <param name="fileName">
-            <value>pdf.xml</value>
-        </param>
-        <param name="converter">
-            <instance type="Magento\Sales\Model\Order\Pdf\Config\Converter" />
-        </param>
-        <param name="schemaLocator">
-            <instance type="Magento\Sales\Model\Order\Pdf\Config\SchemaLocator" />
-        </param>
+        <arguments>
+            <argument name="fileName" xsi:type="string">pdf.xml</argument>
+            <argument name="converter" xsi:type="object">Magento\Sales\Model\Order\Pdf\Config\Converter</argument>
+            <argument name="schemaLocator" xsi:type="object">Magento\Sales\Model\Order\Pdf\Config\SchemaLocator</argument>
+        </arguments>
     </type>
     <virtualType name="pdfConfigDataStorage" type="Magento\Config\Data">
-        <param name="reader">
-            <instance type="Magento\Sales\Model\Order\Pdf\Config\Reader" />
-        </param>
-        <param name="cacheId">
-            <value>sales_pdf_config</value>
-        </param>
+        <arguments>
+            <argument name="reader" xsi:type="object">Magento\Sales\Model\Order\Pdf\Config\Reader</argument>
+            <argument name="cacheId" xsi:type="string">sales_pdf_config</argument>
+        </arguments>
     </virtualType>
     <type name="Magento\Sales\Model\Order\Pdf\Config">
-        <param name="dataStorage">
-            <instance type="pdfConfigDataStorage" />
-        </param>
+        <arguments>
+            <argument name="dataStorage" xsi:type="object">pdfConfigDataStorage</argument>
+        </arguments>
     </type>
-    <type name="Magento\Catalog\Model\Resource\Product\Flat\Indexer">
-        <param name="flatAttributeGroups">
-            <array>
-                <item key="sales_quote_item"><value>sales_quote_item</value></item>
-            </array>
-        </param>
+    <type name="Magento\Catalog\Helper\Product\Flat\Indexer">
+        <arguments>
+            <argument name="flatAttributeGroups" xsi:type="array">
+                <item name="sales_quote_item" xsi:type="string">sales_quote_item</item>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Module\Updater\SetupFactory">
-        <param name="resourceTypes">
-            <array>
-                <item key="sales_setup"><value>Magento\Sales\Model\Resource\Setup</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="resourceTypes" xsi:type="array">
+                <item name="sales_setup" xsi:type="string">Magento\Sales\Model\Resource\Setup</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Sales/etc/frontend/di.xml b/app/code/Magento/Sales/etc/frontend/di.xml
index dc8ac95a7b9..248295f378c 100644
--- a/app/code/Magento/Sales/etc/frontend/di.xml
+++ b/app/code/Magento/Sales/etc/frontend/di.xml
@@ -23,12 +23,12 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Core\Model\Url\SecurityInfo">
-        <param name="secureUrlList">
-            <array>
-                <item key="sales"><value>/sales/</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="secureUrlList" xsi:type="array">
+                <item name="sales" xsi:type="string">/sales/</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Sales/etc/sales.xml b/app/code/Magento/Sales/etc/sales.xml
index 9c9396f7723..e488d13dc6b 100644
--- a/app/code/Magento/Sales/etc/sales.xml
+++ b/app/code/Magento/Sales/etc/sales.xml
@@ -62,6 +62,5 @@
     <order>
         <available_product_type name="simple"/>
         <available_product_type name="virtual"/>
-        <available_product_type name="configurable"/>
     </order>
 </config>
diff --git a/app/code/Magento/Sales/i18n/de_DE.csv b/app/code/Magento/Sales/i18n/de_DE.csv
index aea52cff7a9..8722d77720d 100644
--- a/app/code/Magento/Sales/i18n/de_DE.csv
+++ b/app/code/Magento/Sales/i18n/de_DE.csv
@@ -743,8 +743,8 @@
 "This message will be shown in shopping cart when subtotal after discount less than minimum amount.","Diese Nachricht erscheint im Warenkorb, wenn Zwischensumme nach Rabatt weniger als Mindestbetrag."
 "This operation requires an existing transaction object.","Diese Operation erfordert ein existierendes Transaktionsobjekt."
 "This order contains (%s) items and therefore cannot be edited through the admin interface at this time, if you wish to continue editing the (%s) items will be removed, the order will be canceled and a new order will be placed.","Diese Bestellung enthält (%s) Artikel und kann deshalb nicht mit der Administrator-Oberfläche bearbeitet werden. Wenn Sie fortfahren möchten, werden die (%s) Artikel entfernt, die Bestellung wird gelöscht und eine neue erstellt."
-"This order no longer exists.","Diese Bestellung existiert nicht mehr."
 "This product does not have any configurable options","Dieses Produkt hat keine Einstellungsmöglichkeiten."
+"This order no longer exists.","Diese Bestellung existiert nicht mehr."
 "This profile state cannot be changed to ""%s"".","Dieser Profilstatus kann nicht zu ""%s"" geändert werden."
 "This will create an offline refund. To create an online refund, open an invoice and create credit memo for it. Do you wish to proceed?","Dies erstellt eine Offine Rückerstattung. Um eine Online Rückerstattung zu erstellen, öffnen Sie eine Rechnung und erstellen Sie eine Gutschrift. Wollen Sie fortfahren?"
 "Tier Pricing","Preisebene"
diff --git a/app/code/Magento/Sales/view/adminhtml/layout/sales_order_create_index.xml b/app/code/Magento/Sales/view/adminhtml/layout/sales_order_create_index.xml
index a8bcaffb2ac..e346c6783c1 100644
--- a/app/code/Magento/Sales/view/adminhtml/layout/sales_order_create_index.xml
+++ b/app/code/Magento/Sales/view/adminhtml/layout/sales_order_create_index.xml
@@ -46,11 +46,6 @@
                 <argument name="file" xsi:type="string">Magento_Catalog::catalog/product/composite/configure.js</argument>
             </arguments>
         </block>
-        <block class="Magento\Theme\Block\Html\Head\Script" name="varien-configurable-js">
-            <arguments>
-                <argument name="file" xsi:type="string">varien/configurable.js</argument>
-            </arguments>
-        </block>
         <block class="Magento\Theme\Block\Html\Head\Script" name="magento-adminhtml-sales-order-giftoptions-tooltip-js">
             <arguments>
                 <argument name="file" xsi:type="string">Magento_Sales::order/giftoptions_tooltip.js</argument>
diff --git a/app/code/Magento/Sales/view/adminhtml/order/creditmemo/create/items/renderer/configurable.phtml b/app/code/Magento/Sales/view/adminhtml/order/creditmemo/create/items/renderer/configurable.phtml
deleted file mode 100644
index 6cdc538f094..00000000000
--- a/app/code/Magento/Sales/view/adminhtml/order/creditmemo/create/items/renderer/configurable.phtml
+++ /dev/null
@@ -1,245 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Academic Free License (AFL 3.0)
- * that is bundled with this package in the file LICENSE_AFL.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/afl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    design
- * @package     default_default
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
- */
-?>
-<?php $_item = $this->getItem() ?>
-<?php $this->setPriceDataObject($_item); ?>
-<tr class="border">
-    <td><?php echo $this->getColumnHtml($_item, 'configurable_name') ?></td>
-    <td class="a-right">
-        <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices() || $this->helper('Magento\Tax\Helper\Data')->displaySalesPriceExclTax()): ?>
-            <span class="price-excl-tax">
-                <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices()): ?>
-                    <span class="label"><?php echo __('Excl. Tax'); ?>:</span>
-                <?php endif; ?>
-
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?>
-                    <?php
-                    echo $this->displayPrices(
-                        $_item->getBasePrice()+$_item->getBaseWeeeTaxAppliedAmount()+$_item->getBaseWeeeTaxDisposition(),
-                        $_item->getPrice()+$_item->getWeeeTaxAppliedAmount()+$_item->getWeeeTaxDisposition()
-                    );
-                    ?>
-                <?php else: ?>
-                    <?php echo $this->displayPrices($_item->getBasePrice(), $_item->getPrice()) ?>
-                <?php endif; ?>
-
-
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item)): ?>
-                    <br />
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 1, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_amount'], $tax['amount']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><small><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_amount_incl_tax'], $tax['amount_incl_tax']); ?></small></span>
-                        <?php endforeach; ?>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 4, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_amount_incl_tax'], $tax['amount_incl_tax']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php endif; ?>
-
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <br />
-                        <span class="nobr"><?php echo __('Total'); ?>:<br />
-                        <?php
-                        echo $this->displayPrices(
-                            $_item->getBasePrice()+$_item->getBaseWeeeTaxAppliedAmount()+$_item->getBaseWeeeTaxDisposition(),
-                            $_item->getPrice()+$_item->getWeeeTaxAppliedAmount()+$_item->getWeeeTaxDisposition()
-                        );
-                        ?>
-                        </span>
-                    <?php endif; ?>
-                <?php endif; ?>
-            </span>
-            <br />
-        <?php endif; ?>
-        <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices() || $this->helper('Magento\Tax\Helper\Data')->displaySalesPriceInclTax()): ?>
-            <span class="price-incl-tax">
-                <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices()): ?>
-                    <span class="label"><?php echo __('Incl. Tax'); ?>:</span>
-                <?php endif; ?>
-                <?php $_incl = $this->helper('Magento\Checkout\Helper\Data')->getPriceInclTax($_item); ?>
-                <?php $_baseIncl = $this->helper('Magento\Checkout\Helper\Data')->getBasePriceInclTax($_item); ?>
-
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?>
-                    <?php echo $this->displayPrices($_baseIncl+$_item->getBaseWeeeTaxAppliedAmount(), $_incl+$_item->getWeeeTaxAppliedAmount()); ?>
-                <?php else: ?>
-                    <?php echo $this->displayPrices($_baseIncl-$_item->getBaseWeeeTaxDisposition(), $_incl-$_item->getWeeeTaxDisposition()) ?>
-                <?php endif; ?>
-
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item)): ?>
-                    <br />
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 1, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_amount'], $tax['amount']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><small><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_amount_incl_tax'], $tax['amount_incl_tax']); ?></small></span>
-                        <?php endforeach; ?>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 4, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_amount_incl_tax'], $tax['amount_incl_tax']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php endif; ?>
-
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <br />
-                        <span class="nobr"><?php echo __('Total'); ?>:<br /> <?php echo $this->displayPrices($_baseIncl+$_item->getBaseWeeeTaxAppliedAmount(), $_incl+$_item->getWeeeTaxAppliedAmount()); ?></span>
-                    <?php endif; ?>
-                <?php endif; ?>
-            </span>
-        <?php endif; ?>
-    </td>
-    <td class="a-center"><?php echo $this->getColumnHtml($_item, 'qty') ?></td>
-    <?php if ($this->canParentReturnToStock($_item)) : ?>
-        <td class="a-center">
-        <?php if ($this->canReturnItemToStock($_item)) : ?>
-            <input type="checkbox" name="creditmemo[items][<?php echo $_item->getOrderItemId() ?>][back_to_stock]" value="1"<?php if ($_item->getBackToStock()):?> checked<?php endif;?>/>
-        <?php endif; ?>
-        </td>
-    <?php endif; ?>
-    <td class="a-center">
-    <?php if ($this->canEditQty()) : ?>
-        <input type="text" class="input-text qty-input" name="creditmemo[items][<?php echo $_item->getOrderItemId() ?>][qty]" value="<?php echo $_item->getQty()*1 ?>"/>
-    <?php else : ?>
-        <?php echo $_item->getQty()*1 ?>
-    <?php endif; ?>
-    </td>
-    <td class="a-right">
-        <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices() || $this->helper('Magento\Tax\Helper\Data')->displaySalesPriceExclTax()): ?>
-            <span class="price-excl-tax">
-                <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices()): ?>
-                    <span class="label"><?php echo __('Excl. Tax'); ?>:</span>
-                <?php endif; ?>
-
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?>
-                    <?php
-                    echo $this->displayPrices(
-                        $_item->getBaseRowTotal()+$_item->getBaseWeeeTaxAppliedRowAmnt()+$_item->getBaseWeeeTaxRowDisposition(),
-                        $_item->getRowTotal()+$_item->getWeeeTaxAppliedRowAmount()+$_item->getWeeeTaxRowDisposition()
-                    );
-                    ?>
-                <?php else: ?>
-                    <?php echo $this->displayPrices($_item->getBaseRowTotal(), $_item->getRowTotal()) ?>
-                <?php endif; ?>
-
-
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item)): ?>
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 1, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_row_amount'], $tax['row_amount']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><small><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_row_amount_incl_tax'], $tax['row_amount_incl_tax']); ?></small></span>
-                        <?php endforeach; ?>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 4, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_row_amount_incl_tax'], $tax['row_amount_incl_tax']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php endif; ?>
-
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <br />
-                        <span class="nobr"><?php echo __('Total'); ?>:<br />
-                        <?php
-                        echo $this->displayPrices(
-                            $_item->getBaseRowTotal()+$_item->getBaseWeeeTaxAppliedRowAmnt()+$_item->getBaseWeeeTaxRowDisposition(),
-                            $_item->getRowTotal()+$_item->getWeeeTaxAppliedRowAmount()+$_item->getWeeeTaxRowDisposition()
-                        );
-                        ?>
-                        </span>
-                    <?php endif; ?>
-                <?php endif; ?>
-            </span>
-            <br />
-        <?php endif; ?>
-        <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices() || $this->helper('Magento\Tax\Helper\Data')->displaySalesPriceInclTax()): ?>
-            <span class="price-incl-tax">
-                <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices()): ?>
-                    <span class="label"><?php echo __('Incl. Tax'); ?>:</span>
-                <?php endif; ?>
-                <?php $_incl = $this->helper('Magento\Checkout\Helper\Data')->getSubtotalInclTax($_item); ?>
-                <?php $_baseIncl = $this->helper('Magento\Checkout\Helper\Data')->getBaseSubtotalInclTax($_item); ?>
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?>
-                    <?php echo $this->displayPrices($_baseIncl+$_item->getBaseWeeeTaxAppliedRowAmnt(), $_incl+$_item->getWeeeTaxAppliedRowAmount()); ?>
-                <?php else: ?>
-                    <?php echo $this->displayPrices($_baseIncl-$_item->getBaseWeeeTaxRowDisposition(), $_incl-$_item->getWeeeTaxRowDisposition()) ?>
-                <?php endif; ?>
-
-
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item)): ?>
-
-                    <br />
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 1, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_row_amount'], $tax['row_amount']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><small><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_row_amount_incl_tax'], $tax['row_amount_incl_tax']); ?></small></span>
-                        <?php endforeach; ?>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 4, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_row_amount_incl_tax'], $tax['row_amount_incl_tax']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php endif; ?>
-
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <br /><span class="nobr"><?php echo __('Total'); ?>:<br /> <?php echo $this->displayPrices($_baseIncl+$_item->getBaseWeeeTaxAppliedRowAmount(), $_incl+$_item->getWeeeTaxAppliedRowAmount()); ?></span>
-                    <?php endif; ?>
-                <?php endif; ?>
-            </span>
-        <?php endif; ?>
-    </td>
-    <td class="a-right"><?php echo $this->displayPriceAttribute('tax_amount') ?></td>
-    <td class="a-right"><?php echo $this->displayPriceAttribute('discount_amount') ?></td>
-    <td class="a-right last">
-        <?php echo $this->displayPrices(
-            $_item->getBaseRowTotal()+$_item->getBaseTaxAmount()-$_item->getBaseDiscountAmount()+$_item->getBaseWeeeTaxAppliedRowAmnt(),
-            $_item->getRowTotal()+$_item->getTaxAmount()-$_item->getDiscountAmount()+$_item->getWeeeTaxAppliedRowAmount()
-        ) ?>
-    </td>
-</tr>
diff --git a/app/code/Magento/Sales/view/adminhtml/order/creditmemo/view/items/renderer/configurable.phtml b/app/code/Magento/Sales/view/adminhtml/order/creditmemo/view/items/renderer/configurable.phtml
deleted file mode 100644
index 864650516a5..00000000000
--- a/app/code/Magento/Sales/view/adminhtml/order/creditmemo/view/items/renderer/configurable.phtml
+++ /dev/null
@@ -1,232 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Academic Free License (AFL 3.0)
- * that is bundled with this package in the file LICENSE_AFL.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/afl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    design
- * @package     default_default
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
- */
-?>
-<?php $_item = $this->getItem() ?>
-<?php $this->setPriceDataObject($_item) ?>
-<tr class="border">
-    <td><?php echo $this->getColumnHtml($_item, 'configurable_name') ?></td>
-    <td class="a-right">
-        <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices() || $this->helper('Magento\Tax\Helper\Data')->displaySalesPriceExclTax()): ?>
-            <span class="price-excl-tax">
-                <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices()): ?>
-                    <span class="label"><?php echo __('Excl. Tax'); ?>:</span>
-                <?php endif; ?>
-
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?>
-                    <?php
-                    echo $this->displayPrices(
-                        $_item->getBasePrice()+$_item->getBaseWeeeTaxAppliedAmount()+$_item->getBaseWeeeTaxDisposition(),
-                        $_item->getPrice()+$_item->getWeeeTaxAppliedAmount()+$_item->getWeeeTaxDisposition()
-                    );
-                    ?>
-                <?php else: ?>
-                    <?php echo $this->displayPrices($_item->getBasePrice(), $_item->getPrice()) ?>
-                <?php endif; ?>
-
-
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item)): ?>
-                    <br />
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 1, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_amount'], $tax['amount']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><small><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_amount_incl_tax'], $tax['amount_incl_tax']); ?></small></span>
-                        <?php endforeach; ?>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 4, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_amount_incl_tax'], $tax['amount_incl_tax']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php endif; ?>
-
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <br />
-                        <span class="nobr"><?php echo __('Total'); ?>:<br />
-                        <?php
-                        echo $this->displayPrices(
-                            $_item->getBasePrice()+$_item->getBaseWeeeTaxAppliedAmount()+$_item->getBaseWeeeTaxDisposition(),
-                            $_item->getPrice()+$_item->getWeeeTaxAppliedAmount()+$_item->getWeeeTaxDisposition()
-                        );
-                        ?>
-                        </span>
-                    <?php endif; ?>
-                <?php endif; ?>
-            </span>
-            <br />
-        <?php endif; ?>
-        <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices() || $this->helper('Magento\Tax\Helper\Data')->displaySalesPriceInclTax()): ?>
-            <span class="price-incl-tax">
-                <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices()): ?>
-                    <span class="label"><?php echo __('Incl. Tax'); ?>:</span>
-                <?php endif; ?>
-                <?php $_incl = $this->helper('Magento\Checkout\Helper\Data')->getPriceInclTax($_item); ?>
-                <?php $_baseIncl = $this->helper('Magento\Checkout\Helper\Data')->getBasePriceInclTax($_item); ?>
-
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?>
-                    <?php echo $this->displayPrices($_baseIncl+$_item->getBaseWeeeTaxAppliedAmount(), $_incl+$_item->getWeeeTaxAppliedAmount()); ?>
-                <?php else: ?>
-                    <?php echo $this->displayPrices($_baseIncl-$_item->getBaseWeeeTaxDisposition(), $_incl-$_item->getWeeeTaxDisposition()) ?>
-                <?php endif; ?>
-
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item)): ?>
-                    <br />
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 1, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_amount'], $tax['amount']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><small><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_amount_incl_tax'], $tax['amount_incl_tax']); ?></small></span>
-                        <?php endforeach; ?>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 4, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_amount_incl_tax'], $tax['amount_incl_tax']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php endif; ?>
-
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <br />
-                        <span class="nobr"><?php echo __('Total'); ?>:<br /> <?php echo $this->displayPrices($_baseIncl+$_item->getBaseWeeeTaxAppliedAmount(), $_incl+$_item->getWeeeTaxAppliedAmount()); ?></span>
-                    <?php endif; ?>
-                <?php endif; ?>
-            </span>
-        <?php endif; ?>
-
-    </td>
-    <td class="a-center"><?php echo $_item->getQty()*1 ?></td>
-    <td class="a-right">
-        <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices() || $this->helper('Magento\Tax\Helper\Data')->displaySalesPriceExclTax()): ?>
-            <span class="price-excl-tax">
-                <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices()): ?>
-                    <span class="label"><?php echo __('Excl. Tax'); ?>:</span>
-                <?php endif; ?>
-
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?>
-                    <?php
-                    echo $this->displayPrices(
-                        $_item->getBaseRowTotal()+$_item->getBaseWeeeTaxAppliedRowAmnt()+$_item->getBaseWeeeTaxRowDisposition(),
-                        $_item->getRowTotal()+$_item->getWeeeTaxAppliedRowAmount()+$_item->getWeeeTaxRowDisposition()
-                    );
-                    ?>
-                <?php else: ?>
-                    <?php echo $this->displayPrices($_item->getBaseRowTotal(), $_item->getRowTotal()) ?>
-                <?php endif; ?>
-
-
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item)): ?>
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 1, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_row_amount'], $tax['row_amount']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><small><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_row_amount_incl_tax'], $tax['row_amount_incl_tax']); ?></small></span>
-                        <?php endforeach; ?>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 4, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_row_amount_incl_tax'], $tax['row_amount_incl_tax']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php endif; ?>
-
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <br />
-                        <span class="nobr"><?php echo __('Total'); ?>:<br />
-                        <?php
-                        echo $this->displayPrices(
-                            $_item->getBaseRowTotal()+$_item->getBaseWeeeTaxAppliedRowAmnt()+$_item->getBaseWeeeTaxRowDisposition(),
-                            $_item->getRowTotal()+$_item->getWeeeTaxAppliedRowAmount()+$_item->getWeeeTaxRowDisposition()
-                        );
-                        ?>
-                        </span>
-                    <?php endif; ?>
-                <?php endif; ?>
-            </span>
-            <br />
-        <?php endif; ?>
-        <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices() || $this->helper('Magento\Tax\Helper\Data')->displaySalesPriceInclTax()): ?>
-            <span class="price-incl-tax">
-                <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices()): ?>
-                    <span class="label"><?php echo __('Incl. Tax'); ?>:</span>
-                <?php endif; ?>
-                <?php $_incl = $this->helper('Magento\Checkout\Helper\Data')->getSubtotalInclTax($_item); ?>
-                <?php $_baseIncl = $this->helper('Magento\Checkout\Helper\Data')->getBaseSubtotalInclTax($_item); ?>
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?>
-                    <?php echo $this->displayPrices($_baseIncl+$_item->getBaseWeeeTaxAppliedRowAmnt(), $_incl+$_item->getWeeeTaxAppliedRowAmount()); ?>
-                <?php else: ?>
-                    <?php echo $this->displayPrices($_baseIncl-$_item->getBaseWeeeTaxRowDisposition(), $_incl-$_item->getWeeeTaxRowDisposition()) ?>
-                <?php endif; ?>
-
-
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item)): ?>
-
-                    <br />
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 1, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_row_amount'], $tax['row_amount']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><small><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_row_amount_incl_tax'], $tax['row_amount_incl_tax']); ?></small></span>
-                        <?php endforeach; ?>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 4, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_row_amount_incl_tax'], $tax['row_amount_incl_tax']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php endif; ?>
-
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <br /><span class="nobr"><?php echo __('Total'); ?>:<br /> <?php echo $this->displayPrices($_baseIncl+$_item->getBaseWeeeTaxAppliedRowAmount(), $_incl+$_item->getWeeeTaxAppliedRowAmount()); ?></span>
-                    <?php endif; ?>
-                <?php endif; ?>
-            </span>
-        <?php endif; ?>
-    </td>
-    <td class="a-right"><?php echo $this->displayPriceAttribute('tax_amount') ?></td>
-    <td class="a-right"><?php echo $this->displayPriceAttribute('discount_amount') ?></td>
-    <td class="a-right last">
-        <?php echo $this->displayPrices(
-            $_item->getBaseRowTotal()-$_item->getBaseDiscountAmount()+$_item->getBaseTaxAmount()+$_item->getBaseWeeeTaxAppliedRowAmnt(),
-            $_item->getRowTotal()-$_item->getDiscountAmount()+$_item->getTaxAmount()+$_item->getWeeeTaxAppliedRowAmount()
-        ) ?>
-    </td>
-</tr>
diff --git a/app/code/Magento/Sales/view/adminhtml/order/invoice/create/items/renderer/configurable.phtml b/app/code/Magento/Sales/view/adminhtml/order/invoice/create/items/renderer/configurable.phtml
deleted file mode 100644
index cdd7f4a6f16..00000000000
--- a/app/code/Magento/Sales/view/adminhtml/order/invoice/create/items/renderer/configurable.phtml
+++ /dev/null
@@ -1,239 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Academic Free License (AFL 3.0)
- * that is bundled with this package in the file LICENSE_AFL.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/afl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    design
- * @package     default_default
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
- */
-?>
-<?php $_item = $this->getItem() ?>
-<?php $this->setPriceDataObject($_item)?>
-<tr class="border">
-    <td><?php echo $this->getColumnHtml($_item, 'configurable_name') ?></td>
-    <td class="a-right">
-        <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices() || $this->helper('Magento\Tax\Helper\Data')->displaySalesPriceExclTax()): ?>
-            <span class="price-excl-tax">
-                <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices()): ?>
-                    <span class="label"><?php echo __('Excl. Tax'); ?>:</span>
-                <?php endif; ?>
-
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?>
-                    <?php
-                    echo $this->displayPrices(
-                        $_item->getBasePrice()+$_item->getBaseWeeeTaxAppliedAmount()+$_item->getBaseWeeeTaxDisposition(),
-                        $_item->getPrice()+$_item->getWeeeTaxAppliedAmount()+$_item->getWeeeTaxDisposition()
-                    );
-                    ?>
-                <?php else: ?>
-                    <?php echo $this->displayPrices($_item->getBasePrice(), $_item->getPrice()) ?>
-                <?php endif; ?>
-
-
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item)): ?>
-                    <br />
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 1, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_amount'], $tax['amount']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><small><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_amount_incl_tax'], $tax['amount_incl_tax']); ?></small></span>
-                        <?php endforeach; ?>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 4, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_amount_incl_tax'], $tax['amount_incl_tax']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php endif; ?>
-
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <br />
-                        <span class="nobr"><?php echo __('Total'); ?>:<br />
-                        <?php
-                        echo $this->displayPrices(
-                            $_item->getBasePrice()+$_item->getBaseWeeeTaxAppliedAmount()+$_item->getBaseWeeeTaxDisposition(),
-                            $_item->getPrice()+$_item->getWeeeTaxAppliedAmount()+$_item->getWeeeTaxDisposition()
-                        );
-                        ?>
-                        </span>
-                    <?php endif; ?>
-                <?php endif; ?>
-            </span>
-            <br />
-        <?php endif; ?>
-        <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices() || $this->helper('Magento\Tax\Helper\Data')->displaySalesPriceInclTax()): ?>
-            <span class="price-incl-tax">
-                <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices()): ?>
-                    <span class="label"><?php echo __('Incl. Tax'); ?>:</span>
-                <?php endif; ?>
-                <?php $_incl = $this->helper('Magento\Checkout\Helper\Data')->getPriceInclTax($_item); ?>
-                <?php $_baseIncl = $this->helper('Magento\Checkout\Helper\Data')->getBasePriceInclTax($_item); ?>
-
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?>
-                    <?php echo $this->displayPrices($_baseIncl+$_item->getBaseWeeeTaxAppliedAmount(), $_incl+$_item->getWeeeTaxAppliedAmount()); ?>
-                <?php else: ?>
-                    <?php echo $this->displayPrices($_baseIncl-$_item->getBaseWeeeTaxDisposition(), $_incl-$_item->getWeeeTaxDisposition()) ?>
-                <?php endif; ?>
-
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item)): ?>
-                    <br />
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 1, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_amount'], $tax['amount']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><small><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_amount_incl_tax'], $tax['amount_incl_tax']); ?></small></span>
-                        <?php endforeach; ?>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 4, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_amount_incl_tax'], $tax['amount_incl_tax']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php endif; ?>
-
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <br />
-                        <span class="nobr"><?php echo __('Total'); ?>:<br /> <?php echo $this->displayPrices($_baseIncl+$_item->getBaseWeeeTaxAppliedAmount(), $_incl+$_item->getWeeeTaxAppliedAmount()); ?></span>
-                    <?php endif; ?>
-                <?php endif; ?>
-            </span>
-        <?php endif; ?>
-
-    </td>
-    <td class="a-center"><?php echo $this->getColumnHtml($_item, 'qty') ?></td>
-    <td class="a-center">
-    <?php if ($this->canEditQty()) : ?>
-        <input type="text" class="input-text qty-input" name="invoice[items][<?php echo $_item->getOrderItemId() ?>]" value="<?php echo $_item->getQty()*1 ?>"/>
-    <?php else : ?>
-        <?php echo $_item->getQty()*1 ?>
-    <?php endif; ?>
-    </td>
-    <td class="a-right">
-        <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices() || $this->helper('Magento\Tax\Helper\Data')->displaySalesPriceExclTax()): ?>
-            <span class="price-excl-tax">
-                <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices()): ?>
-                    <span class="label"><?php echo __('Excl. Tax'); ?>:</span>
-                <?php endif; ?>
-
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?>
-                    <?php
-                    echo $this->displayPrices(
-                        $_item->getBaseRowTotal()+$_item->getBaseWeeeTaxAppliedRowAmnt()+$_item->getBaseWeeeTaxRowDisposition(),
-                        $_item->getRowTotal()+$_item->getWeeeTaxAppliedRowAmount()+$_item->getWeeeTaxRowDisposition()
-                    );
-                    ?>
-                <?php else: ?>
-                    <?php echo $this->displayPrices($_item->getBaseRowTotal(), $_item->getRowTotal()) ?>
-                <?php endif; ?>
-
-
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item)): ?>
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 1, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_row_amount'], $tax['row_amount']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><small><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_row_amount_incl_tax'], $tax['row_amount_incl_tax']); ?></small></span>
-                        <?php endforeach; ?>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 4, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_row_amount_incl_tax'], $tax['row_amount_incl_tax']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php endif; ?>
-
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <br />
-                        <span class="nobr"><?php echo __('Total'); ?>:<br />
-                        <?php
-                        echo $this->displayPrices(
-                            $_item->getBaseRowTotal()+$_item->getBaseWeeeTaxAppliedRowAmnt()+$_item->getBaseWeeeTaxRowDisposition(),
-                            $_item->getRowTotal()+$_item->getWeeeTaxAppliedRowAmount()+$_item->getWeeeTaxRowDisposition()
-                        );
-                        ?>
-                        </span>
-                    <?php endif; ?>
-                <?php endif; ?>
-            </span>
-            <br />
-        <?php endif; ?>
-        <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices() || $this->helper('Magento\Tax\Helper\Data')->displaySalesPriceInclTax()): ?>
-            <span class="price-incl-tax">
-                <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices()): ?>
-                    <span class="label"><?php echo __('Incl. Tax'); ?>:</span>
-                <?php endif; ?>
-                <?php $_incl = $this->helper('Magento\Checkout\Helper\Data')->getSubtotalInclTax($_item); ?>
-                <?php $_baseIncl = $this->helper('Magento\Checkout\Helper\Data')->getBaseSubtotalInclTax($_item); ?>
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?>
-                    <?php echo $this->displayPrices($_baseIncl+$_item->getBaseWeeeTaxAppliedRowAmnt(), $_incl+$_item->getWeeeTaxAppliedRowAmount()); ?>
-                <?php else: ?>
-                    <?php echo $this->displayPrices($_baseIncl-$_item->getBaseWeeeTaxRowDisposition(), $_incl-$_item->getWeeeTaxRowDisposition()) ?>
-                <?php endif; ?>
-
-
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item)): ?>
-
-                    <br />
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 1, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_row_amount'], $tax['row_amount']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><small><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_row_amount_incl_tax'], $tax['row_amount_incl_tax']); ?></small></span>
-                        <?php endforeach; ?>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 4, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_row_amount_incl_tax'], $tax['row_amount_incl_tax']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php endif; ?>
-
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <br /><span class="nobr"><?php echo __('Total'); ?>:<br /> <?php echo $this->displayPrices($_baseIncl+$_item->getBaseWeeeTaxAppliedRowAmnt(), $_incl+$_item->getWeeeTaxAppliedRowAmount()); ?></span>
-                    <?php endif; ?>
-                <?php endif; ?>
-            </span>
-        <?php endif; ?>
-    </td>
-    <td class="a-right"><?php echo $this->displayPriceAttribute('tax_amount') ?></td>
-    <td class="a-right"><?php echo $this->displayPriceAttribute('discount_amount') ?></td>
-    <td class="a-right last">
-        <?php echo $this->displayPrices(
-            $_item->getBaseRowTotal()+$_item->getBaseTaxAmount()-$_item->getBaseDiscountAmount()+$_item->getBaseWeeeTaxAppliedRowAmnt(),
-            $_item->getRowTotal()+$_item->getTaxAmount()-$_item->getDiscountAmount()+$_item->getWeeeTaxAppliedRowAmount()
-        ) ?>
-    </td>
-</tr>
diff --git a/app/code/Magento/Sales/view/adminhtml/order/invoice/view/items/renderer/configurable.phtml b/app/code/Magento/Sales/view/adminhtml/order/invoice/view/items/renderer/configurable.phtml
deleted file mode 100644
index efe96035376..00000000000
--- a/app/code/Magento/Sales/view/adminhtml/order/invoice/view/items/renderer/configurable.phtml
+++ /dev/null
@@ -1,235 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Academic Free License (AFL 3.0)
- * that is bundled with this package in the file LICENSE_AFL.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/afl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    design
- * @package     default_default
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
- */
-?>
-<?php $_item = $this->getItem() ?>
-<?php $this->setPriceDataObject($_item)?>
-<tr>
-    <td class="col-product"><?php echo $this->getColumnHtml($_item, 'configurable_name') ?></td>
-    <td class="col-price">
-        <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices() || $this->helper('Magento\Tax\Helper\Data')->displaySalesPriceExclTax()): ?>
-            <span class="price-excl-tax">
-                <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices()): ?>
-                    <span class="label"><?php echo __('Excl. Tax'); ?>:</span>
-                <?php endif; ?>
-
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?>
-                    <?php
-                    echo $this->displayPrices(
-                        $_item->getBasePrice()+$_item->getBaseWeeeTaxAppliedAmount()+$_item->getBaseWeeeTaxDisposition(),
-                        $_item->getPrice()+$_item->getWeeeTaxAppliedAmount()+$_item->getWeeeTaxDisposition()
-                    );
-                    ?>
-                <?php else: ?>
-                    <?php echo $this->displayPrices($_item->getBasePrice(), $_item->getPrice()) ?>
-                <?php endif; ?>
-
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item)): ?>
-                    <br />
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 1, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_amount'], $tax['amount']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><small><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_amount_incl_tax'], $tax['amount_incl_tax']); ?></small></span>
-                        <?php endforeach; ?>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 4, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_amount_incl_tax'], $tax['amount_incl_tax']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php endif; ?>
-
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <br />
-                        <span class="nobr"><?php echo __('Total'); ?>:<br />
-                        <?php
-                        echo $this->displayPrices(
-                            $_item->getBasePrice()+$_item->getBaseWeeeTaxAppliedAmount()+$_item->getBaseWeeeTaxDisposition(),
-                            $_item->getPrice()+$_item->getWeeeTaxAppliedAmount()+$_item->getWeeeTaxDisposition()
-                        );
-                        ?>
-                        </span>
-                    <?php endif; ?>
-                <?php endif; ?>
-            </span>
-            <br />
-        <?php endif; ?>
-        <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices() || $this->helper('Magento\Tax\Helper\Data')->displaySalesPriceInclTax()): ?>
-            <span class="price-incl-tax">
-                <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices()): ?>
-                    <span class="label"><?php echo __('Incl. Tax'); ?>:</span>
-                <?php endif; ?>
-                <?php $_incl = $this->helper('Magento\Checkout\Helper\Data')->getPriceInclTax($_item); ?>
-                <?php $_baseIncl = $this->helper('Magento\Checkout\Helper\Data')->getBasePriceInclTax($_item); ?>
-
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?>
-                    <?php echo $this->displayPrices($_baseIncl+$_item->getBaseWeeeTaxAppliedAmount(), $_incl+$_item->getWeeeTaxAppliedAmount()); ?>
-                <?php else: ?>
-                    <?php echo $this->displayPrices($_baseIncl-$_item->getBaseWeeeTaxDisposition(), $_incl-$_item->getWeeeTaxDisposition()) ?>
-                <?php endif; ?>
-
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item)): ?>
-                    <br />
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 1, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_amount'], $tax['amount']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><small><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_amount_incl_tax'], $tax['amount_incl_tax']); ?></small></span>
-                        <?php endforeach; ?>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 4, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_amount_incl_tax'], $tax['amount_incl_tax']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php endif; ?>
-
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <br />
-                        <span class="nobr"><?php echo __('Total'); ?>:<br /> <?php echo $this->displayPrices($_baseIncl+$_item->getBaseWeeeTaxAppliedAmount(), $_incl+$_item->getWeeeTaxAppliedAmount()); ?></span>
-                    <?php endif; ?>
-                <?php endif; ?>
-            </span>
-        <?php endif; ?>
-    </td>
-    <td class="col-qty"><?php echo $this->getColumnHtml($_item, 'qty') ?></td>
-    <td class="a-center">
-    <?php if ($this->canEditQty()) : ?>
-        <input type="text" class="input-text qty-input" name="invoice[items][<?php echo $_item->getOrderItemId() ?>]" value="<?php echo $_item->getQty()*1 ?>"/>
-    <?php else : ?>
-        <?php echo $_item->getQty()*1 ?>
-    <?php endif; ?>
-    </td>
-    <td class="col-subtotal">
-        <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices() || $this->helper('Magento\Tax\Helper\Data')->displaySalesPriceExclTax()): ?>
-            <span class="price-excl-tax">
-                <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices()): ?>
-                    <span class="label"><?php echo __('Excl. Tax'); ?>:</span>
-                <?php endif; ?>
-
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?>
-                    <?php
-                    echo $this->displayPrices(
-                        $_item->getBaseRowTotal()+$_item->getBaseWeeeTaxAppliedRowAmnt()+$_item->getBaseWeeeTaxRowDisposition(),
-                        $_item->getRowTotal()+$_item->getWeeeTaxAppliedRowAmount()+$_item->getWeeeTaxRowDisposition()
-                    );
-                    ?>
-                <?php else: ?>
-                    <?php echo $this->displayPrices($_item->getBaseRowTotal(), $_item->getRowTotal()) ?>
-                <?php endif; ?>
-
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item)): ?>
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 1, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_row_amount'], $tax['row_amount']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><small><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_row_amount_incl_tax'], $tax['row_amount_incl_tax']); ?></small></span>
-                        <?php endforeach; ?>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 4, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_row_amount_incl_tax'], $tax['row_amount_incl_tax']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php endif; ?>
-
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <br />
-                        <span class="nobr"><?php echo __('Total'); ?>:<br />
-                        <?php
-                        echo $this->displayPrices(
-                            $_item->getBaseRowTotal()+$_item->getBaseWeeeTaxAppliedRowAmnt()+$_item->getBaseWeeeTaxRowDisposition(),
-                            $_item->getRowTotal()+$_item->getWeeeTaxAppliedRowAmount()+$_item->getWeeeTaxRowDisposition()
-                        );
-                        ?>
-                        </span>
-                    <?php endif; ?>
-                <?php endif; ?>
-            </span>
-            <br />
-        <?php endif; ?>
-        <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices() || $this->helper('Magento\Tax\Helper\Data')->displaySalesPriceInclTax()): ?>
-            <span class="price-incl-tax">
-                <?php if ($this->helper('Magento\Tax\Helper\Data')->displaySalesBothPrices()): ?>
-                    <span class="label"><?php echo __('Incl. Tax'); ?>:</span>
-                <?php endif; ?>
-                <?php $_incl = $this->helper('Magento\Checkout\Helper\Data')->getSubtotalInclTax($_item); ?>
-                <?php $_baseIncl = $this->helper('Magento\Checkout\Helper\Data')->getBaseSubtotalInclTax($_item); ?>
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, array(0, 1, 4), 'sales')): ?>
-                    <?php echo $this->displayPrices($_baseIncl+$_item->getBaseWeeeTaxAppliedRowAmnt(), $_incl+$_item->getWeeeTaxAppliedRowAmount()); ?>
-                <?php else: ?>
-                    <?php echo $this->displayPrices($_baseIncl-$_item->getBaseWeeeTaxRowDisposition(), $_incl-$_item->getWeeeTaxRowDisposition()) ?>
-                <?php endif; ?>
-
-                <?php if ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item)): ?>
-
-                    <br />
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 1, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_row_amount'], $tax['row_amount']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><small><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_row_amount_incl_tax'], $tax['row_amount_incl_tax']); ?></small></span>
-                        <?php endforeach; ?>
-                    <?php elseif ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 4, 'sales')): ?>
-                        <small>
-                        <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($_item) as $tax): ?>
-                            <span class="nobr"><?php echo $tax['title']; ?>: <?php echo $this->displayPrices($tax['base_row_amount_incl_tax'], $tax['row_amount_incl_tax']); ?></span>
-                        <?php endforeach; ?>
-                        </small>
-                    <?php endif; ?>
-
-                    <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay($_item, 2, 'sales')): ?>
-                        <br /><span class="nobr"><?php echo __('Total'); ?>:<br /> <?php echo $this->displayPrices($_baseIncl+$_item->getBaseWeeeTaxAppliedRowAmount(), $_incl+$_item->getWeeeTaxAppliedRowAmount()); ?></span>
-                    <?php endif; ?>
-                <?php endif; ?>
-            </span>
-        <?php endif; ?>
-    </td>
-    <td class="col-tax"><?php echo $this->displayPriceAttribute('tax_amount') ?></td>
-    <td class="col-discount"><?php echo $this->displayPriceAttribute('discount_amount') ?></td>
-    <td class="col-total last">
-        <?php echo $this->displayPrices(
-            $_item->getBaseRowTotal()+$_item->getBaseTaxAmount()-$_item->getBaseDiscountAmount()+$_item->getBaseWeeeTaxAppliedRowAmnt(),
-            $_item->getRowTotal()+$_item->getTaxAmount()-$_item->getDiscountAmount()+$_item->getWeeeTaxAppliedRowAmount()
-        ) ?>
-    </td>
-</tr>
diff --git a/app/code/Magento/SalesRule/Model/Rule/Condition/Product.php b/app/code/Magento/SalesRule/Model/Rule/Condition/Product.php
index 866222b24c5..833b95913ce 100644
--- a/app/code/Magento/SalesRule/Model/Rule/Condition/Product.php
+++ b/app/code/Magento/SalesRule/Model/Rule/Condition/Product.php
@@ -87,6 +87,7 @@ class Product extends \Magento\Rule\Model\Condition\Product\AbstractProduct
      */
     public function validate(\Magento\Object $object)
     {
+        //@todo reimplement this method when is fixed MAGETWO-5713
         /** @var \Magento\Catalog\Model\Product $product */
         $product = $object->getProduct();
         if (!($product instanceof \Magento\Catalog\Model\Product)) {
@@ -97,12 +98,6 @@ class Product extends \Magento\Rule\Model\Condition\Product\AbstractProduct
             ->setQuoteItemPrice($object->getPrice()) // possible bug: need to use $object->getBasePrice()
             ->setQuoteItemRowTotal($object->getBaseRowTotal());
 
-        $valid = parent::validate($product);
-        if (!$valid && $product->getTypeId() == \Magento\Catalog\Model\Product\Type\Configurable::TYPE_CODE) {
-            $children = $object->getChildren();
-            $valid = $children && $this->validate($children[0]);
-        }
-
-        return $valid;
+        return parent::validate($product);
     }
 }
diff --git a/app/code/Magento/SalesRule/etc/adminhtml/di.xml b/app/code/Magento/SalesRule/etc/adminhtml/di.xml
index 09cab679ac0..3b79b4784d5 100644
--- a/app/code/Magento/SalesRule/etc/adminhtml/di.xml
+++ b/app/code/Magento/SalesRule/etc/adminhtml/di.xml
@@ -23,19 +23,17 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\SalesRule\Helper\Coupon">
-        <param name="couponParameters">
-            <array>
-                <item key="separator"><value>-</value></item>
-                <item key="charset">
-                    <array>
-                        <item key="alphanum"><value>ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789</value></item>
-                        <item key="alpha"><value>ABCDEFGHIJKLMNOPQRSTUVWXYZ</value></item>
-                        <item key="num"><value>0123456789</value></item>
-                    </array>
+        <arguments>
+            <argument name="couponParameters" xsi:type="array">
+                <item name="separator" xsi:type="string">-</item>
+                <item name="charset" xsi:type="array">
+                    <item name="alphanum" xsi:type="string">ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789</item>
+                    <item name="alpha" xsi:type="string">ABCDEFGHIJKLMNOPQRSTUVWXYZ</item>
+                    <item name="num" xsi:type="string">0123456789</item>
                 </item>
-            </array>
-        </param>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/SalesRule/etc/di.xml b/app/code/Magento/SalesRule/etc/di.xml
index 2f86d60345d..4131ef30975 100644
--- a/app/code/Magento/SalesRule/etc/di.xml
+++ b/app/code/Magento/SalesRule/etc/di.xml
@@ -23,16 +23,16 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\SalesRule\Model\Resource\Rule\Collection" shared="false" />
     <type name="Magento\Sales\Model\Quote\Config">
         <plugin name="append_sales_rule_keys_to_quote" type="Magento\SalesRule\Model\Plugin\QuoteConfigProductAttributes"/>
     </type>
     <type name="Magento\Module\Updater\SetupFactory">
-        <param name="resourceTypes">
-            <array>
-                <item key="salesrule_setup"><value>Magento\SalesRule\Model\Resource\Setup</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="resourceTypes" xsi:type="array">
+                <item name="salesrule_setup" xsi:type="string">Magento\SalesRule\Model\Resource\Setup</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Shipping/Block/Adminhtml/Carrier/Tablerate/Grid.php b/app/code/Magento/Shipping/Block/Adminhtml/Carrier/Tablerate/Grid.php
index 46672da0c92..b68a81fcc43 100644
--- a/app/code/Magento/Shipping/Block/Adminhtml/Carrier/Tablerate/Grid.php
+++ b/app/code/Magento/Shipping/Block/Adminhtml/Carrier/Tablerate/Grid.php
@@ -23,17 +23,14 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Shipping\Block\Adminhtml\Carrier\Tablerate;
 
 /**
  * Shipping carrier table rate grid block
  * WARNING: This grid used for export table rates
  *
- * @category    Magento
- * @package     Magento_Shipping
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Shipping\Block\Adminhtml\Carrier\Tablerate;
-
 class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
 {
     /**
@@ -95,7 +92,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
      * Set current website
      *
      * @param int $websiteId
-     * @return \Magento\Shipping\Block\Adminhtml\Carrier\Tablerate\Grid
+     * @return $this
      */
     public function setWebsiteId($websiteId)
     {
@@ -119,8 +116,8 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
     /**
      * Set current website
      *
-     * @param int $websiteId
-     * @return \Magento\Shipping\Block\Adminhtml\Carrier\Tablerate\Grid
+     * @param string $name
+     * @return $this
      */
     public function setConditionName($name)
     {
diff --git a/app/code/Magento/Shipping/Block/Adminhtml/Create.php b/app/code/Magento/Shipping/Block/Adminhtml/Create.php
index c86625f04da..e0ed79e89bc 100644
--- a/app/code/Magento/Shipping/Block/Adminhtml/Create.php
+++ b/app/code/Magento/Shipping/Block/Adminhtml/Create.php
@@ -23,13 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Shipping\Block\Adminhtml;
 
 /**
  * Adminhtml shipment create
  */
-
-namespace Magento\Shipping\Block\Adminhtml;
-
 class Create extends \Magento\Backend\Block\Widget\Form\Container
 {
     /**
@@ -53,6 +51,9 @@ class Create extends \Magento\Backend\Block\Widget\Form\Container
         parent::__construct($context, $data);
     }
 
+    /**
+     * @return void
+     */
     protected function _construct()
     {
         $this->_objectId = 'order_id';
@@ -74,12 +75,18 @@ class Create extends \Magento\Backend\Block\Widget\Form\Container
         return $this->_coreRegistry->registry('current_shipment');
     }
 
+    /**
+     * @return string
+     */
     public function getHeaderText()
     {
         $header = __('New Shipment for Order #%1', $this->getShipment()->getOrder()->getRealOrderId());
         return $header;
     }
 
+    /**
+     * @return string
+     */
     public function getBackUrl()
     {
         return $this->getUrl(
diff --git a/app/code/Magento/Shipping/Block/Adminhtml/Create/Form.php b/app/code/Magento/Shipping/Block/Adminhtml/Create/Form.php
index f30ca8c4c53..775e4f7afeb 100644
--- a/app/code/Magento/Shipping/Block/Adminhtml/Create/Form.php
+++ b/app/code/Magento/Shipping/Block/Adminhtml/Create/Form.php
@@ -23,13 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Shipping\Block\Adminhtml\Create;
 
 /**
  * Adminhtml shipment create form
  */
-
-namespace Magento\Shipping\Block\Adminhtml\Create;
-
 class Form extends \Magento\Sales\Block\Adminhtml\Order\AbstractOrder
 {
     /**
@@ -45,7 +43,7 @@ class Form extends \Magento\Sales\Block\Adminhtml\Order\AbstractOrder
     /**
      * Retrieve source
      *
-     * @return \Magento\Sales\Model\Order\Invoice
+     * @return \Magento\Sales\Model\Order\Shipment
      */
     public function getSource()
     {
@@ -62,22 +60,34 @@ class Form extends \Magento\Sales\Block\Adminhtml\Order\AbstractOrder
         return $this->_coreRegistry->registry('current_shipment');
     }
 
+    /**
+     * @return \Magento\View\Element\AbstractBlock
+     */
     protected function _prepareLayout()
     {
         $this->addChild('items', 'Magento\Shipping\Block\Adminhtml\Create\Items');
         return parent::_prepareLayout();
     }
 
+    /**
+     * @return string
+     */
     public function getPaymentHtml()
     {
         return $this->getChildHtml('order_payment');
     }
 
+    /**
+     * @return string
+     */
     public function getItemsHtml()
     {
         return $this->getChildHtml('order_items');
     }
 
+    /**
+     * @return string
+     */
     public function getSaveUrl()
     {
         return $this->getUrl('*/*/save', array('order_id' => $this->getShipment()->getOrderId()));
diff --git a/app/code/Magento/Shipping/Block/Adminhtml/Create/Items.php b/app/code/Magento/Shipping/Block/Adminhtml/Create/Items.php
index 7eb898cd27f..dd82d2d1102 100644
--- a/app/code/Magento/Shipping/Block/Adminhtml/Create/Items.php
+++ b/app/code/Magento/Shipping/Block/Adminhtml/Create/Items.php
@@ -23,12 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Shipping\Block\Adminhtml\Create;
 
 /**
  * Adminhtml shipment items grid
  */
-namespace Magento\Shipping\Block\Adminhtml\Create;
-
 class Items extends \Magento\Sales\Block\Adminhtml\Items\AbstractItems
 {
     /**
@@ -77,7 +76,7 @@ class Items extends \Magento\Sales\Block\Adminhtml\Items\AbstractItems
     /**
      * Retrieve source
      *
-     * @return \Magento\Sales\Model\Order\Invoice
+     * @return \Magento\Sales\Model\Order\Shipment
      */
     public function getSource()
     {
@@ -96,6 +95,8 @@ class Items extends \Magento\Sales\Block\Adminhtml\Items\AbstractItems
 
     /**
      * Prepare child blocks
+     *
+     * @return string
      */
     protected function _beforeToHtml()
     {
diff --git a/app/code/Magento/Shipping/Block/Adminhtml/Order/Packaging.php b/app/code/Magento/Shipping/Block/Adminhtml/Order/Packaging.php
index c11167aa936..fe122f58044 100644
--- a/app/code/Magento/Shipping/Block/Adminhtml/Order/Packaging.php
+++ b/app/code/Magento/Shipping/Block/Adminhtml/Order/Packaging.php
@@ -21,13 +21,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Shipping\Block\Adminhtml\Order;
 
 /**
  * Adminhtml shipment packaging
  */
-
-namespace Magento\Shipping\Block\Adminhtml\Order;
-
 class Packaging extends \Magento\Backend\Block\Template
 {
     /**
@@ -249,8 +247,8 @@ class Packaging extends \Magento\Backend\Block\Template
     /**
      * Get item of shipment by its id
      *
-     * @param  $itemId
-     * @param  $itemsOf
+     * @param string $itemId
+     * @param string $itemsOf
      * @return \Magento\Object
      */
     public function getShipmentItem($itemId, $itemsOf)
@@ -324,6 +322,8 @@ class Packaging extends \Magento\Backend\Block\Template
 
     /**
      * Check whether girth is allowed for current carrier
+     *
+     * @return bool
      */
     public function isGirthAllowed()
     {
diff --git a/app/code/Magento/Shipping/Block/Adminhtml/Order/Packaging/Grid.php b/app/code/Magento/Shipping/Block/Adminhtml/Order/Packaging/Grid.php
index 164b2308d8d..f993c0947bc 100644
--- a/app/code/Magento/Shipping/Block/Adminhtml/Order/Packaging/Grid.php
+++ b/app/code/Magento/Shipping/Block/Adminhtml/Order/Packaging/Grid.php
@@ -21,12 +21,13 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Shipping\Block\Adminhtml\Order\Packaging;
 
 class Grid extends \Magento\Backend\Block\Template
 {
-
+    /**
+     * @var string
+     */
     protected $_template = 'order/packaging/grid.phtml';
 
     /**
@@ -108,8 +109,8 @@ class Grid extends \Magento\Backend\Block\Template
     /**
      * Format price
      *
-     * @param   decimal $value
-     * @return  double
+     * @param   float $value
+     * @return  string
      */
     public function formatPrice($value)
     {
diff --git a/app/code/Magento/Shipping/Block/Adminhtml/Order/Tracking.php b/app/code/Magento/Shipping/Block/Adminhtml/Order/Tracking.php
index e67478fb5c5..9d8afc2ba72 100644
--- a/app/code/Magento/Shipping/Block/Adminhtml/Order/Tracking.php
+++ b/app/code/Magento/Shipping/Block/Adminhtml/Order/Tracking.php
@@ -21,13 +21,12 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Shipping\Block\Adminhtml\Order;
 
 /**
  * Shipment tracking control form
  *
  */
-namespace Magento\Shipping\Block\Adminhtml\Order;
-
 class Tracking extends \Magento\Backend\Block\Template
 {
     /**
@@ -62,7 +61,7 @@ class Tracking extends \Magento\Backend\Block\Template
     /**
      * Prepares layout of block
      *
-     * @return \Magento\Sales\Block\Adminhtml\Order\View\Giftmessage
+     * @return void
      */
     protected function _prepareLayout()
     {
@@ -101,6 +100,9 @@ class Tracking extends \Magento\Backend\Block\Template
         return $carriers;
     }
 
+    /**
+     * @return array
+     */
     protected function _getCarriersInstances()
     {
         return $this->_shippingConfig->getAllCarriers(
diff --git a/app/code/Magento/Shipping/Block/Adminhtml/Order/Tracking/View.php b/app/code/Magento/Shipping/Block/Adminhtml/Order/Tracking/View.php
index 35a3369d526..130ffdcb60f 100644
--- a/app/code/Magento/Shipping/Block/Adminhtml/Order/Tracking/View.php
+++ b/app/code/Magento/Shipping/Block/Adminhtml/Order/Tracking/View.php
@@ -21,13 +21,12 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Shipping\Block\Adminhtml\Order\Tracking;
 
 /**
  * Shipment tracking control form
  *
  */
-namespace Magento\Shipping\Block\Adminhtml\Order\Tracking;
-
 class View extends \Magento\Shipping\Block\Adminhtml\Order\Tracking
 {
     /**
@@ -56,7 +55,7 @@ class View extends \Magento\Shipping\Block\Adminhtml\Order\Tracking
     /**
      * Prepares layout of block
      *
-     * @return \Magento\Sales\Block\Adminhtml\Order\View\Giftmessage
+     * @return void
      */
     protected function _prepareLayout()
     {
@@ -91,7 +90,7 @@ class View extends \Magento\Shipping\Block\Adminhtml\Order\Tracking
     /**
      * Retrieve remove url
      *
-     * @param $track
+     * @param \Magento\Sales\Model\Order\Shipment\Track $track
      * @return string
      */
     public function getRemoveUrl($track)
@@ -102,6 +101,10 @@ class View extends \Magento\Shipping\Block\Adminhtml\Order\Tracking
         ));
     }
 
+    /**
+     * @param string $code
+     * @return false|string
+     */
     public function getCarrierTitle($code)
     {
         $carrier = $this->_carrierFactory->create($code);
diff --git a/app/code/Magento/Shipping/Block/Adminhtml/View.php b/app/code/Magento/Shipping/Block/Adminhtml/View.php
index 3dddf344edf..de93eb281b4 100644
--- a/app/code/Magento/Shipping/Block/Adminhtml/View.php
+++ b/app/code/Magento/Shipping/Block/Adminhtml/View.php
@@ -23,16 +23,13 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Shipping\Block\Adminhtml;
 
 /**
  * Adminhtml shipment create
  *
- * @category   Magento
- * @package    Magento_Sales
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Shipping\Block\Adminhtml;
-
 class View extends \Magento\Backend\Block\Widget\Form\Container
 {
     /**
@@ -56,6 +53,9 @@ class View extends \Magento\Backend\Block\Widget\Form\Container
         parent::__construct($context, $data);
     }
 
+    /**
+     * @return void
+     */
     protected function _construct()
     {
         $this->_objectId = 'shipment_id';
@@ -102,6 +102,9 @@ class View extends \Magento\Backend\Block\Widget\Form\Container
         return $this->_coreRegistry->registry('current_shipment');
     }
 
+    /**
+     * @return string
+     */
     public function getHeaderText()
     {
         if ($this->getShipment()->getEmailSent()) {
@@ -117,6 +120,9 @@ class View extends \Magento\Backend\Block\Widget\Form\Container
         );
     }
 
+    /**
+     * @return string
+     */
     public function getBackUrl()
     {
         return $this->getUrl(
@@ -128,11 +134,17 @@ class View extends \Magento\Backend\Block\Widget\Form\Container
         );
     }
 
+    /**
+     * @return string
+     */
     public function getEmailUrl()
     {
         return $this->getUrl('adminhtml/order_shipment/email', array('shipment_id' => $this->getShipment()->getId()));
     }
 
+    /**
+     * @return string
+     */
     public function getPrintUrl()
     {
         return $this->getUrl(
@@ -143,6 +155,10 @@ class View extends \Magento\Backend\Block\Widget\Form\Container
         );
     }
 
+    /**
+     * @param bool $flag
+     * @return $this
+     */
     public function updateBackButtonUrl($flag)
     {
         if ($flag) {
diff --git a/app/code/Magento/Shipping/Block/Order/Shipment.php b/app/code/Magento/Shipping/Block/Order/Shipment.php
index ac9ae1692bd..70fdbb5819d 100644
--- a/app/code/Magento/Shipping/Block/Order/Shipment.php
+++ b/app/code/Magento/Shipping/Block/Order/Shipment.php
@@ -23,12 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Shipping\Block\Order;
 
 /**
  * Sales order view block
  */
-namespace Magento\Shipping\Block\Order;
-
 class Shipment extends \Magento\View\Element\Template
 {
     /**
@@ -74,6 +73,9 @@ class Shipment extends \Magento\View\Element\Template
         $this->_isScopePrivate = true;
     }
 
+    /**
+     * @return void
+     */
     protected function _prepareLayout()
     {
         $headBlock = $this->getLayout()->getBlock('head');
diff --git a/app/code/Magento/Shipping/Block/Tracking/Popup.php b/app/code/Magento/Shipping/Block/Tracking/Popup.php
index ca5101445f7..2c3b9861adc 100644
--- a/app/code/Magento/Shipping/Block/Tracking/Popup.php
+++ b/app/code/Magento/Shipping/Block/Tracking/Popup.php
@@ -23,7 +23,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Shipping\Block\Tracking;
 
 class Popup extends \Magento\View\Element\Template
@@ -115,11 +114,17 @@ class Popup extends \Magento\View\Element\Template
         return (bool) $this->_storeConfig->getConfig('contacts/contacts/enabled');
     }
 
+    /**
+     * @return string
+     */
     public function getStoreSupportEmail()
     {
         return $this->_storeConfig->getConfig('trans_email/ident_support/email');
     }
 
+    /**
+     * @return string
+     */
     public function getContactUs()
     {
         return $this->getUrl('contacts');
diff --git a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment.php b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment.php
index 3ea830b4f8e..7b4e9d6f31a 100644
--- a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment.php
+++ b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment.php
@@ -23,16 +23,15 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Shipping\Controller\Adminhtml\Order;
+
+use Magento\App\ResponseInterface;
 
 /**
  * Adminhtml order shipment controller
  *
- * @category   Magento
- * @package    Magento_Sales
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Shipping\Controller\Adminhtml\Order;
-
 class Shipment extends \Magento\Sales\Controller\Adminhtml\Shipment\AbstractShipment
 {
     /**
@@ -72,6 +71,8 @@ class Shipment extends \Magento\Sales\Controller\Adminhtml\Shipment\AbstractShip
 
     /**
      * Initialize shipment items QTY
+     *
+     * @return array
      */
     protected function _getItemQtys()
     {
@@ -148,7 +149,7 @@ class Shipment extends \Magento\Sales\Controller\Adminhtml\Shipment\AbstractShip
      * Save shipment and order in one transaction
      *
      * @param \Magento\Sales\Model\Order\Shipment $shipment
-     * @return \Magento\Shipping\Controller\Adminhtml\Order\Shipment
+     * @return $this
      */
     protected function _saveShipment($shipment)
     {
@@ -163,6 +164,8 @@ class Shipment extends \Magento\Sales\Controller\Adminhtml\Shipment\AbstractShip
 
     /**
      * Shipment information page
+     *
+     * @return void
      */
     public function viewAction()
     {
@@ -181,6 +184,8 @@ class Shipment extends \Magento\Sales\Controller\Adminhtml\Shipment\AbstractShip
 
     /**
      * Start create shipment action
+     *
+     * @return void
      */
     public function startAction()
     {
@@ -192,6 +197,8 @@ class Shipment extends \Magento\Sales\Controller\Adminhtml\Shipment\AbstractShip
 
     /**
      * Shipment create page
+     *
+     * @return void
      */
     public function newAction()
     {
@@ -216,7 +223,7 @@ class Shipment extends \Magento\Sales\Controller\Adminhtml\Shipment\AbstractShip
      * Save shipment
      * We can save only new shipment. Existing shipments are not editable
      *
-     * @return null
+     * @return void
      */
     public function saveAction()
     {
@@ -298,6 +305,8 @@ class Shipment extends \Magento\Sales\Controller\Adminhtml\Shipment\AbstractShip
 
     /**
      * Send email with shipment data to customer
+     *
+     * @return void
      */
     public function emailAction()
     {
@@ -331,6 +340,9 @@ class Shipment extends \Magento\Sales\Controller\Adminhtml\Shipment\AbstractShip
 
     /**
      * Add new tracking number action
+     *
+     * @return void
+     * @throws \Magento\Core\Exception
      */
     public function addTrackAction()
     {
@@ -380,6 +392,8 @@ class Shipment extends \Magento\Sales\Controller\Adminhtml\Shipment\AbstractShip
 
     /**
      * Remove tracking number from shipment
+     *
+     * @return void
      */
     public function removeTrackAction()
     {
@@ -418,6 +432,8 @@ class Shipment extends \Magento\Sales\Controller\Adminhtml\Shipment\AbstractShip
 
     /**
      * Add comment to shipment history
+     *
+     * @return void
      */
     public function addCommentAction()
     {
@@ -511,6 +527,8 @@ class Shipment extends \Magento\Sales\Controller\Adminhtml\Shipment\AbstractShip
 
     /**
      * Create shipping label action for specific shipment
+     *
+     * @return void
      */
     public function createLabelAction()
     {
@@ -536,6 +554,8 @@ class Shipment extends \Magento\Sales\Controller\Adminhtml\Shipment\AbstractShip
 
     /**
      * Print label for one specific shipment
+     *
+     * @return ResponseInterface|void
      */
     public function printLabelAction()
     {
@@ -585,7 +605,7 @@ class Shipment extends \Magento\Sales\Controller\Adminhtml\Shipment\AbstractShip
     /**
      * Create pdf document with information about packages
      *
-     * @return \Magento\App\ResponseInterface
+     * @return ResponseInterface|void
      */
     public function printPackageAction()
     {
@@ -608,7 +628,7 @@ class Shipment extends \Magento\Sales\Controller\Adminhtml\Shipment\AbstractShip
      * Batch print shipping labels for whole shipments.
      * Push pdf document with shipping labels to user browser
      *
-     * @return null
+     * @return ResponseInterface|void
      */
     public function massPrintShippingLabelAction()
     {
@@ -693,7 +713,7 @@ class Shipment extends \Magento\Sales\Controller\Adminhtml\Shipment\AbstractShip
      * Create \Zend_Pdf_Page instance with image from $imageString. Supports JPEG, PNG, GIF, WBMP, and GD2 formats.
      *
      * @param string $imageString
-     * @return \Zend_Pdf_Page|bool
+     * @return \Zend_Pdf_Page|false
      */
     protected function _createPdfPageFromImageString($imageString)
     {
@@ -721,7 +741,7 @@ class Shipment extends \Magento\Sales\Controller\Adminhtml\Shipment\AbstractShip
     /**
      * Return grid with shipping items for Ajax request
      *
-     * @return \Magento\App\ResponseInterface
+     * @return ResponseInterface
      */
     public function getShippingItemsGridAction()
     {
diff --git a/app/code/Magento/Shipping/Controller/Tracking.php b/app/code/Magento/Shipping/Controller/Tracking.php
index b12f7df47c8..2a6448525a1 100644
--- a/app/code/Magento/Shipping/Controller/Tracking.php
+++ b/app/code/Magento/Shipping/Controller/Tracking.php
@@ -69,6 +69,7 @@ class Tracking extends \Magento\App\Action\Action
      * Popup action
      * Shows tracking info if it's present, otherwise redirects to 404
      *
+     * @return void
      * @throws NotFoundException
      */
     public function popupAction()
diff --git a/app/code/Magento/Shipping/Model/Carrier/AbstractCarrier.php b/app/code/Magento/Shipping/Model/Carrier/AbstractCarrier.php
index cc19e0b10d0..2f54abd895b 100644
--- a/app/code/Magento/Shipping/Model/Carrier/AbstractCarrier.php
+++ b/app/code/Magento/Shipping/Model/Carrier/AbstractCarrier.php
@@ -23,10 +23,11 @@
  */
 namespace Magento\Shipping\Model\Carrier;
 
-use Magento\Object;
 use Magento\Sales\Model\Quote\Address\AbstractCarrierInterface;
+use Magento\Shipping\Model\Shipment\Request;
+use Magento\Sales\Model\Quote\Address\RateResult\Error;
 
-abstract class AbstractCarrier extends Object implements AbstractCarrierInterface
+abstract class AbstractCarrier extends \Magento\Object implements AbstractCarrierInterface
 {
     /**
      * Carrier's code
@@ -66,7 +67,7 @@ abstract class AbstractCarrier extends Object implements AbstractCarrierInterfac
     /**
      * Container types that could be customized
      *
-     * @var array
+     * @var string[]
      */
     protected $_customizableContainerTypes = array();
 
@@ -126,7 +127,7 @@ abstract class AbstractCarrier extends Object implements AbstractCarrierInterfac
      * Retrieve information from carrier configuration
      *
      * @param   string $field
-     * @return  mixed
+     * @return  void|false|string
      */
     public function getConfigData($field)
     {
@@ -155,9 +156,9 @@ abstract class AbstractCarrier extends Object implements AbstractCarrierInterfac
     /**
      * Collect and get rates
      *
-     * @abstract
      * @param \Magento\Sales\Model\Quote\Address\RateRequest $request
      * @return \Magento\Shipping\Model\Rate\Result|bool|null
+     * @abstract
      */
     abstract public function collectRates(\Magento\Sales\Model\Quote\Address\RateRequest $request);
 
@@ -165,33 +166,33 @@ abstract class AbstractCarrier extends Object implements AbstractCarrierInterfac
      * Do request to shipment
      * Implementation must be in overridden method
      *
-     * @param \Magento\Shipping\Model\Shipment\Request $request
-     * @return Object
+     * @param Request $request
+     * @return \Magento\Object
      */
     public function requestToShipment($request)
     {
-        return new Object();
+        return new \Magento\Object();
     }
 
     /**
      * Do return of shipment
      * Implementation must be in overridden method
      *
-     * @param $request
-     * @return Object
+     * @param Request $request
+     * @return \Magento\Object
      */
     public function returnOfShipment($request)
     {
-        return new Object();
+        return new \Magento\Object();
     }
 
     /**
      * Return container types of carrier
      *
-     * @param Object|null $params
+     * @param \Magento\Object|null $params
      * @return array
      */
-    public function getContainerTypes(Object $params = null)
+    public function getContainerTypes(\Magento\Object $params = null)
     {
         return array();
     }
@@ -199,10 +200,10 @@ abstract class AbstractCarrier extends Object implements AbstractCarrierInterfac
     /**
      * Get allowed containers of carrier
      *
-     * @param Object|null $params
+     * @param \Magento\Object|null $params
      * @return array|bool
      */
-    protected function _getAllowedContainers(Object $params = null)
+    protected function _getAllowedContainers(\Magento\Object $params = null)
     {
         $containersAll = $this->getContainerTypesAll();
         if (empty($containersAll)) {
@@ -252,7 +253,7 @@ abstract class AbstractCarrier extends Object implements AbstractCarrierInterfac
     /**
      * Get Container Types, that could be customized
      *
-     * @return array
+     * @return string[]
      */
     public function getCustomizableContainerTypes()
     {
@@ -262,10 +263,10 @@ abstract class AbstractCarrier extends Object implements AbstractCarrierInterfac
     /**
      * Return delivery confirmation types of carrier
      *
-     * @param Object|null $params
+     * @param \Magento\Object|null $params
      * @return array
      */
-    public function getDeliveryConfirmationTypes(Object $params = null)
+    public function getDeliveryConfirmationTypes(\Magento\Object $params = null)
     {
         return array();
     }
@@ -280,40 +281,38 @@ abstract class AbstractCarrier extends Object implements AbstractCarrierInterfac
         /*
         * for specific countries, the flag will be 1
         */
-        if ($speCountriesAllow && $speCountriesAllow == 1){
-             $showMethod = $this->getConfigData('showmethod');
-             $availableCountries = array();
-             if($this->getConfigData('specificcountry')) {
-                $availableCountries = explode(',',$this->getConfigData('specificcountry'));
-             }
-             if ($availableCountries && in_array($request->getDestCountryId(), $availableCountries)) {
-                 return $this;
-             } elseif ($showMethod && (!$availableCountries || ($availableCountries
-                 && !in_array($request->getDestCountryId(), $availableCountries)))
-             ){
-                   /** @var \Magento\Sales\Model\Quote\Address\RateResult\Error $error */
-                   $error = $this->_rateErrorFactory->create();
-                   $error->setCarrier($this->_code);
-                   $error->setCarrierTitle($this->getConfigData('title'));
-                   $errorMsg = $this->getConfigData('specificerrmsg');
-                   $error->setErrorMessage($errorMsg ? $errorMsg : __('Sorry, but we can\'t deliver to the destination country with this shipping module.'));
-                   return $error;
-             } else {
-                 /*
-                * The admin set not to show the shipping module if the devliery country is not within specific countries
+        if ($speCountriesAllow && $speCountriesAllow == 1) {
+            $showMethod = $this->getConfigData('showmethod');
+            $availableCountries = array();
+            if ($this->getConfigData('specificcountry')) {
+                $availableCountries = explode(',', $this->getConfigData('specificcountry'));
+            }
+            if ($availableCountries && in_array($request->getDestCountryId(), $availableCountries)) {
+                return $this;
+            } elseif ($showMethod && (!$availableCountries || ($availableCountries
+                 && !in_array($request->getDestCountryId(), $availableCountries)))) {
+                 /** @var Error $error */
+                 $error = $this->_rateErrorFactory->create();
+                 $error->setCarrier($this->_code);
+                 $error->setCarrierTitle($this->getConfigData('title'));
+                 $errorMsg = $this->getConfigData('specificerrmsg');
+                 $error->setErrorMessage($errorMsg ? $errorMsg : __('Sorry, but we can\'t deliver to the destination country with this shipping module.'));
+                 return $error;
+            } else {
+                /*
+                * The admin set not to show the shipping module if the delivery country is not within specific countries
                 */
                 return false;
-             }
+            }
         }
         return $this;
     }
 
-
     /**
      * Processing additional validation to check is carrier applicable.
      *
      * @param \Magento\Sales\Model\Quote\Address\RateRequest $request
-     * @return \Magento\Shipping\Model\Carrier\AbstractCarrier|\Magento\Sales\Model\Quote\Address\RateResult\Error|boolean
+     * @return $this|bool|Error
      */
     public function proccessAdditionalValidation(\Magento\Sales\Model\Quote\Address\RateRequest $request)
     {
@@ -344,7 +343,7 @@ abstract class AbstractCarrier extends Object implements AbstractCarrierInterfac
     /**
      * Check if carrier has shipping tracking option available
      *
-     * @return boolean
+     * @return bool
      */
     public function isTrackingAvailable()
     {
@@ -354,7 +353,7 @@ abstract class AbstractCarrier extends Object implements AbstractCarrierInterfac
     /**
      * Check if carrier has shipping label option available
      *
-     * @return boolean
+     * @return bool
      */
     public function isShippingLabelsAvailable()
     {
@@ -364,7 +363,7 @@ abstract class AbstractCarrier extends Object implements AbstractCarrierInterfac
     /**
      *  Retrieve sort order of current carrier
      *
-     * @return mixed
+     * @return string|null
      */
     public function getSortOrder()
     {
@@ -373,7 +372,7 @@ abstract class AbstractCarrier extends Object implements AbstractCarrierInterfac
 
     /**
      * @param \Magento\Sales\Model\Quote\Address\RateRequest $request
-     * @return null
+     * @return void
      */
     protected function _updateFreeMethodQuote($request)
     {
@@ -508,10 +507,10 @@ abstract class AbstractCarrier extends Object implements AbstractCarrierInterfac
     }
 
     /**
-     *  Return weight in pounds
+     * Return weight in pounds
      *
-     *  @param integer Weight in someone measure
-     *  @return float Weight in pounds
+     * @param int $weight In some measure
+     * @return float Weight in pounds
      */
     public function convertWeightToLbs($weight)
     {
@@ -519,9 +518,10 @@ abstract class AbstractCarrier extends Object implements AbstractCarrierInterfac
     }
 
     /**
-     * set the number of boxes for shipping
+     * Sets the number of boxes for shipping
      *
-     * @return weight
+     * @param int $weight in some measure
+     * @return int
      */
     public function getTotalNumOfBoxes($weight)
     {
@@ -551,7 +551,7 @@ abstract class AbstractCarrier extends Object implements AbstractCarrierInterfac
     /**
      * Check if city option required
      *
-     * @return boolean
+     * @return bool
      */
     public function isCityRequired()
     {
@@ -573,6 +573,7 @@ abstract class AbstractCarrier extends Object implements AbstractCarrierInterfac
      * Log debug data to file
      *
      * @param mixed $debugData
+     * @return void
      */
     protected function _debug($debugData)
     {
@@ -597,6 +598,7 @@ abstract class AbstractCarrier extends Object implements AbstractCarrierInterfac
      * Used to call debug method from not Payment Method context
      *
      * @param mixed $debugData
+     * @return void
      */
     public function debugData($debugData)
     {
@@ -616,10 +618,10 @@ abstract class AbstractCarrier extends Object implements AbstractCarrierInterfac
     /**
      * Return content types of package
      *
-     * @param Object $params
+     * @param \Magento\Object $params
      * @return array
      */
-    public function getContentTypes(Object $params)
+    public function getContentTypes(\Magento\Object $params)
     {
         return array();
     }
diff --git a/app/code/Magento/Shipping/Model/Carrier/Flatrate.php b/app/code/Magento/Shipping/Model/Carrier/Flatrate.php
index 7f547ee65df..0fb8de29fb6 100644
--- a/app/code/Magento/Shipping/Model/Carrier/Flatrate.php
+++ b/app/code/Magento/Shipping/Model/Carrier/Flatrate.php
@@ -23,17 +23,15 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Shipping\Model\Carrier;
 
+use Magento\Shipping\Model\Rate\Result;
 
 /**
  * Flat rate shipping model
  *
- * @category   Magento
- * @package    Magento_Shipping
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Shipping\Model\Carrier;
-
 class Flatrate
     extends \Magento\Shipping\Model\Carrier\AbstractCarrier
     implements \Magento\Shipping\Model\Carrier\CarrierInterface
@@ -81,7 +79,7 @@ class Flatrate
 
     /**
      * @param \Magento\Sales\Model\Quote\Address\RateRequest $request
-     * @return \Magento\Shipping\Model\Rate\Result
+     * @return Result|bool
      */
     public function collectRates(\Magento\Sales\Model\Quote\Address\RateRequest $request)
     {
@@ -110,7 +108,7 @@ class Flatrate
         }
         $this->setFreeBoxes($freeBoxes);
 
-        /** @var \Magento\Shipping\Model\Rate\Result $result */
+        /** @var Result $result */
         $result = $this->_rateResultFactory->create();
         if ($this->getConfigData('type') == 'O') { // per order
             $shippingPrice = $this->getConfigData('price');
@@ -136,7 +134,6 @@ class Flatrate
                 $shippingPrice = '0.00';
             }
 
-
             $method->setPrice($shippingPrice);
             $method->setCost($shippingPrice);
 
@@ -146,6 +143,9 @@ class Flatrate
         return $result;
     }
 
+    /**
+     * @return array
+     */
     public function getAllowedMethods()
     {
         return array('flatrate'=>$this->getConfigData('name'));
diff --git a/app/code/Magento/Shipping/Model/Carrier/Freeshipping.php b/app/code/Magento/Shipping/Model/Carrier/Freeshipping.php
index f1efd09042d..9a330ffcdaf 100644
--- a/app/code/Magento/Shipping/Model/Carrier/Freeshipping.php
+++ b/app/code/Magento/Shipping/Model/Carrier/Freeshipping.php
@@ -84,7 +84,7 @@ class Freeshipping
      * FreeShipping Rates Collector
      *
      * @param \Magento\Sales\Model\Quote\Address\RateRequest $request
-     * @return \Magento\Shipping\Model\Rate\Result
+     * @return \Magento\Shipping\Model\Rate\Result|bool
      */
     public function collectRates(\Magento\Sales\Model\Quote\Address\RateRequest $request)
     {
@@ -143,6 +143,9 @@ class Freeshipping
         }
     }
 
+    /**
+     * @return array
+     */
     public function getAllowedMethods()
     {
         return array('freeshipping'=>$this->getConfigData('name'));
diff --git a/app/code/Magento/Shipping/Model/Carrier/Tablerate.php b/app/code/Magento/Shipping/Model/Carrier/Tablerate.php
index c9f9463d034..2fd6ed85c55 100644
--- a/app/code/Magento/Shipping/Model/Carrier/Tablerate.php
+++ b/app/code/Magento/Shipping/Model/Carrier/Tablerate.php
@@ -23,15 +23,12 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-
 namespace Magento\Shipping\Model\Carrier;
 
 class Tablerate
     extends \Magento\Shipping\Model\Carrier\AbstractCarrier
     implements \Magento\Shipping\Model\Carrier\CarrierInterface
 {
-
     /**
      * @var string
      */
@@ -69,9 +66,9 @@ class Tablerate
 
     /**
      * @param \Magento\Core\Model\Store\Config $coreStoreConfig
-     * @param \Magento\Shipping\Model\Rate\ResultFactory $rateResultFactory
      * @param \Magento\Sales\Model\Quote\Address\RateResult\ErrorFactory $rateErrorFactory
      * @param \Magento\Core\Model\Log\AdapterFactory $logAdapterFactory
+     * @param \Magento\Shipping\Model\Rate\ResultFactory $rateResultFactory
      * @param \Magento\Sales\Model\Quote\Address\RateResult\MethodFactory $resultMethodFactory
      * @param \Magento\Shipping\Model\Resource\Carrier\TablerateFactory $tablerateFactory
      * @param array $data
diff --git a/app/code/Magento/Shipping/Model/CarrierFactory.php b/app/code/Magento/Shipping/Model/CarrierFactory.php
index 255594d4e50..317afdf24c4 100644
--- a/app/code/Magento/Shipping/Model/CarrierFactory.php
+++ b/app/code/Magento/Shipping/Model/CarrierFactory.php
@@ -105,7 +105,7 @@ class CarrierFactory implements CarrierFactoryInterface
     /**
      * Create carrier by its code if it is active
      *
-     * @param $carrierCode
+     * @param string $carrierCode
      * @param null|int $storeId
      * @return bool|Carrier\AbstractCarrier
      */
diff --git a/app/code/Magento/Shipping/Model/Config/Backend/Tablerate.php b/app/code/Magento/Shipping/Model/Config/Backend/Tablerate.php
index f486f7d75b4..8bcb8d301cc 100644
--- a/app/code/Magento/Shipping/Model/Config/Backend/Tablerate.php
+++ b/app/code/Magento/Shipping/Model/Config/Backend/Tablerate.php
@@ -23,17 +23,15 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Shipping\Model\Config\Backend;
+
+use Magento\Core\Model\AbstractModel;
 
 /**
  * Backend model for shipping table rates CSV importing
  *
- * @category   Magento
- * @package    Magento_Shipping
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-
-namespace Magento\Shipping\Model\Config\Backend;
-
 class Tablerate extends \Magento\Core\Model\Config\Value
 {
     /**
@@ -65,6 +63,9 @@ class Tablerate extends \Magento\Core\Model\Config\Value
         parent::__construct($context, $registry, $storeManager, $config, $resource, $resourceCollection, $data);
     }
 
+    /**
+     * @return AbstractModel|void
+     */
     public function _afterSave()
     {
         $this->_tablerateFactory->create()->uploadAndImport($this);
diff --git a/app/code/Magento/Shipping/Model/Config/Source/Allspecificcountries.php b/app/code/Magento/Shipping/Model/Config/Source/Allspecificcountries.php
index 17593d2ae32..1f3aaaec006 100644
--- a/app/code/Magento/Shipping/Model/Config/Source/Allspecificcountries.php
+++ b/app/code/Magento/Shipping/Model/Config/Source/Allspecificcountries.php
@@ -23,12 +23,13 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-
 namespace Magento\Shipping\Model\Config\Source;
 
 class Allspecificcountries implements \Magento\Core\Model\Option\ArrayInterface
 {
+    /**
+     * {@inheritdoc}
+     */
     public function toOptionArray()
     {
         return array(
diff --git a/app/code/Magento/Shipping/Model/Config/Source/Flatrate.php b/app/code/Magento/Shipping/Model/Config/Source/Flatrate.php
index 7fdae7c4a00..b2dde6dc4c4 100644
--- a/app/code/Magento/Shipping/Model/Config/Source/Flatrate.php
+++ b/app/code/Magento/Shipping/Model/Config/Source/Flatrate.php
@@ -23,12 +23,13 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-
 namespace Magento\Shipping\Model\Config\Source;
 
 class Flatrate implements \Magento\Core\Model\Option\ArrayInterface
 {
+    /**
+     * {@inheritdoc}
+     */
     public function toOptionArray()
     {
         return array(
diff --git a/app/code/Magento/Shipping/Model/Info.php b/app/code/Magento/Shipping/Model/Info.php
index 4ddf213fc77..741af36c31c 100644
--- a/app/code/Magento/Shipping/Model/Info.php
+++ b/app/code/Magento/Shipping/Model/Info.php
@@ -23,10 +23,10 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-
 namespace Magento\Shipping\Model;
 
+use Magento\Sales\Model\Order\Shipment;
+
 class Info extends \Magento\Object
 {
     /**
@@ -91,7 +91,7 @@ class Info extends \Magento\Object
      * Generating tracking info
      *
      * @param array $hash
-     * @return \Magento\Shipping\Model\Info
+     * @return $this
      */
     public function loadByHash($hash)
     {
@@ -143,11 +143,11 @@ class Info extends \Magento\Object
     /**
      * Instantiate ship model
      *
-     * @return \Magento\Sales\Model\Order\Shipment|bool
+     * @return Shipment|bool
      */
     protected function _initShipment()
     {
-        /* @var $model \Magento\Sales\Model\Order\Shipment */
+        /* @var $model Shipment */
         $model = $this->_shipmentFactory->create();
         $ship = $model->load($this->getShipId());
         if (!$ship->getEntityId() || $this->getProtectCode() != $ship->getProtectCode()) {
@@ -223,10 +223,10 @@ class Info extends \Magento\Object
     }
 
     /**
-     * @param $shipment \Magento\Sales\Model\Order\Shipment
+     * @param Shipment $shipment
      * @return \Magento\Shipping\Model\Resource\Order\Track\Collection
      */
-    protected function _getTracksCollection(\Magento\Sales\Model\Order\Shipment $shipment)
+    protected function _getTracksCollection(Shipment $shipment)
     {
         $tracks = $this->_trackCollectionFactory->create()->setShipmentFilter($shipment->getId());
 
diff --git a/app/code/Magento/Shipping/Model/Observer.php b/app/code/Magento/Shipping/Model/Observer.php
index 2e17e7a0c94..fe146366250 100644
--- a/app/code/Magento/Shipping/Model/Observer.php
+++ b/app/code/Magento/Shipping/Model/Observer.php
@@ -36,6 +36,10 @@ class Observer
      */
     protected $_shippingFactory;
 
+    /**
+     * @param \Magento\Core\Model\LocaleInterface $coreLocale
+     * @param \Magento\Sales\Model\Resource\Report\ShippingFactory $shippingFactory
+     */
     public function __construct(
         \Magento\Core\Model\LocaleInterface $coreLocale,
         \Magento\Sales\Model\Resource\Report\ShippingFactory $shippingFactory
diff --git a/app/code/Magento/Shipping/Model/Rate/Result.php b/app/code/Magento/Shipping/Model/Rate/Result.php
index cb38af05f69..d94d30a458e 100644
--- a/app/code/Magento/Shipping/Model/Rate/Result.php
+++ b/app/code/Magento/Shipping/Model/Rate/Result.php
@@ -23,14 +23,12 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-
 namespace Magento\Shipping\Model\Rate;
 
 class Result
 {
     /**
-     * Shippin method rates
+     * Shipping method rates
      *
      * @var array
      */
@@ -60,7 +58,7 @@ class Result
     /**
      * Reset result
      *
-     * @return \Magento\Shipping\Model\Rate\Result
+     * @return $this
      */
     public function reset()
     {
@@ -82,7 +80,7 @@ class Result
     /**
      * Get Error
      *
-     * @return null|bool;
+     * @return null|bool
      */
     public function getError()
     {
@@ -93,7 +91,7 @@ class Result
      * Add a rate to the result
      *
      * @param \Magento\Sales\Model\Quote\Address\RateResult\AbstractResult|\Magento\Shipping\Model\Rate\Result $result
-     * @return \Magento\Shipping\Model\Rate\Result
+     * @return $this
      */
     public function append($result)
     {
@@ -192,7 +190,7 @@ class Result
     /**
      * Sort rates by price from min to max
      *
-     * @return \Magento\Shipping\Model\Rate\Result
+     * @return $this
      */
     public function sortRatesByPrice()
     {
@@ -219,7 +217,7 @@ class Result
      * Set price for each rate according to count of packages
      *
      * @param int $packageCount
-     * @return \Magento\Shipping\Model\Rate\Result
+     * @return $this
      */
     public function updateRatePrice($packageCount)
     {
diff --git a/app/code/Magento/Shipping/Model/Resource/Carrier/Tablerate/Collection.php b/app/code/Magento/Shipping/Model/Resource/Carrier/Tablerate/Collection.php
index 4c5a1ee44b7..e6d15b552c6 100644
--- a/app/code/Magento/Shipping/Model/Resource/Carrier/Tablerate/Collection.php
+++ b/app/code/Magento/Shipping/Model/Resource/Carrier/Tablerate/Collection.php
@@ -23,27 +23,24 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Shipping\Model\Resource\Carrier\Tablerate;
 
 /**
  * Shipping table rates collection
  *
- * @category   Magento
- * @package    Magento_Shipping
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Shipping\Model\Resource\Carrier\Tablerate;
-
 class Collection extends \Magento\Core\Model\Resource\Db\Collection\AbstractCollection
 {
     /**
-     * directory/country table name
+     * Directory/country table name
      *
      * @var string
      */
     protected $_countryTable;
 
     /**
-     * directory/country_region table name
+     * Directory/country_region table name
      *
      * @var string
      */
@@ -52,6 +49,7 @@ class Collection extends \Magento\Core\Model\Resource\Db\Collection\AbstractColl
     /**
      * Define resource model and item
      *
+     * @return void
      */
     protected function _construct()
     {
diff --git a/app/code/Magento/Shipping/Model/Resource/Order/Track/Collection.php b/app/code/Magento/Shipping/Model/Resource/Order/Track/Collection.php
index 4b8c8d8b312..0fa17bd897b 100644
--- a/app/code/Magento/Shipping/Model/Resource/Order/Track/Collection.php
+++ b/app/code/Magento/Shipping/Model/Resource/Order/Track/Collection.php
@@ -21,19 +21,18 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Shipping\Model\Resource\Order\Track;
 
 /**
  * Flat sales order shipment tracks collection
  *
  */
-namespace Magento\Shipping\Model\Resource\Order\Track;
-
 class Collection extends \Magento\Sales\Model\Resource\Order\Shipment\Track\Collection
 {
     /**
      * Model initialization
      *
+     * @return void
      */
     protected function _construct()
     {
diff --git a/app/code/Magento/Shipping/Model/Shipment/Request.php b/app/code/Magento/Shipping/Model/Shipment/Request.php
index a1a97cbed4d..87cd761623b 100644
--- a/app/code/Magento/Shipping/Model/Shipment/Request.php
+++ b/app/code/Magento/Shipping/Model/Shipment/Request.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Shipping\Model\Shipment;
 
 /**
  * @method \Magento\Shipping\Model\Shipment\Request setOrderShipment(\Magento\Sales\Model\Order\Shipment $orderShipment)
@@ -80,12 +81,8 @@
  * @method \Magento\Shipping\Model\Shipment\Request setPackageWeight(float $value)
  * @method float getPackageWeight()
  *
- * @category    Magento
- * @package     Magento_Shipping
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Shipping\Model\Shipment;
-
 class Request extends \Magento\Object
 {
 }
diff --git a/app/code/Magento/Shipping/Model/Shipment/ReturnShipment.php b/app/code/Magento/Shipping/Model/Shipment/ReturnShipment.php
index 490f0146439..84d53e67e1d 100644
--- a/app/code/Magento/Shipping/Model/Shipment/ReturnShipment.php
+++ b/app/code/Magento/Shipping/Model/Shipment/ReturnShipment.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Shipping\Model\Shipment;
 
 /**
  * @method \Magento\Shipping\Model\Shipment\Request setOrderShipment(\Magento\Sales\Model\Order\Shipment $orderShipment)
@@ -80,12 +81,8 @@
  * @method \Magento\Shipping\Model\Shipment\Request setPackageWeight(float $value)
  * @method float getPackageWeight()
  *
- * @category    Magento
- * @package     Magento_Shipping
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Shipping\Model\Shipment;
-
 class ReturnShipment extends \Magento\Object
 {
 }
diff --git a/app/code/Magento/Shipping/Model/Shipping.php b/app/code/Magento/Shipping/Model/Shipping.php
index 3de7b443bcb..f7c70e9d1c8 100644
--- a/app/code/Magento/Shipping/Model/Shipping.php
+++ b/app/code/Magento/Shipping/Model/Shipping.php
@@ -23,8 +23,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-
 namespace Magento\Shipping\Model;
 
 use Magento\Sales\Model\Order\Shipment;
@@ -142,7 +140,7 @@ class Shipping implements RateCollectorInterface
      * Set shipping orig data
      *
      * @param array $data
-     * @return null
+     * @return void
      */
     public function setOrigData($data)
     {
@@ -152,7 +150,7 @@ class Shipping implements RateCollectorInterface
     /**
      * Reset cached result
      *
-     * @return \Magento\Shipping\Model\Shipping
+     * @return $this
      */
     public function resetResult()
     {
@@ -173,9 +171,9 @@ class Shipping implements RateCollectorInterface
     /**
      * Retrieve all methods for supplied shipping data
      *
-     * @todo make it ordered
      * @param \Magento\Sales\Model\Quote\Address\RateRequest $request
      * @return $this
+     * @todo make it ordered
      */
     public function collectRates(\Magento\Sales\Model\Quote\Address\RateRequest $request)
     {
@@ -224,7 +222,7 @@ class Shipping implements RateCollectorInterface
      *
      * @param string $carrierCode
      * @param \Magento\Sales\Model\Quote\Address\RateRequest $request
-     * @return \Magento\Shipping\Model\Shipping
+     * @return $this
      */
     public function collectCarrierRates($carrierCode, $request)
     {
@@ -299,7 +297,7 @@ class Shipping implements RateCollectorInterface
 
     /**
      * Compose Packages For Carrier.
-     * Devides order into items and items into parts if it's necessary
+     * Divides order into items and items into parts if it's necessary
      *
      * @param \Magento\Shipping\Model\Carrier\AbstractCarrier $carrier
      * @param \Magento\Sales\Model\Quote\Address\RateRequest $request
@@ -387,7 +385,7 @@ class Shipping implements RateCollectorInterface
 
     /**
      * Make pieces
-     * Compose packeges list based on given items, so that each package is as heavy as possible
+     * Compose packages list based on given items, so that each package is as heavy as possible
      *
      * @param array $items
      * @param float $maxWeight
@@ -437,7 +435,7 @@ class Shipping implements RateCollectorInterface
      *
      * @param \Magento\Object $address
      * @param null|bool|array $limitCarrier
-     * @return \Magento\Shipping\Model\Shipping
+     * @return $this
      */
     public function collectRatesByAddress(\Magento\Object $address, $limitCarrier = null)
     {
@@ -467,7 +465,7 @@ class Shipping implements RateCollectorInterface
      * Set part of carrier xml config path
      *
      * @param string $code
-     * @return \Magento\Shipping\Model\Shipping
+     * @return $this
      */
     public function setCarrierAvailabilityConfigField($code = 'active')
     {
diff --git a/app/code/Magento/Shipping/Model/Source/HandlingAction.php b/app/code/Magento/Shipping/Model/Source/HandlingAction.php
index 67328dde07f..25d53ba532f 100644
--- a/app/code/Magento/Shipping/Model/Source/HandlingAction.php
+++ b/app/code/Magento/Shipping/Model/Source/HandlingAction.php
@@ -27,6 +27,9 @@ namespace Magento\Shipping\Model\Source;
 
 class HandlingAction implements \Magento\Core\Model\Option\ArrayInterface
 {
+    /**
+     * {@inheritdoc}
+     */
     public function toOptionArray()
     {
         return array(
diff --git a/app/code/Magento/Shipping/Model/Source/HandlingType.php b/app/code/Magento/Shipping/Model/Source/HandlingType.php
index 246d2470aed..a1e9eae8ba2 100644
--- a/app/code/Magento/Shipping/Model/Source/HandlingType.php
+++ b/app/code/Magento/Shipping/Model/Source/HandlingType.php
@@ -27,6 +27,9 @@ namespace Magento\Shipping\Model\Source;
 
 class HandlingType implements \Magento\Core\Model\Option\ArrayInterface
 {
+    /**
+     * {@inheritdoc}
+     */
     public function toOptionArray()
     {
         return array(
diff --git a/app/code/Magento/Shipping/Model/Tracking/Result.php b/app/code/Magento/Shipping/Model/Tracking/Result.php
index 84291071320..e7c0a786c3b 100644
--- a/app/code/Magento/Shipping/Model/Tracking/Result.php
+++ b/app/code/Magento/Shipping/Model/Tracking/Result.php
@@ -23,17 +23,27 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Shipping\Model\Tracking;
 
+use Magento\Shipping\Model\Tracking\Result\AbstractResult;
+use Magento\Shipping\Model\Rate\Result as RateResult;
+
 class Result
 {
-
+    /**
+     * @var array
+     */
     protected $_trackings = array();
+
+    /**
+     * @var null|array
+     */
     protected $_error = null;
 
     /**
      * Reset tracking
+     *
+     * @return $this
      */
     public function reset()
     {
@@ -41,23 +51,34 @@ class Result
         return $this;
     }
 
+    /**
+     * @param array $error
+     * @return void
+     */
     public function setError($error)
     {
         $this->_error = $error;
     }
 
+    /**
+     * @return array|null
+     */
     public function getError()
     {
         return $this->_error;
     }
+
     /**
      * Add a tracking to the result
+     *
+     * @param AbstractResult|RateResult $result
+     * @return $this
      */
     public function append($result)
     {
-        if ($result instanceof \Magento\Shipping\Model\Tracking\Result\AbstractResult) {
+        if ($result instanceof AbstractResult) {
             $this->_trackings[] = $result;
-        } elseif ($result instanceof \Magento\Shipping\Model\Rate\Result) {
+        } elseif ($result instanceof RateResult) {
             $trackings = $result->getAllTrackings();
             foreach ($trackings as $track) {
                 $this->append($track);
@@ -68,6 +89,8 @@ class Result
 
     /**
      * Return all trackings in the result
+     *
+     * @return array
      */
     public function getAllTrackings()
     {
diff --git a/app/code/Magento/Shipping/Model/Tracking/Result/Error.php b/app/code/Magento/Shipping/Model/Tracking/Result/Error.php
index 4c111cd5a9f..42e713b0014 100644
--- a/app/code/Magento/Shipping/Model/Tracking/Result/Error.php
+++ b/app/code/Magento/Shipping/Model/Tracking/Result/Error.php
@@ -23,17 +23,21 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-
 namespace Magento\Shipping\Model\Tracking\Result;
 
 class Error extends \Magento\Shipping\Model\Tracking\Result\AbstractResult
 {
+    /**
+     * @return array
+     */
     public function getAllData()
     {
         return $this->_data;
     }
 
+    /**
+     * @return string
+     */
     public function getErrorMessage()
     {
         return  __('Tracking information is unavailable.');
diff --git a/app/code/Magento/Shipping/Model/Tracking/Result/Status.php b/app/code/Magento/Shipping/Model/Tracking/Result/Status.php
index fe082e38fbd..ce8651064ff 100644
--- a/app/code/Magento/Shipping/Model/Tracking/Result/Status.php
+++ b/app/code/Magento/Shipping/Model/Tracking/Result/Status.php
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Shipping\Model\Tracking\Result;
 
 /**
  * Fields:
@@ -46,11 +46,13 @@
  * -carrier: usps
  * -tracksummary: Your item was delivered at 6:50 am on February 6 in Los Angeles CA 90064
  */
-namespace Magento\Shipping\Model\Tracking\Result;
-
 class Status extends \Magento\Shipping\Model\Tracking\Result\AbstractResult
 {
-    public function getAllData(){
+    /**
+     * @return array
+     */
+    public function getAllData()
+    {
         return $this->_data;
     }
 }
diff --git a/app/code/Magento/Shipping/etc/adminhtml/acl.xml b/app/code/Magento/Shipping/etc/adminhtml/acl.xml
index 7996e95c30a..089b849b5f7 100644
--- a/app/code/Magento/Shipping/etc/adminhtml/acl.xml
+++ b/app/code/Magento/Shipping/etc/adminhtml/acl.xml
@@ -32,8 +32,8 @@
                 <resource id="Magento_Adminhtml::stores">
                     <resource id="Magento_Adminhtml::stores_settings">
                         <resource id="Magento_Adminhtml::config">
-                            <resource id="Magento_Shipping::config_shipping" title="Shipping Settings Section" sortOrder="0" />
-                            <resource id="Magento_Shipping::carriers" title="Shipping Methods Section" sortOrder="0" />
+                            <resource id="Magento_Shipping::config_shipping" title="Shipping Settings Section" sortOrder="5" />
+                            <resource id="Magento_Shipping::carriers" title="Shipping Methods Section" sortOrder="5" />
                         </resource>
                     </resource>
                 </resource>
diff --git a/app/code/Magento/Shipping/etc/adminhtml/system.xml b/app/code/Magento/Shipping/etc/adminhtml/system.xml
index d7ae1a717ba..e5d4643df46 100644
--- a/app/code/Magento/Shipping/etc/adminhtml/system.xml
+++ b/app/code/Magento/Shipping/etc/adminhtml/system.xml
@@ -31,17 +31,6 @@
             <label>Shipping Settings</label>
             <tab>sales</tab>
             <resource>Magento_Shipping::config_shipping</resource>
-            <group id="option" translate="label" type="text" sortOrder="2" showInDefault="1" showInWebsite="1" showInStore="0">
-                <label>Options</label>
-                <field id="checkout_multiple" translate="label" type="select" sortOrder="1" showInDefault="1" showInWebsite="1" showInStore="0">
-                    <label>Allow Shipping to Multiple Addresses</label>
-                    <source_model>Magento\Backend\Model\Config\Source\Yesno</source_model>
-                </field>
-                <field id="checkout_multiple_maximum_qty" translate="label" type="text" sortOrder="2" showInDefault="1" showInWebsite="1" showInStore="0">
-                    <label>Maximum Qty Allowed for Shipping to Multiple Addresses</label>
-                    <validate>validate-number</validate>
-                </field>
-            </group>
             <group id="origin" translate="label" type="text" sortOrder="1" showInDefault="1" showInWebsite="1" showInStore="0">
                 <label>Origin</label>
                 <field id="country_id" translate="label" type="select" sortOrder="10" showInDefault="1" showInWebsite="1" showInStore="0">
diff --git a/app/code/Magento/Shipping/etc/config.xml b/app/code/Magento/Shipping/etc/config.xml
index 3f5e07fe07f..7ec891415f9 100644
--- a/app/code/Magento/Shipping/etc/config.xml
+++ b/app/code/Magento/Shipping/etc/config.xml
@@ -28,10 +28,6 @@
 <config>
     <default>
         <shipping>
-            <option>
-                <checkout_multiple>1</checkout_multiple>
-                <checkout_multiple_maximum_qty>100</checkout_multiple_maximum_qty>
-            </option>
             <origin>
                 <country_id>US</country_id>
                 <postcode>90034</postcode>
diff --git a/app/code/Magento/Shipping/view/adminhtml/create/items/renderer/configurable.phtml b/app/code/Magento/Shipping/view/adminhtml/create/items/renderer/configurable.phtml
deleted file mode 100644
index b3d2fce07c0..00000000000
--- a/app/code/Magento/Shipping/view/adminhtml/create/items/renderer/configurable.phtml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Academic Free License (AFL 3.0)
- * that is bundled with this package in the file LICENSE_AFL.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/afl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    design
- * @package     default_default
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
- */
-?>
-<?php $_item = $this->getItem() ?>
-<tr class="border">
-    <td><?php echo $this->getColumnHtml($_item, 'configurable_name') ?></td>
-    <td><?php echo $this->getColumnHtml($_item, 'qty') ?></td>
-
-
-    <td class="<?php if ($this->isShipmentRegular()): ?>last<?php endif; ?> a-center">
-        <?php if ($this->canShipPartiallyItem()): ?>
-            <input type="text" class="input-text" name="shipment[items][<?php echo $_item->getOrderItemId() ?>]" value="<?php echo $_item->getQty()*1 ?>" />
-        <?php else: ?>
-            <?php echo $_item->getQty()*1 ?>
-        <?php endif; ?>
-    </td>
-    <?php if (!$this->canShipPartiallyItem()): ?>
-    <td class="a-center last">
-        <input type="hidden" name="shipment[items][<?php echo $_item->getOrderItemId() ?>]" value="0" />
-        <input type="checkbox" name="shipment[items][<?php echo $_item->getOrderItemId() ?>]" value="<?php echo $_item->getQty()*1 ?>" checked />
-    </td>
-    <?php endif; ?>
-</tr>
diff --git a/app/code/Magento/Sitemap/Block/Adminhtml/Edit.php b/app/code/Magento/Sitemap/Block/Adminhtml/Edit.php
index 544d8064a60..417ce2f6251 100644
--- a/app/code/Magento/Sitemap/Block/Adminhtml/Edit.php
+++ b/app/code/Magento/Sitemap/Block/Adminhtml/Edit.php
@@ -23,16 +23,13 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Sitemap\Block\Adminhtml;
 
 /**
  * Sitemap edit form container
  *
- * @category   Magento
- * @package    Magento_Adminhtml
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Sitemap\Block\Adminhtml;
-
 class Edit extends \Magento\Backend\Block\Widget\Form\Container
 {
     /**
@@ -58,6 +55,8 @@ class Edit extends \Magento\Backend\Block\Widget\Form\Container
 
     /**
      * Init container
+     *
+     * @return void
      */
     protected function _construct()
     {
diff --git a/app/code/Magento/Sitemap/Block/Adminhtml/Edit/Form.php b/app/code/Magento/Sitemap/Block/Adminhtml/Edit/Form.php
index a4c9adc34bf..e2fce6380a1 100644
--- a/app/code/Magento/Sitemap/Block/Adminhtml/Edit/Form.php
+++ b/app/code/Magento/Sitemap/Block/Adminhtml/Edit/Form.php
@@ -23,16 +23,13 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Sitemap\Block\Adminhtml\Edit;
 
 /**
  * Sitemap edit form
  *
- * @category   Magento
- * @package    Magento_Adminhtml
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Sitemap\Block\Adminhtml\Edit;
-
 class Form extends \Magento\Backend\Block\Widget\Form\Generic
 {
     /**
@@ -60,6 +57,8 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic
 
     /**
      * Init form
+     *
+     * @return void
      */
     protected function _construct()
     {
@@ -68,7 +67,9 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic
         $this->setTitle(__('Sitemap Information'));
     }
 
-
+    /**
+     * @return $this
+     */
     protected function _prepareForm()
     {
         $model = $this->_coreRegistry->registry('sitemap_sitemap');
diff --git a/app/code/Magento/Sitemap/Block/Adminhtml/Grid/Renderer/Action.php b/app/code/Magento/Sitemap/Block/Adminhtml/Grid/Renderer/Action.php
index 33e022dfd4e..9fd219bf16d 100644
--- a/app/code/Magento/Sitemap/Block/Adminhtml/Grid/Renderer/Action.php
+++ b/app/code/Magento/Sitemap/Block/Adminhtml/Grid/Renderer/Action.php
@@ -23,17 +23,17 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Sitemap\Block\Adminhtml\Grid\Renderer;
 
 /**
  * Sitemap grid action column renderer
- *
- * @category   Magento
- * @package    Magento_Sitemap
  */
-namespace Magento\Sitemap\Block\Adminhtml\Grid\Renderer;
-
 class Action extends \Magento\Backend\Block\Widget\Grid\Column\Renderer\Action
 {
+    /**
+     * @param \Magento\Object $row
+     * @return string
+     */
     public function render(\Magento\Object $row)
     {
         $this->getColumn()->setActions(array(array(
diff --git a/app/code/Magento/Sitemap/Block/Adminhtml/Sitemap.php b/app/code/Magento/Sitemap/Block/Adminhtml/Sitemap.php
index b4d30a0be3d..131e37620d2 100644
--- a/app/code/Magento/Sitemap/Block/Adminhtml/Sitemap.php
+++ b/app/code/Magento/Sitemap/Block/Adminhtml/Sitemap.php
@@ -23,20 +23,17 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Sitemap\Block\Adminhtml;
 
 /**
  * Adminhtml catalog (google) sitemaps block
- *
- * @category   Magento
- * @package    Magento_Sitemap
  */
-namespace Magento\Sitemap\Block\Adminhtml;
-
 class Sitemap extends \Magento\Backend\Block\Widget\Grid\Container
 {
-
     /**
      * Block constructor
+     *
+     * @return void
      */
     protected function _construct()
     {
diff --git a/app/code/Magento/Sitemap/Controller/Adminhtml/Sitemap.php b/app/code/Magento/Sitemap/Controller/Adminhtml/Sitemap.php
index 33d212ce034..13bf5b94ca3 100644
--- a/app/code/Magento/Sitemap/Controller/Adminhtml/Sitemap.php
+++ b/app/code/Magento/Sitemap/Controller/Adminhtml/Sitemap.php
@@ -23,15 +23,13 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Sitemap\Controller\Adminhtml;
 
+use Magento\Backend\App\Action;
 
 /**
  * XML sitemap controller
  */
-namespace Magento\Sitemap\Controller\Adminhtml;
-
-use Magento\Backend\App\Action;
-
 class Sitemap extends  \Magento\Backend\App\Action
 {
     /**
@@ -56,7 +54,7 @@ class Sitemap extends  \Magento\Backend\App\Action
     /**
      * Init actions
      *
-     * @return \Magento\Sitemap\Controller\Adminhtml\Sitemap
+     * @return $this
      */
     protected function _initAction()
     {
@@ -75,6 +73,8 @@ class Sitemap extends  \Magento\Backend\App\Action
 
     /**
      * Index action
+     *
+     * @return void
      */
     public function indexAction()
     {
@@ -85,6 +85,8 @@ class Sitemap extends  \Magento\Backend\App\Action
 
     /**
      * Create new sitemap
+     *
+     * @return void
      */
     public function newAction()
     {
@@ -94,6 +96,8 @@ class Sitemap extends  \Magento\Backend\App\Action
 
     /**
      * Edit sitemap
+     *
+     * @return void
      */
     public function editAction()
     {
@@ -136,6 +140,8 @@ class Sitemap extends  \Magento\Backend\App\Action
 
     /**
      * Save action
+     *
+     * @return void
      */
     public function saveAction()
     {
@@ -219,11 +225,12 @@ class Sitemap extends  \Magento\Backend\App\Action
             }
         }
         $this->_redirect('adminhtml/*/');
-
     }
 
     /**
      * Delete action
+     *
+     * @return void
      */
     public function deleteAction()
     {
@@ -270,6 +277,8 @@ class Sitemap extends  \Magento\Backend\App\Action
 
     /**
      * Generate sitemap
+     *
+     * @return void
      */
     public function generateAction()
     {
@@ -303,7 +312,7 @@ class Sitemap extends  \Magento\Backend\App\Action
     /**
      * Check the permission to run it
      *
-     * @return boolean
+     * @return bool
      */
     protected function _isAllowed()
     {
diff --git a/app/code/Magento/Sitemap/Model/Config/Backend/Priority.php b/app/code/Magento/Sitemap/Model/Config/Backend/Priority.php
index 6e5f84c3aa6..830bec58454 100644
--- a/app/code/Magento/Sitemap/Model/Config/Backend/Priority.php
+++ b/app/code/Magento/Sitemap/Model/Config/Backend/Priority.php
@@ -23,21 +23,22 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-
 namespace Magento\Sitemap\Model\Config\Backend;
 
 class Priority extends \Magento\Core\Model\Config\Value
 {
-
+    /**
+     * @return $this
+     * @throws \Exception
+     */
     protected function _beforeSave()
     {
         $value     = $this->getValue();
-            if ($value < 0 || $value > 1) {
-                throw new \Exception(__('The priority must be between 0 and 1.'));
-            } elseif (($value == 0) && !($value === '0' || $value === '0.0')) {
-                throw new \Exception(__('The priority must be between 0 and 1.'));
-            }
+        if ($value < 0 || $value > 1) {
+            throw new \Exception(__('The priority must be between 0 and 1.'));
+        } elseif (($value == 0) && !($value === '0' || $value === '0.0')) {
+            throw new \Exception(__('The priority must be between 0 and 1.'));
+        }
         return $this;
     }
 
diff --git a/app/code/Magento/Sitemap/Model/Config/Source/Frequency.php b/app/code/Magento/Sitemap/Model/Config/Source/Frequency.php
index dcd39473a8c..73b9926ce18 100644
--- a/app/code/Magento/Sitemap/Model/Config/Source/Frequency.php
+++ b/app/code/Magento/Sitemap/Model/Config/Source/Frequency.php
@@ -23,12 +23,13 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-
 namespace Magento\Sitemap\Model\Config\Source;
 
 class Frequency implements \Magento\Core\Model\Option\ArrayInterface
 {
+    /**
+     * {@inheritdoc}
+     */
     public function toOptionArray()
     {
         return array(
diff --git a/app/code/Magento/Sitemap/Model/Observer.php b/app/code/Magento/Sitemap/Model/Observer.php
index 0a8d644e196..475d0b3e1ca 100644
--- a/app/code/Magento/Sitemap/Model/Observer.php
+++ b/app/code/Magento/Sitemap/Model/Observer.php
@@ -23,20 +23,15 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Sitemap\Model;
 
 /**
  * Sitemap module observer
  *
- * @category   Magento
- * @package    Magento_Sitemap
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Sitemap\Model;
-
 class Observer
 {
-
     /**
      * Enable/disable configuration
      */
@@ -106,6 +101,7 @@ class Observer
      * Generate sitemaps
      *
      * @param \Magento\Cron\Model\Schedule $schedule
+     * @return void
      */
     public function scheduledGenerateSitemaps($schedule)
     {
diff --git a/app/code/Magento/Sitemap/Model/Resource/Catalog/Category.php b/app/code/Magento/Sitemap/Model/Resource/Catalog/Category.php
index a212225f42a..31a55509310 100644
--- a/app/code/Magento/Sitemap/Model/Resource/Catalog/Category.php
+++ b/app/code/Magento/Sitemap/Model/Resource/Catalog/Category.php
@@ -23,17 +23,13 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Sitemap\Model\Resource\Catalog;
 
 /**
  * Sitemap resource catalog collection model
  *
- * @category    Magento
- * @package     Magento_Sitemap
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Sitemap\Model\Resource\Catalog;
-
 class Category extends \Magento\Core\Model\Resource\Db\AbstractDb
 {
     /**
@@ -75,6 +71,9 @@ class Category extends \Magento\Core\Model\Resource\Db\AbstractDb
         parent::__construct($resource);
     }
 
+    /**
+     * @return void
+     */
     protected function _construct()
     {
         $this->_init('catalog_category_entity', 'entity_id');
@@ -84,7 +83,7 @@ class Category extends \Magento\Core\Model\Resource\Db\AbstractDb
      * Get category collection array
      *
      * @param null|string|bool|int|\Magento\Core\Model\Store $storeId
-     * @return array
+     * @return array|bool
      */
     public function getCollection($storeId)
     {
diff --git a/app/code/Magento/Sitemap/Model/Resource/Catalog/Product.php b/app/code/Magento/Sitemap/Model/Resource/Catalog/Product.php
index c627441d28b..67f33b7e0e0 100644
--- a/app/code/Magento/Sitemap/Model/Resource/Catalog/Product.php
+++ b/app/code/Magento/Sitemap/Model/Resource/Catalog/Product.php
@@ -23,17 +23,13 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Sitemap\Model\Resource\Catalog;
 
 /**
  * Sitemap resource product collection model
  *
- * @category    Magento
- * @package     Magento_Sitemap
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Sitemap\Model\Resource\Catalog;
-
 class Product extends \Magento\Core\Model\Resource\Db\AbstractDb
 {
     const NOT_SELECTED_IMAGE = 'no_selection';
@@ -84,7 +80,7 @@ class Product extends \Magento\Core\Model\Resource\Db\AbstractDb
     protected $_productVisibility;
 
     /**
-     * @var \Magento\Catalog\Model\Product\Status
+     * @var \Magento\Catalog\Model\Product\Attribute\Source\Status
      */
     protected $_productStatus;
 
@@ -103,13 +99,24 @@ class Product extends \Magento\Core\Model\Resource\Db\AbstractDb
      */
     protected $_mediaConfig;
 
+    /**
+     * @param \Magento\App\Resource $resource
+     * @param \Magento\Sitemap\Helper\Data $sitemapData
+     * @param \Magento\Catalog\Model\Resource\Product $productResource
+     * @param \Magento\Core\Model\StoreManagerInterface $storeManager
+     * @param \Magento\Catalog\Model\Product\Visibility $productVisibility
+     * @param \Magento\Catalog\Model\Product\Attribute\Source\Status $productStatus
+     * @param \Magento\Catalog\Model\Resource\Product\Attribute\Backend\Media $mediaAttribute
+     * @param \Magento\Eav\Model\ConfigFactory $eavConfigFactory
+     * @param \Magento\Catalog\Model\Product\Media\Config $mediaConfig
+     */
     public function __construct(
         \Magento\App\Resource $resource,
         \Magento\Sitemap\Helper\Data $sitemapData,
         \Magento\Catalog\Model\Resource\Product $productResource,
         \Magento\Core\Model\StoreManagerInterface $storeManager,
         \Magento\Catalog\Model\Product\Visibility $productVisibility,
-        \Magento\Catalog\Model\Product\Status $productStatus,
+        \Magento\Catalog\Model\Product\Attribute\Source\Status $productStatus,
         \Magento\Catalog\Model\Resource\Product\Attribute\Backend\Media $mediaAttribute,
         \Magento\Eav\Model\ConfigFactory $eavConfigFactory,
         \Magento\Catalog\Model\Product\Media\Config $mediaConfig
@@ -125,6 +132,9 @@ class Product extends \Magento\Core\Model\Resource\Db\AbstractDb
         parent::__construct($resource);
     }
 
+    /**
+     * @return void
+     */
     protected function _construct()
     {
         $this->_init('catalog_product_entity', 'entity_id');
@@ -179,6 +189,7 @@ class Product extends \Magento\Core\Model\Resource\Db\AbstractDb
      *
      * @param int $storeId
      * @param string $attributeCode
+     * @return void
      */
     protected function _joinAttribute($storeId, $attributeCode)
     {
@@ -207,9 +218,9 @@ class Product extends \Magento\Core\Model\Resource\Db\AbstractDb
     }
 
     /**
-     * Get attribute data bu attribute code
+     * Get attribute data by attribute code
      *
-     * @param $attributeCode
+     * @param string $attributeCode
      * @return array
      */
     protected function _getAttribute($attributeCode)
@@ -232,7 +243,7 @@ class Product extends \Magento\Core\Model\Resource\Db\AbstractDb
      * Get category collection array
      *
      * @param null|string|bool|int|\Magento\Core\Model\Store $storeId
-     * @return array
+     * @return array|bool
      */
     public function getCollection($storeId)
     {
@@ -323,6 +334,7 @@ class Product extends \Magento\Core\Model\Resource\Db\AbstractDb
      *
      * @param \Magento\Object $product
      * @param int $storeId
+     * @return void
      */
     protected function _loadProductImages($product, $storeId)
     {
diff --git a/app/code/Magento/Sitemap/Model/Resource/Cms/Page.php b/app/code/Magento/Sitemap/Model/Resource/Cms/Page.php
index cac34df56a8..824171ad1c8 100644
--- a/app/code/Magento/Sitemap/Model/Resource/Cms/Page.php
+++ b/app/code/Magento/Sitemap/Model/Resource/Cms/Page.php
@@ -23,22 +23,19 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Sitemap\Model\Resource\Cms;
 
 /**
  * Sitemap cms page collection model
  *
- * @category    Magento
- * @package     Magento_Sitemap
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Sitemap\Model\Resource\Cms;
-
 class Page extends \Magento\Core\Model\Resource\Db\AbstractDb
 {
     /**
      * Init resource model (catalog/category)
      *
+     * @return void
      */
     protected function _construct()
     {
diff --git a/app/code/Magento/Sitemap/Model/Resource/Sitemap.php b/app/code/Magento/Sitemap/Model/Resource/Sitemap.php
index f9787b2ce2d..8ca469b8219 100644
--- a/app/code/Magento/Sitemap/Model/Resource/Sitemap.php
+++ b/app/code/Magento/Sitemap/Model/Resource/Sitemap.php
@@ -23,22 +23,19 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Sitemap\Model\Resource;
 
 /**
  * Sitemap resource model
  *
- * @category    Magento
- * @package     Magento_Sitemap
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Sitemap\Model\Resource;
-
 class Sitemap extends \Magento\Core\Model\Resource\Db\AbstractDb
 {
     /**
      * Init resource model
      *
+     * @return void
      */
     protected function _construct()
     {
diff --git a/app/code/Magento/Sitemap/Model/Resource/Sitemap/Collection.php b/app/code/Magento/Sitemap/Model/Resource/Sitemap/Collection.php
index 61a617f2779..1f420341a78 100644
--- a/app/code/Magento/Sitemap/Model/Resource/Sitemap/Collection.php
+++ b/app/code/Magento/Sitemap/Model/Resource/Sitemap/Collection.php
@@ -23,22 +23,19 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Sitemap\Model\Resource\Sitemap;
 
 /**
  * Sitemap resource model collection
  *
- * @category    Magento
- * @package     Magento_Sitemap
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Sitemap\Model\Resource\Sitemap;
-
 class Collection extends \Magento\Core\Model\Resource\Db\Collection\AbstractCollection
 {
     /**
      * Init collection
      *
+     * @return void
      */
     public function _construct()
     {
@@ -48,8 +45,8 @@ class Collection extends \Magento\Core\Model\Resource\Db\Collection\AbstractColl
     /**
      * Filter collection by specified store ids
      *
-     * @param array|int $storeIds
-     * @return \Magento\Sitemap\Model\Resource\Sitemap\Collection
+     * @param array|int[] $storeIds
+     * @return $this
      */
     public function addStoreFilter($storeIds)
     {
diff --git a/app/code/Magento/Sitemap/Model/Sitemap.php b/app/code/Magento/Sitemap/Model/Sitemap.php
index b09e67f21bf..342ef3c14f7 100644
--- a/app/code/Magento/Sitemap/Model/Sitemap.php
+++ b/app/code/Magento/Sitemap/Model/Sitemap.php
@@ -23,7 +23,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Sitemap\Model;
 
 /**
@@ -205,6 +204,8 @@ class Sitemap extends \Magento\Core\Model\AbstractModel
 
     /**
      * Init model
+     *
+     * @return void
      */
     protected function _construct()
     {
@@ -228,6 +229,8 @@ class Sitemap extends \Magento\Core\Model\AbstractModel
 
     /**
      * Initialize sitemap items
+     *
+     * @return void
      */
     protected function _initSitemapItems()
     {
@@ -317,7 +320,7 @@ class Sitemap extends \Magento\Core\Model\AbstractModel
      *
      * @see http://www.sitemaps.org/protocol.html
      *
-     * @return \Magento\Sitemap\Model\Sitemap
+     * @return $this
      */
     public function generateXml()
     {
@@ -373,6 +376,8 @@ class Sitemap extends \Magento\Core\Model\AbstractModel
 
     /**
      * Generate sitemap index XML file
+     *
+     * @return void
      */
     protected function _createSitemapIndex()
     {
@@ -419,18 +424,18 @@ class Sitemap extends \Magento\Core\Model\AbstractModel
     /**
      * Get sitemap row
      *
+     * @param string $url
+     * @param null|string $lastmod
+     * @param null|string $changefreq
+     * @param null|string $priority
+     * @param null|array $images
+     * @return string
+
      * Sitemap images
      * @see http://support.google.com/webmasters/bin/answer.py?hl=en&answer=178636
      *
      * Sitemap PageMap
      * @see http://support.google.com/customsearch/bin/answer.py?hl=en&answer=1628213
-     *
-     * @param string $url
-     * @param string $lastmod
-     * @param string $changefreq
-     * @param string $priority
-     * @param array $images
-     * @return string
      */
     protected function _getSitemapRow($url, $lastmod = null, $changefreq = null, $priority = null, $images = null)
     {
@@ -471,7 +476,7 @@ class Sitemap extends \Magento\Core\Model\AbstractModel
      * Get sitemap index row
      *
      * @param string $sitemapFilename
-     * @param string $lastmod
+     * @param null|string $lastmod
      * @return string
      */
     protected function _getSitemapIndexRow($sitemapFilename, $lastmod = null)
@@ -488,8 +493,9 @@ class Sitemap extends \Magento\Core\Model\AbstractModel
     /**
      * Create new sitemap file
      *
-     * @param string $fileName
+     * @param null|string $fileName
      * @param string $type
+     * @return void
      * @throws \Magento\Core\Exception
      */
     protected function _createSitemap($fileName = null, $type = self::TYPE_URL)
@@ -511,6 +517,7 @@ class Sitemap extends \Magento\Core\Model\AbstractModel
      * Write sitemap row
      *
      * @param string $row
+     * @return void
      */
     protected function _writeSitemapRow($row)
     {
@@ -521,6 +528,7 @@ class Sitemap extends \Magento\Core\Model\AbstractModel
      * Write closing tag and close stream
      *
      * @param string $type
+     * @return void
      */
     protected function _finalizeSitemap($type = self::TYPE_URL)
     {
@@ -665,6 +673,7 @@ class Sitemap extends \Magento\Core\Model\AbstractModel
      * Add sitemap file to robots.txt
      *
      * @param string $sitemapFileName
+     * @return void
      */
     protected function _addSitemapToRobotsTxt($sitemapFileName)
     {
diff --git a/app/code/Magento/Sitemap/etc/di.xml b/app/code/Magento/Sitemap/etc/di.xml
index 389f7ce7802..b567d977f4a 100644
--- a/app/code/Magento/Sitemap/etc/di.xml
+++ b/app/code/Magento/Sitemap/etc/di.xml
@@ -23,10 +23,10 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Sitemap\Model\Sitemap">
-        <param name="resource">
-            <instance type="Magento\Sitemap\Model\Resource\Sitemap" />
-        </param>
+        <arguments>
+            <argument name="resource" xsi:type="object">Magento\Sitemap\Model\Resource\Sitemap</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Tax/Model/Resource/Setup.php b/app/code/Magento/Tax/Model/Resource/Setup.php
index d3876846b83..c9632896c7a 100644
--- a/app/code/Magento/Tax/Model/Resource/Setup.php
+++ b/app/code/Magento/Tax/Model/Resource/Setup.php
@@ -37,26 +37,34 @@ class Setup extends \Magento\Sales\Model\Resource\Setup
     protected $_setupFactory;
 
     /**
-     * @param \Magento\Core\Model\Resource\Setup\Context $context
-     * @param string $resourceName
+     * @var \Magento\Catalog\Model\ProductTypes\ConfigInterface
+     */
+    protected $productTypeConfig;
+
+    /**
+     * @param \Magento\Eav\Model\Entity\Setup\Context $context
+     * @param $resourceName
      * @param \Magento\App\CacheInterface $cache
      * @param \Magento\Eav\Model\Resource\Entity\Attribute\Group\CollectionFactory $attrGroupCollectionFactory
      * @param \Magento\App\ConfigInterface $config
      * @param \Magento\Catalog\Model\Resource\SetupFactory $setupFactory
+     * @param \Magento\Catalog\Model\ProductTypes\ConfigInterface $productTypeConfig
      * @param string $moduleName
      * @param string $connectionName
      */
     public function __construct(
-        \Magento\Core\Model\Resource\Setup\Context $context,
+        \Magento\Eav\Model\Entity\Setup\Context $context,
         $resourceName,
         \Magento\App\CacheInterface $cache,
         \Magento\Eav\Model\Resource\Entity\Attribute\Group\CollectionFactory $attrGroupCollectionFactory,
         \Magento\App\ConfigInterface $config,
         \Magento\Catalog\Model\Resource\SetupFactory $setupFactory,
+        \Magento\Catalog\Model\ProductTypes\ConfigInterface $productTypeConfig,
         $moduleName = 'Magento_Tax',
         $connectionName = ''
     ) {
         $this->_setupFactory = $setupFactory;
+        $this->productTypeConfig = $productTypeConfig;
         parent::__construct($context, $resourceName, $cache, $attrGroupCollectionFactory, $config, $moduleName, $connectionName);
     }
 
@@ -82,4 +90,14 @@ class Setup extends \Magento\Sales\Model\Resource\Setup
     {
         return $this->_setupFactory->create($data);
     }
+
+    /**
+     * Get taxable product types
+     *
+     * @return array
+     */
+    public function getTaxableItems()
+    {
+        return $this->productTypeConfig->filter('taxable');
+    }
 }
diff --git a/app/code/Magento/Tax/Model/Sales/Total/Quote/Subtotal.php b/app/code/Magento/Tax/Model/Sales/Total/Quote/Subtotal.php
index c72f2031d9f..d4a27d637cb 100644
--- a/app/code/Magento/Tax/Model/Sales/Total/Quote/Subtotal.php
+++ b/app/code/Magento/Tax/Model/Sales/Total/Quote/Subtotal.php
@@ -195,7 +195,7 @@ class Subtotal extends \Magento\Sales\Model\Quote\Address\Total\AbstractTotal
     }
 
     /**
-     * Calculate item price and row total with configured rounding level
+     * Caclulate item price and row total with customized rounding level
      *
      * @param AbstractItem $item
      * @param \Magento\Object $taxRequest
diff --git a/app/code/Magento/Tax/Model/TaxClass/Source/Product.php b/app/code/Magento/Tax/Model/TaxClass/Source/Product.php
index ce8e85f0bab..c457d709e8b 100644
--- a/app/code/Magento/Tax/Model/TaxClass/Source/Product.php
+++ b/app/code/Magento/Tax/Model/TaxClass/Source/Product.php
@@ -111,14 +111,9 @@ class Product extends \Magento\Eav\Model\Entity\Attribute\Source\AbstractSource
             'extra'     => null
         );
 
-        if ($this->_coreData->useDbCompatibleMode()) {
-            $column['type']     = 'int';
-            $column['is_null']  = true;
-        } else {
-            $column['type']     = \Magento\DB\Ddl\Table::TYPE_INTEGER;
-            $column['nullable'] = true;
-            $column['comment']  = $attributeCode . ' tax column';
-        }
+        $column['type']     = \Magento\DB\Ddl\Table::TYPE_INTEGER;
+        $column['nullable'] = true;
+        $column['comment']  = $attributeCode . ' tax column';
 
         return array($attributeCode => $column);
    }
diff --git a/app/code/Magento/Tax/etc/di.xml b/app/code/Magento/Tax/etc/di.xml
index 8a88e481c39..09935099509 100644
--- a/app/code/Magento/Tax/etc/di.xml
+++ b/app/code/Magento/Tax/etc/di.xml
@@ -23,22 +23,22 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Tax\Helper\Data">
-        <param name="taxConfig">
-            <instance type="Magento\Tax\Model\Config\Proxy" />
-        </param>
+        <arguments>
+            <argument name="taxConfig" xsi:type="object">Magento\Tax\Model\Config\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Module\Updater\SetupFactory">
-        <param name="resourceTypes">
-            <array>
-                <item key="tax_setup"><value>Magento\Tax\Model\Resource\Setup</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="resourceTypes" xsi:type="array">
+                <item name="tax_setup" xsi:type="string">Magento\Tax\Model\Resource\Setup</item>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Tax\Model\Resource\Calculation">
-        <param name="taxData">
-            <instance type="Magento\Tax\Helper\Data\Proxy" />
-        </param>
+        <arguments>
+            <argument name="taxData" xsi:type="object">Magento\Tax\Helper\Data\Proxy</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Tax/sql/tax_setup/install-1.6.0.0.php b/app/code/Magento/Tax/sql/tax_setup/install-1.6.0.0.php
index 996955e00ba..c0a4e9d1c7d 100644
--- a/app/code/Magento/Tax/sql/tax_setup/install-1.6.0.0.php
+++ b/app/code/Magento/Tax/sql/tax_setup/install-1.6.0.0.php
@@ -262,7 +262,7 @@ $catalogInstaller->addAttribute(\Magento\Catalog\Model\Product::ENTITY, 'tax_cla
     'visible_in_advanced_search' => true,
     'used_in_product_listing'    => true,
     'unique'                     => false,
-    'apply_to'                   => 'simple,configurable,virtual,downloadable,bundle'
+    'apply_to'                   => implode($this->getTaxableItems(), ',')
 ));
 
 $installer->endSetup();
diff --git a/app/code/Magento/Theme/etc/adminhtml/di.xml b/app/code/Magento/Theme/etc/adminhtml/di.xml
index 42d78d79af7..6d85732caa6 100644
--- a/app/code/Magento/Theme/etc/adminhtml/di.xml
+++ b/app/code/Magento/Theme/etc/adminhtml/di.xml
@@ -23,20 +23,20 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Theme\Block\Adminhtml\Wysiwyg\Files\Content">
-        <param name="storageHelper">
-            <instance type="Magento\Theme\Helper\Storage\Proxy" />
-        </param>
+        <arguments>
+            <argument name="storageHelper" xsi:type="object">Magento\Theme\Helper\Storage\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Theme\Block\Adminhtml\Wysiwyg\Files\Tree">
-        <param name="storageHelper">
-            <instance type="Magento\Theme\Helper\Storage\Proxy" />
-        </param>
+        <arguments>
+            <argument name="storageHelper" xsi:type="object">Magento\Theme\Helper\Storage\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Theme\Block\Adminhtml\Wysiwyg\Files\Content\Uploader">
-        <param name="storageHelper">
-            <instance type="Magento\Theme\Helper\Storage\Proxy" />
-        </param>
+        <arguments>
+            <argument name="storageHelper" xsi:type="object">Magento\Theme\Helper\Storage\Proxy</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Theme/etc/di.xml b/app/code/Magento/Theme/etc/di.xml
index b1e7b0e503c..46403b12b99 100644
--- a/app/code/Magento/Theme/etc/di.xml
+++ b/app/code/Magento/Theme/etc/di.xml
@@ -23,50 +23,42 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Theme\Model\Config">
-        <param name="configCache">
-            <instance type="Magento\App\Cache\Type\Config" />
-        </param>
-        <param name="layoutCache">
-            <instance type="Magento\App\Cache\Type\Layout" />
-        </param>
+        <arguments>
+            <argument name="configCache" xsi:type="object">Magento\App\Cache\Type\Config</argument>
+            <argument name="layoutCache" xsi:type="object">Magento\App\Cache\Type\Layout</argument>
+        </arguments>
     </type>
     <type name="Magento\Theme\Model\Uploader\Service">
-        <param name="uploadLimits">
-            <array>
-                <item key="css"><value>2M</value></item>
-                <item key="js"><value>2M</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="uploadLimits" xsi:type="array">
+                <item name="css" xsi:type="string">2M</item>
+                <item name="js" xsi:type="string">2M</item>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Theme\Model\Layout\Config\Reader">
-        <param name="fileName">
-            <value>page_layouts.xml</value>
-        </param>
-        <param name="converter">
-            <instance type="Magento\Theme\Model\Layout\Config\Converter" />
-        </param>
-        <param name="schemaLocator">
-            <instance type="Magento\Theme\Model\Layout\Config\SchemaLocator" />
-        </param>
+        <arguments>
+            <argument name="fileName" xsi:type="string">page_layouts.xml</argument>
+            <argument name="converter" xsi:type="object">Magento\Theme\Model\Layout\Config\Converter</argument>
+            <argument name="schemaLocator" xsi:type="object">Magento\Theme\Model\Layout\Config\SchemaLocator</argument>
+        </arguments>
     </type>
     <virtualType name="Magento\Theme\Model\Layout\Config\Data" type="Magento\Config\Data">
-        <param name='reader'>
-            <instance type="Magento\Theme\Model\Layout\Config\Reader" />
-        </param>
-        <param name="cacheId">
-            <value>page_layouts_config</value>
-        </param>
+        <arguments>
+            <argument name="reader" xsi:type="object">Magento\Theme\Model\Layout\Config\Reader</argument>
+            <argument name="cacheId" xsi:type="string">page_layouts_config</argument>
+        </arguments>
     </virtualType>
     <type name="Magento\Theme\Model\Layout\Config">
-        <param name="dataStorage">
-            <instance type="Magento\Theme\Model\Layout\Config\Data" />
-        </param>
+        <arguments>
+            <argument name="dataStorage" xsi:type="object">Magento\Theme\Model\Layout\Config\Data</argument>
+        </arguments>
     </type>
     <type name="Magento\Theme\Model\Wysiwyg\Storage">
-        <param name="helper">
-            <instance type="Magento\Theme\Helper\Storage\Proxy" />
-        </param>
+        <arguments>
+            <argument name="helper" xsi:type="object">Magento\Theme\Helper\Storage\Proxy</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Usa/Helper/Data.php b/app/code/Magento/Usa/Helper/Data.php
index c69d2c02cde..4697ebd993a 100644
--- a/app/code/Magento/Usa/Helper/Data.php
+++ b/app/code/Magento/Usa/Helper/Data.php
@@ -23,17 +23,18 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Usa\Helper;
 
 /**
  * Usa data helper
  *
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Usa\Helper;
-
 class Data extends \Magento\App\Helper\AbstractHelper
 {
     /**
+     * Locale interface
+     *
      * @var \Magento\Core\Model\LocaleInterface
      */
     protected $_locale;
@@ -51,9 +52,9 @@ class Data extends \Magento\App\Helper\AbstractHelper
     /**
      * Convert weight in different measure types
      *
-     * @param  mixed $value
-     * @param  string $sourceWeightMeasure
-     * @param  string $toWeightMeasure
+     * @param int|float $value
+     * @param string $sourceWeightMeasure
+     * @param string $toWeightMeasure
      * @return int|null|string
      */
     public function convertMeasureWeight($value, $sourceWeightMeasure, $toWeightMeasure)
@@ -70,7 +71,7 @@ class Data extends \Magento\App\Helper\AbstractHelper
     /**
      * Convert dimensions in different measure types
      *
-     * @param  mixed $value
+     * @param  int|float $value
      * @param  string $sourceDimensionMeasure
      * @param  string $toDimensionMeasure
      * @return int|null|string
@@ -89,7 +90,7 @@ class Data extends \Magento\App\Helper\AbstractHelper
     /**
      * Get name of measure by its type
      *
-     * @param  $key
+     * @param string $key
      * @return string
      */
     public function getMeasureWeightName($key)
@@ -105,7 +106,7 @@ class Data extends \Magento\App\Helper\AbstractHelper
     /**
      * Get name of measure by its type
      *
-     * @param  $key
+     * @param string $key
      * @return string
      */
     public function getMeasureDimensionName($key)
diff --git a/app/code/Magento/Usa/Model/Resource/Setup.php b/app/code/Magento/Usa/Model/Resource/Setup.php
index 7df317c3105..e8a7bf7da3b 100644
--- a/app/code/Magento/Usa/Model/Resource/Setup.php
+++ b/app/code/Magento/Usa/Model/Resource/Setup.php
@@ -29,6 +29,8 @@ namespace Magento\Usa\Model\Resource;
 class Setup extends \Magento\Core\Model\Resource\Setup
 {
     /**
+     * Locale model
+     *
      * @var \Magento\Core\Model\Locale
      */
     protected $_localeModel;
@@ -46,13 +48,14 @@ class Setup extends \Magento\Core\Model\Resource\Setup
         $moduleName,
         \Magento\Core\Model\Locale $localeModel,
         $connectionName = ''
-    )
-    {
+    ) {
         $this->_localeModel = $localeModel;
         parent::__construct($context, $resourceName, $moduleName, $connectionName);
     }
 
     /**
+     * Get locale
+     *
      * @return \Magento\Core\Model\Locale
      */
     public function getLocale()
diff --git a/app/code/Magento/Usa/Model/Shipping/Carrier/AbstractCarrier.php b/app/code/Magento/Usa/Model/Shipping/Carrier/AbstractCarrier.php
index a7fd426cec7..c75e6f7794e 100644
--- a/app/code/Magento/Usa/Model/Shipping/Carrier/AbstractCarrier.php
+++ b/app/code/Magento/Usa/Model/Shipping/Carrier/AbstractCarrier.php
@@ -23,12 +23,16 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Usa\Model\Shipping\Carrier;
+
+use Magento\Core\Exception;
+use Magento\Sales\Model\Quote\Address\RateRequest;
+use Magento\Sales\Model\Quote\Address\RateResult\Error;
+use Magento\Shipping\Model\Shipment\Request;
 
 /**
  * Abstract USA shipping carrier model
  */
-namespace Magento\Usa\Model\Shipping\Carrier;
-
 abstract class AbstractCarrier extends \Magento\Shipping\Model\Carrier\AbstractCarrier
 {
 
@@ -37,6 +41,11 @@ abstract class AbstractCarrier extends \Magento\Shipping\Model\Carrier\AbstractC
     const GUAM_COUNTRY_ID = 'GU';
     const GUAM_REGION_CODE = 'GU';
 
+    /**
+     * Array of quotes
+     *
+     * @var array
+     */
     protected static $_quotesCache = array();
 
     /**
@@ -150,7 +159,7 @@ abstract class AbstractCarrier extends \Magento\Shipping\Model\Carrier\AbstractC
      * Set flag for check carriers for activity
      *
      * @param string $code
-     * @return \Magento\Usa\Model\Shipping\Carrier\AbstractCarrier
+     * @return $this
      */
     public function setActiveFlag($code = 'active')
     {
@@ -168,6 +177,12 @@ abstract class AbstractCarrier extends \Magento\Shipping\Model\Carrier\AbstractC
         return isset($this->_code) ? $this->_code : null;
     }
 
+    /**
+     * Get tracking information
+     *
+     * @param string $tracking
+     * @return string|false
+     */
     public function getTrackingInfo($tracking)
     {
         $result = $this->getTracking($tracking);
@@ -234,10 +249,10 @@ abstract class AbstractCarrier extends \Magento\Shipping\Model\Carrier\AbstractC
      * bundle itself, otherwise we may not get a rate at all (e.g. when total weight of a bundle exceeds max weight
      * despite each item by itself is not)
      *
-     * @param \Magento\Sales\Model\Quote\Address\RateRequest $request
+     * @param RateRequest $request
      * @return array
      */
-    public function getAllItems(\Magento\Sales\Model\Quote\Address\RateRequest $request)
+    public function getAllItems(RateRequest $request)
     {
         $items = array();
         if ($request->getAllItems()) {
@@ -266,13 +281,13 @@ abstract class AbstractCarrier extends \Magento\Shipping\Model\Carrier\AbstractC
     /**
      * Processing additional validation to check if carrier applicable.
      *
-     * @param \Magento\Sales\Model\Quote\Address\RateRequest $request
-     * @return \Magento\Shipping\Model\Carrier\AbstractCarrier|\Magento\Sales\Model\Quote\Address\RateResult\Error|boolean
+     * @param RateRequest $request
+     * @return $this|bool|Error
      */
-    public function proccessAdditionalValidation(\Magento\Sales\Model\Quote\Address\RateRequest $request)
+    public function proccessAdditionalValidation(RateRequest $request)
     {
         //Skip by item validation if there is no items in request
-        if(!count($this->getAllItems($request))) {
+        if (!count($this->getAllItems($request))) {
             return $this;
         }
 
@@ -359,7 +374,7 @@ abstract class AbstractCarrier extends \Magento\Shipping\Model\Carrier\AbstractC
      *
      * @param string|array $requestParams
      * @param string $response
-     * @return \Magento\Usa\Model\Shipping\Carrier\AbstractCarrier
+     * @return $this
      */
     protected function _setCachedQuotes($requestParams, $response)
     {
@@ -386,7 +401,7 @@ abstract class AbstractCarrier extends \Magento\Shipping\Model\Carrier\AbstractC
      * Validate and correct request information
      *
      * @param \Magento\Object $request
-     *
+     * @return void
      */
     protected function _prepareShipmentRequest(\Magento\Object $request)
     {
@@ -402,15 +417,15 @@ abstract class AbstractCarrier extends \Magento\Shipping\Model\Carrier\AbstractC
     /**
      * Do request to shipment
      *
-     * @throws \Magento\Core\Exception if there are no packages in request
-     * @param \Magento\Shipping\Model\Shipment\Request $request
-     * @return array
+     * @param Request $request
+     * @return \Magento\Object
+     * @throws Exception
      */
     public function requestToShipment($request)
     {
         $packages = $request->getPackages();
         if (!is_array($packages) || !$packages) {
-            throw new \Magento\Core\Exception(__('No packages for request'));
+            throw new Exception(__('No packages for request'));
         }
         if ($request->getStoreId() != null) {
             $this->setStore($request->getStoreId());
@@ -451,16 +466,16 @@ abstract class AbstractCarrier extends \Magento\Shipping\Model\Carrier\AbstractC
     /**
      * Do request to RMA shipment
      *
-     * @throws \Magento\Core\Exception if there are no packages in request
-     * @param $request
-     * @return array
+     * @param Request $request
+     * @return \Magento\Object
+     * @throws Exception
      */
     public function returnOfShipment($request)
     {
         $request->setIsReturn(true);
         $packages = $request->getPackages();
         if (!is_array($packages) || !$packages) {
-            throw new \Magento\Core\Exception(__('No packages for request'));
+            throw new Exception(__('No packages for request'));
         }
         if ($request->getStoreId() != null) {
             $this->setStore($request->getStoreId());
@@ -502,9 +517,10 @@ abstract class AbstractCarrier extends \Magento\Shipping\Model\Carrier\AbstractC
      * For multi package shipments. Delete requested shipments if the current shipment
      * request is failed
      *
-     * @todo implement rollback logic
      * @param array $data
      * @return bool
+     *
+     * @todo implement rollback logic
      */
     public function rollBack($data)
     {
diff --git a/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl.php b/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl.php
index dde3b5f1f90..a332024bcc1 100644
--- a/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl.php
+++ b/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl.php
@@ -23,9 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Usa\Model\Shipping\Carrier;
 
+use Magento\Shipping\Model\Rate\Result;
+use Magento\Usa\Model\Simplexml\Element;
+
 /**
  * DHL shipping implementation
  */
@@ -65,14 +67,14 @@ class Dhl
     /**
      * Rate result data
      *
-     * @var \Magento\Shipping\Model\Rate\Result|null
+     * @var Result|null
      */
     protected $_result = null;
 
     /**
      * Errors placeholder
      *
-     * @var array
+     * @var string[]
      */
     protected $_errors = array();
 
@@ -93,7 +95,7 @@ class Dhl
     /**
      * Container types that could be customized
      *
-     * @var array
+     * @var string[]
      */
     protected $_customizableContainerTypes = array('P');
 
@@ -251,7 +253,7 @@ class Dhl
      * Collect and get rates
      *
      * @param \Magento\Sales\Model\Quote\Address\RateRequest $request
-     * @return bool|\Magento\Shipping\Model\Rate\Result|null
+     * @return bool|Result|null
      */
     public function collectRates(\Magento\Sales\Model\Quote\Address\RateRequest $request)
     {
@@ -313,7 +315,7 @@ class Dhl
      * Prepare and set request in property of current instance
      *
      * @param \Magento\Object $request
-     * @return \Magento\Usa\Model\Shipping\Carrier\Dhl
+     * @return $this
      */
     public function setRequest(\Magento\Object $request)
     {
@@ -525,7 +527,7 @@ class Dhl
     /**
      * Get result of request
      *
-     * @return mixed
+     * @return Result|null
      */
     public function getResult()
     {
@@ -535,7 +537,7 @@ class Dhl
     /**
      * Get quotes
      *
-     * @return \Magento\Shipping\Model\Rate\Result
+     * @return Result
      */
     protected function _getQuotes()
     {
@@ -545,7 +547,7 @@ class Dhl
     /**
      * Set free method request
      *
-     * @param  $freeMethod
+     * @param string $freeMethod
      * @return void
      */
     protected function _setFreeMethodRequest($freeMethod)
@@ -572,7 +574,7 @@ class Dhl
     /**
      * Do rate request and handle errors
      *
-     * @return \Magento\Shipping\Model\Rate\Result|\Magento\Object
+     * @return Result|\Magento\Object
      */
     protected function _doRequest()
     {
@@ -703,8 +705,8 @@ class Dhl
     /**
      * Create shipment xml
      *
-     * @param  $shipment
-     * @param  $shipKey
+     * @param Element $shipment
+     * @param string $shipKey
      * @return void
      */
     protected function _createShipmentXml($shipment, $shipKey)
@@ -824,7 +826,6 @@ class Dhl
             $extendedService->addChild('Code', $r->getExtendedService());
         }
 
-
         /*
         * R = Receiver (if receiver, need AccountNbr)
         * S = Sender
@@ -884,7 +885,7 @@ class Dhl
      * Parse xml response and return result
      *
      * @param string $response
-     * @return \Magento\Shipping\Model\Rate\Result|\Magento\Object
+     * @return Result|\Magento\Object
      */
     protected function _parseXmlResponse($response)
     {
@@ -979,8 +980,8 @@ class Dhl
     /**
      * Parse xml object
      *
-     * @param mixed $shipXml
-     * @return \Magento\Usa\Model\Shipping\Carrier\Dhl
+     * @param \SimpleXMLElement $shipXml
+     * @return $this
      */
     protected function _parseXmlObject($shipXml)
     {
@@ -1015,7 +1016,7 @@ class Dhl
      *
      * @param string $type
      * @param string $code
-     * @return array|bool
+     * @return array|false
      */
     public function getCode($type, $code = '')
     {
@@ -1053,7 +1054,6 @@ class Dhl
 
         );
 
-
         if (!isset($codes[$type])) {
             return false;
         } elseif ('' === $code) {
@@ -1070,7 +1070,7 @@ class Dhl
     /**
      * Parse xml and add rates to instance property
      *
-     * @param mixed $shipXml
+     * @param \SimpleXMLElement $shipXml
      * @return void
      */
     protected function _addRate($shipXml)
@@ -1107,8 +1107,8 @@ class Dhl
     /**
      * Get tracking
      *
-     * @param mixed $trackings
-     * @return mixed
+     * @param string|string[] $trackings
+     * @return Result|null
      */
     public function getTracking($trackings)
     {
@@ -1125,7 +1125,7 @@ class Dhl
     /**
      * Set tracking request
      *
-     * @return null
+     * @return void
      */
     protected function setTrackingReqeust()
     {
@@ -1143,7 +1143,8 @@ class Dhl
     /**
      * Send request for tracking
      *
-     * @param array $trackings
+     * @param string[] $trackings
+     * @return void
      */
     protected function _getXMLTracking($trackings)
     {
@@ -1204,8 +1205,9 @@ class Dhl
     /**
      * Parse xml tracking response
      *
-     * @param array $trackings value
+     * @param string[] $trackings value
      * @param string $response
+     * @return void
      */
     protected function _parseXmlTrackingResponse($trackings, $response)
     {
@@ -1247,8 +1249,9 @@ class Dhl
                                         * Code 0== airbill  found
                                         */
                                         $rArr['service'] = (string)$txml->Service->Desc;
-                                        if (isset($txml->Weight))
+                                        if (isset($txml->Weight)) {
                                             $rArr['weight'] = (string)$txml->Weight . " lbs";
+                                        }
                                         if (isset($txml->Delivery)) {
                                             $rArr['deliverydate'] = (string)$txml->Delivery->Date;
                                             $rArr['deliverytime'] = (string)$txml->Delivery->Time . ':00';
@@ -1312,10 +1315,11 @@ class Dhl
                                         $resultArr[$tracknum] = $rArr;
                                     } else {
                                         $description = (string)$txml->Result->Desc;
-                                        if ($description)
+                                        if ($description) {
                                             $errorArr[$tracknum] = __('Error #%1: %2', $code, $description);
-                                        else
+                                        } else {
                                             $errorArr[$tracknum] = __('Unable to retrieve tracking');
+                                        }
                                     }
                                 } else {
                                     $errorArr[$tracknum] = __('Unable to retrieve tracking');
@@ -1449,7 +1453,7 @@ class Dhl
      * Map request to shipment
      *
      * @param \Magento\Object $request
-     * @return null
+     * @return void
      */
     protected function _mapRequestToShipment(\Magento\Object $request)
     {
@@ -1488,7 +1492,7 @@ class Dhl
      * Do shipment request to carrier web service, obtain Print Shipping Labels and process errors in response
      *
      * @param \Magento\Object $request
-     * @return \Magento\Object
+     * @return \Magento\Object|Result
      */
     protected function _doShipmentRequest(\Magento\Object $request)
     {
diff --git a/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl/AbstractDhl.php b/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl/AbstractDhl.php
index 202c5a6d3fb..594959c758c 100644
--- a/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl/AbstractDhl.php
+++ b/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl/AbstractDhl.php
@@ -60,7 +60,7 @@ abstract class AbstractDhl extends \Magento\Usa\Model\Shipping\Carrier\AbstractC
     /**
      * Determine shipping day according to configuration settings
      *
-     * @param array $shippingDays
+     * @param string[] $shippingDays
      * @param string $date
      * @return string
      */
diff --git a/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl/International.php b/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl/International.php
index a900f13e50c..783f7bd51f3 100644
--- a/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl/International.php
+++ b/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl/International.php
@@ -26,6 +26,13 @@
 
 namespace Magento\Usa\Model\Shipping\Carrier\Dhl;
 
+use Magento\Catalog\Model\Product\Type;
+use Magento\Sales\Model\Order\Shipment;
+use Magento\Sales\Model\Quote\Address\RateRequest;
+use Magento\Sales\Model\Quote\Address\RateResult\Error;
+use Magento\Shipping\Model\Carrier\AbstractCarrier;
+use Magento\Shipping\Model\Rate\Result;
+
 /**
  * DHL International (API v1.4)
  */
@@ -48,7 +55,7 @@ class International
     /**
      * Container types that could be customized
      *
-     * @var array
+     * @var string[]
      */
     protected $_customizableContainerTypes = array(self::DHL_CONTENT_TYPE_NON_DOC);
 
@@ -60,7 +67,7 @@ class International
     /**
      * Rate request data
      *
-     * @var \Magento\Sales\Model\Quote\Address\RateRequest|null
+     * @var RateRequest|null
      */
     protected $_request = null;
 
@@ -74,7 +81,7 @@ class International
     /**
      * Rate result data
      *
-     * @var \Magento\Shipping\Model\Rate\Result|null
+     * @var Result|null
      */
     protected $_result = null;
 
@@ -88,7 +95,7 @@ class International
     /**
      * Errors placeholder
      *
-     * @var array
+     * @var string[]
      */
     protected $_errors = array();
 
@@ -222,7 +229,7 @@ class International
      * @param \Magento\Core\Model\StoreManagerInterface $storeManager
      * @param \Magento\Stdlib\String $string
      * @param \Magento\Math\Division $mathDivision
-     * @param \Magento\Filesystem $filesystem
+     * @param \Magento\App\Filesystem $filesystem
      * @param \Magento\Stdlib\DateTime $dateTime
      * @param \Zend_Http_ClientFactory $httpClientFactory
      * @param array $data
@@ -285,9 +292,9 @@ class International
     /**
      * Returns value of given variable
      *
-     * @param mixed $origValue
+     * @param string|int $origValue
      * @param string $pathToValue
-     * @return mixed
+     * @return string|int|null
      */
     protected function _getDefaultValue($origValue, $pathToValue)
     {
@@ -304,10 +311,10 @@ class International
     /**
      * Collect and get rates
      *
-     * @param \Magento\Sales\Model\Quote\Address\RateRequest $request
-     * @return bool|\Magento\Shipping\Model\Rate\Result|null
+     * @param RateRequest $request
+     * @return bool|Result|null
      */
-    public function collectRates(\Magento\Sales\Model\Quote\Address\RateRequest $request)
+    public function collectRates(RateRequest $request)
     {
         if (!$this->getConfigFlag($this->_activeFlag)) {
             return false;
@@ -322,19 +329,19 @@ class International
         );
         $origCountryId = $this->_getDefaultValue(
             $requestDhl->getOrigCountryId(),
-            \Magento\Sales\Model\Order\Shipment::XML_PATH_STORE_COUNTRY_ID
+            Shipment::XML_PATH_STORE_COUNTRY_ID
         );
         $origState = $this->_getDefaultValue(
             $requestDhl->getOrigState(),
-            \Magento\Sales\Model\Order\Shipment::XML_PATH_STORE_REGION_ID
+            Shipment::XML_PATH_STORE_REGION_ID
         );
         $origCity = $this->_getDefaultValue(
             $requestDhl->getOrigCity(),
-            \Magento\Sales\Model\Order\Shipment::XML_PATH_STORE_CITY
+            Shipment::XML_PATH_STORE_CITY
         );
         $origPostcode = $this->_getDefaultValue(
             $requestDhl->getOrigPostcode(),
-            \Magento\Sales\Model\Order\Shipment::XML_PATH_STORE_ZIP
+            Shipment::XML_PATH_STORE_ZIP
         );
 
         $requestDhl->setOrigCompanyName($origCompanyName)
@@ -354,7 +361,7 @@ class International
     /**
      * Set Free Method Request
      *
-     * @param  string $freeMethod
+     * @param string $freeMethod
      * @return void
      */
     protected function _setFreeMethodRequest($freeMethod)
@@ -370,7 +377,7 @@ class International
     /**
      * Returns request result
      *
-     * @return \Magento\Shipping\Model\Rate\Result|null
+     * @return Result|null
      */
     public function getResult()
     {
@@ -401,7 +408,7 @@ class International
      * Prepare and set request in property of current instance
      *
      * @param \Magento\Object $request
-     * @return \Magento\Usa\Model\Shipping\Carrier\Dhl
+     * @return $this
      */
     public function setRequest(\Magento\Object $request)
     {
@@ -426,11 +433,11 @@ class International
 
         $requestObject->setOrigCountry(
                 $this->_getDefaultValue(
-                    $request->getOrigCountry(), \Magento\Sales\Model\Order\Shipment::XML_PATH_STORE_COUNTRY_ID)
+                    $request->getOrigCountry(), Shipment::XML_PATH_STORE_COUNTRY_ID)
             )
             ->setOrigCountryId(
                 $this->_getDefaultValue(
-                    $request->getOrigCountryId(), \Magento\Sales\Model\Order\Shipment::XML_PATH_STORE_COUNTRY_ID)
+                    $request->getOrigCountryId(), Shipment::XML_PATH_STORE_COUNTRY_ID)
             );
 
         $shippingWeight = $request->getPackageWeight();
@@ -454,7 +461,7 @@ class International
             ->setDestCompanyName($request->getDestCompanyName());
 
         $originStreet2 = $this->_coreStoreConfig->getConfig(
-                \Magento\Sales\Model\Order\Shipment::XML_PATH_STORE_ADDRESS2, $requestObject->getStoreId());
+            Shipment::XML_PATH_STORE_ADDRESS2, $requestObject->getStoreId());
 
         $requestObject->setOrigStreet($request->getOrigStreet() ? $request->getOrigStreet() : $originStreet2);
 
@@ -497,7 +504,7 @@ class International
     /**
      * Get allowed shipping methods
      *
-     * @return array
+     * @return string[]
      * @throws \Magento\Core\Exception
      */
     public function getAllowedMethods()
@@ -683,7 +690,7 @@ class International
 
         if ($configWeightUnit != $countryWeightUnit) {
             $weight = $this->_usaData->convertMeasureWeight(
-                round($weight,3),
+                round($weight, 3),
                 $configWeightUnit,
                 $countryWeightUnit
             );
@@ -703,7 +710,7 @@ class International
         $fullItems  = array();
 
         foreach ($allItems as $item) {
-            if ($item->getProductType() == \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE
+            if ($item->getProductType() == Type::TYPE_BUNDLE
                 && $item->getProduct()->getShipmentType()
             ) {
                 continue;
@@ -724,26 +731,26 @@ class International
             }
 
             $itemWeight = $item->getWeight();
-            if ($item->getIsQtyDecimal() && $item->getProductType() != \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE) {
+            if ($item->getIsQtyDecimal() && $item->getProductType() != Type::TYPE_BUNDLE) {
                 $stockItem = $item->getProduct()->getStockItem();
                 if ($stockItem->getIsDecimalDivided()) {
-                   if ($stockItem->getEnableQtyIncrements() && $stockItem->getQtyIncrements()) {
+                    if ($stockItem->getEnableQtyIncrements() && $stockItem->getQtyIncrements()) {
                         $itemWeight = $itemWeight * $stockItem->getQtyIncrements();
                         $qty        = round(($item->getWeight() / $itemWeight) * $qty);
                         $changeQty  = false;
-                   } else {
-                       $itemWeight = $this->_getWeight($itemWeight * $item->getQty());
-                       $maxWeight  = $this->_getWeight($this->_maxWeight, true);
-                       if ($itemWeight > $maxWeight) {
-                           $qtyItem = floor($itemWeight / $maxWeight);
-                           $decimalItems[] = array('weight' => $maxWeight, 'qty' => $qtyItem);
-                           $weightItem = $this->mathDivision->getExactDivision($itemWeight, $maxWeight);
-                           if ($weightItem) {
-                               $decimalItems[] = array('weight' => $weightItem, 'qty' => 1);
-                           }
-                           $checkWeight = false;
-                       }
-                   }
+                    } else {
+                        $itemWeight = $this->_getWeight($itemWeight * $item->getQty());
+                        $maxWeight  = $this->_getWeight($this->_maxWeight, true);
+                        if ($itemWeight > $maxWeight) {
+                            $qtyItem = floor($itemWeight / $maxWeight);
+                            $decimalItems[] = array('weight' => $maxWeight, 'qty' => $qtyItem);
+                            $weightItem = $this->mathDivision->getExactDivision($itemWeight, $maxWeight);
+                            if ($weightItem) {
+                                $decimalItems[] = array('weight' => $weightItem, 'qty' => 1);
+                            }
+                            $checkWeight = false;
+                        }
+                    }
                 } else {
                     $itemWeight = $itemWeight * $item->getQty();
                 }
@@ -754,7 +761,7 @@ class International
             }
 
             if ($changeQty && !$item->getParentItem() && $item->getIsQtyDecimal()
-                && $item->getProductType() != \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE
+                && $item->getProductType() != Type::TYPE_BUNDLE
             ) {
                 $qty = 1;
             }
@@ -839,7 +846,7 @@ class International
         }
 
         $handlingAction = $this->getConfigData('handling_action');
-        if ($handlingAction == \Magento\Shipping\Model\Carrier\AbstractCarrier::HANDLING_ACTION_PERORDER || !$numberOfPieces) {
+        if ($handlingAction == AbstractCarrier::HANDLING_ACTION_PERORDER || !$numberOfPieces) {
             $numberOfPieces = 1;
         }
         $this->_numBoxes = $numberOfPieces;
@@ -903,7 +910,7 @@ class International
     /**
      * Get shipping quotes
      *
-     * @return \Magento\Core\Model\AbstractModel|\Magento\Shipping\Model\Rate\Result
+     * @return \Magento\Core\Model\AbstractModel|Result
      */
     protected function _getQuotes()
     {
@@ -1041,7 +1048,7 @@ class International
      * Parse response from DHL web service
      *
      * @param string $response
-     * @return bool|\Magento\Object|\Magento\Shipping\Model\Rate\Result|\Magento\Sales\Model\Quote\Address\RateResult\Error
+     * @return bool|\Magento\Object|Result|Error
      * @throws \Magento\Core\Exception
      */
     protected function _parseResponse($response)
@@ -1096,7 +1103,7 @@ class International
             $this->_errors[] = $responseError;
         }
 
-        /* @var $result \Magento\Shipping\Model\Rate\Result */
+        /* @var $result Result */
         $result = $this->_rateFactory->create();
         if ($this->_rates) {
             foreach ($this->_rates as $rate) {
@@ -1125,7 +1132,7 @@ class International
      * Add rate to DHL rates array
      *
      * @param \SimpleXMLElement $shipmentDetails
-     * @return \Magento\Usa\Model\Shipping\Carrier\Dhl\International
+     * @return $this
      */
     protected function _addRate(\SimpleXMLElement $shipmentDetails)
     {
@@ -1265,10 +1272,10 @@ class International
     /**
      * Processing additional validation to check is carrier applicable.
      *
-     * @param \Magento\Sales\Model\Quote\Address\RateRequest $request
-     * @return \Magento\Shipping\Model\Carrier\AbstractCarrier|\Magento\Sales\Model\Quote\Address\RateResult\Error|boolean
+     * @param RateRequest $request
+     * @return $this|Error|boolean
      */
-    public function proccessAdditionalValidation(\Magento\Sales\Model\Quote\Address\RateRequest $request)
+    public function proccessAdditionalValidation(RateRequest $request)
     {
         //Skip by item validation if there is no items in request
         if (!count($this->getAllItems($request))) {
@@ -1276,7 +1283,7 @@ class International
         }
 
         $countryParams = $this->getCountryParams(
-            $this->_coreStoreConfig->getConfig(\Magento\Sales\Model\Order\Shipment::XML_PATH_STORE_COUNTRY_ID, $request->getStoreId())
+            $this->_coreStoreConfig->getConfig(Shipment::XML_PATH_STORE_COUNTRY_ID, $request->getStoreId())
         );
         if (!$countryParams->getData()) {
             $this->_errors[] = __('Please, specify origin country');
@@ -1292,14 +1299,14 @@ class International
     /**
      * Show default error
      *
-     * @return bool|\Magento\Sales\Model\Quote\Address\RateResult\Error
+     * @return bool|Error
      */
     protected function _showError()
     {
         $showMethod = $this->getConfigData('showmethod');
 
         if ($showMethod) {
-            /* @var $error \Magento\Sales\Model\Quote\Address\RateResult\Error */
+            /* @var $error Error */
             $error = $this->_rateErrorFactory->create();
             $error->setCarrier(self::CODE);
             $error->setCarrierTitle($this->getConfigData('title'));
@@ -1329,12 +1336,11 @@ class International
      * Map request to shipment
      *
      * @param \Magento\Object $request
-     * @return null
+     * @return void
      * @throws \Magento\Core\Exception
      */
     protected function _mapRequestToShipment(\Magento\Object $request)
     {
-
         $request->setOrigCountryId($request->getShipperAddressCountryCode());
         $this->_rawRequest = $request;
         $customsValue = 0;
@@ -1370,21 +1376,21 @@ class International
             ->setFreeMethodWeight(0);
     }
 
-        /**
-         * Retrieve minimum allowed value for dimensions in given dimension unit
-         *
-         * @param string $dimensionUnit
-         * @return int
-         */
-        protected function _getMinDimension($dimensionUnit)
-        {
-            return $dimensionUnit == "CENTIMETER" ? self::DIMENSION_MIN_CM : self::DIMENSION_MIN_IN;
-        }
+    /**
+     * Retrieve minimum allowed value for dimensions in given dimension unit
+     *
+     * @param string $dimensionUnit
+     * @return int
+     */
+    protected function _getMinDimension($dimensionUnit)
+    {
+        return $dimensionUnit == "CENTIMETER" ? self::DIMENSION_MIN_CM : self::DIMENSION_MIN_IN;
+    }
 
     /**
      * Do rate request and handle errors
      *
-     * @return \Magento\Shipping\Model\Rate\Result|\Magento\Object
+     * @return Result|\Magento\Object
      * @throws \Magento\Core\Exception
      */
     protected function _doRequest()
@@ -1392,7 +1398,7 @@ class International
         $rawRequest = $this->_request;
 
         $originRegion = $this->getCountryParams(
-            $this->_coreStoreConfig->getConfig(\Magento\Sales\Model\Order\Shipment::XML_PATH_STORE_COUNTRY_ID, $this->getStore())
+            $this->_coreStoreConfig->getConfig(Shipment::XML_PATH_STORE_COUNTRY_ID, $this->getStore())
         )->getRegion();
 
         if (!$originRegion) {
@@ -1560,7 +1566,7 @@ class International
      * Generation Shipment Details Node according to origin region
      *
      * @param \Magento\Usa\Model\Simplexml\Element $xml
-     * @param \Magento\Sales\Model\Quote\Address\RateRequest $rawRequest
+     * @param RateRequest $rawRequest
      * @param string $originRegion
      * @return void
      */
@@ -1593,7 +1599,7 @@ class International
             }
             $nodePiece->addChild('PieceID', ++$i);
             $nodePiece->addChild('PackageType', $packageType);
-            $nodePiece->addChild('Weight', round($package['params']['weight'],1));
+            $nodePiece->addChild('Weight', round($package['params']['weight'], 1));
             $params = $package['params'];
             if ($params['width'] && $params['length'] && $params['height']) {
                 if (!$originRegion) {
@@ -1614,9 +1620,9 @@ class International
         }
 
         if (!$originRegion) {
-            $nodeShipmentDetails->addChild('Weight', round($rawRequest->getPackageWeight(),1));
+            $nodeShipmentDetails->addChild('Weight', round($rawRequest->getPackageWeight(), 1));
 
-            $nodeShipmentDetails->addChild('WeightUnit', substr($this->_getWeightUnit(),0,1));
+            $nodeShipmentDetails->addChild('WeightUnit', substr($this->_getWeightUnit(), 0, 1));
 
             $nodeShipmentDetails->addChild('GlobalProductCode', $rawRequest->getShippingMethod());
             $nodeShipmentDetails->addChild('LocalProductCode', $rawRequest->getShippingMethod());
@@ -1647,8 +1653,8 @@ class International
             $nodeShipmentDetails->addChild('PackageType', $packageType);
             $nodeShipmentDetails->addChild('Weight', $rawRequest->getPackageWeight());
 
-            $nodeShipmentDetails->addChild('DimensionUnit', substr($this->_getDimensionUnit(),0,1));
-            $nodeShipmentDetails->addChild('WeightUnit',  substr($this->_getWeightUnit(),0,1));
+            $nodeShipmentDetails->addChild('DimensionUnit', substr($this->_getDimensionUnit(), 0, 1));
+            $nodeShipmentDetails->addChild('WeightUnit', substr($this->_getWeightUnit(), 0, 1));
 
             $nodeShipmentDetails->addChild('GlobalProductCode', $rawRequest->getShippingMethod());
             $nodeShipmentDetails->addChild('LocalProductCode', $rawRequest->getShippingMethod());
@@ -1667,8 +1673,8 @@ class International
     /**
      * Get tracking
      *
-     * @param mixed $trackings
-     * @return mixed
+     * @param string|string[] $trackings
+     * @return Result|null
      */
     public function getTracking($trackings)
     {
@@ -1683,7 +1689,7 @@ class International
     /**
      * Send request for tracking
      *
-     * @param array $trackings
+     * @param string[] $trackings
      * @return void
      */
     protected function _getXMLTracking($trackings)
@@ -1751,7 +1757,7 @@ class International
     /**
      * Parse xml tracking response
      *
-     * @param array $trackings
+     * @param string[] $trackings
      * @param string $response
      * @return void
      */
@@ -1849,7 +1855,7 @@ class International
      */
     protected function _getPerpackagePrice($cost, $handlingType, $handlingFee)
     {
-        if ($handlingType == \Magento\Shipping\Model\Carrier\AbstractCarrier::HANDLING_TYPE_PERCENT) {
+        if ($handlingType == AbstractCarrier::HANDLING_TYPE_PERCENT) {
             return $cost + ($cost * $this->_numBoxes * $handlingFee / 100);
         }
 
diff --git a/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl/International/Source/Contenttype.php b/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl/International/Source/Contenttype.php
index 67bf71323de..e9adef5d258 100644
--- a/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl/International/Source/Contenttype.php
+++ b/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl/International/Source/Contenttype.php
@@ -23,22 +23,17 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Usa\Model\Shipping\Carrier\Dhl\International\Source;
 
 /**
  * Source model for DHL Content Type
  *
- * @category   Magento
- * @package    Magento_Usa
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Usa\Model\Shipping\Carrier\Dhl\International\Source;
-
 class Contenttype implements \Magento\Core\Model\Option\ArrayInterface
 {
     /**
-     * Returns array to be used in multiselect on back-end
-     *
-     * @return array
+     * {@inheritdoc}
      */
     public function toOptionArray()
     {
diff --git a/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl/International/Source/Method/AbstractMethod.php b/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl/International/Source/Method/AbstractMethod.php
index 68adfee316a..d1bcadb8709 100644
--- a/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl/International/Source/Method/AbstractMethod.php
+++ b/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl/International/Source/Method/AbstractMethod.php
@@ -23,16 +23,13 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Usa\Model\Shipping\Carrier\Dhl\International\Source\Method;
 
 /**
  * Source model for DHL shipping methods
  *
- * @category   Magento
- * @package    Magento_Usa
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Usa\Model\Shipping\Carrier\Dhl\International\Source\Method;
-
 abstract class AbstractMethod extends \Magento\Usa\Model\Shipping\Carrier\Dhl\International\Source\Method\Generic
 {
     /**
@@ -50,9 +47,7 @@ abstract class AbstractMethod extends \Magento\Usa\Model\Shipping\Carrier\Dhl\In
     protected $_noneMethod = false;
 
     /**
-     * Returns array to be used in multiselect on back-end
-     *
-     * @return array
+     * {@inheritdoc}
      */
     public function toOptionArray()
     {
diff --git a/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl/Source/Freemethod.php b/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl/Source/Freemethod.php
index 6d3755ce96a..707aaaae56f 100644
--- a/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl/Source/Freemethod.php
+++ b/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl/Source/Freemethod.php
@@ -23,12 +23,13 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
-
 namespace Magento\Usa\Model\Shipping\Carrier\Dhl\Source;
 
 class Freemethod extends \Magento\Usa\Model\Shipping\Carrier\Dhl\Source\Method
 {
+    /**
+     * {@inheritdoc}
+     */
     public function toOptionArray()
     {
         $arr = parent::toOptionArray();
diff --git a/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl/Source/Protection/Rounding.php b/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl/Source/Protection/Rounding.php
index 0253603559f..036156f8ac4 100644
--- a/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl/Source/Protection/Rounding.php
+++ b/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl/Source/Protection/Rounding.php
@@ -29,6 +29,9 @@ namespace Magento\Usa\Model\Shipping\Carrier\Dhl\Source\Protection;
 
 class Rounding extends \Magento\Usa\Model\Shipping\Carrier\Dhl\Source\Generic
 {
+    /**
+     * {@inheritdoc}
+     */
     public function toOptionArray()
     {
         $carrier = $this->_shippingDhl;
diff --git a/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl/Source/Protection/Value.php b/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl/Source/Protection/Value.php
index d1e02f22274..d00058bae4c 100644
--- a/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl/Source/Protection/Value.php
+++ b/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl/Source/Protection/Value.php
@@ -29,6 +29,9 @@ namespace Magento\Usa\Model\Shipping\Carrier\Dhl\Source\Protection;
 
 class Value extends \Magento\Usa\Model\Shipping\Carrier\Dhl\Source\Generic
 {
+    /**
+     * {@inheritdoc}
+     */
     public function toOptionArray()
     {
         $carrier = $this->_shippingDhl;
diff --git a/app/code/Magento/Usa/Model/Shipping/Carrier/Fedex.php b/app/code/Magento/Usa/Model/Shipping/Carrier/Fedex.php
index 19c977eab9c..cfd4298d850 100644
--- a/app/code/Magento/Usa/Model/Shipping/Carrier/Fedex.php
+++ b/app/code/Magento/Usa/Model/Shipping/Carrier/Fedex.php
@@ -23,16 +23,16 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Usa\Model\Shipping\Carrier;
+
+use Magento\Sales\Model\Quote\Address\RateRequest;
+use Magento\Shipping\Model\Rate\Result;
 
 /**
  * Fedex shipping implementation
  *
- * @category   Magento
- * @package    Magento_Usa
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Usa\Model\Shipping\Carrier;
-
 class Fedex
     extends \Magento\Usa\Model\Shipping\Carrier\AbstractCarrier
     implements \Magento\Shipping\Model\Carrier\CarrierInterface
@@ -69,7 +69,7 @@ class Fedex
     /**
      * Rate request data
      *
-     * @var \Magento\Sales\Model\Quote\Address\RateRequest|null
+     * @var RateRequest|null
      */
     protected $_request = null;
 
@@ -83,7 +83,7 @@ class Fedex
     /**
      * Rate result data
      *
-     * @var \Magento\Shipping\Model\Rate\Result|null
+     * @var Result|null
      */
     protected $_result = null;
 
@@ -111,7 +111,7 @@ class Fedex
     /**
      * Container types that could be customized for FedEx carrier
      *
-     * @var array
+     * @var string[]
      */
     protected $_customizableContainerTypes = array('YOUR_PACKAGING');
 
@@ -248,10 +248,10 @@ class Fedex
     /**
      * Collect and get rates
      *
-     * @param \Magento\Sales\Model\Quote\Address\RateRequest $request
-     * @return \Magento\Shipping\Model\Rate\Result|bool|null
+     * @param RateRequest $request
+     * @return Result|bool|null
      */
-    public function collectRates(\Magento\Sales\Model\Quote\Address\RateRequest $request)
+    public function collectRates(RateRequest $request)
     {
         if (!$this->getConfigFlag($this->_activeFlag)) {
             return false;
@@ -268,10 +268,10 @@ class Fedex
     /**
      * Prepare and set request to this instance
      *
-     * @param \Magento\Sales\Model\Quote\Address\RateRequest $request
-     * @return \Magento\Usa\Model\Shipping\Carrier\Fedex
+     * @param RateRequest $request
+     * @return $this
      */
-    public function setRequest(\Magento\Sales\Model\Quote\Address\RateRequest $request)
+    public function setRequest(RateRequest $request)
     {
         $this->_request = $request;
 
@@ -359,11 +359,11 @@ class Fedex
     /**
      * Get result of request
      *
-     * @return mixed
+     * @return Result|null
      */
     public function getResult()
     {
-       return $this->_result;
+        return $this->_result;
     }
 
     /**
@@ -500,7 +500,7 @@ class Fedex
     /**
      * Do remote request for and handle errors
      *
-     * @return \Magento\Shipping\Model\Rate\Result
+     * @return Result
      */
     protected function _getQuotes()
     {
@@ -527,7 +527,7 @@ class Fedex
      * Prepare shipping rate result based on response
      *
      * @param mixed $response
-     * @return \Magento\Shipping\Model\Rate\Result
+     * @return Result
      */
     protected function _prepareRateResponse($response)
     {
@@ -624,7 +624,7 @@ class Fedex
     /**
      * Set free method request
      *
-     * @param  $freeMethod
+     * @param string $freeMethod
      * @return void
      */
     protected function _setFreeMethodRequest($freeMethod)
@@ -638,7 +638,7 @@ class Fedex
     /**
      * Get xml quotes
      *
-     * @return \Magento\Shipping\Model\Rate\Result
+     * @return Result
      */
     protected function _getXmlQuotes()
     {
@@ -721,7 +721,7 @@ class Fedex
      * Prepare shipping rate result based on response
      *
      * @param mixed $response
-     * @return \Magento\Shipping\Model\Rate\Result
+     * @return Result
      */
     protected function _parseXmlResponse($response)
     {
@@ -729,34 +729,33 @@ class Fedex
         $priceArr = array();
 
         if (strlen(trim($response))>0) {
-           if ($xml = $this->_parseXml($response)) {
-
-               if (is_object($xml->Error) && is_object($xml->Error->Message)) {
-                   $errorTitle = (string)$xml->Error->Message;
-               } elseif (is_object($xml->SoftError) && is_object($xml->SoftError->Message)) {
-                   $errorTitle = (string)$xml->SoftError->Message;
-               } else {
-                   $errorTitle = 'Sorry, something went wrong. Please try again or contact us and we\'ll try to help.';
-               }
-
-               $allowedMethods = explode(",", $this->getConfigData('allowed_methods'));
-
-               foreach ($xml->Entry as $entry) {
-                   if (in_array((string)$entry->Service, $allowedMethods)) {
-                       $costArr[(string)$entry->Service] =
-                           (string)$entry->EstimatedCharges->DiscountedCharges->NetCharge;
-                       $priceArr[(string)$entry->Service] = $this->getMethodPrice(
-                           (string)$entry->EstimatedCharges->DiscountedCharges->NetCharge,
-                           (string)$entry->Service
-                       );
-                   }
-               }
-
-               asort($priceArr);
-
-           } else {
-               $errorTitle = 'Response is in the wrong format.';
-           }
+            if ($xml = $this->_parseXml($response)) {
+                if (is_object($xml->Error) && is_object($xml->Error->Message)) {
+                    $errorTitle = (string)$xml->Error->Message;
+                } elseif (is_object($xml->SoftError) && is_object($xml->SoftError->Message)) {
+                    $errorTitle = (string)$xml->SoftError->Message;
+                } else {
+                    $errorTitle = 'Sorry, something went wrong. Please try again or contact us and we\'ll try to help.';
+                }
+
+                $allowedMethods = explode(",", $this->getConfigData('allowed_methods'));
+
+                foreach ($xml->Entry as $entry) {
+                    if (in_array((string)$entry->Service, $allowedMethods)) {
+                        $costArr[(string)$entry->Service] =
+                            (string)$entry->EstimatedCharges->DiscountedCharges->NetCharge;
+                        $priceArr[(string)$entry->Service] = $this->getMethodPrice(
+                            (string)$entry->EstimatedCharges->DiscountedCharges->NetCharge,
+                            (string)$entry->Service
+                        );
+                    }
+                }
+
+                asort($priceArr);
+
+            } else {
+                $errorTitle = 'Response is in the wrong format.';
+            }
         } else {
             $errorTitle = 'Unable to retrieve tracking';
         }
@@ -809,7 +808,7 @@ class Fedex
      *
      * @param string $type
      * @param string $code
-     * @return array|bool
+     * @return array|false
      */
     public function getCode($type, $code='')
     {
@@ -971,9 +970,9 @@ class Fedex
     }
 
     /**
-     *  Return FeDex currency ISO code by Magento Base Currency Code
+     * Return FeDex currency ISO code by Magento Base Currency Code
      *
-     *  @return string 3-digit currency code
+     * @return string 3-digit currency code
      */
     public function getCurrencyCode ()
     {
@@ -1001,8 +1000,8 @@ class Fedex
     /**
      * Get tracking
      *
-     * @param mixed $trackings
-     * @return mixed
+     * @param string|string[] $trackings
+     * @return Result|null
      */
     public function getTracking($trackings)
     {
@@ -1012,7 +1011,7 @@ class Fedex
             $trackings=array($trackings);
         }
 
-        foreach($trackings as $tracking){
+        foreach ($trackings as $tracking) {
             $this->_getXMLTracking($tracking);
         }
 
@@ -1037,7 +1036,7 @@ class Fedex
     /**
      * Send request for tracking
      *
-     * @param array $tracking
+     * @param string[] $tracking
      * @return void
      */
     protected function _getXMLTracking($tracking)
@@ -1094,8 +1093,9 @@ class Fedex
     /**
      * Parse tracking response
      *
-     * @param array $trackingValue
+     * @param string[] $trackingValue
      * @param \stdClass $response
+     * @return void
      */
     protected function _parseTrackingResponse($trackingValue, $response)
     {
@@ -1188,12 +1188,12 @@ class Fedex
             $tracking->addData($resultArray);
             $this->_result->append($tracking);
         } else {
-           $error = $this->_trackErrorFactory->create();
-           $error->setCarrier('fedex');
-           $error->setCarrierTitle($this->getConfigData('title'));
-           $error->setTracking($trackingValue);
-           $error->setErrorMessage($errorTitle ? $errorTitle : __('Unable to retrieve tracking'));
-           $this->_result->append($error);
+            $error = $this->_trackErrorFactory->create();
+            $error->setCarrier('fedex');
+            $error->setCarrierTitle($this->getConfigData('title'));
+            $error->setTracking($trackingValue);
+            $error->setErrorMessage($errorTitle ? $errorTitle : __('Unable to retrieve tracking'));
+            $this->_result->append($error);
         }
     }
 
@@ -1207,8 +1207,8 @@ class Fedex
         $statuses = '';
         if ($this->_result instanceof \Magento\Shipping\Model\Tracking\Result) {
             if ($trackings = $this->_result->getAllTrackings()) {
-                foreach ($trackings as $tracking){
-                    if($data = $tracking->getAllData()){
+                foreach ($trackings as $tracking) {
+                    if ($data = $tracking->getAllData()) {
                         if (!empty($data['status'])) {
                             $statuses .= __($data['status']) . "\n<br/>";
                         } else {
diff --git a/app/code/Magento/Usa/Model/Shipping/Carrier/Fedex/Source/Freemethod.php b/app/code/Magento/Usa/Model/Shipping/Carrier/Fedex/Source/Freemethod.php
index 36643bea88b..b4affd0381a 100644
--- a/app/code/Magento/Usa/Model/Shipping/Carrier/Fedex/Source/Freemethod.php
+++ b/app/code/Magento/Usa/Model/Shipping/Carrier/Fedex/Source/Freemethod.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Usa\Model\Shipping\Carrier\Fedex\Source;
 
 /**
  * Fedex freemethod source implementation
@@ -31,11 +32,12 @@
  * @package    Magento_Usa
  * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Usa\Model\Shipping\Carrier\Fedex\Source;
-
 class Freemethod
     extends \Magento\Usa\Model\Shipping\Carrier\Fedex\Source\Method
 {
+    /**
+     * {@inheritdoc}
+     */
     public function toOptionArray()
     {
         $arr = parent::toOptionArray();
diff --git a/app/code/Magento/Usa/Model/Shipping/Carrier/Ups.php b/app/code/Magento/Usa/Model/Shipping/Carrier/Ups.php
index 89a7b91c77e..3858e3006de 100644
--- a/app/code/Magento/Usa/Model/Shipping/Carrier/Ups.php
+++ b/app/code/Magento/Usa/Model/Shipping/Carrier/Ups.php
@@ -23,15 +23,18 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Usa\Model\Shipping\Carrier;
 
+use Magento\Sales\Model\Quote\Address\RateRequest;
+use Magento\Shipping\Model\Rate\Result;
+use Magento\Usa\Model\Shipping\Carrier\AbstractCarrier;
+use Magento\Usa\Model\Simplexml\Element;
 
 /**
  * UPS shipping implementation
  */
-namespace Magento\Usa\Model\Shipping\Carrier;
-
 class Ups
-    extends \Magento\Usa\Model\Shipping\Carrier\AbstractCarrier
+    extends AbstractCarrier
     implements \Magento\Shipping\Model\Carrier\CarrierInterface
 {
 
@@ -58,7 +61,7 @@ class Ups
     /**
      * Rate request data
      *
-     * @var \Magento\Sales\Model\Quote\Address\RateRequest
+     * @var RateRequest
      */
     protected $_request;
 
@@ -72,14 +75,14 @@ class Ups
     /**
      * Rate result data
      *
-     * @var \Magento\Shipping\Model\Rate\Result
+     * @var Result
      */
     protected $_result;
 
     /**
      * Base currency rate
      *
-     * @var double
+     * @var float
      */
     protected $_baseCurrencyRate;
 
@@ -120,7 +123,7 @@ class Ups
     /**
      * Container types that could be customized for UPS carrier
      *
-     * @var array
+     * @var string[]
      */
     protected $_customizableContainerTypes = array('CP', 'CSP');
 
@@ -192,15 +195,14 @@ class Ups
         );
     }
 
-
     /**
      * Collect and get rates
      *
-     * @param \Magento\Sales\Model\Quote\Address\RateRequest $request
-     * @return \Magento\Shipping\Model\Rate\Result|bool|null
+     * @param RateRequest $request
+     * @return Result|bool|null
      */
 
-    public function collectRates(\Magento\Sales\Model\Quote\Address\RateRequest $request)
+    public function collectRates(RateRequest $request)
     {
         if (!$this->getConfigFlag($this->_activeFlag)) {
             return false;
@@ -217,10 +219,10 @@ class Ups
     /**
      * Prepare and set request to this instance
      *
-     * @param \Magento\Sales\Model\Quote\Address\RateRequest $request
-     * @return \Magento\Usa\Model\Shipping\Carrier\Ups
+     * @param RateRequest $request
+     * @return $this
      */
-    public function setRequest(\Magento\Sales\Model\Quote\Address\RateRequest $request)
+    public function setRequest(RateRequest $request)
     {
         $this->_request = $request;
 
@@ -359,7 +361,7 @@ class Ups
      * Checks the current weight to comply with the minimum weight standards set by the carrier.
      * Then strictly rounds the weight up until the first significant digit after the decimal point.
      *
-     * @param float|integer|double $weight
+     * @param float|int $weight
      * @return float
      */
     protected function _getCorrectWeight($weight)
@@ -379,7 +381,7 @@ class Ups
     /**
      * Get result of request
      *
-     * @return mixed
+     * @return Result
      */
     public function getResult()
     {
@@ -389,7 +391,7 @@ class Ups
     /**
      * Do remote request for  and handle errors
      *
-     * @return \Magento\Shipping\Model\Rate\Result
+     * @return Result|null
      */
     protected function _getQuotes()
     {
@@ -408,7 +410,7 @@ class Ups
      * Set free method request
      *
      * @param string $freeMethod
-     * @return null
+     * @return void
      */
     protected function _setFreeMethodRequest($freeMethod)
     {
@@ -424,12 +426,12 @@ class Ups
     /**
      * Get cgi rates
      *
-     * @return \Magento\Shipping\Model\Rate\Result
+     * @return Result
      */
     protected function _getCgiQuotes()
     {
         $rowRequest = $this->_rawRequest;
-        if (\Magento\Usa\Model\Shipping\Carrier\AbstractCarrier::USA_COUNTRY_ID == $rowRequest->getDestCountry()) {
+        if (AbstractCarrier::USA_COUNTRY_ID == $rowRequest->getDestCountry()) {
             $destPostal = substr($rowRequest->getDestPostal(), 0, 5);
         } else {
             $destPostal = $rowRequest->getDestPostal();
@@ -503,8 +505,8 @@ class Ups
     /**
      * Prepare shipping rate result based on response
      *
-     * @param mixed $response
-     * @return \Magento\Shipping\Model\Rate\Result
+     * @param string $response
+     * @return Result
      */
     protected function _parseCgiResponse($response)
     {
@@ -572,7 +574,7 @@ class Ups
      *
      * @param string $type
      * @param string $code
-     * @return array|bool
+     * @return array|false
      */
     public function getCode($type, $code = '')
     {
@@ -866,7 +868,7 @@ class Ups
     /**
      * Get xml rates
      *
-     * @return \Magento\Shipping\Model\Rate\Result
+     * @return Result
      */
     protected function _getXmlQuotes()
     {
@@ -876,7 +878,7 @@ class Ups
         $xmlRequest=$this->_xmlAccessRequest;
 
         $rowRequest = $this->_rawRequest;
-        if (\Magento\Usa\Model\Shipping\Carrier\AbstractCarrier::USA_COUNTRY_ID == $rowRequest->getDestCountry()) {
+        if (AbstractCarrier::USA_COUNTRY_ID == $rowRequest->getDestCountry()) {
             $destPostal = substr($rowRequest->getDestPostal(), 0, 5);
         } else {
             $destPostal = $rowRequest->getDestPostal();
@@ -1034,7 +1036,7 @@ XMLRequest;
      * Get base currency rate
      *
      * @param string $code
-     * @return double
+     * @return float
      */
     protected function _getBaseCurrencyRate($code)
     {
@@ -1051,7 +1053,7 @@ XMLRequest;
      * Prepare shipping rate result based on response
      *
      * @param mixed $xmlResponse
-     * @return \Magento\Shipping\Model\Rate\Result
+     * @return Result
      */
     protected function _parseXmlResponse($xmlResponse)
     {
@@ -1150,8 +1152,8 @@ XMLRequest;
     /**
      * Get tracking
      *
-     * @param mixed $trackings
-     * @return mixed
+     * @param string|string[] $trackings
+     * @return Result
      */
     public function getTracking($trackings)
     {
@@ -1171,7 +1173,7 @@ XMLRequest;
     /**
      * Set xml access request
      *
-     * @return null
+     * @return void
      */
     protected function setXMLAccessRequest()
     {
@@ -1192,8 +1194,8 @@ XMLAuth;
     /**
      * Get cgi tracking
      *
-     * @param mixed $trackings
-     * @return mixed
+     * @param string[] $trackings
+     * @return \Magento\Shipping\Model\Tracking\ResultFactory
      */
     protected function _getCgiTracking($trackings)
     {
@@ -1219,8 +1221,8 @@ XMLAuth;
     /**
      * Get xml tracking
      *
-     * @param mixed $trackings
-     * @return mixed
+     * @param string[] $trackings
+     * @return Result
      */
     protected function _getXmlTracking($trackings)
     {
@@ -1329,23 +1331,23 @@ XMLAuth;
                         $timeArr[] = substr($time, -2, 2);
 
                         if ($index === 1) {
-                           $resultArr['status'] = (string)$activityTag->Status->StatusType->Description;
-                           $resultArr['deliverydate'] = implode('-', $dateArr);//YYYY-MM-DD
-                           $resultArr['deliverytime'] = implode(':', $timeArr);//HH:MM:SS
-                           $resultArr['deliverylocation'] = (string)$activityTag->ActivityLocation->Description;
-                           $resultArr['signedby'] = (string)$activityTag->ActivityLocation->SignedForByName;
-                           if ($addArr) {
-                            $resultArr['deliveryto']=implode(', ', $addArr);
-                           }
+                            $resultArr['status'] = (string)$activityTag->Status->StatusType->Description;
+                            $resultArr['deliverydate'] = implode('-', $dateArr);//YYYY-MM-DD
+                            $resultArr['deliverytime'] = implode(':', $timeArr);//HH:MM:SS
+                            $resultArr['deliverylocation'] = (string)$activityTag->ActivityLocation->Description;
+                            $resultArr['signedby'] = (string)$activityTag->ActivityLocation->SignedForByName;
+                            if ($addArr) {
+                                $resultArr['deliveryto']=implode(', ', $addArr);
+                            }
                         } else {
-                           $tempArr = array();
-                           $tempArr['activity'] = (string)$activityTag->Status->StatusType->Description;
-                           $tempArr['deliverydate'] = implode('-', $dateArr);//YYYY-MM-DD
-                           $tempArr['deliverytime'] = implode(':', $timeArr);//HH:MM:SS
-                           if ($addArr) {
-                            $tempArr['deliverylocation']=implode(', ', $addArr);
-                           }
-                           $packageProgress[] = $tempArr;
+                            $tempArr = array();
+                            $tempArr['activity'] = (string)$activityTag->Status->StatusType->Description;
+                            $tempArr['deliverydate'] = implode('-', $dateArr);//YYYY-MM-DD
+                            $tempArr['deliverytime'] = implode(':', $timeArr);//HH:MM:SS
+                            if ($addArr) {
+                                $tempArr['deliverylocation']=implode(', ', $addArr);
+                            }
+                            $packageProgress[] = $tempArr;
                         }
                         $index++;
                     }
@@ -1583,7 +1585,7 @@ XMLAuth;
 
         $deliveryConfirmation = $packageParams->getDeliveryConfirmation();
         if ($deliveryConfirmation) {
-            /** @var $serviceOptionsNode \Magento\Usa\Model\Simplexml\Element */
+            /** @var $serviceOptionsNode Element */
             $serviceOptionsNode = null;
             switch ($this->_getDeliveryConfirmationLevel($request->getRecipientAddressCountryCode())) {
                 case self::DELIVERY_CONFIRMATION_PACKAGE:
@@ -1608,7 +1610,7 @@ XMLAuth;
             ->addChild('AccountNumber', $this->getConfigData('shipper_number'));
 
         if ($request->getPackagingType() != $this->getCode('container', 'ULE')
-            && $request->getShipperAddressCountryCode() == \Magento\Usa\Model\Shipping\Carrier\AbstractCarrier::USA_COUNTRY_ID
+            && $request->getShipperAddressCountryCode() == AbstractCarrier::USA_COUNTRY_ID
             && ($request->getRecipientAddressCountryCode() == 'CA' //Canada
                 || $request->getRecipientAddressCountryCode() == 'PR') //Puerto Rico
         ) {
@@ -1629,10 +1631,10 @@ XMLAuth;
     /**
      * Send and process shipment accept request
      *
-     * @param \Magento\Usa\Model\Simplexml\Element
+     * @param Element $shipmentConfirmResponse
      * @return \Magento\Object
      */
-    protected function _sendShipmentAcceptRequest(\Magento\Usa\Model\Simplexml\Element $shipmentConfirmResponse)
+    protected function _sendShipmentAcceptRequest(Element $shipmentConfirmResponse)
     {
         $xmlRequest = $this->_xmlElFactory->create(
             array('data' => '<?xml version = "1.0" ?><ShipmentAcceptRequest/>')
@@ -1906,7 +1908,7 @@ XMLAuth;
      * Get delivery confirmation level based on origin/destination
      * Return null if delivery confirmation is not acceptable
      *
-     * @var string $countyDestination
+     * @param string|null $countyDestination
      * @return int|null
      */
     protected function _getDeliveryConfirmationLevel($countyDestination = null)
@@ -1915,7 +1917,7 @@ XMLAuth;
             return null;
         }
 
-        if ($countyDestination == \Magento\Usa\Model\Shipping\Carrier\AbstractCarrier::USA_COUNTRY_ID) {
+        if ($countyDestination == AbstractCarrier::USA_COUNTRY_ID) {
             return self::DELIVERY_CONFIRMATION_PACKAGE;
         }
 
diff --git a/app/code/Magento/Usa/Model/Shipping/Carrier/Ups/Source/Freemethod.php b/app/code/Magento/Usa/Model/Shipping/Carrier/Ups/Source/Freemethod.php
index aba826ba9f9..3bc1313d255 100644
--- a/app/code/Magento/Usa/Model/Shipping/Carrier/Ups/Source/Freemethod.php
+++ b/app/code/Magento/Usa/Model/Shipping/Carrier/Ups/Source/Freemethod.php
@@ -29,6 +29,9 @@ namespace Magento\Usa\Model\Shipping\Carrier\Ups\Source;
 
 class Freemethod extends \Magento\Usa\Model\Shipping\Carrier\Ups\Source\Method
 {
+    /**
+     * {@inheritdoc}
+     */
     public function toOptionArray()
     {
         $arr = parent::toOptionArray();
diff --git a/app/code/Magento/Usa/Model/Shipping/Carrier/Ups/Source/Mode.php b/app/code/Magento/Usa/Model/Shipping/Carrier/Ups/Source/Mode.php
index 792a1e018fd..133e932a5be 100644
--- a/app/code/Magento/Usa/Model/Shipping/Carrier/Ups/Source/Mode.php
+++ b/app/code/Magento/Usa/Model/Shipping/Carrier/Ups/Source/Mode.php
@@ -37,7 +37,7 @@ namespace Magento\Usa\Model\Shipping\Carrier\Ups\Source;
 class Mode implements \Magento\Core\Model\Option\ArrayInterface
 {
     /**
-     * @return array
+     * {@inheritdoc}
      */
     public function toOptionArray()
     {
diff --git a/app/code/Magento/Usa/Model/Shipping/Carrier/Ups/Source/OriginShipment.php b/app/code/Magento/Usa/Model/Shipping/Carrier/Ups/Source/OriginShipment.php
index 462a9520ffa..6a80ec3f365 100644
--- a/app/code/Magento/Usa/Model/Shipping/Carrier/Ups/Source/OriginShipment.php
+++ b/app/code/Magento/Usa/Model/Shipping/Carrier/Ups/Source/OriginShipment.php
@@ -41,11 +41,14 @@ class OriginShipment extends \Magento\Usa\Model\Shipping\Carrier\Ups\Source\Gene
      */
     protected $_code = 'originShipment';
 
+    /**
+     * {@inheritdoc}
+     */
     public function toOptionArray()
     {
         $orShipArr = $this->_shippingUps->getCode($this->_code);
         $returnArr = array();
-        foreach ($orShipArr as $key => $val){
+        foreach ($orShipArr as $key => $val) {
             $returnArr[] = array('value' => $key,'label' => $key);
         }
         return $returnArr;
diff --git a/app/code/Magento/Usa/Model/Shipping/Carrier/Ups/Source/Pickup.php b/app/code/Magento/Usa/Model/Shipping/Carrier/Ups/Source/Pickup.php
index 928ef360226..9236170dcac 100644
--- a/app/code/Magento/Usa/Model/Shipping/Carrier/Ups/Source/Pickup.php
+++ b/app/code/Magento/Usa/Model/Shipping/Carrier/Ups/Source/Pickup.php
@@ -36,6 +36,9 @@ class Pickup extends \Magento\Usa\Model\Shipping\Carrier\Ups\Source\Generic
      */
     protected $_code = 'pickup';
 
+    /**
+     * {@inheritdoc}
+     */
     public function toOptionArray()
     {
         $ups = $this->_shippingUps->getCode($this->_code);
diff --git a/app/code/Magento/Usa/Model/Shipping/Carrier/Ups/Source/Type.php b/app/code/Magento/Usa/Model/Shipping/Carrier/Ups/Source/Type.php
index 8fac42be04c..4d7f8cf0884 100644
--- a/app/code/Magento/Usa/Model/Shipping/Carrier/Ups/Source/Type.php
+++ b/app/code/Magento/Usa/Model/Shipping/Carrier/Ups/Source/Type.php
@@ -34,6 +34,9 @@ namespace Magento\Usa\Model\Shipping\Carrier\Ups\Source;
 
 class Type implements \Magento\Core\Model\Option\ArrayInterface
 {
+    /**
+     * {@inheritdoc}
+     */
     public function toOptionArray()
     {
         return array(
diff --git a/app/code/Magento/Usa/Model/Shipping/Carrier/Ups/Source/Unitofmeasure.php b/app/code/Magento/Usa/Model/Shipping/Carrier/Ups/Source/Unitofmeasure.php
index 613e35a1f42..10247c0f469 100644
--- a/app/code/Magento/Usa/Model/Shipping/Carrier/Ups/Source/Unitofmeasure.php
+++ b/app/code/Magento/Usa/Model/Shipping/Carrier/Ups/Source/Unitofmeasure.php
@@ -36,11 +36,14 @@ class Unitofmeasure extends \Magento\Usa\Model\Shipping\Carrier\Ups\Source\Gener
      */
     protected $_code = 'unit_of_measure';
 
+    /**
+     * {@inheritdoc}
+     */
     public function toOptionArray()
     {
         $unitArr = $this->_shippingUps->getCode($this->_code);
         $returnArr = array();
-        foreach ($unitArr as $key => $val){
+        foreach ($unitArr as $key => $val) {
             $returnArr[] = array('value'=>$key,'label'=>$key);
         }
         return $returnArr;
diff --git a/app/code/Magento/Usa/Model/Shipping/Carrier/Usps.php b/app/code/Magento/Usa/Model/Shipping/Carrier/Usps.php
index 93b8b269fa3..1761295c9f7 100755
--- a/app/code/Magento/Usa/Model/Shipping/Carrier/Usps.php
+++ b/app/code/Magento/Usa/Model/Shipping/Carrier/Usps.php
@@ -23,18 +23,16 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Usa\Model\Shipping\Carrier;
 
+use Magento\Shipping\Model\Rate\Result;
 
 /**
  * USPS shipping rates estimation
  *
  * @link       http://www.usps.com/webtools/htm/Development-Guide-v3-0b.htm
- * @category   Magento
- * @package    Magento_Usa
- * @author      Magento Core Team <core@magentocommerce.com>
+ * @author     Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Usa\Model\Shipping\Carrier;
-
 class Usps
     extends \Magento\Usa\Model\Shipping\Carrier\AbstractCarrier
     implements \Magento\Shipping\Model\Carrier\CarrierInterface
@@ -105,7 +103,7 @@ class Usps
     /**
      * Rate result data
      *
-     * @var \Magento\Shipping\Model\Rate\Result|null
+     * @var Result|null
      */
     protected $_result = null;
 
@@ -119,7 +117,7 @@ class Usps
     /**
      * Container types that could be customized for USPS carrier
      *
-     * @var array
+     * @var string[]
      */
     protected $_customizableContainerTypes = array('VARIABLE', 'RECTANGULAR', 'NONRECTANGULAR');
 
@@ -205,7 +203,7 @@ class Usps
      * Collect and get rates
      *
      * @param \Magento\Sales\Model\Quote\Address\RateRequest $request
-     * @return \Magento\Shipping\Model\Rate\Result|bool|null
+     * @return Result|bool|null
      */
     public function collectRates(\Magento\Sales\Model\Quote\Address\RateRequest $request)
     {
@@ -226,7 +224,7 @@ class Usps
      * Prepare and set request to this instance
      *
      * @param \Magento\Sales\Model\Quote\Address\RateRequest $request
-     * @return \Magento\Usa\Model\Shipping\Carrier\Usps
+     * @return $this
      */
     public function setRequest(\Magento\Sales\Model\Quote\Address\RateRequest $request)
     {
@@ -350,17 +348,17 @@ class Usps
     /**
      * Get result of request
      *
-     * @return mixed
+     * @return Result|null
      */
     public function getResult()
     {
-       return $this->_result;
+        return $this->_result;
     }
 
     /**
      * Get quotes
      *
-     * @return \Magento\Shipping\Model\Rate\Result
+     * @return Result
      */
     protected function _getQuotes()
     {
@@ -370,7 +368,7 @@ class Usps
     /**
      * Set free method request
      *
-     * @param  $freeMethod
+     * @param string $freeMethod
      * @return void
      */
     protected function _setFreeMethodRequest($freeMethod)
@@ -387,14 +385,14 @@ class Usps
      * Build RateV3 request, send it to USPS gateway and retrieve quotes in XML format
      *
      * @link http://www.usps.com/webtools/htm/Rate-Calculators-v2-3.htm
-     * @return \Magento\Shipping\Model\Rate\Result
+     * @return Result
      */
     protected function _getXmlQuotes()
     {
         $r = $this->_rawRequest;
 
         // The origin address(shipper) must be only in USA
-        if(!$this->_isUSCountry($r->getOrigCountryId())){
+        if (!$this->_isUSCountry($r->getOrigCountryId())) {
             $responseBody = '';
             return $this->_parseXmlResponse($responseBody);
         }
@@ -508,9 +506,9 @@ class Usps
     /**
      * Parse calculated rates
      *
-     * @link http://www.usps.com/webtools/htm/Rate-Calculators-v2-3.htm
      * @param string $response
-     * @return \Magento\Shipping\Model\Rate\Result
+     * @return Result
+     * @link http://www.usps.com/webtools/htm/Rate-Calculators-v2-3.htm
      */
     protected function _parseXmlResponse($response)
     {
@@ -607,7 +605,7 @@ class Usps
      *
      * @param string $type
      * @param string $code
-     * @return array|bool
+     * @return array|false
      */
     public function getCode($type, $code='')
     {
@@ -983,8 +981,8 @@ class Usps
     /**
      * Get tracking
      *
-     * @param mixed $trackings
-     * @return mixed
+     * @param string|string[] $trackings
+     * @return Result|null
      */
     public function getTracking($trackings)
     {
@@ -1002,7 +1000,7 @@ class Usps
     /**
      * Set tracking request
      *
-     * @return null
+     * @return void
      */
     protected function setTrackingReqeust()
     {
@@ -1017,27 +1015,27 @@ class Usps
     /**
      * Send request for tracking
      *
-     * @param array $tracking
-     * @return null
+     * @param string[] $trackings
+     * @return void
      */
     protected function _getXmlTracking($trackings)
     {
-         $r = $this->_rawTrackRequest;
+        $r = $this->_rawTrackRequest;
 
-         foreach ($trackings as $tracking) {
-             $xml = $this->_xmlElFactory->create(
-                 array('data' => '<?xml version = "1.0" encoding = "UTF-8"?><TrackRequest/>')
-             );
-             $xml->addAttribute('USERID', $r->getUserId());
+        foreach ($trackings as $tracking) {
+            $xml = $this->_xmlElFactory->create(
+                array('data' => '<?xml version = "1.0" encoding = "UTF-8"?><TrackRequest/>')
+            );
+            $xml->addAttribute('USERID', $r->getUserId());
 
-             $trackid = $xml->addChild('TrackID');
-             $trackid->addAttribute('ID',$tracking);
+            $trackid = $xml->addChild('TrackID');
+            $trackid->addAttribute('ID', $tracking);
 
-             $api = 'TrackV2';
-             $request = $xml->asXML();
-             $debugData = array('request' => $request);
+            $api = 'TrackV2';
+            $request = $xml->asXML();
+            $debugData = array('request' => $request);
 
-             try {
+            try {
                 $url = $this->getConfigData('gateway_url');
                 if (!$url) {
                     $url = $this->_defaultGatewayUrl;
@@ -1058,15 +1056,15 @@ class Usps
 
             $this->_debug($debugData);
             $this->_parseXmlTrackingResponse($tracking, $responseBody);
-         }
+        }
     }
 
     /**
      * Parse xml tracking response
      *
-     * @param array $trackingvalue
+     * @param string $trackingvalue
      * @param string $response
-     * @return null
+     * @return void
      */
     protected function _parseXmlTrackingResponse($trackingvalue, $response)
     {
@@ -1088,8 +1086,8 @@ class Usps
                         $errorTitle = __('Sorry, something went wrong. Please try again or contact us and we\'ll try to help.');
                     }
 
-                    if(isset($xml->TrackInfo) && isset($xml->TrackInfo->TrackSummary)){
-                       $resultArr['tracksummary'] = (string)$xml->TrackInfo->TrackSummary;
+                    if (isset($xml->TrackInfo) && isset($xml->TrackInfo->TrackSummary)) {
+                        $resultArr['tracksummary'] = (string)$xml->TrackInfo->TrackSummary;
 
                     }
                 }
@@ -1108,14 +1106,14 @@ class Usps
              $tracking->setTracking($trackingvalue);
              $tracking->setTrackSummary($resultArr['tracksummary']);
              $this->_result->append($tracking);
-         } else {
+        } else {
             $error = $this->_trackErrorFactory->create();
             $error->setCarrier('usps');
             $error->setCarrierTitle($this->getConfigData('title'));
             $error->setTracking($trackingvalue);
             $error->setErrorMessage($errorTitle);
             $this->_result->append($error);
-         }
+        }
     }
 
     /**
@@ -1129,7 +1127,7 @@ class Usps
         if ($this->_result instanceof \Magento\Shipping\Model\Tracking\Result) {
             if ($trackings = $this->_result->getAllTrackings()) {
                 foreach ($trackings as $tracking) {
-                    if($data = $tracking->getAllData()) {
+                    if ($data = $tracking->getAllData()) {
                         if (!empty($data['track_summary'])) {
                             $statuses .= __($data['track_summary']);
                         } else {
@@ -1491,6 +1489,7 @@ class Usps
      * @param \Magento\Object $request
      * @param string $serviceType
      * @return string
+     * @throws \Exception
      */
     protected function _formUsSignatureConfirmationShipmentRequest(\Magento\Object $request, $serviceType)
     {
@@ -1573,7 +1572,7 @@ class Usps
      * Convert decimal weight into pound-ounces format
      *
      * @param float $weightInPounds
-     * @return array
+     * @return float[]
      */
     protected function _convertPoundOunces($weightInPounds)
     {
@@ -1720,7 +1719,7 @@ class Usps
                 $xml->addChild('FirstClassMailType', 'LETTER');
             } else if (stripos($shippingMethod, 'Flat') !== false) {
                 $xml->addChild('FirstClassMailType', 'FLAT');
-            } else{
+            } else {
                 $xml->addChild('FirstClassMailType', 'PARCEL');
             }
         }
@@ -1887,7 +1886,7 @@ class Usps
             } else if ($recipientUSCountry) {
                 $labelContent = base64_decode((string) $response->SignatureConfirmationLabel);
                 $trackingNumber = (string) $response->SignatureConfirmationNumber;
-            } else  {
+            } else {
                 $labelContent = base64_decode((string) $response->LabelImage);
                 $trackingNumber = (string) $response->BarcodeNumber;
             }
@@ -1996,7 +1995,7 @@ class Usps
      *
      * @param string $zipString
      * @param bool $returnFull
-     * @return array
+     * @return string[]
      */
     protected function _parseZip($zipString, $returnFull = false)
     {
diff --git a/app/code/Magento/Usa/Model/Shipping/Carrier/Usps/Source/Freemethod.php b/app/code/Magento/Usa/Model/Shipping/Carrier/Usps/Source/Freemethod.php
index d9a8a3bf28e..bf6131aee90 100644
--- a/app/code/Magento/Usa/Model/Shipping/Carrier/Usps/Source/Freemethod.php
+++ b/app/code/Magento/Usa/Model/Shipping/Carrier/Usps/Source/Freemethod.php
@@ -29,6 +29,9 @@ namespace Magento\Usa\Model\Shipping\Carrier\Usps\Source;
 
 class Freemethod extends \Magento\Usa\Model\Shipping\Carrier\Usps\Source\Method
 {
+    /**
+     * {@inheritdoc}
+     */
     public function toOptionArray()
     {
         $arr = parent::toOptionArray();
diff --git a/app/code/Magento/Usa/Model/Simplexml/Element.php b/app/code/Magento/Usa/Model/Simplexml/Element.php
index 19666f9507f..a419265195a 100644
--- a/app/code/Magento/Usa/Model/Simplexml/Element.php
+++ b/app/code/Magento/Usa/Model/Simplexml/Element.php
@@ -23,17 +23,13 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Usa\Model\Simplexml;
 
 /**
  * Extends SimpleXML to add valuable functionality to \SimpleXMLElement class
  *
- * @category Magento
- * @package  Magento_Usa
  * @author   Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Usa\Model\Simplexml;
-
 class Element extends \Magento\Simplexml\Element
 {
     /**
@@ -71,7 +67,7 @@ class Element extends \Magento\Simplexml\Element
     /**
      * Converts meaningful xml characters to xml entities
      *
-     * @param string
+     * @param string|null $value
      * @return string
      */
     public function xmlentities($value = null)
diff --git a/app/code/Magento/Usa/etc/di.xml b/app/code/Magento/Usa/etc/di.xml
index d3567f01160..f341e4f61a5 100644
--- a/app/code/Magento/Usa/etc/di.xml
+++ b/app/code/Magento/Usa/etc/di.xml
@@ -23,12 +23,12 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Module\Updater\SetupFactory">
-        <param name="resourceTypes">
-            <array>
-                <item key="usa_setup"><value>Magento\Usa\Model\Resource\Setup</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="resourceTypes" xsi:type="array">
+                <item name="usa_setup" xsi:type="string">Magento\Usa\Model\Resource\Setup</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/User/etc/di.xml b/app/code/Magento/User/etc/di.xml
index 9330d554a19..5ef277cfc14 100644
--- a/app/code/Magento/User/etc/di.xml
+++ b/app/code/Magento/User/etc/di.xml
@@ -23,35 +23,31 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\User\Model\Role" shared="false" />
     <preference for="Magento\Backend\App\ConfigInterface" type="Magento\Backend\App\Config" />
     <type name="Magento\User\Model\Resource\Rules">
-        <param name="rootResource">
-            <instance type="Magento\Core\Model\Acl\RootResource\Proxy" />
-        </param>
-        <param name="aclCache">
-            <instance type="Magento\Core\Model\Acl\Cache\Proxy" />
-        </param>
+        <arguments>
+            <argument name="rootResource" xsi:type="object">Magento\Core\Model\Acl\RootResource\Proxy</argument>
+            <argument name="aclCache" xsi:type="object">Magento\Core\Model\Acl\Cache\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\User\Model\Resource\User">
-        <param name="aclCache">
-            <instance type="Magento\Core\Model\Acl\Cache\Proxy" />
-        </param>
+        <arguments>
+            <argument name="aclCache" xsi:type="object">Magento\Core\Model\Acl\Cache\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Module\Updater\SetupFactory">
-        <param name="resourceTypes">
-            <array>
-                <item key="user_setup"><value>Magento\User\Model\Resource\Setup</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="resourceTypes" xsi:type="array">
+                <item name="user_setup" xsi:type="string">Magento\User\Model\Resource\Setup</item>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Acl\Builder">
-        <param name="ruleLoader">
-            <instance type="Magento\User\Model\Acl\Loader\Rule" />
-        </param>
-        <param name="roleLoader">
-            <instance type="Magento\User\Model\Acl\Loader\Role" />
-        </param>
+        <arguments>
+            <argument name="ruleLoader" xsi:type="object">Magento\User\Model\Acl\Loader\Rule</argument>
+            <argument name="roleLoader" xsi:type="object">Magento\User\Model\Acl\Loader\Role</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Webapi/etc/di.xml b/app/code/Magento/Webapi/etc/di.xml
index c981e05a523..c9f9e41862c 100644
--- a/app/code/Magento/Webapi/etc/di.xml
+++ b/app/code/Magento/Webapi/etc/di.xml
@@ -23,22 +23,18 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\App\AreaList">
-        <param name="areas">
-            <array>
-                <item key="webapi_rest">
-                    <array>
-                        <item key="frontName"><value>rest</value></item>
-                    </array>
+        <arguments>
+            <argument name="areas" xsi:type="array">
+                <item name="webapi_rest" xsi:type="array">
+                    <item name="frontName" xsi:type="string">rest</item>
                 </item>
-                <item key="webapi_soap">
-                    <array>
-                        <item key="frontName"><value>soap</value></item>
-                    </array>
+                <item name="webapi_soap" xsi:type="array">
+                    <item name="frontName" xsi:type="string">soap</item>
                 </item>
-            </array>
-        </param>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Xml\Generator" shared="false" />
     <type name="Magento\Xml\Parser" shared="false" />
diff --git a/app/code/Magento/Webapi/etc/webapi_rest/di.xml b/app/code/Magento/Webapi/etc/webapi_rest/di.xml
index a4b50fa47bf..41166bd0b6e 100644
--- a/app/code/Magento/Webapi/etc/webapi_rest/di.xml
+++ b/app/code/Magento/Webapi/etc/webapi_rest/di.xml
@@ -23,97 +23,71 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <preference for="Magento\Authz\Model\UserLocatorInterface" type="Magento\Webapi\Model\Authz\UserLocator"/>
     <type name="Magento\Webapi\Model\Authz\UserLocator">
-        <param name="request">
-            <instance type="Magento\Webapi\Controller\Rest\Request"/>
-        </param>
+        <arguments>
+            <argument name="request" xsi:type="object">Magento\Webapi\Controller\Rest\Request</argument>
+        </arguments>
     </type>
     <preference for="Magento\App\FrontControllerInterface" type="Magento\Webapi\Controller\Rest" />
     <type name="Magento\Webapi\Controller\Rest\Router\Route" shared="false" />
     <type name="Magento\Webapi\Controller\Rest\Request\Deserializer\Factory">
-        <param name="deserializers">
-            <array>
-                <item key="application_json">
-                    <array>
-                        <item key="type"><value>application/json</value></item>
-                        <item key="model"><value>Magento\Webapi\Controller\Rest\Request\Deserializer\Json</value></item>
-                    </array>
+        <arguments>
+            <argument name="deserializers" xsi:type="array">
+                <item name="application_json" xsi:type="array">
+                    <item name="type" xsi:type="string">application/json</item>
+                    <item name="model" xsi:type="string">Magento\Webapi\Controller\Rest\Request\Deserializer\Json</item>
                 </item>
-                <item key="application_xml">
-                    <array>
-                        <item key="type"><value>application/xml</value></item>
-                        <item key="model"><value>Magento\Webapi\Controller\Rest\Request\Deserializer\Xml</value></item>
-                    </array>
+                <item name="application_xml" xsi:type="array">
+                    <item name="type" xsi:type="string">application/xml</item>
+                    <item name="model" xsi:type="string">Magento\Webapi\Controller\Rest\Request\Deserializer\Xml</item>
                 </item>
-                <item key="application_xhtml_xml">
-                    <array>
-                        <item key="type"><value>application/xhtml+xml</value></item>
-                        <item key="model"><value>Magento\Webapi\Controller\Rest\Request\Deserializer\Xml</value></item>
-                    </array>
+                <item name="application_xhtml_xml" xsi:type="array">
+                    <item name="type" xsi:type="string">application/xhtml+xml</item>
+                    <item name="model" xsi:type="string">Magento\Webapi\Controller\Rest\Request\Deserializer\Xml</item>
                 </item>
-                <item key="text_xml">
-                    <array>
-                        <item key="type"><value>text/xml</value></item>
-                        <item key="model"><value>Magento\Webapi\Controller\Rest\Request\Deserializer\Xml</value></item>
-                    </array>
+                <item name="text_xml" xsi:type="array">
+                    <item name="type" xsi:type="string">text/xml</item>
+                    <item name="model" xsi:type="string">Magento\Webapi\Controller\Rest\Request\Deserializer\Xml</item>
                 </item>
-            </array>
-        </param>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Webapi\Controller\Rest\Response\Renderer\Factory">
-        <param name="renders">
-            <array>
-                <item key="default">
-                    <array>
-                        <item key="type"><value>*/*</value></item>
-                        <item key="model"><value>Magento\Webapi\Controller\Rest\Response\Renderer\Json</value></item>
-                    </array>
+        <arguments>
+            <argument name="renders" xsi:type="array">
+                <item name="default" xsi:type="array">
+                    <item name="type" xsi:type="string">*/*</item>
+                    <item name="model" xsi:type="string">Magento\Webapi\Controller\Rest\Response\Renderer\Json</item>
                 </item>
-                <item key="application_json">
-                    <array>
-                        <item key="type"><value>application/json</value></item>
-                        <item key="model"><value>Magento\Webapi\Controller\Rest\Response\Renderer\Json</value></item>
-                    </array>
+                <item name="application_json" xsi:type="array">
+                    <item name="type" xsi:type="string">application/json</item>
+                    <item name="model" xsi:type="string">Magento\Webapi\Controller\Rest\Response\Renderer\Json</item>
                 </item>
-                <item key="text_xml">
-                    <array>
-                        <item key="type"><value>text/xml</value></item>
-                        <item key="model"><value>Magento\Webapi\Controller\Rest\Response\Renderer\Xml</value></item>
-                    </array>
+                <item name="text_xml" xsi:type="array">
+                    <item name="type" xsi:type="string">text/xml</item>
+                    <item name="model" xsi:type="string">Magento\Webapi\Controller\Rest\Response\Renderer\Xml</item>
                 </item>
-                <item key="application_xml">
-                    <array>
-                        <item key="type"><value>application/xml</value></item>
-                        <item key="model"><value>Magento\Webapi\Controller\Rest\Response\Renderer\Xml</value></item>
-                    </array>
+                <item name="application_xml" xsi:type="array">
+                    <item name="type" xsi:type="string">application/xml</item>
+                    <item name="model" xsi:type="string">Magento\Webapi\Controller\Rest\Response\Renderer\Xml</item>
                 </item>
-                <item key="application_xhtml_xml">
-                    <array>
-                        <item key="type"><value>application/xhtml+xml</value></item>
-                        <item key="model"><value>Magento\Webapi\Controller\Rest\Response\Renderer\Xml</value></item>
-                    </array>
+                <item name="application_xhtml_xml" xsi:type="array">
+                    <item name="type" xsi:type="string">application/xhtml+xml</item>
+                    <item name="model" xsi:type="string">Magento\Webapi\Controller\Rest\Response\Renderer\Xml</item>
                 </item>
-            </array>
-        </param>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\Webapi\Controller\Rest">
-        <param name="request">
-            <instance type="Magento\Webapi\Controller\Rest\Request\Proxy"/>
-        </param>
-        <param name="response">
-            <instance type="Magento\Webapi\Controller\Rest\Response\Proxy"/>
-        </param>
-        <param name="router">
-            <instance type="Magento\Webapi\Controller\Rest\Router\Proxy"/>
-        </param>
-        <param name="oauthHelper">
-            <instance type="Magento\Oauth\Helper\Request\Proxy"/>
-        </param>
-        <param name="authorizationService">
-            <instance type="Magento\Authz\Service\AuthorizationV1Interface\Proxy" />
-        </param>
+        <arguments>
+            <argument name="request" xsi:type="object">Magento\Webapi\Controller\Rest\Request\Proxy</argument>
+            <argument name="response" xsi:type="object">Magento\Webapi\Controller\Rest\Response\Proxy</argument>
+            <argument name="router" xsi:type="object">Magento\Webapi\Controller\Rest\Router\Proxy</argument>
+            <argument name="oauthHelper" xsi:type="object">Magento\Oauth\Helper\Request\Proxy</argument>
+            <argument name="authorizationService" xsi:type="object">Magento\Authz\Service\AuthorizationV1Interface\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Authz\Service\AuthorizationV1">
         <plugin name="webapiRestAuthorizationV1" type="Magento\Webapi\Model\Plugin\AuthorizationServiceV1" />
diff --git a/app/code/Magento/Webapi/etc/webapi_soap/di.xml b/app/code/Magento/Webapi/etc/webapi_soap/di.xml
index f98dd0fc07d..ee4e975a644 100644
--- a/app/code/Magento/Webapi/etc/webapi_soap/di.xml
+++ b/app/code/Magento/Webapi/etc/webapi_soap/di.xml
@@ -23,27 +23,25 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <preference for="Magento\Authz\Model\UserLocatorInterface" type="Magento\Webapi\Model\Authz\UserLocator"/>
     <type name="Magento\Webapi\Model\Authz\UserLocator">
-        <param name="request">
-            <instance type="Magento\Webapi\Controller\Soap\Request"/>
-        </param>
+        <arguments>
+            <argument name="request" xsi:type="object">Magento\Webapi\Controller\Soap\Request</argument>
+        </arguments>
     </type>
     <preference for="Magento\App\FrontControllerInterface" type="Magento\Webapi\Controller\Soap" />
     <type name="Magento\Webapi\Controller\Rest\Router\Route" shared="false" />
     <type name="Magento\Webapi\Controller\Soap">
-        <param name="soapServer">
-            <instance type="Magento\Webapi\Model\Soap\Server\Proxy"/>
-        </param>
-        <param name="errorProcessor">
-            <instance type="Magento\Webapi\Controller\ErrorProcessor\Proxy"/>
-        </param>
+        <arguments>
+            <argument name="soapServer" xsi:type="object">Magento\Webapi\Model\Soap\Server\Proxy</argument>
+            <argument name="errorProcessor" xsi:type="object">Magento\Webapi\Controller\ErrorProcessor\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Webapi\Controller\Soap\Request\Handler">
-        <param name="authorizationService">
-            <instance type="Magento\Authz\Service\AuthorizationV1Interface\Proxy" />
-        </param>
+        <arguments>
+            <argument name="authorizationService" xsi:type="object">Magento\Authz\Service\AuthorizationV1Interface\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Authz\Service\AuthorizationV1">
         <plugin name="webapiSoapAuthorizationV1" type="Magento\Webapi\Model\Plugin\AuthorizationServiceV1" />
diff --git a/app/code/Magento/Weee/Block/Renderer/Weee/Tax.php b/app/code/Magento/Weee/Block/Renderer/Weee/Tax.php
index 8c1acd366db..6d2e5fcf6a5 100644
--- a/app/code/Magento/Weee/Block/Renderer/Weee/Tax.php
+++ b/app/code/Magento/Weee/Block/Renderer/Weee/Tax.php
@@ -23,6 +23,9 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Weee\Block\Renderer\Weee;
+
+use Magento\Data\Form\Element\AbstractElement;
 
 /**
  * Adminhtml weee tax item renderer
@@ -31,15 +34,28 @@
  * @package    Magento_Adminhtml
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Weee\Block\Renderer\Weee;
-
 class Tax
     extends \Magento\Backend\Block\Widget
     implements \Magento\Data\Form\Element\Renderer\RendererInterface
 {
+    /**
+     * @var AbstractElement|null
+     */
     protected $_element = null;
+
+    /**
+     * @var array|null
+     */
     protected $_countries = null;
+
+    /**
+     * @var array|null
+     */
     protected $_websites = null;
+
+    /**
+     * @var string
+     */
     protected $_template = 'renderer/tax.phtml';
 
     /**
@@ -79,19 +95,26 @@ class Tax
         parent::__construct($context, $data);
     }
 
+    /**
+     * @return \Magento\Object
+     */
     public function getProduct()
     {
         return $this->_coreRegistry->registry('product');
     }
 
-    public function render(\Magento\Data\Form\Element\AbstractElement $element)
+    /**
+     * @param AbstractElement $element
+     * @return string
+     */
+    public function render(AbstractElement $element)
     {
         $this->setElement($element);
         return $this->toHtml();
     }
 
     /**
-     * @inheritdoc
+     * {@inheritdoc}
      */
     protected function _prepareLayout()
     {
@@ -116,17 +139,27 @@ class Tax
         return parent::_prepareLayout();
     }
 
-    public function setElement(\Magento\Data\Form\Element\AbstractElement $element)
+    /**
+     * @param AbstractElement $element
+     * @return $this
+     */
+    public function setElement(AbstractElement $element)
     {
         $this->_element = $element;
         return $this;
     }
 
+    /**
+     * @return AbstractElement|null
+     */
     public function getElement()
     {
         return $this->_element;
     }
 
+    /**
+     * @return array
+     */
     public function getValues()
     {
         $values = array();
@@ -139,6 +172,11 @@ class Tax
         return $values;
     }
 
+    /**
+     * @param array $a
+     * @param array $b
+     * @return int
+     */
     protected function _sortWeeeTaxes($a, $b)
     {
         if ($a['website_id'] != $b['website_id']) {
@@ -150,16 +188,25 @@ class Tax
         return 0;
     }
 
+    /**
+     * @return int
+     */
     public function getWebsiteCount()
     {
         return count($this->getWebsites());
     }
 
+    /**
+     * @return bool
+     */
     public function isMultiWebsites()
     {
         return !$this->_storeManager->hasSingleStore();
     }
 
+    /**
+     * @return array|null
+     */
     public function getCountries()
     {
         if (is_null($this->_countries)) {
@@ -169,6 +216,9 @@ class Tax
         return $this->_countries;
     }
 
+    /**
+     * @return array|null
+     */
     public function getWebsites()
     {
         if (!is_null($this->_websites)) {
@@ -203,6 +253,9 @@ class Tax
         return $this->_websites;
     }
 
+    /**
+     * @return string
+     */
     public function getAddButtonHtml()
     {
         return $this->getChildHtml('add_button');
diff --git a/app/code/Magento/Weee/Helper/Data.php b/app/code/Magento/Weee/Helper/Data.php
index e073185f3e6..3e5b83a7c0f 100644
--- a/app/code/Magento/Weee/Helper/Data.php
+++ b/app/code/Magento/Weee/Helper/Data.php
@@ -23,6 +23,10 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Weee\Helper;
+
+use Magento\Core\Model\Store;
+use Magento\Core\Model\Website;
 
 /**
  * WEEE data helper
@@ -31,13 +35,14 @@
  * @package  Magento_Weee
  * @author   Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Weee\Helper;
-
 class Data extends \Magento\App\Helper\AbstractHelper
 {
 
     const XML_PATH_FPT_ENABLED       = 'tax/weee/enable';
 
+    /**
+     * @var array
+     */
     protected $_storeDisplayConfig   = array();
 
     /**
@@ -46,7 +51,7 @@ class Data extends \Magento\App\Helper\AbstractHelper
      * @var \Magento\Core\Model\Registry
      */
     protected $_coreRegistry = null;
-    
+
     /**
      * Tax data
      *
@@ -98,7 +103,7 @@ class Data extends \Magento\App\Helper\AbstractHelper
     /**
      * Get weee amount display type on product view page
      *
-     * @param   mixed $store
+     * @param   null|string|bool|int|Store $store
      * @return  int
      */
     public function getPriceDisplayType($store = null)
@@ -109,7 +114,7 @@ class Data extends \Magento\App\Helper\AbstractHelper
     /**
      * Get weee amount display type on product list page
      *
-     * @param   mixed $store
+     * @param   null|string|bool|int|Store $store
      * @return  int
      */
     public function getListPriceDisplayType($store = null)
@@ -120,7 +125,7 @@ class Data extends \Magento\App\Helper\AbstractHelper
     /**
      * Get weee amount display type in sales modules
      *
-     * @param   mixed $store
+     * @param   null|string|bool|int|Store $store
      * @return  int
      */
     public function getSalesPriceDisplayType($store = null)
@@ -131,7 +136,7 @@ class Data extends \Magento\App\Helper\AbstractHelper
     /**
      * Get weee amount display type in email templates
      *
-     * @param   mixed $store
+     * @param   null|string|bool|int|Store $store
      * @return  int
      */
     public function getEmailPriceDisplayType($store = null)
@@ -142,7 +147,7 @@ class Data extends \Magento\App\Helper\AbstractHelper
     /**
      * Check if weee tax amount should be discounted
      *
-     * @param   mixed $store
+     * @param   null|string|bool|int|Store $store
      * @return  bool
      */
     public function isDiscounted($store = null)
@@ -153,7 +158,7 @@ class Data extends \Magento\App\Helper\AbstractHelper
     /**
      * Check if weee tax amount should be taxable
      *
-     * @param   mixed $store
+     * @param   null|string|bool|int|Store $store
      * @return  bool
      */
     public function isTaxable($store = null)
@@ -164,7 +169,7 @@ class Data extends \Magento\App\Helper\AbstractHelper
     /**
      * Check if weee tax amount should be included to subtotal
      *
-     * @param   mixed $store
+     * @param   null|string|bool|int|Store $store
      * @return  bool
      */
     public function includeInSubtotal($store = null)
@@ -178,7 +183,7 @@ class Data extends \Magento\App\Helper\AbstractHelper
      * @param   \Magento\Catalog\Model\Product $product
      * @param   null|\Magento\Customer\Model\Address\AbstractAddress $shipping
      * @param   null|\Magento\Customer\Model\Address\AbstractAddress $billing
-     * @param   mixed $website
+     * @param   null|bool|int|string|Website $website
      * @param   bool $calculateTaxes
      * @return  float
      */
@@ -194,9 +199,9 @@ class Data extends \Magento\App\Helper\AbstractHelper
      * Returns diaplay type for price accordingly to current zone
      *
      * @param \Magento\Catalog\Model\Product $product
-     * @param array|null                 $compareTo
-     * @param string                     $zone
-     * @param \Magento\Core\Model\Store      $store
+     * @param int|int[]|null                 $compareTo
+     * @param string                         $zone
+     * @param Store                          $store
      * @return bool|int
      */
     public function typeOfDisplay($product, $compareTo = null, $zone = null, $store = null)
@@ -241,11 +246,11 @@ class Data extends \Magento\App\Helper\AbstractHelper
      * Proxy for \Magento\Weee\Model\Tax::getProductWeeeAttributes()
      *
      * @param \Magento\Catalog\Model\Product $product
-     * @param null|false|\Magento\Object   $shipping
-     * @param null|false|\Magento\Object   $billing
-     * @param \Magento\Core\Model\Website    $website
-     * @param bool                       $calculateTaxes
-     * @return array
+     * @param null|false|\Magento\Object     $shipping
+     * @param null|false|\Magento\Object     $billing
+     * @param Website                        $website
+     * @param bool                           $calculateTaxes
+     * @return \Magento\Object[]
      */
     public function getProductWeeeAttributes($product, $shipping = null, $billing = null,
         $website = null, $calculateTaxes = false)
@@ -291,8 +296,8 @@ class Data extends \Magento\App\Helper\AbstractHelper
      * Sets applied weee taxes
      *
      * @param \Magento\Sales\Model\Quote\Item\AbstractItem $item
-     * @param array                                $value
-     * @return \Magento\Weee\Helper\Data
+     * @param array $value
+     * @return $this
      */
     public function setApplied($item, $value)
     {
@@ -304,7 +309,7 @@ class Data extends \Magento\App\Helper\AbstractHelper
      * Returns array of weee attributes allowed for display
      *
      * @param \Magento\Catalog\Model\Product $product
-     * @return array
+     * @return \Magento\Object[]
      */
     public function getProductWeeeAttributesForDisplay($product)
     {
@@ -320,9 +325,9 @@ class Data extends \Magento\App\Helper\AbstractHelper
      * @param \Magento\Catalog\Model\Product $product
      * @param null|false|\Magento\Object $shipping Shipping Address
      * @param null|false|\Magento\Object $billing Billing Address
-     * @param null|\Magento\Core\Model\Website $website
-     * @param mixed $calculateTaxes
-     * @return array
+     * @param null|Website $website
+     * @param bool $calculateTaxes
+     * @return \Magento\Object[]
      */
     public function getProductWeeeAttributesForRenderer($product, $shipping = null, $billing = null,
         $website = null, $calculateTaxes = false)
@@ -371,8 +376,8 @@ class Data extends \Magento\App\Helper\AbstractHelper
      * Adds HTML containers and formats tier prices accordingly to the currency used
      *
      * @param \Magento\Catalog\Model\Product $product
-     * @param array                      $tierPrices
-     * @return \Magento\Weee\Helper\Data
+     * @param array                          &$tierPrices
+     * @return $this
      */
     public function processTierPrices($product, &$tierPrices)
     {
@@ -393,7 +398,7 @@ class Data extends \Magento\App\Helper\AbstractHelper
     /**
      * Check if fixed taxes are used in system
      *
-     * @param \Magento\Core\Model\Store $store
+     * @param Store $store
      * @return bool
      */
     public function isEnabled($store = null)
@@ -404,9 +409,9 @@ class Data extends \Magento\App\Helper\AbstractHelper
     /**
      * Returns all summed WEEE taxes with all local taxes applied
      *
-     * @throws \Magento\Exception
-     * @param array $attributes Array of \Magento\Object, result from getProductWeeeAttributes()
+     * @param \Magento\Object[] $attributes Array of \Magento\Object, result from getProductWeeeAttributes()
      * @return float
+     * @throws \Magento\Exception
      */
     public function getAmountInclTaxes($attributes)
     {
diff --git a/app/code/Magento/Weee/Model/Attribute/Backend/Weee/Tax.php b/app/code/Magento/Weee/Model/Attribute/Backend/Weee/Tax.php
index 4d5efa77bd4..4f3b2fe2e07 100644
--- a/app/code/Magento/Weee/Model/Attribute/Backend/Weee/Tax.php
+++ b/app/code/Magento/Weee/Model/Attribute/Backend/Weee/Tax.php
@@ -23,9 +23,10 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Weee\Model\Attribute\Backend\Weee;
 
+use Magento\Core\Exception;
+
 class Tax extends \Magento\Catalog\Model\Product\Attribute\Backend\Price
 {
     /**
@@ -67,6 +68,9 @@ class Tax extends \Magento\Catalog\Model\Product\Attribute\Backend\Price
         parent::__construct($logger, $currencyFactory, $storeManager, $catalogData, $config);
     }
 
+    /**
+     * @return string
+     */
     public static function getBackendModelName()
     {
         return 'Magento\Weee\Model\Attribute\Backend\Weee\Tax';
@@ -76,7 +80,8 @@ class Tax extends \Magento\Catalog\Model\Product\Attribute\Backend\Price
      * Validate data
      *
      * @param   \Magento\Catalog\Model\Product $object
-     * @return  this
+     * @return  $this
+     * @throws  Exception
      */
     public function validate($object)
     {
@@ -95,7 +100,7 @@ class Tax extends \Magento\Catalog\Model\Product\Attribute\Backend\Price
             $key1 = implode('-', array($tax['website_id'], $tax['country'], $state));
 
             if (!empty($dup[$key1])) {
-                throw new \Magento\Core\Exception(
+                throw new Exception(
                     __('We found a duplicate website, country, and state tax.')
                 );
             }
@@ -108,7 +113,7 @@ class Tax extends \Magento\Catalog\Model\Product\Attribute\Backend\Price
      * Assign WEEE taxes to product data
      *
      * @param   \Magento\Catalog\Model\Product $object
-     * @return  \Magento\Catalog\Model\Product\Attribute\Backend\Weee
+     * @return  $this
      */
     public function afterLoad($object)
     {
@@ -132,6 +137,9 @@ class Tax extends \Magento\Catalog\Model\Product\Attribute\Backend\Price
         return $this;
     }
 
+    /**
+     * {@inheritdoc}
+     */
     public function afterSave($object)
     {
         $orig = $object->getOrigData($this->getAttribute()->getName());
@@ -171,12 +179,18 @@ class Tax extends \Magento\Catalog\Model\Product\Attribute\Backend\Price
         return $this;
     }
 
+    /**
+     * {@inheritdoc}
+     */
     public function afterDelete($object)
     {
         $this->_attributeTax->deleteProductData($object, $this->getAttribute());
         return $this;
     }
 
+    /**
+     * {@inheritdoc}
+     */
     public function getTable()
     {
         return $this->_attributeTax->getTable('weee_tax');
diff --git a/app/code/Magento/Weee/Model/Observer.php b/app/code/Magento/Weee/Model/Observer.php
index babc527a64b..e87dd1db5da 100644
--- a/app/code/Magento/Weee/Model/Observer.php
+++ b/app/code/Magento/Weee/Model/Observer.php
@@ -23,7 +23,6 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Weee\Model;
 
 class Observer extends \Magento\Core\Model\AbstractModel
@@ -41,7 +40,7 @@ class Observer extends \Magento\Core\Model\AbstractModel
     protected $_weeeData = null;
 
     /**
-     * @var \Magento\Weee\Model\Tax
+     * @var Tax
      */
     protected $_weeeTax;
 
@@ -71,7 +70,7 @@ class Observer extends \Magento\Core\Model\AbstractModel
         \Magento\Core\Model\Context $context,
         \Magento\Core\Model\Registry $registry,
         \Magento\View\LayoutInterface $layout,
-        \Magento\Weee\Model\Tax $weeeTax,
+        Tax $weeeTax,
         \Magento\Weee\Helper\Data $weeeData,
         \Magento\Catalog\Model\Product\Type $productType,
         \Magento\Catalog\Model\ProductTypes\ConfigInterface $productTypeConfig,
@@ -91,7 +90,7 @@ class Observer extends \Magento\Core\Model\AbstractModel
      * Assign custom renderer for product create/edit form weee attribute element
      *
      * @param \Magento\Event\Observer $observer
-     * @return  \Magento\Weee\Model\Observer
+     * @return $this
      */
     public function setWeeeRendererInForm(\Magento\Event\Observer $observer)
     {
@@ -115,7 +114,7 @@ class Observer extends \Magento\Core\Model\AbstractModel
      * Exclude WEEE attributes from standard form generation
      *
      * @param \Magento\Event\Observer $observer
-     * @return  \Magento\Weee\Model\Observer
+     * @return $this
      */
     public function updateExcludedFieldList(\Magento\Event\Observer $observer)
     {
@@ -145,7 +144,7 @@ class Observer extends \Magento\Core\Model\AbstractModel
      * Add new attribute type to manage attributes interface
      *
      * @param   \Magento\Event\Observer $observer
-     * @return  \Magento\Weee\Model\Observer
+     * @return  $this
      */
     public function addWeeeTaxAttributeType(\Magento\Event\Observer $observer)
     {
@@ -160,8 +159,6 @@ class Observer extends \Magento\Core\Model\AbstractModel
                 'is_unique',
                 'is_required',
                 'frontend_class',
-                'is_configurable',
-
                 '_scope',
                 '_default_value',
                 '_front_fieldset',
@@ -177,7 +174,7 @@ class Observer extends \Magento\Core\Model\AbstractModel
      * Automaticaly assign backend model to weee attributes
      *
      * @param   \Magento\Event\Observer $observer
-     * @return  \Magento\Weee\Model\Observer
+     * @return  $this
      */
     public function assignBackendModelToAttribute(\Magento\Event\Observer $observer)
     {
@@ -205,7 +202,7 @@ class Observer extends \Magento\Core\Model\AbstractModel
      * Add custom element type for attributes form
      *
      * @param \Magento\Event\Observer $observer
-     * @return \Magento\Weee\Model\Observer
+     * @return $this
      */
     public function updateElementTypes(\Magento\Event\Observer $observer)
     {
@@ -220,7 +217,7 @@ class Observer extends \Magento\Core\Model\AbstractModel
      * Update WEEE amounts discount percents
      *
      * @param   \Magento\Event\Observer $observer
-     * @return  \Magento\Weee\Model\Observer
+     * @return  $this
      */
     public function updateDiscountPercents(\Magento\Event\Observer $observer)
     {
@@ -240,12 +237,12 @@ class Observer extends \Magento\Core\Model\AbstractModel
     }
 
     /**
-     * Update configurable options of the product view page
+     * Update options of the product view page
      *
      * @param   \Magento\Event\Observer $observer
-     * @return  \Magento\Weee\Model\Observer
+     * @return  $this
      */
-    public function updateConfigurableProductOptions(\Magento\Event\Observer $observer)
+    public function updateProductOptions(\Magento\Event\Observer $observer)
     {
         /* @var $helper \Magento\Weee\Helper\Data */
         $helper = $this->_weeeData;
@@ -266,7 +263,7 @@ class Observer extends \Magento\Core\Model\AbstractModel
 
         // Exclude Weee amount from excluding tax amount
         if (!$helper->typeOfDisplay($_product, array(
-            \Magento\Weee\Model\Tax::DISPLAY_INCL, \Magento\Weee\Model\Tax::DISPLAY_INCL_DESCR,
+            Tax::DISPLAY_INCL, Tax::DISPLAY_INCL_DESCR,
         ))) {
             $options['exclDisposition'] = true;
         }
@@ -280,7 +277,7 @@ class Observer extends \Magento\Core\Model\AbstractModel
      * Process bundle options selection for prepare view json
      *
      * @param   \Magento\Event\Observer $observer
-     * @return  \Magento\Weee\Model\Observer
+     * @return  $this
      */
     public function updateBundleProductOptions(\Magento\Event\Observer $observer)
     {
diff --git a/app/code/Magento/Weee/Model/Resource/Attribute/Backend/Weee/Tax.php b/app/code/Magento/Weee/Model/Resource/Attribute/Backend/Weee/Tax.php
index c84e5369c1a..779bd320203 100644
--- a/app/code/Magento/Weee/Model/Resource/Attribute/Backend/Weee/Tax.php
+++ b/app/code/Magento/Weee/Model/Resource/Attribute/Backend/Weee/Tax.php
@@ -23,7 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
+namespace Magento\Weee\Model\Resource\Attribute\Backend\Weee;
 
 /**
  * Catalog product WEEE tax backend attribute model
@@ -32,8 +32,6 @@
  * @package     Magento_Weee
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Weee\Model\Resource\Attribute\Backend\Weee;
-
 class Tax extends \Magento\Core\Model\Resource\Db\AbstractDb
 {
     /**
@@ -56,6 +54,7 @@ class Tax extends \Magento\Core\Model\Resource\Db\AbstractDb
     /**
      * Defines main resource table and table identifier field
      *
+     * @return void
      */
     protected function _construct()
     {
@@ -96,7 +95,7 @@ class Tax extends \Magento\Core\Model\Resource\Db\AbstractDb
      *
      * @param \Magento\Catalog\Model\Product $product
      * @param \Magento\Eav\Model\Entity\Attribute\AbstractAttribute $attribute
-     * @return \Magento\Weee\Model\Resource\Attribute\Backend\Weee\Tax
+     * @return $this
      */
     public function deleteProductData($product, $attribute)
     {
@@ -121,7 +120,7 @@ class Tax extends \Magento\Core\Model\Resource\Db\AbstractDb
      *
      * @param \Magento\Catalog\Model\Product $product
      * @param array $data
-     * @return \Magento\Weee\Model\Resource\Attribute\Backend\Weee\Tax
+     * @return $this
      */
     public function insertProductData($product, $data)
     {
diff --git a/app/code/Magento/Weee/Model/Resource/Tax.php b/app/code/Magento/Weee/Model/Resource/Tax.php
index 9728df8c508..9323d4c4230 100644
--- a/app/code/Magento/Weee/Model/Resource/Tax.php
+++ b/app/code/Magento/Weee/Model/Resource/Tax.php
@@ -23,9 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Weee\Model\Resource;
 
+use Magento\Catalog\Model\Product;
+use Magento\Catalog\Model\Product\Condition\ConditionInterface;
+
 /**
  * Wee tax resource model
  */
@@ -50,6 +52,8 @@ class Tax extends \Magento\Core\Model\Resource\Db\AbstractDb
 
     /**
      * Resource initialization
+     *
+     * @return void
      */
     protected function _construct()
     {
@@ -91,8 +95,8 @@ class Tax extends \Magento\Core\Model\Resource\Db\AbstractDb
     /**
      * Update products discount persent
      *
-     * @param mixed $condition
-     * @return \Magento\Weee\Model\Resource\Tax
+     * @param Product|ConditionInterface|int $condition
+     * @return $this
      */
     public function updateProductsDiscountPercent($condition)
     {
@@ -102,8 +106,8 @@ class Tax extends \Magento\Core\Model\Resource\Db\AbstractDb
     /**
      * Update tax percents for WEEE based on products condition
      *
-     * @param mixed $productCondition
-     * @return \Magento\Weee\Model\Resource\Tax
+     * @param Product|ConditionInterface|int $productCondition
+     * @return $this
      */
     protected function _updateDiscountPercents($productCondition = null)
     {
@@ -115,10 +119,10 @@ class Tax extends \Magento\Core\Model\Resource\Db\AbstractDb
 
         $deleteCondition = '';
         if ($productCondition) {
-            if ($productCondition instanceof \Magento\Catalog\Model\Product) {
+            if ($productCondition instanceof Product) {
                 $select->where('product_id = ?', (int)$productCondition->getId());
                 $deleteCondition = $adapter->quoteInto('entity_id=?', (int)$productCondition->getId());
-            } elseif ($productCondition instanceof \Magento\Catalog\Model\Product\Condition\ConditionInterface) {
+            } elseif ($productCondition instanceof ConditionInterface) {
                 $productCondition = $productCondition->getIdsSelect($adapter)->__toString();
                 $select->where("product_id IN ({$productCondition})");
                 $deleteCondition = "entity_id IN ({$productCondition})";
diff --git a/app/code/Magento/Weee/Model/Tax.php b/app/code/Magento/Weee/Model/Tax.php
index afcb6c63034..78c9535e306 100644
--- a/app/code/Magento/Weee/Model/Tax.php
+++ b/app/code/Magento/Weee/Model/Tax.php
@@ -23,9 +23,11 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Weee\Model;
 
+use Magento\Catalog\Model\Product;
+use Magento\Core\Model\Website;
+
 class Tax extends \Magento\Core\Model\AbstractModel
 {
     /**
@@ -45,7 +47,14 @@ class Tax extends \Magento\Core\Model\AbstractModel
      */
     const DISPLAY_EXCL              = 3;
 
+    /**
+     * @var array|null
+     */
     protected $_allAttributes = null;
+
+    /**
+     * @var array
+     */
     protected $_productDiscounts = array();
 
     /**
@@ -119,12 +128,23 @@ class Tax extends \Magento\Core\Model\AbstractModel
 
     /**
      * Initialize resource
+     *
+     * @return void
      */
     protected function _construct()
     {
         $this->_init('Magento\Weee\Model\Resource\Tax');
     }
 
+    /**
+     * @param Product $product
+     * @param null|false|\Magento\Object $shipping
+     * @param null|false|\Magento\Object $billing
+     * @param Website $website
+     * @param bool $calculateTax
+     * @param bool $ignoreDiscount
+     * @return int
+     */
     public function getWeeeAmount(
         $product,
         $shipping = null,
@@ -148,6 +168,10 @@ class Tax extends \Magento\Core\Model\AbstractModel
         return $amount;
     }
 
+    /**
+     * @param bool $forceEnabled
+     * @return array
+     */
     public function getWeeeAttributeCodes($forceEnabled = false)
     {
         return $this->getWeeeTaxAttributeCodes($forceEnabled);
@@ -171,6 +195,15 @@ class Tax extends \Magento\Core\Model\AbstractModel
         return $this->_allAttributes;
     }
 
+    /**
+     * @param Product $product
+     * @param null|false|\Magento\Object $shipping
+     * @param null|false|\Magento\Object $billing
+     * @param Website $website
+     * @param bool $calculateTax
+     * @param bool $ignoreDiscount
+     * @return \Magento\Object[]
+     */
     public function getProductWeeeAttributes(
         $product,
         $shipping = null,
@@ -262,6 +295,10 @@ class Tax extends \Magento\Core\Model\AbstractModel
         return $result;
     }
 
+    /**
+     * @param Product $product
+     * @return int
+     */
     protected function _getDiscountPercentForProduct($product)
     {
         $website = $this->_storeManager->getStore()->getWebsiteId();
@@ -281,7 +318,7 @@ class Tax extends \Magento\Core\Model\AbstractModel
     /**
      * Update discounts for FPT amounts of all products
      *
-     * @return \Magento\Weee\Model\Tax
+     * @return $this
      */
     public function updateDiscountPercents()
     {
@@ -293,7 +330,7 @@ class Tax extends \Magento\Core\Model\AbstractModel
      * Update discounts for FPT amounts base on products condiotion
      *
      * @param  mixed $products
-     * @return \Magento\Weee\Model\Tax
+     * @return $this
      */
     public function updateProductsDiscountPercent($products)
     {
diff --git a/app/code/Magento/Weee/Model/Total/Creditmemo/Weee.php b/app/code/Magento/Weee/Model/Total/Creditmemo/Weee.php
index aabda5fcbff..44fb5f85d96 100644
--- a/app/code/Magento/Weee/Model/Total/Creditmemo/Weee.php
+++ b/app/code/Magento/Weee/Model/Total/Creditmemo/Weee.php
@@ -27,6 +27,8 @@
 
 namespace Magento\Weee\Model\Total\Creditmemo;
 
+use Magento\Sales\Model\Order\Creditmemo;
+
 class Weee extends \Magento\Sales\Model\Order\Creditmemo\Total\AbstractTotal
 {
     /**
@@ -53,7 +55,11 @@ class Weee extends \Magento\Sales\Model\Order\Creditmemo\Total\AbstractTotal
         parent::__construct($data);
     }
 
-    public function collect(\Magento\Sales\Model\Order\Creditmemo $creditmemo)
+    /**
+     * @param Creditmemo $creditmemo
+     * @return $this
+     */
+    public function collect(Creditmemo $creditmemo)
     {
         $store = $creditmemo->getStore();
 
diff --git a/app/code/Magento/Weee/Model/Total/Quote/Weee.php b/app/code/Magento/Weee/Model/Total/Quote/Weee.php
index b22a6a33ff4..4318b59f99a 100644
--- a/app/code/Magento/Weee/Model/Total/Quote/Weee.php
+++ b/app/code/Magento/Weee/Model/Total/Quote/Weee.php
@@ -23,9 +23,10 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-
 namespace Magento\Weee\Model\Total\Quote;
 
+use Magento\Core\Model\Store;
+
 class Weee extends \Magento\Tax\Model\Sales\Total\Quote\Tax
 {
     /**
@@ -68,7 +69,7 @@ class Weee extends \Magento\Tax\Model\Sales\Total\Quote\Tax
      * Collect Weee taxes amount and prepare items prices for taxation and discount
      *
      * @param   \Magento\Sales\Model\Quote\Address $address
-     * @return  \Magento\Weee\Model\Total\Quote\Weee
+     * @return  $this
      */
     public function collect(\Magento\Sales\Model\Quote\Address $address)
     {
@@ -112,7 +113,7 @@ class Weee extends \Magento\Tax\Model\Sales\Total\Quote\Tax
      *
      * @param   \Magento\Sales\Model\Quote\Address $address
      * @param   \Magento\Sales\Model\Quote\Item\AbstractItem $item
-     * @return  \Magento\Weee\Model\Total\Quote\Weee
+     * @return  void|$this
      */
     protected function _process(\Magento\Sales\Model\Quote\Address $address, $item)
     {
@@ -205,7 +206,7 @@ class Weee extends \Magento\Tax\Model\Sales\Total\Quote\Tax
      * @param   \Magento\Sales\Model\Quote\Item\AbstractItem $item
      * @param   float $value
      * @param   float $baseValue
-     * @return  \Magento\Weee\Model\Total\Quote\Weee
+     * @return  $this
      */
     protected function _processDiscountSettings($item, $value, $baseValue)
     {
@@ -223,7 +224,7 @@ class Weee extends \Magento\Tax\Model\Sales\Total\Quote\Tax
      * @param   float $baseValue
      * @param   float $rowValue
      * @param   float $baseRowValue
-     * @return  \Magento\Weee\Model\Total\Quote\Weee
+     * @return  $this
      */
     protected function _processTaxSettings($item, $value, $baseValue, $rowValue, $baseRowValue)
     {
@@ -249,7 +250,7 @@ class Weee extends \Magento\Tax\Model\Sales\Total\Quote\Tax
      * @param   \Magento\Sales\Model\Quote\Address $address
      * @param   float $rowValue
      * @param   float $baseRowValue
-     * @return  \Magento\Weee\Model\Total\Quote\Weee
+     * @return  $this
      */
     protected function _processTotalAmount($address, $rowValue, $baseRowValue)
     {
@@ -268,7 +269,7 @@ class Weee extends \Magento\Tax\Model\Sales\Total\Quote\Tax
      * Recalculate parent item amounts based on children results
      *
      * @param   \Magento\Sales\Model\Quote\Item\AbstractItem $item
-     * @return  \Magento\Weee\Model\Total\Quote\Weee
+     * @return  void
      */
     protected function _recalculateParent(\Magento\Sales\Model\Quote\Item\AbstractItem $item)
     {
@@ -279,7 +280,7 @@ class Weee extends \Magento\Tax\Model\Sales\Total\Quote\Tax
      * Reset information about FPT for shopping cart item
      *
      * @param   \Magento\Sales\Model\Quote\Item\AbstractItem $item
-     * @return  \Magento\Weee\Model\Total\Quote\Weee
+     * @return  void
      */
     protected function _resetItemData($item)
     {
@@ -302,7 +303,7 @@ class Weee extends \Magento\Tax\Model\Sales\Total\Quote\Tax
      * Fetch FPT data to address object for display in totals block
      *
      * @param   \Magento\Sales\Model\Quote\Address $address
-     * @return  \Magento\Weee\Model\Total\Quote\Weee
+     * @return  $this
      */
     public function fetch(\Magento\Sales\Model\Quote\Address $address)
     {
@@ -314,7 +315,7 @@ class Weee extends \Magento\Tax\Model\Sales\Total\Quote\Tax
      * This method can be used for changing totals collect sort order
      *
      * @param   array $config
-     * @param   store $store
+     * @param   Store $store
      * @return  array
      */
     public function processConfigArray($config, $store)
@@ -326,6 +327,7 @@ class Weee extends \Magento\Tax\Model\Sales\Total\Quote\Tax
      * No aggregated label for fixed product tax
      *
      * TODO: fix
+     * @return string
      */
     public function getLabel()
     {
diff --git a/app/code/Magento/Weee/etc/di.xml b/app/code/Magento/Weee/etc/di.xml
index 0dda633d0ca..62ca744a345 100644
--- a/app/code/Magento/Weee/etc/di.xml
+++ b/app/code/Magento/Weee/etc/di.xml
@@ -23,28 +23,24 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Weee\Helper\Data">
-        <param name="weeeTax">
-            <instance type="Magento\Weee\Model\Tax\Proxy" />
-        </param>
+        <arguments>
+            <argument name="weeeTax" xsi:type="object">Magento\Weee\Model\Tax\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Weee\Model\Observer">
-        <param name="layout">
-            <instance type="Magento\Core\Model\Layout\Proxy" />
-        </param>
-        <param name="weeeTax">
-            <instance type="Magento\Weee\Model\Tax\Proxy" />
-        </param>
-        <param name="weeeData">
-            <instance type="Magento\Weee\Helper\Data\Proxy" />
-        </param>
+        <arguments>
+            <argument name="layout" xsi:type="object">Magento\Core\Model\Layout\Proxy</argument>
+            <argument name="weeeTax" xsi:type="object">Magento\Weee\Model\Tax\Proxy</argument>
+            <argument name="weeeData" xsi:type="object">Magento\Weee\Helper\Data\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Module\Updater\SetupFactory">
-        <param name="resourceTypes">
-            <array>
-                <item key="weee_setup"><value>Magento\Sales\Model\Resource\Setup</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="resourceTypes" xsi:type="array">
+                <item name="weee_setup" xsi:type="string">Magento\Sales\Model\Resource\Setup</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Weee/etc/events.xml b/app/code/Magento/Weee/etc/events.xml
index 93744e5117a..bbb2a5adba6 100644
--- a/app/code/Magento/Weee/etc/events.xml
+++ b/app/code/Magento/Weee/etc/events.xml
@@ -31,7 +31,7 @@
         <observer name="weee" instance="Magento\Weee\Model\Observer" method="updateDiscountPercents" />
     </event>
     <event name="catalog_product_view_config">
-        <observer name="weee" instance="Magento\Weee\Model\Observer" method="updateConfigurableProductOptions" />
+        <observer name="weee" instance="Magento\Weee\Model\Observer" method="updateProductOptions" />
     </event>
     <event name="bundle_product_view_config">
         <observer name="weee" instance="Magento\Weee\Model\Observer" method="updateBundleProductOptions" />
diff --git a/app/code/Magento/Widget/Block/Adminhtml/Widget.php b/app/code/Magento/Widget/Block/Adminhtml/Widget.php
index 33f2ebd0a94..05cdab5b75a 100644
--- a/app/code/Magento/Widget/Block/Adminhtml/Widget.php
+++ b/app/code/Magento/Widget/Block/Adminhtml/Widget.php
@@ -35,6 +35,9 @@ namespace Magento\Widget\Block\Adminhtml;
 
 class Widget extends \Magento\Backend\Block\Widget\Form\Container
 {
+    /**
+     * @return void
+     */
     protected function _construct()
     {
         parent::_construct();
diff --git a/app/code/Magento/Widget/Block/Adminhtml/Widget/Form.php b/app/code/Magento/Widget/Block/Adminhtml/Widget/Form.php
index 43a2555bf0c..3f59fc5452e 100644
--- a/app/code/Magento/Widget/Block/Adminhtml/Widget/Form.php
+++ b/app/code/Magento/Widget/Block/Adminhtml/Widget/Form.php
@@ -61,6 +61,8 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic
 
     /**
      * Form with widget to select
+     *
+     * @return void
      */
     protected function _prepareForm()
     {
@@ -151,7 +153,7 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic
     /**
      * Return array of widgets disabled for selection
      *
-     * @return array
+     * @return string[]
      */
     protected function _getSkippedWidgets()
     {
diff --git a/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance.php b/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance.php
index 4c8ee4ba79b..b09320379fe 100644
--- a/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance.php
+++ b/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance.php
@@ -37,6 +37,8 @@ class Instance extends \Magento\Backend\Block\Widget\Grid\Container
 {
     /**
      * Block constructor
+     *
+     * @return void
      */
     protected function _construct()
     {
diff --git a/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit.php b/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit.php
index 5c212807e98..75fe31bc684 100644
--- a/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit.php
+++ b/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit.php
@@ -59,6 +59,7 @@ class Edit extends \Magento\Backend\Block\Widget\Form\Container
     /**
      * Internal constructor
      *
+     * @return void
      */
     protected function _construct()
     {
@@ -82,7 +83,7 @@ class Edit extends \Magento\Backend\Block\Widget\Form\Container
      * Prepare layout.
      * Adding save_and_continue button
      *
-     * @return \Magento\Widget\Block\Adminhtml\Widget\Instance\Edit
+     * @return $this
      */
     protected function _preparelayout()
     {
diff --git a/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Chooser/Container.php b/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Chooser/Container.php
index d4260bc7065..52e9095b83f 100644
--- a/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Chooser/Container.php
+++ b/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Chooser/Container.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Widget\Block\Adminhtml\Widget\Instance\Edit\Chooser;
 
 /**
  * A chooser for container for widget instances
@@ -32,8 +33,6 @@
  * @method \Magento\Widget\Block\Adminhtml\Widget\Instance\Edit\Chooser\Container setTheme($theme)
  * @method \Magento\Widget\Block\Adminhtml\Widget\Instance\Edit\Chooser\Container setArea($area)
  */
-namespace Magento\Widget\Block\Adminhtml\Widget\Instance\Edit\Chooser;
-
 class Container extends \Magento\View\Element\Html\Select
 {
     /**
@@ -66,6 +65,8 @@ class Container extends \Magento\View\Element\Html\Select
 
     /**
      * Assign attributes for the HTML select element
+     *
+     * @return void
      */
     protected function _construct()
     {
diff --git a/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Chooser/DesignAbstraction.php b/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Chooser/DesignAbstraction.php
index af7468856c4..328407dc41e 100644
--- a/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Chooser/DesignAbstraction.php
+++ b/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Chooser/DesignAbstraction.php
@@ -118,6 +118,7 @@ class DesignAbstraction extends \Magento\View\Element\Html\Select
      * Add design abstractions information to the options
      *
      * @param array $designAbstractions
+     * @return void
      */
     protected function _addDesignAbstractionOptions(array $designAbstractions)
     {
diff --git a/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Chooser/Layout.php b/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Chooser/Layout.php
index 08b16e8ee6c..e089393734d 100644
--- a/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Chooser/Layout.php
+++ b/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Chooser/Layout.php
@@ -72,6 +72,7 @@ class Layout extends \Magento\View\Element\Html\Select
      * Add page types information to the options
      *
      * @param array $pageTypes
+     * @return void
      */
     protected function _addPageTypeOptions(array $pageTypes)
     {
diff --git a/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Form.php b/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Form.php
index 95f7d9cd444..f8f819ced63 100644
--- a/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Form.php
+++ b/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Form.php
@@ -38,7 +38,7 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic
     /**
      * Prepare form before rendering HTML
      *
-     * @return \Magento\Widget\Block\Adminhtml\Widget\Instance\Edit\Form
+     * @return $this
      */
     protected function _prepareForm()
     {
diff --git a/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Tab/Main.php b/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Tab/Main.php
index 8029a55ab2f..055c0c3342f 100644
--- a/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Tab/Main.php
+++ b/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Tab/Main.php
@@ -71,6 +71,7 @@ class Main
     /**
      * Internal constructor
      *
+     * @return void
      */
     protected function _construct()
     {
@@ -131,7 +132,7 @@ class Main
     /**
      * Prepare form before rendering HTML
      *
-     * @return \Magento\Widget\Block\Adminhtml\Widget\Instance\Edit\Tab\Main
+     * @return $this
      */
     protected function _prepareForm()
     {
@@ -209,7 +210,7 @@ class Main
             'note' => __('Sort Order of widget instances in the same container')
         ));
 
-        /* @var $layoutBlock \Magento\Widget\Block\Adminhtml\Widget\Instance\Edit\Tab\Main_Layout */
+        /* @var $layoutBlock \Magento\Widget\Block\Adminhtml\Widget\Instance\Edit\Tab\Main\Layout */
         $layoutBlock = $this->getLayout()
             ->createBlock('Magento\Widget\Block\Adminhtml\Widget\Instance\Edit\Tab\Main\Layout')
             ->setWidgetInstance($widgetInstance);
@@ -237,7 +238,7 @@ class Main
     /**
      * Initialize form fileds values
      *
-     * @return \Magento\Widget\Block\Adminhtml\Widget\Instance\Edit\Tab\Main
+     * @return $this
      */
     protected function _initFormValues()
     {
diff --git a/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Tab/Main/Layout.php b/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Tab/Main/Layout.php
index 5241315738d..9514cc4e2aa 100644
--- a/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Tab/Main/Layout.php
+++ b/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Tab/Main/Layout.php
@@ -23,22 +23,26 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Widget\Block\Adminhtml\Widget\Instance\Edit\Tab\Main;
+
+use Magento\Data\Form\Element\AbstractElement;
 
 /**
  * Widget Instance page groups (predefined layouts group) to display on
  *
  * @method \Magento\Widget\Model\Widget\Instance getWidgetInstance()
  */
-namespace Magento\Widget\Block\Adminhtml\Widget\Instance\Edit\Tab\Main;
-
 class Layout
     extends \Magento\Backend\Block\Template implements \Magento\Data\Form\Element\Renderer\RendererInterface
 {
     /**
-     * @var \Magento\Data\Form\Element\AbstractElement
+     * @var AbstractElement|null
      */
     protected $_element = null;
 
+    /**
+     * @var string
+     */
     protected $_template = 'instance/edit/layout.phtml';
 
     /**
@@ -63,9 +67,10 @@ class Layout
     /**
      * Render given element (return html of element)
      *
+     * @param AbstractElement $element
      * @return string
      */
-    public function render(\Magento\Data\Form\Element\AbstractElement $element)
+    public function render(AbstractElement $element)
     {
         $this->setElement($element);
         return $this->toHtml();
@@ -74,10 +79,10 @@ class Layout
     /**
      * Setter
      *
-     * @param \Magento\Data\Form\Element\AbstractElement $element
-     * @return
+     * @param AbstractElement $element
+     * @return $this
      */
-    public function setElement(\Magento\Data\Form\Element\AbstractElement $element)
+    public function setElement(AbstractElement $element)
     {
         $this->_element = $element;
         return $this;
@@ -86,7 +91,7 @@ class Layout
     /**
      * Getter
      *
-     * @return \Magento\Data\Form\Element\AbstractElement
+     * @return AbstractElement
      */
     public function getElement()
     {
diff --git a/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Tab/Properties.php b/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Tab/Properties.php
index cc8cb9c625f..38632dab64c 100644
--- a/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Tab/Properties.php
+++ b/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Tab/Properties.php
@@ -91,7 +91,7 @@ class Properties
      * Prepare block children and data.
      * Set widget type and widget parameters if available
      *
-     * @return \Magento\Widget\Block\Adminhtml\Widget\Instance\Edit\Tab\Properties
+     * @return $this
      */
     protected function _preparelayout()
     {
diff --git a/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Tab/Settings.php b/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Tab/Settings.php
index e133b0d6e60..df249f122c6 100644
--- a/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Tab/Settings.php
+++ b/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Tab/Settings.php
@@ -67,6 +67,9 @@ class Settings
         parent::__construct($context, $registry, $formFactory, $data);
     }
 
+    /**
+     * @return void
+     */
     protected function _construct()
     {
         parent::_construct();
@@ -126,7 +129,7 @@ class Settings
     /**
      * Prepare form before rendering HTML
      *
-     * @return \Magento\Widget\Block\Adminhtml\Widget\Instance\Edit\Tab\Settings
+     * @return $this
      */
     protected function _prepareForm()
     {
diff --git a/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Tabs.php b/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Tabs.php
index 8f1a69f7940..fb41fc4b1ca 100644
--- a/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Tabs.php
+++ b/app/code/Magento/Widget/Block/Adminhtml/Widget/Instance/Edit/Tabs.php
@@ -38,6 +38,7 @@ class Tabs extends \Magento\Backend\Block\Widget\Tabs
     /**
      * Internal constructor
      *
+     * @return void
      */
     protected function _construct()
     {
diff --git a/app/code/Magento/Widget/Block/Adminhtml/Widget/Options.php b/app/code/Magento/Widget/Block/Adminhtml/Widget/Options.php
index c37804e5310..f356c835cfe 100644
--- a/app/code/Magento/Widget/Block/Adminhtml/Widget/Options.php
+++ b/app/code/Magento/Widget/Block/Adminhtml/Widget/Options.php
@@ -48,7 +48,6 @@ class Options extends \Magento\Backend\Block\Widget\Form\Generic
     protected $_widget;
 
     /**
-     * @var \Magento\Widget\Model\Widget\Instance\OptionsFactory
      * @var \Magento\Core\Model\Option\ArrayPool
      */
     protected $_sourceModelPool;
@@ -77,8 +76,10 @@ class Options extends \Magento\Backend\Block\Widget\Form\Generic
     /**
      * Prepare Widget Options Form and values according to specified type
      *
-     * widget_type must be set in data before
+     * The widget_type must be set in data before
      * widget_values may be set before to render element values
+     *
+     * @return $this
      */
     protected function _prepareForm()
     {
@@ -132,7 +133,7 @@ class Options extends \Magento\Backend\Block\Widget\Form\Generic
      * Add fields to main fieldset based on specified widget type
      *
      * @throws \Magento\Core\Exception
-     * @return \Magento\Backend\Block\Widget\Form
+     * @return $this
      */
     public function addFields()
     {
@@ -174,8 +175,7 @@ class Options extends \Magento\Backend\Block\Widget\Form\Generic
 
         if ($values = $this->getWidgetValues()) {
             $data['value'] = (isset($values[$fieldName]) ? $values[$fieldName] : '');
-        }
-        else {
+        } else {
             $data['value'] = $parameter->getValue();
             //prepare unique id value
             if ($fieldName == 'unique_id' && $data['value'] == '') {
diff --git a/app/code/Magento/Widget/Block/BlockInterface.php b/app/code/Magento/Widget/Block/BlockInterface.php
index ceeca381caa..6754b4c566b 100644
--- a/app/code/Magento/Widget/Block/BlockInterface.php
+++ b/app/code/Magento/Widget/Block/BlockInterface.php
@@ -40,14 +40,14 @@ interface BlockInterface
      * Retains previous data in the widget.
      *
      * @param array $arr
-     * @return \Magento\Widget\Block\BlockInterface
+     * @return $this
      */
     public function addData(array $arr);
 
     /**
      * Overwrite data in the widget.
      *
-     * $key can be string or array.
+     * Param $key can be string or array.
      * If $key is string, the attribute value will be overwritten by $value.
      * If $key is an array, it will overwrite all the data in the widget.
      *
diff --git a/app/code/Magento/Widget/Controller/Adminhtml/Widget.php b/app/code/Magento/Widget/Controller/Adminhtml/Widget.php
index 3ac073c62f4..bf5f1abb8de 100644
--- a/app/code/Magento/Widget/Controller/Adminhtml/Widget.php
+++ b/app/code/Magento/Widget/Controller/Adminhtml/Widget.php
@@ -74,6 +74,8 @@ class Widget extends \Magento\Backend\App\Action
 
     /**
      * Wisywyg widget plugin main page
+     *
+     * @return void
      */
     public function indexAction()
     {
@@ -88,6 +90,8 @@ class Widget extends \Magento\Backend\App\Action
 
     /**
      * Ajax responder for loading plugin options form
+     *
+     * @return void
      */
     public function loadOptionsAction()
     {
@@ -114,6 +118,8 @@ class Widget extends \Magento\Backend\App\Action
 
     /**
      * Format widget pseudo-code for inserting into wysiwyg editor
+     *
+     * @return void
      */
     public function buildWidgetAction()
     {
diff --git a/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance.php b/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance.php
index 8f827bebd51..140d6003898 100644
--- a/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance.php
+++ b/app/code/Magento/Widget/Controller/Adminhtml/Widget/Instance.php
@@ -85,7 +85,7 @@ class Instance extends \Magento\Backend\App\Action
     /**
      * Load layout, set active menu and breadcrumbs
      *
-     * @return \Magento\Widget\Controller\Adminhtml\Widget\Instance
+     * @return $this
      */
     protected function _initAction()
     {
@@ -139,6 +139,7 @@ class Instance extends \Magento\Backend\App\Action
     /**
      * Widget Instances Grid
      *
+     * @return void
      */
     public function indexAction()
     {
@@ -151,6 +152,7 @@ class Instance extends \Magento\Backend\App\Action
     /**
      * New widget instance action (forward to edit action)
      *
+     * @return void
      */
     public function newAction()
     {
@@ -160,6 +162,7 @@ class Instance extends \Magento\Backend\App\Action
     /**
      * Edit widget instance action
      *
+     * @return void
      */
     public function editAction()
     {
@@ -179,7 +182,7 @@ class Instance extends \Magento\Backend\App\Action
      * Set body to response
      *
      * @param string $body
-     * @return null
+     * @return void
      */
     protected function setBody($body)
     {
@@ -191,6 +194,7 @@ class Instance extends \Magento\Backend\App\Action
     /**
      * Validate action
      *
+     * @return void
      */
     public function validateAction()
     {
@@ -209,6 +213,8 @@ class Instance extends \Magento\Backend\App\Action
 
     /**
      * Save action
+     *
+     * @return void
      */
     public function saveAction()
     {
@@ -249,6 +255,7 @@ class Instance extends \Magento\Backend\App\Action
     /**
      * Delete Action
      *
+     * @return void
      */
     public function deleteAction()
     {
@@ -270,6 +277,7 @@ class Instance extends \Magento\Backend\App\Action
     /**
      * Categories chooser Action (Ajax request)
      *
+     * @return void
      */
     public function categoriesAction()
     {
@@ -287,6 +295,7 @@ class Instance extends \Magento\Backend\App\Action
     /**
      * Products chooser Action (Ajax request)
      *
+     * @return void
      */
     public function productsAction()
     {
@@ -317,6 +326,7 @@ class Instance extends \Magento\Backend\App\Action
     /**
      * Blocks Action (Ajax request)
      *
+     * @return void
      */
     public function blocksAction()
     {
@@ -326,6 +336,8 @@ class Instance extends \Magento\Backend\App\Action
 
     /**
      * Render page containers
+     *
+     * @return void
      */
     public function renderPageContainers()
     {
@@ -346,6 +358,7 @@ class Instance extends \Magento\Backend\App\Action
     /**
      * Templates Chooser Action (Ajax request)
      *
+     * @return void
      */
     public function templateAction()
     {
diff --git a/app/code/Magento/Widget/Model/Config/Data.php b/app/code/Magento/Widget/Model/Config/Data.php
index e4719439297..09f31759e31 100644
--- a/app/code/Magento/Widget/Model/Config/Data.php
+++ b/app/code/Magento/Widget/Model/Config/Data.php
@@ -28,7 +28,7 @@ class Data extends \Magento\Config\Data\Scoped
     /**
      * Scope priority loading scheme
      *
-     * @var array
+     * @var string[]
      */
     protected $_scopePriorityScheme = array('global', 'design');
 
diff --git a/app/code/Magento/Widget/Model/Config/FileResolver.php b/app/code/Magento/Widget/Model/Config/FileResolver.php
index d161adbc593..56746f92476 100644
--- a/app/code/Magento/Widget/Model/Config/FileResolver.php
+++ b/app/code/Magento/Widget/Model/Config/FileResolver.php
@@ -66,7 +66,7 @@ class FileResolver implements \Magento\Config\FileResolverInterface
     }
 
     /**
-     * @inheritdoc
+     * {@inheritdoc}
      */
     public function get($filename, $scope)
     {
diff --git a/app/code/Magento/Widget/Model/Config/Reader.php b/app/code/Magento/Widget/Model/Config/Reader.php
index 3b2ef9aed13..c15caa940f5 100644
--- a/app/code/Magento/Widget/Model/Config/Reader.php
+++ b/app/code/Magento/Widget/Model/Config/Reader.php
@@ -40,7 +40,7 @@ class Reader extends \Magento\Config\Reader\Filesystem
 
     /**
      * @param \Magento\Config\FileResolverInterface $fileResolver
-     * @param \Magento\Widget\Model\Config\Converter $converter
+     * @param Converter $converter
      * @param \Magento\Config\SchemaLocatorInterface $schemaLocator
      * @param \Magento\Config\ValidationStateInterface $validationState
      * @param string $fileName
@@ -50,7 +50,7 @@ class Reader extends \Magento\Config\Reader\Filesystem
      */
     public function __construct(
         \Magento\Config\FileResolverInterface $fileResolver,
-        \Magento\Widget\Model\Config\Converter $converter,
+        Converter $converter,
         \Magento\Config\SchemaLocatorInterface $schemaLocator,
         \Magento\Config\ValidationStateInterface $validationState,
         $fileName = 'widget.xml',
@@ -75,7 +75,6 @@ class Reader extends \Magento\Config\Reader\Filesystem
      *
      * @param string $file
      * @return array
-     * @throws \Magento\Exception
      */
     public function readFile($file)
     {
diff --git a/app/code/Magento/Widget/Model/Resource/Widget.php b/app/code/Magento/Widget/Model/Resource/Widget.php
index d7a710a2550..fc36414a1bf 100644
--- a/app/code/Magento/Widget/Model/Resource/Widget.php
+++ b/app/code/Magento/Widget/Model/Resource/Widget.php
@@ -40,6 +40,7 @@ class Widget extends \Magento\Core\Model\Resource\Db\AbstractDb
     /**
      * Define main table
      *
+     * @return void
      */
     protected function _construct()
     {
@@ -50,7 +51,7 @@ class Widget extends \Magento\Core\Model\Resource\Db\AbstractDb
      * Retrieves pre-configured parameters for widget
      *
      * @param int $widgetId
-     * @return array
+     * @return array|false
      */
     public function loadPreconfiguredWidget($widgetId)
     {
diff --git a/app/code/Magento/Widget/Model/Resource/Widget/Instance.php b/app/code/Magento/Widget/Model/Resource/Widget/Instance.php
index 756e8318c76..ff1ccd9e758 100644
--- a/app/code/Magento/Widget/Model/Resource/Widget/Instance.php
+++ b/app/code/Magento/Widget/Model/Resource/Widget/Instance.php
@@ -34,11 +34,14 @@
  */
 namespace Magento\Widget\Model\Resource\Widget;
 
+use Magento\Core\Model\AbstractModel;
+
 class Instance extends \Magento\Core\Model\Resource\Db\AbstractDb
 {
     /**
      * Define main table
      *
+     * @return void
      */
     protected function _construct()
     {
@@ -49,9 +52,9 @@ class Instance extends \Magento\Core\Model\Resource\Db\AbstractDb
      * Perform actions after object load
      *
      * @param \Magento\Widget\Model\Widget\Instance $object
-     * @return \Magento\Widget\Model\Resource\Widget\Instance
+     * @return $this
      */
-    protected function _afterLoad(\Magento\Core\Model\AbstractModel $object)
+    protected function _afterLoad(AbstractModel $object)
     {
         $adapter = $this->_getReadAdapter();
         $select = $adapter->select()
@@ -66,9 +69,9 @@ class Instance extends \Magento\Core\Model\Resource\Db\AbstractDb
      * Perform actions after object save
      *
      * @param \Magento\Widget\Model\Widget\Instance $object
-     * @return \Magento\Widget\Model\Resource\Widget\Instance
+     * @return $this
      */
-    protected function _afterSave(\Magento\Core\Model\AbstractModel $object)
+    protected function _afterSave(AbstractModel $object)
     {
         $pageTable         = $this->getTable('widget_instance_page');
         $pageLayoutTable   = $this->getTable('widget_instance_page_layout');
@@ -131,7 +134,7 @@ class Instance extends \Magento\Core\Model\Resource\Db\AbstractDb
      *
      * @param \Magento\Widget\Model\Widget\Instance $widgetInstance
      * @param array $pageGroupData
-     * @return array of inserted layout updates ids
+     * @return string[] of inserted layout updates ids
      */
     protected function _saveLayoutUpdates($widgetInstance, $pageGroupData)
     {
@@ -189,10 +192,10 @@ class Instance extends \Magento\Core\Model\Resource\Db\AbstractDb
      * Perform actions before object delete.
      * Collect page ids and layout update ids and set to object for further delete
      *
-     * @param \Magento\Object $object
-     * @return \Magento\Widget\Model\Resource\Widget\Instance
+     * @param AbstractModel $object
+     * @return $this
      */
-    protected function _beforeDelete(\Magento\Core\Model\AbstractModel $object)
+    protected function _beforeDelete(AbstractModel $object)
     {
         $writeAdapter = $this->_getWriteAdapter();
         $select = $writeAdapter->select()
@@ -213,9 +216,9 @@ class Instance extends \Magento\Core\Model\Resource\Db\AbstractDb
      * Delete layout updates by layout update ids collected in _beforeSave
      *
      * @param \Magento\Widget\Model\Widget\Instance $object
-     * @return \Magento\Widget\Model\Resource\Widget\Instance
+     * @return $this
      */
-    protected function _afterDelete(\Magento\Core\Model\AbstractModel $object)
+    protected function _afterDelete(AbstractModel $object)
     {
         $this->_deleteLayoutUpdates($object->getLayoutUpdateIdsToDelete());
         return parent::_afterDelete($object);
@@ -225,7 +228,7 @@ class Instance extends \Magento\Core\Model\Resource\Db\AbstractDb
      * Delete widget instance pages by given ids
      *
      * @param array $pageIds
-     * @return \Magento\Widget\Model\Resource\Widget\Instance
+     * @return $this
      */
     protected function _deleteWidgetInstancePages($pageIds)
     {
@@ -246,7 +249,7 @@ class Instance extends \Magento\Core\Model\Resource\Db\AbstractDb
      * Delete layout updates by given ids
      *
      * @param array $layoutUpdateIds
-     * @return \Magento\Widget\Model\Resource\Widget\Instance
+     * @return $this
      */
     protected function _deleteLayoutUpdates($layoutUpdateIds)
     {
@@ -267,7 +270,7 @@ class Instance extends \Magento\Core\Model\Resource\Db\AbstractDb
      * Get store ids to which specified item is assigned
      *
      * @param int $id
-     * @return array
+     * @return string[]
      */
     public function lookupStoreIds($id)
     {
diff --git a/app/code/Magento/Widget/Model/Resource/Widget/Instance/Collection.php b/app/code/Magento/Widget/Model/Resource/Widget/Instance/Collection.php
index 70379f7c52d..bb2257fd17b 100644
--- a/app/code/Magento/Widget/Model/Resource/Widget/Instance/Collection.php
+++ b/app/code/Magento/Widget/Model/Resource/Widget/Instance/Collection.php
@@ -47,6 +47,7 @@ class Collection extends \Magento\Core\Model\Resource\Db\Collection\AbstractColl
     /**
      * Constructor
      *
+     * @return void
      */
     protected function _construct()
     {
@@ -57,9 +58,9 @@ class Collection extends \Magento\Core\Model\Resource\Db\Collection\AbstractColl
     /**
      * Filter by store ids
      *
-     * @param array|integer $storeIds
-     * @param boolean $withDefaultStore if TRUE also filter by store id '0'
-     * @return \Magento\Widget\Model\Resource\Widget\Instance\Collection
+     * @param array|int $storeIds
+     * @param bool $withDefaultStore if TRUE also filter by store id '0'
+     * @return $this
      */
     public function addStoreFilter($storeIds = array(), $withDefaultStore = true)
     {
diff --git a/app/code/Magento/Widget/Model/Resource/Widget/Instance/Options/ThemeId.php b/app/code/Magento/Widget/Model/Resource/Widget/Instance/Options/ThemeId.php
index 10b9f1e08a6..460568d8de1 100644
--- a/app/code/Magento/Widget/Model/Resource/Widget/Instance/Options/ThemeId.php
+++ b/app/code/Magento/Widget/Model/Resource/Widget/Instance/Options/ThemeId.php
@@ -48,6 +48,9 @@ class ThemeId implements \Magento\Core\Model\Option\ArrayInterface
         $this->_resourceModel = $widgetResourceModel;
     }
 
+    /**
+     * @return array
+     */
     public function toOptionArray()
     {
         return $this->_resourceModel->toOptionHash();
diff --git a/app/code/Magento/Widget/Model/Resource/Widget/Instance/Options/Types.php b/app/code/Magento/Widget/Model/Resource/Widget/Instance/Options/Types.php
index f46ac7f525e..0e09b045b30 100644
--- a/app/code/Magento/Widget/Model/Resource/Widget/Instance/Options/Types.php
+++ b/app/code/Magento/Widget/Model/Resource/Widget/Instance/Options/Types.php
@@ -48,6 +48,9 @@ class Types implements \Magento\Core\Model\Option\ArrayInterface
         $this->_model = $widgetInstanceModel;
     }
 
+    /**
+     * @return array
+     */
     public function toOptionArray()
     {
         $widgets = array();
diff --git a/app/code/Magento/Widget/Model/Template/Filter.php b/app/code/Magento/Widget/Model/Template/Filter.php
index a823ab7b242..b46cc16ba7f 100644
--- a/app/code/Magento/Widget/Model/Template/Filter.php
+++ b/app/code/Magento/Widget/Model/Template/Filter.php
@@ -51,9 +51,9 @@ class Filter extends \Magento\Cms\Model\Template\Filter
      * @param \Magento\Core\Model\StoreManagerInterface $storeManager
      * @param \Magento\View\LayoutInterface $layout
      * @param \Magento\View\LayoutFactory $layoutFactory
+     * @param \Magento\App\State $appState
      * @param \Magento\Widget\Model\Resource\Widget $widgetResource
      * @param \Magento\Widget\Model\Widget $widget
-     * @param \Magento\App\State $appState
      */
     public function __construct(
         \Magento\Stdlib\String $string,
@@ -88,7 +88,7 @@ class Filter extends \Magento\Cms\Model\Template\Filter
     /**
      * Generate widget
      *
-     * @param array $construction
+     * @param string[] $construction
      * @return string
      */
     public function widgetDirective($construction)
diff --git a/app/code/Magento/Widget/Model/Widget.php b/app/code/Magento/Widget/Model/Widget.php
index 5efa2e0691c..7abbb7871bd 100644
--- a/app/code/Magento/Widget/Model/Widget.php
+++ b/app/code/Magento/Widget/Model/Widget.php
@@ -62,14 +62,15 @@ class Widget
      */
     protected $_escaper;
 
-    /** @var  array */
+    /**
+     * @var array
+     */
     protected $_widgetsArray = array();
 
     /**
      * @param \Magento\Escaper $escaper
      * @param \Magento\Widget\Model\Config\Data $dataStorage
      * @param \Magento\View\Url $viewUrl
-     * @param \Magento\View\Url $viewUrl
      * @param \Magento\View\FileSystem $viewFileSystem
      */
     public function __construct(
@@ -97,8 +98,9 @@ class Widget
         foreach ($widgets as $widget) {
             if (isset($widget['@'])) {
                 if (isset($widget['@']['type'])) {
-                    if ($type === $widget['@']['type'])
+                    if ($type === $widget['@']['type']) {
                         return $widget;
+                    }
                 }
             }
         }
@@ -297,7 +299,7 @@ class Widget
     /**
      * Get a list of URLs of WYSIWYG placeholder images
      *
-     * array(<type> => <url>)
+     * Returns array(<type> => <url>)
      *
      * @return array
      */
@@ -320,8 +322,8 @@ class Widget
     /**
      * Remove attributes from widget array so that emulates how \Magento\Simplexml\Element::asCanonicalArray works
      *
-     * @param $inputArray
-     * @return mixed
+     * @param array $inputArray
+     * @return array
      */
     protected function _getAsCanonicalArray($inputArray)
     {
@@ -354,7 +356,7 @@ class Widget
      *
      * @param array $firstElement
      * @param array $secondElement
-     * @return boolean
+     * @return bool
      */
     protected function _sortWidgets($firstElement, $secondElement)
     {
diff --git a/app/code/Magento/Widget/Model/Widget/Config.php b/app/code/Magento/Widget/Model/Widget/Config.php
index 1dc177919a5..4f2a35d765f 100644
--- a/app/code/Magento/Widget/Model/Widget/Config.php
+++ b/app/code/Magento/Widget/Model/Widget/Config.php
@@ -122,7 +122,7 @@ class Config
     /**
      * Encode list of widget types into query param
      *
-     * @param array $widgets List of widgets
+     * @param string[]|string $widgets List of widgets
      * @return string Query param value
      */
     public function encodeWidgetsToQuery($widgets)
@@ -136,7 +136,7 @@ class Config
      * Decode URL query param and return list of widgets
      *
      * @param string $queryParam Query param value to decode
-     * @return array Array of widget types
+     * @return string[] Array of widget types
      */
     public function decodeWidgetsFromQuery($queryParam)
     {
diff --git a/app/code/Magento/Widget/Model/Widget/Instance.php b/app/code/Magento/Widget/Model/Widget/Instance.php
index 35083273dab..1f4526f74dc 100644
--- a/app/code/Magento/Widget/Model/Widget/Instance.php
+++ b/app/code/Magento/Widget/Model/Widget/Instance.php
@@ -23,6 +23,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\Widget\Model\Widget;
 
 /**
  * Widget Instance Model
@@ -42,8 +43,6 @@
  * @package     Magento_Widget
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-namespace Magento\Widget\Model\Widget;
-
 class Instance extends \Magento\Core\Model\AbstractModel
 {
     const SPECIFIC_ENTITIES = 'specific';
@@ -57,9 +56,14 @@ class Instance extends \Magento\Core\Model\AbstractModel
     const NOTANCHOR_CATEGORY_LAYOUT_HANDLE = 'catalog_category_view_type_default';
     const SINGLE_CATEGORY_LAYOUT_HANDLE    = 'catalog_category_view_{{ID}}';
 
+    /**
+     * @var array
+     */
     protected $_layoutHandles = array();
 
-    /** @var array */
+    /**
+     * @var array
+     */
     protected $_specificEntitiesLayoutHandles = array();
 
     /**
@@ -79,7 +83,9 @@ class Instance extends \Magento\Core\Model\AbstractModel
      */
     protected $_viewFileSystem;
 
-    /** @var  \Magento\Widget\Model\Widget */
+    /**
+     * @var \Magento\Widget\Model\Widget
+     */
     protected $_widgetModel;
 
     /**
@@ -93,7 +99,7 @@ class Instance extends \Magento\Core\Model\AbstractModel
     protected $_cacheTypeList;
 
     /**
-     * @var array
+     * @var string[]
      */
     protected $_relatedCacheTypes;
 
@@ -126,7 +132,7 @@ class Instance extends \Magento\Core\Model\AbstractModel
      * @param \Magento\App\Filesystem $filesystem
      * @param \Magento\Core\Model\Resource\AbstractResource $resource
      * @param \Magento\Data\Collection\Db $resourceCollection
-     * @param array $relatedCacheTypes
+     * @param string[] $relatedCacheTypes
      * @param array $data
      */
     public function __construct(
@@ -161,6 +167,8 @@ class Instance extends \Magento\Core\Model\AbstractModel
 
     /**
      * Internal Constructor
+     *
+     * @return void
      */
     protected function _construct()
     {
@@ -187,7 +195,7 @@ class Instance extends \Magento\Core\Model\AbstractModel
     /**
      * Processing object before save data
      *
-     * @return \Magento\Widget\Model\Widget\Instance
+     * @return $this
      */
     protected function _beforeSave()
     {
@@ -288,7 +296,7 @@ class Instance extends \Magento\Core\Model\AbstractModel
      * 'code' is used in Magento\Widget\Model\Widget->getWidgetsArray when the array of widgets is created.
      *
      * @param string $code
-     * @return \Magento\Widget\Model\Widget\Instance
+     * @return $this
      */
     public function setCode($code)
     {
@@ -301,7 +309,7 @@ class Instance extends \Magento\Core\Model\AbstractModel
      * Prepare widget type
      *
      * @param string $type
-     * @return \Magento\Widget\Model\Widget\Instance
+     * @return $this
      */
     public function setType($type)
     {
@@ -368,7 +376,7 @@ class Instance extends \Magento\Core\Model\AbstractModel
     /**
      * Retrieve option array of widget types
      *
-     * @param string
+     * @param string $value
      * @return array
      */
     public function getWidgetsOptionArray($value = 'code')
@@ -387,10 +395,10 @@ class Instance extends \Magento\Core\Model\AbstractModel
     /**
      * Get the widget reference (code or namespace\class name) for the passed in type or code.
      *
-     * @param $matchParam
-     * @param $value
-     * @param $requestedParam
-     * @return null
+     * @param string $matchParam
+     * @param string $value
+     * @param string $requestedParam
+     * @return string|null
      */
     public function getWidgetReference($matchParam, $value, $requestedParam)
     {
@@ -572,7 +580,7 @@ class Instance extends \Magento\Core\Model\AbstractModel
     /**
      * Invalidate related cache types
      *
-     * @return \Magento\Widget\Model\Widget\Instance
+     * @return $this
      */
     protected function _invalidateCache()
     {
@@ -584,6 +592,8 @@ class Instance extends \Magento\Core\Model\AbstractModel
 
     /**
      * Invalidate related cache if instance contain layout updates
+     *
+     * @return $this
      */
     protected function _afterSave()
     {
@@ -595,6 +605,8 @@ class Instance extends \Magento\Core\Model\AbstractModel
 
     /**
      * Invalidate related cache if instance contain layout updates
+     *
+     * @return $this
      */
     protected function _beforeDelete()
     {
diff --git a/app/code/Magento/Widget/Model/Widget/Instance/OptionsFactory.php b/app/code/Magento/Widget/Model/Widget/Instance/OptionsFactory.php
index 5af33275bcc..b3cb3e825f0 100644
--- a/app/code/Magento/Widget/Model/Widget/Instance/OptionsFactory.php
+++ b/app/code/Magento/Widget/Model/Widget/Instance/OptionsFactory.php
@@ -44,7 +44,7 @@ class OptionsFactory
     /**
      * Create new action object
      *
-     * @param $type
+     * @param string $type
      * @param array $data
      * @return \Magento\Core\Model\Option\ArrayInterface
      */
diff --git a/app/code/Magento/Widget/etc/adminhtml/di.xml b/app/code/Magento/Widget/etc/adminhtml/di.xml
index df83b22764a..f291c16631c 100644
--- a/app/code/Magento/Widget/etc/adminhtml/di.xml
+++ b/app/code/Magento/Widget/etc/adminhtml/di.xml
@@ -23,13 +23,13 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Widget\Model\Widget\Instance">
-        <param name="relatedCacheTypes">
-            <array>
-                <item key="blockCache"><value>block_html</value></item>
-                <item key="layoutCache"><value>layout</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="relatedCacheTypes" xsi:type="array">
+                <item name="blockCache" xsi:type="string">block_html</item>
+                <item name="layoutCache" xsi:type="string">layout</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Widget/etc/di.xml b/app/code/Magento/Widget/etc/di.xml
index 9c37d60bbab..60e7d48c93a 100644
--- a/app/code/Magento/Widget/etc/di.xml
+++ b/app/code/Magento/Widget/etc/di.xml
@@ -23,39 +23,31 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Widget\Model\Config\Reader">
-        <param name="fileName">
-            <value>widget.xml</value>
-        </param>
-        <param name="schemaLocator">
-            <instance type="Magento\Widget\Model\Config\SchemaLocator" />
-        </param>
-        <param name="fileResolver">
-            <instance type="Magento\Widget\Model\Config\FileResolver" />
-        </param>
+        <arguments>
+            <argument name="fileName" xsi:type="string">widget.xml</argument>
+            <argument name="schemaLocator" xsi:type="object">Magento\Widget\Model\Config\SchemaLocator</argument>
+            <argument name="fileResolver" xsi:type="object">Magento\Widget\Model\Config\FileResolver</argument>
+        </arguments>
     </type>
     <type name="Magento\Widget\Model\Config\Data">
-        <param name='reader'>
-            <instance type="Magento\Widget\Model\Config\Reader" />
-        </param>
-        <param name="cacheId">
-            <value>widget_config</value>
-        </param>
+        <arguments>
+            <argument name="reader" xsi:type="object">Magento\Widget\Model\Config\Reader</argument>
+            <argument name="cacheId" xsi:type="string">widget_config</argument>
+        </arguments>
     </type>
     <type name="Magento\Cms\Model\Template\FilterProvider">
-        <param name="pageFilter">
-            <value>Magento\Widget\Model\Template\Filter</value>
-        </param>
-        <param name="blockFilter">
-            <value>Magento\Widget\Model\Template\Filter</value>
-        </param>
+        <arguments>
+            <argument name="pageFilter" xsi:type="string">Magento\Widget\Model\Template\Filter</argument>
+            <argument name="blockFilter" xsi:type="string">Magento\Widget\Model\Template\Filter</argument>
+        </arguments>
     </type>
     <type name="Magento\Module\Updater\SetupFactory">
-        <param name="resourceTypes">
-            <array>
-                <item key="widget_setup"><value>Magento\Core\Model\Resource\Setup\Generic</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="resourceTypes" xsi:type="array">
+                <item name="widget_setup" xsi:type="string">Magento\Core\Model\Resource\Setup\Generic</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Wishlist/Model/Item.php b/app/code/Magento/Wishlist/Model/Item.php
index 647da8fda57..e1d723e81bc 100644
--- a/app/code/Magento/Wishlist/Model/Item.php
+++ b/app/code/Magento/Wishlist/Model/Item.php
@@ -422,7 +422,7 @@ class Item extends \Magento\Core\Model\AbstractModel
 
         $storeId = $this->getStoreId();
 
-        if ($product->getStatus() != \Magento\Catalog\Model\Product\Status::STATUS_ENABLED) {
+        if ($product->getStatus() != \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED) {
             return false;
         }
 
diff --git a/app/code/Magento/Wishlist/etc/adminhtml/di.xml b/app/code/Magento/Wishlist/etc/adminhtml/di.xml
index f24bd8952ad..3982fb97df9 100644
--- a/app/code/Magento/Wishlist/etc/adminhtml/di.xml
+++ b/app/code/Magento/Wishlist/etc/adminhtml/di.xml
@@ -23,23 +23,21 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Wishlist\Model\Wishlist">
-        <param name="useCurrentWebsite">
-            <value type="bool">false</value>
-        </param>
+        <arguments>
+            <argument name="useCurrentWebsite" xsi:type="boolean">false</argument>
+        </arguments>
     </type>
     <virtualType name="Magento\Wishlist\Model\Session\Storage" type="Magento\Session\Storage">
-        <param name="namespace">
-            <value>wishlist</value>
-        </param>
+        <arguments>
+            <argument name="namespace" xsi:type="string">wishlist</argument>
+        </arguments>
     </virtualType>
     <virtualType name="Magento\Wishlist\Model\Session" type="Magento\Session\Generic">
-        <param name="storage">
-            <instance type="Magento\Wishlist\Model\Session\Storage" />
-        </param>
-        <param name="sessionName">
-            <value>adminhtml</value>
-        </param>
+        <arguments>
+            <argument name="storage" xsi:type="object">Magento\Wishlist\Model\Session\Storage</argument>
+            <argument name="sessionName" xsi:type="string">adminhtml</argument>
+        </arguments>
     </virtualType>
 </config>
diff --git a/app/code/Magento/Wishlist/etc/di.xml b/app/code/Magento/Wishlist/etc/di.xml
index 065bd21b250..b393eb66cbb 100644
--- a/app/code/Magento/Wishlist/etc/di.xml
+++ b/app/code/Magento/Wishlist/etc/di.xml
@@ -23,15 +23,15 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\Wishlist\Model\Resource\Item\Collection\Grid">
-        <param name="resource">
-            <instance type="Magento\Wishlist\Model\Resource\Item" />
-        </param>
+        <arguments>
+            <argument name="resource" xsi:type="object">Magento\Wishlist\Model\Resource\Item</argument>
+        </arguments>
     </type>
     <type name="Magento\Wishlist\Helper\Data">
-        <param name="customerSession">
-            <instance type="Magento\Customer\Model\Session\Proxy" />
-        </param>
+        <arguments>
+            <argument name="customerSession" xsi:type="object">Magento\Customer\Model\Session\Proxy</argument>
+        </arguments>
     </type>
 </config>
diff --git a/app/code/Magento/Wishlist/etc/frontend/di.xml b/app/code/Magento/Wishlist/etc/frontend/di.xml
index c20d0f98265..4255b3c5632 100644
--- a/app/code/Magento/Wishlist/etc/frontend/di.xml
+++ b/app/code/Magento/Wishlist/etc/frontend/di.xml
@@ -23,38 +23,36 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <virtualType name="Magento\Wishlist\Model\Session\Storage" type="Magento\Session\Storage">
-        <param name="namespace">
-            <value>wishlist</value>
-        </param>
+        <arguments>
+            <argument name="namespace" xsi:type="string">wishlist</argument>
+        </arguments>
     </virtualType>
     <virtualType name="Magento\Wishlist\Model\Session" type="Magento\Session\Generic">
-        <param name="storage">
-            <instance type="Magento\Wishlist\Model\Session\Storage" />
-        </param>
-        <param name="sessionName">
-            <value>frontend</value>
-        </param>
+        <arguments>
+            <argument name="storage" xsi:type="object">Magento\Wishlist\Model\Session\Storage</argument>
+            <argument name="sessionName" xsi:type="string">frontend</argument>
+        </arguments>
     </virtualType>
     <type name="Magento\Session\Generic">
-        <param name="sessionName">
-            <value>frontend</value>
-        </param>
+        <arguments>
+            <argument name="sessionName" xsi:type="string">frontend</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\Url\SecurityInfo">
-        <param name="secureUrlList">
-            <array>
-                <item key="wishlist"><value>/wishlist/</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="secureUrlList" xsi:type="array">
+                <item name="wishlist" xsi:type="string">/wishlist/</item>
+            </argument>
+        </arguments>
     </type>
     <virtualType name="wishlistInitSession" type="Magento\Core\App\Action\Plugin\Session">
-        <param name="cookieCheckActions">
-            <array>
-                <item key="wishlistAdd"><value>add</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="cookieCheckActions" xsi:type="array">
+                <item name="wishlistAdd" xsi:type="string">add</item>
+            </argument>
+        </arguments>
     </virtualType>
     <type name="Magento\Wishlist\Controller\Index">
         <plugin name="sessionInitializer" type="wishlistInitSession" />
diff --git a/app/code/Magento/Wishlist/etc/module.xml b/app/code/Magento/Wishlist/etc/module.xml
index 8857673b4a1..29ef3602129 100755
--- a/app/code/Magento/Wishlist/etc/module.xml
+++ b/app/code/Magento/Wishlist/etc/module.xml
@@ -42,6 +42,7 @@
             <module name="Magento_Email"/>
             <module name="Magento_Sales"/>
             <module name="Magento_GroupedProduct"/>
+            <module name="Magento_ConfigurableProduct"/>
         </depends>
     </module>
 </config>
diff --git a/app/code/Magento/Wishlist/view/frontend/layout/wishlist_index_configure_type_configurable.xml b/app/code/Magento/Wishlist/view/frontend/layout/wishlist_index_configure_type_configurable.xml
index f16b0db368f..80e0d327483 100644
--- a/app/code/Magento/Wishlist/view/frontend/layout/wishlist_index_configure_type_configurable.xml
+++ b/app/code/Magento/Wishlist/view/frontend/layout/wishlist_index_configure_type_configurable.xml
@@ -30,10 +30,10 @@
         </action>
     </referenceBlock>
     <referenceContainer name="product.info.type">
-        <block class="Magento\Catalog\Block\Product\View\Type\Configurable" name="product.info.configurable" as="product_type_data" template="product/view/type/default.phtml" cacheable="false"/>
+        <block class="Magento\ConfigurableProduct\Block\Product\View\Type\Configurable" name="product.info.configurable" as="product_type_data" template="Magento_Catalog::product/view/type/default.phtml" cacheable="false"/>
         <container name="product.info.configurable.extra" after="product.info.configurable" as="product_type_data_extra" label="Product Extra Info"/>
     </referenceContainer>
     <referenceBlock name="product.info.options.wrapper">
-        <block class="Magento\Catalog\Block\Product\View\Type\Configurable" name="product.info.options.configurable" as="options_configurable" before="-" template="product/view/type/options/configurable.phtml" cacheable="false"/>
+        <block class="Magento\ConfigurableProduct\Block\Product\View\Type\Configurable" name="product.info.options.configurable" as="options_configurable" before="-" template="product/view/type/options/configurable.phtml" cacheable="false"/>
     </referenceBlock>
 </layout>
diff --git a/app/etc/di.xml b/app/etc/di.xml
index 3aadf66b981..178967a0456 100644
--- a/app/etc/di.xml
+++ b/app/etc/di.xml
@@ -23,7 +23,7 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <preference for="Magento\App\RequestInterface" type="Magento\App\Request\Http" />
     <preference for="Magento\App\Request\PathInfoProcessorInterface" type="Magento\Core\App\Request\PathInfoProcessor" />
     <preference for="Magento\App\ResponseInterface" type="Magento\App\Response\Http" />
@@ -66,29 +66,29 @@
     <preference for="Magento\Message\ManagerInterface" type="Magento\Message\Manager" />
     <preference for="Magento\App\Config\ValueInterface" type="Magento\Core\Model\Config\Value" />
     <type name="Magento\Message\Manager">
-        <param name="session">
-            <instance type="Magento\Message\Session\Proxy" />
-        </param>
+        <arguments>
+            <argument name="session" xsi:type="object">Magento\Message\Session\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\View\BlockPool" shared="false" />
     <type name="Magento\App\Request\Http">
-        <param name="pathInfoProcessor">
-            <instance type="Magento\Core\App\Request\PathInfoProcessor\Proxy" />
-        </param>
+        <arguments>
+            <argument name="pathInfoProcessor" xsi:type="object">Magento\Core\App\Request\PathInfoProcessor\Proxy</argument>
+        </arguments>
     </type>
     <preference for="Magento\Error\HandlerInterface" type="Magento\App\Error\Handler" />
     <preference for="Magento\Session\SaveHandlerInterface" type="Magento\Session\SaveHandler" />
     <type name="Magento\Session\SaveHandler">
-        <param name="saveMethod">
-            <value type="argument">Magento\Core\Model\Session\Config::PARAM_SESSION_SAVE_METHOD</value>
-        </param>
+        <arguments>
+            <argument name="saveMethod" xsi:type="init_parameter">Magento\Core\Model\Session\Config::PARAM_SESSION_SAVE_METHOD</argument>
+        </arguments>
     </type>
     <type name="Magento\Session\SaveHandlerFactory">
-        <param name="handlers">
-            <array>
-                <item key="db"><value>Magento\Session\SaveHandler\DbTable</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="handlers" xsi:type="array">
+                <item name="db" xsi:type="string">Magento\Session\SaveHandler\DbTable</item>
+            </argument>
+        </arguments>
     </type>
     <preference for="Magento\Module\Output\ConfigInterface" type="Magento\Core\Model\Module\Output\Config" />
     <preference for="Magento\View\Design\Theme\CustomizationInterface" type="Magento\View\Design\Theme\Customization" />
@@ -100,222 +100,217 @@
     <preference for="Magento\Config\ScopeListInterface" type="interceptionConfigScope" />
     <preference for="Magento\View\Design\Theme\Label\ListInterface" type="Magento\Core\Model\Resource\Theme\Collection" />
     <virtualType name="interceptionConfigScope" type="Magento\Config\Scope">
-        <param name="defaultScope">
-            <value>global</value>
-        </param>
+        <arguments>
+            <argument name="defaultScope" xsi:type="string">global</argument>
+        </arguments>
     </virtualType>
     <type name="Magento\App\State">
-        <param name="installDate">
-            <value type="argument">Magento\App\State::PARAM_INSTALL_DATE</value>
-        </param>
-        <param name="mode">
-            <value type="argument">Magento\App\State::PARAM_MODE</value>
-        </param>
+        <arguments>
+            <argument name="installDate" xsi:type="init_parameter">Magento\App\State::PARAM_INSTALL_DATE</argument>
+            <argument name="mode" xsi:type="init_parameter">Magento\App\State::PARAM_MODE</argument>
+        </arguments>
     </type>
     <type name="Magento\Module\FrontController\Plugin\Install">
-        <param name="cache">
-            <instance type="Magento\App\Cache\Type\Config" />
-        </param>
+        <arguments>
+            <argument name="cache" xsi:type="object">Magento\App\Cache\Type\Config</argument>
+        </arguments>
     </type>
     <type name="Magento\App\Arguments\ValidationState">
-        <param name="appMode">
-            <value type="argument">Magento\App\State::PARAM_MODE</value>
-        </param>
+        <arguments>
+            <argument name="appMode" xsi:type="init_parameter">Magento\App\State::PARAM_MODE</argument>
+        </arguments>
     </type>
     <type name="Magento\App\Arguments\Loader">
-        <param name="customFile">
-            <value type="argument">Magento\App\Arguments\Loader::PARAM_CUSTOM_FILE</value>
-        </param>
+        <arguments>
+            <argument name="customFile" xsi:type="init_parameter">Magento\App\Arguments\Loader::PARAM_CUSTOM_FILE</argument>
+        </arguments>
     </type>
     <type name="Magento\Module\Declaration\Reader\Filesystem">
-        <param name="allowedModules">
-            <value type="argument">Magento\Core\Model\App::PARAM_ALLOWED_MODULES</value>
-        </param>
+        <arguments>
+            <argument name="allowedModules" xsi:type="init_parameter">Magento\Core\Model\App::PARAM_ALLOWED_MODULES</argument>
+        </arguments>
     </type>
     <type name="Magento\App\Cache\Frontend\Factory">
-        <param name="enforcedOptions">
-            <value type="argument">Magento\Core\Model\App::PARAM_CACHE_FORCED_OPTIONS</value>
-        </param>
-        <param name="decorators">
-            <array>
-                <item key="tag">
-                    <array>
-                        <item key="class"><value>Magento\Cache\Frontend\Decorator\TagScope</value></item>
-                        <item key="parameters">
-                            <array>
-                                <item key="tag"><value>MAGE</value></item>
-                            </array>
-                        </item>
-                    </array>
+        <arguments>
+            <argument name="enforcedOptions" xsi:type="init_parameter">Magento\Core\Model\App::PARAM_CACHE_FORCED_OPTIONS</argument>
+            <argument name="decorators" xsi:type="array">
+                <item name="tag" xsi:type="array">
+                    <item name="class" xsi:type="string">Magento\Cache\Frontend\Decorator\TagScope</item>
+                    <item name="parameters" xsi:type="array">
+                        <item name="tag" xsi:type="string">MAGE</item>
+                    </item>
                 </item>
-            </array>
-        </param>
-        <param name="resource">
-            <instance type="Magento\App\Resource\Proxy" />
-        </param>
+            </argument>
+            <argument name="resource" xsi:type="object">Magento\App\Resource\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\App\Cache\State">
-        <param name="banAll">
-            <value type="argument">Magento\Core\Model\App::PARAM_BAN_CACHE</value>
-        </param>
+        <arguments>
+            <argument name="banAll" xsi:type="init_parameter">Magento\Core\Model\App::PARAM_BAN_CACHE</argument>
+        </arguments>
     </type>
     <type name="Magento\Core\Model\StoreManager">
-        <param name="scopeCode">
-            <value type="argument">Magento\Core\Model\App::PARAM_RUN_CODE</value>
-        </param>
-        <param name="scopeType">
-            <value type="argument">Magento\Core\Model\App::PARAM_RUN_TYPE</value>
-        </param>
+        <arguments>
+            <argument name="scopeCode" xsi:type="init_parameter">Magento\Core\Model\App::PARAM_RUN_CODE</argument>
+            <argument name="scopeType" xsi:type="init_parameter">Magento\Core\Model\App::PARAM_RUN_TYPE</argument>
+        </arguments>
     </type>
     <type name="Magento\Translate">
-        <param name="cache">
-            <instance type="Magento\App\Cache\Type\Translate" />
-        </param>
+        <arguments>
+            <argument name="cache" xsi:type="object">Magento\App\Cache\Type\Translate</argument>
+        </arguments>
     </type>
     <type name="Magento\Data\Structure" shared="false" />
     <type name="Magento\Core\Model\View\Design">
-        <param name="storeManager">
-            <instance type="Magento\Core\Model\StoreManager\Proxy" />
-        </param>
+        <arguments>
+            <argument name="storeManager" xsi:type="object">Magento\Core\Model\StoreManager\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Acl" shared="false" />
     <type name="Magento\App\ObjectManager\ConfigLoader">
-        <param name="cache">
-            <instance type="Magento\App\Cache\Type\Config"/>
-        </param>
+        <arguments>
+            <argument name="cache" xsi:type="object">Magento\App\Cache\Type\Config</argument>
+        </arguments>
     </type>
     <type name="Magento\App\ObjectManager\ConfigCache">
-        <param name="cacheFrontend">
-            <instance type="Magento\App\Cache\Type\Config"/>
-        </param>
+        <arguments>
+            <argument name="cacheFrontend" xsi:type="object">Magento\App\Cache\Type\Config</argument>
+        </arguments>
     </type>
     <type name="Magento\Cache\Config\Reader">
-        <param name="fileName">
-            <value>cache.xml</value>
-        </param>
+        <arguments>
+            <argument name="fileName" xsi:type="string">cache.xml</argument>
+        </arguments>
     </type>
     <type name="Magento\Cache\Config\Data">
-        <param name="cacheId">
-            <value>config_cache</value>
-        </param>
+        <arguments>
+            <argument name="cacheId" xsi:type="string">config_cache</argument>
+        </arguments>
     </type>
     <type name="Magento\Interception\Config\Config">
-        <param name="cache">
-            <instance type="Magento\App\Cache\Type\Config" />
-        </param>
-        <param name="reader">
-            <instance type="Magento\ObjectManager\Config\Reader\Dom" />
-        </param>
-        <param name="cacheId">
-            <value>interception</value>
-        </param>
+        <arguments>
+            <argument name="cache" xsi:type="object">Magento\App\Cache\Type\Config</argument>
+            <argument name="reader" xsi:type="object">Magento\ObjectManager\Config\Reader\Dom</argument>
+            <argument name="cacheId" xsi:type="string">interception</argument>
+        </arguments>
     </type>
     <type name="Magento\Interception\PluginList\PluginList">
-        <param name="cache">
-            <instance type="Magento\App\Cache\Type\Config" />
-        </param>
-        <param name="reader">
-            <instance type="Magento\ObjectManager\Config\Reader\Dom" />
-        </param>
-        <param name="cacheId">
-            <value>plugin-list</value>
-        </param>
-        <param name="scopePriorityScheme">
-            <array>
-                <item key="first"><value>global</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="cache" xsi:type="object">Magento\App\Cache\Type\Config</argument>
+            <argument name="reader" xsi:type="object">Magento\ObjectManager\Config\Reader\Dom</argument>
+            <argument name="cacheId" xsi:type="string">plugin-list</argument>
+            <argument name="scopePriorityScheme" xsi:type="array">
+                <item name="first" xsi:type="string">global</item>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\App\Resource">
-        <param name="tablePrefix">
-            <value type="argument">Magento\App\Resource::PARAM_TABLE_PREFIX</value>
-        </param>
+        <arguments>
+            <argument name="tablePrefix" xsi:type="init_parameter">Magento\App\Resource::PARAM_TABLE_PREFIX</argument>
+        </arguments>
     </type>
     <type name="Magento\App\Resource\Config">
-        <param name="cache">
-            <instance type="Magento\App\Cache\Type\Config\Proxy" />
-        </param>
-        <param name="initialResources">
-            <value type="argument">Magento\App\Resource\Config::PARAM_INITIAL_RESOURCES</value>
-        </param>
+        <arguments>
+            <argument name="cache" xsi:type="object">Magento\App\Cache\Type\Config\Proxy</argument>
+            <argument name="initialResources" xsi:type="init_parameter">Magento\App\Resource\Config::PARAM_INITIAL_RESOURCES</argument>
+        </arguments>
     </type>
     <type name="Magento\App\Resource\Config\Reader">
-        <param name="fileResolver">
-            <instance type="Magento\Core\Model\Config\FileResolver\Proxy" />
-        </param>
+        <arguments>
+            <argument name="fileResolver" xsi:type="object">Magento\Core\Model\Config\FileResolver\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Config\Scope">
-        <param name="defaultScope">
-            <value>primary</value>
-        </param>
-        <param name="areaList">
-            <instance type="Magento\App\AreaList\Proxy" />
-        </param>
+        <arguments>
+            <argument name="defaultScope" xsi:type="string">primary</argument>
+            <argument name="areaList" xsi:type="object">Magento\App\AreaList\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Url">
-        <param name="session">
-            <instance type="Magento\Core\Model\Session\Proxy" />
-        </param>
+        <arguments>
+            <argument name="session" xsi:type="object">Magento\Core\Model\Session\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\View\Url">
-        <param name="fileUrlMap">
-            <array>
-                <item key="urlLib">
-                    <array>
-                        <item key="key"><value type="const">Magento\UrlInterface::URL_TYPE_LIB</value></item>
-                        <item key="value"><value type="const">Magento\App\Filesystem::PUB_LIB_DIR</value></item>
-                    </array>
+        <arguments>
+            <argument name="fileUrlMap" xsi:type="array">
+                <item name="urlLib" xsi:type="array">
+                    <item name="key" xsi:type="const">Magento\UrlInterface::URL_TYPE_LIB</item>
+                    <item name="value" xsi:type="const">Magento\App\Filesystem::PUB_LIB_DIR</item>
                 </item>
-                <item key="urlMedia">
-                    <array>
-                        <item key="key"><value type="const">Magento\UrlInterface::URL_TYPE_MEDIA</value></item>
-                        <item key="value"><value type="const">Magento\App\Filesystem::MEDIA_DIR</value></item>
-                    </array>
+                <item name="urlMedia" xsi:type="array">
+                    <item name="key" xsi:type="const">Magento\UrlInterface::URL_TYPE_MEDIA</item>
+                    <item name="value" xsi:type="const">Magento\App\Filesystem::MEDIA_DIR</item>
                 </item>
-                <item key="urlStatic">
-                    <array>
-                        <item key="key"><value type="const">Magento\UrlInterface::URL_TYPE_STATIC</value></item>
-                        <item key="value"><value type="const">Magento\App\Filesystem::STATIC_VIEW_DIR</value></item>
-                    </array>
+                <item name="urlStatic" xsi:type="array">
+                    <item name="key" xsi:type="const">Magento\UrlInterface::URL_TYPE_STATIC</item>
+                    <item name="value" xsi:type="const">Magento\App\Filesystem::STATIC_VIEW_DIR</item>
                 </item>
-                <item key="urlCache">
-                    <array>
-                        <item key="key"><value type="const">Magento\UrlInterface::URL_TYPE_CACHE</value></item>
-                        <item key="value"><value type="const">Magento\App\Filesystem::PUB_VIEW_CACHE_DIR</value></item>
-                    </array>
+                <item name="urlCache" xsi:type="array">
+                    <item name="key" xsi:type="const">Magento\UrlInterface::URL_TYPE_CACHE</item>
+                    <item name="value" xsi:type="const">Magento\App\Filesystem::PUB_VIEW_CACHE_DIR</item>
                 </item>
-            </array>
-        </param>
-    </type>
-    <type name="Magento\HTTP\PhpEnvironment\RemoteAddress">
-        <param name="alternativeHeaders">
-            <value/>
-        </param>
+            </argument>
+        </arguments>
     </type>
     <type name="Magento\App\Filesystem">
-        <param name="fileReadFactory">
-            <instance type="Magento\Filesystem\File\ReadFactory" />
-        </param>
-        <param name="fileWriteFactory">
-            <instance type="Magento\Filesystem\File\WriteFactory" />
-        </param>
+        <arguments>
+            <argument name="fileReadFactory" xsi:type="object">Magento\Filesystem\File\ReadFactory</argument>
+            <argument name="fileWriteFactory" xsi:type="object">Magento\Filesystem\File\WriteFactory</argument>
+        </arguments>
     </type>
     <type name="Magento\App\FrontController">
         <plugin name="install" type="Magento\Module\FrontController\Plugin\Install" sortOrder="40"/>
     </type>
-    <type name="Magento\View\Layout\Argument\HandlerFactory">
-        <param name="handlerFactories">
-            <array>
-                <item key="object"><value>Magento\Core\Model\Layout\Argument\Handler\Object</value></item>
-                <item key="options"><value>Magento\Core\Model\Layout\Argument\Handler\Options</value></item>
-                <item key="url"><value>Magento\Core\Model\Layout\Argument\Handler\Url</value></item>
-                <item key="array"><value>Magento\Core\Model\Layout\Argument\Handler\ArrayHandler</value></item>
-                <item key="boolean"><value>Magento\Core\Model\Layout\Argument\Handler\Boolean</value></item>
-                <item key="helper"><value>Magento\Core\Model\Layout\Argument\Handler\Helper</value></item>
-                <item key="number"><value>Magento\Core\Model\Layout\Argument\Handler\Number</value></item>
-                <item key="string"><value>Magento\Core\Model\Layout\Argument\Handler\String</value></item>
-            </array>
-        </param>
+    <virtualType name="layoutArgumentInterpreterInternal" type="Magento\Data\Argument\Interpreter\Composite">
+        <arguments>
+            <argument name="interpreters" xsi:type="array">
+                <item name="object" xsi:type="object">layoutObjectArgumentInterpreter</item>
+                <item name="options" xsi:type="object">Magento\View\Layout\Argument\Interpreter\Options</item>
+                <item name="url" xsi:type="object">Magento\View\Layout\Argument\Interpreter\Url</item>
+                <item name="array" xsi:type="object">layoutArrayArgumentInterpreterProxy</item>
+                <item name="boolean" xsi:type="object">Magento\Data\Argument\Interpreter\Boolean</item>
+                <item name="helper" xsi:type="object">Magento\View\Layout\Argument\Interpreter\HelperMethod</item>
+                <item name="number" xsi:type="object">Magento\Data\Argument\Interpreter\Number</item>
+                <item name="string" xsi:type="object">Magento\Data\Argument\Interpreter\String</item>
+                <item name="null" xsi:type="object">Magento\Data\Argument\Interpreter\NullType</item>
+            </argument>
+            <argument name="discriminator" xsi:type="const">Magento\Core\Model\Layout\Merge::TYPE_ATTRIBUTE</argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="layoutArgumentInterpreter" type="Magento\View\Layout\Argument\Interpreter\Decorator\Updater">
+        <arguments>
+            <argument name="subject" xsi:type="object">layoutArgumentInterpreterInternal</argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="layoutArrayArgumentInterpreter" type="Magento\Data\Argument\Interpreter\ArrayType">
+        <arguments>
+            <argument name="itemInterpreter" xsi:type="object">layoutArgumentInterpreter</argument>
+        </arguments>
+    </virtualType>
+    <!--
+    Array item can be of any type just like an argument, including array type itself, which creates circular dependency.
+    Proxy is used to resolve the circular dependency, so that array items undergo the same interpretation as arguments.
+    -->
+    <virtualType name="layoutArrayArgumentInterpreterProxy" type="Magento\Data\Argument\InterpreterInterface\Proxy">
+        <arguments>
+            <argument name="instanceName" xsi:type="string">layoutArrayArgumentInterpreter</argument>
+        </arguments>
+    </virtualType>
+    <virtualType name="layoutObjectArgumentInterpreter" type="Magento\View\Layout\Argument\Interpreter\Object">
+        <arguments>
+            <argument name="expectedClass" xsi:type="string">Magento\Data\Collection</argument>
+        </arguments>
+    </virtualType>
+    <type name="Magento\View\Layout\Argument\Interpreter\NamedParams">
+        <arguments>
+            <argument name="paramInterpreter" xsi:type="object">Magento\Data\Argument\Interpreter\String</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Core\Model\Layout">
+        <arguments>
+            <argument name="argumentInterpreter" xsi:type="object">layoutArgumentInterpreter</argument>
+        </arguments>
     </type>
     <preference for="Magento\Mview\ConfigInterface" type="Magento\Mview\Config" />
     <preference for="Magento\Mview\ViewInterface" type="Magento\Mview\View" />
@@ -324,21 +319,19 @@
     <preference for="Magento\Mview\View\SubscriptionInterface" type="Magento\Mview\View\Subscription" />
     <preference for="Magento\Mview\View\ChangelogInterface" type="Magento\Mview\View\Changelog" />
     <type name="Magento\Mview\View">
-        <param name="state">
-            <instance type="Magento\Core\Model\Mview\View\State" shared="false"/>
-        </param>
-        <param name="changelog">
-            <instance type="Magento\Mview\View\Changelog" shared="false"/>
-        </param>
+        <arguments>
+            <argument name="state" xsi:type="object" shared="false">Magento\Core\Model\Mview\View\State</argument>
+            <argument name="changelog" xsi:type="object" shared="false">Magento\Mview\View\Changelog</argument>
+        </arguments>
     </type>
     <type name="Magento\Mview\Config">
-        <param name="configData">
-            <instance type="Magento\Mview\Config\Data\Proxy"/>
-        </param>
+        <arguments>
+            <argument name="configData" xsi:type="object">Magento\Mview\Config\Data\Proxy</argument>
+        </arguments>
     </type>
     <type name="Magento\Mview\Config\Data">
-        <param name="stateCollection">
-            <instance type="Magento\Mview\View\State\CollectionInterface" shared="false"/>
-        </param>
+        <arguments>
+            <argument name="stateCollection" xsi:type="object" shared="false">Magento\Mview\View\State\CollectionInterface</argument>
+        </arguments>
     </type>
 </config>
diff --git a/dev/tests/integration/framework/Magento/TestFramework/App/Arguments/Proxy.php b/dev/tests/integration/framework/Magento/TestFramework/App/Arguments/Proxy.php
new file mode 100644
index 00000000000..824762ae91d
--- /dev/null
+++ b/dev/tests/integration/framework/Magento/TestFramework/App/Arguments/Proxy.php
@@ -0,0 +1,116 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\TestFramework\App\Arguments;
+
+/**
+ * Proxy class for \Magento\App\Arguments
+ */
+class Proxy extends \Magento\App\Arguments
+{
+    /**
+     * Proxied instance
+     *
+     * @var \Magento\App\Arguments
+     */
+    protected $subject;
+
+    /**
+     * Proxy constructor
+     *
+     * @param \Magento\App\Arguments $subject
+     */
+    public function __construct(\Magento\App\Arguments $subject)
+    {
+        $this->setSubject($subject);
+    }
+
+    /**
+     * Set new subject to be proxied
+     *
+     * @param \Magento\App\Arguments $subject
+     */
+    public function setSubject(\Magento\App\Arguments $subject)
+    {
+        $this->subject = $subject;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getConnection($connectionName)
+    {
+        return $this->subject->getConnection($connectionName);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getConnections()
+    {
+        return $this->subject->getConnections();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getResources()
+    {
+        return $this->subject->getResources();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getCacheFrontendSettings()
+    {
+        return $this->subject->getCacheFrontendSettings();
+    }
+
+    /**
+     * Retrieve identifier of a cache frontend, configured to be used for a cache type
+     *
+     * @param string $cacheType Cache type identifier
+     * @return string|null
+     */
+    public function getCacheTypeFrontendId($cacheType)
+    {
+        return $this->subject->getCacheTypeFrontendId($cacheType);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function get($key = null, $defaultValue = null)
+    {
+        return $this->subject->get($key, $defaultValue);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function reload()
+    {
+        return $this->subject->reload();
+    }
+}
diff --git a/dev/tests/integration/framework/Magento/TestFramework/Db/AbstractDb.php b/dev/tests/integration/framework/Magento/TestFramework/Db/AbstractDb.php
index d6426c40728..38d351abba8 100644
--- a/dev/tests/integration/framework/Magento/TestFramework/Db/AbstractDb.php
+++ b/dev/tests/integration/framework/Magento/TestFramework/Db/AbstractDb.php
@@ -101,6 +101,30 @@ abstract class AbstractDb
      */
     abstract public function cleanup();
 
+    /**
+     * Get filename for setup db dump
+     *
+     * @return string
+     */
+    abstract protected function getSetupDbDumpFilename();
+
+    /**
+     * Is dump esxists
+     *
+     * @return bool
+     */
+    abstract public function isDbDumpExists();
+
+    /**
+     * Store setup db dump
+     */
+    abstract public function storeDbDump();
+
+    /**
+     * Restore db from setup db dump
+     */
+    abstract public function restoreFromDbDump();
+
     /**
      * Create file with sql script content.
      * Utility method that is used in children classes
diff --git a/dev/tests/integration/framework/Magento/TestFramework/Db/Mysql.php b/dev/tests/integration/framework/Magento/TestFramework/Db/Mysql.php
index 90df1c6fe73..7f02b9273c3 100644
--- a/dev/tests/integration/framework/Magento/TestFramework/Db/Mysql.php
+++ b/dev/tests/integration/framework/Magento/TestFramework/Db/Mysql.php
@@ -37,11 +37,57 @@ class Mysql extends \Magento\TestFramework\Db\AbstractDb
      */
     public function cleanup()
     {
-        $script = $this->_varPath . '/drop_create_database.sql';
-        $this->_createScript($script, "DROP DATABASE `{$this->_schema}`; CREATE DATABASE `{$this->_schema}`");
+        $this->_shell->execute(
+            'mysql --host=%s --user=%s --password=%s %s -e %s',
+            array(
+                $this->_host,
+                $this->_user,
+                $this->_password,
+                $this->_schema,
+                "DROP DATABASE `{$this->_schema}`; CREATE DATABASE `{$this->_schema}`"
+            )
+        );
+    }
+
+    /**
+     * Get filename for setup db dump
+     *
+     * @return string
+     */
+    protected function getSetupDbDumpFilename()
+    {
+        return $this->_varPath . '/setup_dump.sql';
+    }
+
+    /**
+     * Is dump esxists
+     *
+     * @return bool
+     */
+    public function isDbDumpExists()
+    {
+        return file_exists($this->getSetupDbDumpFilename());
+    }
+
+    /**
+     * Store setup db dump
+     */
+    public function storeDbDump()
+    {
+        $this->_shell->execute(
+            'mysqldump --host=%s --user=%s --password=%s %s > %s',
+            array($this->_host, $this->_user, $this->_password, $this->_schema, $this->getSetupDbDumpFilename())
+        );
+    }
+
+    /**
+     * Restore db from setup db dump
+     */
+    public function restoreFromDbDump()
+    {
         $this->_shell->execute(
             'mysql --host=%s --user=%s --password=%s %s < %s',
-            array($this->_host, $this->_user, $this->_password, $this->_schema, $script)
+            array($this->_host, $this->_user, $this->_password, $this->_schema, $this->getSetupDbDumpFilename())
         );
     }
 }
diff --git a/dev/tests/integration/framework/Magento/TestFramework/Helper/Bootstrap.php b/dev/tests/integration/framework/Magento/TestFramework/Helper/Bootstrap.php
index 21e72981948..140f0dd2c09 100644
--- a/dev/tests/integration/framework/Magento/TestFramework/Helper/Bootstrap.php
+++ b/dev/tests/integration/framework/Magento/TestFramework/Helper/Bootstrap.php
@@ -167,4 +167,14 @@ class Bootstrap
     {
         self::$_objectManager = $objectManager;
     }
+
+    /**
+     * Get bootstrap object
+     *
+     * @return \Magento\TestFramework\Bootstrap
+     */
+    public function getBootstrap()
+    {
+        return $this->_bootstrap;
+    }
 }
diff --git a/dev/tests/integration/framework/Magento/TestFramework/Indexer/TestCase.php b/dev/tests/integration/framework/Magento/TestFramework/Indexer/TestCase.php
new file mode 100644
index 00000000000..dbc3b9e7247
--- /dev/null
+++ b/dev/tests/integration/framework/Magento/TestFramework/Indexer/TestCase.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @subpackage  integration_tests
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\TestFramework\Indexer;
+
+class TestCase extends \PHPUnit_Framework_TestCase
+{
+    public static function setUpBeforeClass()
+    {
+        self::_storeDbState();
+        parent::setUpBeforeClass();
+    }
+
+    public static function tearDownAfterClass()
+    {
+        self::_restoreDbState();
+        parent::tearDownAfterClass();
+    }
+
+    /**
+     * Store current database state to db dump
+     */
+    protected static function _storeDbState()
+    {
+        self::_getDbInstance()->storeDbDump();
+    }
+
+    /**
+     * Restore current database state to db dump
+     */
+    protected static function _restoreDbState()
+    {
+        self::_getDbInstance()->restoreFromDbDump();
+    }
+
+    /**
+     * Get Database connection instance
+     *
+     * @return \Magento\TestFramework\Db\AbstractDb
+     */
+    protected static function _getDbInstance()
+    {
+        return \Magento\TestFramework\Helper\Bootstrap::getInstance()
+            ->getBootstrap()->getApplication()->getDbInstance();
+    }
+}
diff --git a/dev/tests/integration/framework/Magento/TestFramework/ObjectManagerFactory.php b/dev/tests/integration/framework/Magento/TestFramework/ObjectManagerFactory.php
index 103b28f3693..5a2e508fb34 100644
--- a/dev/tests/integration/framework/Magento/TestFramework/ObjectManagerFactory.php
+++ b/dev/tests/integration/framework/Magento/TestFramework/ObjectManagerFactory.php
@@ -56,6 +56,33 @@ class ObjectManagerFactory extends \Magento\App\ObjectManagerFactory
      */
     protected $_pluginList = null;
 
+    /**
+     * Proxy over arguments instance, used by the application and all the DI stuff
+     *
+     * @var App\Arguments\Proxy
+     */
+    protected $appArgumentsProxy;
+
+    /**
+     * Override the parent method and return proxied instance instead, so that we can reset the actual app arguments
+     * instance for all its clients at any time
+     *
+     * @param \Magento\App\Filesystem\DirectoryList $directoryList
+     * @param array $arguments
+     * @return App\Arguments\Proxy
+     * @throws \Magento\Exception
+     */
+    protected function createAppArguments(\Magento\App\Filesystem\DirectoryList $directoryList, array $arguments)
+    {
+        if ($this->appArgumentsProxy) {
+            // Framework constraint: this is ambiguous situation, because it is not clear what to do with older instance
+            throw new \Magento\Exception('Only one creation of application arguments is supported');
+        }
+        $appArguments = parent::createAppArguments($directoryList, $arguments);
+        $this->appArgumentsProxy = new App\Arguments\Proxy($appArguments);
+        return $this->appArgumentsProxy;
+    }
+
     /**
      * Restore locator instance
      *
@@ -80,7 +107,12 @@ class ObjectManagerFactory extends \Magento\App\ObjectManagerFactory
         $objectManager->addSharedInstance($directoryList, 'Magento\Filesystem\DirectoryList');
         $objectManager->configure(array(
             'Magento\View\Design\FileResolution\Strategy\Fallback\CachingProxy' => array(
-                'parameters' => array('canSaveMap' => false)
+                'arguments' => array(
+                    'canSaveMap' => array(
+                        \Magento\ObjectManager\Config\Reader\Dom::TYPE_ATTRIBUTE => 'boolean',
+                        'value' => false
+                    ),
+                )
             ),
             'default_setup' => array(
                 'type' => 'Magento\TestFramework\Db\ConnectionAdapter'
@@ -94,13 +126,10 @@ class ObjectManagerFactory extends \Magento\App\ObjectManagerFactory
             ),
         ));
 
-        $options = new \Magento\App\Arguments(
-            $arguments,
-            new \Magento\App\Arguments\Loader($directoryList)
-        );
+        $appArguments = parent::createAppArguments($directoryList, $arguments);
+        $this->appArgumentsProxy->setSubject($appArguments);
+        $objectManager->addSharedInstance($appArguments, 'Magento\App\Arguments');
 
-        $objectManager->addSharedInstance($options, 'Magento\App\Arguments');
-        $objectManager->getFactory()->setArguments($options->get());
         $objectManager->configure(
             $objectManager->get('Magento\App\ObjectManager\ConfigLoader')->load('global')
         );
diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/App/Arguments/ProxyTest.php b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/App/Arguments/ProxyTest.php
new file mode 100644
index 00000000000..3e29c9dd354
--- /dev/null
+++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/App/Arguments/ProxyTest.php
@@ -0,0 +1,84 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Test\App\Arguments;
+
+class ProxyTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * Test, that object proxies methods and returns their results
+     *
+     * @param string $method
+     * @param array $params
+     * @dataProvider proxiedMethodsDataProvider
+     */
+    public function testProxiedMethods($method, $params)
+    {
+        $subject = $this->getMock('\Magento\App\Arguments', array(), array(), '', false);
+        $invocation = $subject->expects($this->once())
+            ->method($method);
+        $invocation = call_user_func_array(array($invocation, 'with'), $params);
+        $expectedResult = new \stdClass();
+        $invocation->will($this->returnValue($expectedResult));
+
+        $object = new \Magento\TestFramework\App\Arguments\Proxy($subject);
+        $actualResult = call_user_func_array(array($object, $method), $params);
+        $this->assertSame($expectedResult, $actualResult);
+    }
+
+    /**
+     * @return array
+     */
+    public static function proxiedMethodsDataProvider()
+    {
+        return array(
+            array('getConnection', array('connection name')),
+            array('getConnections', array()),
+            array('getResources', array()),
+            array('getCacheFrontendSettings', array()),
+            array('getCacheTypeFrontendId', array('cache type')),
+            array('get', array('key', 'default')),
+            array('reload', array()),
+        );
+    }
+
+    public function testSetSubject()
+    {
+        $subject1 = $this->getMock('\Magento\App\Arguments', array(), array(), '', false);
+        $subject1->expects($this->once())
+            ->method('get');
+
+        $subject2 = $this->getMock('\Magento\App\Arguments', array(), array(), '', false);
+        $subject2->expects($this->once())
+            ->method('get');
+
+        $object = new \Magento\TestFramework\App\Arguments\Proxy($subject1);
+        $object->get('data');
+
+        $object->setSubject($subject2);
+        $object->get('data');
+    }
+
+
+}
diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/SettingsTest.php b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/SettingsTest.php
index 44968b8dc87..8f24fc136b4 100644
--- a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/SettingsTest.php
+++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/Bootstrap/SettingsTest.php
@@ -52,7 +52,7 @@ class SettingsTest extends \PHPUnit_Framework_TestCase
     public function __construct($name = null, array $data = array(), $dataName = '')
     {
         parent::__construct($name, $data, $dataName);
-        $this->_fixtureDir = __DIR__ . '/_files/';
+        $this->_fixtureDir = realpath(__DIR__ . '/_files') . '/';
     }
 
     protected function setUp()
diff --git a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/ObjectManagerTest.php b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/ObjectManagerTest.php
index cf2f33f7940..776098431ff 100644
--- a/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/ObjectManagerTest.php
+++ b/dev/tests/integration/framework/tests/unit/testsuite/Magento/Test/ObjectManagerTest.php
@@ -55,9 +55,17 @@ class ObjectManagerTest extends \PHPUnit_Framework_TestCase
         $primaryLoaderMock = $this->getMock(
             'Magento\App\ObjectManager\ConfigLoader\Primary', array(), array(), '', false
         );
+        $factory = $this->getMock('\Magento\ObjectManager\Factory', array(), array(), '', false);
+        $factory->expects($this->exactly(2))
+            ->method('create')
+            ->will($this->returnCallback(function ($className) {
+                if ($className === 'Magento\Object') {
+                    return $this->getMock('Magento\Object', array(), array(), '', false);
+                }
+            }));
 
         $model = new \Magento\TestFramework\ObjectManager(
-            null, $instanceConfig,
+            $factory, $instanceConfig,
             array(
                 'Magento\App\Filesystem\DirectoryList\Verification' => $verification,
                 'Magento\App\Cache\Type\Config' => $cache,
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Helper/Product/FlatTest.php b/dev/tests/integration/testsuite/Magento/App/ObjectManager/ConfigLoader/PrimaryTest.php
similarity index 60%
rename from dev/tests/unit/testsuite/Magento/Catalog/Helper/Product/FlatTest.php
rename to dev/tests/integration/testsuite/Magento/App/ObjectManager/ConfigLoader/PrimaryTest.php
index 6fcd2eb1c83..9fae4d3298d 100644
--- a/dev/tests/unit/testsuite/Magento/Catalog/Helper/Product/FlatTest.php
+++ b/dev/tests/integration/testsuite/Magento/App/ObjectManager/ConfigLoader/PrimaryTest.php
@@ -22,16 +22,20 @@
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
-namespace Magento\Catalog\Helper\Product;
+namespace Magento\App\ObjectManager\ConfigLoader;
 
-class FlatTest extends \PHPUnit_Framework_TestCase
+use Magento\TestFramework\ObjectManager;
+
+class PrimaryTest extends \PHPUnit_Framework_TestCase
 {
-    public function testConstruct()
+    public function testLoad()
     {
-        $flatFlag = $this->getMock('Magento\Catalog\Model\Product\Flat\Flag', array(), array(), '', false);
-        $flatFlag->expects($this->once())->method('loadSelf');
-
-        $objectHelper = new \Magento\TestFramework\Helper\ObjectManager($this);
-        $objectHelper->getObject('Magento\Catalog\Helper\Product\Flat', array('flatFlag' => $flatFlag));
+        /** @var \Magento\App\ObjectManager\ConfigLoader\Primary $loader */
+        $loader = ObjectManager::getInstance()->get('Magento\App\ObjectManager\ConfigLoader\Primary');
+        $result = $loader->load();
+        $this->assertNotEmpty($result);
+        $this->assertInternalType('array', $result);
+        $this->assertArrayHasKey('preferences', $result);
+        $this->assertArrayHasKey('Magento\App\State', $result);
     }
-}
+} 
diff --git a/dev/tests/integration/testsuite/Magento/Backend/App/Router/DefaultRouterTest.php b/dev/tests/integration/testsuite/Magento/Backend/App/Router/DefaultRouterTest.php
index ca2f606627d..4af3e4b4476 100644
--- a/dev/tests/integration/testsuite/Magento/Backend/App/Router/DefaultRouterTest.php
+++ b/dev/tests/integration/testsuite/Magento/Backend/App/Router/DefaultRouterTest.php
@@ -68,7 +68,6 @@ class DefaultRouterTest extends \PHPUnit_Framework_TestCase
     public function getControllerClassNameDataProvider()
     {
         return array(
-            array('Magento_Adminhtml', 'index', 'Magento\Adminhtml\Controller\Index'),
             array('Magento_Index', 'process', 'Magento\Index\Controller\Adminhtml\Process'),
             array('Magento_Index_Adminhtml', 'process', 'Magento\Index\Controller\Adminhtml\Process'),
         );
diff --git a/dev/tests/integration/testsuite/Magento/Backend/Block/System/Config/FormTest.php b/dev/tests/integration/testsuite/Magento/Backend/Block/System/Config/FormTest.php
index 47184c017d2..3ce28ce4bb7 100644
--- a/dev/tests/integration/testsuite/Magento/Backend/Block/System/Config/FormTest.php
+++ b/dev/tests/integration/testsuite/Magento/Backend/Block/System/Config/FormTest.php
@@ -234,14 +234,17 @@ class FormTest extends \PHPUnit_Framework_TestCase
             ->method('get')
             ->will($this->returnValue($fileIterator));
 
-        \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->configure(array(
-            'Magento\Backend\Model\Config\Structure\Reader' => array(
-                'parameters' => array('fileResolver' => $fileResolverMock)
-            )
-        ));
+        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+
+        $structureReader = $objectManager->create(
+            'Magento\Backend\Model\Config\Structure\Reader', array('fileResolver' => $fileResolverMock)
+        );
+        $structureData = $objectManager->create(
+            'Magento\Backend\Model\Config\Structure\Data', array('reader' => $structureReader)
+        );
         /** @var \Magento\Backend\Model\Config\Structure $structure  */
-        $structure = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
-            ->get('Magento\Backend\Model\Config\Structure');
+        $structure = $objectManager->create('Magento\Backend\Model\Config\Structure',
+            array('structureData' => $structureData));
 
         $this->_section = $structure->getElement('test_section');
 
diff --git a/dev/tests/integration/testsuite/Magento/Backend/Block/Widget/Grid/Massaction/AdditionalTest.php b/dev/tests/integration/testsuite/Magento/Backend/Block/Widget/Grid/Massaction/AdditionalTest.php
new file mode 100644
index 00000000000..9d2fe884919
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Backend/Block/Widget/Grid/Massaction/AdditionalTest.php
@@ -0,0 +1,68 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Backend\Block\Widget\Grid\Massaction;
+
+class AdditionalTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @magentoAppArea adminhtml
+     */
+    public function testToHtml()
+    {
+        $interpreter = $this->getMock('Magento\View\Layout\Argument\Interpreter\Options', array(), array(), '', false);
+        /**
+         * @var Additional $block
+         */
+        $block = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+            'Magento\Backend\Block\Widget\Grid\Massaction\Additional',
+            array('optionsInterpreter' => $interpreter)
+        );
+        $modelClass = 'Magento\Backend\Block\Widget\Grid\Massaction';
+        $data = array(
+            'fields' => array(
+                'field1' => array(
+                    'type' => 'select',
+                    'values' => $modelClass,
+                    'class' => 'custom_class',
+                ),
+            ),
+        );
+        $block->setData($data);
+        $evaluatedValues = array(
+            array('value' => 'value1', 'label' => 'label 1'),
+            array('value' => 'value2', 'label' => 'label 2'),
+        );
+        $interpreter->expects($this->once())
+            ->method('evaluate')
+            ->with(array('model' => $modelClass))
+            ->will($this->returnValue($evaluatedValues));
+
+        $html = $block->toHtml();
+        $this->assertStringMatchesFormat(
+            '%acustom_class absolute-advice%avalue="value1"%slabel 1%avalue="value2"%slabel 2%a',
+            $html
+        );
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Bundle/Model/ProductTest.php b/dev/tests/integration/testsuite/Magento/Bundle/Model/ProductTest.php
index f98e40f51ff..7a057ba5cfe 100644
--- a/dev/tests/integration/testsuite/Magento/Bundle/Model/ProductTest.php
+++ b/dev/tests/integration/testsuite/Magento/Bundle/Model/ProductTest.php
@@ -82,7 +82,7 @@ class ProductTest extends \PHPUnit_Framework_TestCase
             ->setName('Bundle Product')->setSku(uniqid())->setPrice(10)
             ->setMetaTitle('meta title')->setMetaKeyword('meta keyword')->setMetaDescription('meta description')
             ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-            ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+            ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
         ;
         $crud = new \Magento\TestFramework\Entity($this->_model, array('sku' => uniqid()));
         $crud->testCrud();
diff --git a/dev/tests/integration/testsuite/Magento/Bundle/_files/product.php b/dev/tests/integration/testsuite/Magento/Bundle/_files/product.php
index 1087e054be5..ebf708f1a26 100644
--- a/dev/tests/integration/testsuite/Magento/Bundle/_files/product.php
+++ b/dev/tests/integration/testsuite/Magento/Bundle/_files/product.php
@@ -42,7 +42,7 @@ $product->setTypeId('bundle')
     ->setName('Bundle Product')
     ->setSku('bundle-product')
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->setStockData(array(
         'use_config_manage_stock'   => 1,
         'qty'                       => 100,
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Options/OptionTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Options/OptionTest.php
index e3a70ba1084..a3d00c2becd 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Options/OptionTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Options/OptionTest.php
@@ -52,7 +52,7 @@ class OptionTest extends \PHPUnit_Framework_TestCase
             ->setMetaDescription('meta description')
 
             ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-            ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED);
+            ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED);
 
         $product = clone $productWithOptions;
         /** @var $option \Magento\Catalog\Model\Product\Option */
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/AttributeTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/AttributeTest.php
index b0042c80560..4429db7f9b3 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/AttributeTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/Product/AttributeTest.php
@@ -56,7 +56,7 @@ class AttributeTest extends \Magento\Backend\Utility\Controller
         $this->dispatch('backend/catalog/product_attribute/save');
         $model = $this->_objectManager->create('Magento\Catalog\Model\Resource\Eav\Attribute');
         $model->load($postData['attribute_id']);
-        $this->assertEquals('simple,configurable', $model->getData('apply_to'));
+        $this->assertEquals('simple', $model->getData('apply_to'));
     }
 
     /**
@@ -70,7 +70,7 @@ class AttributeTest extends \Magento\Backend\Utility\Controller
         $this->dispatch('backend/catalog/product_attribute/save');
         $model = $this->_objectManager->create('Magento\Catalog\Model\Resource\Eav\Attribute');
         $model->load($postData['attribute_id']);
-        $this->assertEquals(array('simple', 'configurable'), $model->getApplyTo());
+        $this->assertEquals(array('simple'), $model->getApplyTo());
     }
 
     /**
@@ -133,7 +133,6 @@ class AttributeTest extends \Magento\Backend\Utility\Controller
             'default_value_textarea' => '0',
             'is_required' => '1',
             'frontend_class' => '',
-            'is_configurable' => '0',
             'is_searchable' => '0',
             'is_visible_in_advanced_search' => '0',
             'is_comparable' => '0',
@@ -144,7 +143,7 @@ class AttributeTest extends \Magento\Backend\Utility\Controller
             'is_visible_on_front' => '0',
             'used_in_product_listing' => '1',
             'used_for_sort_by' => '0',
-            'apply_to' => array('simple', 'configurable'),
+            'apply_to' => array('simple'),
             'frontend_label' => array(
                 \Magento\Core\Model\Store::DEFAULT_STORE_ID => 'Fixture String',
             ),
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/ProductTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/ProductTest.php
index 942cfe62b51..a3dea06f8a1 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/ProductTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/ProductTest.php
@@ -32,45 +32,6 @@ namespace Magento\Catalog\Controller\Adminhtml;
  */
 class ProductTest extends \Magento\Backend\Utility\Controller
 {
-    /**
-     * @magentoDataFixture Magento/Catalog/_files/product_configurable.php
-     */
-    public function testSaveActionAssociatedProductIds()
-    {
-        $associatedProductIds = array(3, 14, 15, 92);
-        $this->getRequest()->setPost(array(
-            'attributes' => array($this->_getConfigurableAttribute()->getId()),
-            'associated_product_ids' => $associatedProductIds,
-        ));
-
-        $this->dispatch('backend/catalog/product/save');
-
-        /** @var $objectManager \Magento\TestFramework\ObjectManager */
-        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
-
-        /** @var $product \Magento\Catalog\Model\Product */
-        $product = $objectManager->get('Magento\Core\Model\Registry')->registry('current_product');
-        $this->assertEquals($associatedProductIds, $product->getAssociatedProductIds());
-
-        /** @see \Magento\Backend\Utility\Controller::assertPostConditions() */
-        $this->markTestIncomplete('Suppressing admin error messages validation until the bug MAGETWO-7044 is fixed.');
-    }
-
-    /**
-     * Retrieve configurable attribute instance
-     *
-     * @return \Magento\Catalog\Model\Entity\Attribute
-     */
-    protected function _getConfigurableAttribute()
-    {
-        return \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
-            ->create('Magento\Catalog\Model\Entity\Attribute')->loadByCode(
-                \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\Eav\Model\Config')
-                    ->getEntityType('catalog_product')->getId(),
-                'test_configurable'
-            );
-    }
-
     public function testSaveActionWithDangerRequest()
     {
         $this->getRequest()->setPost(array(
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Helper/Product/FlatTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Helper/Product/FlatTest.php
index e8ac7f19013..87eb4709103 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Helper/Product/FlatTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Helper/Product/FlatTest.php
@@ -40,27 +40,6 @@ class FlatTest extends \PHPUnit_Framework_TestCase
             ->get('Magento\Catalog\Helper\Product\Flat');
     }
 
-    public function testGetFlag()
-    {
-        $flag = $this->_helper->getFlag();
-        $this->assertInstanceOf('Magento\Catalog\Model\Product\Flat\Flag', $flag);
-    }
-
-    public function testIsBuilt()
-    {
-        $this->assertFalse($this->_helper->isBuilt());
-        $flag = $this->_helper->getFlag();
-        try {
-            $flag->setIsBuilt(true);
-            $this->assertTrue($this->_helper->isBuilt());
-
-            $flag->setIsBuilt(false);
-        } catch (\Exception $e) {
-            $flag->setIsBuilt(false);
-            throw $e;
-        }
-    }
-
     public function testIsEnabledDefault()
     {
 
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Helper/ProductTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Helper/ProductTest.php
index 2803940447f..f80542ec752 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Helper/ProductTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Helper/ProductTest.php
@@ -146,7 +146,7 @@ class ProductTest extends \PHPUnit_Framework_TestCase
 
         // enabled and visible
         $product->setId(1);
-        $product->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED);
+        $product->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED);
         $product->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH);
         $this->assertTrue($this->_helper->canShow($product));
 
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Category/ProductTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Category/ProductTest.php
new file mode 100644
index 00000000000..c1c19b950f8
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Category/ProductTest.php
@@ -0,0 +1,253 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Category;
+
+/**
+ * @magentoDataFixture Magento/Catalog/_files/indexer_catalog_category.php
+ * @magentoDbIsolation enabled
+ */
+class ProductTest extends \PHPUnit_Framework_TestCase
+{
+    const DEFAULT_ROOT_CATEGORY = 2;
+    /**
+     * @var \Magento\Indexer\Model\IndexerInterface
+     */
+    protected $indexer;
+
+    /**
+     * @var \Magento\Catalog\Model\Resource\Product
+     */
+    protected $productResource;
+
+    protected function setUp()
+    {
+        /** @var \Magento\Indexer\Model\IndexerInterface indexer */
+        $this->indexer = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create('Magento\Indexer\Model\Indexer');
+        $this->indexer->load('catalog_category_product');
+
+        /** @var \Magento\Catalog\Model\Resource\Product $productResource */
+        $this->productResource = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->get('Magento\Catalog\Model\Resource\Product');
+    }
+
+    public function testReindexAll()
+    {
+        $categories = $this->getCategories(4);
+        $products = $this->getProducts(2);
+
+        /** @var \Magento\Catalog\Model\Category $categoryFourth */
+        $categoryFourth = end($categories);
+        foreach ($products as $product) {
+            /** @var \Magento\Catalog\Model\Product $product */
+            $product->setCategoryIds(array($categoryFourth->getId()));
+            $product->save();
+        }
+
+        /** @var \Magento\Catalog\Model\Category $categoryThird */
+        $categoryThird = $categories[2];
+        $categoryThird->setIsAnchor(true);
+        $categoryThird->save();
+
+        $this->clearIndex();
+        $categories = array(self::DEFAULT_ROOT_CATEGORY, $categoryThird->getId(), $categoryFourth->getId());
+
+        $this->indexer->reindexAll();
+
+        foreach ($products as $product) {
+            /** @var \Magento\Catalog\Model\Product $product */
+            foreach ($categories as $categoryId) {
+                $this->assertTrue((bool)$this->productResource->canBeShowInCategory($product, $categoryId));
+            }
+
+            $this->assertFalse(
+                (bool)$this->productResource->canBeShowInCategory($product, $categoryThird->getParentId())
+            );
+        }
+    }
+
+    /**
+     * @magentoAppArea adminhtml
+     * @depends testReindexAll
+     */
+    public function testCategoryMove()
+    {
+        $categories = $this->getCategories(4);
+        $products = $this->getProducts(2);
+
+        /** @var \Magento\Catalog\Model\Category $categoryFourth */
+        $categoryFourth = end($categories);
+
+        /** @var \Magento\Catalog\Model\Category $categorySecond */
+        $categorySecond = $categories[1];
+        $categorySecond->setIsAnchor(true);
+        $categorySecond->save();
+
+        /** @var \Magento\Catalog\Model\Category $categoryThird */
+        $categoryThird = $categories[2];
+
+        /**
+         * Move category from $categoryThird to $categorySecond
+         */
+        $categoryFourth->move($categorySecond->getId(), null);
+
+        $categories = array(self::DEFAULT_ROOT_CATEGORY, $categorySecond->getId(), $categoryFourth->getId());
+
+        foreach ($products as $product) {
+            /** @var \Magento\Catalog\Model\Product $product */
+            foreach ($categories as $categoryId) {
+                $this->assertTrue((bool)$this->productResource->canBeShowInCategory($product, $categoryId));
+            }
+
+            $this->assertFalse(
+                (bool)$this->productResource->canBeShowInCategory($product, $categoryThird->getId())
+            );
+        }
+    }
+
+    /**
+     * @magentoAppArea adminhtml
+     * @depends testReindexAll
+     */
+    public function testCategoryDelete()
+    {
+        $categories = $this->getCategories(4);
+        $products = $this->getProducts(2);
+
+        /** @var \Magento\Catalog\Model\Category $categoryFourth */
+        $categoryFourth = end($categories);
+        $categoryFourth->delete();
+
+        /** @var \Magento\Catalog\Model\Category $categorySecond */
+        $categorySecond = $categories[1];
+
+        $categories = array($categorySecond->getId(), $categoryFourth->getId());
+
+        foreach ($products as $product) {
+            /** @var \Magento\Catalog\Model\Product $product */
+            foreach ($categories as $categoryId) {
+                $this->assertFalse(
+                    (bool)$this->productResource->canBeShowInCategory($product, $categoryId)
+                );
+            }
+            $this->assertTrue(
+                (bool)$this->productResource->canBeShowInCategory($product, self::DEFAULT_ROOT_CATEGORY)
+            );
+        }
+    }
+
+    /**
+     * @depends testReindexAll
+     */
+    public function testCategoryCreate()
+    {
+        $categories = $this->getCategories(4);
+        $products = $this->getProducts(3);
+
+        /** @var \Magento\Catalog\Model\Category $categorySecond */
+        $categorySecond = $categories[1];
+        $categorySecond->setIsAnchor(0);
+        $categorySecond->save();
+
+        /** @var \Magento\Catalog\Model\Category $categoryFifth */
+        $categoryFifth = end($categories);
+
+        /** @var \Magento\Catalog\Model\Category $categorySixth */
+        $categorySixth = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create('Magento\Catalog\Model\Category');
+        $categorySixth->setName('Category 6')
+            ->setPath($categoryFifth->getPath())
+            ->setAvailableSortBy('name')
+            ->setDefaultSortBy('name')
+            ->setIsActive(true)
+            ->save();
+
+        /** @var \Magento\Catalog\Model\Product $productThird */
+        $productThird = end($products);
+        $productThird->setCategoryIds(array($categorySixth->getId()));
+        $productThird->save();
+
+        $categories = array(self::DEFAULT_ROOT_CATEGORY, $categorySixth->getId());
+        foreach ($categories as $categoryId) {
+            $this->assertTrue(
+                (bool)$this->productResource->canBeShowInCategory($productThird, $categoryId)
+            );
+        }
+
+        $categories = array($categoryFifth->getId(), $categorySecond->getId());
+        foreach ($categories as $categoryId) {
+            $this->assertFalse(
+                (bool)$this->productResource->canBeShowInCategory($productThird, $categoryId)
+            );
+        }
+    }
+
+    /**
+     * @param int $count
+     * @return \Magento\Catalog\Model\Category[]
+     */
+    protected function getCategories($count)
+    {
+        /** @var \Magento\Catalog\Model\Category $category */
+        $category = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create('Magento\Catalog\Model\Category');
+
+        $result = $category->getCollection()->getItems();
+        $result = array_slice($result, 2);
+
+        return array_slice($result, 0, $count);
+    }
+
+    /**
+     * @param int $count
+     * @return \Magento\Catalog\Model\Product[]
+     */
+    protected function getProducts($count)
+    {
+        /** @var \Magento\Catalog\Model\Product $product */
+        $product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create('Magento\Catalog\Model\Product');
+
+        $result = $product->getCollection()->getItems();
+
+        return array_slice($result, 0, $count);
+    }
+
+    /**
+     * Clear index data
+     */
+    protected function clearIndex()
+    {
+        $this->productResource->getWriteConnection()
+            ->delete($this->productResource->getTable('catalog_category_product_index'));
+
+        $actualResult = $this->productResource->getReadConnection()->fetchOne(
+            $this->productResource->getReadConnection()->select()
+                ->from($this->productResource->getTable('catalog_category_product_index'), 'product_id')
+
+        );
+        $this->assertFalse($actualResult);
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Product/CategoryTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Product/CategoryTest.php
new file mode 100644
index 00000000000..017300ab98f
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Product/CategoryTest.php
@@ -0,0 +1,199 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Product;
+
+/**
+ * @magentoDataFixture Magento/Catalog/_files/indexer_catalog_category.php
+ */
+class CategoryTest extends \PHPUnit_Framework_TestCase
+{
+    const DEFAULT_ROOT_CATEGORY = 2;
+    /**
+     * @var \Magento\Indexer\Model\IndexerInterface
+     */
+    protected $indexer;
+
+    /**
+     * @var \Magento\Catalog\Model\Resource\Product
+     */
+    protected $productResource;
+
+    protected function setUp()
+    {
+        /** @var \Magento\Indexer\Model\IndexerInterface indexer */
+        $this->indexer = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create('Magento\Indexer\Model\Indexer');
+        $this->indexer->load('catalog_product_category');
+
+        /** @var \Magento\Catalog\Model\Resource\Product $productResource */
+        $this->productResource = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->get('Magento\Catalog\Model\Resource\Product');
+    }
+
+    public function testReindexAll()
+    {
+        $categories = $this->getCategories(4);
+        $products = $this->getProducts(3);
+
+        /** @var \Magento\Catalog\Model\Category $categoryFourth */
+        $categoryFourth = end($categories);
+        foreach ($products as $product) {
+            /** @var \Magento\Catalog\Model\Product $product */
+            $product->setCategoryIds(array($categoryFourth->getId()));
+            $product->save();
+        }
+
+        /** @var \Magento\Catalog\Model\Category $categoryFirst */
+        $categoryFirst = $categories[0];
+        $categoryFirst->setIsAnchor(true);
+        $categoryFirst->save();
+
+        $this->clearIndex();
+        $categories = array(self::DEFAULT_ROOT_CATEGORY, $categoryFirst->getId(), $categoryFourth->getId());
+
+        $this->indexer->reindexAll();
+
+        foreach ($products as $product) {
+            /** @var \Magento\Catalog\Model\Product $product */
+            foreach ($categories as $categoryId) {
+                $this->assertTrue((bool)$this->productResource->canBeShowInCategory($product, $categoryId));
+            }
+        }
+    }
+
+    /**
+     * @depends testReindexAll
+     */
+    public function testStatusChange()
+    {
+        $categories = $this->getCategories(4);
+        $products = $this->getProducts(3);
+
+        /** @var \Magento\Catalog\Model\Product $product */
+        $productFirst = array_shift($products);
+        $productFirst->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_DISABLED);
+        $productFirst->save();
+
+        /** @var \Magento\Catalog\Model\Category $categoryFirst */
+        $categoryFirst = $categories[0];
+
+        /** @var \Magento\Catalog\Model\Category $categoryFourth */
+        $categoryFourth = end($categories);
+
+        $categories = array(self::DEFAULT_ROOT_CATEGORY, $categoryFirst->getId(), $categoryFourth->getId());
+
+        foreach ($categories as $categoryId) {
+            foreach ($products as $product) {
+                /** @var \Magento\Catalog\Model\Product $product */
+                $this->assertTrue((bool)$this->productResource->canBeShowInCategory($product, $categoryId));
+
+            }
+            $this->assertFalse((bool)$this->productResource->canBeShowInCategory($productFirst, $categoryId));
+        }
+    }
+
+    /**
+     * @depends testReindexAll
+     */
+    public function testVisibilityChange()
+    {
+        $categories = $this->getCategories(4);
+        $products = $this->getProducts(3);
+
+        /** @var \Magento\Catalog\Model\Product $product */
+        $productFirst = $products[0];
+        $productFirst->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED);
+        $productFirst->save();
+
+        $productThird = array_pop($products);
+        $productThird->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_NOT_VISIBLE);
+        $productThird->save();
+
+        /** @var \Magento\Catalog\Model\Category $categoryFirst */
+        $categoryFirst = $categories[0];
+
+        /** @var \Magento\Catalog\Model\Category $categoryFourth */
+        $categoryFourth = end($categories);
+
+        $categories = array(self::DEFAULT_ROOT_CATEGORY, $categoryFirst->getId(), $categoryFourth->getId());
+
+        foreach ($categories as $categoryId) {
+            foreach ($products as $product) {
+                /** @var \Magento\Catalog\Model\Product $product */
+                $this->assertTrue((bool)$this->productResource->canBeShowInCategory($product, $categoryId));
+
+            }
+            $this->assertFalse((bool)$this->productResource->canBeShowInCategory($productThird, $categoryId));
+        }
+
+    }
+
+    /**
+     * @param int $count
+     * @return \Magento\Catalog\Model\Category[]
+     */
+    protected function getCategories($count)
+    {
+        /** @var \Magento\Catalog\Model\Category $category */
+        $category = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create('Magento\Catalog\Model\Category');
+
+        $result = $category->getCollection()->getItems();
+        $result = array_slice($result, 2);
+
+        return array_slice($result, 0, $count);
+    }
+
+    /**
+     * @param int $count
+     * @return \Magento\Catalog\Model\Product[]
+     */
+    protected function getProducts($count)
+    {
+        /** @var \Magento\Catalog\Model\Product $product */
+        $product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create('Magento\Catalog\Model\Product');
+
+        $result = $product->getCollection()->getItems();
+
+        return array_slice($result, 0, $count);
+    }
+
+    /**
+     * Clear index data
+     */
+    protected function clearIndex()
+    {
+        $this->productResource->getWriteConnection()
+            ->delete($this->productResource->getTable('catalog_category_product_index'));
+
+        $actualResult = $this->productResource->getReadConnection()->fetchOne(
+            $this->productResource->getReadConnection()->select()
+                ->from($this->productResource->getTable('catalog_category_product_index'), 'product_id')
+
+        );
+        $this->assertFalse($actualResult);
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Action/FullTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Action/FullTest.php
new file mode 100644
index 00000000000..0b5dc0b4f75
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Action/FullTest.php
@@ -0,0 +1,82 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @subpackage  integration_tests
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Product\Flat\Action;
+
+/**
+ * Full reindex Test
+ */
+class FullTest extends \Magento\TestFramework\Indexer\TestCase
+{
+    /**
+     * @var \Magento\Catalog\Helper\Product\Flat
+     */
+    protected $_helper;
+
+    /**
+     * @var \Magento\Catalog\Model\Indexer\Product\Flat\Processor
+     */
+    protected $_processor;
+
+    protected function setUp()
+    {
+        $this->_helper = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->get('Magento\Catalog\Helper\Product\Flat');
+        $this->_processor = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->get('Magento\Catalog\Model\Indexer\Product\Flat\Processor');
+    }
+
+    /**
+     * @magentoDbIsolation enabled
+     * @magentoAppIsolation enabled
+     * @magentoConfigFixture current_store catalog/frontend/flat_catalog_product 1
+     * @magentoDataFixture Magento/Catalog/_files/product_simple.php
+     */
+    public function testReindexAll()
+    {
+        $this->assertTrue($this->_helper->isEnabled());
+        $this->_processor->reindexAll();
+
+        $categoryFactory = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->get('\Magento\Catalog\Model\CategoryFactory');
+        $listProduct = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->get('\Magento\Catalog\Block\Product\ListProduct');
+
+        $category = $categoryFactory->create()->load(2);
+        $layer = $listProduct->getLayer();
+        $layer->setCurrentCategory($category);
+        $productCollection = $layer->getProductCollection();
+
+        $this->assertCount(1, $productCollection);
+
+        /** @var $product \Magento\Catalog\Model\Product */
+        foreach ($productCollection as $product) {
+            $this->assertEquals('Simple Product', $product->getName());
+            $this->assertEquals('Short description', $product->getShortDescription());
+        }
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Action/RowTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Action/RowTest.php
new file mode 100644
index 00000000000..d26bc0eaa47
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Action/RowTest.php
@@ -0,0 +1,104 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @subpackage  integration_tests
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Product\Flat\Action;
+
+/**
+ * Class RowTest
+ * @package Magento\Catalog\Model\Indexer\Product\Flat\Action
+ */
+class RowTest extends \Magento\TestFramework\Indexer\TestCase
+{
+    /**
+     * @var \Magento\Catalog\Model\Product
+     */
+    protected $_product;
+
+    /**
+     * @var \Magento\Catalog\Model\Category
+     */
+    protected $_category;
+
+    /**
+     * @var \Magento\Catalog\Helper\Product\Flat
+     */
+    protected $_helper;
+
+    /**
+     * @var \Magento\Catalog\Model\Indexer\Product\Flat\Processor
+     */
+    protected $_processor;
+
+    protected function setUp()
+    {
+        $this->_product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create('Magento\Catalog\Model\Product');
+        $this->_category = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create('Magento\Catalog\Model\Category');
+        $this->_helper = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create('Magento\Catalog\Helper\Product\Flat');
+        $this->_processor = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create('Magento\Catalog\Model\Indexer\Product\Flat\Processor');
+    }
+
+    /**
+     * @magentoDbIsolation enabled
+     * @magentoAppIsolation enabled
+     * @magentoDataFixture Magento/Catalog/_files/row_fixture.php
+     * @magentoConfigFixture current_store catalog/frontend/flat_catalog_product 1
+     */
+    public function testProductUpdate()
+    {
+        $categoryFactory = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create('\Magento\Catalog\Model\CategoryFactory');
+        $listProduct = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create('\Magento\Catalog\Block\Product\ListProduct');
+
+        $this->assertTrue($this->_helper->isEnabled());
+
+        $this->_processor->getIndexer()->setScheduled(false);
+        $this->assertFalse($this->_processor->getIndexer()->isScheduled());
+
+        $this->_product->load(1);
+        $this->_product->setName('Updated Product');
+        $this->_product->save();
+
+        $category = $categoryFactory->create()->load(9);
+        $layer = $listProduct->getLayer();
+        $layer->setCurrentCategory($category);
+        $productCollection = $layer->getProductCollection();
+
+        $this->assertEquals(1, $productCollection->count());
+
+        /** @var $product \Magento\Catalog\Model\Product */
+        foreach ($productCollection as $product) {
+            $this->assertEquals($this->_product->getId(), $product->getId());
+            $this->assertEquals($this->_product->getName(), $product->getName());
+            $this->assertEquals($this->_product->getPrice(), $product->getPrice());
+        }
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Action/RowsTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Action/RowsTest.php
new file mode 100644
index 00000000000..a41b8aa1dd8
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Action/RowsTest.php
@@ -0,0 +1,84 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @subpackage  integration_tests
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Product\Flat\Action;
+
+/**
+ * Class RowsTest
+ * @package Magento\Catalog\Model\Indexer\Product\Flat\Action
+ */
+class RowsTest extends \Magento\TestFramework\Indexer\TestCase
+{
+    /**
+     * @var \Magento\Catalog\Model\Product
+     */
+    protected $_product;
+
+    /**
+     * @var \Magento\Catalog\Model\Indexer\Product\Flat\Processor
+     */
+    protected $_processor;
+
+    protected function setUp()
+    {
+        $this->_product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create('Magento\Catalog\Model\Product');
+        $this->_processor = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->get('Magento\Catalog\Model\Indexer\Product\Flat\Processor');
+    }
+
+    /**
+     * @magentoDbIsolation enabled
+     * @magentoAppIsolation enabled
+     * @magentoConfigFixture current_store catalog/frontend/flat_catalog_product 1
+     * @magentoDataFixture Magento/Catalog/_files/product_simple.php
+     */
+    public function testProductsUpdate()
+    {
+        $this->_product->load(1);
+
+        $this->_processor->reindexList(array($this->_product->getId()));
+
+        $categoryFactory = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->get('\Magento\Catalog\Model\CategoryFactory');
+        $listProduct = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->get('\Magento\Catalog\Block\Product\ListProduct');
+
+        $category = $categoryFactory->create()->load(2);
+        $layer = $listProduct->getLayer();
+        $layer->setCurrentCategory($category);
+        $productCollection = $layer->getProductCollection();
+
+        $this->assertCount(1, $productCollection);
+
+        /** @var $product \Magento\Catalog\Model\Product */
+        foreach ($productCollection as $product) {
+            $this->assertEquals($this->_product->getName(), $product->getName());
+            $this->assertEquals($this->_product->getShortDescription(), $product->getShortDescription());
+        }
+    }
+}
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
new file mode 100644
index 00000000000..66480faeee2
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/ProcessorTest.php
@@ -0,0 +1,134 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @subpackage  integration_tests
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Product\Flat;
+
+/**
+ * Class FullTest
+ * @package Magento\Catalog\Model\Product\Flat\Action
+ */
+class ProcessorTest extends \Magento\TestFramework\Indexer\TestCase
+{
+    /**
+     * @var \Magento\Catalog\Helper\Product\Flat
+     */
+    protected $_helper;
+
+    /**
+     * @var \Magento\Catalog\Model\Indexer\Product\Flat\Processor
+     */
+    protected $_processor;
+
+    protected function setUp()
+    {
+        $this->_helper = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->get('Magento\Catalog\Helper\Product\Flat');
+        $this->_processor = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->get('Magento\Catalog\Model\Indexer\Product\Flat\Processor');
+    }
+
+    /**
+     * @magentoDbIsolation enabled
+     * @magentoAppIsolation enabled
+     * @magentoAppArea adminhtml
+     * @magentoConfigFixture current_store catalog/frontend/flat_catalog_product 1
+     */
+    public function testEnableProductFlat()
+    {
+        $this->assertTrue($this->_helper->isEnabled());
+        $this->assertTrue($this->_processor->getIndexer()->isInvalid());
+    }
+
+    /**
+     * @magentoDbIsolation enabled
+     * @magentoAppIsolation enabled
+     * @magentoAppArea adminhtml
+     * @magentoDataFixture Magento/Catalog/_files/multiple_products.php
+     */
+    public function testSaveAttribute()
+    {
+        /** @var $product \Magento\Catalog\Model\Product */
+        $product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create('Magento\Catalog\Model\Product');
+
+        /** @var \Magento\Catalog\Model\Resource\Product $productResource */
+        $productResource = $product->getResource();
+        $productResource->getAttribute('sku')->setData('used_for_sort_by', 1)->save();
+
+        $this->assertTrue($this->_processor->getIndexer()->isInvalid());
+    }
+
+    /**
+     * @magentoDbIsolation enabled
+     * @magentoAppIsolation enabled
+     * @magentoAppArea adminhtml
+     * @magentoDataFixture Magento/Catalog/_files/multiple_products.php
+     */
+    public function testDeleteAttribute()
+    {
+        /** @var $product \Magento\Catalog\Model\Product */
+        $product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create('Magento\Catalog\Model\Product');
+
+        /** @var \Magento\Catalog\Model\Resource\Product $productResource */
+        $productResource = $product->getResource();
+        $productResource->getAttribute('media_gallery')->delete();
+
+        $this->assertTrue($this->_processor->getIndexer()->isInvalid());
+    }
+
+    /**
+     * @magentoDbIsolation enabled
+     * @magentoAppIsolation enabled
+     * @magentoAppArea adminhtml
+     * @magentoDataFixture Magento/Core/_files/store.php
+     */
+    public function testAddNewStore()
+    {
+        $this->assertTrue($this->_processor->getIndexer()->isInvalid());
+    }
+
+    /**
+     * @magentoDbIsolation enabled
+     * @magentoAppIsolation enabled
+     * @magentoAppArea adminhtml
+     */
+    public function testAddNewStoreGroup()
+    {
+        /** @var \Magento\Core\Model\Store\Group $storeGroup */
+        $storeGroup = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create('Magento\Core\Model\Store\Group');
+        $storeGroup->setData(array(
+            'website_id' => 1,
+            'name' => 'New Store Group',
+            'root_category_id' => 2,
+            'group_id' => null,
+        ));
+        $storeGroup->save();
+        $this->assertTrue($this->_processor->getIndexer()->isInvalid());
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Layer/Filter/Price/_files/products_advanced.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Layer/Filter/Price/_files/products_advanced.php
index 3731ba0cef4..e4a2d4c96b1 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Layer/Filter/Price/_files/products_advanced.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Layer/Filter/Price/_files/products_advanced.php
@@ -81,7 +81,7 @@ foreach ($prices as $price) {
         ->setWeight(18)
         ->setCategoryIds(array(4))
         ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-        ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+        ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
         ->save();
     ++$lastProductId;
 }
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Layer/Filter/Price/_files/products_base.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Layer/Filter/Price/_files/products_base.php
index b24f63bb729..3a38030011d 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Layer/Filter/Price/_files/products_base.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Layer/Filter/Price/_files/products_base.php
@@ -84,7 +84,7 @@ foreach ($testCases as $index => $testCase) {
             ->setWeight(18)
             ->setCategoryIds(array($categoryId))
             ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-            ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+            ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
             ->save();
         ++$lastProductId;
     }
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Layer/Filter/_files/attribute_with_option.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Layer/Filter/_files/attribute_with_option.php
index d176c2cd762..94e7b604bbe 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Layer/Filter/_files/attribute_with_option.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Layer/Filter/_files/attribute_with_option.php
@@ -70,7 +70,7 @@ foreach ($options as $option) {
         ->setPrice(10)
         ->setCategoryIds(array(2))
         ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-        ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+        ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
         ->setStockData(
             array(
                 'use_config_manage_stock'   => 1,
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Attribute/Backend/SkuTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Attribute/Backend/SkuTest.php
index d1f4384bad2..e92ed7d2710 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Attribute/Backend/SkuTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Attribute/Backend/SkuTest.php
@@ -119,7 +119,7 @@ class SkuTest extends \PHPUnit_Framework_TestCase
             ->setPrice(10)
             ->setDescription('Description with <b>html tag</b>')
             ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-            ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+            ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
             ->setCategoryIds(array(2))
             ->setStockData(
                 array(
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/TypeTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/TypeTest.php
index d49ba62dbf1..1e652bf7a5c 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/TypeTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/TypeTest.php
@@ -64,9 +64,6 @@ class TypeTest extends \PHPUnit_Framework_TestCase
             array(null, 'Magento\Catalog\Model\Product\Type\Simple'),
             array(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE, 'Magento\Catalog\Model\Product\Type\Simple'),
             array(\Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL, 'Magento\Catalog\Model\Product\Type\Virtual'),
-            array(\Magento\Catalog\Model\Product\Type::TYPE_CONFIGURABLE,
-                'Magento\Catalog\Model\Product\Type\Configurable'
-            ),
             array(\Magento\Catalog\Model\Product\Type::TYPE_BUNDLE, 'Magento\Bundle\Model\Product\Type'),
             array(\Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE,
                 'Magento\Downloadable\Model\Product\Type'
@@ -99,7 +96,6 @@ class TypeTest extends \PHPUnit_Framework_TestCase
             array(null),
             array(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE),
             array(\Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL),
-            array(\Magento\Catalog\Model\Product\Type::TYPE_CONFIGURABLE),
             array(\Magento\Catalog\Model\Product\Type::TYPE_BUNDLE),
             array(\Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE)
         );
@@ -122,9 +118,6 @@ class TypeTest extends \PHPUnit_Framework_TestCase
             array(null, 'Magento\Catalog\Model\Product\Type\Price'),
             array(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE, 'Magento\Catalog\Model\Product\Type\Price'),
             array(\Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL, 'Magento\Catalog\Model\Product\Type\Price'),
-            array(\Magento\Catalog\Model\Product\Type::TYPE_CONFIGURABLE,
-                'Magento\Catalog\Model\Product\Type\Configurable\Price'
-            ),
             array(\Magento\Catalog\Model\Product\Type::TYPE_BUNDLE, 'Magento\Bundle\Model\Product\Price'),
             array(\Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE,
                 'Magento\Downloadable\Model\Product\Price'
@@ -137,7 +130,6 @@ class TypeTest extends \PHPUnit_Framework_TestCase
         $options = $this->_productType->getOptionArray();
         $this->assertArrayHasKey(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE, $options);
         $this->assertArrayHasKey(\Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL, $options);
-        $this->assertArrayHasKey(\Magento\Catalog\Model\Product\Type::TYPE_CONFIGURABLE, $options);
         $this->assertArrayHasKey(\Magento\Catalog\Model\Product\Type::TYPE_BUNDLE, $options);
         $this->assertArrayHasKey(\Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE, $options);
     }
@@ -177,7 +169,6 @@ class TypeTest extends \PHPUnit_Framework_TestCase
         return array(
             array(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE),
             array(\Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL),
-            array(\Magento\Catalog\Model\Product\Type::TYPE_CONFIGURABLE),
             array(\Magento\Catalog\Model\Product\Type::TYPE_BUNDLE),
             array(\Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE),
         );
@@ -188,7 +179,6 @@ class TypeTest extends \PHPUnit_Framework_TestCase
         $types = $this->_productType->getTypes();
         $this->assertArrayHasKey(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE, $types);
         $this->assertArrayHasKey(\Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL, $types);
-        $this->assertArrayHasKey(\Magento\Catalog\Model\Product\Type::TYPE_CONFIGURABLE, $types);
         $this->assertArrayHasKey(\Magento\Catalog\Model\Product\Type::TYPE_BUNDLE, $types);
         $this->assertArrayHasKey(\Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE, $types);
         foreach ($types as $type) {
@@ -203,7 +193,6 @@ class TypeTest extends \PHPUnit_Framework_TestCase
     {
         $types = $this->_productType->getCompositeTypes();
         $this->assertInternalType('array', $types);
-        $this->assertContains(\Magento\Catalog\Model\Product\Type::TYPE_CONFIGURABLE, $types);
         $this->assertContains(\Magento\Catalog\Model\Product\Type::TYPE_BUNDLE, $types);
     }
 
@@ -247,7 +236,6 @@ class TypeTest extends \PHPUnit_Framework_TestCase
         }
         $this->assertContains(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE, $types);
         $this->assertContains(\Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL, $types);
-        $this->assertContains(\Magento\Catalog\Model\Product\Type::TYPE_CONFIGURABLE, $types);
         $this->assertContains(\Magento\Catalog\Model\Product\Type::TYPE_BUNDLE, $types);
         $this->assertContains(\Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE, $types);
         return $types;
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductGettersTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductGettersTest.php
index dc6aa30cde0..f793b2655f7 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductGettersTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductGettersTest.php
@@ -78,9 +78,17 @@ class ProductGettersTest extends \PHPUnit_Framework_TestCase
 
     public function testGetStatus()
     {
-        $this->assertEquals(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED, $this->_model->getStatus());
-        $this->_model->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_DISABLED);
-        $this->assertEquals(\Magento\Catalog\Model\Product\Status::STATUS_DISABLED, $this->_model->getStatus());
+        $this->assertEquals(
+            \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED,
+            $this->_model->getStatus()
+        );
+
+        $this->_model->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_DISABLED);
+
+        $this->assertEquals(
+            \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_DISABLED,
+            $this->_model->getStatus()
+        );
     }
 
     public function testGetSetTypeInstance()
@@ -201,7 +209,7 @@ class ProductGettersTest extends \PHPUnit_Framework_TestCase
     public function testGetAttributeText()
     {
         $this->assertNull($this->_model->getAttributeText('status'));
-        $this->_model->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED);
+        $this->_model->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED);
         $this->assertEquals('Enabled', $this->_model->getAttributeText('status'));
     }
 
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductPriceTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductPriceTest.php
index 91c9931c7f4..5443f19ce35 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductPriceTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductPriceTest.php
@@ -59,11 +59,6 @@ class ProductPriceTest extends \PHPUnit_Framework_TestCase
         $default = $this->_model->getPriceModel();
         $this->assertInstanceOf('Magento\Catalog\Model\Product\Type\Price', $default);
         $this->assertSame($default, $this->_model->getPriceModel());
-
-        $this->_model->setTypeId('configurable');
-        $type = $this->_model->getPriceModel();
-        $this->assertInstanceOf('Magento\Catalog\Model\Product\Type\Configurable\Price', $type);
-        $this->assertSame($type, $this->_model->getPriceModel());
     }
 
     /**
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductTest.php
index 9b558ec9a13..1899417db28 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductTest.php
@@ -84,7 +84,7 @@ class ProductTest extends \PHPUnit_Framework_TestCase
             ->setName('Simple Product')->setSku(uniqid())->setPrice(10)
             ->setMetaTitle('meta title')->setMetaKeyword('meta keyword')->setMetaDescription('meta description')
             ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-            ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+            ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
         ;
         $crud = new \Magento\TestFramework\Entity($this->_model, array('sku' => uniqid()));
         $crud->testCrud();
@@ -155,7 +155,10 @@ class ProductTest extends \PHPUnit_Framework_TestCase
             $this->assertNotEmpty($duplicate->getId());
             $this->assertNotEquals($duplicate->getId(), $this->_model->getId());
             $this->assertNotEquals($duplicate->getSku(), $this->_model->getSku());
-            $this->assertEquals(\Magento\Catalog\Model\Product\Status::STATUS_DISABLED, $duplicate->getStatus());
+            $this->assertEquals(
+                \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_DISABLED,
+                $duplicate->getStatus()
+            );
             $this->assertEquals(\Magento\Core\Model\Store::DEFAULT_STORE_ID, $duplicate->getStoreId());
             $this->_undo($duplicate);
         } catch (\Exception $e) {
@@ -190,16 +193,6 @@ class ProductTest extends \PHPUnit_Framework_TestCase
         $duplicate->delete();
     }
 
-    /**
-     * @covers \Magento\Catalog\Model\Product::isConfigurable
-     */
-    public function testIsConfigurable()
-    {
-        $this->assertFalse($this->_model->isConfigurable());
-        $this->_model->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_CONFIGURABLE);
-        $this->assertTrue($this->_model->isConfigurable());
-    }
-
     /**
      * @covers \Magento\Catalog\Model\Product::getVisibleInCatalogStatuses
      * @covers \Magento\Catalog\Model\Product::getVisibleStatuses
@@ -210,16 +203,18 @@ class ProductTest extends \PHPUnit_Framework_TestCase
     public function testVisibilityApi()
     {
         $this->assertEquals(
-            array(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED), $this->_model->getVisibleInCatalogStatuses()
+            array(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED),
+            $this->_model->getVisibleInCatalogStatuses()
         );
         $this->assertEquals(
-            array(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED), $this->_model->getVisibleStatuses()
+            array(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED),
+            $this->_model->getVisibleStatuses()
         );
 
-        $this->_model->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_DISABLED);
+        $this->_model->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_DISABLED);
         $this->assertFalse($this->_model->isVisibleInCatalog());
 
-        $this->_model->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED);
+        $this->_model->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED);
         $this->assertTrue($this->_model->isVisibleInCatalog());
 
         $this->assertEquals(array(
@@ -307,18 +302,6 @@ class ProductTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals(array('sku' => 'sku', 'name' => 'name'), $this->_model->getData());
     }
 
-    public function testIsComposite()
-    {
-        $this->assertFalse($this->_model->isComposite());
-
-        /** @var $model \Magento\Catalog\Model\Product */
-        $model = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
-            'Magento\Catalog\Model\Product',
-            array('data' => array('type_id' => \Magento\Catalog\Model\Product\Type::TYPE_CONFIGURABLE))
-        );
-        $this->assertTrue($model->isComposite());
-    }
-
     /**
      * @param bool $isUserDefined
      * @param string $code
@@ -429,7 +412,7 @@ class ProductTest extends \PHPUnit_Framework_TestCase
             ->setSku(uniqid('', true) . uniqid('', true) . uniqid('', true))->setPrice(10)->setMetaTitle('meta title')
             ->setMetaKeyword('meta keyword')->setMetaDescription('meta description')
             ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-            ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+            ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
             ->setCollectExceptionMessages(true)
         ;
         $validationResult = $this->_model->validate();
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Resource/_files/url_rewrites.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Resource/_files/url_rewrites.php
index f7bc5e772ff..8f899548291 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Resource/_files/url_rewrites.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Resource/_files/url_rewrites.php
@@ -63,7 +63,7 @@ foreach ($urlKeys as $i => $urlKey) {
         ->setPrice(10)
         ->setCategoryIds(array(3))
         ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-        ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+        ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
         ->setUrlKey($urlKey)
         ->setUrlPath($urlKey . '.html')
         ->save();
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/categories.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/categories.php
index a3cd9e68c13..e3b91562e73 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/_files/categories.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/categories.php
@@ -167,7 +167,7 @@ $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
     ))
     ->setCategoryIds(array(2,3,4))
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->save();
 
 $product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
@@ -186,5 +186,5 @@ $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
     ))
     ->setCategoryIds(array(5))
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->save();
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/indexer_catalog_category.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/indexer_catalog_category.php
new file mode 100644
index 00000000000..59b26fa45c5
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/indexer_catalog_category.php
@@ -0,0 +1,138 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *   
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+/** @var $category \Magento\Catalog\Model\Category */
+$objectManager =\Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+
+$categoryFirst = $objectManager->create('Magento\Catalog\Model\Category');
+$categoryFirst->setName('Category 1')
+    ->setPath('1/2')
+    ->setLevel(2)
+    ->setAvailableSortBy('name')
+    ->setDefaultSortBy('name')
+    ->setIsActive(true)
+    ->setPosition(1)
+    ->save();
+
+$categorySecond = $objectManager->create('Magento\Catalog\Model\Category');
+$categorySecond->setName('Category 2')
+    ->setPath('1/2')
+    ->setLevel(2)
+    ->setAvailableSortBy('name')
+    ->setDefaultSortBy('name')
+    ->setIsActive(true)
+    ->setPosition(2)
+    ->save();
+
+$categoryThird = $objectManager->create('Magento\Catalog\Model\Category');
+$categoryThird->setName('Category 3')
+    ->setPath($categoryFirst->getPath())
+    ->setLevel(3)
+    ->setAvailableSortBy('name')
+    ->setDefaultSortBy('name')
+    ->setIsActive(true)
+    ->setPosition(2)
+    ->save();
+
+
+$categoryFourth = $objectManager->create('Magento\Catalog\Model\Category');
+$categoryFourth->setName('Category 4')
+    ->setPath($categoryThird->getPath())
+    ->setLevel(4)
+    ->setAvailableSortBy('name')
+    ->setDefaultSortBy('name')
+    ->setIsActive(true)
+    ->setPosition(1)
+    ->save();
+
+$categoryFifth = $objectManager->create('Magento\Catalog\Model\Category');
+$categoryFifth->setName('Category 5')
+    ->setPath($categorySecond->getPath())
+    ->setLevel(3)
+    ->setAvailableSortBy('name')
+    ->setDefaultSortBy('name')
+    ->setIsActive(true)
+    ->setPosition(2)
+    ->save();
+
+
+/** @var $productFirst \Magento\Catalog\Model\Product */
+$productFirst = $objectManager->create('Magento\Catalog\Model\Product');
+$productFirst->setTypeId('simple')
+    ->setAttributeSetId(4)
+    ->setWebsiteIds(array(1))
+    ->setName('Simple Product 01')
+    ->setSku('simple 01')
+    ->setPrice(10)
+    ->setMetaTitle('meta title')
+    ->setMetaKeyword('meta keyword')
+    ->setMetaDescription('meta description')
+
+    ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
+
+    ->setStockData(array(
+            'use_config_manage_stock' => 0,
+        ))
+    ->save();
+
+/** @var $productSecond \Magento\Catalog\Model\Product */
+$productSecond = $objectManager->create('Magento\Catalog\Model\Product');
+$productSecond->setTypeId('simple')
+    ->setAttributeSetId(4)
+    ->setWebsiteIds(array(1))
+    ->setName('Simple Product 02')
+    ->setSku('simple 02')
+    ->setPrice(10)
+    ->setMetaTitle('meta title')
+    ->setMetaKeyword('meta keyword')
+    ->setMetaDescription('meta description')
+
+    ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
+
+    ->setStockData(array(
+            'use_config_manage_stock' => 0,
+        ))
+    ->save();
+
+/** @var $productThird \Magento\Catalog\Model\Product */
+$productThird = $objectManager->create('Magento\Catalog\Model\Product');
+$productThird->setTypeId('simple')
+    ->setAttributeSetId(4)
+    ->setWebsiteIds(array(1))
+    ->setName('Simple Product 03')
+    ->setSku('simple 02')
+    ->setPrice(10)
+    ->setMetaTitle('meta title')
+    ->setMetaKeyword('meta keyword')
+    ->setMetaDescription('meta description')
+
+    ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
+
+    ->setStockData(array(
+            'use_config_manage_stock' => 0,
+        ))
+    ->save();
\ No newline at end of file
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/multiple_products.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/multiple_products.php
index dfe96e6449c..aabf431d931 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/_files/multiple_products.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/multiple_products.php
@@ -49,7 +49,7 @@ $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
     ->setMetaDescription('meta description')
 
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->setWebsiteIds(array(1))
     ->setCateroryIds(array())
     ->setStockData(
@@ -88,7 +88,7 @@ $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
     ->setMetaKeyword('meta keyword')
     ->setMetaDescription('meta description')
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_IN_CATALOG)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->setWebsiteIds(array(1))
     ->setCateroryIds(array())
     ->setStockData(
@@ -119,7 +119,7 @@ $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
     ->setPrice(30)
     ->setWeight(1)
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_IN_CATALOG)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_DISABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_DISABLED)
     ->setWebsiteIds(array(1))
     ->setCateroryIds(array())
     ->setStockData(
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_associated.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_associated.php
index 5163de31fa7..4efb6cc1b73 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_associated.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_associated.php
@@ -43,7 +43,7 @@ $product->setTypeId('simple')
     ->setMetaDescription('meta description')
 
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
 
     ->setStockData(array(
         'use_config_manage_stock' => 0,
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple.php
index 503ccc2142d..48fe2f85f5f 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple.php
@@ -62,7 +62,7 @@ $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
     ->setMetaDescription('meta description')
 
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
 
     ->setCategoryIds(array(2))
 
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple_duplicated.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple_duplicated.php
index 675e9cfc8cd..9fcebbdc13b 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple_duplicated.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple_duplicated.php
@@ -37,7 +37,7 @@ $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
     ->setPrice(10)
     ->setDescription('Description with <b>html tag</b>')
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->setCategoryIds(array(2))
     ->setStockData(
         array(
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple_xss.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple_xss.php
index fa5dff01c96..f98aa11a99c 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple_xss.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_simple_xss.php
@@ -36,7 +36,7 @@ $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
     ->setPrice(10)
     ->setDescription('Description with <b>html tag</b>')
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->setCategoryIds(array(2))
     ->setStockData(array(
         'use_config_manage_stock'   => 1,
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_special_price.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_special_price.php
index 570e8ff097b..6d2aef2ec4c 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_special_price.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_special_price.php
@@ -41,7 +41,7 @@ $product->setTypeId('simple')
     ->setMetaDescription('meta description')
 
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
 
     ->setStockData(array(
         'use_config_manage_stock' => 0,
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_virtual.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_virtual.php
index a43a5f84217..5e6186c4600 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_virtual.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_virtual.php
@@ -37,5 +37,5 @@ $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL)
     ->setPrice(10)
     ->setTaxClassId(0)
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->save();
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_with_image.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_with_image.php
index c98a66969ba..31008513dfd 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_with_image.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_with_image.php
@@ -42,5 +42,5 @@ $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
     ->setSmallImage('/m/a/magento_image.jpg')
     ->setThumbnail('/m/a/magento_image.jpg')
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->save();
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_with_options.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_with_options.php
index b4018a5cfad..85448e6be17 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_with_options.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/product_with_options.php
@@ -41,7 +41,7 @@ $product->setTypeId('simple')
     ->setMetaDescription('meta description')
 
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
 
     ->setCanSaveCustomOptions(true)
     ->setProductOptions(array(array('title' => 'test_option_code_1', 'type' => 'field', 'is_require' => true)))
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/products.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/products.php
index 600842812b7..2726bad1608 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/_files/products.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/products.php
@@ -41,7 +41,7 @@ $product->setTypeId('simple')
     ->setMetaDescription('meta description')
 
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
 
     ->setStockData(array(
         'use_config_manage_stock' => 0,
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/products_crosssell.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/products_crosssell.php
index ed7385968ed..6a6cb8400b5 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/_files/products_crosssell.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/products_crosssell.php
@@ -35,7 +35,7 @@ $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
     ->setSku('simple')
     ->setPrice(10)
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->setWebsiteIds(array(1))
     ->setStockData(array('qty' => 100, 'is_in_stock' => 1))
     ->save();
@@ -49,7 +49,7 @@ $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
     ->setSku('simple_with_cross')
     ->setPrice(10)
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->setWebsiteIds(array(1))
     ->setStockData(array('qty' => 100, 'is_in_stock' => 1))
     ->setCrossSellLinkData(array(1 => array('position' => 1)))
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/products_new.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/products_new.php
index 8cff626296e..0beaa5bb8b3 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/_files/products_new.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/products_new.php
@@ -35,7 +35,7 @@ $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
     ->setSku('simple')
     ->setPrice(10)
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->setWebsiteIds(array(1))
     ->setStockData(array('qty' => 100, 'is_in_stock' => 1))
     ->setNewsFromDate(date('Y-m-d', strtotime('-2 day')))
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/products_related.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/products_related.php
index 8a2b672380c..c4dc621eb71 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/_files/products_related.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/products_related.php
@@ -35,7 +35,7 @@ $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
     ->setSku('simple')
     ->setPrice(10)
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->setWebsiteIds(array(1))
     ->setStockData(array('qty' => 100, 'is_in_stock' => 1))
     ->save();
@@ -49,7 +49,7 @@ $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
     ->setSku('simple_with_cross')
     ->setPrice(10)
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->setWebsiteIds(array(1))
     ->setStockData(array('qty' => 100, 'is_in_stock' => 1))
     ->setRelatedLinkData(array(1 => array('position' => 1)))
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/row_fixture.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/row_fixture.php
new file mode 100644
index 00000000000..82df83d4948
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/row_fixture.php
@@ -0,0 +1,85 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @subpackage  integration_tests
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+$installer = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+    ->create('Magento\Catalog\Model\Resource\Setup', array('resourceName' => 'catalog_setup'));
+/**
+ * After installation system has two categories: root one with ID:1 and Default category with ID:2
+ */
+/** @var $category \Magento\Catalog\Model\Category */
+$category = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+    ->create('Magento\Catalog\Model\Category');
+$category->setId(9)
+    ->setName('Category 9')
+    ->setParentId(2)
+    ->setPath('1/2/3')
+    ->setLevel(2)
+    ->setAvailableSortBy('name')
+    ->setDefaultSortBy('name')
+    ->setIsActive(true)
+    ->setPosition(1)
+    ->save();
+
+
+/** @var $product \Magento\Catalog\Model\Product */
+$product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+    ->create('Magento\Catalog\Model\Product');
+$product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
+    ->setId(1)
+    ->setAttributeSetId($installer->getAttributeSetId('catalog_product', 'Default'))
+    ->setStoreId(1)
+    ->setWebsiteIds(array(1))
+    ->setName('Simple Product One')
+    ->setSku('simple')
+    ->setPrice(10)
+    ->setWeight(18)
+    ->setStockData(array(
+        'use_config_manage_stock' => 0,
+    ))
+    ->setCategoryIds(array(9))
+    ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
+    ->save();
+
+$product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+    ->create('Magento\Catalog\Model\Product');
+$product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
+    ->setId(2)
+    ->setAttributeSetId($installer->getAttributeSetId('catalog_product', 'Default'))
+    ->setStoreId(1)
+    ->setWebsiteIds(array(1))
+    ->setName('Simple Product Two')
+    ->setSku('12345')
+    ->setPrice(45.67)
+    ->setWeight(56)
+    ->setStockData(array(
+        'use_config_manage_stock' => 0,
+    ))
+    ->setCategoryIds(array(9))
+    ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
+    ->save();
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/row_fixture_rollback.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/row_fixture_rollback.php
new file mode 100644
index 00000000000..0d9aadae6ea
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/row_fixture_rollback.php
@@ -0,0 +1,48 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @subpackage  integration_tests
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+\Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\Core\Model\App')
+    ->loadAreaPart(
+        \Magento\Backend\App\Area\FrontNameResolver::AREA_CODE,
+        \Magento\Core\Model\App\Area::PART_CONFIG
+    );
+\Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\App\State')
+    ->setAreaCode(\Magento\Backend\App\Area\FrontNameResolver::AREA_CODE);
+
+/** @var $category \Magento\Catalog\Model\Category */
+$category = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+    ->create('Magento\Catalog\Model\Category');
+$category->load(9);
+$category->delete();
+
+/** @var $product \Magento\Catalog\Model\Product */
+$product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+    ->create('Magento\Catalog\Model\Product');
+$product->load(1);
+$product->delete();
+
+$product->load(2);
+$product->delete();
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/url_rewrites.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/url_rewrites.php
index 0681c5b1072..ba8e261c0d8 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/_files/url_rewrites.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/url_rewrites.php
@@ -51,7 +51,7 @@ $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
     ->setPrice(10)
     ->setCategoryIds(array(3))
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->save();
 
 $category = $objectManager->create('Magento\Catalog\Model\Category');
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/controllers/_files/attribute_system_with_applyto_data.php b/dev/tests/integration/testsuite/Magento/Catalog/controllers/_files/attribute_system_with_applyto_data.php
index 1e5efc47adf..c3f8ea88e61 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/controllers/_files/attribute_system_with_applyto_data.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/controllers/_files/attribute_system_with_applyto_data.php
@@ -31,5 +31,5 @@ $model->setName('system_attribute')
     ->setId(3)
     ->setEntityTypeId(4)
     ->setIsUserDefined(0)
-    ->setApplyTo(array('simple', 'configurable'));
+    ->setApplyTo(array('simple'));
 $model->save();
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/controllers/_files/products.php b/dev/tests/integration/testsuite/Magento/Catalog/controllers/_files/products.php
index d13f3f74d54..5f9a7d125c6 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/controllers/_files/products.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/controllers/_files/products.php
@@ -63,7 +63,7 @@ $productOne->setId(1)
     ->setMetaDescription('Simple Product 1 Meta Description')
 
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
 
     ->addImageToMediaGallery($baseTmpMediaPath . '/product_image.png', null, false, false)
 
@@ -91,6 +91,6 @@ $productTwo->setId(2)
     ))
 
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
 
     ->save();
diff --git a/dev/tests/integration/testsuite/Magento/CatalogInventory/Model/Stock/ItemTest.php b/dev/tests/integration/testsuite/Magento/CatalogInventory/Model/Stock/ItemTest.php
index 819cdbffe12..65569168856 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogInventory/Model/Stock/ItemTest.php
+++ b/dev/tests/integration/testsuite/Magento/CatalogInventory/Model/Stock/ItemTest.php
@@ -55,7 +55,7 @@ class ItemTest extends \PHPUnit_Framework_TestCase
             ->setSku('simple')
             ->setPrice(10)
             ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-            ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+            ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
             ->save();
     }
 
diff --git a/dev/tests/integration/testsuite/Magento/Checkout/Controller/CartTest.php b/dev/tests/integration/testsuite/Magento/Checkout/Controller/CartTest.php
index 8c7169e22ee..a8a96fa72a1 100644
--- a/dev/tests/integration/testsuite/Magento/Checkout/Controller/CartTest.php
+++ b/dev/tests/integration/testsuite/Magento/Checkout/Controller/CartTest.php
@@ -162,42 +162,6 @@ class CartTest extends \Magento\TestFramework\TestCase\AbstractController
         );
     }
 
-    /**
-     * Test for \Magento\Checkout\Controller\Cart::configureAction() with configurable product
-     *
-     * @magentoDataFixture Magento/Checkout/_files/quote_with_configurable_product.php
-     */
-    public function testConfigureActionWithConfigurableProduct()
-    {
-        /** @var $session \Magento\Checkout\Model\Session  */
-        $session = $this->_objectManager->create('Magento\Checkout\Model\Session');
-
-        $quoteItem = $this->_getQuoteItemIdByProductId($session->getQuote(), 1);
-        $this->assertNotNull($quoteItem, 'Cannot get quote item for configurable product');
-
-        $this->dispatch('checkout/cart/configure/id/' . $quoteItem->getId());
-        $response = $this->getResponse();
-
-        $this->assertSessionMessages(
-            $this->isEmpty(),
-            \Magento\Message\MessageInterface::TYPE_ERROR
-        );
-
-        $this->assertSelectCount(
-            'button[type="button"][title="Update Cart"]',
-            1,
-            $response->getBody(),
-            'Response for configurable product doesn\'t contain "Update Cart" button'
-        );
-
-        $this->assertSelectCount(
-            'select.super-attribute-select',
-            1,
-            $response->getBody(),
-            'Response for configurable product doesn\'t contain select for super attribute'
-        );
-    }
-
     /**
      * Gets \Magento\Sales\Model\Quote\Item from \Magento\Sales\Model\Quote by product id
      *
diff --git a/dev/tests/integration/testsuite/Magento/Checkout/_files/product_bundle.php b/dev/tests/integration/testsuite/Magento/Checkout/_files/product_bundle.php
index 0e63ed354e6..9fb0ea36971 100644
--- a/dev/tests/integration/testsuite/Magento/Checkout/_files/product_bundle.php
+++ b/dev/tests/integration/testsuite/Magento/Checkout/_files/product_bundle.php
@@ -39,7 +39,7 @@ $bundleProduct->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_BUNDLE)
     ->setDescription('Description with <b>html tag</b>')
     ->setShortDescription('Bundle')
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->setStockData(array(
     'use_config_manage_stock'   => 0,
     'manage_stock'              => 0,
diff --git a/dev/tests/integration/testsuite/Magento/Checkout/_files/simple_product.php b/dev/tests/integration/testsuite/Magento/Checkout/_files/simple_product.php
index d1784b3c7fb..99830ef8187 100644
--- a/dev/tests/integration/testsuite/Magento/Checkout/_files/simple_product.php
+++ b/dev/tests/integration/testsuite/Magento/Checkout/_files/simple_product.php
@@ -42,7 +42,7 @@ $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
     ->setMetaDescription('meta description')
 
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
 
     ->setCategoryIds(array(2))
 
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Config/MatrixTest.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/MatrixTest.php
similarity index 89%
rename from dev/tests/integration/testsuite/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Config/MatrixTest.php
rename to dev/tests/integration/testsuite/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/MatrixTest.php
index 2ffa59bfb8f..d41f433468a 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Config/MatrixTest.php
+++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/MatrixTest.php
@@ -18,14 +18,11 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Catalog
- * @subpackage  integration_tests
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
-namespace Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config;
+namespace Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config;
 
 /**
  * @magentoAppArea adminhtml
@@ -34,7 +31,7 @@ class MatrixTest extends \PHPUnit_Framework_TestCase
 {
     /**
      * @magentoAppIsolation enabled
-     * @magentoDataFixture Magento/Catalog/_files/product_configurable.php
+     * @magentoDataFixture Magento/ConfigurableProduct/_files/product_configurable.php
      */
     public function testGetVariations()
     {
@@ -53,7 +50,7 @@ class MatrixTest extends \PHPUnit_Framework_TestCase
                 'test_configurable'
             );
         $attributeOptions = $usedAttribute->getSource()->getAllOptions(false);
-        /** @var $block \Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config_Matrix */
+        /** @var $block \Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config\Matrix */
         $block = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\View\LayoutInterface')
             ->createBlock(preg_replace('/Test$/', '', __CLASS__));
 
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/ConfigTest.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/ConfigTest.php
similarity index 82%
rename from dev/tests/integration/testsuite/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/ConfigTest.php
rename to dev/tests/integration/testsuite/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/ConfigTest.php
index 3bc52797287..cd2ebf904e7 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/ConfigTest.php
+++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/ConfigTest.php
@@ -18,14 +18,11 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Catalog
- * @subpackage  integration_tests
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
-namespace Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super;
+namespace Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super;
 
 /**
  * @magentoAppArea adminhtml
@@ -41,15 +38,15 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
         $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
         $objectManager->get('Magento\Core\Model\Registry')
             ->register('current_product', $objectManager->create('Magento\Catalog\Model\Product'));
-        /** @var $block \Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config */
+        /** @var $block \Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config */
         $block = $objectManager->get('Magento\View\LayoutInterface')
-            ->createBlock('Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config');
+            ->createBlock('Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config');
         $this->assertEquals(array(), $block->getSelectedAttributes());
     }
 
     /**
      * @magentoAppIsolation enabled
-     * @magentoDataFixture Magento/Catalog/_files/product_configurable.php
+     * @magentoDataFixture Magento/ConfigurableProduct/_files/product_configurable.php
      */
     public function testGetSelectedAttributesForConfigurableProductType()
     {
@@ -63,9 +60,9 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
                 ->getEntityType('catalog_product')->getId(),
             'test_configurable'
         );
-        /** @var $block \Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config */
+        /** @var $block \Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config */
         $block = $objectManager->get('Magento\View\LayoutInterface')
-            ->createBlock('Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config');
+            ->createBlock('Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config');
         $selectedAttributes = $block->getSelectedAttributes();
         $this->assertEquals(array($usedAttribute->getId()), array_keys($selectedAttributes));
         $selectedAttribute = reset($selectedAttributes);
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/SettingsTest.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/SettingsTest.php
similarity index 89%
rename from dev/tests/integration/testsuite/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/SettingsTest.php
rename to dev/tests/integration/testsuite/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/SettingsTest.php
index 10867c62581..55ebff998eb 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/SettingsTest.php
+++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/SettingsTest.php
@@ -18,13 +18,10 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Catalog
- * @subpackage  integration_tests
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-namespace Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super;
+namespace Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super;
 
 class SettingsTest extends \PHPUnit_Framework_TestCase
 {
@@ -58,9 +55,9 @@ class SettingsTest extends \PHPUnit_Framework_TestCase
         $context = $objectManager->create('Magento\Backend\Block\Template\Context', array('urlBuilder' => $urlModel));
         /** @var $layout \Magento\Core\Model\Layout */
         $layout = $objectManager->get('Magento\View\LayoutInterface');
-        /** @var $block \Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Settings */
+        /** @var $block \Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Settings */
         $block = $layout->createBlock(
-            'Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Settings',
+            'Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Settings',
             'block',
             array(
                'context' => $context
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Block/Product/Configurable/AssociatedSelector/Backend/Grid/ColumnSetTest.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Block/Product/Configurable/AssociatedSelector/Backend/Grid/ColumnSetTest.php
similarity index 81%
rename from dev/tests/integration/testsuite/Magento/Catalog/Block/Product/Configurable/AssociatedSelector/Backend/Grid/ColumnSetTest.php
rename to dev/tests/integration/testsuite/Magento/ConfigurableProduct/Block/Product/Configurable/AssociatedSelector/Backend/Grid/ColumnSetTest.php
index 6eb7c35f94c..38665751654 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Block/Product/Configurable/AssociatedSelector/Backend/Grid/ColumnSetTest.php
+++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Block/Product/Configurable/AssociatedSelector/Backend/Grid/ColumnSetTest.php
@@ -18,14 +18,11 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Catalog
- * @subpackage  integration_tests
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
-namespace Magento\Catalog\Block\Product\Configurable\AssociatedSelector\Backend\Grid;
+namespace Magento\ConfigurableProduct\Block\Product\Configurable\AssociatedSelector\Backend\Grid;
 
 class ColumnSetTest
     extends \PHPUnit_Framework_TestCase
@@ -36,7 +33,7 @@ class ColumnSetTest
      *
      * @magentoAppArea adminhtml
      * @magentoAppIsolation enabled
-     * @magentoDataFixture Magento/Catalog/_files/product_configurable.php
+     * @magentoDataFixture Magento/ConfigurableProduct/_files/product_configurable.php
      */
     public function testPrepareSelect()
     {
@@ -49,9 +46,9 @@ class ColumnSetTest
 
         /** @var $layout \Magento\Core\Model\Layout */
         $layout = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\View\LayoutInterface');
-        /** @var $block  \Magento\Catalog\Block\Product\Configurable\AssociatedSelector\Backend\Grid\ColumnSet */
+        /** @var $block ColumnSet */
         $block = $layout->createBlock(
-            'Magento\Catalog\Block\Product\Configurable\AssociatedSelector\Backend\Grid\ColumnSet',
+            'Magento\ConfigurableProduct\Block\Product\Configurable\AssociatedSelector\Backend\Grid\ColumnSet',
             'block'
         );
         $assertBlock = $block->getLayout()->getBlock('block.test_configurable');
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Block/Product/View/Type/ConfigurableTest.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Block/Product/View/Type/ConfigurableTest.php
similarity index 83%
rename from dev/tests/integration/testsuite/Magento/Catalog/Block/Product/View/Type/ConfigurableTest.php
rename to dev/tests/integration/testsuite/Magento/ConfigurableProduct/Block/Product/View/Type/ConfigurableTest.php
index 70ed2b9762b..38d298ea785 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Block/Product/View/Type/ConfigurableTest.php
+++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Block/Product/View/Type/ConfigurableTest.php
@@ -18,24 +18,21 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Catalog
- * @subpackage  integration_tests
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
-namespace Magento\Catalog\Block\Product\View\Type;
+namespace Magento\ConfigurableProduct\Block\Product\View\Type;
 
 /**
- * Test class for \Magento\Catalog\Block\Product\View\Type\Configurable.
+ * Test class for \Magento\ConfigurableProduct\Block\Product\View\Type\Configurable.
  *
- * @magentoDataFixture Magento/Catalog/_files/product_configurable.php
+ * @magentoDataFixture Magento/ConfigurableProduct/_files/product_configurable.php
  */
 class ConfigurableTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \Magento\Catalog\Block\Product\View\Type\Configurable
+     * @var \Magento\ConfigurableProduct\Block\Product\View\Type\Configurable
      */
     protected $_block;
 
@@ -50,7 +47,7 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase
             ->create('Magento\Catalog\Model\Product');
         $this->_product->load(1);
         $this->_block = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\View\LayoutInterface')
-            ->createBlock('Magento\Catalog\Block\Product\View\Type\Configurable');
+            ->createBlock('Magento\ConfigurableProduct\Block\Product\View\Type\Configurable');
         $this->_block->setProduct($this->_product);
     }
 
@@ -58,7 +55,7 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase
     {
         $attributes = $this->_block->getAllowAttributes();
         $this->assertInstanceOf(
-            'Magento\Catalog\Model\Resource\Product\Type\Configurable\Attribute\Collection',
+            'Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute\Collection',
             $attributes
         );
         $this->assertGreaterThanOrEqual(1, $attributes->getSize());
diff --git a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Controller/Adminhtml/ProductTest.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Controller/Adminhtml/ProductTest.php
new file mode 100644
index 00000000000..8586353adb9
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Controller/Adminhtml/ProductTest.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ConfigurableProduct\Controller\Adminhtml;
+
+/**
+ * @magentoAppArea adminhtml
+ */
+class ProductTest extends \Magento\Backend\Utility\Controller
+{
+    /**
+     * @magentoDataFixture Magento/ConfigurableProduct/_files/product_configurable.php
+     */
+    public function testSaveActionAssociatedProductIds()
+    {
+        $associatedProductIds = array(3, 14, 15, 92);
+        $this->getRequest()->setPost(array(
+            'attributes' => array($this->_getConfigurableAttribute()->getId()),
+            'associated_product_ids' => $associatedProductIds,
+        ));
+
+        $this->dispatch('backend/catalog/product/save');
+
+        /** @var $objectManager \Magento\TestFramework\ObjectManager */
+        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+
+        /** @var $product \Magento\Catalog\Model\Product */
+        $product = $objectManager->get('Magento\Core\Model\Registry')->registry('current_product');
+        $this->assertEquals($associatedProductIds, $product->getAssociatedProductIds());
+
+        /** @see \Magento\Backend\Utility\Controller::assertPostConditions() */
+        $this->markTestIncomplete('Suppressing admin error messages validation until the bug MAGETWO-7044 is fixed.');
+    }
+
+    /**
+     * Retrieve configurable attribute instance
+     *
+     * @return \Magento\Catalog\Model\Entity\Attribute
+     */
+    protected function _getConfigurableAttribute()
+    {
+        return \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create('Magento\Catalog\Model\Entity\Attribute')->loadByCode(
+                \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\Eav\Model\Config')
+                    ->getEntityType('catalog_product')->getId(),
+                'test_configurable'
+            );
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Controller/CartTest.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Controller/CartTest.php
new file mode 100644
index 00000000000..5c2762b2bfd
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Controller/CartTest.php
@@ -0,0 +1,86 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+/**
+ * Test class for \Magento\Checkout\Controller\Cart
+ */
+namespace Magento\ConfigurableProduct\Controller;
+
+class CartTest extends \Magento\TestFramework\TestCase\AbstractController
+{
+    /**
+     * Test for \Magento\Checkout\Controller\Cart::configureAction() with configurable product
+     *
+     * @magentoDataFixture Magento/ConfigurableProduct/_files/quote_with_configurable_product.php
+     */
+    public function testConfigureActionWithConfigurableProduct()
+    {
+        /** @var $session \Magento\Checkout\Model\Session  */
+        $session = $this->_objectManager->create('Magento\Checkout\Model\Session');
+
+        $quoteItem = $this->_getQuoteItemIdByProductId($session->getQuote(), 1);
+        $this->assertNotNull($quoteItem, 'Cannot get quote item for configurable product');
+
+        $this->dispatch('checkout/cart/configure/id/' . $quoteItem->getId());
+        $response = $this->getResponse();
+
+        $this->assertSessionMessages(
+            $this->isEmpty(),
+            \Magento\Message\MessageInterface::TYPE_ERROR
+        );
+
+        $this->assertSelectCount(
+            'button[type="button"][title="Update Cart"]',
+            1,
+            $response->getBody(),
+            'Response for configurable product doesn\'t contain "Update Cart" button'
+        );
+
+        $this->assertSelectCount(
+            'select.super-attribute-select',
+            1,
+            $response->getBody(),
+            'Response for configurable product doesn\'t contain select for super attribute'
+        );
+    }
+
+    /**
+     * Gets \Magento\Sales\Model\Quote\Item from \Magento\Sales\Model\Quote by product id
+     *
+     * @param \Magento\Sales\Model\Quote $quote
+     * @param mixed $productId
+     * @return \Magento\Sales\Model\Quote\Item|null
+     */
+    private function _getQuoteItemIdByProductId(\Magento\Sales\Model\Quote $quote, $productId)
+    {
+        /** @var $quoteItems \Magento\Sales\Model\Quote\Item[] */
+        $quoteItems = $quote->getAllItems();
+        foreach ($quoteItems as $quoteItem) {
+            if ($productId == $quoteItem->getProductId()) {
+                return $quoteItem;
+            }
+        }
+        return null;
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Type/Configurable/AttributeTest.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Product/Type/Configurable/AttributeTest.php
similarity index 85%
rename from dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Type/Configurable/AttributeTest.php
rename to dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Product/Type/Configurable/AttributeTest.php
index 234a8df3634..dd94e0c5497 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Type/Configurable/AttributeTest.php
+++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Product/Type/Configurable/AttributeTest.php
@@ -18,26 +18,23 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Catalog
- * @subpackage  integration_tests
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
-namespace Magento\Catalog\Model\Product\Type\Configurable;
+namespace Magento\ConfigurableProduct\Model\Product\Type\Configurable;
 
 class AttributeTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \Magento\Catalog\Model\Product\Type\Configurable\Attribute
+     * @var \Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute
      */
     protected $_model;
 
     protected function setUp()
     {
         $this->_model = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
-            ->create('Magento\Catalog\Model\Product\Type\Configurable\Attribute');
+            ->create('Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute');
     }
 
     public function testAddPrice()
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Type/Configurable/PriceTest.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Product/Type/Configurable/PriceTest.php
similarity index 83%
rename from dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Type/Configurable/PriceTest.php
rename to dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Product/Type/Configurable/PriceTest.php
index 39721215edf..2208644f749 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Type/Configurable/PriceTest.php
+++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Product/Type/Configurable/PriceTest.php
@@ -18,19 +18,16 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Catalog
- * @subpackage  integration_tests
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
-namespace Magento\Catalog\Model\Product\Type\Configurable;
+namespace Magento\ConfigurableProduct\Model\Product\Type\Configurable;
 
 class PriceTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @magentoDataFixture Magento/Catalog/_files/product_configurable.php
+     * @magentoDataFixture Magento/ConfigurableProduct/_files/product_configurable.php
      */
     public function testGetFinalPrice()
     {
@@ -39,9 +36,9 @@ class PriceTest extends \PHPUnit_Framework_TestCase
             ->create('Magento\Catalog\Model\Product');
         $product->load(1); // fixture
 
-        /** @var $model \Magento\Catalog\Model\Product\Type\Configurable\Price */
+        /** @var $model \Magento\ConfigurableProduct\Model\Product\Type\Configurable\Price */
         $model = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
-            ->create('Magento\Catalog\Model\Product\Type\Configurable\Price');
+            ->create('Magento\ConfigurableProduct\Model\Product\Type\Configurable\Price');
 
         // without configurable options
         $this->assertEquals(100.0, $model->getFinalPrice(1, $product));
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Type/ConfigurableTest.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Product/Type/ConfigurableTest.php
similarity index 95%
rename from dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Type/ConfigurableTest.php
rename to dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Product/Type/ConfigurableTest.php
index 6b110d077e2..752d93d4758 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Type/ConfigurableTest.php
+++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Product/Type/ConfigurableTest.php
@@ -18,24 +18,21 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Catalog
- * @subpackage  integration_tests
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
-namespace Magento\Catalog\Model\Product\Type;
+namespace Magento\ConfigurableProduct\Model\Product\Type;
 
 /**
- * @magentoDataFixture Magento/Catalog/_files/product_configurable.php
+ * @magentoDataFixture Magento/ConfigurableProduct/_files/product_configurable.php
  */
 class ConfigurableTest extends \PHPUnit_Framework_TestCase
 {
     /**
      * Object under test
      *
-     * @var \Magento\Catalog\Model\Product\Type\Configurable
+     * @var \Magento\ConfigurableProduct\Model\Product\Type\Configurable
      */
     protected $_model;
 
@@ -51,7 +48,7 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase
         $this->_product->load(1); // fixture
 
         $this->_model = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
-            ->create('Magento\Catalog\Model\Product\Type\Configurable');
+            ->create('Magento\ConfigurableProduct\Model\Product\Type\Configurable');
         // prevent fatal errors by assigning proper "singleton" of type instance to the product
         $this->_product->setTypeInstance($this->_model);
     }
@@ -97,8 +94,11 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase
         $this->_model->setUsedProductAttributeIds(array($testConfigurable->getId()), $this->_product);
         $attributes = $this->_product->getData('_cache_instance_configurable_attributes');
         $this->assertArrayHasKey(0, $attributes);
-        $this->assertInstanceOf('Magento\Catalog\Model\Product\Type\Configurable\Attribute', $attributes[0]);
-        $this->assertSame($testConfigurable, $attributes[0]->getProductAttribute());
+        $this->assertInstanceOf(
+            'Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute',
+            $attributes[0]);
+        $this->assertSame($testConfigurable, $attributes[0]->getProductAttribute()
+        );
     }
 
     public function testGetUsedProductAttributes()
@@ -113,12 +113,16 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase
     public function testGetConfigurableAttributes()
     {
         $collection = $this->_model->getConfigurableAttributes($this->_product);
-        $this->assertInstanceOf('Magento\Catalog\Model\Resource\Product\Type\Configurable\Attribute\Collection',
+        $this->assertInstanceOf(
+            'Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute\Collection',
             $collection
         );
         $testConfigurable = $this->_getAttributeByCode('test_configurable');
         foreach ($collection as $attribute) {
-            $this->assertInstanceOf('Magento\Catalog\Model\Product\Type\Configurable\Attribute', $attribute);
+            $this->assertInstanceOf(
+                'Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute',
+                $attribute
+            );
             $this->assertEquals($testConfigurable->getId(), $attribute->getAttributeId());
             $prices = $attribute->getPrices();
             $this->assertCount(2, $prices); // fixture
@@ -176,7 +180,8 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase
     public function testGetConfigurableAttributeCollection()
     {
         $collection = $this->_model->getConfigurableAttributeCollection($this->_product);
-        $this->assertInstanceOf('Magento\Catalog\Model\Resource\Product\Type\Configurable\Attribute\Collection',
+        $this->assertInstanceOf(
+            'Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute\Collection',
             $collection
         );
     }
@@ -200,7 +205,8 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase
 
     public function testGetUsedProductCollection()
     {
-        $this->assertInstanceOf('Magento\Catalog\Model\Resource\Product\Type\Configurable\Product\Collection',
+        $this->assertInstanceOf(
+            'Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Product\Collection',
             $this->_model->getUsedProductCollection($this->_product)
         );
     }
@@ -278,7 +284,7 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase
             'attributes',
             serialize(array($attribute['attribute_id'] => $optionValueId))
         );
-        /** @var \Magento\Catalog\Model\Resource\Product\Type\Configurable\Attribute\Collection $configurableAttr */
+
         $configurableAttr = $this->_model->getConfigurableAttributes($this->_product);
         $attribute = $configurableAttr->getFirstItem();
 
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Resource/Product/Collection/AssociatedProductTest.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Resource/Product/Collection/AssociatedProductTest.php
similarity index 89%
rename from dev/tests/integration/testsuite/Magento/Catalog/Model/Resource/Product/Collection/AssociatedProductTest.php
rename to dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Resource/Product/Collection/AssociatedProductTest.php
index e23817d6b0d..be4fb0d5f43 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Resource/Product/Collection/AssociatedProductTest.php
+++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Resource/Product/Collection/AssociatedProductTest.php
@@ -18,14 +18,11 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Catalog
- * @subpackage  integration_tests
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
-namespace Magento\Catalog\Model\Resource\Product\Collection;
+namespace Magento\ConfigurableProduct\Model\Resource\Product\Collection;
 
 class AssociatedProductTest extends \PHPUnit_Framework_TestCase
 {
@@ -43,7 +40,7 @@ class AssociatedProductTest extends \PHPUnit_Framework_TestCase
         $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
         $objectManager->get('Magento\Core\Model\Registry')->register('current_product', $product);
         $collection = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
-            ->create('Magento\Catalog\Model\Resource\Product\Collection\AssociatedProduct');
+            ->create('Magento\ConfigurableProduct\Model\Resource\Product\Collection\AssociatedProduct');
         $collectionProduct = $collection->getFirstItem();
         $this->assertEquals($product->getName(), $collectionProduct->getName());
         $this->assertEquals($product->getSku(), $collectionProduct->getSku());
@@ -66,7 +63,7 @@ class AssociatedProductTest extends \PHPUnit_Framework_TestCase
         $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
         $objectManager->get('Magento\Core\Model\Registry')->register('current_product', $product);
         $collection = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
-            ->create('Magento\Catalog\Model\Resource\Product\Collection\AssociatedProduct');
+            ->create('Magento\ConfigurableProduct\Model\Resource\Product\Collection\AssociatedProduct');
         $this->assertEmpty($collection->count());
     }
 }
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_configurable.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/_files/product_configurable.php
similarity index 94%
rename from dev/tests/integration/testsuite/Magento/Catalog/_files/product_configurable.php
rename to dev/tests/integration/testsuite/Magento/ConfigurableProduct/_files/product_configurable.php
index 73a8f64ad83..8dc7d4b17ce 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/_files/product_configurable.php
+++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/_files/product_configurable.php
@@ -18,9 +18,6 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Catalog
- * @subpackage  integration_tests
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
@@ -90,7 +87,7 @@ foreach ($options as $option) {
         ->setPrice(10)
         ->setTestConfigurable($option->getId())
         ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_NOT_VISIBLE)
-        ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+        ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
         ->setStockData(array(
             'use_config_manage_stock' => 1,
             'qty'                     => 100,
@@ -111,7 +108,7 @@ foreach ($options as $option) {
 /** @var $product \Magento\Catalog\Model\Product */
 $product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
     ->create('Magento\Catalog\Model\Product');
-$product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_CONFIGURABLE)
+$product->setTypeId(\Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE)
     ->setId(1)
     ->setAttributeSetId($installer->getAttributeSetId('catalog_product', 'Default'))
     ->setWebsiteIds(array(1))
@@ -119,7 +116,7 @@ $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_CONFIGURABLE)
     ->setSku('configurable')
     ->setPrice(100)
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->setStockData(array(
         'use_config_manage_stock' => 1,
         'is_in_stock'             => 1,
diff --git a/dev/tests/integration/testsuite/Magento/Checkout/_files/quote_with_configurable_product.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/_files/quote_with_configurable_product.php
similarity index 92%
rename from dev/tests/integration/testsuite/Magento/Checkout/_files/quote_with_configurable_product.php
rename to dev/tests/integration/testsuite/Magento/ConfigurableProduct/_files/quote_with_configurable_product.php
index 9ba3db48cf2..343a1a95967 100644
--- a/dev/tests/integration/testsuite/Magento/Checkout/_files/quote_with_configurable_product.php
+++ b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/_files/quote_with_configurable_product.php
@@ -18,14 +18,11 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Checkout
- * @subpackage  integration_tests
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
-require __DIR__ . '/../../../Magento/Catalog/_files/product_configurable.php';
+require 'product_configurable.php';
 /** @var $attribute \Magento\Catalog\Model\Resource\Eav\Attribute */
 
 /** @var $product \Magento\Catalog\Model\Product */
diff --git a/dev/tests/integration/testsuite/Magento/Core/Model/LayoutArgumentObjectUpdater.php b/dev/tests/integration/testsuite/Magento/Core/Model/LayoutArgumentObjectUpdater.php
index 7117f5abfe9..395a8b7dabc 100644
--- a/dev/tests/integration/testsuite/Magento/Core/Model/LayoutArgumentObjectUpdater.php
+++ b/dev/tests/integration/testsuite/Magento/Core/Model/LayoutArgumentObjectUpdater.php
@@ -18,19 +18,16 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Core
- * @subpackage  integration_tests
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
+namespace Magento\Core\Model;
+
 /**
  * Dummy layout argument updater model
  */
-namespace Magento\Core\Model;
-
-class LayoutArgumentObjectUpdater implements \Magento\Core\Model\Layout\Argument\UpdaterInterface
+class LayoutArgumentObjectUpdater implements \Magento\View\Layout\Argument\UpdaterInterface
 {
     /**
      * Update specified argument
diff --git a/dev/tests/integration/testsuite/Magento/Core/Model/LayoutArgumentSimpleUpdater.php b/dev/tests/integration/testsuite/Magento/Core/Model/LayoutArgumentSimpleUpdater.php
index f83a3e28a03..f164ca46883 100644
--- a/dev/tests/integration/testsuite/Magento/Core/Model/LayoutArgumentSimpleUpdater.php
+++ b/dev/tests/integration/testsuite/Magento/Core/Model/LayoutArgumentSimpleUpdater.php
@@ -18,19 +18,16 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Core
- * @subpackage  integration_tests
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
+namespace Magento\Core\Model;
+
 /**
  * Dummy layout argument updater model
  */
-namespace Magento\Core\Model;
-
-class LayoutArgumentSimpleUpdater implements \Magento\Core\Model\Layout\Argument\UpdaterInterface
+class LayoutArgumentSimpleUpdater implements \Magento\View\Layout\Argument\UpdaterInterface
 {
     /**
      * Update specified argument
diff --git a/dev/tests/integration/testsuite/Magento/Core/Model/LayoutDirectivesTest.php b/dev/tests/integration/testsuite/Magento/Core/Model/LayoutDirectivesTest.php
index 0221287c79a..da40717068f 100644
--- a/dev/tests/integration/testsuite/Magento/Core/Model/LayoutDirectivesTest.php
+++ b/dev/tests/integration/testsuite/Magento/Core/Model/LayoutDirectivesTest.php
@@ -116,10 +116,9 @@ class LayoutDirectivesTest extends \PHPUnit_Framework_TestCase
         $expectedObjectData = array(
             0 => 'updater call',
             1 => 'updater call',
-            2 => 'updater call',
         );
 
-        $expectedSimpleData = 2;
+        $expectedSimpleData = 1;
 
         $dataSource = $layout->getBlock('block_with_object_updater_args')->getOne();
         $this->assertInstanceOf('Magento\Data\Collection', $dataSource);
diff --git a/dev/tests/integration/testsuite/Magento/Core/Utility/Layout.php b/dev/tests/integration/testsuite/Magento/Core/Utility/Layout.php
index 551a59b649a..415726fb4e3 100644
--- a/dev/tests/integration/testsuite/Magento/Core/Utility/Layout.php
+++ b/dev/tests/integration/testsuite/Magento/Core/Utility/Layout.php
@@ -102,7 +102,8 @@ class Layout
             'design'             => $objectManager->get('Magento\View\DesignInterface'),
             'blockFactory'       => $objectManager->create('Magento\View\Element\BlockFactory', array()),
             'structure'          => $objectManager->create('Magento\Data\Structure', array()),
-            'argumentProcessor'  => $objectManager->create('Magento\Core\Model\Layout\Argument\Processor', array()),
+            'argumentParser'     => $objectManager->get('Magento\View\Layout\Argument\Parser'),
+            'argumentInterpreter'=> $objectManager->get('layoutArgumentInterpreter'),
             'scheduledStructure' => $objectManager->create('Magento\Core\Model\Layout\ScheduledStructure', array()),
             'coreStoreConfig'    => $objectManager->create('Magento\Core\Model\Store\Config'),
             'appState'           => $objectManager->get('Magento\App\State'),
diff --git a/dev/tests/integration/testsuite/Magento/Customer/Block/Adminhtml/Group/Edit/FormTest.php b/dev/tests/integration/testsuite/Magento/Customer/Block/Adminhtml/Group/Edit/FormTest.php
index af5bd97ba01..72ef77af71d 100644
--- a/dev/tests/integration/testsuite/Magento/Customer/Block/Adminhtml/Group/Edit/FormTest.php
+++ b/dev/tests/integration/testsuite/Magento/Customer/Block/Adminhtml/Group/Edit/FormTest.php
@@ -28,6 +28,7 @@ use Magento\Backend\App\Area\FrontNameResolver;
 use Magento\Customer\Service\V1\Dto\CustomerGroup;
 use Magento\Customer\Service\V1\Dto\Filter;
 use Magento\Customer\Service\V1\Dto\SearchCriteria;
+use Magento\Customer\Service\V1\Dto\SearchCriteriaBuilder;
 use Magento\TestFramework\Helper\Bootstrap;
 
 /**
@@ -93,13 +94,12 @@ class FormTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetFormExistInCustomGroup()
     {
-        $searchCriteria = new SearchCriteria([
-            'filters' => [new Filter([
-                'field'             => 'customer_group_code',
+        $searchCriteria = (new SearchCriteriaBuilder())
+            ->addFilter(new Filter([
+                'field'             => 'code',
                 'value'             => 'custom_group',
-                'condition_type'    => 'or',
-            ])]
-        ]);
+            ]))
+            ->create();
         /** @var CustomerGroup $customerGroup */
         $customerGroup = $this->customerGroupService->searchGroups($searchCriteria)->getItems()[0];
         $this->registry->register('current_group', $customerGroup);
diff --git a/dev/tests/integration/testsuite/Magento/Customer/Block/Adminhtml/Group/EditTest.php b/dev/tests/integration/testsuite/Magento/Customer/Block/Adminhtml/Group/EditTest.php
index a4b61d68863..1ab477419fe 100644
--- a/dev/tests/integration/testsuite/Magento/Customer/Block/Adminhtml/Group/EditTest.php
+++ b/dev/tests/integration/testsuite/Magento/Customer/Block/Adminhtml/Group/EditTest.php
@@ -28,6 +28,7 @@ use Magento\Backend\App\Area\FrontNameResolver;
 use Magento\Customer\Service\V1\Dto\CustomerGroup;
 use Magento\Customer\Service\V1\Dto\Filter;
 use Magento\Customer\Service\V1\Dto\SearchCriteria;
+use Magento\Customer\Service\V1\Dto\SearchCriteriaBuilder;
 use Magento\TestFramework\Helper\Bootstrap;
 use Magento\TestFramework\TestCase\AbstractController;
 
@@ -84,13 +85,12 @@ class EditTest extends AbstractController
      */
     public function testDeleteButtonExistInCustomGroup()
     {
-        $searchCriteria = new SearchCriteria([
-            'filters' => [new Filter([
-                'field'             => 'customer_group_code',
+        $searchCriteria = (new SearchCriteriaBuilder())
+            ->addFilter(new Filter([
+                'field'             => 'code',
                 'value'             => 'custom_group',
-                'condition_type'    => 'or',
-            ])]
-        ]);
+            ]))
+            ->create();
         /** @var CustomerGroup $customerGroup */
         $customerGroup = $this->customerGroupService->searchGroups($searchCriteria)->getItems()[0];
         $this->getRequest()->setParam('id', $customerGroup->getId());
diff --git a/dev/tests/integration/testsuite/Magento/Customer/Model/Resource/Group/Grid/ServiceCollectionTest.php b/dev/tests/integration/testsuite/Magento/Customer/Model/Resource/Group/Grid/ServiceCollectionTest.php
new file mode 100644
index 00000000000..f602d235e1e
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Customer/Model/Resource/Group/Grid/ServiceCollectionTest.php
@@ -0,0 +1,125 @@
+<?php
+/**
+ * \Magento\Customer\Model\Resource\Group\Grid\ServiceCollection
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Customer\Model\Resource\Group\Grid;
+
+class ServiceCollectionTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var ServiceCollection */
+    protected $collection;
+
+    public function setUp()
+    {
+        $this->collection = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create('Magento\Customer\Model\Resource\Group\Grid\ServiceCollection');
+    }
+
+    public function testSetOrder()
+    {
+        $this->collection->setOrder('code', \Magento\Data\Collection::SORT_ORDER_ASC);
+        $this->collection->loadData();
+        $items = $this->collection->getItems();
+        $this->assertEquals(4, count($items));
+
+        $this->assertEquals('General', $items[0]->getCode());
+        $this->assertEquals('1', $items[0]->getId());
+        $this->assertEquals('3', $items[0]->getTaxClassId());
+
+        $this->assertEquals('NOT LOGGED IN', $items[1]->getCode());
+        $this->assertEquals('0', $items[1]->getId());
+        $this->assertEquals('3', $items[1]->getTaxClassId());
+
+        $this->assertEquals('Retailer', $items[2]->getCode());
+        $this->assertEquals('3', $items[2]->getId());
+        $this->assertEquals('3', $items[2]->getTaxClassId());
+
+        $this->assertEquals('Wholesale', $items[3]->getCode());
+        $this->assertEquals('2', $items[3]->getId());
+        $this->assertEquals('3', $items[3]->getTaxClassId());
+    }
+
+    public function testArrayFilter()
+    {
+        $this->collection->addFieldToFilter(['code'], [['NOT LOGGED IN']]);
+        $this->collection->loadData();
+        $items = $this->collection->getItems();
+        $this->assertEquals(1, count($items));
+
+        $this->assertEquals('NOT LOGGED IN', $items[0]->getCode());
+        $this->assertEquals('0', $items[0]->getId());
+        $this->assertEquals('3', $items[0]->getTaxClassId());
+    }
+
+    public function testOrArrayFilter()
+    {
+        $this->collection->addFieldToFilter(['code', 'code'], ['General', 'Retailer']);
+        $this->collection->loadData();
+        $items = $this->collection->getItems();
+        $this->assertEquals(2, count($items));
+
+        $this->assertEquals('General', $items[0]->getCode());
+        $this->assertEquals('1', $items[0]->getId());
+        $this->assertEquals('3', $items[0]->getTaxClassId());
+
+        $this->assertEquals('Retailer', $items[1]->getCode());
+        $this->assertEquals('3', $items[1]->getId());
+        $this->assertEquals('3', $items[1]->getTaxClassId());
+    }
+
+    public function testSingleFilter()
+    {
+        $this->collection->addFieldToFilter('code', 'NOT LOGGED IN');
+        $this->collection->loadData();
+        $items = $this->collection->getItems();
+        $this->assertEquals(1, count($items));
+
+        $this->assertEquals('NOT LOGGED IN', $items[0]->getCode());
+        $this->assertEquals('0', $items[0]->getId());
+        $this->assertEquals('3', $items[0]->getTaxClassId());
+    }
+
+    public function testSingleLikeFilter()
+    {
+        $this->collection->addFieldToFilter('code', ['like' => 'NOT%']);
+        $this->collection->loadData();
+        $items = $this->collection->getItems();
+        $this->assertEquals(1, count($items));
+
+        $this->assertEquals('NOT LOGGED IN', $items[0]->getCode());
+        $this->assertEquals('0', $items[0]->getId());
+        $this->assertEquals('3', $items[0]->getTaxClassId());
+    }
+
+    /**
+     * @expectedException \Magento\Exception
+     * @expectedExceptionMessage When passing in a field array there must be a matching condition array.
+     */
+    public function testAddToFilterException()
+    {
+        $this->collection->addFieldToFilter([], 'not_array');
+    }
+}
+ 
\ No newline at end of file
diff --git a/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerGroupServiceTest.php b/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerGroupServiceTest.php
index 4e0a4412629..ff747acdfb2 100644
--- a/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerGroupServiceTest.php
+++ b/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerGroupServiceTest.php
@@ -25,8 +25,6 @@
  */
 namespace Magento\Customer\Service\V1;
 
-use Magento\Customer\Service\V1;
-
 class CustomerGroupServiceTest extends \PHPUnit_Framework_TestCase
 {
     /**
@@ -75,19 +73,19 @@ class CustomerGroupServiceTest extends \PHPUnit_Framework_TestCase
         $groups = $this->_groupService->getGroups();
         $this->assertEquals(4, count($groups));
         $this->assertEquals(
-            [0, "NOT LOGGED IN", 3],
+            [0, 'NOT LOGGED IN', 3],
             [$groups[0]->getId(), $groups[0]->getCode(), $groups[0]->getTaxClassId()]
         );
         $this->assertEquals(
-            [1, "General", 3],
+            [1, 'General', 3],
             [$groups[1]->getId(), $groups[1]->getCode(), $groups[1]->getTaxClassId()]
         );
         $this->assertEquals(
-            [2, "Wholesale", 3],
+            [2, 'Wholesale', 3],
             [$groups[2]->getId(), $groups[2]->getCode(), $groups[2]->getTaxClassId()]
         );
         $this->assertEquals(
-            [3, "Retailer", 3],
+            [3, 'Retailer', 3],
             [$groups[3]->getId(), $groups[3]->getCode(), $groups[3]->getTaxClassId()]
         );
     }
@@ -99,36 +97,48 @@ class CustomerGroupServiceTest extends \PHPUnit_Framework_TestCase
         $groups = $this->_groupService->getGroups(FALSE);
         $this->assertEquals(3, count($groups));
         $this->assertEquals(
-            [1, "General", 3],
+            [1, 'General', 3],
             [$groups[0]->getId(), $groups[0]->getCode(), $groups[0]->getTaxClassId()]
         );
         $this->assertEquals(
-            [2, "Wholesale", 3],
+            [2, 'Wholesale', 3],
             [$groups[1]->getId(), $groups[1]->getCode(), $groups[1]->getTaxClassId()]
         );
         $this->assertEquals(
-            [3, "Retailer", 3],
+            [3, 'Retailer', 3],
             [$groups[2]->getId(), $groups[2]->getCode(), $groups[2]->getTaxClassId()]
         );
     }
 
     /**
-     * @param array $group
-     * @dataProvider getGroups
+     * @param $testGroup
+     * @dataProvider getGroupsDataProvider
      */
     public function testGetGroup($testGroup)
     {
-        $group = $this->_groupService->getGroup($testGroup["id"]);
-        $this->assertEquals($testGroup["id"], $group->getId());
-        $this->assertEquals($testGroup["code"], $group->getCode());
-        $this->assertEquals($testGroup["taxClass"], $group->getTaxClassId());
+        $group = $this->_groupService->getGroup($testGroup['id']);
+        $this->assertEquals($testGroup['id'], $group->getId());
+        $this->assertEquals($testGroup['code'], $group->getCode());
+        $this->assertEquals($testGroup['tax_class_id'], $group->getTaxClassId());
+    }
+
+    /**
+     * @return array
+     */
+    public function getGroupsDataProvider()
+    {
+        return [ [['id' => 0, 'code' => 'NOT LOGGED IN', 'tax_class_id' => 3]],
+            [['id' => 1, 'code' => 'General', 'tax_class_id' => 3]],
+            [['id' => 2, 'code' => 'Wholesale', 'tax_class_id' => 3]],
+            [['id' => 3, 'code' => 'Retailer', 'tax_class_id' => 3]],
+        ];
     }
 
     public function testCreateGroup()
     {
-        $group = new V1\Dto\CustomerGroup([
+        $group = new Dto\CustomerGroup([
           'id' => null,
-          'code' => "Test Group",
+          'code' => 'Test Group',
           'tax_class_id' => 4
         ]);
         $groupId = $this->_groupService->saveGroup($group);
@@ -142,9 +152,9 @@ class CustomerGroupServiceTest extends \PHPUnit_Framework_TestCase
 
     public function testUpdateGroup()
     {
-        $group = new V1\Dto\CustomerGroup([
+        $group = new Dto\CustomerGroup([
           'id' => null,
-          'code' => "New Group",
+          'code' => 'New Group',
           'tax_class_id' => 4
         ]);
         $groupId = $this->_groupService->saveGroup($group);
@@ -155,9 +165,9 @@ class CustomerGroupServiceTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals($group->getCode(), $newGroup->getCode());
         $this->assertEquals($group->getTaxClassId(), $newGroup->getTaxClassId());
 
-        $updates = new V1\Dto\CustomerGroup([
+        $updates = new Dto\CustomerGroup([
           'id' => $groupId,
-          'code' => "Updated Group",
+          'code' => 'Updated Group',
           'tax_class_id' => 2
         ]);
         $newId = $this->_groupService->saveGroup($updates);
@@ -168,14 +178,68 @@ class CustomerGroupServiceTest extends \PHPUnit_Framework_TestCase
     }
 
     /**
-     * @return array
+     * @param Dto\Filter[] $filters
+     * @param Dto\Filter[] $orGroup
+     * @param array $expectedResult array of expected results indexed by ID
+     *
+     * @dataProvider searchGroupsDataProvider
      */
-    public function getGroups()
+    public function testSearchGroups($filters, $orGroup, $expectedResult)
+    {
+        $searchBuilder = new Dto\SearchCriteriaBuilder();
+        foreach ($filters as $filter) {
+            $searchBuilder->addFilter($filter);
+        }
+        if (!is_null($orGroup)) {
+            $searchBuilder->addOrGroup($orGroup);
+        }
+
+        $searchResults = $this->_groupService->searchGroups($searchBuilder->create());
+
+        /** @var $item Dto\CustomerGroup*/
+        foreach ($searchResults->getItems() as $item) {
+            $this->assertEquals($expectedResult[$item->getId()]['code'], $item->getCode());
+            $this->assertEquals($expectedResult[$item->getId()]['tax_class_id'], $item->getTaxClassId());
+            unset($expectedResult[$item->getId()]);
+        }
+    }
+
+    public function searchGroupsDataProvider()
     {
-        return [ [["id" => 0, "code" => "NOT LOGGED IN", "taxClass" => 3]],
-                 [["id" => 1, "code" => "General", "taxClass" => 3]],
-                 [["id" => 2, "code" => "Wholesale", "taxClass" => 3]],
-                 [["id" => 3, "code" => "Retailer", "taxClass" => 3]],
-                ];
+        return [
+            'eq' => [
+                [(new Dto\FilterBuilder())->setField('code')->setValue('General')->create()],
+                null,
+                [1 => ['code' => 'General', 'tax_class_id' => 3]]
+            ],
+            'and' => [
+                [
+                    (new Dto\FilterBuilder())->setField('code')->setValue('General')->create(),
+                    (new Dto\FilterBuilder())->setField('tax_class_id')->setValue('3')->create(),
+                    (new Dto\FilterBuilder())->setField('id')->setValue('1')->create(),
+                ],
+                [],
+                [1 => ['code' => 'General', 'tax_class_id' => 3]]
+            ],
+            'or' => [
+                [],
+                [
+                    (new Dto\FilterBuilder())->setField('code')->setValue('General')->create(),
+                    (new Dto\FilterBuilder())->setField('code')->setValue('Wholesale')->create(),
+                ],
+                [
+                    1 => ['code' => 'General', 'tax_class_id' => 3],
+                    2 => ['code' => 'Wholesale', 'tax_class_id' => 3]
+                ]
+            ],
+            'like' => [
+                [(new Dto\FilterBuilder())->setField('code')->setValue('er')->setConditionType('like')->create()],
+                [],
+                [
+                    1 => ['code' => 'General', 'tax_class_id' => 3],
+                    3 => ['code' => 'Retailer', 'tax_class_id' => 3]
+                ]
+            ],
+        ];
     }
 }
diff --git a/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerMetadataServiceTest.php b/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerMetadataServiceTest.php
index a42fda2b25b..1fce688c7d9 100644
--- a/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerMetadataServiceTest.php
+++ b/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerMetadataServiceTest.php
@@ -25,6 +25,8 @@
  */
 namespace Magento\Customer\Service\V1;
 
+use Magento\Exception\NoSuchEntityException;
+
 class CustomerMetadataServiceTest extends \PHPUnit_Framework_TestCase
 {
     /** @var \Magento\Customer\Service\V1\CustomerServiceInterface */
@@ -40,6 +42,32 @@ class CustomerMetadataServiceTest extends \PHPUnit_Framework_TestCase
         $this->_service = $objectManager->create('Magento\Customer\Service\V1\CustomerMetadataServiceInterface');
     }
 
+    public function testGetAttributeMetadataNoSuchEntity()
+    {
+        try {
+            $this->_service->getAttributeMetadata('customer_address', '1');
+            $this->fail('Expected exception not thrown.');
+        } catch (NoSuchEntityException $e) {
+            $this->assertEquals(NoSuchEntityException::NO_SUCH_ENTITY, $e->getCode());
+            $this->assertEquals(
+                [
+                    'entityType' => 'customer_address',
+                    'attributeCode' => '1'
+                ],
+                $e->getParams()
+            );
+        }
+    }
+
+    public function testAttributeMetadataCached()
+    {
+        $firstCallMetadata = $this->_service->getAddressAttributeMetadata('firstname');
+        $secondCallMetadata = $this->_service->getAddressAttributeMetadata('firstname');
+
+        $this->assertSame($firstCallMetadata, $secondCallMetadata);
+
+    }
+
     /**
      * @magentoDataFixture Magento/Customer/_files/customer.php
      */
@@ -92,13 +120,21 @@ class CustomerMetadataServiceTest extends \PHPUnit_Framework_TestCase
         $this->assertEmpty($expectAttrsWithVals);
     }
 
-    public function testAttributeMetadataCached()
+    public function testGetCustomerAttributeMetadataNoSuchEntity()
     {
-        $firstCallMetadata = $this->_service->getAddressAttributeMetadata('firstname');
-        $secondCallMetadata = $this->_service->getAddressAttributeMetadata('firstname');
-
-        $this->assertSame($firstCallMetadata, $secondCallMetadata);
-
+        try {
+            $this->_service->getCustomerAttributeMetadata('20');
+            $this->fail('Expected exception not thrown.');
+        } catch (NoSuchEntityException $e) {
+            $this->assertEquals(NoSuchEntityException::NO_SUCH_ENTITY, $e->getCode());
+            $this->assertEquals(
+                [
+                    'entityType' => 'customer',
+                    'attributeCode' => '20'
+                ],
+                $e->getParams()
+            );
+        }
     }
 
     public function testGetAddressAttributeMetadata()
@@ -110,4 +146,21 @@ class CustomerMetadataServiceTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals('text', $vatValidMetadata->getFrontendInput());
         $this->assertEquals('VAT number validity', $vatValidMetadata->getStoreLabel());
     }
+
+    public function testGetAddressAttributeMetadataNoSuchEntity()
+    {
+        try {
+            $this->_service->getAddressAttributeMetadata('1');
+            $this->fail('Expected exception not thrown.');
+        } catch (NoSuchEntityException $e) {
+            $this->assertEquals(NoSuchEntityException::NO_SUCH_ENTITY, $e->getCode());
+            $this->assertEquals(
+                [
+                    'entityType' => 'customer_address',
+                    'attributeCode' => '1'
+                ],
+                $e->getParams()
+            );
+        }
+    }
 }
diff --git a/dev/tests/integration/testsuite/Magento/Data/Argument/Interpreter/StringTest.php b/dev/tests/integration/testsuite/Magento/Data/Argument/Interpreter/StringTest.php
new file mode 100644
index 00000000000..3bf9020068c
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Data/Argument/Interpreter/StringTest.php
@@ -0,0 +1,109 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Data\Argument\Interpreter;
+
+class StringTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Number
+     */
+    protected $_model;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_booleanUtils;
+
+    protected function setUp()
+    {
+        $this->_booleanUtils = $this->getMock('\Magento\Stdlib\BooleanUtils');
+        $this->_booleanUtils
+            ->expects($this->any())
+            ->method('toBoolean')
+            ->will($this->returnValueMap(array(
+                array('true', true),
+                array('false', false),
+            )))
+        ;
+        $this->_model = new String($this->_booleanUtils);
+        $translateRenderer = $this->getMockForAbstractClass('Magento\Phrase\RendererInterface');
+        $translateRenderer->expects($this->any())
+            ->method('render')
+            ->will($this->returnCallback(function ($input) {
+                return $input . ' (translated)';
+            }));
+        \Magento\Phrase::setRenderer($translateRenderer);
+    }
+
+    /**
+     * @param array $input
+     * @param bool $expected
+     *
+     * @dataProvider evaluateDataProvider
+     */
+    public function testEvaluate($input, $expected)
+    {
+        $actual = $this->_model->evaluate($input);
+        $this->assertSame($expected, $actual);
+    }
+
+    public function evaluateDataProvider()
+    {
+        return array(
+            'no value' => array(array(), ''),
+            'with value' => array(
+                array('value' => 'some value'),
+                'some value'
+            ),
+            'translation required' => array(
+                array('value' => 'some value', 'translate' => 'true'),
+                'some value (translated)'
+            ),
+            'translation not required' => array(
+                array('value' => 'some value', 'translate' => 'false'),
+                'some value'
+            ),
+        );
+    }
+
+    /**
+     * @param array $input
+     *
+     * @dataProvider evaluateExceptionDataProvider
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage String value is expected
+     */
+    public function testEvaluateException($input)
+    {
+        $this->_model->evaluate($input);
+    }
+
+    public function evaluateExceptionDataProvider()
+    {
+        return array(
+            'not a string' => array(array('value' => 123)),
+        );
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Downloadable/_files/product.php b/dev/tests/integration/testsuite/Magento/Downloadable/_files/product.php
index 5f62b488c19..46f8a1443ef 100644
--- a/dev/tests/integration/testsuite/Magento/Downloadable/_files/product.php
+++ b/dev/tests/integration/testsuite/Magento/Downloadable/_files/product.php
@@ -35,7 +35,7 @@ $product->setTypeId(\Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE)
     ->setSku('downloadable-product')
     ->setPrice(10)
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->setDownloadableData(array(
         'link' => array(
             array(
diff --git a/dev/tests/integration/testsuite/Magento/Downloadable/_files/product_with_files.php b/dev/tests/integration/testsuite/Magento/Downloadable/_files/product_with_files.php
index 73f26b91494..fc322286f10 100644
--- a/dev/tests/integration/testsuite/Magento/Downloadable/_files/product_with_files.php
+++ b/dev/tests/integration/testsuite/Magento/Downloadable/_files/product_with_files.php
@@ -35,7 +35,7 @@ $product->setTypeId(\Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE)
     ->setSku('downloadable-product')
     ->setPrice(10)
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->setDownloadableData(array(
         'link' => array(array(
             'link_id'        => 0,
diff --git a/dev/tests/integration/testsuite/Magento/GroupedProduct/_files/product_grouped.php b/dev/tests/integration/testsuite/Magento/GroupedProduct/_files/product_grouped.php
index a3cb6d81ef0..44d95417230 100644
--- a/dev/tests/integration/testsuite/Magento/GroupedProduct/_files/product_grouped.php
+++ b/dev/tests/integration/testsuite/Magento/GroupedProduct/_files/product_grouped.php
@@ -38,7 +38,7 @@ $product->setTypeId(\Magento\GroupedProduct\Model\Product\Type\Grouped::TYPE_COD
     ->setPrice(100)
     ->setTaxClassId(0)
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->setGroupedLinkData(array(
         2 => array('qty' => 1, 'position' => 1),
         21 => array('qty' => 1, 'position' => 2),
diff --git a/dev/tests/integration/testsuite/Magento/ImportExport/Model/Import/Entity/ProductTest.php b/dev/tests/integration/testsuite/Magento/ImportExport/Model/Import/Entity/ProductTest.php
index d954db8432c..151d00f5c8e 100644
--- a/dev/tests/integration/testsuite/Magento/ImportExport/Model/Import/Entity/ProductTest.php
+++ b/dev/tests/integration/testsuite/Magento/ImportExport/Model/Import/Entity/ProductTest.php
@@ -474,7 +474,7 @@ class ProductTest extends \PHPUnit_Framework_TestCase
         $data .= implode(',', array(
             'test_sku', 'Default', \Magento\Catalog\Model\Product\Type::DEFAULT_TYPE, 'base', 'Product Name', '9.99',
             'Product description', 'Short desc.', '1',
-            \Magento\Catalog\Model\Product\Status::STATUS_ENABLED,
+            \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED,
             \Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH, 0,
             $attribute->getId(), 'magento_image.jpg', 'Image Label', '1', '0'
         )) . "\n";
diff --git a/dev/tests/integration/testsuite/Magento/ImportExport/_files/product.php b/dev/tests/integration/testsuite/Magento/ImportExport/_files/product.php
index 5d08bb9cc9c..bfc9ea7e289 100644
--- a/dev/tests/integration/testsuite/Magento/ImportExport/_files/product.php
+++ b/dev/tests/integration/testsuite/Magento/ImportExport/_files/product.php
@@ -34,7 +34,7 @@ $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
     ->setSku('simple')
     ->setPrice(10)
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->setWebsiteIds(array(1))
     ->setCateroryIds(array())
     ->setStockData(array('qty' => 100, 'is_in_stock' => 1))
diff --git a/dev/tests/integration/testsuite/Magento/Multishipping/Controller/CheckoutTest.php b/dev/tests/integration/testsuite/Magento/Multishipping/Controller/CheckoutTest.php
index 0c4325f5bef..14e1f06be40 100644
--- a/dev/tests/integration/testsuite/Magento/Multishipping/Controller/CheckoutTest.php
+++ b/dev/tests/integration/testsuite/Magento/Multishipping/Controller/CheckoutTest.php
@@ -40,7 +40,7 @@ class CheckoutTest extends \Magento\TestFramework\TestCase\AbstractController
      *
      * @magentoDataFixture Magento/Sales/_files/quote.php
      * @magentoDataFixture Magento/Customer/_files/customer.php
-     * @magentoConfigFixture current_store shipping/option/checkout_multiple 1
+     * @magentoConfigFixture current_store multishipping/options/checkout_multiple 1
      */
     public function testOverviewAction()
     {
diff --git a/dev/tests/integration/testsuite/Magento/Mview/View/ChangelogTest.php b/dev/tests/integration/testsuite/Magento/Mview/View/ChangelogTest.php
index 5136e43f9bc..78277492628 100644
--- a/dev/tests/integration/testsuite/Magento/Mview/View/ChangelogTest.php
+++ b/dev/tests/integration/testsuite/Magento/Mview/View/ChangelogTest.php
@@ -116,7 +116,7 @@ class ChangelogTest extends \PHPUnit_Framework_TestCase
         );
         $this->assertEquals(1, $this->model->getVersion());
         $this->model->clear(1);
-        $this->assertEquals(0, $this->model->getVersion());//the same that a table is empty
+        $this->assertEquals(1, $this->model->getVersion());//the same that a table is empty
     }
 
     /**
diff --git a/dev/tests/integration/testsuite/Magento/ObjectManager/Config/Reader/DomTest.php b/dev/tests/integration/testsuite/Magento/ObjectManager/Config/Reader/DomTest.php
index 2348135b9cb..e248c18c382 100644
--- a/dev/tests/integration/testsuite/Magento/ObjectManager/Config/Reader/DomTest.php
+++ b/dev/tests/integration/testsuite/Magento/ObjectManager/Config/Reader/DomTest.php
@@ -72,7 +72,8 @@ class DomTest extends \PHPUnit_Framework_TestCase
             'Magento\App\Arguments\FileResolver\Primary', array(), array(), '', false
         );
         $this->_fileResolverMock->expects($this->once())->method('get')->will($this->returnValue($this->_fileList));
-        $this->_mapper = new \Magento\ObjectManager\Config\Mapper\Dom();
+        $this->_mapper = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->get('Magento\ObjectManager\Config\Mapper\Dom');
         $this->_validationState =
             new \Magento\App\Arguments\ValidationState(\Magento\App\State::MODE_DEFAULT);
         $this->_schemaLocator = new \Magento\ObjectManager\Config\SchemaLocator();
diff --git a/dev/tests/integration/testsuite/Magento/ObjectManager/ObjectManagerTest.php b/dev/tests/integration/testsuite/Magento/ObjectManager/ObjectManagerTest.php
index da799e9fbc6..1170b74bdcb 100644
--- a/dev/tests/integration/testsuite/Magento/ObjectManager/ObjectManagerTest.php
+++ b/dev/tests/integration/testsuite/Magento/ObjectManager/ObjectManagerTest.php
@@ -88,13 +88,24 @@ class ObjectManagerTest extends \PHPUnit_Framework_TestCase
 
     public static function setUpBeforeClass()
     {
-        self::$_objectManager = new \Magento\ObjectManager\ObjectManager();
+        $config = new \Magento\ObjectManager\Config\Config();
+
+        $dirList = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->get('Magento\App\Filesystem\DirectoryList');
+        $loader = new \Magento\App\Arguments\Loader($dirList);
+        $arguments = new \Magento\App\Arguments(array(), $loader);
+        $const = new \Magento\Data\Argument\Interpreter\Constant();
+        $argInterpreter = new \Magento\App\Arguments\ArgumentInterpreter($arguments, $const);
+        $argObjectFactory = new \Magento\ObjectManager\Config\Argument\ObjectFactory($config);
+        $factory = new \Magento\ObjectManager\Factory\Factory($config, $argInterpreter, $argObjectFactory);
+
+        self::$_objectManager = new \Magento\ObjectManager\ObjectManager($factory, $config);
         self::$_objectManager->configure(array(
             'preferences' => array(
                 self::TEST_INTERFACE => self::TEST_INTERFACE_IMPLEMENTATION
             )
         ));
-
+        $argObjectFactory->setObjectManager(self::$_objectManager);
     }
 
     public static function tearDownAfterClass()
diff --git a/dev/tests/integration/testsuite/Magento/ObjectManager/_files/config_merged.xml b/dev/tests/integration/testsuite/Magento/ObjectManager/_files/config_merged.xml
index b5df256812e..218bc80c682 100644
--- a/dev/tests/integration/testsuite/Magento/ObjectManager/_files/config_merged.xml
+++ b/dev/tests/integration/testsuite/Magento/ObjectManager/_files/config_merged.xml
@@ -23,92 +23,61 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <preference for="Magento\Module\UpdaterInterface" type="Magento\Module\UpdaterOne" />
     <preference for="Magento\Module\UpdaterInterfaceTwo" type="Magento\Module\UpdaterTwo"/>
     <type name="Magento\App\Arguments\Loader" shared="false">
-        <param name="customFile">
-            <value type="argument">Magento\App\Arguments\Loader::PARAM_CUSTOM_FILE</value>
-        </param>
-        <param name="customConfig">
-            <instance shared="false" type="Magento\Core\Model\Config\Storage\Modules" />
-        </param>
-        <param name="customValue">
-            <value>someCustomValue</value>
-        </param>
-        <param name="customComplexValue">
-            <array>
-                <item key="one"><value>one</value></item>
-                <item key="two"><value>two</value></item>
-                <item key="three"><value>three</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="customFile" xsi:type="init_parameter">Magento\App\Arguments\Loader::PARAM_CUSTOM_FILE</argument>
+            <argument name="customConfig" xsi:type="object" shared="false">Magento\Core\Model\Config\Storage\Modules</argument>
+            <argument name="customValue" xsi:type="string">someCustomValue</argument>
+            <argument name="customComplexValue" xsi:type="array">
+                <item name="one" xsi:type="string">one</item>
+                <item name="two" xsi:type="string">two</item>
+                <item name="three" xsi:type="string">three</item>
+            </argument>
+            <argument name="newParam" xsi:type="string">paramValue</argument>
+        </arguments>
         <plugin name="one" type="somePluginOne" sortOrder="800"/>
         <plugin name="two" type="somePluginTwo" sortOrder="20" disabled="true"/>
-        <param name="newParam">
-            <value>paramValue</value>
-        </param>
         <plugin name="three" type="somePluginThree"/>
     </type>
     <virtualType name="Magento\App\Arguments\LoaderVirtual" type="Magento\App\Arguments\Loader\Local" shared="true">
-        <param name="customFile">
-            <value type="argument">Magento\App\Arguments\Loader::PARAM_CUSTOM_FILE</value>
-        </param>
-        <param name="customConfig">
-            <instance type="Magento\Core\Model\Config\Storage\Modules" />
-        </param>
-        <param name="customValue">
-            <value>someValue</value>
-        </param>
-        <param name="customComplexValue">
-            <array>
-                <item key="one"><value>one</value></item>
-                <item key="two"><value>one</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="customFile" xsi:type="init_parameter">Magento\App\Arguments\Loader::PARAM_CUSTOM_FILE</argument>
+            <argument name="customConfig" xsi:type="object">Magento\Core\Model\Config\Storage\Modules</argument>
+            <argument name="customValue" xsi:type="string">someValue</argument>
+            <argument name="customComplexValue" xsi:type="array">
+                <item name="one" xsi:type="string">one</item>
+                <item name="two" xsi:type="string">one</item>
+            </argument>
+        </arguments>
         <plugin name="one" type="somePluginOne" sortOrder="800" />
         <plugin name="two" type="somePluginTwo" sortOrder="20" disabled="true"/>
         <plugin name="three" type="somePluginThree"/>
     </virtualType>
     <type name="Magento\Data\Collection\Db\FetchStrategy\Cache">
-        <param name="cacheIdPrefix"><value><![CDATA[collection_]]></value></param>
-        <param name="cacheLifetime"><value>86400</value></param>
-        <param name="cacheTags">
-            <array>
-                <item key="const"><value type="const">Magento\Core\Model\Website::CACHE_TAG</value></item>
-                <item key="boolFalse"><value type="bool">1</value></item>
-                <item key="boolTrue"><value type="int">10</value></item>
-                <item key="boolOne"><value type="string" pattern="[0-9]*">1</value></item>
-                <item key="boolZero"><value type="bool">0</value></item>
-                <item key="intValue"><value type="int">100500</value></item>
-                <item key="nullValue"><value type="null"/>
-                </item>
-                <item key="stringPattern"><value type="string" pattern="[a-zA-Z\-]*">Az-Value</value></item>
-            </array>
-        </param>
-        <param name="constParam">
-            <value type='const'>Magento\Core\Model\Website::CACHE_TAG</value>
-        </param>
-        <param name="boolFalseParam">
-            <value type='int'>100</value>
-        </param>
-        <param name="boolTrueParam">
-            <value type='bool'>true</value>
-        </param>
-        <param name="boolOneParam">
-            <value type='bool'>1</value>
-        </param>
-        <param name="boolZeroParam">
-            <value type='bool'>0</value>
-        </param>
-        <param name="intValueParam">
-            <value type='int'>100500</value>
-        </param>
-        <param name="nullValueParam">
-            <value type='bool'>true</value>
-        </param>
-        <param name="stringPatternParam">
-            <value type='string' pattern="[a-z\-]*">az-value</value>
-        </param>
+        <arguments>
+            <argument name="cacheIdPrefix" xsi:type="string"><![CDATA[collection_]]></argument>
+            <argument name="cacheLifetime" xsi:type="string">86400</argument>
+            <argument name="cacheTags" xsi:type="array">
+                <item name="const" xsi:type="const">Magento\Core\Model\Website::CACHE_TAG</item>
+                <item name="boolFalse" xsi:type="boolean">1</item>
+                <item name="boolTrue" xsi:type="number">10</item>
+                <item name="boolOne" xsi:type="string">1</item>
+                <item name="boolZero" xsi:type="boolean">0</item>
+                <item name="intValue" xsi:type="number">100500</item>
+                <item name="nullValue" xsi:type="null"/>
+                <item name="stringPattern" xsi:type="string">Az-Value</item>
+            </argument>
+            <argument name="constParam" xsi:type="const">Magento\Core\Model\Website::CACHE_TAG</argument>
+            <argument name="boolFalseParam" xsi:type="number">100</argument>
+            <argument name="boolTrueParam" xsi:type="boolean">true</argument>
+            <argument name="boolOneParam" xsi:type="boolean">1</argument>
+            <argument name="boolZeroParam" xsi:type="boolean">0</argument>
+            <argument name="intValueParam" xsi:type="number">100500</argument>
+            <argument name="nullValueParam" xsi:type="boolean">true</argument>
+            <argument name="stringPatternParam" xsi:type="string">az-value</argument>
+        </arguments>
     </type>
 </config>
diff --git a/dev/tests/integration/testsuite/Magento/ObjectManager/_files/config_one.xml b/dev/tests/integration/testsuite/Magento/ObjectManager/_files/config_one.xml
index 537a259f5d9..a9ae2cbfba9 100644
--- a/dev/tests/integration/testsuite/Magento/ObjectManager/_files/config_one.xml
+++ b/dev/tests/integration/testsuite/Magento/ObjectManager/_files/config_one.xml
@@ -23,85 +23,56 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <preference for="Magento\Module\UpdaterInterface" type="Magento\Module\Updater" />
     <type name="Magento\App\Arguments\Loader">
-        <param name="customFile">
-            <value type="argument">Magento\App\Arguments\Loader::PARAM_CUSTOM_FILE</value>
-        </param>
-        <param name="customConfig">
-            <instance shared="true" type="Magento\Core\Model\Config\Storage\Modules" />
-        </param>
-        <param name="customValue">
-            <value>someValue</value>
-        </param>
-        <param name="customComplexValue">
-            <array>
-                <item key="one"><value>one</value></item>
-                <item key="two"><value>two</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="customFile" xsi:type="init_parameter">Magento\App\Arguments\Loader::PARAM_CUSTOM_FILE</argument>
+            <argument name="customConfig" xsi:type="object" shared="true">Magento\Core\Model\Config\Storage\Modules</argument>
+            <argument name="customValue" xsi:type="string">someValue</argument>
+            <argument name="customComplexValue" xsi:type="array">
+                <item name="one" xsi:type="string">one</item>
+                <item name="two" xsi:type="string">two</item>
+            </argument>
+        </arguments>
         <plugin name="one" type="somePluginOne"/>
         <plugin name="two" type="somePluginTwo" sortOrder="15"/>
     </type>
     <virtualType name="Magento\App\Arguments\LoaderVirtual" type="Magento\App\Arguments\Loader\Local" shared="false">
-        <param name="customFile">
-            <value type="argument">Magento\App\Arguments\Loader::PARAM_CUSTOM_FILE</value>
-        </param>
-        <param name="customConfig">
-            <instance type="Magento\Core\Model\Config\Storage\Modules" />
-        </param>
-        <param name="customValue">
-            <value>someValue</value>
-        </param>
-        <param name="customComplexValue">
-            <array>
-                <item key="one"><value>one</value></item>
-                <item key="two"><value>one</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="customFile" xsi:type="init_parameter">Magento\App\Arguments\Loader::PARAM_CUSTOM_FILE</argument>
+            <argument name="customConfig" xsi:type="object">Magento\Core\Model\Config\Storage\Modules</argument>
+            <argument name="customValue" xsi:type="string">someValue</argument>
+            <argument name="customComplexValue" xsi:type="array">
+                <item name="one" xsi:type="string">one</item>
+                <item name="two" xsi:type="string">one</item>
+            </argument>
+        </arguments>
         <plugin name="one" type="somePluginOne" sortOrder="10" />
         <plugin name="two" type="somePluginTwo"/>
     </virtualType>
     <type name="Magento\Data\Collection\Db\FetchStrategy\Cache">
-        <param name="cacheIdPrefix"><value><![CDATA[collection_]]></value></param>
-        <param name="cacheLifetime"><value>86400</value></param>
-        <param name="cacheTags">
-            <array>
-                <item key="const"><value type="const">Magento\Core\Model\Website::CACHE_TAG</value></item>
-                <item key="boolFalse"><value type="bool">false</value></item>
-                <item key="boolTrue"><value type="bool">true</value></item>
-                <item key="boolOne"><value type="bool">1</value></item>
-                <item key="boolZero"><value type="bool">0</value></item>
-                <item key="intValue"><value type="int">100500</value></item>
-                <item key="nullValue"><value type="null"/>
-                </item>
-                <item key="stringPattern"><value type="string" pattern="[a-z\-]*">az-value</value></item>
-            </array>
-        </param>
-        <param name="constParam">
-            <value type='const'>Magento\Core\Model\Website::CACHE_TAG</value>
-        </param>
-        <param name="boolFalseParam">
-            <value type='bool'>false</value>
-        </param>
-        <param name="boolTrueParam">
-            <value type='bool'>true</value>
-        </param>
-        <param name="boolOneParam">
-            <value type='bool'>1</value>
-        </param>
-        <param name="boolZeroParam">
-            <value type='bool'>0</value>
-        </param>
-        <param name="intValueParam">
-            <value type='int'>100500</value>
-        </param>
-        <param name="nullValueParam">
-            <value type='null' />
-        </param>
-        <param name="stringPatternParam">
-            <value type='string' pattern="[a-z\-]*">az-value</value>
-        </param>
+        <arguments>
+            <argument name="cacheIdPrefix" xsi:type="string"><![CDATA[collection_]]></argument>
+            <argument name="cacheLifetime" xsi:type="string">86400</argument>
+            <argument name="cacheTags" xsi:type="array">
+                <item name="const" xsi:type="const">Magento\Core\Model\Website::CACHE_TAG</item>
+                <item name="boolFalse" xsi:type="boolean">false</item>
+                <item name="boolTrue" xsi:type="boolean">true</item>
+                <item name="boolOne" xsi:type="boolean">1</item>
+                <item name="boolZero" xsi:type="boolean">0</item>
+                <item name="intValue" xsi:type="number">100500</item>
+                <item name="nullValue" xsi:type="null"/>
+                <item name="stringPattern" xsi:type="string">az-value</item>
+            </argument>
+            <argument name="constParam" xsi:type="const">Magento\Core\Model\Website::CACHE_TAG</argument>
+            <argument name="boolFalseParam" xsi:type="boolean">false</argument>
+            <argument name="boolTrueParam" xsi:type="boolean">true</argument>
+            <argument name="boolOneParam" xsi:type="boolean">1</argument>
+            <argument name="boolZeroParam" xsi:type="boolean">0</argument>
+            <argument name="intValueParam" xsi:type="number">100500</argument>
+            <argument name="nullValueParam" xsi:type="null"/>
+            <argument name="stringPatternParam" xsi:type="string">az-value</argument>
+        </arguments>
     </type>
 </config>
diff --git a/dev/tests/integration/testsuite/Magento/ObjectManager/_files/config_two.xml b/dev/tests/integration/testsuite/Magento/ObjectManager/_files/config_two.xml
index ec263ed2e08..eb792d5a5ed 100644
--- a/dev/tests/integration/testsuite/Magento/ObjectManager/_files/config_two.xml
+++ b/dev/tests/integration/testsuite/Magento/ObjectManager/_files/config_two.xml
@@ -23,27 +23,19 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <preference for="Magento\Module\UpdaterInterfaceTwo" type="Magento\Module\UpdaterTwo" />
     <preference for="Magento\Module\UpdaterInterface" type="Magento\Module\UpdaterOne" />
     <type name="Magento\App\Arguments\Loader" shared="false">
-        <param name="customFile">
-            <value type="argument">Magento\App\Arguments\Loader::PARAM_CUSTOM_FILE</value>
-        </param>
-        <param name="newParam">
-            <value>paramValue</value>
-        </param>
-        <param name="customConfig">
-            <instance shared="false" type="Magento\Core\Model\Config\Storage\Modules" />
-        </param>
-        <param name="customValue">
-            <value>someCustomValue</value>
-        </param>
-        <param name="customComplexValue">
-            <array>
-                <item key="three"><value>three</value></item>
-            </array>
-        </param>
+        <arguments>
+            <argument name="customFile" xsi:type="init_parameter">Magento\App\Arguments\Loader::PARAM_CUSTOM_FILE</argument>
+            <argument name="newParam" xsi:type="string">paramValue</argument>
+            <argument name="customConfig" xsi:type="object" shared="false">Magento\Core\Model\Config\Storage\Modules</argument>
+            <argument name="customValue" xsi:type="string">someCustomValue</argument>
+            <argument name="customComplexValue" xsi:type="array">
+                <item name="three" xsi:type="string">three</item>
+            </argument>
+        </arguments>
         <plugin name="three" type="somePluginThree"/>
         <plugin name="two" type="somePluginTwo" sortOrder="20" disabled="true"/>
         <plugin name="one" sortOrder="800"/>
@@ -54,24 +46,18 @@
         <plugin name="one" sortOrder="800"/>
     </virtualType>
     <type name="Magento\Data\Collection\Db\FetchStrategy\Cache">
-        <param name="cacheTags">
-            <array>
-                <item key="const"><value type="const">Magento\Core\Model\Website::CACHE_TAG</value></item>
-                <item key="boolFalse"><value type="bool">1</value></item>
-                <item key="boolTrue"><value type="int">10</value></item>
-                <item key="boolOne"><value type="string" pattern="[0-9]*">1</value></item>
-                <item key="boolZero"><value type="bool">0</value></item>
-                <item key="stringPattern"><value pattern="[a-zA-Z\-]*">Az-Value</value></item>
-            </array>
-        </param>
-        <param name="constParam">
-            <value type='const'>Magento\Core\Model\Website::CACHE_TAG</value>
-        </param>
-        <param name="boolFalseParam">
-            <value type='int'>100</value>
-        </param>
-        <param name="nullValueParam">
-            <value type='bool'>true</value>
-        </param>
+        <arguments>
+            <argument name="cacheTags" xsi:type="array">
+                <item name="const" xsi:type="const">Magento\Core\Model\Website::CACHE_TAG</item>
+                <item name="boolFalse" xsi:type="boolean">1</item>
+                <item name="boolTrue" xsi:type="number">10</item>
+                <item name="boolOne" xsi:type="string">1</item>
+                <item name="boolZero" xsi:type="boolean">0</item>
+                <item name="stringPattern" xsi:type="string">Az-Value</item>
+            </argument>
+            <argument name="constParam" xsi:type="const">Magento\Core\Model\Website::CACHE_TAG</argument>
+            <argument name="boolFalseParam" xsi:type="number">100</argument>
+            <argument name="nullValueParam" xsi:type="boolean">true</argument>
+        </arguments>
     </type>
 </config>
diff --git a/dev/tests/integration/testsuite/Magento/Paypal/_files/quote_payment_express.php b/dev/tests/integration/testsuite/Magento/Paypal/_files/quote_payment_express.php
index b2302125d6a..a8898e03ffe 100644
--- a/dev/tests/integration/testsuite/Magento/Paypal/_files/quote_payment_express.php
+++ b/dev/tests/integration/testsuite/Magento/Paypal/_files/quote_payment_express.php
@@ -41,7 +41,7 @@ $product->setTypeId('simple')
     'is_in_stock' => 100,
 ))
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->save();
 $product->load(1);
 
diff --git a/dev/tests/integration/testsuite/Magento/Paypal/_files/quote_payment_payflow.php b/dev/tests/integration/testsuite/Magento/Paypal/_files/quote_payment_payflow.php
index 4720824eee3..999893f20e7 100644
--- a/dev/tests/integration/testsuite/Magento/Paypal/_files/quote_payment_payflow.php
+++ b/dev/tests/integration/testsuite/Magento/Paypal/_files/quote_payment_payflow.php
@@ -40,7 +40,7 @@ $product->setTypeId('simple')
     'is_in_stock' => 100,
 ))
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->save();
 $product->load(1);
 
diff --git a/dev/tests/integration/testsuite/Magento/Paypal/_files/quote_payment_standard.php b/dev/tests/integration/testsuite/Magento/Paypal/_files/quote_payment_standard.php
index 6ee7a529f2b..49498482c6c 100644
--- a/dev/tests/integration/testsuite/Magento/Paypal/_files/quote_payment_standard.php
+++ b/dev/tests/integration/testsuite/Magento/Paypal/_files/quote_payment_standard.php
@@ -39,7 +39,7 @@ $product->setTypeId('simple')
     'is_in_stock' => 100,
 ))
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->save();
 $product->load(1);
 
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/order_info.php b/dev/tests/integration/testsuite/Magento/Sales/_files/order_info.php
index 569f470bfab..aab5b5e89bd 100644
--- a/dev/tests/integration/testsuite/Magento/Sales/_files/order_info.php
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/order_info.php
@@ -43,7 +43,7 @@ $product->setTypeId('virtual')
         'is_in_stock' => 100,
     ))
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->save();
 $product->load(1);
 
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/quote.php b/dev/tests/integration/testsuite/Magento/Sales/_files/quote.php
index 635d8944b55..4b7c88b47b2 100644
--- a/dev/tests/integration/testsuite/Magento/Sales/_files/quote.php
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/quote.php
@@ -45,7 +45,7 @@ $product->setTypeId('simple')
     ->setMetaKeyword('meta keyword')
     ->setMetaDescription('meta description')
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->save();
 $product->load(1);
 
diff --git a/dev/tests/integration/testsuite/Magento/Sitemap/_files/sitemap_products.php b/dev/tests/integration/testsuite/Magento/Sitemap/_files/sitemap_products.php
index ced8e7a0928..a9fe098b548 100644
--- a/dev/tests/integration/testsuite/Magento/Sitemap/_files/sitemap_products.php
+++ b/dev/tests/integration/testsuite/Magento/Sitemap/_files/sitemap_products.php
@@ -49,7 +49,7 @@ $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
     ->setSku('simple_no_images')
     ->setPrice(10)
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->setWebsiteIds(array(1))
     ->setStockData(array('qty' => 100, 'is_in_stock' => 1))
     ->save();
@@ -63,7 +63,7 @@ $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
     ->setSku('simple_invisible')
     ->setPrice(10)
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_NOT_VISIBLE)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->setWebsiteIds(array(1))
     ->setStockData(array('qty' => 100, 'is_in_stock' => 1))
     ->setRelatedLinkData(array(1 => array('position' => 1)))
@@ -78,7 +78,7 @@ $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
     ->setSku('simple_disabled')
     ->setPrice(10)
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_DISABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_DISABLED)
     ->setWebsiteIds(array(1))
     ->setStockData(array('qty' => 100, 'is_in_stock' => 1))
     ->setRelatedLinkData(array(1 => array('position' => 1)))
@@ -93,7 +93,7 @@ $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
     ->setSku('simple_with_images')
     ->setPrice(10)
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->setImage('/s/e/second_image.png')
     ->setSmallImage('/m/a/magento_image_sitemap.png')
     ->setThumbnail('/m/a/magento_image_sitemap.png')
@@ -113,7 +113,7 @@ $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
     ->setSku('simple_with_images')
     ->setPrice(10)
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->setImage('no_selection')
     ->setSmallImage('/m/a/magento_image_sitemap.png')
     ->setThumbnail('no_selection')
diff --git a/dev/tests/integration/testsuite/Magento/Tax/Model/ClassTest.php b/dev/tests/integration/testsuite/Magento/Tax/Model/ClassTest.php
index adbda68ba73..5f137be874a 100644
--- a/dev/tests/integration/testsuite/Magento/Tax/Model/ClassTest.php
+++ b/dev/tests/integration/testsuite/Magento/Tax/Model/ClassTest.php
@@ -66,7 +66,7 @@ class ClassTest extends \PHPUnit_Framework_TestCase
             ->setName('Simple Product')->setSku(uniqid())->setPrice(10)
             ->setMetaTitle('meta title')->setMetaKeyword('meta keyword')->setMetaDescription('meta description')
             ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-            ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+            ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
             ->setTaxClassId($model->getId())
             ->save();
 
diff --git a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/LayoutFilesTest.php b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/LayoutFilesTest.php
index 36c7ea13e54..a76776ed0fb 100644
--- a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/LayoutFilesTest.php
+++ b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/LayoutFilesTest.php
@@ -18,9 +18,6 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Core
- * @subpackage  integration_tests
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
@@ -30,46 +27,45 @@ namespace Magento\Test\Integrity\Modular;
 class LayoutFilesTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \Magento\View\Layout\Argument\HandlerFactory
+     * @var \Magento\View\Layout\Argument\Parser
      */
-    protected $_handlerFactory;
+    protected $_argParser;
 
     /**
-     * @var array
+     * @var \Magento\Data\Argument\InterpreterInterface
      */
-    protected $_types;
+    protected $_argInterpreter;
 
     protected function setUp()
     {
         $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
-        $this->_handlerFactory = $objectManager->get('Magento\View\Layout\Argument\HandlerFactory');
-        $this->_types = $this->_handlerFactory->getTypes();
+        $this->_argParser = $objectManager->get('Magento\View\Layout\Argument\Parser');
+        $this->_argInterpreter = $objectManager->get('layoutArgumentInterpreter');
     }
 
     /**
-     * @dataProvider layoutTypesDataProvider
+     * @param string $area
+     * @param string $layoutFile
+     * @dataProvider layoutArgumentsDataProvider
      */
-    public function testLayoutTypes($area, $layout)
+    public function testLayoutArguments($area, $layoutFile)
     {
         \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\Core\Model\App')->loadArea($area);
-        $layout = simplexml_load_file(
-            $layout,
-            'Magento\View\Layout\Element'
-        );
-        foreach ($layout->xpath('//*[@xsi:type]') as $argument) {
-            $type = (string)$argument->attributes('xsi', true)->type;
-            if (!in_array($type, $this->_types)) {
-                continue;
-            }
+        $dom = new \DOMDocument();
+        $dom->load($layoutFile);
+        $xpath = new \DOMXPath($dom);
+        $argumentNodes = $xpath->query('/layout//arguments/argument | /layout//action/argument');
+        /** @var \DOMNode $argumentNode */
+        foreach ($argumentNodes as $argumentNode) {
             try {
-                /* @var $handler \Magento\View\Layout\Argument\HandlerInterface */
-                $handler = $this->_handlerFactory->getArgumentHandlerByType($type);
-                $argument = $handler->parse($argument);
-                if ($this->_isIgnored($argument)) {
+                $argumentData = $this->_argParser->parse($argumentNode);
+                if ($this->isSkippedArgument($argumentData)) {
                     continue;
                 }
-                $handler->process($argument);
-            } catch (\InvalidArgumentException $e) {
+                $this->_argInterpreter->evaluate($argumentData);
+            } catch (\Magento\Data\Argument\MissingOptionalValueException $e) {
+                // Argument value is missing in the testing environment, but it's optional, so no big deal
+            } catch (\Exception $e) {
                 $this->fail($e->getMessage());
             }
         }
@@ -78,51 +74,55 @@ class LayoutFilesTest extends \PHPUnit_Framework_TestCase
     /**
      * @return array
      */
-    public function layoutTypesDataProvider()
+    public function layoutArgumentsDataProvider()
     {
         $areas = array('adminhtml', 'frontend', 'install', 'email');
         $data = array();
         foreach ($areas as $area) {
             $layoutFiles = \Magento\TestFramework\Utility\Files::init()->getLayoutFiles(array('area' => $area), false);
             foreach ($layoutFiles as $layoutFile) {
-                $data[] = array($area, $layoutFile);
+                $data[$layoutFile] = array($area, $layoutFile);
             }
         }
         return $data;
     }
 
     /**
-     * @param $argument
+     * Whether an argument should be skipped, because it cannot be evaluated in the testing environment
+     *
+     * @param array $argumentData
      * @return bool
      */
-    protected function _isIgnored($argument)
+    protected function isSkippedArgument(array $argumentData)
     {
-        return
-            // we can't process updaters without value
-            !isset($argument['value']) && isset($argument['updaters'])
+        // Do not take into account argument name and parameters
+        unset($argumentData['name']);
+        unset($argumentData['param']);
 
-            // ignored objects
-            || isset($argument['value']['object'])
-                && in_array($argument['value']['object'], array(
-                    'Magento\GroupedProduct\Model\Resource\Product\Type\Grouped\AssociatedProductsCollection',
-                    'Magento\Catalog\Model\Resource\Product\Collection\AssociatedProduct',
-                    'Magento\Search\Model\Resource\Search\Grid\Collection',
-                    'Magento\Wishlist\Model\Resource\Item\Collection\Grid',
-                    'Magento\CustomerSegment\Model\Resource\Segment\Report\Detail\Collection',
-                ))
+        $isUpdater = isset($argumentData['updater']);
+        unset($argumentData['updater']);
+
+        // Arguments, evaluation of which causes a run-time error, because of unsafe assumptions to the environment
+        $typeAttr = \Magento\Core\Model\Layout\Merge::TYPE_ATTRIBUTE;
+        $ignoredArguments = array(
+            array($typeAttr => 'object',
+                'value' => 'Magento\GroupedProduct\Model\Resource\Product\Type\Grouped\AssociatedProductsCollection'),
+            array($typeAttr => 'object',
+                'value' => 'Magento\ConfigurableProduct\Model\Resource\Product\Collection\AssociatedProduct'),
+            array($typeAttr => 'object', 'value' => 'Magento\Search\Model\Resource\Search\Grid\Collection'),
+            array($typeAttr => 'object', 'value' => 'Magento\Wishlist\Model\Resource\Item\Collection\Grid'),
+            array($typeAttr => 'object',
+                'value' => 'Magento\CustomerSegment\Model\Resource\Segment\Report\Detail\Collection'),
+            array($typeAttr => 'helper', 'helper' => 'Magento\Pbridge\Helper\Data::getReviewButtonTemplate'),
+            array($typeAttr => 'options', 'model' => 'Magento\Search\Model\Adminhtml\Search\Grid\Options'),
+            array($typeAttr => 'options', 'model' => 'Magento\Logging\Model\Resource\Grid\ActionsGroup'),
+            array($typeAttr => 'options', 'model' => 'Magento\Logging\Model\Resource\Grid\Actions'),
+        );
+        $isIgnoredArgument = in_array($argumentData, $ignoredArguments, true);
 
-            // ignored helpers
-            || isset($argument['value']['helperClass']) &&
-                in_array($argument['value']['helperClass'] . '::' . $argument['value']['helperMethod'], array(
-                    'Magento\Pbridge\Helper\Data::getReviewButtonTemplate'
-                ))
+        unset($argumentData[$typeAttr]);
+        $hasValue = !empty($argumentData);
 
-            // ignored options
-            || isset($argument['value']['model'])
-                && in_array($argument['value']['model'], array(
-                    'Magento\Search\Model\Adminhtml\Search\Grid\Options',
-                    'Magento\Logging\Model\Resource\Grid\ActionsGroup',
-                    'Magento\Logging\Model\Resource\Grid\Actions',
-                ));
+        return $isIgnoredArgument || ($isUpdater && !$hasValue);
     }
 }
diff --git a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/RouteConfigFilesTest.php b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/RouteConfigFilesTest.php
index c6136d16b72..3e942817be4 100644
--- a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/RouteConfigFilesTest.php
+++ b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/RouteConfigFilesTest.php
@@ -74,7 +74,7 @@ class RouteConfigFilesTest extends \PHPUnit_Framework_TestCase
         foreach ($files as $file) {
             $content = file_get_contents($file);
             try {
-                new \Magento\Config\Dom($content, $this->_idAttributes, $this->_schemaFile);
+                new \Magento\Config\Dom($content, $this->_idAttributes, null, $this->_schemaFile);
 
                 //merge won't be performed if file is invalid because of exception thrown
                 $mergedConfig->merge($content);
diff --git a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/CircularTest.php b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/CircularTest.php
new file mode 100644
index 00000000000..b8f8714dd45
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/CircularTest.php
@@ -0,0 +1,60 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Test\Tools\Dependency;
+
+use Magento\Tools\Dependency\Circular;
+
+class CircularTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Tools\Dependency\Circular
+     */
+    protected $circular;
+
+    protected function setUp()
+    {
+        $this->circular = new Circular();
+    }
+
+    public function testBuildCircularDependencies()
+    {
+        $dependencies = [
+            1 => [2],
+            2 => [3, 5],
+            3 => [1],
+            5 => [2],
+        ];
+        $expectedCircularDependencies = [
+            1 => [[1, 2, 3, 1]],
+            2 => [
+                [2, 3, 1, 2],
+                [2, 5, 2],
+            ],
+            3 => [[3, 1, 2, 3]],
+            5 => [[5, 2, 5]],
+        ];
+        $this->assertEquals($expectedCircularDependencies, $this->circular->buildCircularDependencies($dependencies));
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/Parser/Config/XmlTest.php b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/Parser/Config/XmlTest.php
new file mode 100644
index 00000000000..5c98b5672c6
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/Parser/Config/XmlTest.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Test\Tools\Dependency\Parser\Config;
+
+use Magento\Tools\Dependency\Parser\Config\Xml;
+
+class XmlTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var string
+     */
+    protected $fixtureDir;
+
+    /**
+     * @var \Magento\Tools\Dependency\Parser\Config
+     */
+    protected $parser;
+
+    protected function setUp()
+    {
+        $this->fixtureDir = realpath(__DIR__ . '/../../_files') . '/';
+
+        $this->parser = new Xml();
+    }
+
+    public function testParse()
+    {
+        $expected = [
+            ['name' => 'Module1', 'dependencies' => [
+                ['module' => 'Magento\Core', 'type' => ''],
+                ['module' => 'Magento\Backend', 'type' => 'soft'],
+                ['module' => 'Module1', 'type' => ''],
+            ]],
+            ['name' => 'Module2', 'dependencies' => [
+                ['module' => 'Magento\Core', 'type' => ''],
+                ['module' => 'Module2', 'type' => ''],
+            ]],
+        ];
+
+        $actual = $this->parser->parse([
+            'files_for_parse' => [
+                $this->fixtureDir . 'config1.xml',
+                $this->fixtureDir . 'config2.xml',
+            ],
+        ]);
+
+        $this->assertEquals($expected, $actual);
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/Report/CircularTest.php b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/Report/CircularTest.php
new file mode 100644
index 00000000000..2a378456262
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/Report/CircularTest.php
@@ -0,0 +1,99 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Test\Tools\Dependency\Report;
+
+use Magento\Tools\Dependency\ServiceLocator;
+
+class CircularTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var string
+     */
+    protected $fixtureDir;
+
+    /**
+     * @var string
+     */
+    protected $sourceFilename;
+
+    /**
+     * @var \Magento\Tools\Dependency\Report\BuilderInterface
+     */
+    protected $builder;
+
+    protected function setUp()
+    {
+        $this->fixtureDir = realpath(__DIR__ . '/../_files') . '/';
+        $this->sourceFilename = $this->fixtureDir . 'circular-dependencies.csv';
+
+        $this->builder = ServiceLocator::getCircularDependenciesReportBuilder();
+    }
+
+    public function testBuild()
+    {
+        $this->builder->build([
+            'parse' => [
+                'files_for_parse' => [
+                    $this->fixtureDir . 'config4.xml',
+                    $this->fixtureDir . 'config5.xml',
+                ],
+            ],
+            'write' => [
+                'report_filename' => $this->sourceFilename,
+            ],
+        ]);
+
+        $this->assertFileEquals(
+            $this->fixtureDir . 'expected/circular-dependencies.csv',
+            $this->sourceFilename
+        );
+    }
+
+    public function testBuildWithoutDependencies()
+    {
+        $this->builder->build([
+            'parse' => [
+                'files_for_parse' => [
+                    $this->fixtureDir . 'config3.xml',
+                ],
+            ],
+            'write' => [
+                'report_filename' => $this->sourceFilename,
+            ],
+        ]);
+
+        $this->assertFileEquals(
+            $this->fixtureDir . 'expected/without-circular-dependencies.csv',
+            $this->sourceFilename
+        );
+    }
+
+    public function tearDown()
+    {
+        if (file_exists($this->sourceFilename)) {
+            unlink($this->sourceFilename);
+        }
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/Report/DependencyTest.php b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/Report/DependencyTest.php
new file mode 100644
index 00000000000..42dda6fbf62
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/Report/DependencyTest.php
@@ -0,0 +1,99 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Test\Tools\Dependency\Report;
+
+use Magento\Tools\Dependency\ServiceLocator;
+
+class DependencyTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var string
+     */
+    protected $fixtureDir;
+
+    /**
+     * @var string
+     */
+    protected $sourceFilename;
+
+    /**
+     * @var \Magento\Tools\Dependency\Report\BuilderInterface
+     */
+    protected $builder;
+
+    protected function setUp()
+    {
+        $this->fixtureDir = realpath(__DIR__ . '/../_files') . '/';
+        $this->sourceFilename = $this->fixtureDir . 'dependencies.csv';
+
+        $this->builder = ServiceLocator::getDependenciesReportBuilder();
+    }
+
+    public function testBuild()
+    {
+        $this->builder->build([
+            'parse' => [
+                'files_for_parse' => [
+                    $this->fixtureDir . 'config1.xml',
+                    $this->fixtureDir . 'config2.xml',
+                ],
+            ],
+            'write' => [
+                'report_filename' => $this->sourceFilename,
+            ],
+        ]);
+
+        $this->assertFileEquals(
+            $this->fixtureDir . 'expected/dependencies.csv',
+            $this->sourceFilename
+        );
+    }
+
+    public function testBuildWithoutDependencies()
+    {
+        $this->builder->build([
+            'parse' => [
+                'files_for_parse' => [
+                    $this->fixtureDir . 'config3.xml',
+                ],
+            ],
+            'write' => [
+                'report_filename' => $this->sourceFilename,
+            ],
+        ]);
+
+        $this->assertFileEquals(
+            $this->fixtureDir . 'expected/without-dependencies.csv',
+            $this->sourceFilename
+        );
+    }
+
+    public function tearDown()
+    {
+        if (file_exists($this->sourceFilename)) {
+            unlink($this->sourceFilename);
+        }
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/Report/FrameworkTest.php b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/Report/FrameworkTest.php
new file mode 100644
index 00000000000..a11f8f3c336
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/Report/FrameworkTest.php
@@ -0,0 +1,114 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Test\Tools\Dependency\Report;
+
+use Magento\Tools\Dependency\ServiceLocator;
+
+class FrameworkTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var string
+     */
+    protected $fixtureDir;
+
+    /**
+     * @var string
+     */
+    protected $fixtureDirModule;
+
+    /**
+     * @var string
+     */
+    protected $sourceFilename;
+
+    /**
+     * @var \Magento\Tools\Dependency\Report\BuilderInterface
+     */
+    protected $builder;
+
+    protected function setUp()
+    {
+        $this->fixtureDir = realpath(__DIR__ . '/../_files') . '/';
+        $this->fixtureDirModule = $this->fixtureDir . 'code/Magento/FirstModule/';
+        $this->sourceFilename = $this->fixtureDir . 'framework-dependencies.csv';
+
+        $this->builder = ServiceLocator::getFrameworkDependenciesReportBuilder();
+    }
+
+    public function testBuild()
+    {
+        $this->builder->build([
+            'parse' => [
+                'files_for_parse' => [
+                    $this->fixtureDirModule . 'Helper/Helper.php',
+                    $this->fixtureDirModule . 'Model/Model.php',
+                    $this->fixtureDirModule . 'view/frontend/template.phtml',
+                ],
+                'config_files' => [
+                    $this->fixtureDirModule . 'etc/module.xml',
+                ],
+                'declared_namespaces' => ['Magento'],
+            ],
+            'write' => [
+                'report_filename' => $this->sourceFilename,
+            ],
+        ]);
+
+        $this->assertFileEquals(
+            $this->fixtureDir . 'expected/framework-dependencies.csv',
+            $this->sourceFilename
+        );
+    }
+
+    public function testBuildWithoutDependencies()
+    {
+        $this->builder->build([
+            'parse' => [
+                'files_for_parse' => [
+                    $this->fixtureDirModule . 'Model/WithoutDependencies.php',
+                ],
+                'config_files' => [
+                    $this->fixtureDirModule . 'etc/module.xml',
+                ],
+                'declared_namespaces' => ['Magento'],
+            ],
+            'write' => [
+                'report_filename' => $this->sourceFilename,
+            ],
+        ]);
+
+        $this->assertFileEquals(
+            $this->fixtureDir . 'expected/without-framework-dependencies.csv',
+            $this->sourceFilename
+        );
+    }
+
+    public function tearDown()
+    {
+        if (file_exists($this->sourceFilename)) {
+            unlink($this->sourceFilename);
+        }
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/code/Magento/FirstModule/Helper/Helper.php b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/code/Magento/FirstModule/Helper/Helper.php
new file mode 100644
index 00000000000..c3120c65fee
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/code/Magento/FirstModule/Helper/Helper.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright  Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\FirstModule\Helper;
+
+class Helper
+{
+    /**
+     * @return void
+     */
+    public function test()
+    {
+        new Magento\LibFirst();
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/code/Magento/FirstModule/Model/Model.php b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/code/Magento/FirstModule/Model/Model.php
new file mode 100644
index 00000000000..09298c84d69
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/code/Magento/FirstModule/Model/Model.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright  Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\FirstModule\Model;
+
+use Magento\LibSecond;
+
+class Model
+{
+    /**
+     * @use Magento\LibSecond()
+     */
+    public function test()
+    {
+        new LibSecond();
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/code/Magento/FirstModule/Model/WithoutDependencies.php b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/code/Magento/FirstModule/Model/WithoutDependencies.php
new file mode 100644
index 00000000000..a8c288d56fb
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/code/Magento/FirstModule/Model/WithoutDependencies.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright  Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\FirstModule\Model;
+
+class WithoutDependencies
+{
+    /**
+     * @return void
+     */
+    public function test()
+    {
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/code/Magento/FirstModule/etc/module.xml b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/code/Magento/FirstModule/etc/module.xml
new file mode 100644
index 00000000000..d65ef13b0af
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/code/Magento/FirstModule/etc/module.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<config>
+    <module name="Magento_FirstModule"/>
+</config>
diff --git a/app/code/Magento/Shipping/view/adminhtml/view/items/renderer/configurable.phtml b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/code/Magento/FirstModule/view/frontend/template.phtml
similarity index 78%
rename from app/code/Magento/Shipping/view/adminhtml/view/items/renderer/configurable.phtml
rename to dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/code/Magento/FirstModule/view/frontend/template.phtml
index 76b967c8673..a0e34da4d5e 100644
--- a/app/code/Magento/Shipping/view/adminhtml/view/items/renderer/configurable.phtml
+++ b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/code/Magento/FirstModule/view/frontend/template.phtml
@@ -18,14 +18,9 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    design
- * @package     default_default
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 ?>
-<?php $_item = $this->getItem() ?>
-<tr class="border">
-    <td><?php echo $this->getColumnHtml($_item, 'configurable_name') ?></td>
-    <td class="col-qty last"><?php echo $_item->getQty()*1 ?></td>
-</tr>
+<?php new Magento\Third();
+
diff --git a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/config1.xml b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/config1.xml
new file mode 100644
index 00000000000..3d1afade471
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/config1.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<config>
+    <module name="Module1">
+        <depends>
+            <module name="Magento_Core"/>
+            <module name="Magento_Backend" type="soft"/>
+            <module name="Module1"/>
+        </depends>
+    </module>
+</config>
diff --git a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/config2.xml b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/config2.xml
new file mode 100644
index 00000000000..e2852285c85
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/config2.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<config>
+    <module name="Module2">
+        <depends>
+            <module name="Magento_Core"/>
+            <module name="Module2"/>
+        </depends>
+    </module>
+</config>
diff --git a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/config3.xml b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/config3.xml
new file mode 100644
index 00000000000..291eb435411
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/config3.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<config>
+    <module name="Module1">
+    </module>
+</config>
diff --git a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/config4.xml b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/config4.xml
new file mode 100644
index 00000000000..78f1d22f531
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/config4.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<config>
+    <module name="Module1">
+        <depends>
+            <module name="Module2"/>
+        </depends>
+    </module>
+</config>
diff --git a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/config5.xml b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/config5.xml
new file mode 100644
index 00000000000..8d6ab56f383
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/config5.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<config>
+    <module name="Module2">
+        <depends>
+            <module name="Module1"/>
+        </depends>
+    </module>
+</config>
diff --git a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/expected/circular-dependencies.csv b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/expected/circular-dependencies.csv
new file mode 100644
index 00000000000..9cf6e39a1f7
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/expected/circular-dependencies.csv
@@ -0,0 +1,9 @@
+"Circular dependencies:";"Total number of chains"
+"";"2"
+
+"Circular dependencies for each module:";""
+"Module1";"1"
+"Module1->Module2->Module1"
+
+"Module2";"1"
+"Module2->Module1->Module2"
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
new file mode 100644
index 00000000000..9ec6543a248
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/expected/dependencies.csv
@@ -0,0 +1,12 @@
+"";"All";"Hard";"Soft"
+"Total number of dependencies";"5";"4";"1"
+
+"Dependencies for each module:";"All";"Hard";"Soft"
+"Module1";"3";"2";"1"
+" -- Magento\Core";"";"1";"0"
+" -- Magento\Backend";"";"0";"1"
+" -- Module1";"";"1";"0"
+
+"Module2";"2";"2";"0"
+" -- Magento\Core";"";"1";"0"
+" -- Module2";"";"1";"0"
diff --git a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/expected/framework-dependencies.csv b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/expected/framework-dependencies.csv
new file mode 100644
index 00000000000..d20a242e069
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/expected/framework-dependencies.csv
@@ -0,0 +1,8 @@
+"Dependencies of framework:";"Total number"
+"";"3"
+
+"Dependencies for each module:";""
+"Magento\FirstModule";"3"
+" -- Magento\LibFirst";"1"
+" -- Magento\LibSecond";"2"
+" -- Magento\Third";"1"
diff --git a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/expected/without-circular-dependencies.csv b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/expected/without-circular-dependencies.csv
new file mode 100644
index 00000000000..2861dd888e2
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/expected/without-circular-dependencies.csv
@@ -0,0 +1,2 @@
+"Circular dependencies:";"Total number of chains"
+"";"0"
diff --git a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/expected/without-dependencies.csv b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/expected/without-dependencies.csv
new file mode 100644
index 00000000000..a1ca40ac82b
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/expected/without-dependencies.csv
@@ -0,0 +1,2 @@
+"";"All";"Hard";"Soft"
+"Total number of dependencies";"0";"0";"0"
diff --git a/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/expected/without-framework-dependencies.csv b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/expected/without-framework-dependencies.csv
new file mode 100644
index 00000000000..71bbbf84978
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/expected/without-framework-dependencies.csv
@@ -0,0 +1,2 @@
+"Dependencies of framework:";"Total number"
+"";"0"
diff --git a/dev/tests/integration/testsuite/Magento/Usa/Block/Adminhtml/Dhl/UnitofmeasureTest.php b/dev/tests/integration/testsuite/Magento/Usa/Block/Adminhtml/Dhl/UnitofmeasureTest.php
index 2871e1bdf35..061234bcc03 100644
--- a/dev/tests/integration/testsuite/Magento/Usa/Block/Adminhtml/Dhl/UnitofmeasureTest.php
+++ b/dev/tests/integration/testsuite/Magento/Usa/Block/Adminhtml/Dhl/UnitofmeasureTest.php
@@ -34,11 +34,6 @@ class UnitofmeasureTest extends \PHPUnit_Framework_TestCase
      */
     public function testToHtml()
     {
-        \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->configure(array(
-            'Magento\Core\Model\Layout' => array(
-                'parameters' => array('area' => 'adminhtml')
-            )
-        ));
         /** @var $layout \Magento\Core\Model\Layout */
         $layout = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\View\LayoutInterface');
         /** @var $block \Magento\Usa\Block\Adminhtml\Dhl\Unitofmeasure */
diff --git a/dev/tests/integration/testsuite/Magento/Weee/Model/ObserverTest.php b/dev/tests/integration/testsuite/Magento/Weee/Model/ObserverTest.php
index d17436eef72..e55332b5557 100644
--- a/dev/tests/integration/testsuite/Magento/Weee/Model/ObserverTest.php
+++ b/dev/tests/integration/testsuite/Magento/Weee/Model/ObserverTest.php
@@ -44,13 +44,13 @@ class ObserverTest extends \PHPUnit_Framework_TestCase
      * @magentoConfigFixture current_store tax/weee/enable 1
      * @magentoDataFixture Magento/Weee/_files/product_with_fpt.php
      */
-    public function testUpdateConfigurableProductOptions()
+    public function testUpdateProductOptions()
     {
         /** @var $objectManager \Magento\TestFramework\ObjectManager */
         $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
         $objectManager->get('Magento\Core\Model\Registry')->unregister('current_product');
         $eventObserver = $this->_createEventObserverForUpdateConfigurableProductOptions();
-        $this->_model->updateConfigurableProductOptions($eventObserver);
+        $this->_model->updateProductOptions($eventObserver);
         $this->assertEquals(array(), $eventObserver->getEvent()->getResponseObject()->getAdditionalOptions());
 
         $product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
@@ -61,7 +61,7 @@ class ObserverTest extends \PHPUnit_Framework_TestCase
             \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\Core\Model\StoreManagerInterface')
                 ->getStore()->setConfig('tax/weee/display', $mode);
             $eventObserver = $this->_createEventObserverForUpdateConfigurableProductOptions();
-            $this->_model->updateConfigurableProductOptions($eventObserver);
+            $this->_model->updateProductOptions($eventObserver);
             $this->assertEquals(
                 array('oldPlusDisposition' => 0.07, 'plusDisposition' => 0.07),
                 $eventObserver->getEvent()->getResponseObject()->getAdditionalOptions()
@@ -73,7 +73,7 @@ class ObserverTest extends \PHPUnit_Framework_TestCase
             \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\Core\Model\StoreManagerInterface')
                 ->getStore()->setConfig('tax/weee/display', $mode);
             $eventObserver = $this->_createEventObserverForUpdateConfigurableProductOptions();
-            $this->_model->updateConfigurableProductOptions($eventObserver);
+            $this->_model->updateProductOptions($eventObserver);
             $this->assertEquals(
                 array('oldPlusDisposition' => 0.07, 'plusDisposition' => 0.07, 'exclDisposition' => true),
                 $eventObserver->getEvent()->getResponseObject()->getAdditionalOptions()
diff --git a/dev/tests/performance/framework/Magento/TestFramework/Application.php b/dev/tests/performance/framework/Magento/TestFramework/Application.php
index 1db471fe515..ca0783e2f44 100644
--- a/dev/tests/performance/framework/Magento/TestFramework/Application.php
+++ b/dev/tests/performance/framework/Magento/TestFramework/Application.php
@@ -137,6 +137,10 @@ class Application
         $this->_shell->execute(
             'php -f ' . $this->_config->getApplicationBaseDir() . '/dev/shell/indexer.php -- reindexall'
         );
+        // TODO: remove once Magento\Index module is completely removed (MAGETWO-18168)
+        $this->_shell->execute(
+            'php -f ' . $this->_config->getApplicationBaseDir() . '/dev/shell/newindexer.php -- reindexall'
+        );
         return $this;
     }
 
diff --git a/dev/tests/performance/framework/tests/unit/testsuite/Magento/Test/ApplicationTest.php b/dev/tests/performance/framework/tests/unit/testsuite/Magento/Test/ApplicationTest.php
index fccdc7b5aa5..671b2ef9e22 100644
--- a/dev/tests/performance/framework/tests/unit/testsuite/Magento/Test/ApplicationTest.php
+++ b/dev/tests/performance/framework/tests/unit/testsuite/Magento/Test/ApplicationTest.php
@@ -232,7 +232,7 @@ class ApplicationTest extends \PHPUnit_Framework_TestCase
      */
     public function testApplyFixturesSuperSetNoInstallation()
     {
-        $this->_shell->expects($this->exactly(5)) // Initial uninstall/install only
+        $this->_shell->expects($this->exactly(8)) // Initial uninstall/install only
             ->method('execute');
 
         $fixture1 = $this->_getFixtureFiles(array('fixture1'));
@@ -254,11 +254,11 @@ class ApplicationTest extends \PHPUnit_Framework_TestCase
             ->method('execute')
             ->with($this->logicalNot($this->stringContains('--uninstall')), $this->contains($this->_installerScript));
 
-        $this->_shell->expects($this->at(4))
+        $this->_shell->expects($this->at(6))
             ->method('execute')
             ->with($this->stringContains('--uninstall'), $this->contains($this->_installerScript));
 
-        $this->_shell->expects($this->at(5))
+        $this->_shell->expects($this->at(7))
             ->method('execute')
             ->with($this->logicalNot($this->stringContains('--uninstall')), $this->contains($this->_installerScript));
 
diff --git a/dev/tests/performance/framework/tests/unit/testsuite/Magento/Test/Performance/TestsuiteTest.php b/dev/tests/performance/framework/tests/unit/testsuite/Magento/Test/Performance/TestsuiteTest.php
index 6f13f0bb663..ccf5d1aa7f4 100644
--- a/dev/tests/performance/framework/tests/unit/testsuite/Magento/Test/Performance/TestsuiteTest.php
+++ b/dev/tests/performance/framework/tests/unit/testsuite/Magento/Test/Performance/TestsuiteTest.php
@@ -199,9 +199,9 @@ class TestsuiteTest extends \PHPUnit_Framework_TestCase
         });
         $this->_object->run();
         $this->assertEquals(array(
-            $this->_fixtureDir . '/scenario_error.jmx',
-            $this->_fixtureDir . '/scenario_failure.jmx',
-            $this->_fixtureDir . '/scenario.jmx'
+            realpath($this->_fixtureDir . '/scenario_error.jmx'),
+            realpath($this->_fixtureDir . '/scenario_failure.jmx'),
+            realpath($this->_fixtureDir . '/scenario.jmx'),
         ), $notifications);
     }
 
diff --git a/dev/tests/performance/testsuite/fixtures/catalog_100k_products.php b/dev/tests/performance/testsuite/fixtures/catalog_100k_products.php
index cc2a57e1693..cddfa11839d 100644
--- a/dev/tests/performance/testsuite/fixtures/catalog_100k_products.php
+++ b/dev/tests/performance/testsuite/fixtures/catalog_100k_products.php
@@ -35,7 +35,7 @@ $pattern = array(
     'sku' => 'product_dynamic_%s',
     'price' => 10,
     'visibility' => \Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH,
-    'status' => \Magento\Catalog\Model\Product\Status::STATUS_ENABLED,
+    'status' => \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED,
     'tax_class_id' => 0,
 
     // actually it saves without stock data, but by default system won't show on the frontend products out of stock
diff --git a/dev/tests/performance/testsuite/fixtures/catalog_200_categories_80k_products.php b/dev/tests/performance/testsuite/fixtures/catalog_200_categories_80k_products.php
index c310e7ccd6b..d8614db1c90 100644
--- a/dev/tests/performance/testsuite/fixtures/catalog_200_categories_80k_products.php
+++ b/dev/tests/performance/testsuite/fixtures/catalog_200_categories_80k_products.php
@@ -85,7 +85,7 @@ $pattern = array(
     'sku' => 'product_dynamic_%s',
     'price' => 10,
     'visibility' => \Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH,
-    'status' => \Magento\Catalog\Model\Product\Status::STATUS_ENABLED,
+    'status' => \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED,
     'tax_class_id' => 0,
 
     // actually it saves without stock data, but by default system won't show on the frontend products out of stock
diff --git a/dev/tests/performance/testsuite/fixtures/catalog_category.php b/dev/tests/performance/testsuite/fixtures/catalog_category.php
index c63df9d796a..317b2bd688e 100644
--- a/dev/tests/performance/testsuite/fixtures/catalog_category.php
+++ b/dev/tests/performance/testsuite/fixtures/catalog_category.php
@@ -58,7 +58,7 @@ $product->setTypeId(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE)
     ->setWeight(18)
     ->setCategoryIds(array(2,3))
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->setTaxClassId(0)
     ->save();
 
diff --git a/dev/tests/performance/testsuite/fixtures/catalog_category_flat_enabled.php b/dev/tests/performance/testsuite/fixtures/catalog_category_flat_enabled.php
new file mode 100644
index 00000000000..20868353fbd
--- /dev/null
+++ b/dev/tests/performance/testsuite/fixtures/catalog_category_flat_enabled.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+/** @var \Magento\TestFramework\Application $this */
+
+/**
+ * @var \Magento\App\Config\ValueInterface $configData
+ */
+$configData = $this->getObjectManager()->create('Magento\App\Config\ValueInterface');
+$configData->setPath('catalog/frontend/flat_catalog_category')
+    ->setScope(\Magento\BaseScopeInterface::SCOPE_DEFAULT)
+    ->setScopeId(0)
+    ->setValue(1)
+    ->save();
+
+$this->getObjectManager()->get('Magento\App\CacheInterface')
+    ->clean(array(\Magento\App\Config::CACHE_TAG));
diff --git a/dev/tests/performance/testsuite/fixtures/catalog_product.php b/dev/tests/performance/testsuite/fixtures/catalog_product.php
index d5e3df1b5b5..c869ebd9371 100644
--- a/dev/tests/performance/testsuite/fixtures/catalog_product.php
+++ b/dev/tests/performance/testsuite/fixtures/catalog_product.php
@@ -55,7 +55,7 @@ $product->setTypeId('simple')
     ->setSku('product_1')
     ->setPrice(10)
     ->setVisibility(\Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
-    ->setStatus(\Magento\Catalog\Model\Product\Status::STATUS_ENABLED)
+    ->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
     ->setTaxClassId(0)
     ->save()
 ;
diff --git a/dev/tests/performance/testsuite/fixtures/catalog_product_flat_enabled.php b/dev/tests/performance/testsuite/fixtures/catalog_product_flat_enabled.php
new file mode 100644
index 00000000000..eca3ad7ae6f
--- /dev/null
+++ b/dev/tests/performance/testsuite/fixtures/catalog_product_flat_enabled.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+/** @var \Magento\TestFramework\Application $this */
+
+/**
+ * @var \Magento\App\Config\ValueInterface $configData
+ */
+$configData = $this->getObjectManager()->create('Magento\App\Config\ValueInterface');
+$configData->setPath('catalog/frontend/flat_catalog_product')
+    ->setScope(\Magento\BaseScopeInterface::SCOPE_DEFAULT)
+    ->setScopeId(0)
+    ->setValue(1)
+    ->save();
+
+$this->getObjectManager()->get('Magento\App\CacheInterface')
+    ->clean(array(\Magento\App\Config::CACHE_TAG));
diff --git a/dev/tests/static/testsuite/Magento/Test/Integrity/CircularDependencyTest.php b/dev/tests/static/testsuite/Magento/Test/Integrity/CircularDependencyTest.php
index d25c54e6460..9c3667cc079 100644
--- a/dev/tests/static/testsuite/Magento/Test/Integrity/CircularDependencyTest.php
+++ b/dev/tests/static/testsuite/Magento/Test/Integrity/CircularDependencyTest.php
@@ -28,6 +28,9 @@
  */
 namespace Magento\Test\Integrity;
 
+use Magento\TestFramework\Utility\Files;
+use Magento\Tools\Dependency\Circular;
+
 class CircularDependencyTest extends \PHPUnit_Framework_TestCase
 {
     /**
@@ -35,95 +38,46 @@ class CircularDependencyTest extends \PHPUnit_Framework_TestCase
      *
      * @var array
      */
-    protected $_moduleDependencies = array();
+    protected $moduleDependencies = array();
 
     /**
      * Circular dependencies
      *
      * @var array
      */
-    protected $_circularDepends = array();
+    protected $circularModuleDependencies = array();
+
+    public function setUp()
+    {
+        $this->buildModulesDependencies();
+        $this->buildCircularModulesDependencies();
+    }
 
     /**
      * Build modules dependencies
      */
-    protected function _buildModulesDependencies()
+    protected function buildModulesDependencies()
     {
-        if (!empty($this->_moduleDependencies)) {
-            return true;
-        }
-        $configFiles = \Magento\TestFramework\Utility\Files::init()->getConfigFiles('module.xml', array(), false);
+        $configFiles = Files::init()->getConfigFiles('module.xml', array(), false);
 
         foreach ($configFiles as $configFile) {
             preg_match('#/([^/]+?/[^/]+?)/etc/module\.xml$#', $configFile, $moduleName);
             $moduleName = str_replace('/', '_', $moduleName[1]);
             $config = simplexml_load_file($configFile);
-            $result = $config->xpath("/config/module/depends/module") ?: array();
-            while (list( , $node) = each($result)) {
+            $result = $config->xpath("/config/module/depends/module") ? : array();
+            while (list(, $node) = each($result)) {
                 /** @var \SimpleXMLElement $node */
-                $this->_moduleDependencies[$moduleName][] = (string)$node['name'];
-            }
-        }
-
-        $graph = new \Magento\Data\Graph(array_keys($this->_moduleDependencies), array());
-
-        foreach (array_keys($this->_moduleDependencies) as $module) {
-            $this->_expandDependencies($module, $graph);
-        }
-        $circulars  = $graph->findCycle(null, false);
-        foreach ($circulars as $circular) {
-            array_shift($circular);
-            $this->_buildCircular($circular);
-        }
-    }
-
-    /**
-     * Expand modules dependencies from modules chain
-     *
-     * @param string $module
-     * @param \Magento\Data\Graph $graph
-     * @param string $path nesting path
-     */
-    protected function _expandDependencies($module, \Magento\Data\Graph $graph, $path = '')
-    {
-        if (empty($this->_moduleDependencies[$module])) {
-            return;
-        }
-
-        $path .= '/' . $module;
-        foreach ($this->_moduleDependencies[$module] as $dependency) {
-            $relations = $graph->getRelations();
-            if (isset($relations[$module][$dependency])) {
-                continue;
-            }
-            $graph->addRelation($module, $dependency);
-
-            $modulesChain = explode('/', $path);
-            $searchResult = array_search($dependency, $modulesChain);
-
-            if (false !== $searchResult) {
-                $this->_buildCircular(array_slice($modulesChain, $searchResult));
-                return;
-            } else {
-                $this->_expandDependencies($dependency, $graph, $path);
+                $this->moduleDependencies[$moduleName][] = (string)$node['name'];
             }
         }
     }
 
     /**
-     * Build all circular dependencies based on chain
-     *
-     * @param array $modules
+     * Build circular modules dependencies
      */
-    protected function _buildCircular($modules)
+    protected function buildCircularModulesDependencies()
     {
-        $path = '/' . implode('/', $modules);
-        if (isset($this->_circularDepends[$path])) {
-            return;
-        }
-        $this->_circularDepends[$path] = $modules;
-        array_push($modules, array_shift($modules));
-        $this->_buildCircular($modules);
+        $this->circularModuleDependencies = (new Circular())->buildCircularDependencies($this->moduleDependencies);
     }
 
     /**
@@ -132,25 +86,16 @@ class CircularDependencyTest extends \PHPUnit_Framework_TestCase
     public function testCircularDependencies()
     {
         $this->markTestSkipped('Skipped before circular dependencies will be fixed MAGETWO-10938');
-        $dependenciesByModule = array();
-        $result = '';
-        $this->_buildModulesDependencies();
-        if (!empty($this->_circularDepends)) {
-            foreach ($this->_circularDepends as $circularDependency) {
-                $module =  array_shift($circularDependency);
-                array_push($circularDependency, $module);
-                $dependenciesByModule[$module][] = $circularDependency;
-
-            }
-        }
-
-        foreach ($dependenciesByModule as $module => $moduleCircular) {
-            $result .= "$module dependencies:" . PHP_EOL;
-            foreach ($moduleCircular as $chain) {
-                $result .= "Chain : " . implode('->', $chain) . PHP_EOL;
+        if ($this->circularModuleDependencies) {
+            $result = '';
+            foreach ($this->circularModuleDependencies as $module => $chains) {
+                $result .= $module . ' dependencies:' . PHP_EOL;
+                foreach ($chains as $chain) {
+                    $result .= 'Chain : ' . implode('->', $chain) . PHP_EOL;
+                }
+                $result .= PHP_EOL;
             }
-            $result .= PHP_EOL;
+            $this->fail('Circular dependencies:' . PHP_EOL . $result);
         }
-        $this->fail("Circular dependencies:" . PHP_EOL. $result);
     }
 }
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 779cb56c58c..9f57513e5c1 100644
--- a/dev/tests/static/testsuite/Magento/Test/Integrity/Di/CompilerTest.php
+++ b/dev/tests/static/testsuite/Magento/Test/Integrity/Di/CompilerTest.php
@@ -83,7 +83,10 @@ class CompilerTest extends \PHPUnit_Framework_TestCase
 
         $this->_command = 'php ' . $basePath
             . '/dev/tools/Magento/Tools/Di/compiler.php --generation=%s --di=%s';
-        $this->_mapper = new \Magento\ObjectManager\Config\Mapper\Dom();
+        $this->_mapper = new \Magento\ObjectManager\Config\Mapper\Dom(
+            new \Magento\Stdlib\BooleanUtils(),
+            new \Magento\ObjectManager\Config\Mapper\ArgumentParser()
+        );
         $this->_validator = new \Magento\Code\Validator();
         $this->_validator->add(new \Magento\Code\Validator\ConstructorIntegrity());
         $this->_validator->add(new \Magento\Code\Validator\ContextAggregation());
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 46b39e01a38..b8e9e2e76bb 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
@@ -65,3 +65,6 @@ dev/tests/unit/testsuite/Magento/Code/Reader/_files/ClassesForArgumentsReader.ph
 dev/tests/unit/testsuite/Magento/Code/Validator/_files/ClassesForArgumentSequence.php
 dev/tests/unit/testsuite/Magento/Code/Validator/_files/ClassesForTypeDuplication.php
 dev/tests/static/testsuite/Magento/Test/Php/_files/phpcs/Magento/Sniffs/Annotations/RequireAnnotatedMethodsSniff.php
+dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/code/Magento/FirstModule/Helper/Helper.php
+dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/code/Magento/FirstModule/Model/Model.php
+dev/tests/integration/testsuite/Magento/Test/Tools/Dependency/_files/code/Magento/FirstModule/Model/WithoutDependencies.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 2a23e999b3c..126b7949c0e 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
@@ -25,4 +25,5 @@ PEAR_Frontend
 PEAR_Command
 Zend
 PEAR_PackageFileManager2
-PEAR
\ No newline at end of file
+PEAR
+Magento\LibFirst
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 d71f5d9ac12..78e01e15a47 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
@@ -53,17 +53,9 @@ return array (
     'catalog_product_bundle_stock_index' => 'Magento_Bundle',
     'captcha_log' => 'Magento_Captcha',
     'catalog_category_entity' => 'Magento_Catalog',
-    'catalog_category_anc_categs_index_idx' => 'Magento_Catalog',
-    'catalog_category_anc_categs_index_tmp' => 'Magento_Catalog',
-    'catalog_category_anc_products_index_idx' => 'Magento_Catalog',
-    'catalog_category_anc_products_index_tmp' => 'Magento_Catalog',
     'catalog_category_flat' => 'Magento_Catalog',
     'catalog_category_product' => 'Magento_Catalog',
-    'catalog_category_product_index_enbl_idx' => 'Magento_Catalog',
-    'catalog_category_product_index_enbl_tmp' => 'Magento_Catalog',
     'catalog_category_product_index' => 'Magento_Catalog',
-    'catalog_category_product_index_idx' => 'Magento_Catalog',
-    'catalog_category_product_index_tmp' => 'Magento_Catalog',
     'catalog_compare_item' => 'Magento_Catalog',
     'catalog_eav_attribute' => 'Magento_Catalog',
     'catalog_product_entity' => 'Magento_Catalog',
@@ -74,7 +66,6 @@ return array (
     'catalog_product_index_eav_decimal_tmp' => 'Magento_Catalog',
     'catalog_product_index_eav_idx' => 'Magento_Catalog',
     'catalog_product_index_eav_tmp' => 'Magento_Catalog',
-    'catalog_product_enabled_index' => 'Magento_Catalog',
     'catalog_product_flat' => 'Magento_Catalog',
     'catalog_product_index_eav' => 'Magento_Catalog',
     'catalog_product_index_eav_decimal' => 'Magento_Catalog',
diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/Magento/ObjectManager/DiConfigTest.php b/dev/tests/static/testsuite/Magento/Test/Legacy/Magento/ObjectManager/DiConfigTest.php
new file mode 100644
index 00000000000..887a73dfd1a
--- /dev/null
+++ b/dev/tests/static/testsuite/Magento/Test/Legacy/Magento/ObjectManager/DiConfigTest.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Test\Legacy\Magento\ObjectManager;
+
+class DiConfigTest extends \PHPUnit_Framework_TestCase
+{
+    public function testObsoleteDiFormat()
+    {
+        $invoker = new \Magento\TestFramework\Utility\AggregateInvoker($this);
+        $invoker(
+            array($this, 'assertObsoleteFormat'),
+            \Magento\TestFramework\Utility\Files::init()->getDiConfigs(true)
+        );
+    }
+
+    /**
+     * Scan the specified di.xml file and assert that it has no obsolete nodes
+     *
+     * @param string $file
+     */
+    public function assertObsoleteFormat($file)
+    {
+        $xml = simplexml_load_file($file);
+        $this->assertSame(
+            array(),
+            $xml->xpath('//param'),
+            'The <param> node is obsolete. Instead, use the <argument name="..." xsi:type="...">'
+        );
+        $this->assertSame(
+            array(),
+            $xml->xpath('//instance'),
+            'The <instance> node is obsolete. Instead, use the <argument name="..." xsi:type="object">'
+        );
+        $this->assertSame(
+            array(),
+            $xml->xpath('//array'),
+            'The <array> node is obsolete. Instead, use the <argument name="..." xsi:type="array">'
+        );
+        $this->assertSame(
+            array(),
+            $xml->xpath('//item[@key]'),
+            'The <item key="..."> node is obsolete. Instead, use the <item name="..." xsi:type="...">'
+        );
+        $this->assertSame(
+            array(),
+            $xml->xpath('//value'),
+            'The <value> node is obsolete. Instead, provide the actual value as a text literal.'
+        );
+    }
+} 
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 6cffade461b..3e443644ee7 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
@@ -609,15 +609,119 @@ return array(
     array('Mage_Backend_Model_Menu_Factory', 'Mage_Backend_Model_MenuFactory'),
     array('Mage_Bundle_Product_EditController', 'Mage_Bundle_Controller_Adminhtml_Bundle_Selection'),
     array('Mage_Bundle_SelectionController', 'Mage_Bundle_Controller_Adminhtml_Bundle_Selection'),
+    array('Magento\Catalog\Block\Adminhtml\System\Config\Form\Field\Select\Flatproduct'),
     array('Mage_Catalog_Model_Category_Limitation'),
     array('Mage_Catalog_Model_Convert'),
     array('Mage_Catalog_Model_Convert_Adapter_Catalog'),
     array('Mage_Catalog_Model_Convert_Adapter_Product'),
     array('Mage_Catalog_Model_Convert_Parser_Product'),
     array('Mage_Catalog_Model_Entity_Product_Attribute_Frontend_Image'),
+    array('Magento\Catalog\Model\Product\Flat\Flag'),
+    array('Magento\Catalog\Model\Product\Flat\Indexer'),
+    array('Magento\Catalog\Model\Product\Flat\Observer'),
+    array('Magento\Catalog\Model\Product\Indexer\Flat'),
     array('Mage_Catalog_Model_Product_Limitation'),
     array('Mage_Catalog_Model_Resource_Product_Attribute_Frontend_Image'),
     array('Mage_Catalog_Model_Resource_Product_Attribute_Frontend_Tierprice'),
+    array(
+        'Magento\Catalog\Block\Adminhtml\Product\Attribute\Edit\Tab\Variations\Main',
+        'Magento\ConfigurableProduct\Block\Adminhtml\Product\Attribute\Edit\Tab\Variations\Main'
+    ),
+    array(
+        'Magento\Catalog\Block\Adminhtml\Product\Attribute\NewAttribute\Product\Created',
+        'Magento\ConfigurableProduct\Block\Adminhtml\Product\Attribute\NewAttribute\Product\Created'
+    ),
+    array(
+        'Magento\Catalog\Block\Adminhtml\Product\Composite\Fieldset\Configurable',
+        'Magento\ConfigurableProduct\Block\Adminhtml\Product\Composite\Fieldset\Configurable'
+    ),
+    array('Magento\Catalog\Block\Adminhtml\Product\Created'),
+    array(
+        'Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config\Grid\Filter\Inventory',
+        'Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config\Grid\Filter\Inventory'
+    ),
+    array(
+        'Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config\Grid\Renderer\Checkbox',
+        'Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config\Grid\Renderer\Checkbox'
+    ),
+    array(
+        'Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config\Grid\Renderer\Inventory',
+        'Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config\Grid\Renderer\Inventory'
+    ),
+    array(
+        'Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config\Attribute',
+        'Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config\Attribute'
+    ),
+    array(
+        '\Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config\Matrix',
+        '\Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config\Matrix'
+    ),
+    array(
+        'Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config\Simple',
+        'Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config\Simple'
+    ),
+    array(
+        'Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config',
+        'Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config'
+    ),
+    array(
+        '\Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Settings',
+        '\Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Settings'
+    ),
+    array(
+        'Magento\Catalog\Block\Adminhtml\Product\Edit\Tabs\Configurable',
+        'Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tabs\Configurable'
+    ),
+    array(
+        'Magento\Catalog\Block\Product\Configurable\AssociatedSelector\Backend\Grid\ColumnSet',
+        'Magento\ConfigurableProduct\Block\Product\Configurable\AssociatedSelector\Backend\Grid\ColumnSet'
+    ),
+    array(
+        'Magento\Catalog\Block\Product\Configurable\AssociatedSelector\Renderer\Id',
+        'Magento\ConfigurableProduct\Block\Product\Configurable\AssociatedSelector\Renderer\Id'
+    ),
+    array(
+        'Magento\Catalog\Block\Product\Configurable\AttributeSelector',
+        'Magento\ConfigurableProduct\Block\Product\Configurable\AttributeSelector'
+    ),
+    array(
+        'Magento\Catalog\Block\Product\View\Type\Configurable',
+        'Magento\ConfigurableProduct\Block\Product\View\Type\Configurable'
+    ),
+    array(
+        'Magento\Catalog\Model\Product\Type\Configurable',
+        'Magento\ConfigurableProduct\Model\Product\Type\Configurable'
+    ),
+    array(
+        'Magento\Catalog\Model\Resource\Product\Type\Configurable\Attribute',
+        'Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute'
+    ),
+    array(
+        'Magento\Catalog\Model\Resource\Product\Type\Configurable\Product\Collection',
+        'Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Product\Collection'
+    ),
+    array(
+        'Magento\Catalog\Model\Resource\Product\Type\Configurable\Attribute\Collection',
+        'Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute\Collection'
+    ),
+    array(
+        'Magento\Catalog\Model\Resource\Product\Type\Configurable',
+        'Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable'
+    ),
+    array(
+        'Magento\Catalog\Model\Resource\Product\Indexer\Price\Configurable',
+        'Magento\ConfigurableProduct\Model\Resource\Product\Indexer\Price\Configurable'
+    ),
+    array(
+        'Magento\Catalog\Model\Product\Type\Configurable\Price',
+        'Magento\ConfigurableProduct\Model\Product\Type\Configurable\Price'
+    ),
+    array(
+        'Magento\Checkout\Block\Cart\Item\Renderer\Configurable',
+        'Magento\ConfigurableProduct\Block\Cart\Item\Renderer\Configurable'
+    ),
+    array('Magento\Catalog\Model\Resource\Product\Flat\Indexer'),
+    array('Magento\Catalog\Model\System\Config\Backend\Catalog\Product\Flat'),
     array('Mage_Checkout_Block_Links'),
     array('Mage_Core_Block_Flush'),
     array('Mage_Core_Block_Template_Facade'),
@@ -1980,6 +2084,52 @@ return array(
     ['Magento\Payment\Model\Recurring\Profile', 'Magento\RecurringProfile\Model\RecurringProfile'],
     ['Magento\Validator\Composite\VarienObject', 'Magento\Validator\Object'],
     array('Magento\GoogleShopping\Helper\Price', 'Magento\Catalog\Model\Product\CatalogPrice'),
+    array('Magento\Core\Model\Layout\Argument\Handler\ArrayHandler', 'Magento\Data\Argument\Interpreter\ArrayType'),
+    array('Magento\Core\Model\Layout\Argument\Handler\String', 'Magento\Data\Argument\Interpreter\String'),
+    array('Magento\Core\Model\Layout\Argument\Handler\Number', 'Magento\Data\Argument\Interpreter\Number'),
+    array('Magento\Core\Model\Layout\Argument\Handler\Boolean', 'Magento\Data\Argument\Interpreter\Boolean'),
+    array('Magento\Core\Model\Layout\Argument\Handler\Object', 'Magento\View\Layout\Argument\Interpreter\Object'),
+    array('Magento\Core\Model\Layout\Argument\Handler\Options', 'Magento\View\Layout\Argument\Interpreter\Options'),
+    array('Magento\Core\Model\Layout\Argument\Handler\Url', 'Magento\View\Layout\Argument\Interpreter\Url'),
+    array('Magento\Core\Model\Layout\Argument\Handler\Helper', 'Magento\View\Layout\Argument\Interpreter\HelperMethod'),
+    array(
+        'Magento\Core\Model\Layout\Argument\AbstractHandler',
+        'Magento\View\Layout\Argument\Interpreter\Decorator\Updater'
+    ),
+    array('Magento\Core\Model\Layout\Argument\Processor', 'Magento\View\Layout\Argument\Interpreter\Decorator\Updater'),
+    array('Magento\Core\Model\Layout\Argument\Updater', 'Magento\View\Layout\Argument\Interpreter\Decorator\Updater'),
+    array('Magento\Core\Model\Layout\Argument\UpdaterInterface', 'Magento\View\Layout\Argument\UpdaterInterface'),
+    array('Magento\View\Layout\Argument\HandlerInterface', 'Magento\Data\Argument\InterpreterInterface'),
+    array('Magento\View\Layout\Argument\HandlerFactory', 'Magento\Data\Argument\Interpreter\Composite'),
+    array('Magento\Phrase\Renderer\Factory'),
+    array('Magento\Core\Model\Layout\Factory', 'Magento\DesignEditor\Model\AreaEmulator'),
+    array('Magento\Catalog\Model\Category\Indexer\Product'),
+    array('Magento\Catalog\Model\Resource\Category\Indexer\Product'),
+    array('Magento\Catalog\Model\Index'),
+    array('Magento\Catalog\Model\Product\Status', 'Magento\Catalog\Model\Product\Attribute\Source\Status'),
+    array('Magento\Catalog\Model\Resource\Product\Status'),
+    array(
+        'Magento\CatalogInventory\Block\Stockqty\Type\Configurable',
+        'Magento\ConfigurableProduct\Block\Stockqty\Type\Configurable'
+    ),
+    array(
+        'Magento\CatalogInventory\Model\Resource\Indexer\Stock\Configurable',
+        'Magento\ConfigurableProduct\Model\Resource\Indexer\Stock\Configurable'
+    ),
+    array(
+        'Magento\ImportExport\Model\Export\Entity\Product\Type\Configurable',
+        'Magento\ConfigurableProduct\Model\Export\Entity\Product\Type\Configurable'
+    ),
+    array(
+        'Magento\ImportExport\Model\Import\Entity\Product\Type\Configurable',
+        'Magento\ConfigurableProduct\Model\Import\Entity\Product\Type\Configurable'
+    ),
+    array('Magento\Sales\Block\Adminhtml\Items\Renderer\Configurable'),
+    array(
+        'Magento\Catalog\Model\Resource\Product\Collection\AssociatedProduct',
+        'Magento\ConfigurableProduct\Model\Resource\Product\Collection\AssociatedProduct'
+    ),
+    array('Magento\Catalog\Model\Resource\Product\Collection\AssociatedProductUpdater'),
     ['Magento\Sales\Controller\Adminhtml\Recurring\Profile', 'Magento\RecurringProfile\Controller\Adminhtml\Profile'],
     ['Magento\Sales\Controller\Recurring\Profile', 'Magento\RecurringProfile\Controller\Profile'],
 );
diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_constants.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_constants.php
index e75ac2ad079..703ef2e1d81 100644
--- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_constants.php
+++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_constants.php
@@ -501,7 +501,7 @@ return array(
     ),
     array(
         'USE_PARENT_IMAGE',
-        'Magento\Checkout\Block\Cart\Item\Renderer\Configurable',
+        'Magento\ConfigurableProduct\Block\Cart\Item\Renderer\Configurable',
         'Magento\Catalog\Model\Config\Source\Product\Thumbnail::OPTION_USE_PARENT_IMAGE'
     ),
     array(
@@ -511,8 +511,8 @@ return array(
     ),
     array(
         'CONFIGURABLE_PRODUCT_IMAGE',
-        'Magento\Checkout\Block\Cart\Item\Renderer\Configurable',
-        'Magento\Checkout\Block\Cart\Item\Renderer\Configurable::CONFIG_THUMBNAIL_SOURCE'
+        'Magento\ConfigurableProduct\Block\Cart\Item\Renderer\Configurable',
+        'Magento\ConfigurableProduct\Block\Cart\Item\Renderer\Configurable::CONFIG_THUMBNAIL_SOURCE'
     ),
     array(
         'GROUPED_PRODUCT_IMAGE',
@@ -540,7 +540,7 @@ return array(
     array('UPLOAD_ROOT', 'Magento\Backend\Model\Config\Backend\Logo'),
     array('UPLOAD_ROOT', 'Magento\Backend\Model\Config\Backend\Favicon'),
     array('DIRECTORY_SEPARATOR', 'Magento\Filesystem'),
-    
+
     array('MAX_QTY_VALUE', '\Magento\Catalog\Controller\Adminhtml\Product',
         'Magento\Catalog\Controller\Adminhtml\Product\Initialization\StockDataFilter::MAX_QTY_VALUE'
     ),
@@ -574,6 +574,12 @@ return array(
     array('GENERATION', '\Magento\Filesystem', '\Magento\App\Filesystem::GENERATION_DIR'),
     array('UPLOAD', '\Magento\Filesystem', '\Magento\App\Filesystem::UPLOAD_DIR'),
     array('SYS_TMP', '\Magento\Filesystem', '\Magento\App\Filesystem::SYS_TMP_DIR'),
+    array('LAYOUT_NAVIGATION_CLASS_NAME', 'Magento\DesignEditor\Model\State'),
+    array(
+        'TYPE_CONFIGURABLE',
+        '\Magento\Catalog\Model\Product\Type',
+        '\Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE'
+    ),
     ['PERIOD_UNIT_DAY', '\Magento\Payment\Model\Recurring\Profile', '\Magento\RecurringProfile\Model\PeriodUnits::DAY'],
     [
         'PERIOD_UNIT_WEEK',
diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php
index 269180b520a..a57c4d7e64a 100644
--- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php
+++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_methods.php
@@ -376,6 +376,7 @@ return array(
     array('getDirectOutput', 'Magento\Core\Model\Layout'),
     array('getDirectOutput', 'Magento\View\LayoutInterface'),
     array('getDistroServerVars', 'Magento\Core\Model\Config', 'getDistroBaseUrl'),
+    array('getDuplicateButtonHtml', 'Magento\Catalog\Block\Adminhtml\Product\Edit'),
     array('getElementClass', 'Magento\Core\Model\Layout\Update'),
     array('getEngineFactory', 'Magento\View\Element\Template\Context', 'getEnginePool'),
     array('getEntityIdsToIncrementIds', 'Magento\Rss\Model\Resource\Order'),
@@ -385,6 +386,7 @@ return array(
     array('getFacets'),
     array('getFallbackTheme'),
     array('getFileLayoutUpdatesXml', 'Magento\Core\Model\Layout\Update', 'Magento\Core\Model\Layout\Merge'),
+    array('getFormHtml', 'Magento\Sales\Block\Adminhtml\Order\Create'),
     array('getFormated', '', "getFormated(true) -> format('html'), getFormated() -> format('text')"),
     array('getFormObject', 'Magento\Backend\Block\Widget\Form'),
     array('getGiftmessageHtml', 'Magento\Sales\Block\Adminhtml\Order\View\Tab\Info'),
@@ -560,6 +562,7 @@ return array(
     array('getTrackingPopUpUrlByShipId', '', 'getTrackingPopupUrlBySalesModel'),
     array('getTrackingPopUpUrlByTrackId', '', 'getTrackingPopupUrlBySalesModel'),
     array('getUnixProcessMemoryUsage', 'Magento\TestFramework\Helper\Memory', 'getRealMemoryUsage'),
+    array('getUnassignableAttributes', 'Magento\Catalog\Helper\Product'),
     array('getUnprocessedEvents', 'Magento\Index\Model\Resource\Event',
         'Magento_Index_Model_EventRepository::getUnprocessed()'
     ),
@@ -627,12 +630,12 @@ return array(
     array('loadDb', 'Magento\Core\Model\Config'),
     array('loadDiConfiguration', 'Magento\Core\Model\Config'),
     array('loadEventObservers', 'Magento\Core\Model\Config'),
-    array('loadLabel', 'Magento\Catalog\Model\Resource\Product\Type\Configurable\Attribute'),
+    array('loadLabel', 'Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute'),
     array('loadModules', 'Magento\Core\Model\Config'),
     array('loadModulesCache', 'Magento\Core\Model\Config'),
     array('loadModulesConfiguration', 'Magento\Core\Model\Config'),
     array('loadParentProductIds', 'Magento\Catalog\Model\Product'),
-    array('loadPrices', 'Magento\Catalog\Model\Resource\Product\Type\Configurable\Attribute'),
+    array('loadPrices', 'Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute'),
     array('loadProductPrices', 'Magento\Catalog\Model\Resource\Product\Attribute\Backend\Tierprice'),
     array('lockOrderInventoryData', 'Magento\CatalogInventory\Model\Observer'),
     array('logEncryptionKeySave'),
@@ -745,8 +748,9 @@ return array(
     array('sortChildren'),
     array('overrideProductThumbnail', 'Magento\Checkout\Block\Cart\Item\Renderer'),
     array('_getThumbnail', 'Magento\Checkout\Block\Cart\Item\Renderer'),
-    array('getConfigurableProduct', 'Magento\Checkout\Block\Cart\Item\Renderer\Configurable'),
-    array('getProductAttributes', 'Magento\Checkout\Block\Cart\Item\Renderer\Configurable'),
+    array('getConfigurableProduct', 'Magento\ConfigurableProduct\Block\Cart\Item\Renderer\Configurable'),
+    array('getConfigurableOptions', 'Magento\Catalog\Helper\Product\Configuration'),
+    array('getProductAttributes', 'Magento\ConfigurableProduct\Block\Cart\Item\Renderer\Configurable'),
     array('substDistroServerVars', 'Magento\Core\Model\Config'),
     array('superGroupGridOnlyAction', 'Magento\Catalog\Controller\Adminhtml\Product'),
     array('toOptionArray', 'Magento\Cms\Model\Resource\Page\Collection'),
@@ -824,7 +828,7 @@ return array(
     array('_showSingle', 'Magento\Bundle\Block\Catalog\Product\View\Type\Bundle\Option', 'showSingle'),
     array('_getDefaultValues', 'Magento\Bundle\Block\Catalog\Product\View\Type\Bundle\Option', 'getDefaultValues'),
     array('_isSelected', 'Magento\Bundle\Block\Catalog\Product\View\Type\Bundle\Option', 'isSelected'),
-    array('_getProduct', 'Magento\Catalog\Block\Product\Configurable\AssociatedSelector\Backend\Grid\ColumnSet',
+    array('_getProduct', 'Magento\ConfigurableProduct\Block\Product\Configurable\AssociatedSelector\Backend\Grid\ColumnSet',
         'getProduct'),
     array('_getProduct', 'Magento\CatalogInventory\Block\Stockqty\AbstractStockqty', 'getProduct'),
     array('_getProduct', 'Magento\CatalogInventory\Block\Qtyincrements', 'getProduct'),
@@ -872,7 +876,7 @@ return array(
     array('getValidateHttpUserAgentSkip', 'Magento\Core\Model\Session\AbstractSession'),
     array('addProductAttributes', 'Magento\SalesRule\Model\Observer'),
     array('_helper', 'Magento\Catalog\Model\Product\Type\AbstractType'),
-    array('getHelper', 'Magento\Catalog\Model\Resource\Product\Type\Configurable\Attribute\Collection'),
+    array('getHelper', 'Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute\Collection'),
     array('getHelper', 'Magento\Cms\Model\Wysiwyg\Images\Storage'),
     array('getHelper', 'Magento\Core\Model\App'),
     array('getCatalogHelper', 'Magento\Backend\Block\Catalog\Category\Tabs'),
@@ -950,6 +954,8 @@ return array(
     ),
     array('getMerchantVatNumber', '\Magento\Core\Helper\Data', '\Magento\Customer\Helper\Data::getMerchantVatNumber'),
     array('isCountryInEU', '\Magento\Core\Helper\Data', '\Magento\Customer\Helper\Data::isCountryInEU'),
+    array('isConfigurable', 'Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Inventory'),
+    array('isConfigurable', 'Magento\Catalog\Model\Product'),
     array('assocToXml', '\Magento\Core\Helper\Data', '\Magento\Convert\ConvertArray::assocToXml'),
     array('xmlToAssoc', '\Magento\Core\Helper\Data', '\Magento\Convert\Xml::xmlToAssoc'),
     array('checkLfiProtection', '\Magento\Core\Helper\Data', '\Magento\Filesystem::checkLfiProtection'),
@@ -996,6 +1002,7 @@ return array(
     array('preDispatch', '\Magento\Core\Controller\Varien\Action'),
     array('postDispatch', '\Magento\Core\Controller\Varien\Action'),
     array('hasAction', '\Magento\Core\Controller\Varien\Action'),
+    array('hasConfigurableAttributes', '\Magento\Catalog\Model\Product\Attribute\Group'),
     array('_startSession', '\Magento\Core\Controller\Varien\Action',
         '\Magento\Core\App\Action\Plugin\Session::aroundDispatch'
     ),
@@ -1043,6 +1050,9 @@ return array(
     array('addActionLayoutHandles', '\Magento\Core\Controller\Varien\Action',
         '\Magento\App\ViewInterface::addActionLayoutHandles'
     ),
+    array('addAttributeAction', 'Magento\Catalog\Controller\Adminhtml\Product',
+        'Magento\ConfigurableProduct\Controller\Adminhtml\Product'
+    ),
     array('getTranslator', '\Magento\App\Helper\Context'),
     array('getTranslator', '\Magento\Core\Helper\Data'),
     array('_loadCache', '\Magento\App\Helper\AbstractHelper'),
@@ -1268,6 +1278,50 @@ return array(
     array('_getSession', 'Magento\CatalogSearch\Controller\Result'),
     array('addPriceBlockType', 'Magento\Rss\Block\Catalog\AbstractCatalog'),
     array('getAttributeDisabledTypes', 'Magento\Catalog\Helper\Data'),
+    array('setArguments', 'Magento\ObjectManager\Factory', 'Magento\App\Arguments\ArgumentInterpreter'),
+    array('setArguments', 'Magento\ObjectManager\Factory\Factory', 'Magento\App\Arguments\ArgumentInterpreter'),
+    array('setArguments', 'Magento\Interception\FactoryDecorator', 'Magento\App\Arguments\ArgumentInterpreter'),
+    array('setObjectManager', 'Magento\ObjectManager\Factory',
+        'Magento\ObjectManager\Config\Argument\ObjectFactory::setObjectManager'),
+    array('setObjectManager', 'Magento\ObjectManager\Factory\Factory',
+        'Magento\ObjectManager\Config\Argument\ObjectFactory::setObjectManager'),
+    array('setObjectManager', 'Magento\Interception\FactoryDecorator',
+        'Magento\ObjectManager\Config\Argument\ObjectFactory::setObjectManager'),
+    array('_processArrayNode', 'Magento\ObjectManager\Config\Mapper\Dom',
+        'Magento\Data\Argument\Interpreter\ArrayType'),
+    array('_processValueNode', 'Magento\ObjectManager\Config\Mapper\Dom',
+        'Magento\Data\Argument\Interpreter\Composite'),
     array('cleanAction', 'Magento\PageCache\Controller\Adminhtml\PageCache'),
-    array('_isAllowed', 'Magento\PageCache\Controller\Adminhtml\PageCache')
+    array('_isAllowed', 'Magento\PageCache\Controller\Adminhtml\PageCache'),
+    array('useDbCompatibleMode', 'Magento\Core\Helper\Data'),
+    array('getFlag', 'Magento\Catalog\Helper\Product\Flat'),
+    array('isBuilt', 'Magento\Catalog\Helper\Product\Flat'),
+    array('getIndexerIds', 'Magento\Indexer\Model\Config'),
+    array('refreshEnabledIndex', 'Magento\Catalog\Model\Resource\Product'),
+    array('refreshIndex', 'Magento\Catalog\Model\Resource\Product'),
+    array('getProductStatusEnabled', 'Magento\CatalogInventory\Model\Stock\Status'),
+    array('getProductStatus', 'Magento\CatalogInventory\Model\Stock\Status', 'getProductStockStatus'),
+    array('getProductStatus', 'Magento\Catalog\Model\Resource\Product\Status',
+        'Magento\CatalogInventory\Model\Resource\Stock\Status'),
+    array('updateProductStatus', 'Magento\Catalog\Model\Product\Status'),
+    array('getProductStatus', 'Magento\Catalog\Model\Product\Status'),
+    array('addValueSortToCollection', 'Magento\Catalog\Model\Product\Status',
+        'Magento\CatalogInventory\Model\Resource\Stock\Status'),
+    array('catalogProductStatusUpdate', 'Magento\Sales\Model\Observer\Backend\CatalogProductQuote'),
+    array('applyPermissionsAfterReindex', 'Magento\CatalogPermissions\Model\Adminhtml\Observer'),
+    array(
+        'transitionProductType',
+        'Magento\Catalog\Model\Observer',
+        'Magento\Catalog\Model\Product\TypeTransitionManager::processProduct'
+    ),
+    array(
+        'transitionProductType',
+        'Magento\Downloadable\Model\Observer',
+        'Magento\Downloadable\Model\Product\TypeTransitionManager\Plugin\Downloadable::aroundProcessProduct'
+    ),
+    array(
+        'isUsedBySuperProducts',
+        'Magento\Catalog\Model\Resource\Attribute',
+        'Magento\ConfigurableProduct\Model\Attribute\LockValidator::validate'
+    ),
 );
diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_properties.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_properties.php
index 4fde419a4dd..b4cd578a89e 100644
--- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_properties.php
+++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_properties.php
@@ -272,6 +272,8 @@ return array(
     array('_messagesBlock', 'Magento\View\Element\AbstractBlock'),
     array('_messagesBlock', 'Magento\Connect\Helper\Data'),
     array('escapeMessageFlag', 'Magento\View\Block\Messages'),
+    array('fileIteratorFactory', 'Magento\Core\Model\Theme\Collection'),
+    array('_handlerFactory', 'Magento\Backend\Block\Widget\Grid\Massaction\Additional'),
     array('_flatResourceFactory', 'Magento\Catalog\Model\Observer'),
     array('_catalogCategoryFlat', 'Magento\Catalog\Model\Observer'),
     array('_catalogCategoryFlat', 'Magento\Catalog\Block\Navigation'),
@@ -284,5 +286,4 @@ return array(
     array('_attributeCodes', 'Magento\Catalog\Model\Resource\Category\Flat'),
     array('_columnsSql', 'Magento\Catalog\Model\Resource\Category\Flat'),
     array('_columns', 'Magento\Catalog\Model\Resource\Category\Flat'),
-    array('fileIteratorFactory', 'Magento\Core\Model\Theme\Collection')
 );
diff --git a/dev/tests/static/testsuite/Magento/Test/Php/_files/blacklist/common.txt b/dev/tests/static/testsuite/Magento/Test/Php/_files/blacklist/common.txt
index 29027b3e373..9236edc3e92 100644
--- a/dev/tests/static/testsuite/Magento/Test/Php/_files/blacklist/common.txt
+++ b/dev/tests/static/testsuite/Magento/Test/Php/_files/blacklist/common.txt
@@ -8,6 +8,7 @@ app/code/Magento/Backend/Model/Menu/Config.php
 app/code/Magento/Backend/Block/Widget/Grid
 app/code/Magento/Backend/view
 app/code/Magento/Core/Model/Config/Element.php
+app/code/Magento/ConfigurableProduct/view
 app/code/Magento/DesignEditor/view
 app/code/Magento/Email/view
 app/code/Magento/Integration/view
diff --git a/dev/tests/static/testsuite/Magento/Test/Php/_files/whitelist/common.txt b/dev/tests/static/testsuite/Magento/Test/Php/_files/whitelist/common.txt
index b33ac56c1ff..1e0bf936aa2 100644
--- a/dev/tests/static/testsuite/Magento/Test/Php/_files/whitelist/common.txt
+++ b/dev/tests/static/testsuite/Magento/Test/Php/_files/whitelist/common.txt
@@ -15,7 +15,6 @@ app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Options/Popup/Grid.php
 app/code/Magento/Catalog/Block/Adminhtml/Product/Helper/Form/Category.php
 app/code/Magento/Catalog/Block/Adminhtml/Product/Helper/Form/Weight.php
 app/code/Magento/Catalog/Block/Adminhtml/Product/Options/Ajax.php
-app/code/Magento/Catalog/Block/Product/Configurable
 app/code/Magento/Catalog/Block/Product/TemplateSelector.php
 app/code/Magento/Catalog/Block/Product/View/BaseImage.php
 app/code/Magento/Catalog/Block/Product/View/Gallery.php
@@ -23,7 +22,6 @@ app/code/Magento/Catalog/Block/Product/View/Tabs.php
 app/code/Magento/Catalog/Model/Attribute/Config
 app/code/Magento/Catalog/Model/Attribute/Config.php
 app/code/Magento/Catalog/Model/Resource/Category/Collection
-app/code/Magento/Catalog/Model/Resource/Product/Collection
 app/code/Magento/Catalog/Model/Product/Type.php
 app/code/Magento/Catalog/Model/ProductOptions
 app/code/Magento/Catalog/Model/ProductTypes
@@ -36,12 +34,11 @@ app/code/Magento/Checkout/Block/Link.php
 app/code/Magento/Cms/Block/Adminhtml/Page/Edit/Tab/Design.php
 app/code/Magento/Cms/Controller/Router.php
 app/code/Magento/Cms/Model/Template/FilterProvider.php
+app/code/Magento/ConfigurableProduct
 app/code/Magento/Core/data
 app/code/Magento/Core/Model/Config
 app/code/Magento/Core/Model/Design.php
-app/code/Magento/Core/Model/Layout/Factory.php
 app/code/Magento/Core/Model/Layout/Update.php
-app/code/Magento/Core/Model/Layout/Argument
 app/code/Magento/Core/Model/Locale/Validator.php
 app/code/Magento/Core/Model/LocaleInterface.php
 app/code/Magento/Core/Model/Resource/Theme
@@ -137,6 +134,7 @@ lib/Magento/Exception
 lib/Magento/Stdlib/DateTime.php
 lib/Magento/Object.php
 lib/Magento/App
+lib/Magento/Data/Argument
 lib/Magento/ObjectManager
 lib/Magento/Service
 lib/Magento/Url/SecurityInfoInterface.php
diff --git a/dev/tests/unit/testsuite/Magento/App/Arguments/ArgumentInterpreterTest.php b/dev/tests/unit/testsuite/Magento/App/Arguments/ArgumentInterpreterTest.php
new file mode 100644
index 00000000000..ce1a4cc4988
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/App/Arguments/ArgumentInterpreterTest.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\App\Arguments;
+
+class ArgumentInterpreterTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\App\Arguments\ArgumentInterpreter
+     */
+    private $object;
+
+    /**
+     * @var \Magento\App\Arguments|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $arguments;
+
+    protected function setUp()
+    {
+        $this->arguments = $this->getMock('\Magento\App\Arguments', array('get'), array(), '', false);
+        $const = $this->getMock('\Magento\Data\Argument\Interpreter\Constant', array('evaluate'), array(), '', false);
+        $const->expects($this->once())
+            ->method('evaluate')
+            ->with(array('value' => 'FIXTURE_INIT_PARAMETER'))
+            ->will($this->returnValue('init_param_value'))
+        ;
+        $this->object = new ArgumentInterpreter($this->arguments, $const);
+    }
+
+    public function testEvaluate()
+    {
+        $expected = 'test_value';
+        $this->arguments->expects($this->once())
+            ->method('get')
+            ->with('init_param_value')
+            ->will($this->returnValue($expected));
+        $this->assertEquals($expected, $this->object->evaluate(array('value' => 'FIXTURE_INIT_PARAMETER')));
+    }
+
+    /**
+     * @expectedException \Magento\Data\Argument\MissingOptionalValueException
+     * @expectedExceptionMessage Value of application argument 'init_param_value' is not defined.
+     */
+    public function testEvaluateException()
+    {
+        $this->arguments->expects($this->once())
+            ->method('get')
+            ->with('init_param_value')
+            ->will($this->returnValue(null));
+        $this->object->evaluate(array('value' => 'FIXTURE_INIT_PARAMETER'));
+    }
+} 
diff --git a/dev/tests/unit/testsuite/Magento/Backend/Controller/Adminhtml/DashboardTest.php b/dev/tests/unit/testsuite/Magento/Backend/Controller/Adminhtml/DashboardTest.php
index c6fb2f4a592..9b68e817470 100644
--- a/dev/tests/unit/testsuite/Magento/Backend/Controller/Adminhtml/DashboardTest.php
+++ b/dev/tests/unit/testsuite/Magento/Backend/Controller/Adminhtml/DashboardTest.php
@@ -35,16 +35,23 @@ class DashboardTest extends \PHPUnit_Framework_TestCase
      */
     protected $_response;
 
+    /**
+     * @var PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_objectManager;
+
     protected function setUp()
     {
         $this->_request = $this->getMock('Magento\App\Request\Http', array(), array(), '', false);
         $this->_response = $this->getMock('Magento\App\Response\Http', array(), array(), '', false);
+        $this->_objectManager = $this->getMock('Magento\ObjectManager');
     }
 
     protected function tearDown()
     {
         $this->_request = null;
         $this->_response = null;
+        $this->_objectManager = null;
     }
 
     public function testTunnelAction()
@@ -64,12 +71,11 @@ class DashboardTest extends \PHPUnit_Framework_TestCase
         );
         $helper->expects($this->any())->method('getChartDataHash')->will($this->returnValue($fixture));
 
-        $objectManager = $this->getMock('Magento\ObjectManager');
-        $objectManager->expects($this->at(0))
+        $this->_objectManager->expects($this->at(0))
             ->method('get')
             ->with('Magento\Backend\Helper\Dashboard\Data')
             ->will($this->returnValue($helper));
-        $objectManager->expects($this->at(1))
+        $this->_objectManager->expects($this->at(1))
             ->method('create')
             ->with('Magento\HTTP\ZendClient')
             ->will($this->returnValue($httpClient));
@@ -85,7 +91,7 @@ class DashboardTest extends \PHPUnit_Framework_TestCase
         $this->_response->expects(
             $this->once())->method('setBody')->with('success_msg')->will($this->returnValue($this->_response));
         $this->_response->expects($this->any())->method('getBody')->will($this->returnValue('success_msg'));
-        $controller = $this->_factory($this->_request, $this->_response, $objectManager);
+        $controller = $this->_factory($this->_request, $this->_response);
         $controller->tunnelAction();
         $this->assertEquals('success_msg', $controller->getResponse()->getBody());
     }
@@ -118,19 +124,18 @@ class DashboardTest extends \PHPUnit_Framework_TestCase
         );
         $helper->expects($this->any())->method('getChartDataHash')->will($this->returnValue($fixture));
 
-        $objectManager = $this->getMock('Magento\ObjectManager');
-        $objectManager->expects($this->at(0))
+        $this->_objectManager->expects($this->at(0))
             ->method('get')
             ->with('Magento\Backend\Helper\Dashboard\Data')
             ->will($this->returnValue($helper));
         $exceptionMock = new \Exception();
-        $objectManager->expects($this->at(1))
+        $this->_objectManager->expects($this->at(1))
             ->method('create')
             ->with('Magento\HTTP\ZendClient')
             ->will($this->throwException($exceptionMock));
         $loggerMock = $this->getMock('Magento\Logger', array('logException'), array(), '', false);
         $loggerMock->expects($this->once())->method('logException')->with($exceptionMock);
-        $objectManager->expects($this->at(2))
+        $this->_objectManager->expects($this->at(2))
             ->method('get')
             ->with('Magento\Logger')
             ->will($this->returnValue($loggerMock));
@@ -145,7 +150,7 @@ class DashboardTest extends \PHPUnit_Framework_TestCase
             ->with(503)
             ->will($this->returnValue($this->_response));
         $this->_response->expects($this->once())->method('getHttpResponseCode')->will($this->returnValue(503));
-        $controller = $this->_factory($this->_request, $this->_response, $objectManager);
+        $controller = $this->_factory($this->_request, $this->_response);
         $controller->tunnelAction();
         $this->assertEquals(503, $controller->getResponse()->getHttpResponseCode());
     }
@@ -155,19 +160,15 @@ class DashboardTest extends \PHPUnit_Framework_TestCase
      *
      * @param Magento\App\Request\Http $request
      * @param \Magento\App\Response\Http|null $response
-     * @param \Magento\ObjectManager|null $objectManager
      * @return \Magento\Backend\Controller\Adminhtml\Dashboard|PHPUnit_Framework_MockObject_MockObject
      */
-    protected function _factory($request, $response = null, $objectManager = null)
+    protected function _factory($request, $response = null)
     {
         if (!$response) {
             /** @var $response \Magento\App\ResponseInterface|PHPUnit_Framework_MockObject_MockObject */
             $response = $this->getMock('Magento\App\Response\Http', array(), array(), '', false);
             $response->headersSentThrowsException = false;
         }
-        if (!$objectManager) {
-            $objectManager = new \Magento\ObjectManager\ObjectManager();
-        }
         $rewriteFactory = $this->getMock('Magento\Core\Model\Url\RewriteFactory', array('create'), array(), '', false);
         $helper = new \Magento\TestFramework\Helper\ObjectManager($this);
         $varienFront = $helper->getObject('Magento\App\FrontController',
@@ -177,7 +178,7 @@ class DashboardTest extends \PHPUnit_Framework_TestCase
         $arguments = array(
             'request' => $request,
             'response' => $response,
-            'objectManager' => $objectManager,
+            'objectManager' => $this->_objectManager,
             'frontController' => $varienFront,
         );
         $context = $helper->getObject('Magento\Backend\App\Action\Context', $arguments);
diff --git a/dev/tests/unit/testsuite/Magento/Backend/Model/ConfigTest.php b/dev/tests/unit/testsuite/Magento/Backend/Model/ConfigTest.php
index e51fe8dc724..f2999a062a7 100644
--- a/dev/tests/unit/testsuite/Magento/Backend/Model/ConfigTest.php
+++ b/dev/tests/unit/testsuite/Magento/Backend/Model/ConfigTest.php
@@ -76,20 +76,40 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
 
     protected function setUp()
     {
-        $this->_eventManagerMock = $this->getMock('Magento\Event\ManagerInterface', array(), array(), '', false);
+        $this->_eventManagerMock = $this->getMock(
+            'Magento\Event\ManagerInterface',
+            array(), array(), '', false
+        );
         $this->_structureReaderMock = $this->getMock(
-            'Magento\Backend\Model\Config\Structure\Reader', array(), array(), '', false
+            'Magento\Backend\Model\Config\Structure\Reader',
+            array(), array(), '', false
+        );
+        $structureMock = $this->getMock(
+            'Magento\Backend\Model\Config\Structure',
+            array(), array(), '', false
         );
-        $structureMock = $this->getMock('Magento\Backend\Model\Config\Structure', array(), array(), '', false);
+
         $this->_structureReaderMock->expects($this->any())->method('getConfiguration')->will(
             $this->returnValue($structureMock)
         );
+
         $this->_transFactoryMock = $this->getMock(
-            'Magento\Core\Model\Resource\TransactionFactory', array('create'), array(), '', false
+            'Magento\Core\Model\Resource\TransactionFactory',
+            array('create'), array(), '', false
+        );
+        $this->_appConfigMock = $this->getMock(
+            'Magento\App\ConfigInterface',
+            array(), array(), '', false
         );
-        $this->_appConfigMock = $this->getMock('Magento\App\ConfigInterface', array(), array(), '', false);
-        $this->_configLoaderMock = $this->getMock('Magento\Backend\Model\Config\Loader', array(), array(), '', false);
-        $this->_dataFactoryMock = $this->getMock('Magento\Core\Model\Config\ValueFactory', array(), array(), '', false);
+        $this->_configLoaderMock = $this->getMock(
+            'Magento\Backend\Model\Config\Loader',
+            array('getConfigByPath'), array(), '', false
+        );
+        $this->_dataFactoryMock = $this->getMock(
+            'Magento\Core\Model\Config\ValueFactory',
+            array(), array(), '', false
+        );
+
         $this->_storeManager = $this->getMockForAbstractClass('Magento\Core\Model\StoreManagerInterface');
 
         $this->_model = new \Magento\Backend\Model\Config(
@@ -120,4 +140,30 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
         $this->assertSame('', $this->_model->getWebsite());
         $this->assertSame('', $this->_model->getStore());
     }
+
+    public function testSaveToCheckAdminSystemConfigChangedSectionEvent()
+    {
+        $transactionMock = $this->getMock(
+            'Magento\Core\Model\Resource\Transaction', array(), array(), '', false
+        );
+
+        $this->_transFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($transactionMock));
+
+        $this->_configLoaderMock->expects($this->any())
+            ->method('getConfigByPath')
+            ->will($this->returnValue(array()));
+
+        $this->_eventManagerMock->expects($this->at(1))
+            ->method('dispatch')
+            ->with($this->equalTo('admin_system_config_changed_section_'), $this->arrayHasKey('website'));
+
+        $this->_eventManagerMock->expects($this->at(1))
+            ->method('dispatch')
+            ->with($this->equalTo('admin_system_config_changed_section_'), $this->arrayHasKey('store'));
+
+        $this->_model->setGroups(array('1' => array('data')));
+        $this->_model->save();
+    }
 }
diff --git a/dev/tests/unit/testsuite/Magento/Bundle/Model/Product/Attribute/Source/Price/ViewTest.php b/dev/tests/unit/testsuite/Magento/Bundle/Model/Product/Attribute/Source/Price/ViewTest.php
new file mode 100644
index 00000000000..40e5bae0b3b
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Bundle/Model/Product/Attribute/Source/Price/ViewTest.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Bundle
+ * @subpackage  unit_tests
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Bundle\Model\Product\Attribute\Source\Price;
+
+use Magento\TestFramework\Helper\ObjectManager;
+
+class ViewTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Bundle\Model\Product\Attribute\Source\Price\View
+     */
+    protected $_model;
+
+    public function setUp()
+    {
+        $objectManager = new ObjectManager($this);
+        $this->_model = $objectManager->getObject('Magento\Bundle\Model\Product\Attribute\Source\Price\View');
+    }
+
+    public function testGetFlatColums()
+    {
+        $abstractAttributeMock = $this->getMock(
+            '\Magento\Eav\Model\Entity\Attribute\AbstractAttribute',
+            array('getAttributeCode', '__wakeup'), array(), '', false
+        );
+
+        $abstractAttributeMock->expects($this->any())
+            ->method('getAttributeCode')
+            ->will($this->returnValue('code'));
+
+        $this->_model->setAttribute($abstractAttributeMock);
+
+        $flatColums = $this->_model->getFlatColums();
+
+        $this->assertTrue(is_array($flatColums), 'FlatColums must be an array value');
+        $this->assertTrue(!empty($flatColums), 'FlatColums must be not empty');
+        foreach ($flatColums as $result) {
+            $this->assertArrayHasKey('unsigned', $result, 'FlatColums must have "unsigned" column');
+            $this->assertArrayHasKey('default', $result, 'FlatColums must have "default" column');
+            $this->assertArrayHasKey('extra', $result, 'FlatColums must have "extra" column');
+            $this->assertArrayHasKey('type', $result, 'FlatColums must have "type" column');
+            $this->assertArrayHasKey('nullable', $result, 'FlatColums must have "nullable" column');
+            $this->assertArrayHasKey('comment', $result, 'FlatColums must have "comment" column');
+        }
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Controller/Adminhtml/Product/BuilderTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Controller/Adminhtml/Product/BuilderTest.php
new file mode 100644
index 00000000000..b15fc84b663
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Controller/Adminhtml/Product/BuilderTest.php
@@ -0,0 +1,179 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Controller\Adminhtml\Product;
+
+
+class BuilderTest extends \PHPUnit_Framework_TestCase
+{
+
+    /**
+     * @var \Magento\Catalog\Controller\Adminhtml\Product\Builder
+     */
+    protected $builder;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $loggerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $productFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $registryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $wysiwygConfigMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $requestMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $productMock;
+
+    protected function setUp()
+    {
+        $this->loggerMock = $this->getMock('Magento\Logger', array(), array(), '', false);
+        $this->productFactoryMock
+            = $this->getMock('Magento\Catalog\Model\ProductFactory', array('create'));
+        $this->registryMock = $this->getMock('Magento\Core\Model\Registry', array(), array(), '', false);
+        $this->wysiwygConfigMock
+            = $this->getMock('Magento\Cms\Model\Wysiwyg\Config', array('setStoreId'), array(), '', false);
+        $this->requestMock = $this->getMock('Magento\App\Request\Http', array(), array(), '', false);
+        $methods = array('setStoreId', 'setData', 'load', '__wakeup', 'setAttributeSetId', 'setTypeId');
+        $this->productMock = $this->getMock('Magento\Catalog\Model\Product', $methods, array(), '', false);
+
+        $this->builder = new Builder(
+            $this->productFactoryMock,
+            $this->loggerMock,
+            $this->registryMock,
+            $this->wysiwygConfigMock
+        );
+    }
+
+    public function testBuildWhenProductExistAndPossibleToLoadProduct()
+    {
+        $valueMap = array(
+            array('id', null, 2),
+            array('store', 0, 'some_store'),
+            array('type', null, 'type_id'),
+            array('set', null, 3),
+            array('store', null, 'store')
+        );
+        $this->requestMock->expects($this->any())->method('getParam')->will($this->returnValueMap($valueMap));
+        $this->productFactoryMock
+            ->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($this->productMock));
+        $this->productMock->expects($this->once())->method('setStoreId')->with('some_store')->will($this->returnSelf());
+        $this->productMock->expects($this->never())->method('setTypeId');
+        $this->productMock->expects($this->once())->method('load')->with(2)->will($this->returnSelf());
+        $this->productMock->expects($this->once())->method('setAttributeSetId')->with(3)->will($this->returnSelf());
+        $registryValueMap = array(
+            array('product', $this->productMock, $this->registryMock),
+            array('current_product', $this->productMock, $this->registryMock)
+        );
+        $this->registryMock->expects($this->any())->method('register')->will($this->returnValueMap($registryValueMap));
+        $this->wysiwygConfigMock->expects($this->once())->method('setStoreId')->with('store');
+        $this->assertEquals($this->productMock, $this->builder->build($this->requestMock));
+    }
+
+    public function testBuildWhenImpossibleLoadProduct()
+    {
+        $valueMap = array(
+            array('id', null, 15),
+            array('store', 0, 'some_store'),
+            array('type', null, 'type_id'),
+            array('set', null, 3),
+            array('store', null, 'store')
+        );
+        $this->requestMock->expects($this->any())->method('getParam')->will($this->returnValueMap($valueMap));
+        $this->productFactoryMock
+            ->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($this->productMock));
+        $this->productMock->expects($this->once())->method('setStoreId')->with('some_store')->will($this->returnSelf());
+        $this->productMock->expects($this->once())
+            ->method('setTypeId')
+            ->with(\Magento\Catalog\Model\Product\Type::DEFAULT_TYPE)
+            ->will($this->returnSelf());
+        $this->productMock
+            ->expects($this->once())
+            ->method('load')
+            ->with(15)
+            ->will($this->throwException(new \Exception()));
+        $this->loggerMock->expects($this->once())->method('logException');
+        $this->productMock->expects($this->once())->method('setAttributeSetId')->with(3)->will($this->returnSelf());
+        $registryValueMap = array(
+            array('product', $this->productMock, $this->registryMock),
+            array('current_product', $this->productMock, $this->registryMock)
+        );
+        $this->registryMock->expects($this->any())->method('register')->will($this->returnValueMap($registryValueMap));
+        $this->wysiwygConfigMock->expects($this->once())->method('setStoreId')->with('store');
+        $this->assertEquals($this->productMock, $this->builder->build($this->requestMock));
+    }
+
+    public function testBuildWhenProductNotExist()
+    {
+        $valueMap = array(
+            array('id', null, null),
+            array('store', 0, 'some_store'),
+            array('type', null, 'type_id'),
+            array('set', null, 3),
+            array('store', null, 'store')
+        );
+        $this->requestMock->expects($this->any())->method('getParam')->will($this->returnValueMap($valueMap));
+        $this->productFactoryMock
+            ->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($this->productMock));
+        $this->productMock->expects($this->once())->method('setStoreId')->with('some_store')->will($this->returnSelf());
+        $productValueMap = array(
+            array('type_id', $this->productMock),
+            array(\Magento\Catalog\Model\Product\Type::DEFAULT_TYPE, $this->productMock)
+        );
+        $this->productMock->expects($this->any())->method('setTypeId')->will($this->returnValueMap($productValueMap));
+        $this->productMock->expects($this->never())->method('load');
+        $this->productMock->expects($this->once())->method('setAttributeSetId')->with(3)->will($this->returnSelf());
+        $registryValueMap = array(
+            array('product', $this->productMock, $this->registryMock),
+            array('current_product', $this->productMock, $this->registryMock)
+        );
+        $this->registryMock->expects($this->any())->method('register')->will($this->returnValueMap($registryValueMap));
+        $this->wysiwygConfigMock->expects($this->once())->method('setStoreId')->with('store');
+        $this->assertEquals($this->productMock, $this->builder->build($this->requestMock));
+    }
+
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper/HandlerFactoryTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper/HandlerFactoryTest.php
new file mode 100644
index 00000000000..5200b1b464d
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper/HandlerFactoryTest.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper;
+
+class HandlerFactoryTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var HandlerFactory
+     */
+    protected $_model;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_objectManagerMock;
+
+    protected function setUp()
+    {
+        $this->_objectManagerMock = $this->getMock('\Magento\ObjectManager');
+        $this->_model = new HandlerFactory($this->_objectManagerMock);
+    }
+
+    public function testCreateWithInvalidType()
+    {
+        $this->setExpectedException(
+            '\InvalidArgumentException',
+            '\Magento\Object does not implement '
+            . 'Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper\HandlerInterface'
+        );
+        $this->_objectManagerMock->expects($this->never())->method('create');
+        $this->_model->create('\Magento\Object');
+    }
+
+    public function testCreateWithValidType()
+    {
+        $this->_objectManagerMock->expects($this->once())
+            ->method('create')
+            ->with(
+                '\Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper\Plugin\Handler\Composite'
+            )->will($this->returnValue('object'));
+        $this->assertEquals(
+            'object',
+            $this->_model->create(
+                '\Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper\Plugin\Handler\Composite'
+            )
+        );
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper/Plugin/Handler/CompositeTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper/Plugin/Handler/CompositeTest.php
new file mode 100644
index 00000000000..c2e43d1c01d
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper/Plugin/Handler/CompositeTest.php
@@ -0,0 +1,54 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper\Plugin\Handler;
+
+class CompositeTest extends \PHPUnit_Framework_TestCase
+{
+    public function testHandle()
+    {
+        $factoryMock = $this->getMock(
+            '\Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper\HandlerFactory',
+            array(), array(), '', false
+        );
+
+        $constructorMock = $this->getMock(
+            '\Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper\HandlerInterface'
+        );
+
+        $factoryMock->expects($this->exactly(2))
+            ->method('create')
+            ->with('handlerInstance')
+            ->will($this->returnValue($constructorMock));
+
+        $productMock = $this->getMock('\Magento\Catalog\Model\Product', array(), array(), '', false);
+
+        $constructorMock->expects($this->exactly(2))->method('handle')->with($productMock);
+
+        $model = new Composite(
+            $factoryMock, array('handlerInstance', 'handlerInstance')
+        );
+
+        $model->handle($productMock);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Helper/Product/Flat/IndexerTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Helper/Product/Flat/IndexerTest.php
new file mode 100644
index 00000000000..b011ae2e48a
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Helper/Product/Flat/IndexerTest.php
@@ -0,0 +1,146 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Helper\Product\Flat;
+
+class IndexerTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\TestFramework\Helper\ObjectManager
+     */
+    protected $_objectManager;
+
+    /**
+     * @var \Magento\Catalog\Helper\Product\Flat\Indexer
+     */
+    protected $_model;
+
+    /**
+     * @var \Magento\Core\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_storeManagerMock;
+
+    /**
+     * @var \Magento\App\Resource|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_resourceMock;
+
+    public function setUp()
+    {
+        $contextMock = $this->getMock('Magento\App\Helper\Context', array(), array(), '', false);
+
+        $this->_resourceMock = $this->getMock(
+            'Magento\App\Resource', array('getTableName', 'getConnection'), array(), '', false
+        );
+        $this->_resourceMock->expects($this->any())
+            ->method('getTableName')
+            ->will($this->returnArgument(0));
+
+        $flatHelperMock = $this->getMock(
+            '\Magento\Catalog\Helper\Product\Flat', array('isAddChildData'), array(), '', false
+        );
+        $flatHelperMock->expects($this->any())
+            ->method('isAddChildData')
+            ->will($this->returnValue(true));
+
+        $eavConfigMock = $this->getMock('\Magento\Eav\Model\Config', array(), array(), '', false);
+
+        $attributeConfigMock = $this->getMock('\Magento\Catalog\Model\Attribute\Config', array(), array(), '', false);
+
+        $resourceConfigFactoryMock = $this->getMock(
+            '\Magento\Catalog\Model\Resource\ConfigFactory', array(), array(), '', false
+        );
+
+        $eavFactoryMock = $this->getMock('\Magento\Eav\Model\Entity\AttributeFactory', array(), array(), '', false);
+
+        $this->_storeManagerMock = $this->getMock('Magento\Core\Model\StoreManagerInterface');
+
+        $this->_objectManager = new \Magento\TestFramework\Helper\ObjectManager($this);
+        $this->_model = $this->_objectManager->getObject('Magento\Catalog\Helper\Product\Flat\Indexer', array(
+            'context'             => $contextMock,
+            'resource'            => $this->_resourceMock,
+            'flatHelper'          => $flatHelperMock,
+            'eavConfig'           => $eavConfigMock,
+            'attributeConfig'     => $attributeConfigMock,
+            'configFactory'       => $resourceConfigFactoryMock,
+            'attributeFactory'    => $eavFactoryMock,
+            'storeManager'        => $this->_storeManagerMock,
+            'flatAttributeGroups' => array('catalog_product')
+        ));
+    }
+
+    public function testGetFlatColumnsDdlDefinition()
+    {
+        foreach ($this->_model->getFlatColumnsDdlDefinition() as $column) {
+            $this->assertTrue(is_array($column), 'Columns must be an array value');
+            $this->assertArrayHasKey('type', $column, 'Column must have type definition at least');
+        }
+    }
+
+    public function testGetFlatTableName()
+    {
+        $storeId = 1;
+        $this->assertEquals('catalog_product_flat_1', $this->_model->getFlatTableName($storeId));
+    }
+
+    public function testDeleteAbandonedStoreFlatTables()
+    {
+        $connectionMock = $this->getMock(
+            'Magento\DB\Adapter\Pdo\Mysql', array('getTables', 'dropTable'), [], '', false
+        );
+
+        $connectionMock->expects($this->once())
+            ->method('getTables')
+            ->with('catalog_product_flat_%')
+            ->will($this->returnValue(array(
+                'catalog_product_flat_1',
+                'catalog_product_flat_2',
+                'catalog_product_flat_3'
+            )));
+
+        $connectionMock->expects($this->once())
+            ->method('dropTable')
+            ->with('catalog_product_flat_3');
+
+        $this->_resourceMock->expects($this->once())
+            ->method('getConnection')
+            ->with('write')
+            ->will($this->returnValue($connectionMock));
+
+        $stores = [];
+        foreach (array(1 ,2) as $storeId) {
+            $store = $this->getMock('Magento\Core\Model\Store', array('getId', '__sleep', '__wakeup'), [], '', false);
+            $store->expects($this->once())
+                ->method('getId')
+                ->will($this->returnValue($storeId));
+            $stores[] = $store;
+        }
+
+        $this->_storeManagerMock->expects($this->once())
+            ->method('getStores')
+            ->will($this->returnValue($stores));
+
+        $this->_model->deleteAbandonedStoreFlatTables();
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Attribute/Config/XsdTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Attribute/Config/XsdTest.php
index fb491d4b4af..cfe1db8222d 100644
--- a/dev/tests/unit/testsuite/Magento/Catalog/Model/Attribute/Config/XsdTest.php
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/Attribute/Config/XsdTest.php
@@ -44,7 +44,7 @@ class XsdTest extends \PHPUnit_Framework_TestCase
      */
     public function testExemplarXml($fixtureXml, array $expectedErrors)
     {
-        $dom = new \Magento\Config\Dom($fixtureXml, array(), null, '%message%');
+        $dom = new \Magento\Config\Dom($fixtureXml, array(), null, null, '%message%');
         $actualResult = $dom->validate($this->_schemaFile, $actualErrors);
         $this->assertEquals(empty($expectedErrors), $actualResult);
         $this->assertEquals($expectedErrors, $actualErrors);
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Attribute/LockValidatorCompositeTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Attribute/LockValidatorCompositeTest.php
new file mode 100644
index 00000000000..057c1b1db8d
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/Attribute/LockValidatorCompositeTest.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Catalog\Model\Attribute;
+
+class LockValidatorCompositeTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Catalog\Model\Attribute\LockValidatorComposite
+     */
+    protected $model;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $objectManagerMock;
+
+    protected function setUp()
+    {
+        $this->objectManagerMock = $this->getMock('\Magento\ObjectManager');
+    }
+
+    /**
+     * @expectedException \InvalidArgumentException
+     */
+    public function testCompositionsWithInvalidValidatorInstance()
+    {
+        $validators = array(
+            'Magento\Catalog\Model'
+        );
+        $this->model =
+            new \Magento\Catalog\Model\Attribute\LockValidatorComposite($this->objectManagerMock, $validators);
+    }
+
+    public function testValidateWithValidValidatorInstance()
+    {
+        $validators = array(
+            'Magento\Catalog\Model\Attribute\LockValidatorComposite'
+        );
+        $lockValidatorMock = $this->getMock('Magento\Catalog\Model\Attribute\LockValidatorInterface');
+        $this->objectManagerMock->expects($this->any())
+            ->method('get')
+            ->with('Magento\Catalog\Model\Attribute\LockValidatorComposite')
+            ->will($this->returnValue($lockValidatorMock));
+
+        $this->model = new \Magento\Catalog\Model\Attribute\LockValidatorComposite(
+            $this->objectManagerMock, $validators
+        );
+        $abstractModelHelper = $this->getMock('\Magento\Catalog\Model\Product', array(), array(), '', false, false);
+        $lockValidatorMock->expects($this->once())->method('validate')->with($abstractModelHelper);
+        $this->model->validate($abstractModelHelper);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Category/Product/Plugin/IndexerStateTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Category/Product/Plugin/IndexerStateTest.php
new file mode 100644
index 00000000000..dd8f0ba3388
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Category/Product/Plugin/IndexerStateTest.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Category\Product\Plugin;
+
+class IndexerStateTest extends \PHPUnit_Framework_TestCase
+{
+    public function testAfterSetStatus()
+    {
+        $testableIndex  = \Magento\Catalog\Model\Indexer\Product\Category::INDEXER_ID;
+        $changedIndex   = \Magento\Catalog\Model\Indexer\Category\Product::INDEXER_ID;
+        $testableStatus = 'testable_status';
+
+        $testableState = $this->getMockBuilder('Magento\Indexer\Model\Indexer\State')
+            ->setMethods(array('getIndexerId', 'getStatus', '__wakeup'))
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $testableState->expects($this->exactly(2))
+            ->method('getIndexerId')
+            ->will($this->returnValue($testableIndex));
+
+        $testableState->expects($this->once())
+            ->method('getStatus')
+            ->will($this->returnValue($testableStatus));
+
+        $state = $this->getMockBuilder('Magento\Indexer\Model\Indexer\State')
+            ->setMethods(array('setData', 'loadByIndexer', 'save', '__wakeup'))
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $state->expects($this->once())
+            ->method('loadByIndexer')
+            ->with($changedIndex)
+            ->will($this->returnSelf());
+
+        $state->expects($this->once())
+            ->method('save')
+            ->will($this->returnSelf());
+
+        $state->expects($this->at(1))
+            ->method('setData')
+            ->with(
+                $this->logicalOr(
+                    $this->equalTo('status'),
+                    $this->equalTo($testableStatus)
+                )
+            )
+            ->will($this->returnSelf());
+
+        $model = new \Magento\Catalog\Model\Indexer\Category\Product\Plugin\IndexerState($state);
+        $this->assertInstanceOf('\Magento\Indexer\Model\Indexer\State', $model->afterSetStatus($testableState));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Category/Product/Plugin/MviewStateTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Category/Product/Plugin/MviewStateTest.php
new file mode 100644
index 00000000000..8279da1f955
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Category/Product/Plugin/MviewStateTest.php
@@ -0,0 +1,328 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Category\Product\Plugin;
+
+class MviewStateTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @return array
+     */
+    public function testAfterSetStatusSuspendDataProvider()
+    {
+        return [
+            ['suspended', 'idle'],
+            ['suspended', 'working'],
+        ];
+    }
+
+    /**
+     * @param string $stateStatus
+     * @param string $relatedStatus
+     * @dataProvider testAfterSetStatusSuspendDataProvider
+     */
+    public function testAfterSetStatusSuspend($stateStatus, $relatedStatus)
+    {
+        $stateViewId  = \Magento\Catalog\Model\Indexer\Product\Category::INDEXER_ID;
+        $relatedViewId   = \Magento\Catalog\Model\Indexer\Category\Product::INDEXER_ID;
+        $relatedVersion = 'related_version';
+
+        $state = $this->getMockBuilder('Magento\Mview\View\StateInterface')
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+
+        $state->expects($this->exactly(2))
+            ->method('getViewId')
+            ->will($this->returnValue($stateViewId));
+
+        $state->expects($this->any())
+            ->method('getStatus')
+            ->will($this->returnValue($stateStatus));
+
+        $relatedViewState = $this->getMockBuilder('Magento\Mview\View\StateInterface')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $relatedViewState->expects($this->once())
+            ->method('loadByView')
+            ->with($this->equalTo($relatedViewId))
+            ->will($this->returnSelf());
+
+        $relatedViewState->expects($this->once())
+            ->method('getMode')
+            ->will($this->returnValue('enabled'));
+
+        $relatedViewState->expects($this->once())
+            ->method('getStatus')
+            ->will($this->returnValue($relatedStatus));
+
+        $relatedViewState->expects($this->once())
+            ->method('save')
+            ->will($this->returnSelf());
+
+        $relatedViewState->expects($this->once())
+            ->method('setVersionId')
+            ->with($this->equalTo($relatedVersion))
+            ->will($this->returnSelf());
+
+        $relatedViewState->expects($this->once())
+            ->method('setStatus')
+            ->with($this->equalTo($stateStatus))
+            ->will($this->returnSelf());
+
+        $relatedViewChangelog = $this->getMockBuilder('Magento\Mview\View\ChangelogInterface')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $relatedViewChangelog->expects($this->once())
+            ->method('setViewId')
+            ->with($this->equalTo($relatedViewId))
+            ->will($this->returnSelf());
+
+        $relatedViewChangelog->expects($this->once())
+            ->method('getVersion')
+            ->will($this->returnValue($relatedVersion));
+
+        $model = new \Magento\Catalog\Model\Indexer\Category\Product\Plugin\MviewState(
+            $relatedViewState,
+            $relatedViewChangelog
+        );
+        $this->assertInstanceOf('\Magento\Mview\View\StateInterface', $model->afterSetStatus($state));
+    }
+
+    /**
+     * @return array
+     */
+    public function testAfterSetStatusResumeDataProvider()
+    {
+        return [
+            ['idle', 'suspended'],
+            ['working', 'suspended'],
+        ];
+    }
+
+    /**
+     * @param string $stateStatus
+     * @param string $relatedStatus
+     * @dataProvider testAfterSetStatusResumeDataProvider
+     */
+    public function testAfterSetStatusResume($stateStatus, $relatedStatus)
+    {
+        $stateViewId  = \Magento\Catalog\Model\Indexer\Product\Category::INDEXER_ID;
+        $relatedViewId   = \Magento\Catalog\Model\Indexer\Category\Product::INDEXER_ID;
+
+        $state = $this->getMockBuilder('Magento\Mview\View\StateInterface')
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+
+        $state->expects($this->exactly(2))
+            ->method('getViewId')
+            ->will($this->returnValue($stateViewId));
+
+        $state->expects($this->any())
+            ->method('getStatus')
+            ->will($this->returnValue($stateStatus));
+
+        $relatedViewState = $this->getMockBuilder('Magento\Mview\View\StateInterface')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $relatedViewState->expects($this->once())
+            ->method('loadByView')
+            ->with($this->equalTo($relatedViewId))
+            ->will($this->returnSelf());
+
+        $relatedViewState->expects($this->once())
+            ->method('getMode')
+            ->will($this->returnValue('enabled'));
+
+        $relatedViewState->expects($this->any())
+            ->method('getStatus')
+            ->will($this->returnValue($relatedStatus));
+
+        $relatedViewState->expects($this->once())
+            ->method('save')
+            ->will($this->returnSelf());
+
+        $relatedViewState->expects($this->never())
+            ->method('setVersionId');
+
+        $relatedViewState->expects($this->once())
+            ->method('setStatus')
+            ->with($this->equalTo('idle'))
+            ->will($this->returnSelf());
+
+        $relatedViewChangelog = $this->getMockBuilder('Magento\Mview\View\ChangelogInterface')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $model = new \Magento\Catalog\Model\Indexer\Category\Product\Plugin\MviewState(
+            $relatedViewState,
+            $relatedViewChangelog
+        );
+        $this->assertInstanceOf('\Magento\Mview\View\StateInterface', $model->afterSetStatus($state));
+    }
+
+    /**
+     * @return array
+     */
+    public function testAfterSetStatusSkipDataProvider()
+    {
+        return [
+            ['idle', 'idle'],
+            ['working', 'working'],
+            ['suspended', 'suspended'],
+            ['idle', 'working'],
+            ['working', 'idle'],
+        ];
+    }
+
+    /**
+     * @param string $stateStatus
+     * @param string $relatedStatus
+     * @dataProvider testAfterSetStatusSkipDataProvider
+     */
+    public function testAfterSetStatusSkip($stateStatus, $relatedStatus)
+    {
+        $stateViewId  = \Magento\Catalog\Model\Indexer\Product\Category::INDEXER_ID;
+        $relatedViewId   = \Magento\Catalog\Model\Indexer\Category\Product::INDEXER_ID;
+
+        $state = $this->getMockBuilder('Magento\Mview\View\StateInterface')
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+
+        $state->expects($this->exactly(2))
+            ->method('getViewId')
+            ->will($this->returnValue($stateViewId));
+
+        $state->expects($this->any())
+            ->method('getStatus')
+            ->will($this->returnValue($stateStatus));
+
+        $relatedViewState = $this->getMockBuilder('Magento\Mview\View\StateInterface')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $relatedViewState->expects($this->once())
+            ->method('loadByView')
+            ->with($this->equalTo($relatedViewId))
+            ->will($this->returnSelf());
+
+        $relatedViewState->expects($this->once())
+            ->method('getMode')
+            ->will($this->returnValue('enabled'));
+
+        $relatedViewState->expects($this->any())
+            ->method('getStatus')
+            ->will($this->returnValue($relatedStatus));
+
+        $relatedViewState->expects($this->never())
+            ->method('save');
+
+        $relatedViewState->expects($this->never())
+            ->method('setVersionId');
+
+        $relatedViewState->expects($this->never())
+            ->method('setStatus');
+
+        $relatedViewChangelog = $this->getMockBuilder('Magento\Mview\View\ChangelogInterface')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $model = new \Magento\Catalog\Model\Indexer\Category\Product\Plugin\MviewState(
+            $relatedViewState,
+            $relatedViewChangelog
+        );
+        $this->assertInstanceOf('\Magento\Mview\View\StateInterface', $model->afterSetStatus($state));
+    }
+
+    /**
+     * @return array
+     */
+    public function testAfterSetStatusDisabledDataProvider()
+    {
+        return [
+            ['idle'],
+            ['working'],
+            ['suspended'],
+        ];
+    }
+
+    /**
+     * @param string $stateStatus
+     * @dataProvider testAfterSetStatusDisabledDataProvider
+     */
+    public function testAfterSetStatusDisabled($stateStatus)
+    {
+        $stateViewId  = \Magento\Catalog\Model\Indexer\Product\Category::INDEXER_ID;
+        $relatedViewId   = \Magento\Catalog\Model\Indexer\Category\Product::INDEXER_ID;
+
+        $state = $this->getMockBuilder('Magento\Mview\View\StateInterface')
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+
+        $state->expects($this->exactly(2))
+            ->method('getViewId')
+            ->will($this->returnValue($stateViewId));
+
+        $state->expects($this->any())
+            ->method('getStatus')
+            ->will($this->returnValue($stateStatus));
+
+        $relatedViewState = $this->getMockBuilder('Magento\Mview\View\StateInterface')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $relatedViewState->expects($this->once())
+            ->method('loadByView')
+            ->with($this->equalTo($relatedViewId))
+            ->will($this->returnSelf());
+
+        $relatedViewState->expects($this->once())
+            ->method('getMode')
+            ->will($this->returnValue('disabled'));
+
+        $relatedViewState->expects($this->never())
+            ->method('getStatus');
+
+        $relatedViewState->expects($this->never())
+            ->method('save');
+
+        $relatedViewState->expects($this->never())
+            ->method('setVersionId');
+
+        $relatedViewState->expects($this->never())
+            ->method('setStatus');
+
+        $relatedViewChangelog = $this->getMockBuilder('Magento\Mview\View\ChangelogInterface')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $model = new \Magento\Catalog\Model\Indexer\Category\Product\Plugin\MviewState(
+            $relatedViewState,
+            $relatedViewChangelog
+        );
+        $this->assertInstanceOf('\Magento\Mview\View\StateInterface', $model->afterSetStatus($state));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Category/Product/Plugin/StoreGroupTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Category/Product/Plugin/StoreGroupTest.php
new file mode 100644
index 00000000000..aac681a7ec9
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Category/Product/Plugin/StoreGroupTest.php
@@ -0,0 +1,150 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *   
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Catalog\Model\Indexer\Category\Product\Plugin;
+
+class StoreGroupTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Indexer\Model\IndexerInterface
+     */
+    protected $indexerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Code\Plugin\InvocationChain
+     */
+    protected $pluginMock;
+
+    /**
+     * @var StoreView
+     */
+    protected $model;
+
+    protected function setUp()
+    {
+        $this->pluginMock = $this->getMock(
+            'Magento\Code\Plugin\InvocationChain', array('proceed'), array(), '', false
+        );
+        $this->indexerMock = $this->getMockForAbstractClass(
+            'Magento\Indexer\Model\IndexerInterface',
+            array(), '', false, false, true, array('getId', 'getState', '__wakeup')
+        );
+        $this->model = new StoreGroup(
+            $this->indexerMock
+        );
+    }
+
+    /**
+     * @param array $valueMap
+     * @dataProvider changedDataProvider
+     */
+    public function testAroundSave($valueMap)
+    {
+        $this->mockIndexerMethods();
+        $groupMock = $this->getMock(
+            'Magento\Core\Model\Store\Group', array('dataHasChangedFor', 'isObjectNew', '__wakeup'), array(), '', false
+        );
+        $groupMock->expects($this->exactly(2))
+            ->method('dataHasChangedFor')
+            ->will($this->returnValueMap($valueMap));
+        $groupMock->expects($this->once())
+            ->method('isObjectNew')
+            ->will($this->returnValue(false));
+
+        $arguments = array($groupMock);
+        $this->mockPluginProceed($arguments);
+        $this->assertFalse($this->model->aroundSave($arguments, $this->pluginMock));
+    }
+
+    /**
+     * @param array $valueMap
+     * @dataProvider changedDataProvider
+     */
+    public function testAroundSaveNotNew($valueMap)
+    {
+        $groupMock = $this->getMock(
+            'Magento\Core\Model\Store\Group', array('dataHasChangedFor', 'isObjectNew', '__wakeup'), array(), '', false
+        );
+        $groupMock->expects($this->exactly(2))
+            ->method('dataHasChangedFor')
+            ->will($this->returnValueMap($valueMap));
+        $groupMock->expects($this->once())
+            ->method('isObjectNew')
+            ->will($this->returnValue(true));
+
+        $arguments = array($groupMock);
+        $this->mockPluginProceed($arguments);
+        $this->assertFalse($this->model->aroundSave($arguments, $this->pluginMock));
+    }
+
+    public function changedDataProvider()
+    {
+        return array(array(
+            array(
+                array('root_category_id', true),
+                array('website_id', false),
+            ),
+            array(
+                array('root_category_id', false),
+                array('website_id', true),
+            ),
+        ));
+    }
+
+    public function testAroundSaveWithoutChanges()
+    {
+        $groupMock = $this->getMock(
+            'Magento\Core\Model\Store\Group', array('dataHasChangedFor', 'isObjectNew', '__wakeup'), array(), '', false
+        );
+        $groupMock->expects($this->exactly(2))
+            ->method('dataHasChangedFor')
+            ->will($this->returnValueMap(array(
+                array('root_category_id', false),
+                array('website_id', false),
+            )));
+        $groupMock->expects($this->never())
+            ->method('isObjectNew');
+
+        $arguments = array($groupMock);
+        $this->mockPluginProceed($arguments);
+        $this->assertFalse($this->model->aroundSave($arguments, $this->pluginMock));
+
+    }
+
+    protected function mockIndexerMethods()
+    {
+        $this->indexerMock->expects($this->once())
+            ->method('getId')
+            ->will($this->returnValue(1));
+        $this->indexerMock->expects($this->once())
+            ->method('invalidate');
+    }
+
+    protected function mockPluginProceed($arguments, $returnValue = false)
+    {
+        $this->pluginMock->expects($this->once())
+            ->method('proceed')
+            ->with($arguments)
+            ->will($this->returnValue($returnValue));
+    }
+}
\ No newline at end of file
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Category/Product/Plugin/StoreViewTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Category/Product/Plugin/StoreViewTest.php
new file mode 100644
index 00000000000..89d37a428f2
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Category/Product/Plugin/StoreViewTest.php
@@ -0,0 +1,134 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *   
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Catalog\Model\Indexer\Category\Product\Plugin;
+
+class StoreViewTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Indexer\Model\IndexerInterface
+     */
+    protected $indexerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Code\Plugin\InvocationChain
+     */
+    protected $pluginMock;
+
+    /**
+     * @var StoreView
+     */
+    protected $model;
+
+    protected function setUp()
+    {
+        $this->pluginMock = $this->getMock(
+            'Magento\Code\Plugin\InvocationChain', array('proceed'), array(), '', false
+        );
+        $this->indexerMock = $this->getMockForAbstractClass(
+            'Magento\Indexer\Model\IndexerInterface',
+            array(), '', false, false, true, array('getId', 'getState', '__wakeup')
+        );
+        $this->model = new StoreView(
+            $this->indexerMock
+        );
+    }
+
+    public function testAroundSaveNewObject()
+    {
+        $this->mockIndexerMethods();
+        $storeMock = $this->getMock(
+            'Magento\Core\Model\Store', array('isObjectNew', 'dataHasChangedFor', '__wakeup'), array(), '', false
+        );
+        $storeMock->expects($this->once())
+            ->method('isObjectNew')
+            ->will($this->returnValue(true));
+        $arguments = array($storeMock);
+        $this->mockPluginProceed($arguments);
+        $this->assertFalse($this->model->aroundSave($arguments, $this->pluginMock));
+    }
+
+    public function testAroundSaveHasChanged()
+    {
+        $storeMock = $this->getMock(
+            'Magento\Core\Model\Store', array('isObjectNew', 'dataHasChangedFor', '__wakeup'), array(), '', false
+        );
+        $storeMock->expects($this->once())
+            ->method('dataHasChangedFor')
+            ->with('group_id')
+            ->will($this->returnValue(true));
+        $arguments = array($storeMock);
+        $this->mockPluginProceed($arguments);
+        $this->assertFalse($this->model->aroundSave($arguments, $this->pluginMock));
+    }
+
+    public function testAroundSaveNoNeed()
+    {
+        $storeMock = $this->getMock(
+            'Magento\Core\Model\Store', array('isObjectNew', 'dataHasChangedFor', '__wakeup'), array(), '', false
+        );
+        $storeMock->expects($this->once())
+            ->method('dataHasChangedFor')
+            ->with('group_id')
+            ->will($this->returnValue(false));
+        $arguments = array($storeMock);
+        $this->mockPluginProceed($arguments);
+        $this->assertFalse($this->model->aroundSave($arguments, $this->pluginMock));
+    }
+
+    /**
+     * @return \PHPUnit_Framework_MockObject_MockObject|\Magento\Indexer\Model\Indexer\State
+     */
+    protected function getStateMock()
+    {
+        $stateMock = $this->getMock(
+            'Magento\Indexer\Model\Indexer\State', array('setStatus', 'save', '__wakeup'), array(), '', false
+        );
+        $stateMock->expects($this->once())
+            ->method('setStatus')
+            ->with('invalid')
+            ->will($this->returnSelf());
+        $stateMock->expects($this->once())
+            ->method('save')
+            ->will($this->returnSelf());
+
+        return $stateMock;
+    }
+
+    protected function mockIndexerMethods()
+    {
+        $this->indexerMock->expects($this->once())
+            ->method('getId')
+            ->will($this->returnValue(1));
+        $this->indexerMock->expects($this->once())
+            ->method('invalidate');
+    }
+
+    protected function mockPluginProceed($arguments, $returnValue = false)
+    {
+        $this->pluginMock->expects($this->once())
+            ->method('proceed')
+            ->with($arguments)
+            ->will($this->returnValue($returnValue));
+    }
+}
\ No newline at end of file
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Category/ProductTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Category/ProductTest.php
new file mode 100644
index 00000000000..8a683bc0c53
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Category/ProductTest.php
@@ -0,0 +1,128 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Category;
+
+class ProductTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Catalog\Model\Indexer\Category\Product
+     */
+    protected $model;
+
+    /**
+     * @var \Magento\Catalog\Model\Indexer\Category\Product\Action\FullFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $fullMock;
+
+    /**
+     * @var \Magento\Catalog\Model\Indexer\Category\Product\Action\RowsFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $rowsMock;
+
+    /**
+     * @var \Magento\Indexer\Model\IndexerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $indexerMock;
+
+    protected function setUp()
+    {
+        $this->fullMock = $this->getMock(
+            'Magento\Catalog\Model\Indexer\Category\Product\Action\FullFactory',
+            array('create'), array(), '', false
+        );
+
+        $this->rowsMock = $this->getMock(
+            'Magento\Catalog\Model\Indexer\Category\Product\Action\RowsFactory',
+            array('create'), array(), '', false
+        );
+
+        $this->indexerMock = $this->getMockForAbstractClass(
+            'Magento\Indexer\Model\IndexerInterface',
+            array(), '', false, false, true, array('getId', 'load', 'isInvalid', 'isWorking', '__wakeup')
+        );
+
+        $this->model = new \Magento\Catalog\Model\Indexer\Category\Product(
+            $this->fullMock, $this->rowsMock, $this->indexerMock
+        );
+    }
+
+    public function testExecuteWithIndexerWorking()
+    {
+        $ids = array(1, 2, 3);
+
+        $this->indexerMock->expects($this->once())
+            ->method('load')
+            ->with('catalog_category_product')
+            ->will($this->returnSelf());
+        $this->indexerMock->expects($this->once())
+            ->method('isWorking')
+            ->will($this->returnValue(true));
+
+        $rowMock = $this->getMock(
+            'Magento\Catalog\Model\Indexer\Category\Product\Action\Rows', array('execute'), array(), '', false
+        );
+        $rowMock->expects($this->at(0))
+            ->method('execute')
+            ->with($ids, true)
+            ->will($this->returnSelf());
+        $rowMock->expects($this->at(1))
+            ->method('execute')
+            ->with($ids, false)
+            ->will($this->returnSelf());
+
+        $this->rowsMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($rowMock));
+
+        $this->model->execute($ids);
+    }
+
+    public function testExecuteWithIndexerNotWorking()
+    {
+        $ids = array(1, 2, 3);
+
+        $this->indexerMock->expects($this->once())
+            ->method('load')
+            ->with('catalog_category_product')
+            ->will($this->returnSelf());
+        $this->indexerMock->expects($this->once())
+            ->method('isWorking')
+            ->will($this->returnValue(false));
+
+        $rowMock = $this->getMock(
+            'Magento\Catalog\Model\Indexer\Category\Product\Action\Rows', array('execute'), array(), '', false
+        );
+        $rowMock->expects($this->once())
+            ->method('execute')
+            ->with($ids, false)
+            ->will($this->returnSelf());
+
+        $this->rowsMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($rowMock));
+
+        $this->model->execute($ids);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/CategoryTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/CategoryTest.php
new file mode 100644
index 00000000000..658a1b53b84
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/CategoryTest.php
@@ -0,0 +1,128 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Product;
+
+class CategoryTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Catalog\Model\Indexer\Category\Product
+     */
+    protected $model;
+
+    /**
+     * @var \Magento\Catalog\Model\Indexer\Category\Product\Action\FullFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $fullMock;
+
+    /**
+     * @var \Magento\Catalog\Model\Indexer\Product\Category\Action\RowsFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $rowsMock;
+
+    /**
+     * @var \Magento\Indexer\Model\IndexerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $indexerMock;
+
+    protected function setUp()
+    {
+        $this->fullMock = $this->getMock(
+            'Magento\Catalog\Model\Indexer\Category\Product\Action\FullFactory',
+            array('create'), array(), '', false
+        );
+
+        $this->rowsMock = $this->getMock(
+            'Magento\Catalog\Model\Indexer\Product\Category\Action\RowsFactory',
+            array('create'), array(), '', false
+        );
+
+        $this->indexerMock = $this->getMockForAbstractClass(
+            'Magento\Indexer\Model\IndexerInterface',
+            array(), '', false, false, true, array('getId', 'load', 'isInvalid', 'isWorking', '__wakeup')
+        );
+
+        $this->model = new \Magento\Catalog\Model\Indexer\Product\Category(
+            $this->fullMock, $this->rowsMock, $this->indexerMock
+        );
+    }
+
+    public function testExecuteWithIndexerWorking()
+    {
+        $ids = array(1, 2, 3);
+
+        $this->indexerMock->expects($this->once())
+            ->method('load')
+            ->with('catalog_product_category')
+            ->will($this->returnSelf());
+        $this->indexerMock->expects($this->once())
+            ->method('isWorking')
+            ->will($this->returnValue(true));
+
+        $rowMock = $this->getMock(
+            'Magento\Catalog\Model\Indexer\Product\Category\Action\Rows', array('execute'), array(), '', false
+        );
+        $rowMock->expects($this->at(0))
+            ->method('execute')
+            ->with($ids, true)
+            ->will($this->returnSelf());
+        $rowMock->expects($this->at(1))
+            ->method('execute')
+            ->with($ids, false)
+            ->will($this->returnSelf());
+
+        $this->rowsMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($rowMock));
+
+        $this->model->execute($ids);
+    }
+
+    public function testExecuteWithIndexerNotWorking()
+    {
+        $ids = array(1, 2, 3);
+
+        $this->indexerMock->expects($this->once())
+            ->method('load')
+            ->with('catalog_product_category')
+            ->will($this->returnSelf());
+        $this->indexerMock->expects($this->once())
+            ->method('isWorking')
+            ->will($this->returnValue(false));
+
+        $rowMock = $this->getMock(
+            'Magento\Catalog\Model\Indexer\Product\Category\Action\Rows', array('execute'), array(), '', false
+        );
+        $rowMock->expects($this->once())
+            ->method('execute')
+            ->with($ids, false)
+            ->will($this->returnSelf());
+
+        $this->rowsMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($rowMock));
+
+        $this->model->execute($ids);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Action/RowTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Action/RowTest.php
new file mode 100644
index 00000000000..011a70a4af9
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Action/RowTest.php
@@ -0,0 +1,51 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @subpackage  unit_tests
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Product\Flat\Action;
+
+use Magento\TestFramework\Helper\ObjectManager;
+
+class RowTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Catalog\Model\Indexer\Product\Flat\Action\Rows
+     */
+    protected $_model;
+
+    public function setUp()
+    {
+        $objectManager = new ObjectManager($this);
+        $this->_model = $objectManager->getObject('Magento\Catalog\Model\Indexer\Product\Flat\Action\Row');
+    }
+
+
+    public function testEmptyId()
+    {
+        $this->setExpectedException('\Magento\Core\Exception', 'Could not rebuild index for undefined product');
+        $this->_model->execute(null);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Action/RowsTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Action/RowsTest.php
new file mode 100644
index 00000000000..7cb6691783f
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Action/RowsTest.php
@@ -0,0 +1,51 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @subpackage  unit_tests
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Product\Flat\Action;
+
+use Magento\TestFramework\Helper\ObjectManager;
+
+class RowsTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Catalog\Model\Indexer\Product\Flat\Action\Rows
+     */
+    protected $_model;
+
+    public function setUp()
+    {
+        $objectManager = new ObjectManager($this);
+        $this->_model = $objectManager->getObject('Magento\Catalog\Model\Indexer\Product\Flat\Action\Rows');
+    }
+
+
+    public function testEmptyIds()
+    {
+        $this->setExpectedException('\Magento\Core\Exception', 'Bad value was supplied.');
+        $this->_model->execute(null);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/ImportTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/ImportTest.php
new file mode 100644
index 00000000000..1c6a204645b
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/ImportTest.php
@@ -0,0 +1,50 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @subpackage  unit_tests
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Product\Flat\Plugin;
+
+class ImportTest extends \PHPUnit_Framework_TestCase
+{
+    public function testAfterImportSource()
+    {
+        /**
+         * @var \Magento\Catalog\Model\Indexer\Product\Flat\Processor|
+         *      \PHPUnit_Framework_MockObject_MockObject $processorMock
+         */
+        $processorMock = $this->getMock(
+            'Magento\Catalog\Model\Indexer\Product\Flat\Processor', array('markIndexerAsInvalid'), array(), '', false
+        );
+
+        $processorMock->expects($this->once())
+            ->method('markIndexerAsInvalid');
+
+        $someData = array(1, 2, 3);
+
+        $model = new \Magento\Catalog\Model\Indexer\Product\Flat\Plugin\Import($processorMock);
+        $this->assertEquals($someData, $model->afterImportSource($someData));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/IndexerConfigDataTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/IndexerConfigDataTest.php
new file mode 100644
index 00000000000..139ccb6d12f
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/IndexerConfigDataTest.php
@@ -0,0 +1,142 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @subpackage  unit_tests
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Product\Flat\Plugin;
+
+class IndexerConfigDataTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Catalog\Model\Indexer\Product\Flat\Plugin\IndexerConfigData
+     */
+    protected $_model;
+
+    /**
+     * @var \Magento\Code\Plugin\InvocationChain|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_chainMock;
+
+    /**
+     * @var \Magento\Catalog\Helper\Product\Flat|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_helperMock;
+
+    protected function setUp()
+    {
+        $this->_helperMock = $this->getMock(
+            'Magento\Catalog\Helper\Product\Flat', array('isEnabled'), array(), '', false
+        );
+
+        $this->_chainMock = $this->getMock(
+            'Magento\Code\Plugin\InvocationChain', array('proceed'), array(), '', false
+        );
+
+        $this->_model = new \Magento\Catalog\Model\Indexer\Product\Flat\Plugin\IndexerConfigData(
+            $this->_helperMock
+        );
+    }
+
+    /**
+     * @param $isFlat
+     * @param array $arguments
+     * @param $inputData
+     * @param $outputData
+     * @dataProvider aroundGetDataProvider
+     */
+    public function testAroundGet($isFlat, array $arguments, $inputData, $outputData)
+    {
+        $this->_helperMock->expects($this->once())
+            ->method('isEnabled')
+            ->will($this->returnValue($isFlat));
+
+        $this->_chainMock->expects($this->once())
+            ->method('proceed')
+            ->with($arguments)
+            ->will($this->returnValue($inputData));
+
+        $this->assertEquals($outputData, $this->_model->aroundGet($arguments, $this->_chainMock));
+    }
+
+    public function aroundGetDataProvider()
+    {
+        $flatIndexerData = array(
+            'indexer_id' => 'catalog_product_flat',
+            'action' => '\Action\Class',
+            'title' => 'Title',
+            'description' => 'Description',
+        );
+        $otherIndexerData = array(
+            'indexer_id' => 'other_indexer',
+            'action' => '\Action\Class',
+            'title' => 'Title',
+            'description' => 'Description',
+        );
+        return array(
+            // flat is enabled, nothing is being changed
+            array(
+                true,
+                array(),
+                array('catalog_product_flat' => $flatIndexerData, 'other_indexer' => $otherIndexerData),
+                array('catalog_product_flat' => $flatIndexerData, 'other_indexer' => $otherIndexerData),
+            ),
+            // flat is disabled, path is absent, flat indexer is being removed
+            array(
+                false,
+                array(),
+                array('catalog_product_flat' => $flatIndexerData, 'other_indexer' => $otherIndexerData),
+                array('other_indexer' => $otherIndexerData),
+            ),
+            // flat is disabled, path is null, flat indexer is being removed
+            array(
+                false,
+                array('path' => null),
+                array('catalog_product_flat' => $flatIndexerData, 'other_indexer' => $otherIndexerData),
+                array('other_indexer' => $otherIndexerData),
+            ),
+            // flat is disabled, path is flat indexer, flat indexer is being removed
+            array(
+                false,
+                array('path' => 'catalog_product_flat'),
+                $flatIndexerData,
+                null,
+            ),
+            // flat is disabled, path is flat indexer, default is array(), flat indexer is being array()
+            array(
+                false,
+                array('path' => 'catalog_product_flat', 'default' => array()),
+                $flatIndexerData,
+                array(),
+            ),
+            // flat is disabled, path is other indexer, nothing is being changed
+            array(
+                false,
+                array('path' => 'other_indexer'),
+                $otherIndexerData,
+                $otherIndexerData,
+            ),
+        );
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/StoreGroupTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/StoreGroupTest.php
new file mode 100644
index 00000000000..dbdd617d245
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/StoreGroupTest.php
@@ -0,0 +1,128 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @subpackage  unit_tests
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Product\Flat\Plugin;
+
+class StoreGroupTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Catalog\Model\Indexer\Product\Flat\Processor|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_processorMock;
+
+    /**
+     * @var \Magento\Core\Model\Store\Group|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_storeGroupMock;
+
+    protected function setUp()
+    {
+        $this->_processorMock = $this->getMock(
+            'Magento\Catalog\Model\Indexer\Product\Flat\Processor', array('markIndexerAsInvalid'), array(), '', false
+        );
+
+        $this->_storeGroupMock = $this->getMock(
+            'Magento\Core\Model\Store\Group', array('getId', '__wakeup', 'dataHasChangedFor'), array(), '', false
+        );
+    }
+
+    /**
+     * @param string $matcherMethod
+     * @param int|null $storeId
+     * @dataProvider storeGroupDataProvider
+     */
+    public function testBeforeSave($matcherMethod, $storeId)
+    {
+        $this->_processorMock->expects($this->$matcherMethod())
+            ->method('markIndexerAsInvalid');
+
+        $this->_storeGroupMock->expects($this->once())
+            ->method('getId')
+            ->will($this->returnValue($storeId));
+
+        $methodArguments = array($this->_storeGroupMock);
+
+        $model = new \Magento\Catalog\Model\Indexer\Product\Flat\Plugin\StoreGroup($this->_processorMock);
+        $this->assertEquals($methodArguments, $model->beforeSave($methodArguments));
+    }
+
+    /**
+     * @param string $matcherMethod
+     * @param bool $websiteChanged
+     * @dataProvider storeGroupWebsiteDataProvider
+     */
+    public function testChangedWebsiteBeforeSave($matcherMethod, $websiteChanged)
+    {
+        $this->_processorMock->expects($this->$matcherMethod())
+            ->method('markIndexerAsInvalid');
+
+        $this->_storeGroupMock->expects($this->once())
+            ->method('getId')
+            ->will($this->returnValue(1));
+
+        $this->_storeGroupMock->expects($this->once())
+            ->method('dataHasChangedFor')->with('root_category_id')
+            ->will($this->returnValue($websiteChanged));
+
+        $methodArguments = array($this->_storeGroupMock);
+
+        $model = new \Magento\Catalog\Model\Indexer\Product\Flat\Plugin\StoreGroup($this->_processorMock);
+        $this->assertEquals($methodArguments, $model->beforeSave($methodArguments));
+    }
+
+    /**
+     * @return array
+     */
+    public function storeGroupWebsiteDataProvider()
+    {
+        return array(
+            array(
+                'once', true
+            ),
+            array(
+                'never', false
+            )
+        );
+    }
+
+    /**
+     * @return array
+     */
+    public function storeGroupDataProvider()
+    {
+        return array(
+            array(
+                'once',
+                null
+            ),
+            array(
+                'never',
+                1
+            )
+        );
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/StoreTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/StoreTest.php
new file mode 100644
index 00000000000..2056e501d00
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/Plugin/StoreTest.php
@@ -0,0 +1,127 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @subpackage  unit_tests
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Product\Flat\Plugin;
+
+class StoreTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Catalog\Model\Indexer\Product\Flat\Processor|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_processorMock;
+
+    /**
+     * @var \Magento\Core\Model\Store|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_storeMock;
+
+    protected function setUp()
+    {
+        $this->_processorMock = $this->getMock(
+            'Magento\Catalog\Model\Indexer\Product\Flat\Processor', array('markIndexerAsInvalid'), array(), '', false
+        );
+
+        $this->_storeMock = $this->getMock(
+            'Magento\Core\Model\Store', array('getId', '__wakeup', 'dataHasChangedFor'), array(), '', false
+        );
+    }
+
+    /**
+     * @param string $matcherMethod
+     * @param int|null $storeId
+     * @dataProvider storeDataProvider
+     */
+    public function testBeforeSave($matcherMethod, $storeId)
+    {
+        $this->_processorMock->expects($this->$matcherMethod())
+            ->method('markIndexerAsInvalid');
+
+        $this->_storeMock->expects($this->once())
+            ->method('getId')
+            ->will($this->returnValue($storeId));
+
+        $methodArguments = array($this->_storeMock);
+
+        $model = new \Magento\Catalog\Model\Indexer\Product\Flat\Plugin\Store($this->_processorMock);
+        $this->assertEquals($methodArguments, $model->beforeSave($methodArguments));
+    }
+
+    /**
+     * @param string $matcherMethod
+     * @param bool $storeGroupChanged
+     * @dataProvider storeGroupDataProvider
+     */
+    public function testBeforeSaveSwitchStoreGroup($matcherMethod, $storeGroupChanged)
+    {
+        $this->_processorMock->expects($this->$matcherMethod())
+            ->method('markIndexerAsInvalid');
+
+        $this->_storeMock->expects($this->once())
+            ->method('getId')
+            ->will($this->returnValue(1));
+
+        $this->_storeMock->expects($this->once())
+            ->method('dataHasChangedFor')->with('group_id')
+            ->will($this->returnValue($storeGroupChanged));
+
+        $methodArguments = array($this->_storeMock);
+
+        $model = new \Magento\Catalog\Model\Indexer\Product\Flat\Plugin\Store($this->_processorMock);
+        $this->assertEquals($methodArguments, $model->beforeSave($methodArguments));
+    }
+    /**
+     * @return array
+     */
+    public function storeGroupDataProvider()
+    {
+        return array(
+            array(
+                'once', true
+            ),
+            array(
+                'never', false
+            )
+        );
+    }
+
+    /**
+     * @return array
+     */
+    public function storeDataProvider()
+    {
+        return array(
+            array(
+                'once',
+                null
+            ),
+            array(
+                'never',
+                1
+            )
+        );
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/ProcessorTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/ProcessorTest.php
new file mode 100644
index 00000000000..047bfa32dd1
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/Indexer/Product/Flat/ProcessorTest.php
@@ -0,0 +1,60 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @subpackage  unit_tests
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Indexer\Product\Flat;
+
+class ProcessorTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\TestFramework\Helper\ObjectManager
+     */
+    protected $_objectManager;
+
+    /**
+     * @var \Magento\Catalog\Model\Indexer\Product\Flat\Processor
+     */
+    protected $_model;
+
+    public function setUp()
+    {
+        $this->_objectManager = new \Magento\TestFramework\Helper\ObjectManager($this);
+
+        $indexerMock = $this->getMock('\Magento\Indexer\Model\Indexer', array('getId'), array(), '', false);
+        $indexerMock->expects($this->any())->method('getId')->will($this->returnValue(1));
+
+        $flatHelperMock = $this->getMock('\Magento\Catalog\Helper\Product\Flat', array(), array(), '', false);
+        $this->_model = $this->_objectManager->getObject('\Magento\Catalog\Model\Indexer\Product\Flat\Processor', array(
+            'indexer' => $indexerMock,
+            'helper'  => $flatHelperMock
+        ));
+    }
+
+    public function testGetIndexer()
+    {
+        $this->assertInstanceOf('\Magento\Indexer\Model\Indexer', $this->_model->getIndexer());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/ObserverTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/ObserverTest.php
deleted file mode 100644
index 4e0a0c52874..00000000000
--- a/dev/tests/unit/testsuite/Magento/Catalog/Model/ObserverTest.php
+++ /dev/null
@@ -1,126 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Catalog
- * @subpackage  unit_tests
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-
-namespace Magento\Catalog\Model;
-
-/**
- * Class \Magento\Catalog\Model\ObserverTest
- *
- * @SuppressWarnings(PHPMD.LongVariable)
- */
-class ObserverTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \Magento\TestFramework\Helper\ObjectManager
-     */
-    protected $_objectHelper;
-
-    /**
-     * @var \Magento\Event\Observer
-     */
-    protected $_observer;
-
-    /**
-     * @var \Magento\Catalog\Model\Observer
-     */
-    protected $_model;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $_requestMock;
-
-    protected function setUp()
-    {
-        $this->_objectHelper = new \Magento\TestFramework\Helper\ObjectManager($this);
-        $catalogCategory = $this->getMock('Magento\Catalog\Helper\Category', array(), array(), '', false);
-        $catalogData = $this->getMock('Magento\Catalog\Helper\Data', array(), array(), '', false);
-        $urlFactoryMock = $this->getMock('Magento\Catalog\Model\UrlFactory', array(), array(), '', false);
-        $productFactoryMock = $this->getMock('Magento\Catalog\Model\Resource\ProductFactory', array(),
-            array(), '', false);
-        $categoryFlatState = $this->getMock('Magento\Catalog\Model\Indexer\Category\Flat\State', array(),
-            array(), '', false);
-        $coreConfig = $this->getMock('Magento\App\ReinitableConfigInterface', array(), array(), '', false);
-        $this->_model = $this->_objectHelper->getObject('Magento\Catalog\Model\Observer', array(
-            'catalogCategory' => $catalogCategory,
-            'catalogData' => $catalogData,
-            'coreConfig' => $coreConfig,
-            'urlFactory' => $urlFactoryMock,
-            'productResourceFactory' => $productFactoryMock,
-            'categoryFlatState' => $categoryFlatState,
-        ));
-        $this->_requestMock = $this->getMock('Magento\App\RequestInterface', array(), array(), '', false);
-    }
-
-    public function testTransitionProductTypeSimple()
-    {
-        $product = new \Magento\Object(array('type_id' => 'simple'));
-        $this->_observer = new \Magento\Event\Observer(array('product' => $product, 'request' => $this->_requestMock));
-        $this->_model->transitionProductType($this->_observer);
-        $this->assertEquals('simple', $product->getTypeId());
-    }
-
-    public function testTransitionProductTypeVirtual()
-    {
-        $product = new \Magento\Object(array('type_id' => 'virtual', 'is_virtual' => ''));
-        $this->_observer = new \Magento\Event\Observer(array('product' => $product, 'request' => $this->_requestMock));
-        $this->_model->transitionProductType($this->_observer);
-        $this->assertEquals('virtual', $product->getTypeId());
-    }
-
-    public function testTransitionProductTypeSimpleToVirtual()
-    {
-        $product = new \Magento\Object(array('type_id' => 'simple', 'is_virtual' => ''));
-        $this->_observer = new \Magento\Event\Observer(array('product' => $product, 'request' => $this->_requestMock));
-        $this->_model->transitionProductType($this->_observer);
-        $this->assertEquals('virtual', $product->getTypeId());
-    }
-
-    public function testTransitionProductTypeVirtualToSimple()
-    {
-        $product = new \Magento\Object(array('type_id' => 'virtual'));
-        $this->_observer = new \Magento\Event\Observer(array('product' => $product, 'request' => $this->_requestMock));
-        $this->_model->transitionProductType($this->_observer);
-        $this->assertEquals('simple', $product->getTypeId());
-    }
-
-    public function testTransitionProductTypeConfigurableToSimple()
-    {
-        $product = new \Magento\Object(array('type_id' => 'configurable'));
-        $this->_observer = new \Magento\Event\Observer(array('product' => $product, 'request' => $this->_requestMock));
-        $this->_model->transitionProductType($this->_observer);
-        $this->assertEquals('simple', $product->getTypeId());
-    }
-
-    public function testTransitionProductTypeConfigurableToVirtual()
-    {
-        $product = new \Magento\Object(array('type_id' => 'configurable', 'is_virtual' => '1'));
-        $this->_observer = new \Magento\Event\Observer(array('product' => $product, 'request' => $this->_requestMock));
-        $this->_model->transitionProductType($this->_observer);
-        $this->assertEquals('virtual', $product->getTypeId());
-    }
-}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/Attribute/Source/Msrp/Type/EnabledTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/Attribute/Source/Msrp/Type/EnabledTest.php
new file mode 100644
index 00000000000..53db01d9a2b
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/Attribute/Source/Msrp/Type/EnabledTest.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @subpackage  unit_tests
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Product\Attribute\Source\Msrp\Type;
+
+use Magento\TestFramework\Helper\ObjectManager;
+
+class EnabledTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Catalog\Model\Product\Attribute\Source\Msrp\Type\Enabled
+     */
+    protected $_model;
+
+    public function setUp()
+    {
+        $objectManager = new ObjectManager($this);
+        $this->_model = $objectManager->getObject('Magento\Catalog\Model\Product\Attribute\Source\Msrp\Type\Enabled');
+    }
+
+    public function testGetFlatColums()
+    {
+        $abstractAttributeMock = $this->getMock(
+            '\Magento\Eav\Model\Entity\Attribute\AbstractAttribute',
+            array('getAttributeCode', '__wakeup'), array(), '', false
+        );
+
+        $abstractAttributeMock->expects($this->any())
+            ->method('getAttributeCode')
+            ->will($this->returnValue('code'));
+
+        $this->_model->setAttribute($abstractAttributeMock);
+
+        $flatColums = $this->_model->getFlatColums();
+
+        $this->assertTrue(is_array($flatColums), 'FlatColums must be an array value');
+        $this->assertTrue(!empty($flatColums), 'FlatColums must be not empty');
+        foreach ($flatColums as $result) {
+            $this->assertArrayHasKey('unsigned', $result, 'FlatColums must have "unsigned" column');
+            $this->assertArrayHasKey('default', $result, 'FlatColums must have "default" column');
+            $this->assertArrayHasKey('extra', $result, 'FlatColums must have "extra" column');
+            $this->assertArrayHasKey('type', $result, 'FlatColums must have "type" column');
+            $this->assertArrayHasKey('nullable', $result, 'FlatColums must have "nullable" column');
+            $this->assertArrayHasKey('comment', $result, 'FlatColums must have "comment" column');
+            $this->assertArrayHasKey('length', $result, 'FlatColums must have "length" column');
+        }
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/Attribute/Source/Msrp/Type/PriceTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/Attribute/Source/Msrp/Type/PriceTest.php
new file mode 100644
index 00000000000..3e82425af0b
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/Attribute/Source/Msrp/Type/PriceTest.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @subpackage  unit_tests
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Product\Attribute\Source\Msrp\Type;
+
+use Magento\TestFramework\Helper\ObjectManager;
+
+class PriceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Catalog\Model\Product\Attribute\Source\Msrp\Type\Price
+     */
+    protected $_model;
+
+    public function setUp()
+    {
+        $objectManager = new ObjectManager($this);
+        $this->_model = $objectManager->getObject('Magento\Catalog\Model\Product\Attribute\Source\Msrp\Type\Price');
+    }
+
+    public function testGetFlatColums()
+    {
+        $abstractAttributeMock = $this->getMock(
+            '\Magento\Eav\Model\Entity\Attribute\AbstractAttribute',
+            array('getAttributeCode', '__wakeup'), array(), '', false
+        );
+
+        $abstractAttributeMock->expects($this->any())
+            ->method('getAttributeCode')
+            ->will($this->returnValue('code'));
+
+        $this->_model->setAttribute($abstractAttributeMock);
+
+        $flatColums = $this->_model->getFlatColums();
+
+        $this->assertTrue(is_array($flatColums), 'FlatColums must be an array value');
+        $this->assertTrue(!empty($flatColums), 'FlatColums must be not empty');
+        foreach ($flatColums as $result) {
+            $this->assertArrayHasKey('unsigned', $result, 'FlatColums must have "unsigned" column');
+            $this->assertArrayHasKey('default', $result, 'FlatColums must have "default" column');
+            $this->assertArrayHasKey('extra', $result, 'FlatColums must have "extra" column');
+            $this->assertArrayHasKey('type', $result, 'FlatColums must have "type" column');
+            $this->assertArrayHasKey('nullable', $result, 'FlatColums must have "nullable" column');
+        }
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/CartConfigurationTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/CartConfigurationTest.php
index c557a34b1a1..a4f0a0005ff 100644
--- a/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/CartConfigurationTest.php
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/CartConfigurationTest.php
@@ -45,7 +45,6 @@ class CartConfigurationTest extends \PHPUnit_Framework_TestCase
         return array(
             'simple' => array('simple', array(), false),
             'virtual' => array('virtual', array('options' => true), true),
-            'configurable' => array('configurable',array('super_attribute' => false), true),
             'bundle' => array('bundle', array('bundle_option' => 'option1'), true),
             'some_option_type' => array('some_option_type', array(), false)
         );
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/CopierTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/CopierTest.php
index e5832b11fb6..04a73fc34f7 100644
--- a/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/CopierTest.php
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/CopierTest.php
@@ -85,7 +85,7 @@ class CopierTest extends \PHPUnit_Framework_TestCase
         $duplicateMock->expects($this->once())->method('setIsDuplicate')->with(true);
         $duplicateMock->expects($this->once())->method('setOriginalId')->with(1);
         $duplicateMock->expects($this->once())->method('setStatus')
-            ->with(\Magento\Catalog\Model\Product\Status::STATUS_DISABLED);
+            ->with(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_DISABLED);
         $duplicateMock->expects($this->once())->method('setCreatedAt')->with(null);
         $duplicateMock->expects($this->once())->method('setUpdatedAt')->with(null);
         $duplicateMock->expects($this->once())->method('setId')->with(null);
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/Indexer/FlatTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/Indexer/FlatTest.php
deleted file mode 100644
index ef12d6484b9..00000000000
--- a/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/Indexer/FlatTest.php
+++ /dev/null
@@ -1,363 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Catalog
- * @subpackage  unit_tests
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-
-/**
- * Test class for \Magento\Catalog\Model\Product\Indexer\Flat
- */
-namespace Magento\Catalog\Model\Product\Indexer;
-
-class FlatTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \Magento\Catalog\Model\Product\Indexer\Flat
-     */
-    protected $_model = null;
-
-    /**
-     * @var \Magento\Index\Model\Event
-     */
-    protected $_event = null;
-
-    protected function setUp()
-    {
-        $objectManagerHelper = new \Magento\TestFramework\Helper\ObjectManager($this);
-        $indexerFactoryMock = $this->getMock('Magento\Catalog\Model\Product\Flat\IndexerFactory', array(), array(),
-            '', false);
-        $this->_model = $objectManagerHelper->getObject('Magento\Catalog\Model\Product\Indexer\Flat', array(
-            'flatIndexerFactory' => $indexerFactoryMock,
-        ));
-        $this->_event = $this->getMock(
-            'Magento\Index\Model\Event',
-            array('getFlatHelper', 'getEntity', 'getType', 'getDataObject', '__wakeup'),
-            array(),
-            '',
-            false
-        );
-    }
-
-    public function testMatchEventAvailability()
-    {
-        $flatHelper = $this->getMock('Magento\Catalog\Helper\Product\Flat', array(), array(), '', false, false);
-        $flatHelper->expects($this->any())
-            ->method('isAvailable')
-            ->will($this->returnValue(false));
-
-        $this->_event->expects($this->any())
-            ->method('getFlatHelper')
-            ->will($this->returnValue($flatHelper));
-
-        $this->assertFalse($this->_model->matchEvent($this->_event));
-
-        $flatHelper->expects($this->any())
-            ->method('isBuilt')
-            ->will($this->returnValue(false));
-
-        $this->assertFalse($this->_model->matchEvent($this->_event));
-    }
-
-    /**
-     * @dataProvider getEavAttributeProvider
-     */
-    public function testMatchEventForEavAttribute($attributeValue, $addFilterable, $origData, $data, $eventType,
-        $result
-    ) {
-        $flatHelper = $this->getMock('Magento\Catalog\Helper\Product\Flat', array(), array(), '', false);
-        $flatHelper->expects($this->any())
-            ->method('isAvailable')
-            ->will($this->returnValue(true));
-        $flatHelper->expects($this->any())
-            ->method('isBuilt')
-            ->will($this->returnValue(true));
-
-        $this->_event->expects($this->any())
-            ->method('getFlatHelper')
-            ->will($this->returnValue($flatHelper));
-
-        $this->_event->expects($this->any())
-            ->method('getEntity')
-            ->will($this->returnValue(\Magento\Catalog\Model\Resource\Eav\Attribute::ENTITY));
-
-        if ($attributeValue) {
-            $attributeValue = $this->getMockBuilder('Magento\Catalog\Model\Resource\Eav\Attribute')
-                ->disableOriginalConstructor()
-                ->setMethods(array('getData', 'getOrigData', '__wakeup'))
-                ->getMock();
-        }
-        $this->_event->expects($this->any())
-            ->method('getDataObject')
-            ->will($this->returnValue($attributeValue));
-
-        $flatHelper->expects($this->any())
-            ->method('isAddFilterableAttributes')
-            ->will($this->returnValue($addFilterable));
-
-        if (!$attributeValue) {
-            $this->assertEquals($result, $this->_model->matchEvent($this->_event));
-            return;
-        }
-
-        $attributeValue->expects($this->any())
-            ->method('getData')
-            ->will($this->returnValueMap($data));
-
-        $attributeValue->expects($this->any())
-            ->method('getOrigData')
-            ->will($this->returnValueMap($origData));
-
-        $this->_event->expects($this->any())
-            ->method('getType')
-            ->will($this->returnValue($eventType));
-        $this->assertEquals($result, $this->_model->matchEvent($this->_event));
-    }
-
-    public function testMatchEventForStoreForDelete()
-    {
-        $this->_prepareStoreConfiguration();
-
-        $this->_event->expects($this->any())
-            ->method('getType')
-            ->will($this->returnValue(\Magento\Index\Model\Event::TYPE_DELETE));
-
-        $this->assertTrue($this->_model->matchEvent($this->_event));
-    }
-
-    public function testMatchEventForEmptyStoreForSave()
-    {
-        $this->_prepareStoreConfiguration();
-
-        $this->_event->expects($this->any())
-            ->method('getType')
-            ->will($this->returnValue(\Magento\Index\Model\Event::TYPE_SAVE));
-
-        $this->_event->expects($this->any())
-            ->method('getDataObject')
-            ->will($this->returnValue(null));
-
-        $this->assertFalse($this->_model->matchEvent($this->_event));
-    }
-
-    public function testMatchEventForOldStoreForSave()
-    {
-        $this->_prepareStoreConfiguration();
-
-        $this->_event->expects($this->any())
-            ->method('getType')
-            ->will($this->returnValue(\Magento\Index\Model\Event::TYPE_SAVE));
-
-        $store = $this->getMockBuilder('Magento\Core\Model\Store')
-            ->disableOriginalConstructor()
-            ->getMock();
-
-        $store->expects($this->any())
-            ->method('isObjectNew')
-            ->will($this->returnValue(false));
-
-        $this->_event->expects($this->any())
-            ->method('getDataObject')
-            ->will($this->returnValue($store));
-
-        $this->assertFalse($this->_model->matchEvent($this->_event));
-    }
-
-    public function testMatchEventForNewStoreForSave()
-    {
-        $this->_prepareStoreConfiguration();
-
-        $this->_event->expects($this->any())
-            ->method('getType')
-            ->will($this->returnValue(\Magento\Index\Model\Event::TYPE_SAVE));
-
-        $store = $this->getMockBuilder('Magento\Core\Model\Store')
-            ->disableOriginalConstructor()
-            ->getMock();
-
-        $store->expects($this->any())
-            ->method('isObjectNew')
-            ->will($this->returnValue(true));
-
-        $this->_event->expects($this->any())
-            ->method('getDataObject')
-            ->will($this->returnValue($store));
-
-        $this->assertTrue($this->_model->matchEvent($this->_event));
-    }
-
-    protected function _prepareStoreConfiguration()
-    {
-        $flatHelper = $this->getMock('Magento\Catalog\Helper\Product\Flat', array(), array(), '', false);
-        $flatHelper->expects($this->any())
-            ->method('isAvailable')
-            ->will($this->returnValue(true));
-        $flatHelper->expects($this->any())
-            ->method('isBuilt')
-            ->will($this->returnValue(true));
-
-        $this->_event->expects($this->any())
-            ->method('getFlatHelper')
-            ->will($this->returnValue($flatHelper));
-
-        $this->_event->expects($this->any())
-            ->method('getEntity')
-            ->will($this->returnValue(\Magento\Core\Model\Store::ENTITY));
-    }
-
-    public function testMatchEventForEmptyStoreGroup()
-    {
-        $flatHelper = $this->getMock('Magento\Catalog\Helper\Product\Flat', array(), array(), '', false);
-        $flatHelper->expects($this->any())
-            ->method('isAvailable')
-            ->will($this->returnValue(true));
-        $flatHelper->expects($this->any())
-            ->method('isBuilt')
-            ->will($this->returnValue(true));
-
-        $this->_event->expects($this->any())
-            ->method('getFlatHelper')
-            ->will($this->returnValue($flatHelper));
-
-        $this->_event->expects($this->any())
-            ->method('getEntity')
-            ->will($this->returnValue(\Magento\Core\Model\Store\Group::ENTITY));
-
-        $this->_event->expects($this->any())
-            ->method('getDataObject')
-            ->will($this->returnValue(null));
-
-        $this->assertFalse($this->_model->matchEvent($this->_event));
-    }
-
-
-    public function testMatchEventForNotChangedStoreGroup()
-    {
-        $flatHelper = $this->getMock('Magento\Catalog\Helper\Product\Flat', array(), array(), '', false);
-        $flatHelper->expects($this->any())
-            ->method('isAvailable')
-            ->will($this->returnValue(true));
-        $flatHelper->expects($this->any())
-            ->method('isBuilt')
-            ->will($this->returnValue(true));
-
-        $this->_event->expects($this->any())
-            ->method('getFlatHelper')
-            ->will($this->returnValue($flatHelper));
-
-        $this->_event->expects($this->any())
-            ->method('getEntity')
-            ->will($this->returnValue(\Magento\Core\Model\Store\Group::ENTITY));
-
-        $storeGroup = $this->getMockBuilder('Magento\Core\Model\Store\Group')
-            ->disableOriginalConstructor()
-            ->getMock();
-
-        $storeGroup->expects($this->any())
-            ->method('dataHasChangedFor')
-            ->will($this->returnValue(false));
-
-        $this->_event->expects($this->any())
-            ->method('getDataObject')
-            ->will($this->returnValue($storeGroup));
-
-        $this->assertFalse($this->_model->matchEvent($this->_event));
-    }
-
-    public function testMatchEventForChangedStoreGroup()
-    {
-        $flatHelper = $this->getMock('Magento\Catalog\Helper\Product\Flat', array(), array(), '', false);
-        $flatHelper->expects($this->any())
-            ->method('isAvailable')
-            ->will($this->returnValue(true));
-        $flatHelper->expects($this->any())
-            ->method('isBuilt')
-            ->will($this->returnValue(true));
-
-        $this->_event->expects($this->any())
-            ->method('getFlatHelper')
-            ->will($this->returnValue($flatHelper));
-
-        $this->_event->expects($this->any())
-            ->method('getEntity')
-            ->will($this->returnValue(\Magento\Core\Model\Store\Group::ENTITY));
-
-        $storeGroup = $this->getMockBuilder('Magento\Core\Model\Store\Group')
-            ->disableOriginalConstructor()
-            ->getMock();
-
-        $storeGroup->expects($this->any())
-            ->method('dataHasChangedFor')
-            ->will($this->returnValue(true));
-
-        $this->_event->expects($this->any())
-            ->method('getDataObject')
-            ->will($this->returnValue($storeGroup));
-
-        $this->assertTrue($this->_model->matchEvent($this->_event));
-    }
-
-    public function testMatchEventParentFallback()
-    {
-        $flatHelper = $this->getMock('Magento\Catalog\Helper\Product\Flat', array(), array(), '', false);
-        $flatHelper->expects($this->any())
-            ->method('isAvailable')
-            ->will($this->returnValue(true));
-        $flatHelper->expects($this->any())
-            ->method('isBuilt')
-            ->will($this->returnValue(true));
-
-        $this->_event->expects($this->any())
-            ->method('getFlatHelper')
-            ->will($this->returnValue($flatHelper));
-
-        $this->_event->expects($this->any())
-            ->method('getEntity')
-            ->will($this->returnValue('some_value'));
-
-        $this->assertFalse($this->_model->matchEvent($this->_event));
-    }
-
-    public function testMatchEventCaching()
-    {
-        $this->testMatchEventForChangedStoreGroup();
-
-        $storeGroup = $this->_event->getDataObject();
-
-        $storeGroup->expects($this->any())
-            ->method('dataHasChangedFor')
-            ->will($this->returnValue(false));
-
-        $this->assertTrue($this->_model->matchEvent($this->_event));
-
-    }
-
-    /**
-     * Provider for testMatchEventForEavAttribute
-     */
-    public static function getEavAttributeProvider()
-    {
-        return include __DIR__ . '/../../../_files/eav_attributes_data.php';
-    }
-
-}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/PriceModifier/CompositeTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/PriceModifier/CompositeTest.php
new file mode 100644
index 00000000000..8ae6859d830
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/PriceModifier/CompositeTest.php
@@ -0,0 +1,86 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Product\PriceModifier;
+
+class CompositeTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Catalog\Model\Product\PriceModifier\Composite
+     */
+    protected $compositeModel;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $objectManagerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $productMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $priceModifierMock;
+
+    protected function setUp()
+    {
+        $this->objectManagerMock = $this->getMock('Magento\ObjectManager');
+        $this->productMock = $this->getMock('Magento\Catalog\Model\Product', array(), array(), '', false);
+        $this->priceModifierMock = $this->getMock('Magento\Catalog\Model\Product\PriceModifierInterface');
+    }
+
+    public function testModifyPriceIfModifierExists()
+    {
+        $this->compositeModel = new \Magento\Catalog\Model\Product\PriceModifier\Composite(
+            $this->objectManagerMock,
+            array('some_class_name')
+        );
+        $this->objectManagerMock
+            ->expects($this->once())
+            ->method('get')
+            ->with('some_class_name')
+            ->will($this->returnValue($this->priceModifierMock));
+        $this->priceModifierMock
+            ->expects($this->once())
+            ->method('modifyPrice')
+            ->with(100, $this->productMock)
+            ->will($this->returnValue(150));
+        $this->assertEquals(150, $this->compositeModel->modifyPrice(100, $this->productMock));
+    }
+
+    public function testModifyPriceIfModifierNotExists()
+    {
+        $this->compositeModel = new \Magento\Catalog\Model\Product\PriceModifier\Composite(
+            $this->objectManagerMock,
+            array()
+        );
+        $this->objectManagerMock
+            ->expects($this->never())
+            ->method('get');
+        $this->assertEquals(100, $this->compositeModel->modifyPrice(100, $this->productMock));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/TypeTransitionManagerTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/TypeTransitionManagerTest.php
new file mode 100644
index 00000000000..f933a42a4d3
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/TypeTransitionManagerTest.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Catalog\Model\Product;
+
+class TypeTransitionManagerTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Catalog\Model\Product\TypeTransitionManager
+     */
+    protected $model;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $productMock;
+
+    protected function setUp()
+    {
+        $this->model = new TypeTransitionManager(array(
+            'simple' => \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE,
+            'virtual' => \Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL,
+        ));
+        $this->productMock = $this->getMock(
+            'Magento\Catalog\Model\Product',
+            array('hasIsVirtual', 'getTypeId', 'setTypeId', 'setTypeInstance', '__wakeup'),
+            array(),
+            '',
+            false
+        );
+    }
+
+    /**
+     * @param bool $isVirtual
+     * @param string $currentTypeId
+     * @param string $expectedTypeId
+     * @dataProvider processProductDataProvider
+     */
+    public function testProcessProduct($isVirtual, $currentTypeId, $expectedTypeId)
+    {
+        $this->productMock->expects($this->any())->method('hasIsVirtual')->will($this->returnValue($isVirtual));
+        $this->productMock->expects($this->once())->method('getTypeId')->will($this->returnValue($currentTypeId));
+        $this->productMock->expects($this->once())->method('setTypeInstance')->with(null);
+        $this->productMock->expects($this->once())->method('setTypeId')->with($expectedTypeId);
+        $this->model->processProduct($this->productMock);
+    }
+
+    /**
+     * @return array
+     */
+    public function processProductDataProvider()
+    {
+        return array(
+            array(
+                false,
+                \Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL,
+                \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE,
+            ),
+            array(
+                false,
+                \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE,
+                \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE,
+            ),
+            array(
+                true,
+                \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE,
+                \Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL,
+            ),
+            array(
+                true,
+                \Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL,
+                \Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL,
+            ),
+        );
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/ValidatorTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/ValidatorTest.php
new file mode 100644
index 00000000000..952c221706a
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/ValidatorTest.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Product;
+
+class ValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    public function testValidator()
+    {
+        $validator = new \Magento\Catalog\Model\Product\Validator();
+        $productMock = $this->getMock('Magento\Catalog\Model\Product', array(), array(), '', false);
+        $requestMock = $this->getMock('Magento\App\RequestInterface');
+        $responseMock = $this->getMock('Magento\Object');
+        $productMock->expects($this->once())->method('validate')->will($this->returnValue(true));
+        $this->assertEquals(true, $validator->validate($productMock, $requestMock, $responseMock));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/VisibilityTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/VisibilityTest.php
new file mode 100644
index 00000000000..a91ae95c0f6
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/VisibilityTest.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @subpackage  unit_tests
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Product;
+
+use Magento\TestFramework\Helper\ObjectManager;
+
+class VisibilityTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Catalog\Model\Product\Visibility
+     */
+    protected $_model;
+
+    public function setUp()
+    {
+        $objectManager = new ObjectManager($this);
+        $this->_model = $objectManager->getObject('Magento\Catalog\Model\Product\Visibility');
+    }
+
+    public function testGetFlatColums()
+    {
+        $abstractAttributeMock = $this->getMock(
+            '\Magento\Eav\Model\Entity\Attribute\AbstractAttribute',
+            array('getAttributeCode', '__wakeup'), array(), '', false
+        );
+
+        $abstractAttributeMock->expects($this->any())
+            ->method('getAttributeCode')
+            ->will($this->returnValue('code'));
+
+        $this->_model->setAttribute($abstractAttributeMock);
+
+        $flatColums = $this->_model->getFlatColums();
+
+        $this->assertTrue(is_array($flatColums), 'FlatColums must be an array value');
+        $this->assertTrue(!empty($flatColums), 'FlatColums must be not empty');
+        foreach ($flatColums as $result) {
+            $this->assertArrayHasKey('unsigned', $result, 'FlatColums must have "unsigned" column');
+            $this->assertArrayHasKey('default', $result, 'FlatColums must have "default" column');
+            $this->assertArrayHasKey('extra', $result, 'FlatColums must have "extra" column');
+            $this->assertArrayHasKey('type', $result, 'FlatColums must have "type" column');
+            $this->assertArrayHasKey('nullable', $result, 'FlatColums must have "nullable" column');
+            $this->assertArrayHasKey('comment', $result, 'FlatColums must have "comment" column');
+        }
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/ProductTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/ProductTest.php
new file mode 100644
index 00000000000..ea77aa7494d
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/ProductTest.php
@@ -0,0 +1,145 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @subpackage  unit_tests
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model;
+
+class ProductTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Catalog\Model\Product
+     */
+    protected $_model;
+
+    /**
+     * @var \Magento\Indexer\Model\IndexerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $categoryIndexerMock;
+
+    /**
+     * @var \Magento\Catalog\Model\Indexer\Product\Flat\Processor|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_processor;
+
+    public function setUp()
+    {
+        $this->categoryIndexerMock = $this->getMockForAbstractClass(
+            '\Magento\Indexer\Model\IndexerInterface', array(), '', false, false, true, array()
+        );
+
+        $this->_processor = $this->getMock(
+            'Magento\Catalog\Model\Indexer\Product\Flat\Processor', array(), array(), '', false
+        );
+
+        $stateMock = $this->getMock(
+            'Magento\App\State',
+            array('getAreaCode'), array(), '', false
+        );
+
+        $stateMock->expects($this->any())
+            ->method('getAreaCode')
+            ->will($this->returnValue(\Magento\Backend\App\Area\FrontNameResolver::AREA_CODE));
+
+        $eventManagerMock = $this->getMock(
+            'Magento\Event\ManagerInterface',
+            array(), array(), '', false
+        );
+
+        $cacheInterfaceMock = $this->getMock(
+            'Magento\App\CacheInterface',
+            array(), array(), '', false
+        );
+
+
+        $contextMock = $this->getMock(
+            '\Magento\Core\Model\Context',
+            array('getEventDispatcher', 'getCacheManager', 'getAppState'), array(), '', false
+        );
+
+        $contextMock->expects($this->any())
+            ->method('getAppState')
+            ->will($this->returnValue($stateMock));
+
+        $contextMock->expects($this->any())
+            ->method('getEventDispatcher')
+            ->will($this->returnValue($eventManagerMock));
+
+        $contextMock->expects($this->any())
+            ->method('getCacheManager')
+            ->will($this->returnValue($cacheInterfaceMock));
+
+        $this->_model = new \Magento\Catalog\Model\Product(
+            $contextMock,
+            $this->getMock('Magento\Core\Model\Registry', array(), array(), '', false),
+            $this->getMock('Magento\Core\Model\StoreManagerInterface', array(), array(), '', false),
+            $this->getMock('Magento\Catalog\Model\Product\Url', array(), array(), '', false),
+            $this->getMock('Magento\Catalog\Model\Product\Link', array(), array(), '', false),
+            $this->getMock(
+                'Magento\Catalog\Model\Product\Configuration\Item\OptionFactory',
+                array(), array(), '', false
+            ),
+            $this->getMock('Magento\CatalogInventory\Model\Stock\ItemFactory', array(), array(), '', false),
+            $this->getMock('Magento\Catalog\Model\ProductFactory', array(), array(), '', false),
+            $this->getMock('Magento\Catalog\Model\CategoryFactory', array(), array(), '', false),
+            $this->getMock('Magento\Catalog\Model\Product\Option', array(), array(), '', false),
+            $this->getMock('Magento\Catalog\Model\Product\Visibility', array(), array(), '', false),
+            $this->getMock('Magento\Catalog\Model\Product\Attribute\Source\Status', array(), array(), '', false),
+            $this->getMock('Magento\Catalog\Model\Product\Media\Config', array(), array(), '', false),
+            $this->getMock('Magento\Index\Model\Indexer', array(), array(), '', false),
+            $this->getMock('Magento\Catalog\Model\Product\Type', array(), array(), '', false),
+            $this->getMock('Magento\Catalog\Helper\Image', array(), array(), '', false),
+            $this->getMock('Magento\Catalog\Helper\Data', array(), array(), '', false),
+            $this->getMock('Magento\Catalog\Helper\Product', array(), array(), '', false),
+            $this->getMock('Magento\Catalog\Model\Resource\Product', array(), array(), '', false),
+            $this->getMock('Magento\Catalog\Model\Resource\Product\Collection', array(), array(), '', false),
+            $this->getMock('Magento\Data\CollectionFactory', array(), array(), '', false),
+            $this->getMock('Magento\App\Filesystem', array(), array(), '', false),
+            $this->categoryIndexerMock,
+            $this->_processor,
+            array('id' => 1)
+        );
+    }
+
+    public function testIndexerAfterDeleteCommitProduct()
+    {
+        $this->categoryIndexerMock->expects($this->once())
+            ->method('reindexRow');
+        $this->_processor->expects($this->once())
+            ->method('reindexRow');
+
+        $this->_model->delete();
+    }
+
+    public function testReindex()
+    {
+        $this->categoryIndexerMock->expects($this->once())
+            ->method('reindexRow');
+        $this->_processor->expects($this->once())
+            ->method('reindexRow');
+
+        $this->_model->reindex();
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Resource/Eav/AttributeTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Resource/Eav/AttributeTest.php
new file mode 100644
index 00000000000..5a5cb578613
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/Resource/Eav/AttributeTest.php
@@ -0,0 +1,122 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @subpackage  unit_tests
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Resource\Eav;
+
+class AttributeTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Catalog\Model\Resource\Eav\Attribute
+     */
+    protected $_model;
+
+    /**
+     * @var \Magento\Catalog\Model\Indexer\Product\Flat\Processor
+     */
+    protected $_processor;
+
+    public function setUp()
+    {
+        $this->_processor = $this->getMock(
+            'Magento\Catalog\Model\Indexer\Product\Flat\Processor', array(), array(), '', false
+        );
+
+        $eventManagerMock = $this->getMock(
+            'Magento\Event\ManagerInterface',
+            array(), array(), '', false
+        );
+
+        $cacheInterfaceMock = $this->getMock(
+            'Magento\App\CacheInterface',
+            array(), array(), '', false
+        );
+
+        $contextMock = $this->getMock(
+            '\Magento\Core\Model\Context',
+            array('getEventDispatcher', 'getCacheManager'), array(), '', false
+        );
+
+        $contextMock->expects($this->any())->method('getEventDispatcher')->will($this->returnValue($eventManagerMock));
+        $contextMock->expects($this->any())->method('getCacheManager')->will($this->returnValue($cacheInterfaceMock));
+
+        $dbAdapterMock = $this->getMock(
+            'Magento\DB\Adapter\Pdo\Mysql',
+            array(), array(), '', false
+        );
+
+        $dbAdapterMock->expects($this->any())->method('getTransactionLevel')->will($this->returnValue(1));
+
+        $resourceMock = $this->getMock(
+            'Magento\Core\Model\Resource\AbstractResource',
+            array('_construct', '_getReadAdapter', '_getWriteAdapter', 'getIdFieldName',
+                'save', 'saveInSetIncluding', 'isUsedBySuperProducts', 'delete'),
+            array(), '', false
+        );
+
+        $resourceMock->expects($this->any())
+            ->method('_getWriteAdapter')
+            ->will($this->returnValue($dbAdapterMock));
+
+        $this->_model = new \Magento\Catalog\Model\Resource\Eav\Attribute(
+            $contextMock,
+            $this->getMock('Magento\Core\Model\Registry', array(), array(), '', false),
+            $this->getMock('Magento\Core\Helper\Data', array(), array(), '', false),
+            $this->getMock('Magento\Eav\Model\Config', array(), array(), '', false),
+            $this->getMock('Magento\Eav\Model\Entity\TypeFactory', array(), array(), '', false),
+            $this->getMock('Magento\Core\Model\StoreManagerInterface', array(), array(), '', false),
+            $this->getMock('Magento\Eav\Model\Resource\Helper', array(), array(), '', false),
+            $this->getMock('Magento\Validator\UniversalFactory', array(), array(), '', false),
+            $this->getMock('Magento\Core\Model\LocaleInterface', array(), array(), '', false),
+            $this->getMock('Magento\Catalog\Model\ProductFactory', array(), array(), '', false),
+            $this->getMock('Magento\Index\Model\Indexer', array(), array(), '', false),
+            $this->_processor,
+            $this->getMock('\Magento\Catalog\Helper\Product\Flat', array(), array(), '', false),
+            $this->getMock('\Magento\Catalog\Model\Attribute\LockValidatorInterface'),
+            $resourceMock,
+            $this->getMock('\Magento\Data\Collection\Db', array(), array(), '', false),
+            array('id' => 1)
+        );
+    }
+
+    public function testIndexerAfterSaveAttribute()
+    {
+        $this->_processor->expects($this->once())
+            ->method('markIndexerAsInvalid');
+
+        $this->_model->setData(array('id' => 2, 'used_in_product_listing' => 1));
+
+        $this->_model->save();
+    }
+
+    public function testIndexerAfterDeleteAttribute()
+    {
+        $this->_processor->expects($this->once())
+            ->method('markIndexerAsInvalid');
+
+        $this->_model->delete();
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Resource/Product/Collection/AssociatedProductUpdaterTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Resource/Product/Collection/AssociatedProductUpdaterTest.php
deleted file mode 100644
index 73bd5abfd85..00000000000
--- a/dev/tests/unit/testsuite/Magento/Catalog/Model/Resource/Product/Collection/AssociatedProductUpdaterTest.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Catalog
- * @subpackage  unit_tests
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-
-namespace Magento\Catalog\Model\Resource\Product\Collection;
-
-class AssociatedProductUpdaterTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * Test adding filtration by qty and stock availability to collection
-     */
-    public function testUpdate()
-    {
-        $inventory = array(
-            'qty' => 'qty',
-            'inventory_in_stock' => 'is_in_stock'
-        );
-        $collection = $this->getMockBuilder('Magento\Data\Collection\Db')
-            ->disableOriginalConstructor()
-            ->getMock();
-        $stockItem = $this->getMockBuilder('Magento\CatalogInventory\Model\Resource\Stock\Item')
-            ->disableOriginalConstructor()
-            ->setMethods(array('addCatalogInventoryToProductCollection', '__wakeup'))
-            ->getMock();
-        $stockItem->expects($this->any())
-            ->method('addCatalogInventoryToProductCollection')
-            ->with($collection, $inventory);
-
-        $model = new \Magento\Catalog\Model\Resource\Product\Collection\AssociatedProductUpdater($stockItem);
-        $model->update($collection);
-    }
-}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Resource/Product/FlatTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Resource/Product/FlatTest.php
new file mode 100644
index 00000000000..d6aa8cfb57c
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/Resource/Product/FlatTest.php
@@ -0,0 +1,90 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Catalog
+ * @subpackage  unit_tests
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Catalog\Model\Resource\Product;
+
+class FlatTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Catalog\Model\Resource\Product\Flat
+     */
+    protected $_model;
+
+
+    /**
+     * @var \Magento\Core\Model\Store
+     */
+    protected $_store;
+
+    /**
+     * @var \Magento\Core\Model\StoreManagerInterface
+     */
+    protected $_storeManagerInterface;
+
+    public function setUp()
+    {
+        $this->_store = $this->getMock(
+            '\Magento\Core\Model\Store',
+            array(), array(), '', false
+        );
+
+        $this->_storeManagerInterface = $this->getMock(
+            '\Magento\Core\Model\StoreManagerInterface');
+
+        $this->_storeManagerInterface->expects($this->any())
+            ->method('getStore')
+            ->will($this->returnValue($this->_store));
+
+        $this->_storeManagerInterface->expects($this->any())
+            ->method('getDefaultStoreView')
+            ->will($this->returnValue($this->_store));
+
+
+        $this->_model = new \Magento\Catalog\Model\Resource\Product\Flat(
+            $this->getMock('Magento\App\Resource', array(), array(), '', false),
+            $this->_storeManagerInterface,
+            $this->getMock('Magento\Catalog\Model\Config', array(), array(), '', false)
+        );
+    }
+
+    public function testSetIntStoreId()
+    {
+        $store = $this->_model->setStoreId(1);
+        $storeId = $store->getStoreId();
+        $this->assertEquals(1, $storeId);
+    }
+
+    public function testSetNotIntStoreId()
+    {
+        $this->_storeManagerInterface->expects($this->once())
+            ->method('getStore');
+
+        $store = $this->_model->setStoreId('test');
+        $storeId = $store->getStoreId();
+        $this->assertEquals(0, $storeId);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/CatalogInventory/Model/Quote/Item/QuantityValidator/Initializer/OptionTest.php b/dev/tests/unit/testsuite/Magento/CatalogInventory/Model/Quote/Item/QuantityValidator/Initializer/OptionTest.php
new file mode 100644
index 00000000000..a79a7692a2d
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/CatalogInventory/Model/Quote/Item/QuantityValidator/Initializer/OptionTest.php
@@ -0,0 +1,202 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\CatalogInventory\Model\Quote\Item\QuantityValidator\Initializer;
+
+class OptionTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\CatalogInventory\Model\Quote\Item\QuantityValidator\Initializer\Option
+     */
+    protected $validator;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $qtyItemListMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $optionMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $quoteMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $stockItemMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $productMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $resultMock;
+
+    protected function setUp()
+    {
+        $optionMethods = array('getValue', 'getProduct', 'setIsQtyDecimal', 'setHasQtyOptionUpdate',
+            'setValue', 'setMessage', 'setBackorders', '__wakeup');
+        $this->optionMock = $this->getMock('Magento\Sales\Model\Quote\Item\Option', $optionMethods, array(), '', false);
+        $methods = array('getQtyToAdd', '__wakeup', 'getId', 'updateQtyOption', 'setData');
+        $this->quoteMock = $this->getMock('Magento\Sales\Model\Quote\Item', $methods, array(), '', false);
+        $stockItemMethods = array('setIsChildItem', 'setSuppressCheckQtyIncrements', 'checkQuoteItemQty',
+            '__wakeup', 'unsIsChildItem');
+        $this->stockItemMock
+            = $this->getMock('Magento\CatalogInventory\Model\Stock\Item', $stockItemMethods, array(), '', false);
+        $productMethods = array('getStockItem', 'getId', '__wakeup');
+        $this->productMock = $this->getMock('Magento\Catalog\Model\Product', $productMethods, array(), '', false);
+        $this->qtyItemListMock =
+            $this->getMock('Magento\CatalogInventory\Model\Quote\Item\QuantityValidator\QuoteItemQtyList',
+                array(), array(), '', false);
+        $resultMethods =
+            array('getItemIsQtyDecimal', 'getHasQtyOptionUpdate', 'getOrigQty',
+                'getMessage', 'getItemBackorders', '__wakeup');
+        $this->resultMock = $this->getMock('Magento\Object', $resultMethods, array(), '', false);
+        $this->validator = new \Magento\CatalogInventory\Model\Quote\Item\QuantityValidator\Initializer\Option(
+            $this->qtyItemListMock
+        );
+    }
+
+    public function testInitializeWhenResultIsDecimalGetBackordersMessageHasOptionQtyUpdate()
+    {
+        $optionValue = 5;
+        $qtyForCheck = 50;
+        $qty = 10;
+        $qtyToAdd = 20;
+        $this->optionMock->expects($this->once())->method('getValue')->will($this->returnValue($optionValue));
+        $this->quoteMock->expects($this->exactly(2))->method('getQtyToAdd')->will($this->returnValue($qtyToAdd));
+        $this->optionMock->expects($this->any())->method('getProduct')->will($this->returnValue($this->productMock));
+        //stock item verification
+        $this->productMock
+            ->expects($this->once())
+            ->method('getStockItem')
+            ->will($this->returnValue($this->stockItemMock));
+        $this->stockItemMock->expects($this->once())->method('setIsChildItem')->with(true);
+        $this->stockItemMock->expects($this->once())->method('setSuppressCheckQtyIncrements')->with(true);
+        $this->productMock->expects($this->once())->method('getId')->will($this->returnValue('product_id'));
+        $this->quoteMock->expects($this->once())->method('getId')->will($this->returnValue('quote_id'));
+        $this->qtyItemListMock
+            ->expects($this->once())
+            ->method('getQty')
+            ->with('product_id', 'quote_id', $qtyToAdd * $optionValue)
+            ->will($this->returnValue($qtyForCheck));
+        $this->stockItemMock
+            ->expects($this->once())
+            ->method('checkQuoteItemQty')
+            ->with($qty*$optionValue, $qtyForCheck, $optionValue)
+            ->will($this->returnValue($this->resultMock));
+        $this->resultMock
+            ->expects($this->exactly(2))
+            ->method('getItemIsQtyDecimal')
+            ->will($this->returnValue('is_decimal'));
+        $this->optionMock->expects($this->once())->method('setIsQtyDecimal')->with('is_decimal');
+        $this->resultMock->expects($this->once())->method('getHasQtyOptionUpdate')->will($this->returnValue(true));
+        $this->optionMock->expects($this->once())->method('setHasQtyOptionUpdate')->with(true);
+        $this->resultMock->expects($this->exactly(2))->method('getOrigQty')->will($this->returnValue('orig_qty'));
+        $this->quoteMock->expects($this->once())->method('updateQtyOption')->with($this->optionMock, 'orig_qty');
+        $this->optionMock->expects($this->once())->method('setValue')->with('orig_qty');
+        $this->quoteMock->expects($this->once())->method('setData')->with('qty', $qty);
+        $this->resultMock->expects($this->exactly(3))->method('getMessage')->will($this->returnValue('message'));
+        $this->optionMock->expects($this->once())->method('setMessage')->with('message');
+        $this->resultMock
+            ->expects($this->exactly(2))
+            ->method('getItemBackorders')
+            ->will($this->returnValue('backorders'));
+        $this->optionMock->expects($this->once())->method('setBackorders')->with('backorders');
+
+        $this->stockItemMock->expects($this->once())->method('unsIsChildItem');
+        $this->validator->initialize($this->optionMock, $this->quoteMock, $qty);
+    }
+
+    public function testInitializeWhenResultNotDecimalGetBackordersMessageHasOptionQtyUpdate()
+    {
+        $optionValue = 5;
+        $qtyForCheck = 50;
+        $qty = 10;
+        $this->optionMock->expects($this->once())->method('getValue')->will($this->returnValue($optionValue));
+        $this->quoteMock->expects($this->once())->method('getQtyToAdd')->will($this->returnValue(false));
+        $this->optionMock->expects($this->any())->method('getProduct')->will($this->returnValue($this->productMock));
+        $this->productMock
+            ->expects($this->once())
+            ->method('getStockItem')
+            ->will($this->returnValue($this->stockItemMock));
+        $this->stockItemMock->expects($this->once())->method('setIsChildItem')->with(true);
+        $this->stockItemMock->expects($this->once())->method('setSuppressCheckQtyIncrements')->with(true);
+        $this->productMock->expects($this->once())->method('getId')->will($this->returnValue('product_id'));
+        $this->quoteMock->expects($this->once())->method('getId')->will($this->returnValue('quote_id'));
+        $this->qtyItemListMock
+            ->expects($this->once())
+            ->method('getQty')
+            ->with('product_id', 'quote_id', $qty * $optionValue)
+            ->will($this->returnValue($qtyForCheck));
+        $this->stockItemMock
+            ->expects($this->once())
+            ->method('checkQuoteItemQty')
+            ->with($qty*$optionValue, $qtyForCheck, $optionValue)
+            ->will($this->returnValue($this->resultMock));
+        $this->resultMock
+            ->expects($this->once())
+            ->method('getItemIsQtyDecimal')
+            ->will($this->returnValue(null));
+        $this->optionMock->expects($this->never())->method('setIsQtyDecimal');
+        $this->resultMock->expects($this->once())->method('getHasQtyOptionUpdate')->will($this->returnValue(null));
+        $this->optionMock->expects($this->never())->method('setHasQtyOptionUpdate');
+        $this->resultMock->expects($this->once())->method('getMessage')->will($this->returnValue(null));
+        $this->resultMock
+            ->expects($this->once())
+            ->method('getItemBackorders')
+            ->will($this->returnValue(null));
+        $this->optionMock->expects($this->never())->method('setBackorders');
+
+        $this->stockItemMock->expects($this->once())->method('unsIsChildItem');
+        $this->validator->initialize($this->optionMock, $this->quoteMock, $qty);
+    }
+
+    /**
+     * @expectedException \Magento\Core\Exception
+     * @expectedExceptionMessage The stock item for Product in option is not valid.
+     */
+    public function testInitializeWithInvalidOptionQty()
+    {
+        $optionValue = 5;
+        $qty = 10;
+        $this->optionMock->expects($this->once())->method('getValue')->will($this->returnValue($optionValue));
+        $this->quoteMock->expects($this->once())->method('getQtyToAdd')->will($this->returnValue(false));
+        $this->optionMock->expects($this->once())->method('getProduct')->will($this->returnValue($this->productMock));
+        $this->productMock
+            ->expects($this->once())
+            ->method('getStockItem')
+            ->will($this->returnValue(10));
+        $this->validator->initialize($this->optionMock, $this->quoteMock, $qty);
+    }
+}
+
diff --git a/dev/tests/unit/testsuite/Magento/CatalogRule/Model/Product/PriceModifierTest.php b/dev/tests/unit/testsuite/Magento/CatalogRule/Model/Product/PriceModifierTest.php
new file mode 100644
index 00000000000..d0eac0357ae
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/CatalogRule/Model/Product/PriceModifierTest.php
@@ -0,0 +1,88 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\CatalogRule\Model\Product;
+
+class PriceModifierTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\CatalogRule\Model\Product\PriceModifier
+     */
+    protected $priceModifier;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $ruleFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $productMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $ruleMock;
+
+    protected function setUp()
+    {
+        $this->ruleFactoryMock = $this->getMock('Magento\CatalogRule\Model\RuleFactory', array('create'));
+        $this->productMock = $this->getMock('Magento\Catalog\Model\Product', array(), array(), '', false);
+        $this->ruleMock = $this->getMock('Magento\CatalogRule\Model\Rule', array(), array(), '', false);
+        $this->priceModifier = new \Magento\CatalogRule\Model\Product\PriceModifier(
+            $this->ruleFactoryMock
+        );
+    }
+
+    /**
+     * @param int|null $resultPrice
+     * @param int $expectedPrice
+     * @dataProvider modifyPriceDataProvider
+     */
+    public function testModifyPriceIfPriceExists($resultPrice, $expectedPrice)
+    {
+        $this->ruleFactoryMock->expects($this->once())->method('create')->will($this->returnValue($this->ruleMock));
+        $this->ruleMock
+            ->expects($this->once())
+            ->method('calcProductPriceRule')
+            ->with($this->productMock, 100)
+            ->will($this->returnValue($resultPrice));
+        $this->assertEquals($expectedPrice, $this->priceModifier->modifyPrice(100, $this->productMock));
+    }
+
+    public function modifyPriceDataProvider()
+    {
+        return array(
+            'resulted_price_exists' => array(150, 150),
+            'resulted_price_not_exists' => array(null, 100)
+        );
+    }
+
+    public function testModifyPriceIfPriceNotExist()
+    {
+        $this->ruleFactoryMock->expects($this->never())->method('create');
+        $this->assertEquals(null, $this->priceModifier->modifyPrice(null, $this->productMock));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Config/Converter/Dom/FlatTest.php b/dev/tests/unit/testsuite/Magento/Config/Converter/Dom/FlatTest.php
index b69feb6dcd3..0776d059c84 100644
--- a/dev/tests/unit/testsuite/Magento/Config/Converter/Dom/FlatTest.php
+++ b/dev/tests/unit/testsuite/Magento/Config/Converter/Dom/FlatTest.php
@@ -39,9 +39,12 @@ class FlatTest extends \PHPUnit_Framework_TestCase
 
     protected function setUp()
     {
-        $this->_model = new \Magento\Config\Converter\Dom\Flat(array(
-            '/root/multipleNode' => 'id'
-        ));
+        $arrayNodeConfig = new \Magento\Config\Dom\ArrayNodeConfig(
+            new \Magento\Config\Dom\NodePathMatcher(),
+            array('/root/multipleNode' => 'id'),
+            array('/root/node_one/subnode')
+        );
+        $this->_model = new \Magento\Config\Converter\Dom\Flat($arrayNodeConfig);
         $this->_fixturePath = realpath(__DIR__ . '/../../')
             . '/_files/converter/dom/flat/';
     }
diff --git a/dev/tests/unit/testsuite/Magento/Config/Dom/ArrayNodeConfigTest.php b/dev/tests/unit/testsuite/Magento/Config/Dom/ArrayNodeConfigTest.php
new file mode 100644
index 00000000000..aaa04ce52bf
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Config/Dom/ArrayNodeConfigTest.php
@@ -0,0 +1,130 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Config\Dom;
+
+class ArrayNodeConfigTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var ArrayNodeConfig
+     */
+    protected $object;
+
+    /**
+     * @var NodePathMatcher|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $nodePathMatcher;
+
+    protected function setUp()
+    {
+        $this->nodePathMatcher = $this->getMock('\Magento\Config\Dom\NodePathMatcher');
+        $this->object = new ArrayNodeConfig(
+            $this->nodePathMatcher,
+            array(
+                '/root/assoc/one' => 'name',
+                '/root/assoc/two' => 'id',
+                '/root/assoc/three' => 'key',
+            ),
+            array(
+                '/root/numeric/one',
+                '/root/numeric/two',
+                '/root/numeric/three',
+            )
+        );
+    }
+
+    public function testIsNumericArrayMatched()
+    {
+        $xpath = '/root/numeric[@attr="value"]/two';
+        $this->nodePathMatcher
+            ->expects($this->at(0))
+            ->method('match')
+            ->with('/root/numeric/one', $xpath)
+            ->will($this->returnValue(false));
+        $this->nodePathMatcher
+            ->expects($this->at(1))
+            ->method('match')
+            ->with('/root/numeric/two', $xpath)
+            ->will($this->returnValue(true));
+        $this->assertTrue($this->object->isNumericArray($xpath));
+    }
+
+    public function testIsNumericArrayNotMatched()
+    {
+        $xpath = '/root/numeric[@attr="value"]/four';
+        $this->nodePathMatcher
+            ->expects($this->at(0))
+            ->method('match')
+            ->with('/root/numeric/one', $xpath)
+            ->will($this->returnValue(false));
+        $this->nodePathMatcher
+            ->expects($this->at(1))
+            ->method('match')
+            ->with('/root/numeric/two', $xpath)
+            ->will($this->returnValue(false));
+        $this->nodePathMatcher
+            ->expects($this->at(2))
+            ->method('match')
+            ->with('/root/numeric/three', $xpath)
+            ->will($this->returnValue(false));
+        $this->assertFalse($this->object->isNumericArray($xpath));
+    }
+
+    public function testGetAssocArrayKeyAttributeMatched()
+    {
+        $xpath = '/root/assoc[@attr="value"]/two';
+        $this->nodePathMatcher
+            ->expects($this->at(0))
+            ->method('match')
+            ->with('/root/assoc/one', $xpath)
+            ->will($this->returnValue(false));
+        $this->nodePathMatcher
+            ->expects($this->at(1))
+            ->method('match')
+            ->with('/root/assoc/two', $xpath)
+            ->will($this->returnValue(true));
+        $this->assertEquals('id', $this->object->getAssocArrayKeyAttribute($xpath));
+    }
+
+    public function testGetAssocArrayKeyAttributeNotMatched()
+    {
+        $xpath = '/root/assoc[@attr="value"]/four';
+        $this->nodePathMatcher
+            ->expects($this->at(0))
+            ->method('match')
+            ->with('/root/assoc/one', $xpath)
+            ->will($this->returnValue(false));
+        $this->nodePathMatcher
+            ->expects($this->at(1))
+            ->method('match')
+            ->with('/root/assoc/two', $xpath)
+            ->will($this->returnValue(false));
+        $this->nodePathMatcher
+            ->expects($this->at(2))
+            ->method('match')
+            ->with('/root/assoc/three', $xpath)
+            ->will($this->returnValue(false));
+        $this->assertNull($this->object->getAssocArrayKeyAttribute($xpath));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Config/Dom/NodeMergingConfigTest.php b/dev/tests/unit/testsuite/Magento/Config/Dom/NodeMergingConfigTest.php
new file mode 100644
index 00000000000..df1e41b11ab
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Config/Dom/NodeMergingConfigTest.php
@@ -0,0 +1,85 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Config\Dom;
+
+class NodeMergingConfigTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var NodeMergingConfig
+     */
+    protected $object;
+
+    /**
+     * @var NodePathMatcher|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $nodePathMatcher;
+
+    protected function setUp()
+    {
+        $this->nodePathMatcher = $this->getMock('\Magento\Config\Dom\NodePathMatcher');
+        $this->object = new NodeMergingConfig($this->nodePathMatcher, array(
+            '/root/one' => 'name',
+            '/root/two' => 'id',
+            '/root/three' => 'key',
+        ));
+    }
+
+    public function testGetIdAttributeMatched()
+    {
+        $xpath = '/root/two[@attr="value"]';
+        $this->nodePathMatcher
+            ->expects($this->at(0))
+            ->method('match')
+            ->with('/root/one', $xpath)
+            ->will($this->returnValue(false));
+        $this->nodePathMatcher
+            ->expects($this->at(1))
+            ->method('match')
+            ->with('/root/two', $xpath)
+            ->will($this->returnValue(true));
+        $this->assertEquals('id', $this->object->getIdAttribute($xpath));
+    }
+
+    public function testGetIdAttributeNotMatched()
+    {
+        $xpath = '/root/four[@attr="value"]';
+        $this->nodePathMatcher
+            ->expects($this->at(0))
+            ->method('match')
+            ->with('/root/one', $xpath)
+            ->will($this->returnValue(false));
+        $this->nodePathMatcher
+            ->expects($this->at(1))
+            ->method('match')
+            ->with('/root/two', $xpath)
+            ->will($this->returnValue(false));
+        $this->nodePathMatcher
+            ->expects($this->at(2))
+            ->method('match')
+            ->with('/root/three', $xpath)
+            ->will($this->returnValue(false));
+        $this->assertNull($this->object->getIdAttribute($xpath));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Config/Dom/NodePathMatcherTest.php b/dev/tests/unit/testsuite/Magento/Config/Dom/NodePathMatcherTest.php
new file mode 100644
index 00000000000..443b70bfe86
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Config/Dom/NodePathMatcherTest.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Config\Dom;
+
+class NodePathMatcherTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var NodePathMatcher
+     */
+    protected $_model;
+
+    protected function setUp()
+    {
+        $this->_model = new NodePathMatcher();
+    }
+
+    /**
+     * @param string $pathPattern
+     * @param string $xpathSubject
+     * @param boolean $expectedResult
+     *
+     * @dataProvider getNodeInfoDataProvider
+     */
+    public function testMatch($pathPattern, $xpathSubject, $expectedResult)
+    {
+        $actualResult = $this->_model->match($pathPattern, $xpathSubject);
+        $this->assertSame($expectedResult, $actualResult);
+    }
+
+    public function getNodeInfoDataProvider()
+    {
+        return array(
+            'no match'              => array('/root/node', '/root', false),
+            'partial match'         => array('/root/node', '/wrapper/root/node', false),
+            'exact match'           => array('/root/node', '/root/node', true),
+            'regexp match'          => array('/root/node/(sub-)+node', '/root/node/sub-node', true),
+            'match with namespace'  => array('/root/node', '/mage:root/node', true),
+            'match with predicate'  => array('/root/node', '/root/node[@name="test"]', true),
+        );
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Config/DomTest.php b/dev/tests/unit/testsuite/Magento/Config/DomTest.php
index 5183360eeb9..712df0fb7e6 100644
--- a/dev/tests/unit/testsuite/Magento/Config/DomTest.php
+++ b/dev/tests/unit/testsuite/Magento/Config/DomTest.php
@@ -33,14 +33,15 @@ class DomTest extends \PHPUnit_Framework_TestCase
      * @param string $xmlFile
      * @param string $newXmlFile
      * @param array $ids
+     * @param string|null $typeAttributeName
      * @param string $expectedXmlFile
      * @dataProvider mergeDataProvider
      */
-    public function testMerge($xmlFile, $newXmlFile, $ids, $expectedXmlFile)
+    public function testMerge($xmlFile, $newXmlFile, $ids, $typeAttributeName, $expectedXmlFile)
     {
         $xml = file_get_contents(__DIR__ . "/_files/dom/{$xmlFile}");
         $newXml = file_get_contents(__DIR__ . "/_files/dom/{$newXmlFile}");
-        $config = new \Magento\Config\Dom($xml, $ids);
+        $config = new \Magento\Config\Dom($xml, $ids, $typeAttributeName);
         $config->merge($newXml);
         $this->assertXmlStringEqualsXmlFile(__DIR__ . "/_files/dom/{$expectedXmlFile}", $config->getDom()->saveXML());
     }
@@ -57,26 +58,47 @@ class DomTest extends \PHPUnit_Framework_TestCase
                     '/root/other_node'       => 'id',
                     '/root/other_node/child' => 'identifier',
                 ),
+                null,
                 'ids_merged.xml'
             ),
-            array('no_ids.xml', 'no_ids_new.xml', array(), 'no_ids_merged.xml'),
-            array('ambiguous_one.xml', 'ambiguous_new_two.xml', array(), 'ambiguous_merged.xml'),
-            array('namespaced.xml', 'namespaced_new.xml', array('/root/node' => 'id'), 'namespaced_merged.xml'),
-            array('override_node.xml', 'override_node_new.xml', array(), 'override_node_merged.xml'),
-            array('override_node_new.xml', 'override_node.xml', array(), 'override_node_merged.xml'),
-            array('text_node.xml', 'text_node_new.xml', array(), 'text_node_merged.xml'),
+            array('no_ids.xml', 'no_ids_new.xml', array(), null, 'no_ids_merged.xml'),
+            array('ambiguous_one.xml', 'ambiguous_new_two.xml', array(), null, 'ambiguous_merged.xml'),
+            array('namespaced.xml', 'namespaced_new.xml', array('/root/node' => 'id'), null, 'namespaced_merged.xml'),
+            array('override_node.xml', 'override_node_new.xml', array(), null, 'override_node_merged.xml'),
+            array('override_node_new.xml', 'override_node.xml', array(), null, 'override_node_merged.xml'),
+            array('text_node.xml', 'text_node_new.xml', array(), null, 'text_node_merged.xml'),
             array(
                 'recursive.xml', 'recursive_new.xml', array(
                     '/root/(node|another_node)(/param)?' => 'name',
                     '/root/node/param(/complex/item)+' => 'key',
                 ),
+                null,
                'recursive_merged.xml',
             ),
             array(
                 'recursive_deep.xml', 'recursive_deep_new.xml',
                 array('/root(/node)+' => 'name'),
+                null,
                 'recursive_deep_merged.xml',
             ),
+            array(
+                'types.xml', 'types_new.xml',
+                array(
+                    '/root/item' => 'id',
+                    '/root/item/subitem' => 'id',
+                ),
+                'xsi:type',
+                'types_merged.xml',
+            ),
+            array(
+                'attributes.xml', 'attributes_new.xml',
+                array(
+                    '/root/item' => 'id',
+                    '/root/item/subitem' => 'id',
+                ),
+                'xsi:type',
+                'attributes_merged.xml',
+            ),
         );
     }
 
@@ -127,7 +149,7 @@ class DomTest extends \PHPUnit_Framework_TestCase
         $xml = '<root><unknown_node/></root>';
         $errorFormat = 'Error: `%message%`';
         $expectedErrors = array("Error: `Element 'unknown_node': This element is not expected. Expected is ( node ).`");
-        $dom = new \Magento\Config\Dom($xml, array(), null, $errorFormat);
+        $dom = new \Magento\Config\Dom($xml, array(), null, null, $errorFormat);
         $actualResult = $dom->validate(__DIR__ . '/_files/sample.xsd', $actualErrors);
         $this->assertFalse($actualResult);
         $this->assertEquals($expectedErrors, $actualErrors);
@@ -141,7 +163,7 @@ class DomTest extends \PHPUnit_Framework_TestCase
     {
         $xml = '<root><unknown_node/></root>';
         $errorFormat = '%message%,%unknown%';
-        $dom = new \Magento\Config\Dom($xml, array(), null, $errorFormat);
+        $dom = new \Magento\Config\Dom($xml, array(), null, null, $errorFormat);
         $dom->validate(__DIR__ . '/_files/sample.xsd');
     }
 }
diff --git a/dev/tests/unit/testsuite/Magento/Config/Reader/FilesystemTest.php b/dev/tests/unit/testsuite/Magento/Config/Reader/FilesystemTest.php
index b0fc9289fe4..189b812fdc7 100644
--- a/dev/tests/unit/testsuite/Magento/Config/Reader/FilesystemTest.php
+++ b/dev/tests/unit/testsuite/Magento/Config/Reader/FilesystemTest.php
@@ -61,7 +61,7 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase
 
     public function testRead()
     {
-        $model = new \Magento\Config\Reader\Filesystem(
+        $model = new Filesystem(
             $this->_fileResolverMock,
             $this->_converterMock,
             $this->_schemaLocatorMock,
@@ -88,7 +88,7 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase
             ->method('getSchema')
             ->will($this->returnValue(__DIR__ . "/../_files/reader/schema.xsd"));
         $this->_validationStateMock->expects($this->any())->method('isValidated')->will($this->returnValue(true));
-        $model = new \Magento\Config\Reader\Filesystem(
+        $model = new Filesystem(
             $this->_fileResolverMock,
             $this->_converterMock,
             $this->_schemaLocatorMock,
@@ -113,7 +113,7 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase
             ->will($this->returnValue(__DIR__ . "/../_files/reader/schema.xsd"));
         $this->_validationStateMock->expects($this->any())->method('isValidated')->will($this->returnValue(true));
 
-        $model = new \Magento\Config\Reader\Filesystem(
+        $model = new Filesystem(
             $this->_fileResolverMock,
             $this->_converterMock,
             $this->_schemaLocatorMock,
@@ -125,4 +125,23 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase
             ->expects($this->once())->method('get')->will($this->returnValue(array($this->_file)));
         $model->read('scope');
     }
+
+    /**
+     * @expectedException \UnexpectedValueException
+     * @expectedExceptionMessage Instance of the DOM config merger is expected, got StdClass instead.
+     */
+    public function testReadException()
+    {
+        $this->_fileResolverMock->expects($this->once())->method('get')->will($this->returnValue(array($this->_file)));
+        $model = new Filesystem(
+            $this->_fileResolverMock,
+            $this->_converterMock,
+            $this->_schemaLocatorMock,
+            $this->_validationStateMock,
+            'fileName',
+            array(),
+            'StdClass'
+        );
+        $model->read();
+    }
 }
diff --git a/dev/tests/unit/testsuite/Magento/Config/_files/converter/dom/flat/result.php b/dev/tests/unit/testsuite/Magento/Config/_files/converter/dom/flat/result.php
index df46c5a8d39..54dbc8e8996 100644
--- a/dev/tests/unit/testsuite/Magento/Config/_files/converter/dom/flat/result.php
+++ b/dev/tests/unit/testsuite/Magento/Config/_files/converter/dom/flat/result.php
@@ -27,9 +27,14 @@ return array(
             'attributeOne' => '10',
             'attributeTwo' => '20',
             'subnode' => array(
-                'attributeThree' => '40',
-                'attributeFour' => '40',
-                'value' => 'Value1',
+                array(
+                    'attributeThree' => '30',
+                ),
+                array(
+                    'attributeThree' => '40',
+                    'attributeFour' => '40',
+                    'value' => 'Value1',
+                ),
             ),
             'books' => array(
                 'attributeFive' => '50'
diff --git a/dev/tests/unit/testsuite/Magento/Config/_files/dom/attributes.xml b/dev/tests/unit/testsuite/Magento/Config/_files/dom/attributes.xml
new file mode 100644
index 00000000000..9a1b70202cf
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Config/_files/dom/attributes.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <item id="id1" xsi:type="string" attrZero="value 0">Item 1.1</item>
+    <item id="id2" xsi:type="array" attrOne="value 2">
+        <subitem id="id2.1" xsi:type="string" attrOne="value 2.1">Item 2.1</subitem>
+        <subitem id="id2.2">Item 2.2</subitem>
+    </item>
+    <item id="id3" xsi:type="string" attrOne="value 3">Item 3.1</item>
+</root>
diff --git a/dev/tests/unit/testsuite/Magento/Config/_files/dom/attributes_merged.xml b/dev/tests/unit/testsuite/Magento/Config/_files/dom/attributes_merged.xml
new file mode 100644
index 00000000000..f388fce79c8
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Config/_files/dom/attributes_merged.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <item id="id1" xsi:type="string" attrZero="value 0" attrOne="value 1 new">Item 1.1</item>
+    <item id="id2" xsi:type="array" attrOne="value 2 new">
+        <subitem id="id2.1" xsi:type="string" attrOne="value 2.1 new" attrTwo="value 2.2 new">Item 2.1</subitem>
+        <subitem id="id2.2">Item 2.2</subitem>
+    </item>
+    <item id="id3" xsi:type="boolean" attrTwo="value 3 new">Item 3.1</item>
+</root>
diff --git a/dev/tests/unit/testsuite/Magento/Config/_files/dom/attributes_new.xml b/dev/tests/unit/testsuite/Magento/Config/_files/dom/attributes_new.xml
new file mode 100644
index 00000000000..9e4dd215969
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Config/_files/dom/attributes_new.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <item id="id1" xsi:type="string" attrOne="value 1 new">Item 1.1</item>
+    <item id="id2" xsi:type="array" attrOne="value 2 new">
+        <subitem id="id2.1" xsi:type="string" attrOne="value 2.1 new" attrTwo="value 2.2 new">Item 2.1</subitem>
+    </item>
+    <item id="id3" xsi:type="boolean" attrTwo="value 3 new">Item 3.1</item>
+</root>
diff --git a/dev/tests/unit/testsuite/Magento/Interception/Custom/Module/etc/backend/di.xml b/dev/tests/unit/testsuite/Magento/Config/_files/dom/types.xml
similarity index 68%
rename from dev/tests/unit/testsuite/Magento/Interception/Custom/Module/etc/backend/di.xml
rename to dev/tests/unit/testsuite/Magento/Config/_files/dom/types.xml
index f1821c57591..9a319481909 100644
--- a/dev/tests/unit/testsuite/Magento/Interception/Custom/Module/etc/backend/di.xml
+++ b/dev/tests/unit/testsuite/Magento/Config/_files/dom/types.xml
@@ -23,11 +23,14 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
-    <type name="Magento\Interception\Custom\Module\Model\Item">
-        <plugin name="advanced_plugin" type="Magento\Interception\Custom\Module\Model\ItemPlugin\Advanced" sortOrder="5"/>
-    </type>
-    <type name="Magento\Interception\Custom\Module\Model\ItemContainer">
-        <plugin name="simple_plugin" type="Magento\Interception\Custom\Module\Model\ItemContainerPlugin\Simple" sortOrder="15"/>
-    </type>
-</config>
+<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <item id="id1" xsi:type="array">
+        <subitem id="id1.1" xsi:type="string">Item 1.1</subitem>
+        <subitem id="id1.2" xsi:type="string">Item 1.2</subitem>
+    </item>
+    <item id="id2" xsi:type="array">
+        <subitem id="id2.1" xsi:type="string">Item 2.1</subitem>
+        <subitem id="id2.2">Item 2.2</subitem>
+    </item>
+    <item id="id3">Item 3</item>
+</root>
diff --git a/dev/tests/unit/testsuite/Magento/Config/_files/dom/types_merged.xml b/dev/tests/unit/testsuite/Magento/Config/_files/dom/types_merged.xml
new file mode 100644
index 00000000000..a7cdc38644f
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Config/_files/dom/types_merged.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <item id="id1" xsi:type="array">
+        <subitem id="id1.1" xsi:type="string">Item 1.1</subitem>
+        <subitem id="id1.2" xsi:type="string">New Item 1.2</subitem>
+        <subitem id="id1.3" xsi:type="string">New Item 1.3</subitem>
+    </item>
+    <item id="id2" xsi:type="mega_array">
+        <subitem id="id2.3">New Item 2.3</subitem>
+    </item>
+    <item id="id3" xsi:type="string">New Item 3</item>
+    <item id="id4">New Item 4</item>
+</root>
diff --git a/dev/tests/unit/testsuite/Magento/Config/_files/dom/types_new.xml b/dev/tests/unit/testsuite/Magento/Config/_files/dom/types_new.xml
new file mode 100644
index 00000000000..cd9d9c2e8f0
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Config/_files/dom/types_new.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <item id="id1" xsi:type="array">
+        <subitem id="id1.2" xsi:type="string">New Item 1.2</subitem>
+        <subitem id="id1.3" xsi:type="string">New Item 1.3</subitem>
+    </item>
+    <item id="id2" xsi:type="mega_array">
+        <subitem id="id2.3">New Item 2.3</subitem>
+    </item>
+    <item id="id3" xsi:type="string">New Item 3</item>
+    <item id="id4">New Item 4</item>
+</root>
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Config/MatrixTest.php b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/MatrixTest.php
similarity index 85%
rename from dev/tests/unit/testsuite/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Config/MatrixTest.php
rename to dev/tests/unit/testsuite/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/MatrixTest.php
index 175c86d0aa9..a17dd0368ca 100644
--- a/dev/tests/unit/testsuite/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Super/Config/MatrixTest.php
+++ b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Block/Adminhtml/Product/Edit/Tab/Super/Config/MatrixTest.php
@@ -22,21 +22,21 @@
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
-namespace Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config;
+namespace Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config;
 
 class MatrixTest extends \PHPUnit_Framework_TestCase
 {
     /**
      * Object under test
      *
-     * @var \Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config_Matrix
+     * @var \Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config\Matrix
      */
     protected $_block;
 
-    /** @var \Magento\Core\Model\App|\PHPUnit_Framework_MockObject_MockObject */
+    /** @var \PHPUnit_Framework_MockObject_MockObject */
     protected $_application;
 
-    /** @var \Magento\Core\Model\LocaleInterface|\PHPUnit_Framework_MockObject_MockObject */
+    /** @var \PHPUnit_Framework_MockObject_MockObject */
     protected $_locale;
 
     protected function setUp()
@@ -52,7 +52,7 @@ class MatrixTest extends \PHPUnit_Framework_TestCase
         $helper = new \Magento\TestFramework\Helper\ObjectManager($this);
         $this->_object = $helper->getObject('Magento\Backend\Block\System\Config\Form', $data);
         $this->_block = $helper->getObject(
-            'Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Super\Config\Matrix', $data
+            'Magento\ConfigurableProduct\Block\Adminhtml\Product\Edit\Tab\Super\Config\Matrix', $data
         );
     }
 
diff --git a/dev/tests/unit/testsuite/Magento/Checkout/Block/Cart/Item/Renderer/ConfigurableTest.php b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Block/Cart/Item/Renderer/ConfigurableTest.php
similarity index 91%
rename from dev/tests/unit/testsuite/Magento/Checkout/Block/Cart/Item/Renderer/ConfigurableTest.php
rename to dev/tests/unit/testsuite/Magento/ConfigurableProduct/Block/Cart/Item/Renderer/ConfigurableTest.php
index f4240a8d727..4bb56445e1a 100644
--- a/dev/tests/unit/testsuite/Magento/Checkout/Block/Cart/Item/Renderer/ConfigurableTest.php
+++ b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Block/Cart/Item/Renderer/ConfigurableTest.php
@@ -18,16 +18,12 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Checkout
- * @subpackage  unit_tests
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
+namespace Magento\ConfigurableProduct\Block\Cart\Item\Renderer;
 
-namespace Magento\Checkout\Block\Cart\Item\Renderer;
-
-use Magento\Checkout\Block\Cart\Item\Renderer\Configurable as Renderer;
+use Magento\ConfigurableProduct\Block\Cart\Item\Renderer\Configurable as Renderer;
 use \Magento\Catalog\Model\Config\Source\Product\Thumbnail as ThumbnailSource;
 
 class ConfigurableTest extends \PHPUnit_Framework_TestCase
@@ -41,6 +37,8 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase
     /** @var \Magento\Core\Model\Store\Config|\PHPUnit_Framework_MockObject_MockObject */
     protected $_storeConfig;
 
+    /** @var \PHPUnit_Framework_MockObject_MockObject */
+    protected $productConfigMock;
     /** @var Renderer */
     protected $_renderer;
 
@@ -57,12 +55,15 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase
             false
         );
         $this->_storeConfig = $this->getMock('Magento\Core\Model\Store\Config', array(), array(), '', false, false);
+        $this->productConfigMock =
+            $this->getMock('Magento\Catalog\Helper\Product\Configuration', array(), array(), '', false);
         $this->_renderer = $objectManagerHelper->getObject(
-            'Magento\Checkout\Block\Cart\Item\Renderer\Configurable',
+            'Magento\ConfigurableProduct\Block\Cart\Item\Renderer\Configurable',
             array(
                 'viewConfig' => $this->_configManager,
                 'imageHelper' => $this->_imageHelper,
                 'storeConfig' => $this->_storeConfig,
+                'productConfig' =>$this->productConfigMock,
             )
         );
     }
@@ -222,4 +223,12 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase
 
         return ['parentProduct' => $parentProduct, 'childProduct' => $childProduct];
     }
+
+    public function testGetOptionList()
+    {
+        $itemMock = $this->getMock('Magento\Sales\Model\Quote\Item\AbstractItem', array(), array(), '', false);
+        $this->_renderer->setItem($itemMock);
+        $this->productConfigMock->expects($this->once())->method('getOptions')->with($itemMock);
+        $this->_renderer->getOptionList();
+    }
 }
diff --git a/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Block/Product/Configurable/AttributeSelectorTest.php b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Block/Product/Configurable/AttributeSelectorTest.php
new file mode 100644
index 00000000000..3d9731193eb
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Block/Product/Configurable/AttributeSelectorTest.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ConfigurableProduct\Block\Product\Configurable;
+
+
+class AttributeSelectorTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\ConfigurableProduct\Block\Product\Configurable\AttributeSelector
+     */
+    protected $attributeSelector;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $urlBuilder;
+
+    protected function setUp()
+    {
+        $helper = new \Magento\TestFramework\Helper\ObjectManager($this);
+        $this->urlBuilder = $this->getMock('Magento\UrlInterface');
+        $this->attributeSelector =
+            $helper->getObject('Magento\ConfigurableProduct\Block\Product\Configurable\AttributeSelector', array(
+                    'urlBuilder' => $this->urlBuilder,
+                )
+            );
+    }
+
+    public function testGetAttributeSetCreationUrl()
+    {
+        $this->urlBuilder
+            ->expects($this->once())
+            ->method('getUrl')
+            ->with('*/product_set/save')
+            ->will($this->returnValue('some_url'));
+        $this->assertEquals('some_url', $this->attributeSelector->getAttributeSetCreationUrl());
+    }
+
+    public function testGetSuggestWidgetOptions()
+    {
+        $source = 'source_url';
+        $this->urlBuilder
+            ->expects($this->once())
+            ->method('getUrl')
+            ->with('*/product_attribute_suggestConfigurableAttributes')
+            ->will($this->returnValue($source));
+        $expected = array(
+            'source' => $source,
+            'minLength' => 0,
+            'className' => 'category-select',
+            'showAll' => true
+        );
+        $this->assertEquals($expected, $this->attributeSelector->getSuggestWidgetOptions());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Attribute/SuggestConfigurableAttributesTest.php b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Attribute/SuggestConfigurableAttributesTest.php
new file mode 100644
index 00000000000..542b4c1c58d
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Attribute/SuggestConfigurableAttributesTest.php
@@ -0,0 +1,95 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ConfigurableProduct\Controller\Adminhtml\Product\Attribute;
+
+class SuggestConfigurableAttributesTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\ConfigurableProduct\Controller\Adminhtml\Product\Attribute\SuggestConfigurableAttributes
+     */
+    protected $suggestAttributes;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $responseMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $requestMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $helperMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $attributeListMock;
+
+    protected function setUp()
+    {
+        $helper = new \Magento\TestFramework\Helper\ObjectManager($this);
+        $this->responseMock = $this->getMock('Magento\App\Response\Http', array(), array(), '', false);
+        $this->requestMock = $this->getMock('Magento\App\Request\Http', array(), array(), '', false);
+        $this->helperMock = $this->getMock('Magento\Core\Helper\Data', array(), array(), '', false);
+        $this->attributeListMock =
+            $this->getMock('Magento\ConfigurableProduct\Model\SuggestedAttributeList', array(), array(), '', false);
+        $this->suggestAttributes = $helper->getObject(
+            'Magento\ConfigurableProduct\Controller\Adminhtml\Product\Attribute\SuggestConfigurableAttributes', array(
+                'response' => $this->responseMock,
+                'request' => $this->requestMock,
+                'coreHelper' => $this->helperMock,
+                'attributeList' => $this->attributeListMock
+            )
+        );
+    }
+
+    public function testIndexAction()
+    {
+
+        $this->requestMock
+            ->expects($this->once())
+            ->method('getParam')
+            ->with('label_part')
+            ->will($this->returnValue('attribute'));
+        $this->attributeListMock
+            ->expects($this->once())
+            ->method('getSuggestedAttributes')
+            ->with('attribute')
+            ->will($this->returnValue('some_value_for_json'));
+        $this->helperMock
+            ->expects($this->once())
+            ->method('jsonEncode')
+            ->with('some_value_for_json')
+            ->will($this->returnValue('body'));
+        $this->responseMock->expects($this->once())->method('setBody')->with('body');
+        $this->suggestAttributes->indexAction();
+
+    }
+}
+
diff --git a/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Builder/PluginTest.php b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Builder/PluginTest.php
new file mode 100644
index 00000000000..1d4499b63e2
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Builder/PluginTest.php
@@ -0,0 +1,242 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ConfigurableProduct\Controller\Adminhtml\Product\Builder;
+
+class PluginTest extends \PHPUnit_Framework_TestCase
+{
+
+    /**
+     * @var \Magento\ConfigurableProduct\Controller\Adminhtml\Product\Builder\Plugin
+     */
+    protected $plugin;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $productFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $configurableTypeMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $invocationChainMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $requestMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $productMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $attributeMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $configurableMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $frontendAttrMock;
+
+    protected function setUp()
+    {
+        $this->productFactoryMock = $this->getMock('Magento\Catalog\Model\ProductFactory', array('create'));
+        $this->configurableTypeMock =
+            $this->getMock('Magento\ConfigurableProduct\Model\Product\Type\Configurable', array(), array(), '', false);
+        $this->invocationChainMock = $this->getMock('Magento\Code\Plugin\InvocationChain', array(), array(), '', false);
+        $this->requestMock = $this->getMock('Magento\App\Request\Http', array(), array(), '', false);
+        $methods = array('setTypeId', 'getAttributes', 'addData', 'setWebsiteIds', '__wakeup');
+        $this->productMock =
+            $this->getMock('Magento\Catalog\Model\Product', $methods, array(), '', false);
+        $this->invocationChainMock
+            ->expects($this->once())
+            ->method('proceed')
+            ->with(array($this->requestMock))
+            ->will($this->returnValue($this->productMock));
+        $attributeMethods =
+            array('getId', 'getFrontend', 'getAttributeCode', '__wakeup', 'setIsRequired', 'getIsUnique');
+        $this->attributeMock
+            = $this->getMock('Magento\Catalog\Model\Resource\Eav\Attribute', $attributeMethods, array(), '', false);
+        $configMethods =
+            array('setStoreId', 'getTypeInstance', 'getIdFieldName', 'getData',
+                'getWebsiteIds', '__wakeup', 'load', 'setTypeId', 'getEditableAttributes');
+        $this->configurableMock = $this->getMock(
+            'Magento\ConfigurableProduct\Model\Product\Type\Configurable', $configMethods, array(), '', false);
+        $this->frontendAttrMock =
+            $this->getMock('Magento\Sales\Model\Resource\Quote\Address\Attribute\Frontend',
+                array(), array(), '', false);
+        $this->plugin = new \Magento\ConfigurableProduct\Controller\Adminhtml\Product\Builder\Plugin(
+            $this->productFactoryMock,
+            $this->configurableTypeMock
+        );
+    }
+
+    public function testAroundBuild()
+    {
+        $this->requestMock->expects($this->once())->method('has')->with('attributes')->will($this->returnValue(true));
+        $valueMap = array(
+            array('attributes', null, array('attributes')),
+            array('popup', null, true),
+            array('required', null, '1,2'),
+            array('product', null, 'product'),
+            array('id', false, false),
+            array('type', null, 'store_type'),
+        );
+        $this->requestMock->expects($this->any())->method('getParam')->will($this->returnValueMap($valueMap));
+        $this->productMock
+            ->expects($this->once())
+            ->method('setTypeId')
+            ->with(\Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE)
+            ->will($this->returnSelf());
+        $this->configurableTypeMock
+            ->expects($this->once())
+            ->method('setUsedProductAttributeIds')
+            ->with(array('attributes'))
+            ->will($this->returnSelf());
+        $this->productMock
+            ->expects($this->once())
+            ->method('getAttributes')
+            ->will($this->returnValue(array($this->attributeMock)));
+        $this->attributeMock->expects($this->once())->method('getId')->will($this->returnValue(1));
+        $this->attributeMock->expects($this->once())->method('setIsRequired')->with(1)->will($this->returnSelf());
+        $this->productFactoryMock
+            ->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($this->configurableMock));
+        $this->configurableMock->expects($this->once())->method('setStoreId')->with(0)->will($this->returnSelf());
+        $this->configurableMock
+            ->expects($this->once())
+            ->method('load')
+            ->with('product')
+            ->will($this->returnSelf());
+        $this->configurableMock
+            ->expects($this->once())
+            ->method('setTypeId')
+            ->with('store_type')
+            ->will($this->returnSelf());
+        $this->configurableMock->expects($this->once())->method('getTypeInstance')->will($this->returnSelf());
+        $this->configurableMock
+            ->expects($this->once())
+            ->method('getEditableAttributes')
+            ->with($this->configurableMock)
+            ->will($this->returnValue(array($this->attributeMock)));
+        $this->configurableMock
+            ->expects($this->once())
+            ->method('getIdFieldName')
+            ->will($this->returnValue('fieldName'));
+        $this->attributeMock->expects($this->once())->method('getIsUnique')->will($this->returnValue(false));
+        $this->attributeMock
+            ->expects($this->once())
+            ->method('getFrontend')
+            ->will($this->returnValue($this->frontendAttrMock));
+        $this->frontendAttrMock->expects($this->once())->method('getInputType');
+        $attributeCode = 'attribute_code';
+        $this->attributeMock
+            ->expects($this->any())
+            ->method('getAttributeCode')
+            ->will($this->returnValue($attributeCode));
+        $this->configurableMock
+            ->expects($this->once())
+            ->method('getData')
+            ->with($attributeCode)
+            ->will($this->returnValue('attribute_data'));
+        $this->productMock
+            ->expects($this->once())
+            ->method('addData')
+            ->with(array($attributeCode => 'attribute_data'))
+        ->will($this->returnSelf());
+        $this->configurableMock
+            ->expects($this->once())
+            ->method('getWebsiteIds')
+            ->will($this->returnValue('website_id'));
+        $this->productMock
+            ->expects($this->once())
+            ->method('setWebsiteIds')
+            ->with('website_id')
+            ->will($this->returnSelf());
+
+        $this->assertEquals(
+            $this->productMock,
+            $this->plugin->aroundBuild(array($this->requestMock), $this->invocationChainMock)
+        );
+    }
+
+    public function testAroundBuildWhenProductNotHaveAttributeAndRequiredParameters()
+    {
+        $valueMap = array(
+            array('attributes', null, null),
+            array('popup', null, false),
+            array('product', null, 'product'),
+            array('id', false, false),
+        );
+        $this->requestMock->expects($this->once())->method('has')->with('attributes')->will($this->returnValue(true));
+        $this->requestMock->expects($this->any())->method('getParam')->will($this->returnValueMap($valueMap));
+        $this->productMock
+            ->expects($this->once())
+            ->method('setTypeId')
+            ->with(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE);
+        $this->productMock->expects($this->never())->method('getAttributes');
+        $this->productFactoryMock->expects($this->never())->method('create');
+        $this->configurableMock->expects($this->never())->method('getTypeInstance');
+        $this->attributeMock->expects($this->never())->method('getAttributeCode');
+        $this->assertEquals(
+            $this->productMock,
+            $this->plugin->aroundBuild(array($this->requestMock), $this->invocationChainMock)
+        );
+    }
+
+    public function testAroundBuildWhenAttributesAreEmpty()
+    {
+        $valueMap = array(
+            array('popup', null, false),
+            array('product', null, 'product'),
+            array('id', false, false),
+        );
+        $this->requestMock->expects($this->once())->method('has')->with('attributes')->will($this->returnValue(false));
+        $this->requestMock->expects($this->any())->method('getParam')->will($this->returnValueMap($valueMap));
+        $this->productMock->expects($this->never())->method('setTypeId');
+        $this->productMock->expects($this->never())->method('getAttributes');
+        $this->productFactoryMock->expects($this->never())->method('create');
+        $this->configurableMock->expects($this->never())->method('getTypeInstance');
+        $this->attributeMock->expects($this->never())->method('getAttributeCode');
+        $this->assertEquals(
+            $this->productMock,
+            $this->plugin->aroundBuild(array($this->requestMock), $this->invocationChainMock)
+        );
+    }
+
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper/Plugin/ConfigurableTest.php b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Initialization/Helper/Plugin/ConfigurableTest.php
similarity index 93%
rename from dev/tests/unit/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper/Plugin/ConfigurableTest.php
rename to dev/tests/unit/testsuite/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Initialization/Helper/Plugin/ConfigurableTest.php
index 28cbe9ec821..49e55410c8d 100644
--- a/dev/tests/unit/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper/Plugin/ConfigurableTest.php
+++ b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Initialization/Helper/Plugin/ConfigurableTest.php
@@ -22,14 +22,14 @@
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
-namespace Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper\Plugin;
+namespace Magento\ConfigurableProduct\Controller\Adminhtml\Product\Initialization\Helper\Plugin;
 
 
 class ConfigurableTest extends \PHPUnit_Framework_TestCase
 {
 
     /**
-     * @var \Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper\Plugin\Configurable
+     * @var \Magento\ConfigurableProduct\Controller\Adminhtml\Product\Initialization\Helper\Plugin\Configurable
      */
     protected $plugin;
 
@@ -51,13 +51,13 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase
     protected function setUp()
     {
         $this->productTypeMock = $this->getMock(
-            'Magento\Catalog\Model\Product\Type\Configurable', array(), array(), '', false
+            'Magento\ConfigurableProduct\Model\Product\Type\Configurable', array(), array(), '', false
         );
         $this->requestMock = $this->getMock('\Magento\App\Request\Http', array(), array(), '', false);
         $methods = array('setNewVariationsAttributeSetId', 'setAssociatedProductIds',
             'setCanSaveConfigurableAttributes', '__wakeup');
         $this->productMock = $this->getMock('Magento\Catalog\Model\Product', $methods, array(), '', false);
-        $this->plugin = new \Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper\Plugin\Configurable(
+        $this->plugin = new Configurable(
             $this->productTypeMock,
             $this->requestMock
         );
diff --git a/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Initialization/Helper/Plugin/Handler/ProductType/ConfigurableTest.php b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Initialization/Helper/Plugin/Handler/ProductType/ConfigurableTest.php
new file mode 100644
index 00000000000..9ad9bc5d6ef
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Controller/Adminhtml/Product/Initialization/Helper/Plugin/Handler/ProductType/ConfigurableTest.php
@@ -0,0 +1,146 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ConfigurableProduct\Controller\Adminhtml\Product\Initialization\Helper\Plugin\Handler\ProductType;
+
+class ConfigurableTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Configurable
+     */
+    protected $model;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $productMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $productTypeMock;
+
+    protected function setUp()
+    {
+        $this->productMock = $this->getMock('\Magento\Catalog\Model\Product',
+            array(
+                'getConfigurableAttributesData', 'getTypeInstance', 'setConfigurableAttributesData', '__wakeup',
+                'getTypeId'
+            ),
+            array(),
+            '',
+            false
+        );
+        $this->productTypeMock = $this->getMock(
+            '\Magento\ConfigurableProduct\Model\Product\Type\Configurable', array(), array(), '', false
+        );
+        $this->productMock->expects($this->any())
+            ->method('getTypeInstance')->will($this->returnValue($this->productTypeMock));
+        $this->model = new Configurable();
+    }
+
+    public function testHandleWithNonConfigurableProductType()
+    {
+        $this->productMock->expects($this->once())->method('getTypeId')->will($this->returnValue('some product type'));
+        $this->productMock->expects($this->never())->method('getConfigurableAttributesData');
+        $this->model->handle($this->productMock);
+    }
+
+    public function testHandleWithoutOriginalProductAttributes()
+    {
+        $this->productMock->expects($this->once())->method('getTypeId')
+            ->will($this->returnValue(\Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE));
+        $this->productTypeMock->expects($this->once())
+            ->method('getConfigurableAttributesAsArray')
+            ->with($this->productMock)
+            ->will($this->returnValue(array()));
+
+        $attributeData = array(
+            array(
+                'attribute_id' => 1,
+                'values' => array(
+                    array(
+                        'value_index' => 0, 'pricing_value' => 10, 'is_percent' => 1,
+                    )
+                ),
+            )
+        );
+        $this->productMock->expects($this->once())
+            ->method('getConfigurableAttributesData')->will($this->returnValue($attributeData));
+
+        $expected = array(
+            array(
+                'attribute_id' => 1,
+                'values' => array(array('value_index' => 0, 'pricing_value' => 0, 'is_percent' => 0)),
+            )
+        );
+
+        $this->productMock->expects($this->once())->method('setConfigurableAttributesData')->with($expected);
+        $this->model->handle($this->productMock);
+    }
+
+    public function testHandleWithOriginalProductAttributes()
+    {
+        $originalAttributes = array(
+            array(
+                'id' => 1,
+                'values' => array(
+                    array('value_index' => 0, 'is_percent' => 10, 'pricing_value' => 50)
+                ),
+            ),
+        );
+
+        $this->productMock->expects($this->once())->method('getTypeId')
+            ->will($this->returnValue(\Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE));
+        $this->productTypeMock->expects($this->once())
+            ->method('getConfigurableAttributesAsArray')
+            ->with($this->productMock)
+            ->will($this->returnValue($originalAttributes));
+
+        $attributeData = array(
+            array(
+                'attribute_id' => 1,
+                'values' => array(
+                    array('value_index' => 0, 'pricing_value' => 10, 'is_percent' => 1),
+                    array('value_index' => 1, 'pricing_value' => 100, 'is_percent' => 200),
+                ),
+            )
+        );
+        $this->productMock->expects($this->once())
+            ->method('getConfigurableAttributesData')->will($this->returnValue($attributeData));
+
+        $expected = array(
+            array(
+                'attribute_id' => 1,
+                'values' => array(
+                    array('value_index' => 0, 'pricing_value' => 50, 'is_percent' => 10),
+                    array('value_index' => 1, 'pricing_value' => 0, 'is_percent' => 0)
+                ),
+            )
+        );
+
+        $this->productMock->expects($this->once())->method('setConfigurableAttributesData')->with($expected);
+        $this->model->handle($this->productMock);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Helper/Product/Configuration/PluginTest.php b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Helper/Product/Configuration/PluginTest.php
new file mode 100644
index 00000000000..c5cff96b6f2
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Helper/Product/Configuration/PluginTest.php
@@ -0,0 +1,101 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ConfigurableProduct\Helper\Product\Configuration;
+
+class PluginTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\ConfigurableProduct\Helper\Product\Configuration\Plugin
+     */
+    protected $plugin;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $itemMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $invocationChainMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $productMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $typeInstanceMock;
+
+    protected function setUp()
+    {
+        $this->itemMock = $this->getMock('Magento\Catalog\Model\Product\Configuration\Item\ItemInterface');
+        $this->invocationChainMock = $this->getMock('Magento\Code\Plugin\InvocationChain', array(), array(), '', false);
+        $this->productMock = $this->getMock('Magento\Catalog\Model\Product', array(), array(), '', false);
+        $this->typeInstanceMock =
+            $this->getMock('Magento\ConfigurableProduct\Model\Product\Type\Configurable',
+                array('getSelectedAttributesInfo', '__wakeup'), array(), '', false);
+        $this->itemMock->expects($this->once())->method('getProduct')->will($this->returnValue($this->productMock));
+        $this->invocationChainMock
+            ->expects($this->once())
+            ->method('proceed')
+            ->with(array($this->itemMock))
+            ->will($this->returnValue(array('options')));
+        $this->plugin = new \Magento\ConfigurableProduct\Helper\Product\Configuration\Plugin();
+    }
+
+    public function testAroundGetOptionsWhenProductTypeIsConfigurable()
+    {
+        $this->productMock
+            ->expects($this->once())
+            ->method('getTypeId')
+            ->will($this->returnValue(\Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE));
+        $this->productMock
+            ->expects($this->once())
+            ->method('getTypeInstance')
+            ->will($this->returnValue($this->typeInstanceMock));
+        $this->typeInstanceMock
+            ->expects($this->once())
+            ->method('getSelectedAttributesInfo')
+            ->with($this->productMock)
+            ->will($this->returnValue(array('attributes')));
+        $this->assertEquals(array('attributes', 'options'),
+            $this->plugin->aroundGetOptions(array($this->itemMock), $this->invocationChainMock));
+    }
+
+    public function testAroundGetOptionsWhenProductTypeIsSimple()
+    {
+        $this->productMock
+            ->expects($this->once())
+            ->method('getTypeId')
+            ->will($this->returnValue('simple'));
+        $this->productMock
+            ->expects($this->never())->method('getTypeInstance');
+        $this->assertEquals(array('options'),
+            $this->plugin->aroundGetOptions(array($this->itemMock), $this->invocationChainMock));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Model/Order/Admin/Item/Plugin/ConfigurableTest.php b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Model/Order/Admin/Item/Plugin/ConfigurableTest.php
new file mode 100644
index 00000000000..8a0c946dd66
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Model/Order/Admin/Item/Plugin/ConfigurableTest.php
@@ -0,0 +1,162 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ConfigurableProduct\Model\Order\Admin\Item\Plugin;
+
+class ConfigurableTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\ConfigurableProduct\Model\Order\Admin\Item\Plugin\Configurable
+     */
+    protected $configurable;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $productFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $itemMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $invocationChainMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $productMock;
+
+    protected function setUp()
+    {
+        $this->itemMock =
+            $this->getMock('Magento\Sales\Model\Order\Item', array('getProductType', 'getProductOptions', '__wakeup'),
+                array(), '', false);
+        $this->invocationChainMock = $this->getMock('Magento\Code\Plugin\InvocationChain', array(), array(), '', false);
+        $this->productFactoryMock =
+            $this->getMock('Magento\Catalog\Model\ProductFactory', array('create'));
+        $this->productMock = $this->getMock('Magento\Catalog\Model\Product', array(), array(), '', false);
+        $this->configurable = new \Magento\ConfigurableProduct\Model\Order\Admin\Item\Plugin\Configurable(
+            $this->productFactoryMock
+        );
+    }
+
+    public function testAroundGetNameIfProductIsConfigurable()
+    {
+        $this->itemMock
+            ->expects($this->once())
+            ->method('getProductType')
+            ->will($this->returnValue(\Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE));
+        $this->itemMock
+            ->expects($this->once())
+            ->method('getProductOptions')
+            ->will($this->returnValue(array('simple_name' => 'simpleName')));
+        $this->invocationChainMock->expects($this->never())->method('proceed');
+        $this->assertEquals('simpleName',
+            $this->configurable->aroundGetName(array($this->itemMock), $this->invocationChainMock));
+    }
+
+    public function testAroundGetNameIfProductIsSimple()
+    {
+        $this->itemMock
+            ->expects($this->once())
+            ->method('getProductType')
+            ->will($this->returnValue('simple'));
+        $this->itemMock
+            ->expects($this->never())
+            ->method('getProductOptions');
+        $this->invocationChainMock->expects($this->once())->method('proceed')->with(array($this->itemMock));
+        $this->configurable->aroundGetName(array($this->itemMock), $this->invocationChainMock);
+    }
+
+    public function testAroundGetSkuIfProductIsConfigurable()
+    {
+        $this->itemMock
+            ->expects($this->once())
+            ->method('getProductType')
+            ->will($this->returnValue(\Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE));
+        $this->itemMock
+            ->expects($this->once())
+            ->method('getProductOptions')
+            ->will($this->returnValue(array('simple_sku' => 'simpleName')));
+        $this->invocationChainMock->expects($this->never())->method('proceed');
+        $this->assertEquals('simpleName',
+            $this->configurable->aroundGetSku(array($this->itemMock), $this->invocationChainMock)
+        );
+    }
+
+    public function testAroundGetSkuIfProductIsSimple()
+    {
+        $this->itemMock
+            ->expects($this->once())
+            ->method('getProductType')
+            ->will($this->returnValue('simple'));
+        $this->itemMock
+            ->expects($this->never())
+            ->method('getProductOptions');
+        $this->invocationChainMock->expects($this->once())->method('proceed')->with(array($this->itemMock));
+        $this->configurable->aroundGetSku(array($this->itemMock), $this->invocationChainMock);
+    }
+
+    public function testAroundGetProductIdIfProductIsConfigurable()
+    {
+        $this->itemMock
+            ->expects($this->once())
+            ->method('getProductType')
+            ->will($this->returnValue(\Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE));
+        $this->itemMock
+            ->expects($this->once())
+            ->method('getProductOptions')
+            ->will($this->returnValue(array('simple_sku' => 'simpleName')));
+        $this->productFactoryMock
+            ->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($this->productMock));
+        $this->productMock
+            ->expects($this->once())
+            ->method('getIdBySku')
+            ->with('simpleName')
+            ->will($this->returnValue('id'));
+        $this->invocationChainMock->expects($this->never())->method('proceed');
+        $this->assertEquals('id',
+            $this->configurable->aroundGetProductId(array($this->itemMock), $this->invocationChainMock)
+        );
+    }
+
+    public function testAroundGetProductIdIfProductIsSimple()
+    {
+        $this->itemMock
+            ->expects($this->once())
+            ->method('getProductType')
+            ->will($this->returnValue('simple'));
+        $this->itemMock
+            ->expects($this->never())
+            ->method('getProductOptions');
+        $this->invocationChainMock->expects($this->once())->method('proceed')->with(array($this->itemMock));
+        $this->configurable->aroundGetProductId(array($this->itemMock), $this->invocationChainMock);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Model/Product/CartConfiguration/Plugin/ConfigurableTest.php b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Model/Product/CartConfiguration/Plugin/ConfigurableTest.php
new file mode 100644
index 00000000000..f0a46bddeff
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Model/Product/CartConfiguration/Plugin/ConfigurableTest.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ConfigurableProduct\Model\Product\CartConfiguration\Plugin;
+
+class ConfigurableTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\ConfigurableProduct\Model\Product\CartConfiguration\Plugin\Configurable
+     */
+    protected $model;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $invocationChainMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $productMock;
+
+    protected function setUp()
+    {
+        $this->invocationChainMock = $this->getMock('Magento\Code\Plugin\InvocationChain', array(), array(), '', false);
+        $this->productMock = $this->getMock('Magento\Catalog\Model\Product', array(), array(), '', false);
+        $this->model = new Configurable();
+    }
+
+    public function testAroundIsProductConfiguredChecksThatSuperAttributeIsSetWhenProductIsConfigurable()
+    {
+        $config = array('super_attribute' => 'valid_value');
+        $this->productMock->expects($this->once())
+            ->method('getTypeId')
+            ->will($this->returnValue(\Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE));
+        $this->invocationChainMock->expects($this->never())->method('proceed');
+        $this->assertEquals(
+            true,
+            $this->model->aroundIsProductConfigured(array($this->productMock, $config), $this->invocationChainMock)
+        );
+    }
+
+    public function testAroundIsProductConfiguredProceedsChainInvocationWhenProductIsNotConfigurable()
+    {
+        $config = array('super_group' => 'valid_value');
+        $this->productMock->expects($this->once())
+            ->method('getTypeId')
+            ->will($this->returnValue('custom_product_type'));
+        $this->invocationChainMock->expects($this->once())
+            ->method('proceed')
+            ->with(array($this->productMock, $config));
+        $this->model->aroundIsProductConfigured(array($this->productMock, $config), $this->invocationChainMock);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/Type/ConfigurableTest.php b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Model/Product/Type/ConfigurableTest.php
similarity index 63%
rename from dev/tests/unit/testsuite/Magento/Catalog/Model/Product/Type/ConfigurableTest.php
rename to dev/tests/unit/testsuite/Magento/ConfigurableProduct/Model/Product/Type/ConfigurableTest.php
index ebcd919f9f7..ecb3cc8c55f 100644
--- a/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/Type/ConfigurableTest.php
+++ b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Model/Product/Type/ConfigurableTest.php
@@ -18,24 +18,21 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Catalog
- * @subpackage  unit_tests
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
-namespace Magento\Catalog\Model\Product\Type;
+namespace Magento\ConfigurableProduct\Model\Product\Type;
 
 /**
- * Class \Magento\Catalog\Model\Product\Type\ConfigurableTest
+ * Class \Magento\ConfigurableProduct\Model\Product\Type\ConfigurableTest
  *
  * @SuppressWarnings(PHPMD.LongVariable)
  */
 class ConfigurableTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \Magento\Catalog\Model\Product\Type\Configurable
+     * @var \Magento\ConfigurableProduct\Model\Product\Type\Configurable
      */
     protected $_model;
 
@@ -54,38 +51,42 @@ class ConfigurableTest extends \PHPUnit_Framework_TestCase
         $coreRegistry = $this->getMock('Magento\Core\Model\Registry', array(), array(), '', false);
         $logger = $this->getMock('Magento\Logger', array(), array(), '', false);
         $productFactoryMock = $this->getMock('Magento\Catalog\Model\ProductFactory', array(), array(), '', false);
-        $confFactoryMock = $this->getMock('Magento\Catalog\Model\Resource\Product\Type\ConfigurableFactory',
+        $confFactoryMock = $this->getMock('Magento\ConfigurableProduct\Model\Resource\Product\Type\ConfigurableFactory',
             array(), array(), '', false);
         $entityFactoryMock = $this->getMock('Magento\Eav\Model\EntityFactory', array(), array(), '', false);
         $setFactoryMock = $this->getMock('Magento\Eav\Model\Entity\Attribute\SetFactory', array(), array(), '', false);
         $attributeFactoryMock = $this->getMock('Magento\Catalog\Model\Resource\Eav\AttributeFactory', array(),
             array(), '', false);
-        $confAttrFactoryMock = $this->getMock('Magento\Catalog\Model\Product\Type\Configurable\AttributeFactory',
+        $confAttrFactoryMock = $this->getMock(
+            'Magento\ConfigurableProduct\Model\Product\Type\Configurable\AttributeFactory',
             array(), array(), '', false);
         $productColFactory = $this->getMock(
-            'Magento\Catalog\Model\Resource\Product\Type\Configurable\Product\CollectionFactory',
+            'Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Product\CollectionFactory',
             array(), array(), '', false
         );
         $attrColFactory = $this->getMock(
-            'Magento\Catalog\Model\Resource\Product\Type\Configurable\Attribute\CollectionFactory',
+            'Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute\CollectionFactory',
             array(), array(), '', false
         );
-        $this->_model = $this->_objectHelper->getObject('Magento\Catalog\Model\Product\Type\Configurable', array(
-            'productFactory' => $productFactoryMock,
-            'typeConfigurableFactory' => $confFactoryMock,
-            'entityFactory' => $entityFactoryMock,
-            'attributeSetFactory' => $setFactoryMock,
-            'eavAttributeFactory' => $attributeFactoryMock,
-            'configurableAttributeFactory' => $confAttrFactoryMock,
-            'productCollectionFactory' => $productColFactory,
-            'attributeCollectionFactory' => $attrColFactory,
-            'eventManager' => $eventManager,
-            'coreData' => $coreDataMock,
-            'fileStorageDb' => $fileStorageDbMock,
-            'filesystem' => $filesystem,
-            'coreRegistry' => $coreRegistry,
-            'logger' => $logger
-        ));
+        $this->_model = $this->_objectHelper->getObject(
+            'Magento\ConfigurableProduct\Model\Product\Type\Configurable',
+            array(
+                'productFactory' => $productFactoryMock,
+                'typeConfigurableFactory' => $confFactoryMock,
+                'entityFactory' => $entityFactoryMock,
+                'attributeSetFactory' => $setFactoryMock,
+                'eavAttributeFactory' => $attributeFactoryMock,
+                'configurableAttributeFactory' => $confAttrFactoryMock,
+                'productCollectionFactory' => $productColFactory,
+                'attributeCollectionFactory' => $attrColFactory,
+                'eventManager' => $eventManager,
+                'coreData' => $coreDataMock,
+                'fileStorageDb' => $fileStorageDbMock,
+                'filesystem' => $filesystem,
+                'coreRegistry' => $coreRegistry,
+                'logger' => $logger
+            )
+        );
     }
 
     public function testHasWeightTrue()
diff --git a/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Model/Product/TypeTransitionManager/Plugin/ConfigurableTest.php b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Model/Product/TypeTransitionManager/Plugin/ConfigurableTest.php
new file mode 100644
index 00000000000..9444bb3fd03
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Model/Product/TypeTransitionManager/Plugin/ConfigurableTest.php
@@ -0,0 +1,87 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\ConfigurableProduct\Model\Product\TypeTransitionManager\Plugin;
+
+class ConfigurableTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $requestMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $invocationChainMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $productMock;
+
+    /**
+     * @var \Magento\ConfigurableProduct\Model\Product\TypeTransitionManager\Plugin\Configurable
+     */
+    protected $model;
+
+    protected function setUp()
+    {
+        $this->requestMock = $this->getMock(
+            'Magento\App\Request\Http',
+            array(),
+            array(),
+            '',
+            false
+        );
+        $this->model = new Configurable($this->requestMock);
+        $this->productMock = $this->getMock(
+            'Magento\Catalog\Model\Product',
+            array('setTypeId', '__wakeup'),
+            array(),
+            '',
+            false
+        );
+        $this->invocationChainMock = $this->getMock('Magento\Code\Plugin\InvocationChain', array(), array(), '', false);
+    }
+
+    public function testAroundProcessProductWithProductThatCanBeTransformedToConfigurable()
+    {
+        $this->requestMock->expects($this->any())->method('getParam')->with('attributes')
+            ->will($this->returnValue('not_empty_attribute_data'));
+        $this->productMock->expects($this->once())->method('setTypeId')
+            ->with(\Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE);
+        $this->invocationChainMock->expects($this->never())->method('proceed');
+        $this->model->aroundProcessProduct(array($this->productMock), $this->invocationChainMock);
+    }
+
+    public function testAroundProcessProductWithProductThatCannotBeTransformedToConfigurable()
+    {
+        $this->requestMock->expects($this->any())->method('getParam')->with('attributes')
+            ->will($this->returnValue(null));
+        $this->productMock->expects($this->never())->method('setTypeId');
+        $arguments = array($this->productMock);
+        $this->invocationChainMock->expects($this->once())->method('proceed')->with($arguments);
+        $this->model->aroundProcessProduct($arguments, $this->invocationChainMock);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Model/Product/Validator/PluginTest.php b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Model/Product/Validator/PluginTest.php
new file mode 100644
index 00000000000..1a64c449843
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Model/Product/Validator/PluginTest.php
@@ -0,0 +1,172 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\ConfigurableProduct\Model\Product\Validator;
+
+class PluginTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\ConfigurableProduct\Model\Product\Validator\Plugin
+     */
+    protected $plugin;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $eventManagerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $productFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $coreHelperMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $invocationChainMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $productMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $requestMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $responseMock;
+
+    /**
+     * @var array
+     */
+    protected $arguments;
+
+    /**
+     * @var array
+     */
+    protected $proceedResult = array(1, 2, 3);
+
+    protected function setUp()
+    {
+        $this->eventManagerMock = $this->getMock('Magento\Event\Manager', array(), array(), '', false);
+        $this->productFactoryMock
+            = $this->getMock('Magento\Catalog\Model\ProductFactory', array('create'), array(), '', false);
+        $this->coreHelperMock = $this->getMock('Magento\Core\Helper\Data', array(), array(), '', false);
+        $this->invocationChainMock = $this->getMock('Magento\Code\Plugin\InvocationChain', array(), array(), '', false);
+        $this->productMock = $this->getMock('Magento\Catalog\Model\Product', array(), array(), '', false);
+        $this->requestMock
+            = $this->getMock('Magento\App\Request\Http', array('getPost', 'getParam', '__wakeup'), array(), '', false);
+        $this->responseMock = $this->getMock(
+            'Magento\App\Response\Http',
+            array('setError', 'setMessage', 'setAttributes'),
+            array(), '', false);
+        $this->arguments = array(
+            $this->productMock,
+            $this->requestMock,
+            $this->responseMock
+        );
+        $this->invocationChainMock->expects($this->once())->method('proceed')->with($this->arguments)
+            ->will($this->returnValue($this->proceedResult));
+        $this->plugin = new \Magento\ConfigurableProduct\Model\Product\Validator\Plugin(
+            $this->eventManagerMock,
+            $this->productFactoryMock,
+            $this->coreHelperMock
+        );
+    }
+
+    public function testAroundValidateWithVariationsValid()
+    {
+        $matrix = array('products');
+
+        $plugin = $this->getMock(
+            'Magento\ConfigurableProduct\Model\Product\Validator\Plugin',
+            array('_validateProductVariations'),
+            array($this->eventManagerMock, $this->productFactoryMock, $this->coreHelperMock)
+        );
+
+        $plugin->expects($this->once())->method('_validateProductVariations')
+            ->with($this->productMock, $matrix, $this->requestMock)->will($this->returnValue(null));
+
+        $this->requestMock
+            ->expects($this->once())
+            ->method('getPost')
+            ->with('variations-matrix')
+            ->will($this->returnValue($matrix));
+
+        $this->responseMock->expects($this->never())->method('setError');
+
+        $this->assertEquals(
+            $this->proceedResult,
+            $plugin->aroundValidate($this->arguments, $this->invocationChainMock)
+        );
+    }
+
+    public function testAroundValidateWithVariationsInvalid()
+    {
+        $matrix = array('products');
+
+        $plugin = $this->getMock(
+            'Magento\ConfigurableProduct\Model\Product\Validator\Plugin',
+            array('_validateProductVariations'),
+            array($this->eventManagerMock, $this->productFactoryMock, $this->coreHelperMock)
+        );
+
+        $plugin->expects($this->once())->method('_validateProductVariations')
+            ->with($this->productMock, $matrix, $this->requestMock)->will($this->returnValue(true));
+
+        $this->requestMock
+            ->expects($this->once())
+            ->method('getPost')
+            ->with('variations-matrix')
+            ->will($this->returnValue($matrix));
+
+        $this->responseMock->expects($this->once())->method('setError')->with(true)->will($this->returnSelf());
+        $this->responseMock->expects($this->once())->method('setMessage')->will($this->returnSelf());
+        $this->responseMock->expects($this->once())->method('setAttributes')->will($this->returnSelf());
+        $this->assertEquals(
+            $this->proceedResult,
+            $plugin->aroundValidate($this->arguments, $this->invocationChainMock)
+        );
+    }
+
+    public function testAroundValidateIfVariationsNotExist()
+    {
+        $this->requestMock
+            ->expects($this->once())
+            ->method('getPost')
+            ->with('variations-matrix')
+            ->will($this->returnValue(null));
+        $this->eventManagerMock->expects($this->never())->method('dispatch');
+        $this->plugin->aroundValidate($this->arguments, $this->invocationChainMock);
+    }
+
+}
diff --git a/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Model/SuggestedAttributeListTest.php b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Model/SuggestedAttributeListTest.php
new file mode 100644
index 00000000000..d2e85f1a837
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Model/SuggestedAttributeListTest.php
@@ -0,0 +1,129 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ConfigurableProduct\Model;
+
+class SuggestedAttributeListTest extends \PHPUnit_Framework_TestCase
+{
+
+    /**
+     * @var \Magento\ConfigurableProduct\Model\SuggestedAttributeList
+     */
+    protected $suggestedListModel;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $attributeFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $resourceHelperMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $collectionMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $attributeMock;
+
+    /**
+     * @var string
+     */
+    protected $labelPart = 'labelPart';
+
+    protected function setUp()
+    {
+        $this->attributeFactoryMock =
+           $this->getMock(
+               'Magento\Catalog\Model\Resource\Product\Attribute\CollectionFactory', array('create'));
+        $this->resourceHelperMock =
+            $this->getMock('Magento\Catalog\Model\Resource\Helper', array(), array(), '', false);
+        $this->collectionMock =
+            $this->getMock('Magento\Catalog\Model\Resource\Product\Attribute\Collection', array(), array(), '', false);
+        $this->resourceHelperMock
+            ->expects($this->once())
+            ->method('addLikeEscape')
+            ->with($this->labelPart, array('position' => 'any'))
+            ->will($this->returnValue($this->labelPart));
+        $this->attributeFactoryMock
+            ->expects($this->once())->method('create')->will($this->returnValue($this->collectionMock));
+        $valueMap = array(
+            array('frontend_input', 'select', $this->collectionMock),
+            array('frontend_label', array('like' => $this->labelPart), $this->collectionMock),
+            array('is_configurable', array(array('eq' => 1), array('null' => true)), $this->collectionMock),
+            array('is_user_defined', 1, $this->collectionMock),
+            array('is_global', \Magento\Catalog\Model\Resource\Eav\Attribute::SCOPE_GLOBAL, $this->collectionMock),
+
+        );
+        $this->collectionMock
+            ->expects($this->any())
+            ->method('addFieldToFilter')
+            ->will($this->returnValueMap($valueMap));
+        $methods = array('getId', 'getFrontendLabel', 'getAttributeCode', 'getSource', '__wakeup', 'getApplyTo');
+        $this->attributeMock =
+            $this->getMock('Magento\Catalog\Model\Resource\Eav\Attribute', $methods, array(), '', false);
+        $this->collectionMock
+            ->expects($this->once())
+            ->method('getItems')
+            ->will($this->returnValue(array('id' => $this->attributeMock)));
+        $this->suggestedListModel = new \Magento\ConfigurableProduct\Model\SuggestedAttributeList(
+            $this->attributeFactoryMock,
+            $this->resourceHelperMock
+        );
+    }
+
+    public function testGetSuggestedAttributesIfTheyApplicable()
+    {
+        $source = $this->getMock('Magento\Eav\Model\Entity\Attribute\Source\AbstractSource',
+            array(), array(), '', false);
+        $result['id'] = array(
+            'id'      => 'id',
+            'label'   => 'label',
+            'code'    => 'code',
+            'options' => 'options'
+        );
+        $this->attributeMock->expects($this->any())->method('getApplyTo')->will($this->returnValue(false));
+        $this->attributeMock->expects($this->once())->method('getId')->will($this->returnValue('id'));
+        $this->attributeMock->expects($this->once())->method('getFrontendLabel')->will($this->returnValue('label'));
+        $this->attributeMock->expects($this->once())->method('getAttributeCode')->will($this->returnValue('code'));
+        $this->attributeMock->expects($this->once())->method('getSource')->will($this->returnValue($source));
+        $source->expects($this->once())->method('getAllOptions')->with(false)->will($this->returnValue('options'));
+        $this->assertEquals($result, $this->suggestedListModel->getSuggestedAttributes($this->labelPart));
+    }
+
+    public function testGetSuggestedAttributesIfTheyNotApplicable()
+    {
+        $this->attributeMock->expects($this->any())->method('getApplyTo')->will($this->returnValue(array('simple')));
+        $this->attributeMock->expects($this->never())->method('getId');
+        $this->attributeMock->expects($this->never())->method('getFrontendLabel');
+        $this->attributeMock->expects($this->never())->method('getAttributeCode');
+        $this->attributeMock->expects($this->never())->method('getSource');
+        $this->assertEquals(array(), $this->suggestedListModel->getSuggestedAttributes($this->labelPart));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/AbstractHandlerTest.php b/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/AbstractHandlerTest.php
deleted file mode 100644
index da60b722ac5..00000000000
--- a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/AbstractHandlerTest.php
+++ /dev/null
@@ -1,106 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Core
- * @subpackage  unit_tests
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-
-/**
- * Test class for \Magento\Core\Model\Layout\Argument\AbstractHandler
- */
-namespace Magento\Core\Model\Layout\Argument;
-
-class AbstractHandlerTest extends \PHPUnit_Framework_TestCase
-{
-    /** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Core\Model\Layout\Argument\AbstractHandler */
-    protected $_model;
-
-    protected function setUp()
-    {
-        $this->_model = $this->getMockForAbstractClass(
-            'Magento\Core\Model\Layout\Argument\AbstractHandler',
-            array(), '', true
-        );
-    }
-
-    /**
-     * @param \Magento\View\Layout\Element $argument
-     * @param array $expectedResult
-     * @dataProvider parseDataProvider
-     */
-    public function testParse($argument, $expectedResult)
-    {
-        $result = $this->_model->parse($argument);
-        if (isset($result['updaters'])) {
-            $result['updaters'] = array_values($result['updaters']);
-        }
-        $this->_assertArrayContainsArray($expectedResult, $result);
-    }
-
-    /**
-     * @return array
-     */
-    public function parseDataProvider()
-    {
-        $layout = simplexml_load_file(
-            __DIR__ . '/Handler/_files/arguments.xml',
-            'Magento\View\Layout\Element'
-        );
-        $withoutUpdater = $layout->xpath('//argument[@name="testParseWithoutUpdater"]');
-        $withUpdater = $layout->xpath('//argument[@name="testParseWithUpdater"]');
-        return array(
-            array(
-                reset($withoutUpdater),
-                array(
-                    'type' => 'string'
-                )
-            ),
-            array(
-                reset($withUpdater),
-                array(
-                    'type' => 'string',
-                    'updaters' => array('Magento_Test_Updater')
-                )
-            ),
-        );
-    }
-
-    /**
-     * Asserting that an array contains another array
-     *
-     * @param array $needle
-     * @param array $haystack
-     */
-    protected function _assertArrayContainsArray(array $needle, array $haystack)
-    {
-        foreach ($needle as $key => $val) {
-            $this->assertArrayHasKey($key, $haystack);
-
-            if (is_array($val)) {
-                $this->_assertArrayContainsArray($val, $haystack[$key]);
-            } else {
-                $this->assertEquals($val, $haystack[$key]);
-            }
-        }
-    }
-}
diff --git a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/ArrayTest.php b/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/ArrayTest.php
deleted file mode 100644
index fd597496146..00000000000
--- a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/ArrayTest.php
+++ /dev/null
@@ -1,186 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @subpackage  unit_tests
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-
-/**
- * Test class for \Magento\Core\Model\Layout\Argument\Handler\ArrayHandler
- */
-namespace Magento\Core\Model\Layout\Argument\Handler;
-
-class ArrayTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \Magento\Core\Model\Layout\Argument\Handler\ArrayHandler
-     */
-    protected $_model;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $_factoryMock;
-
-    protected function setUp()
-    {
-        $this->_factoryMock = $this->getMock('Magento\View\Layout\Argument\HandlerFactory', array(), array(),
-            '', false);
-        $this->_model = new \Magento\Core\Model\Layout\Argument\Handler\ArrayHandler($this->_factoryMock);
-    }
-
-    /**
-     * @param array $argument
-     * @param array $expected
-     * @dataProvider processDataProvider
-     */
-    public function testProcess($argument, $expected)
-    {
-        $getHandlerCallback = function ($type) use ($expected) {
-            $handlerModel = $this->getMock(
-                'Magento\View\Layout\Argument\HandlerInterface',
-                array(),
-                array(),
-                '',
-                false);
-            $handlerModel->expects($this->once())->method('process')
-                ->will($this->returnValue($expected[$type . 'Argument']));
-            return $handlerModel;
-        };
-
-        $this->_factoryMock->expects($this->any())
-            ->method('getArgumentHandlerByType')
-            ->will($this->returnCallback($getHandlerCallback));
-        $this->assertEquals($expected, $this->_model->process($argument));
-    }
-
-    /**
-     * @return array
-     */
-    public function processDataProvider()
-    {
-        return array(
-            array(
-                array(
-                    'type' => 'array',
-                    'value' => array(
-                        'arrayArgument' => array(
-                            'type' => 'array',
-                            'value' => array(
-                                'label' => array(
-                                    'type' => 'string',
-                                    'value' => array(
-                                        'string' => 'CSV',
-                                        'translate' => true
-                                    )
-                                )
-                            )
-                        ),
-                        'urlArgument' => array(
-                            'type' => 'url',
-                            'value' => array(
-                                'path' => '*/*/exportMsxml'
-                            )
-                        ),
-                        'stringArgument' => array(
-                            'type' => 'string',
-                            'value' => array(
-                                'value' => 'Excel XML',
-                            )
-                        )
-                    ),
-                ),
-                array(
-                    'arrayArgument' => array(
-                        'label' => 'CSV'
-                    ),
-                    'urlArgument' => '*/*/exportMsxml',
-                    'stringArgument' => 'Excel XML'
-                )
-            ),
-        );
-    }
-
-    /**
-     * @param \Magento\View\Layout\Element $node
-     * @param $expected array
-     * @dataProvider parseDataProvider
-     */
-    public function testParse($node, $expected)
-    {
-        $getHandlerCallback = function ($type) {
-            $handlerModel = $this->getMock(
-                'Magento\View\Layout\Argument\HandlerInterface',
-                array(),
-                array(),
-                '',
-                false);
-            $handlerModel->expects($this->once())->method('parse')
-                ->will($this->returnValue($type));
-            return $handlerModel;
-        };
-
-        $this->_factoryMock->expects($this->any())
-            ->method('getArgumentHandlerByType')
-            ->will($this->returnCallback($getHandlerCallback));
-
-        $result = $this->_model->parse(reset($node));
-        if (isset($result['updaters'])) {
-            $result['updaters'] = array_values($result['updaters']);
-        }
-        $this->assertEquals($expected, $result);
-    }
-
-    /**
-     * @return array
-     */
-    public function parseDataProvider()
-    {
-        $layout = simplexml_load_file(
-            __DIR__ . '/_files/arguments.xml',
-            'Magento\View\Layout\Element'
-        );
-
-        return array(
-            array(
-                $layout->xpath('//argument[@name="testSimpleArray"]'),
-                array(
-                    'type' => 'array',
-                    'value' => array(
-                        'csv' => 'array',
-                        'urlPath' => 'url',
-                        'label' => 'string',
-                    ),
-                )
-            ),
-            array(
-                $layout->xpath('//argument[@name="testArrayWithUpdater"]'),
-                array(
-                    'type' => 'array',
-                    'updaters' => array('Magento\Sales\Model\Order\Grid\Massaction\ItemsUpdater'),
-                    'value' => array(
-                        'add' => 'array',
-                    ),
-                )
-            ),
-        );
-    }
-}
diff --git a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/BooleanTest.php b/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/BooleanTest.php
deleted file mode 100644
index ec952c1b232..00000000000
--- a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/BooleanTest.php
+++ /dev/null
@@ -1,128 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Core
- * @subpackage  unit_tests
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-
-/**
- * Test class for \Magento\Core\Model\Layout\Argument\Handler\Boolean
- */
-namespace Magento\Core\Model\Layout\Argument\Handler;
-
-class BooleanTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \Magento\Core\Model\Layout\Argument\Handler\Boolean
-     */
-    protected $_model;
-
-    /**
-     * @var \Magento\ObjectManager
-     */
-    protected $_objectManagerMock;
-
-    protected function setUp()
-    {
-        $helperObjectManager = new \Magento\TestFramework\Helper\ObjectManager($this);
-        $this->_objectManagerMock = $this->getMock('Magento\ObjectManager');
-        $this->_model = $helperObjectManager->getObject(
-            'Magento\Core\Model\Layout\Argument\Handler\Boolean',
-            array('objectManager' => $this->_objectManagerMock)
-        );
-    }
-
-    /**
-     * @dataProvider parseDataProvider()
-     * @param \Magento\View\Layout\Element $argument
-     * @param array $expectedResult
-     */
-    public function testParse($argument, $expectedResult)
-    {
-        $result = $this->_model->parse($argument);
-        $this->assertEquals($result, $expectedResult);
-    }
-
-    /**
-     * @return array
-     */
-    public function parseDataProvider()
-    {
-        $layout = simplexml_load_file(
-            __DIR__ . '/_files/arguments.xml',
-            'Magento\View\Layout\Element'
-        );
-        $result = $this->processDataProvider();
-        $simpleArg = $layout->xpath('//argument[@name="testSimpleBoolean"]');
-        $complexArg = $layout->xpath('//argument[@name="testComplexBoolean"]');
-        return array(
-            array($simpleArg[0], $result[0][0] + array('type' => 'boolean')),
-            array($complexArg[0], $result[0][0] + array('type' => 'boolean')),
-        );
-    }
-
-    /**
-     * @dataProvider processDataProvider
-     * @param array $argument
-     * @param boolean $expectedResult
-     */
-    public function testProcess($argument, $expectedResult)
-    {
-        $this->assertEquals($this->_model->process($argument), $expectedResult);
-    }
-
-    /**
-     * @return array
-     */
-    public function processDataProvider()
-    {
-        return array(
-            array(array('value' => 'true'), true),
-            array(array('value' => 'false'), false),
-        );
-    }
-
-    /**
-     * @dataProvider processExceptionDataProvider
-     * @param array $argument
-     * @param string $message
-     */
-    public function testProcessException($argument, $message)
-    {
-        $this->setExpectedException(
-            'InvalidArgumentException', $message
-        );
-        $this->_model->process($argument);
-    }
-
-    /**
-     * @return array
-     */
-    public function processExceptionDataProvider()
-    {
-        return array(
-            array(array('value' => null), 'Value is required for argument'),
-            array(array('value' => 'wrong'), 'Value is not boolean argument'),
-        );
-    }
-}
diff --git a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/HelperTest.php b/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/HelperTest.php
deleted file mode 100644
index c16285e0234..00000000000
--- a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/HelperTest.php
+++ /dev/null
@@ -1,166 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Core
- * @subpackage  unit_tests
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-
-/**
- * Test class for \Magento\Core\Model\Layout\Argument\Handler\Helper
- */
-namespace Magento\Core\Model\Layout\Argument\Handler;
-
-class HelperTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \Magento\Core\Model\Layout\Argument\Handler\Helper
-     */
-    protected $_model;
-
-    /**
-     * @var \Magento\ObjectManager
-     */
-    protected $_objectManagerMock;
-
-    protected function setUp()
-    {
-        include_once(__DIR__ . '/TestHelper.php');
-
-        $helperObjectManager = new \Magento\TestFramework\Helper\ObjectManager($this);
-        $this->_objectManagerMock = $this->getMock('Magento\ObjectManager');
-        $this->_model = $helperObjectManager->getObject(
-            'Magento\Core\Model\Layout\Argument\Handler\Helper',
-            array('objectManager' => $this->_objectManagerMock)
-        );
-    }
-
-    /**
-     * @dataProvider parseDataProvider()
-     * @param \Magento\View\Layout\Element $argument
-     * @param array $expectedResult
-     */
-    public function testParse($argument, $expectedResult)
-    {
-        $result = $this->_model->parse($argument);
-        $this->assertEquals($result, $expectedResult);
-    }
-
-    /**
-     * @return array
-     */
-    public function parseDataProvider()
-    {
-        $layout = simplexml_load_file(
-            __DIR__ . '/_files/arguments.xml',
-            'Magento\View\Layout\Element'
-        );
-        $result = $this->processDataProvider();
-        $resultWithParams = $resultWithoutParams = $result[0][0];
-        $resultWithoutParams['value']['params'] = array();
-        $argWithParams = $layout->xpath('//argument[@name="testHelperWithParams"]');
-        $argWithoutParams = $layout->xpath('//argument[@name="testHelperWithoutParams"]');
-        return array(
-            array($argWithParams[0], $resultWithParams + array('type' => 'helper')),
-            array($argWithoutParams[0], $resultWithoutParams + array('type' => 'helper')),
-        );
-    }
-
-    /**
-     * @dataProvider processDataProvider
-     * @param array $argument
-     * @param boolean $expectedResult
-     */
-    public function testProcess($argument, $expectedResult)
-    {
-        $helperMock = $this->getMock(
-            'Magento\Core\Model\Layout\Argument\Handler\TestHelper', array(), array(), '', false, false
-        );
-        $helperMock->expects($this->once())
-            ->method('testMethod')
-            ->with('firstValue', 'secondValue')
-            ->will($this->returnValue($expectedResult));
-        $this->_objectManagerMock->expects($this->once())
-            ->method('get')
-            ->with('Magento\Core\Model\Layout\Argument\Handler\TestHelper')
-            ->will($this->returnValue($helperMock));
-
-        $this->assertEquals($this->_model->process($argument), $expectedResult);
-    }
-
-    /**
-     * @return array
-     */
-    public function processDataProvider()
-    {
-        return array(
-            array(
-                array(
-                    'value' => array(
-                        'helperClass' => 'Magento\Core\Model\Layout\Argument\Handler\TestHelper',
-                        'helperMethod' => 'testMethod',
-                        'params' => array(
-                            'firstValue',
-                            'secondValue',
-                        ),
-                    )
-                )
-                , true
-            ),
-        );
-    }
-
-    /**
-     * @dataProvider processExceptionDataProvider
-     * @param array $argument
-     * @param string $message
-     */
-    public function testProcessException($argument, $message)
-    {
-        $this->setExpectedException(
-            'InvalidArgumentException', $message
-        );
-        $this->_model->process($argument);
-    }
-
-    /**
-     * @return array
-     */
-    public function processExceptionDataProvider()
-    {
-        $argument = $this->processDataProvider();
-        $invalidHelper = $invalidMethod = $nonExisting = $emptyValue = $argument[0][0];
-        unset($invalidHelper['value']['helperClass']);
-        unset($invalidMethod['value']['helperMethod']);
-        $nonExisting['value']['helperClass'] = 'Dummy_Helper';
-        $nonExisting['value']['helperMethod'] = 'dummyMethod';
-        unset($emptyValue['value']);
-
-        return array(
-            array($invalidHelper, 'Passed helper has incorrect format'),
-            array($invalidMethod, 'Passed helper has incorrect format'),
-            array($nonExisting, 'Helper method "Dummy_Helper::dummyMethod" does not exist'),
-            array($nonExisting, 'Helper method "Dummy_Helper::dummyMethod" does not exist'),
-            array($emptyValue, 'Value is required for argument'),
-        );
-    }
-}
diff --git a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/NumberTest.php b/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/NumberTest.php
deleted file mode 100644
index 442009fec11..00000000000
--- a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/NumberTest.php
+++ /dev/null
@@ -1,128 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Core
- * @subpackage  unit_tests
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-
-/**
- * Test class for \Magento\Core\Model\Layout\Argument\Handler\Number
- */
-namespace Magento\Core\Model\Layout\Argument\Handler;
-
-class NumberTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \Magento\Core\Model\Layout\Argument\Handler\Boolean
-     */
-    protected $_model;
-
-    /**
-     * @var \Magento\ObjectManager
-     */
-    protected $_objectManagerMock;
-
-    protected function setUp()
-    {
-        $helperObjectManager = new \Magento\TestFramework\Helper\ObjectManager($this);
-        $this->_objectManagerMock = $this->getMock('Magento\ObjectManager');
-        $this->_model = $helperObjectManager->getObject(
-            'Magento\Core\Model\Layout\Argument\Handler\Number',
-            array('objectManager' => $this->_objectManagerMock)
-        );
-    }
-
-    /**
-     * @dataProvider parseDataProvider()
-     * @param \Magento\View\Layout\Element $argument
-     * @param array $expectedResult
-     */
-    public function testParse($argument, $expectedResult)
-    {
-        $result = $this->_model->parse($argument);
-        $this->assertEquals($result, $expectedResult);
-    }
-
-    /**
-     * @return array
-     */
-    public function parseDataProvider()
-    {
-        $layout = simplexml_load_file(
-            __DIR__ . '/_files/arguments.xml',
-            'Magento\View\Layout\Element'
-        );
-        $result = $this->processDataProvider();
-        $simpleArg = $layout->xpath('//argument[@name="testSimpleNumber"]');
-        $complexArg = $layout->xpath('//argument[@name="testComplexNumber"]');
-        return array(
-            array($simpleArg[0], $result[0][0] + array('type' => 'number')),
-            array($complexArg[0], $result[1][0] + array('type' => 'number')),
-        );
-    }
-
-    /**
-     * @dataProvider processDataProvider
-     * @param array $argument
-     * @param boolean $expectedResult
-     */
-    public function testProcess($argument, $expectedResult)
-    {
-        $this->assertEquals($this->_model->process($argument), $expectedResult);
-    }
-
-    /**
-     * @return array
-     */
-    public function processDataProvider()
-    {
-        return array(
-            array(array('value' => '1.5'), '1.5'),
-            array(array('value' => '25'), '25'),
-        );
-    }
-
-    /**
-     * @dataProvider processExceptionDataProvider
-     * @param array $argument
-     * @param string $message
-     */
-    public function testProcessException($argument, $message)
-    {
-        $this->setExpectedException(
-            'InvalidArgumentException', $message
-        );
-        $this->_model->process($argument);
-    }
-
-    /**
-     * @return array
-     */
-    public function processExceptionDataProvider()
-    {
-        return array(
-            array(array('value' => null), 'Value is required for argument'),
-            array(array('value' => 'true'), 'Value is not number argument'),
-        );
-    }
-}
diff --git a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/ObjectTest.php b/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/ObjectTest.php
deleted file mode 100644
index 8ff2e47837d..00000000000
--- a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/ObjectTest.php
+++ /dev/null
@@ -1,162 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Core
- * @subpackage  unit_tests
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-
-/**
- * Test class for \Magento\Core\Model\Layout\Argument\Handler\Object
- */
-namespace Magento\Core\Model\Layout\Argument\Handler;
-
-class ObjectTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \Magento\Core\Model\Layout\Argument\Handler\Object
-     */
-    protected $_model;
-
-    /**
-     * @var \Magento\ObjectManager
-     */
-    protected $_objectManagerMock;
-
-    protected function setUp()
-    {
-        include_once(__DIR__ . '/TestObject.php');
-
-        $helperObjectManager = new \Magento\TestFramework\Helper\ObjectManager($this);
-        $this->_objectManagerMock = $this->getMock('Magento\ObjectManager');
-        $this->_model = $helperObjectManager->getObject(
-            'Magento\Core\Model\Layout\Argument\Handler\Object',
-            array('objectManager' => $this->_objectManagerMock)
-        );
-    }
-
-    /**
-     * @dataProvider parseDataProvider()
-     * @param \Magento\View\Layout\Element $argument
-     * @param array $expectedResult
-     */
-    public function testParse($argument, $expectedResult)
-    {
-        $result = $this->_model->parse($argument);
-        if (isset($result['updaters'])) {
-            $result['updaters'] = array_values($result['updaters']);
-        }
-        $this->assertEquals($result, $expectedResult);
-    }
-
-    /**
-     * @return array
-     */
-    public function parseDataProvider()
-    {
-        $layout = simplexml_load_file(
-            __DIR__ . '/_files/arguments.xml',
-            'Magento\View\Layout\Element'
-        );
-        $simpleObject = $layout->xpath('//argument[@name="testSimpleObject"]');
-        $complexObject = $layout->xpath('//argument[@name="testComplexObject"]');
-        return array(
-            array(
-                reset($simpleObject), array(
-                    'value' => array(
-                        'object' => 'Magento\Core\Model\Layout\Argument\Handler\TestObject',
-                    ),
-                    'type' => 'object',
-                )
-            ),
-            array(
-                reset($complexObject), array(
-                    'value' => array(
-                        'object' => 'Magento\Core\Model\Layout\Argument\Handler\TestObject',
-                    ),
-                    'type' => 'object',
-                    'updaters' => array('Magento_Test_Updater')
-                )
-            ),
-        );
-    }
-
-    /**
-     * @dataProvider processDataProvider
-     * @param array $argument
-     */
-    public function testProcess($argument)
-    {
-        $objectMock = $this->getMock(
-            'Magento\Core\Model\Layout\Argument\Handler\TestObject', array(), array(), '', false, false
-        );
-        $this->_objectManagerMock->expects($this->once())
-            ->method('create')
-            ->with('Magento\Core\Model\Layout\Argument\Handler\TestObject')
-            ->will($this->returnValue($objectMock));
-
-        $this->assertSame($this->_model->process($argument), $objectMock);
-    }
-
-    /**
-     * @return array
-     */
-    public function processDataProvider()
-    {
-        return array(
-            array(
-                array(
-                    'value' => array(
-                        'object' => 'Magento\Core\Model\Layout\Argument\Handler\TestObject',
-                    ),
-                    'type' => 'object',
-                )
-            ),
-        );
-    }
-
-    /**
-     * @dataProvider processExceptionDataProvider
-     * @param array $argument
-     * @param string $message
-     */
-    public function testProcessException($argument, $message)
-    {
-        $this->setExpectedException(
-            'InvalidArgumentException', $message
-        );
-        $this->_model->process($argument);
-    }
-
-    /**
-     * @return array
-     */
-    public function processExceptionDataProvider()
-    {
-
-        return array(
-            array(array('value' => null), 'Value is required for argument'),
-            array(array('value' => array()), 'Passed value has incorrect format'),
-            array(array('value' => array('object' => 'Test_Model')), 'Incorrect data source model'),
-        );
-    }
-}
diff --git a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/OptionsTest.php b/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/OptionsTest.php
deleted file mode 100644
index 6ff53db6abc..00000000000
--- a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/OptionsTest.php
+++ /dev/null
@@ -1,159 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Core
- * @subpackage  unit_tests
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-
-/**
- * Test class for \Magento\Core\Model\Layout\Argument\Handler\Options
- */
-namespace Magento\Core\Model\Layout\Argument\Handler;
-
-class OptionsTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \Magento\Core\Model\Layout\Argument\Handler\Options
-     */
-    protected $_model;
-
-    /**
-     * @var \Magento\ObjectManager
-     */
-    protected $_objectManagerMock;
-
-    protected function setUp()
-    {
-        include_once(__DIR__ . '/TestOptions.php');
-
-        $helperObjectManager = new \Magento\TestFramework\Helper\ObjectManager($this);
-        $this->_objectManagerMock = $this->getMock('Magento\ObjectManager');
-        $this->_model = $helperObjectManager->getObject(
-            'Magento\Core\Model\Layout\Argument\Handler\Options',
-            array('objectManager' => $this->_objectManagerMock)
-        );
-    }
-
-    /**
-     * @dataProvider parseDataProvider()
-     * @param \Magento\View\Layout\Element $argument
-     * @param array $expectedResult
-     */
-    public function testParse($argument, $expectedResult)
-    {
-        $result = $this->_model->parse($argument);
-        $this->assertEquals($result, $expectedResult);
-    }
-
-    /**
-     * @return array
-     */
-    public function parseDataProvider()
-    {
-        $layout = simplexml_load_file(
-            __DIR__ . '/_files/arguments.xml',
-            'Magento\View\Layout\Element'
-        );
-        $optionsArguments = $layout->xpath('//argument[@name="testOptions"]');
-        return array(
-            array(
-                reset($optionsArguments),
-                array(
-                    'type' => 'options',
-                    'value' => array(
-                        'model' => 'Magento\Core\Model\Layout\Argument\Handler\TestOptions',
-                    )
-                )
-            ),
-        );
-    }
-
-    /**
-     * @dataProvider processDataProvider
-     * @param array $argument
-     * @param boolean $expectedResult
-     */
-    public function testProcess($argument, $expectedResult)
-    {
-        $optionsMock = $this->getMock(
-            'Magento\Core\Model\Layout\Argument\Handler\TestOptions', array(), array(), '', false, false
-        );
-        $optionsMock->expects($this->once())
-            ->method('toOptionArray')
-            ->will($this->returnValue(array('value' => 'label')));
-
-        $this->_objectManagerMock->expects($this->once())
-            ->method('create')
-            ->with('Magento\Core\Model\Layout\Argument\Handler\TestOptions')
-            ->will($this->returnValue($optionsMock));
-
-        $this->assertEquals($this->_model->process($argument), $expectedResult);
-    }
-
-    /**
-     * @return array
-     */
-    public function processDataProvider()
-    {
-        return array(
-            array(
-                array(
-                    'value' => array(
-                        'model' => 'Magento\Core\Model\Layout\Argument\Handler\TestOptions',
-                    )
-                ),
-                array(
-                    array(
-                        'value' => 'value',
-                        'label' => 'label',
-                    )
-                )
-            ),
-        );
-    }
-
-    /**
-     * @dataProvider processExceptionDataProvider
-     * @param array $argument
-     * @param string $message
-     */
-    public function testProcessException($argument, $message)
-    {
-        $this->setExpectedException(
-            'InvalidArgumentException', $message
-        );
-        $this->_model->process($argument);
-    }
-
-    /**
-     * @return array
-     */
-    public function processExceptionDataProvider()
-    {
-        return array(
-            array(array(), 'Value is required for argument'),
-            array(array('value' => array()), 'Passed value has incorrect format'),
-            array(array('value' => array('model' => 'Magento_Dummy_Model')), 'Incorrect options model'),
-        );
-    }
-}
diff --git a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/StringTest.php b/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/StringTest.php
deleted file mode 100644
index 0ec18fe25e8..00000000000
--- a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/StringTest.php
+++ /dev/null
@@ -1,136 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Core
- * @subpackage  unit_tests
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-
-/**
- * Test class for \Magento\Core\Model\Layout\Argument\Handler\String
- */
-namespace Magento\Core\Model\Layout\Argument\Handler;
-
-class StringTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \Magento\Core\Model\Layout\Argument\Handler\Boolean
-     */
-    protected $_model;
-
-    /**
-     * @var \Magento\ObjectManager
-     */
-    protected $_objectManagerMock;
-
-    protected function setUp()
-    {
-        $helperObjectManager = new \Magento\TestFramework\Helper\ObjectManager($this);
-        $this->_objectManagerMock = $this->getMock('Magento\ObjectManager');
-        $this->_model = $helperObjectManager->getObject(
-            'Magento\Core\Model\Layout\Argument\Handler\String',
-            array('objectManager' => $this->_objectManagerMock)
-        );
-    }
-
-    /**
-     * @dataProvider parseDataProvider
-     * @param \Magento\View\Layout\Element $argument
-     * @param array $expectedResult
-     */
-    public function testParse($argument, $expectedResult)
-    {
-        $result = $this->_model->parse($argument);
-        $this->assertEquals($result, $expectedResult);
-    }
-
-    /**
-     * @return array
-     */
-    public function parseDataProvider()
-    {
-        $layout = simplexml_load_file(
-            __DIR__ . '/_files/arguments.xml',
-            'Magento\View\Layout\Element'
-        );
-        $result = $this->processDataProvider();
-        $simpleString = $layout->xpath('//argument[@name="testSimpleString"]');
-        $translateString = $layout->xpath('//argument[@name="testTranslateString"]');
-        $complexString = $layout->xpath('//argument[@name="testComplexString"]');
-        return array(
-            array($simpleString[0], $result[0][0] + array('type' => 'string')),
-            array($translateString[0], $result[1][0] + array('type' => 'string')),
-            array($complexString[0], $result[2][0] + array('type' => 'string')),
-        );
-    }
-
-    /**
-     * @dataProvider processDataProvider
-     * @param array $argument
-     * @param boolean $expectedResult
-     */
-    public function testProcess($argument, $expectedResult)
-    {
-        $result = $this->_model->process($argument);
-        $this->assertEquals($result, $expectedResult);
-        if (!empty($argument['value']['translate'])) {
-            $this->assertContains($expectedResult, $result);
-        }
-    }
-
-    /**
-     * @return array
-     */
-    public function processDataProvider()
-    {
-        return array(
-            array(array('value' => array('string' => 'Simple Test')), 'Simple Test'),
-            array(array('value' => array('string' => 'Test Translate', 'translate' => true)), 'Test Translate'),
-            array(array('value' => array('string' => 'Complex Test')), 'Complex Test'),
-        );
-    }
-
-    /**
-     * @dataProvider processExceptionDataProvider
-     * @param array $argument
-     * @param string $message
-     */
-    public function testProcessException($argument, $message)
-    {
-        $this->setExpectedException(
-            'InvalidArgumentException', $message
-        );
-        $this->_model->process($argument);
-    }
-
-    /**
-     * @return array
-     */
-    public function processExceptionDataProvider()
-    {
-        return array(
-            array(array('value' => null), 'Value is required for argument'),
-            array(array('value' => array()), 'Passed value has incorrect format'),
-            array(array('value' => array('string' => false)), 'Value is not string argument'),
-        );
-    }
-}
diff --git a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/UrlTest.php b/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/UrlTest.php
deleted file mode 100644
index 6b51e227481..00000000000
--- a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/UrlTest.php
+++ /dev/null
@@ -1,145 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Core
- * @subpackage  unit_tests
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-
-/**
- * Test class for \Magento\Core\Model\Layout\Argument\Handler\Url
- */
-namespace Magento\Core\Model\Layout\Argument\Handler;
-
-class UrlTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \Magento\Core\Model\Layout\Argument\Handler\Helper
-     */
-    protected $_model;
-
-    /**
-     * @var \Magento\ObjectManager
-     */
-    protected $_objectManagerMock;
-
-    protected function setUp()
-    {
-        $helperObjectManager = new \Magento\TestFramework\Helper\ObjectManager($this);
-        $this->_urlModleMock = $this->getMock('Magento\Url', array(), array(), '', false);
-        $this->_model = $helperObjectManager->getObject(
-            'Magento\Core\Model\Layout\Argument\Handler\Url',
-            array('urlModel' => $this->_urlModleMock)
-        );
-    }
-
-    /**
-     * @dataProvider parseDataProvider()
-     * @param \Magento\View\Layout\Element $argument
-     * @param array $expectedResult
-     */
-    public function testParse($argument, $expectedResult)
-    {
-        $result = $this->_model->parse($argument);
-        $this->assertEquals($result, $expectedResult);
-    }
-
-    /**
-     * @return array
-     */
-    public function parseDataProvider()
-    {
-        $layout = simplexml_load_file(
-            __DIR__ . '/_files' . '/arguments.xml',
-            'Magento\View\Layout\Element'
-        );
-        $result = $this->processDataProvider();
-        $resultWithParams = $resultWithoutParams = $result[0][0];
-        $resultWithoutParams['value']['params'] = array();
-        $argWithParams = $layout->xpath('//argument[@name="testUrlWithParams"]');
-        $argWithoutParams = $layout->xpath('//argument[@name="testUrlWithoutParams"]');
-        return array(
-            array($argWithParams[0], $resultWithParams + array('type' => 'url')),
-            array($argWithoutParams[0], $resultWithoutParams + array('type' => 'url')),
-        );
-    }
-
-    /**
-     * @dataProvider processDataProvider
-     * @param array $argument
-     * @param boolean $expectedResult
-     */
-    public function testProcess($argument, $expectedResult)
-    {
-        $this->_urlModleMock->expects($this->once())
-            ->method('getUrl')
-            ->with($argument['value']['path'], $argument['value']['params'])
-            ->will($this->returnValue($expectedResult));
-
-        $this->assertEquals($this->_model->process($argument), $expectedResult);
-    }
-
-    /**
-     * @return array
-     */
-    public function processDataProvider()
-    {
-        return array(
-            array(
-                array(
-                    'value' => array(
-                        'path' => 'module/controller/action',
-                        'params' => array(
-                            'firstParam' => 'firstValue',
-                            'secondParam' => 'secondValue',
-                        ),
-                    )
-                )
-                , 'test/url'
-            ),
-        );
-    }
-
-    /**
-     * @dataProvider processExceptionDataProvider
-     * @param array $argument
-     * @param string $message
-     */
-    public function testProcessException($argument, $message)
-    {
-        $this->setExpectedException(
-            'InvalidArgumentException', $message
-        );
-        $this->_model->process($argument);
-    }
-
-    /**
-     * @return array
-     */
-    public function processExceptionDataProvider()
-    {
-        return array(
-            array(array(), 'Value is required for argument'),
-            array(array('value' => array()), 'Passed value has incorrect format'),
-        );
-    }
-}
diff --git a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/ProcessorTest.php b/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/ProcessorTest.php
deleted file mode 100644
index e40014e0e65..00000000000
--- a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/ProcessorTest.php
+++ /dev/null
@@ -1,152 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Core
- * @subpackage  unit_tests
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-
-/**
- * Test class for \Magento\Core\Model\Layout\Argument\Processor
- */
-namespace Magento\Core\Model\Layout\Argument;
-
-class ProcessorTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \Magento\Core\Model\Layout\Argument\Processor
-     */
-    protected $_model;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $_argumentUpdaterMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $_handlerFactory;
-
-    protected function setUp()
-    {
-        $this->_argumentUpdaterMock = $this->getMock(
-            'Magento\Core\Model\Layout\Argument\Updater',
-            array(),
-            array(),
-            '',
-            false
-        );
-        $this->_handlerFactory = $this->getMock(
-            'Magento\View\Layout\Argument\HandlerFactory',
-            array(),
-            array(),
-            '',
-            false
-        );
-
-        $this->_model = new \Magento\Core\Model\Layout\Argument\Processor($this->_argumentUpdaterMock,
-            $this->_handlerFactory
-        );
-    }
-
-    /**
-     * @param array $argument
-     * @param boolean $isUpdater
-     * @param mixed $result
-     * @dataProvider processArgumentsDataProvider
-     */
-    public function testProcess(array $argument, $isUpdater, $result)
-    {
-        $argumentHandlerMock = $this->getMock(
-            'Magento\View\Layout\Argument\HandlerInterface', array(), array(), '', false
-        );
-        $argumentHandlerMock->expects($this->once())
-            ->method('process')
-            ->with($this->equalTo($argument))
-            ->will($this->returnValue($argument['value']));
-
-        $this->_handlerFactory->expects($this->once())->method('getArgumentHandlerByType')
-            ->with($this->equalTo('string'))
-            ->will($this->returnValue($argumentHandlerMock));
-
-        if ($isUpdater) {
-            $this->_argumentUpdaterMock->expects($this->once())
-                ->method('applyUpdaters')
-                ->with(
-                    $this->equalTo($argument['value']),
-                    $this->equalTo($argument['updaters'])
-                )
-                ->will($this->returnValue($argument['value'] . '_Updated'));
-        } else {
-            $this->_argumentUpdaterMock->expects($this->never())->method('applyUpdaters');
-        }
-
-        $processed = $this->_model->process($argument);
-        $this->assertEquals($processed, $result);
-    }
-
-    public function processArgumentsDataProvider()
-    {
-        return array(
-            array(
-                array(
-                    'type' => 'string',
-                    'value' => 'Test Value'
-                ),
-                false,
-                'Test Value'
-            ),
-            array(
-                array(
-                    'type' => 'string',
-                    'updaters' => array('Dummy_Updater_Class'),
-                    'value' => 'Dummy_Argument_Value_Class_Name'
-                ),
-                true,
-                'Dummy_Argument_Value_Class_Name_Updated'
-            )
-        );
-    }
-
-    public function testParse()
-    {
-        // Because descendants of \SimpleXMLElement couldn't be mocked
-        $argument = new \Magento\View\Layout\Element('<argument xsi:type="string" name="argumentName" '
-            . 'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Value</argument>'
-        );
-
-        $argumentHandlerMock = $this->getMock(
-            'Magento\View\Layout\Argument\HandlerInterface', array(), array(), '', false
-        );
-        $argumentHandlerMock->expects($this->once())
-            ->method('parse')
-            ->with($this->equalTo($argument))
-            ->will($this->returnValue(true));
-
-        $this->_handlerFactory->expects($this->once())->method('getArgumentHandlerByType')
-            ->with($this->equalTo('string'))
-            ->will($this->returnValue($argumentHandlerMock));
-
-        $this->_model->parse($argument);
-    }
-}
diff --git a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/UpdaterTest.php b/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/UpdaterTest.php
deleted file mode 100644
index d6f875f6df5..00000000000
--- a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/UpdaterTest.php
+++ /dev/null
@@ -1,98 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Core
- * @subpackage  unit_tests
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-
-/**
- * Test class for \Magento\Core\Model\Layout\Argument\Updater
- */
-namespace Magento\Core\Model\Layout\Argument;
-
-class UpdaterTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \Magento\Core\Model\Layout\Argument\Updater
-     */
-    protected $_model;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $_objectManagerMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $_argUpdaterMock;
-
-    protected function setUp()
-    {
-        $this->_objectManagerMock = $this->getMock('Magento\ObjectManager');
-        $this->_argUpdaterMock = $this->getMock('Magento\Core\Model\Layout\Argument\UpdaterInterface', array(), array(),
-            '', false
-        );
-
-        $this->_model = new \Magento\Core\Model\Layout\Argument\Updater($this->_objectManagerMock);
-    }
-
-    protected function tearDown()
-    {
-        unset($this->_model);
-        unset($this->_argUpdaterMock);
-        unset($this->_objectManagerMock);
-    }
-
-    public function testApplyUpdatersWithValidUpdaters()
-    {
-        $value = 1;
-
-        $this->_objectManagerMock->expects($this->exactly(2))
-            ->method('create')
-            ->with($this->logicalOr('Dummy_Updater_1', 'Dummy_Updater_2'))
-            ->will($this->returnValue($this->_argUpdaterMock));
-
-        $this->_argUpdaterMock->expects($this->exactly(2))
-            ->method('update')
-            ->with($value)
-            ->will($this->returnValue($value));
-
-        $updaters = array('Dummy_Updater_1', 'Dummy_Updater_2');
-        $this->assertEquals($value, $this->_model->applyUpdaters($value, $updaters));
-    }
-
-    /**
-     * @expectedException \InvalidArgumentException
-     */
-    public function testApplyUpdatersWithInvalidUpdaters()
-    {
-        $this->_objectManagerMock->expects($this->once())
-            ->method('create')
-            ->with('Dummy_Updater_1')
-            ->will($this->returnValue(new \StdClass()));
-        $updaters = array('Dummy_Updater_1', 'Dummy_Updater_2');
-
-        $this->_model->applyUpdaters(1, $updaters);
-    }
-}
diff --git a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/FactoryTest.php b/dev/tests/unit/testsuite/Magento/Core/Model/Layout/FactoryTest.php
deleted file mode 100644
index 29333548c7c..00000000000
--- a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/FactoryTest.php
+++ /dev/null
@@ -1,87 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Core
- * @subpackage  unit_tests
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-
-/**
- * Test class for \Magento\Core\Model\Layout\Factory
- */
-namespace Magento\Core\Model\Layout;
-
-class FactoryTest extends \PHPUnit_Framework_TestCase
-{
-    /*
-     * Test class name
-     */
-    const CLASS_NAME  = 'Magento\Core\Model\Layout';
-
-    /**
-     * Test arguments
-     *
-     * @var array
-     */
-    protected $_arguments = array();
-
-    /**
-     * ObjectManager mock for tests
-     *
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $_objectManager;
-
-    /**
-     * Test class instance
-     *
-     * @var \Magento\Core\Model\Layout\Factory
-     */
-    protected $_model;
-
-    protected function setUp()
-    {
-        $this->_objectManager = $this->getMock('Magento\ObjectManager');
-        $this->_model = new \Magento\Core\Model\Layout\Factory($this->_objectManager);
-    }
-
-    public function testConstruct()
-    {
-        $this->assertAttributeInstanceOf('Magento\ObjectManager', '_objectManager', $this->_model);
-    }
-
-    public function testCreateLayoutNew()
-    {
-        $modelLayout = $this->getMock(self::CLASS_NAME, array(), array(), '', false);
-
-        $this->_objectManager->expects($this->once())
-            ->method('configure')
-            ->with(array(self::CLASS_NAME => array('parameters' => array('someParam' => 'someVal'))));
-
-        $this->_objectManager->expects($this->once())
-            ->method('get')
-            ->with(\Magento\Core\Model\Layout\Factory::CLASS_NAME)
-            ->will($this->returnValue($modelLayout));
-
-        $this->assertEquals($modelLayout, $this->_model->createLayout(array('someParam' => 'someVal')));
-    }
-}
diff --git a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/XsdTest.php b/dev/tests/unit/testsuite/Magento/Core/Model/Layout/XsdTest.php
new file mode 100644
index 00000000000..a82ea64e535
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Core/Model/Layout/XsdTest.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Core\Model\Layout;
+
+class XsdTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * Path to xsd schema file
+     * @var string
+     */
+    protected $_xsdSchema;
+
+    /**
+     * @var \Magento\TestFramework\Utility\XsdValidator
+     */
+    protected $_xsdValidator;
+
+    protected function setUp()
+    {
+        $this->_xsdSchema = BP . '/app/code/Magento/Core/etc/layout_single.xsd';
+        $this->_xsdValidator = new \Magento\TestFramework\Utility\XsdValidator();
+    }
+
+    /**
+     * @param string $xmlString
+     * @param array $expectedError
+     * @dataProvider schemaCorrectlyIdentifiesInvalidXmlDataProvider
+     */
+    public function testSchemaCorrectlyIdentifiesInvalidXml($xmlString, $expectedError)
+    {
+        $actualError = $this->_xsdValidator->validate($this->_xsdSchema, $xmlString);
+        $this->assertEquals($expectedError, $actualError);
+    }
+
+    /**
+     * Get array of invalid xml strings
+     *
+     * @return array
+     */
+    public function schemaCorrectlyIdentifiesInvalidXmlDataProvider()
+    {
+        return include(__DIR__ . '/_files/invalidLayoutArgumentsXmlArray.php');
+    }
+
+    public function testSchemaCorrectlyIdentifiesValidXml()
+    {
+        $xmlString = file_get_contents(__DIR__ . '/_files/arguments.xml');
+        $actualResult = $this->_xsdValidator->validate($this->_xsdSchema, $xmlString);
+
+        $this->assertEmpty($actualResult, join("\n", $actualResult));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/_files/arguments.xml b/dev/tests/unit/testsuite/Magento/Core/Model/Layout/_files/arguments.xml
similarity index 82%
rename from dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/_files/arguments.xml
rename to dev/tests/unit/testsuite/Magento/Core/Model/Layout/_files/arguments.xml
index e1fd69091ba..156ecaf8c2f 100644
--- a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/_files/arguments.xml
+++ b/dev/tests/unit/testsuite/Magento/Core/Model/Layout/_files/arguments.xml
@@ -24,29 +24,23 @@
  */
 -->
 <layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-    <block class="Magento_Test_Block" name="test.block">
+    <block class="Magento\Test\Block" name="test.block">
         <arguments>
             <argument name="testHelperWithParams" xsi:type="helper" helper="Magento\Core\Model\Layout\Argument\Handler\TestHelper::testMethod">
-                <param>firstValue</param>
-                <param>secondValue</param>
+                <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="testSimpleBoolean" xsi:type="boolean">true</argument>
-            <argument name="testComplexBoolean" xsi:type="boolean"><value>true</value></argument>
             <argument name="testSimpleNumber" xsi:type="number">1.5</argument>
-            <argument name="testComplexNumber" xsi:type="number"><value>25</value></argument>
             <argument name="testSimpleString" xsi:type="string">Simple Test</argument>
             <argument name="testTranslateString" xsi:type="string" translate="true">Test Translate</argument>
-            <argument name="testComplexString" xsi:type="string"><value>Complex Test</value></argument>
             <argument name="testUrlWithParams" xsi:type="url" path="module/controller/action">
                 <param name="firstParam">firstValue</param>
                 <param name="secondParam">secondValue</param>
             </argument>
             <argument name="testUrlWithoutParams" xsi:type="url" path="module/controller/action"/>
-            <argument name="testParseWithUpdater" xsi:type="string">
-                <value>Some Value</value>
-                <updater>Magento_Test_Updater</updater>
-            </argument>
+            <argument name="testParseWithUpdater" xsi:type="string"><updater>Magento_Test_Updater</updater>Some Value</argument>
             <argument name="testParseWithoutUpdater" xsi:type="string">Some Value</argument>
             <argument name="testSimpleArray" xsi:type="array">
                 <item name="csv" xsi:type="array">
@@ -66,10 +60,10 @@
             <argument name="testSimpleObject" xsi:type="object">
                 Magento\Core\Model\Layout\Argument\Handler\TestObject
             </argument>
-            <argument name="testComplexObject" xsi:type="object">
-                <value>Magento\Core\Model\Layout\Argument\Handler\TestObject</value>
-                <updater>Magento_Test_Updater</updater>
-            </argument>
+            <argument name="testComplexObject" xsi:type="object"><updater>Magento_Test_Updater</updater>Magento\Core\Model\Layout\Argument\Handler\TestObject</argument>
         </arguments>
+        <action method="testAction">
+            <argument name="string" xsi:type="string">string</argument>
+        </action>
     </block>
 </layout>
diff --git a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/_files/invalidLayoutArgumentsXmlArray.php b/dev/tests/unit/testsuite/Magento/Core/Model/Layout/_files/invalidLayoutArgumentsXmlArray.php
new file mode 100644
index 00000000000..f5831deb701
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Core/Model/Layout/_files/invalidLayoutArgumentsXmlArray.php
@@ -0,0 +1,133 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+return array(
+    'options without model attribute' => array(
+        '<?xml version="1.0"?><layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+            <block class="Magento\Test\Block" name="test.block">
+                <arguments>
+                    <argument name="argumentName" xsi:type="options" />
+                </arguments>
+            </block>
+        </layout>',
+        array("Element 'argument': The attribute 'model' is required but missing.")),
+    'url without path attribute' => array(
+        '<?xml version="1.0"?><layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+            <block class="Magento\Test\Block" name="test.block">
+                <arguments>
+                    <argument name="argumentName" xsi:type="url" />
+                </arguments>
+            </block>
+        </layout>',
+        array("Element 'argument': The attribute 'path' is required but missing.")),
+    'url without param name' => array(
+        '<?xml version="1.0"?><layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+            <block class="Magento\Test\Block" name="test.block">
+                <arguments>
+                    <argument name="argumentName" xsi:type="url" path="module/controller/action">
+                        <param />
+                    </argument>
+                </arguments>
+            </block>
+        </layout>',
+        array("Element 'param': The attribute 'name' is required but missing.")),
+    'url with forbidden param attribute' => array(
+        '<?xml version="1.0"?><layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+            <block class="Magento\Test\Block" name="test.block">
+                <arguments>
+                    <argument name="argumentName" xsi:type="url" path="module/controller/action">
+                        <param name="paramName" forbidden="forbidden"/>
+                    </argument>
+                </arguments>
+            </block>
+        </layout>',
+        array("Element 'param', attribute 'forbidden': The attribute 'forbidden' is not allowed.")),
+    'url with forbidden param sub-element' => array(
+        '<?xml version="1.0"?><layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+            <block class="Magento\Test\Block" name="test.block">
+                <arguments>
+                    <argument name="argumentName" xsi:type="url" path="module/controller/action">
+                        <param name="paramName"><forbidden /></param>
+                    </argument>
+                </arguments>
+            </block>
+        </layout>',
+        array("Element 'forbidden': This element is not expected.")),
+    'helper without helper attribute' => array(
+        '<?xml version="1.0"?><layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+            <block class="Magento\Test\Block" name="test.block">
+                <arguments>
+                    <argument name="argumentName" xsi:type="helper" />
+                </arguments>
+            </block>
+        </layout>',
+        array("Element 'argument': The attribute 'helper' is required but missing.")),
+    'helper without param name' => array(
+        '<?xml version="1.0"?><layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+            <block class="Magento\Test\Block" name="test.block">
+                <arguments>
+                    <argument name="argumentName" xsi:type="helper"
+                        helper="Magento\Core\Model\Layout\Argument\Handler\TestHelper::testMethod">
+                        <param />
+                    </argument>
+                </arguments>
+            </block>
+        </layout>',
+        array("Element 'param': The attribute 'name' is required but missing.")),
+    'helper with forbidden param attribute' => array(
+        '<?xml version="1.0"?><layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+            <block class="Magento\Test\Block" name="test.block">
+                <arguments>
+                    <argument name="argumentName" xsi:type="helper"
+                        helper="Magento\Core\Model\Layout\Argument\Handler\TestHelper::testMethod">
+                        <param name="paramName" forbidden="forbidden"/>
+                    </argument>
+                </arguments>
+            </block>
+        </layout>',
+        array("Element 'param', attribute 'forbidden': The attribute 'forbidden' is not allowed.")),
+    'helper with forbidden param sub-element' => array(
+        '<?xml version="1.0"?><layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+            <block class="Magento\Test\Block" name="test.block">
+                <arguments>
+                    <argument name="argumentName" xsi:type="helper"
+                        helper="Magento\Core\Model\Layout\Argument\Handler\TestHelper::testMethod">
+                        <param name="paramName"><forbidden /></param>
+                    </argument>
+                </arguments>
+            </block>
+        </layout>',
+        array("Element 'forbidden': This element is not expected.")),
+    'action with doubled arguments' => array(
+            '<?xml version="1.0"?><layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+                <block class="Magento\Test\Block" name="test.block">
+                    <action method="testAction">
+                        <argument name="string" xsi:type="string">string1</argument>
+                        <argument name="string" xsi:type="string">string2</argument>
+                    </action>
+                </block>
+            </layout>',
+        array(
+            "Element 'argument': Duplicate key-sequence ['string'] in key identity-constraint 'actionArgumentName'."
+        )),
+);
diff --git a/dev/tests/unit/testsuite/Magento/Customer/Block/Account/Dashboard/InfoTest.php b/dev/tests/unit/testsuite/Magento/Customer/Block/Account/Dashboard/InfoTest.php
index cdb833d7a17..8115a7d0ffb 100644
--- a/dev/tests/unit/testsuite/Magento/Customer/Block/Account/Dashboard/InfoTest.php
+++ b/dev/tests/unit/testsuite/Magento/Customer/Block/Account/Dashboard/InfoTest.php
@@ -191,6 +191,29 @@ class InfoTest extends \PHPUnit_Framework_TestCase
         );
     }
 
+    public function testGetNameWithNoSuchEntityException()
+    {
+        /**
+         * Called three times, once for each attribute (i.e. prefix, middlename, and suffix)
+         */
+        $this->_metadataService
+            ->expects($this->any())
+            ->method('getCustomerAttributeMetadata')
+            ->will($this->throwException(new NoSuchEntityException('field', 'value')));
+
+        /**
+         * The AttributeMetadata::{getPrefix() | getMiddlename() | getSuffix()} methods are called twice,
+         * while getFirstname() and getLastname() are only called once. Hence the use of any() vs. once().
+         */
+        $this->_customer->expects($this->any())->method('getPrefix')->will($this->returnValue('prefix'));
+        $this->_customer->expects($this->once())->method('getFirstname')->will($this->returnValue('firstname'));
+        $this->_customer->expects($this->any())->method('getMiddlename')->will($this->returnValue('middlename'));
+        $this->_customer->expects($this->once())->method('getLastname')->will($this->returnValue('lastname'));
+        $this->_customer->expects($this->any())->method('getSuffix')->will($this->returnValue('suffix'));
+
+        $this->assertEquals('firstname lastname', $this->_block->getName());
+    }
+
     public function testGetChangePasswordUrl()
     {
         $this->assertEquals(self::CHANGE_PASSWORD_URL, $this->_block->getChangePasswordUrl());
diff --git a/dev/tests/unit/testsuite/Magento/Customer/Block/Widget/DobTest.php b/dev/tests/unit/testsuite/Magento/Customer/Block/Widget/DobTest.php
index 55188e186f1..85d3f345e03 100644
--- a/dev/tests/unit/testsuite/Magento/Customer/Block/Widget/DobTest.php
+++ b/dev/tests/unit/testsuite/Magento/Customer/Block/Widget/DobTest.php
@@ -24,6 +24,7 @@
 namespace Magento\Customer\Block\Widget;
 
 use Magento\Core\Model\LocaleInterface;
+use Magento\Exception\NoSuchEntityException;
 
 class DobTest extends \PHPUnit_Framework_TestCase
 {
@@ -50,6 +51,9 @@ class DobTest extends \PHPUnit_Framework_TestCase
     /** @var Dob */
     private $_block;
 
+    /** @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Service\V1\CustomerMetadataServiceInterface */
+    private $_metadataService;
+
     public function setUp()
     {
         $zendCacheCore = new \Zend_Cache_Core();
@@ -69,11 +73,11 @@ class DobTest extends \PHPUnit_Framework_TestCase
         $context->expects($this->any())->method('getLocale')->will($this->returnValue($locale));
 
         $this->_attribute = $this->getMock('Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata', [], [], '', false);
-        $attributeMetadata =
+        $this->_metadataService =
             $this->getMockForAbstractClass(
                 'Magento\Customer\Service\V1\CustomerMetadataServiceInterface', [], '', false
             );
-        $attributeMetadata
+        $this->_metadataService
             ->expects($this->any())->method('getAttributeMetadata')->will($this->returnValue($this->_attribute));
 
         date_default_timezone_set('America/Los_Angeles');
@@ -81,7 +85,7 @@ class DobTest extends \PHPUnit_Framework_TestCase
         $this->_block = new Dob(
             $context,
             $this->getMock('Magento\Customer\Helper\Address', [], [], '', false),
-            $attributeMetadata
+            $this->_metadataService
         );
     }
 
@@ -108,6 +112,15 @@ class DobTest extends \PHPUnit_Framework_TestCase
         ];
     }
 
+    public function testIsEnabledWithException()
+    {
+        $this->_metadataService
+            ->expects($this->any())
+            ->method('getAttributeMetadata')
+            ->will($this->throwException(new NoSuchEntityException('field', 'value')));
+        $this->assertSame(false, $this->_block->isEnabled());
+    }
+
     /**
      * @param bool $isRequired Determines whether the 'dob' attribute is required
      * @param bool $expectedValue The value we expect from Dob::isRequired()
@@ -120,6 +133,15 @@ class DobTest extends \PHPUnit_Framework_TestCase
         $this->assertSame($expectedValue, $this->_block->isRequired());
     }
 
+    public function testIsRequiredWithException()
+    {
+        $this->_metadataService
+            ->expects($this->any())
+            ->method('getAttributeMetadata')
+            ->will($this->throwException(new NoSuchEntityException('field', 'value')));
+        $this->assertSame(false, $this->_block->isRequired());
+    }
+
     /**
      * @return array
      */
@@ -272,6 +294,15 @@ class DobTest extends \PHPUnit_Framework_TestCase
         ];
     }
 
+    public function testGetMinDateRangeWithException()
+    {
+        $this->_metadataService
+            ->expects($this->any())
+            ->method('getAttributeMetadata')
+            ->will($this->throwException(new NoSuchEntityException('field', 'value')));
+        $this->assertNull($this->_block->getMinDateRange());
+    }
+
     /**
      * @param array $validationRules The date Min/Max validation rules
      * @param int $expectedValue The value we expect from Dob::getMaxDateRange()
@@ -295,4 +326,13 @@ class DobTest extends \PHPUnit_Framework_TestCase
             [[], null]
         ];
     }
+
+    public function testGetMaxDateRangeWithException()
+    {
+        $this->_metadataService
+            ->expects($this->any())
+            ->method('getAttributeMetadata')
+            ->will($this->throwException(new NoSuchEntityException('field', 'value')));
+        $this->assertNull($this->_block->getMaxDateRange());
+    }
 }
diff --git a/dev/tests/unit/testsuite/Magento/Customer/Block/Widget/GenderTest.php b/dev/tests/unit/testsuite/Magento/Customer/Block/Widget/GenderTest.php
index ce34f430683..3e55559bd94 100644
--- a/dev/tests/unit/testsuite/Magento/Customer/Block/Widget/GenderTest.php
+++ b/dev/tests/unit/testsuite/Magento/Customer/Block/Widget/GenderTest.php
@@ -23,6 +23,8 @@
  */
 namespace Magento\Customer\Block\Widget;
 
+use Magento\Exception\NoSuchEntityException;
+
 class GenderTest extends \PHPUnit_Framework_TestCase
 {
     /** Constants used in the unit tests */
@@ -104,6 +106,15 @@ class GenderTest extends \PHPUnit_Framework_TestCase
         ];
     }
 
+    public function testIsEnabledWithException()
+    {
+        $this->_attributeMetadata
+            ->expects($this->any())
+            ->method('getAttributeMetadata')
+            ->will($this->throwException(new NoSuchEntityException('field', 'value')));
+        $this->assertSame(false, $this->_block->isEnabled());
+    }
+
     /**
      * @param bool $isRequired Determines whether the 'gender' attribute is required
      * @param bool $expectedValue The value we expect from Gender::isRequired()
@@ -128,6 +139,15 @@ class GenderTest extends \PHPUnit_Framework_TestCase
         ];
     }
 
+    public function testIsRequiredWithException()
+    {
+        $this->_attributeMetadata
+            ->expects($this->any())
+            ->method('getAttributeMetadata')
+            ->will($this->throwException(new NoSuchEntityException('field', 'value')));
+        $this->assertSame(false, $this->_block->isRequired());
+    }
+
     public function testGetCustomer()
     {
         /** Do not include prefix, middlename, and suffix attributes when calling Customer::getName() */
diff --git a/dev/tests/unit/testsuite/Magento/Customer/Block/Widget/NameTest.php b/dev/tests/unit/testsuite/Magento/Customer/Block/Widget/NameTest.php
index eb4aba85b68..8a8d52a06f2 100644
--- a/dev/tests/unit/testsuite/Magento/Customer/Block/Widget/NameTest.php
+++ b/dev/tests/unit/testsuite/Magento/Customer/Block/Widget/NameTest.php
@@ -25,6 +25,9 @@
 namespace Magento\Customer\Block\Widget;
 
 use Magento\Customer\Service\V1\Dto\Customer;
+use Magento\Exception\NoSuchEntityException;
+use Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata;
+use Magento\Customer\Service\V1\CustomerMetadataServiceInterface;
 
 /**
  * Test class for \Magento\Customer\Block\Widget\Name.
@@ -48,7 +51,7 @@ class NameTest extends \PHPUnit_Framework_TestCase
     const PREFIX_STORE_LABEL = 'Prefix';
     /**#@-*/
 
-    /** @var  \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata */
+    /** @var  \PHPUnit_Framework_MockObject_MockObject | AttributeMetadata */
     private $_attributeMetadata;
 
     /** @var  \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Helper\Data */
@@ -60,24 +63,32 @@ class NameTest extends \PHPUnit_Framework_TestCase
     /** @var  Name */
     private $_block;
 
+    /** @var  \PHPUnit_Framework_MockObject_MockObject | CustomerMetadataServiceInterface */
+    private $_metadataService;
+
     public function setUp()
     {
-        $this->_escaper = $this->getMock('Magento\Escaper', array(), array(), '', false);
-        $context = $this->getMock('Magento\View\Element\Template\Context', array(), array(), '', false);
+        $this->_escaper = $this->getMock('Magento\Escaper', [], [], '', false);
+        $context = $this->getMock('Magento\View\Element\Template\Context', [], [], '', false);
         $context->expects($this->any())->method('getEscaper')->will($this->returnValue($this->_escaper));
 
-        $addressHelper = $this->getMock('Magento\Customer\Helper\Address', array(), array(), '', false);
-        $metadataService = $this->getMockForAbstractClass(
-            'Magento\Customer\Service\V1\CustomerMetadataServiceInterface', array(), '', false
+        $addressHelper = $this->getMock('Magento\Customer\Helper\Address', [], [], '', false);
+        $this->_metadataService = $this->getMockForAbstractClass(
+            'Magento\Customer\Service\V1\CustomerMetadataServiceInterface', [], '', false
+        );
+        $this->_customerHelper = $this->getMock('Magento\Customer\Helper\Data', [], [], '', false);
+        $this->_attributeMetadata = $this->getMock(
+            'Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata',
+            [],
+            [],
+            '',
+            false
         );
-        $this->_customerHelper = $this->getMock('Magento\Customer\Helper\Data', array(), array(), '', false);
-        $this->_attributeMetadata =
-            $this->getMock('Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata', array(), array(), '', false);
-        $metadataService
+        $this->_metadataService
             ->expects($this->any())
             ->method('getAttributeMetadata')->will($this->returnValue($this->_attributeMetadata));
 
-        $this->_block = new Name($context, $addressHelper, $metadataService, $this->_customerHelper);
+        $this->_block = new Name($context, $addressHelper, $this->_metadataService, $this->_customerHelper);
     }
 
     /**
@@ -85,13 +96,47 @@ class NameTest extends \PHPUnit_Framework_TestCase
      */
     public function testShowPrefix()
     {
-        $this->_setUpShowAttribute(array(Customer::PREFIX => self::PREFIX));
+        $this->_setUpShowAttribute([Customer::PREFIX => self::PREFIX]);
         $this->assertTrue($this->_block->showPrefix());
 
         $this->_attributeMetadata->expects($this->at(0))->method('isVisible')->will($this->returnValue(false));
         $this->assertFalse($this->_block->showPrefix());
     }
 
+    public function testShowPrefixWithException()
+    {
+        $this->_metadataService
+            ->expects($this->any())
+            ->method('getAttributeMetadata')
+            ->will($this->throwException(new NoSuchEntityException('field', 'value')));
+        $this->assertFalse($this->_block->showPrefix());
+    }
+
+    /**
+     * @param $method
+     * @dataProvider methodDataProvider
+     */
+    public function testMethodWithNoSuchEntityException($method)
+    {
+        $this->_metadataService
+            ->expects($this->any())
+            ->method('getAttributeMetadata')
+            ->will($this->throwException(new NoSuchEntityException('field', 'value')));
+        $this->assertFalse($this->_block->$method());
+    }
+
+    public function methodDataProvider()
+    {
+        return [
+            'showPrefix' => ['showPrefix'],
+            'isPrefixRequired' => ['isPrefixRequired'],
+            'showMiddlename' => ['showMiddlename'],
+            'isMiddlenameRequired' => ['isMiddlenameRequired'],
+            'showSuffix' => ['showSuffix'],
+            'isSuffixRequired' => ['isSuffixRequired'],
+        ];
+    }
+
     /**
      * @see self::_setUpIsAttributeRequired()
      */
@@ -103,7 +148,7 @@ class NameTest extends \PHPUnit_Framework_TestCase
 
     public function testShowMiddlename()
     {
-        $this->_setUpShowAttribute(array(Customer::MIDDLENAME, self::MIDDLENAME));
+        $this->_setUpShowAttribute([Customer::MIDDLENAME, self::MIDDLENAME]);
         $this->assertTrue($this->_block->showMiddlename());
     }
 
@@ -115,7 +160,7 @@ class NameTest extends \PHPUnit_Framework_TestCase
 
     public function testShowSuffix()
     {
-        $this->_setUpShowAttribute(array(Customer::SUFFIX => self::SUFFIX));
+        $this->_setUpShowAttribute([Customer::SUFFIX => self::SUFFIX]);
         $this->assertTrue($this->_block->showSuffix());
     }
 
@@ -131,14 +176,14 @@ class NameTest extends \PHPUnit_Framework_TestCase
          * Added some padding so that the trim() call on Customer::getPrefix() will remove it. Also added
          * special characters so that the escapeHtml() method returns a htmlspecialchars translated value.
          */
-        $customer = new Customer(array(Customer::PREFIX => '  <' . self::PREFIX . '>  '));
+        $customer = new Customer([Customer::PREFIX => '  <' . self::PREFIX . '>  ']);
         $this->_block->setObject($customer);
 
-        $prefixOptions = array(
+        $prefixOptions = [
             'Mrs' => 'Mrs',
             'Ms' => 'Ms',
             'Miss' => 'Miss'
-        );
+        ];
 
         $prefix = '&lt;' . self::PREFIX . '&gt;';
         $expectedOptions = $prefixOptions;
@@ -153,11 +198,11 @@ class NameTest extends \PHPUnit_Framework_TestCase
 
     public function testGetPrefixOptionsEmpty()
     {
-        $customer = new Customer(array(Customer::PREFIX => self::PREFIX));
+        $customer = new Customer([Customer::PREFIX => self::PREFIX]);
         $this->_block->setObject($customer);
 
         $this->_customerHelper
-            ->expects($this->once())->method('getNamePrefixOptions')->will($this->returnValue(array()));
+            ->expects($this->once())->method('getNamePrefixOptions')->will($this->returnValue([]));
 
         $this->assertEmpty($this->_block->getPrefixOptions());
     }
@@ -168,12 +213,12 @@ class NameTest extends \PHPUnit_Framework_TestCase
          * Added padding and special characters to show that trim() works on Customer::getSuffix() and that
          * a properly htmlspecialchars translated value is returned.
          */
-        $customer = new Customer(array(Customer::SUFFIX => '  <' . self::SUFFIX . '>  '));
+        $customer = new Customer([Customer::SUFFIX => '  <' . self::SUFFIX . '>  ']);
         $this->_block->setObject($customer);
 
-        $suffixOptions = array(
+        $suffixOptions = [
             'Sr' => 'Sr'
-        );
+        ];
 
         $suffix = '&lt;' . self::SUFFIX . '&gt;';
         $expectedOptions = $suffixOptions;
@@ -188,11 +233,11 @@ class NameTest extends \PHPUnit_Framework_TestCase
 
     public function testGetSuffixOptionsEmpty()
     {
-        $customer = new Customer(array(Customer::SUFFIX => self::SUFFIX));
+        $customer = new Customer([Customer::SUFFIX => self::SUFFIX]);
         $this->_block->setObject($customer);
 
         $this->_customerHelper
-            ->expects($this->once())->method('getNameSuffixOptions')->will($this->returnValue(array()));
+            ->expects($this->once())->method('getNameSuffixOptions')->will($this->returnValue([]));
 
         $this->assertEmpty($this->_block->getSuffixOptions());
     }
@@ -236,16 +281,16 @@ class NameTest extends \PHPUnit_Framework_TestCase
      */
     public function getContainerClassNameProvider()
     {
-        return array(
-            array(false, false, false, self::DEFAULT_CLASS_NAME),
-            array(true,  false, false, self::DEFAULT_CLASS_NAME . self::CONTAINER_CLASS_NAME_PREFIX),
-            array(false, true,  false, self::DEFAULT_CLASS_NAME . self::CONTAINER_CLASS_NAME_MIDDLENAME),
-            array(false, false, true,  self::DEFAULT_CLASS_NAME . self::CONTAINER_CLASS_NAME_SUFFIX),
-            array(true,  true,  true,
+        return [
+            [false, false, false, self::DEFAULT_CLASS_NAME],
+            [true,  false, false, self::DEFAULT_CLASS_NAME . self::CONTAINER_CLASS_NAME_PREFIX],
+            [false, true,  false, self::DEFAULT_CLASS_NAME . self::CONTAINER_CLASS_NAME_MIDDLENAME],
+            [false, false, true,  self::DEFAULT_CLASS_NAME . self::CONTAINER_CLASS_NAME_SUFFIX],
+            [true,  true,  true,
                 self::DEFAULT_CLASS_NAME . self::CONTAINER_CLASS_NAME_PREFIX .
                 self::CONTAINER_CLASS_NAME_MIDDLENAME . self::CONTAINER_CLASS_NAME_SUFFIX
-            )
-        );
+            ]
+        ];
     }
 
     /**
@@ -271,10 +316,19 @@ class NameTest extends \PHPUnit_Framework_TestCase
      */
     public function getStoreLabelProvider()
     {
-        return array(
-            array(self::INVALID_ATTRIBUTE_CODE, '', ''),
-            array(self::PREFIX_ATTRIBUTE_CODE, self::PREFIX_STORE_LABEL, self::PREFIX_STORE_LABEL)
-        );
+        return [
+            [self::INVALID_ATTRIBUTE_CODE, '', ''],
+            [self::PREFIX_ATTRIBUTE_CODE, self::PREFIX_STORE_LABEL, self::PREFIX_STORE_LABEL]
+        ];
+    }
+
+    public function testGetStoreLabelWithException()
+    {
+        $this->_metadataService
+            ->expects($this->any())
+            ->method('getAttributeMetadata')
+            ->will($this->throwException(new NoSuchEntityException('field', 'value')));
+        $this->assertSame('', $this->_block->getStoreLabel('attributeCode'));
     }
 
     /**
diff --git a/dev/tests/unit/testsuite/Magento/Customer/Block/Widget/TaxvatTest.php b/dev/tests/unit/testsuite/Magento/Customer/Block/Widget/TaxvatTest.php
index 204b5fe808a..f2b7504be65 100644
--- a/dev/tests/unit/testsuite/Magento/Customer/Block/Widget/TaxvatTest.php
+++ b/dev/tests/unit/testsuite/Magento/Customer/Block/Widget/TaxvatTest.php
@@ -23,6 +23,8 @@
  */
 namespace Magento\Customer\Block\Widget;
 
+use Magento\Exception\NoSuchEntityException;
+
 class TaxvatTest extends \PHPUnit_Framework_TestCase
 {
     /** Constants used in the unit tests */
@@ -90,6 +92,15 @@ class TaxvatTest extends \PHPUnit_Framework_TestCase
         ];
     }
 
+    public function testIsEnabledWithException()
+    {
+        $this->_attributeMetadata
+            ->expects($this->any())
+            ->method('getAttributeMetadata')
+            ->will($this->throwException(new \Magento\Exception\NoSuchEntityException('field', 'value')));
+        $this->assertSame(false, $this->_block->isEnabled());
+    }
+
     /**
      * @param bool $isRequired Determines whether the 'taxvat' attribute is required
      * @param bool $expectedValue The value we expect from Taxvat::isRequired()
@@ -114,6 +125,15 @@ class TaxvatTest extends \PHPUnit_Framework_TestCase
         ];
     }
 
+    public function testIsRequiredWithException()
+    {
+        $this->_attributeMetadata
+            ->expects($this->any())
+            ->method('getAttributeMetadata')
+            ->will($this->throwException(new NoSuchEntityException('field', 'value')));
+        $this->assertSame(false, $this->_block->isRequired());
+    }
+
     public function testGetCustomer()
     {
         $abstractAttribute =
diff --git a/dev/tests/unit/testsuite/Magento/Customer/Model/Address/Config/XsdTest.php b/dev/tests/unit/testsuite/Magento/Customer/Model/Address/Config/XsdTest.php
index 1a348fa019d..ee86bbb18d8 100644
--- a/dev/tests/unit/testsuite/Magento/Customer/Model/Address/Config/XsdTest.php
+++ b/dev/tests/unit/testsuite/Magento/Customer/Model/Address/Config/XsdTest.php
@@ -45,7 +45,7 @@ class XsdTest extends \PHPUnit_Framework_TestCase
      */
     public function testExemplarXml($fixtureXml, array $expectedErrors)
     {
-        $dom = new \Magento\Config\Dom($fixtureXml, array(), null, '%message%');
+        $dom = new \Magento\Config\Dom($fixtureXml, array(), null, null, '%message%');
         $actualResult = $dom->validate($this->_schemaFile, $actualErrors);
         $this->assertEquals(empty($expectedErrors), $actualResult);
         $this->assertEquals($expectedErrors, $actualErrors);
diff --git a/dev/tests/unit/testsuite/Magento/Customer/Model/Resource/Group/Grid/ServiceCollectionTest.php b/dev/tests/unit/testsuite/Magento/Customer/Model/Resource/Group/Grid/ServiceCollectionTest.php
new file mode 100644
index 00000000000..fc8a13fdb90
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Customer/Model/Resource/Group/Grid/ServiceCollectionTest.php
@@ -0,0 +1,207 @@
+<?php
+/**
+ * Unit test for \Magento\Customer\Model\Resource\Group\Grid\ServiceCollection
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Customer\Model\Resource\Group\Grid;
+
+use Magento\Customer\Service\V1\Dto\SearchCriteria;
+
+class ServiceCollectionTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var \Magento\TestFramework\Helper\ObjectManager */
+    protected $objectManager;
+
+    /** @var \Magento\Customer\Service\V1\Dto\FilterBuilder */
+    protected $filterBuilder;
+
+    /** @var \Magento\Customer\Service\V1\Dto\SearchCriteriaBuilder */
+    protected $searchCriteriaBuilder;
+
+    /** @var \Magento\Customer\Service\V1\Dto\SearchResults */
+    protected $searchResults;
+
+    /** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Customer\Service\V1\CustomerGroupServiceInterface */
+    protected $groupServiceMock;
+
+    /** @var ServiceCollection */
+    protected $serviceCollection;
+
+    public function setUp()
+    {
+        $this->objectManager = new \Magento\TestFramework\Helper\ObjectManager($this);
+        $this->filterBuilder = new \Magento\Customer\Service\V1\Dto\FilterBuilder();
+        $this->searchCriteriaBuilder = new \Magento\Customer\Service\V1\Dto\SearchCriteriaBuilder();
+        $this->groupServiceMock = $this->getMockBuilder('\Magento\Customer\Service\V1\CustomerGroupServiceInterface')
+            ->getMock();
+        $this->searchResults = new \Magento\Customer\Service\V1\Dto\SearchResults([]);
+
+        $this->serviceCollection = $this->objectManager
+            ->getObject(
+                'Magento\Customer\Model\Resource\Group\Grid\ServiceCollection',
+                [
+                    'filterBuilder' => $this->filterBuilder,
+                    'searchCriteriaBuilder' => $this->searchCriteriaBuilder,
+                    'groupService' => $this->groupServiceMock,
+                ]
+            );
+    }
+
+    public function testGetSearchCriteriaImplicitEq()
+    {
+        /** @var SearchCriteria $expectedSearchCriteria */
+        $expectedSearchCriteria = $this->searchCriteriaBuilder
+            ->setCurrentPage(1)
+            ->setPageSize(0)
+            ->addSortOrder('name', SearchCriteria::SORT_ASC)
+            ->addFilter($this->filterBuilder->setField('name')->setConditionType('eq')->setValue('Magento')->create())
+            ->create();
+
+        // Verifies that the search criteria DTO created by the serviceCollection matches expected
+        $this->groupServiceMock->expects($this->once())
+            ->method('searchGroups')
+            ->with($this->equalTo($expectedSearchCriteria))
+            ->will($this->returnValue($this->searchResults));
+
+        // Now call service collection to load the data.  This causes it to create the search criteria DTO
+        $this->serviceCollection->addFieldToFilter('name', 'Magento');
+        $this->serviceCollection->setOrder('name', ServiceCollection::SORT_ORDER_ASC);
+        $this->serviceCollection->loadData();
+    }
+
+    public function testGetSearchCriteriaOneField()
+    {
+        $field = 'age';
+        $conditionType = 'gt';
+        $value = '35';
+
+        /** @var SearchCriteria $expectedSearchCriteria */
+        $expectedSearchCriteria = $this->searchCriteriaBuilder
+            ->setCurrentPage(1)
+            ->setPageSize(0)
+            ->addSortOrder('name', SearchCriteria::SORT_ASC)
+            ->addFilter(
+                $this->filterBuilder->setField($field)->setConditionType($conditionType)->setValue($value)->create()
+            )
+            ->create();
+
+        // Verifies that the search criteria DTO created by the serviceCollection matches expected
+        $this->groupServiceMock->expects($this->once())
+            ->method('searchGroups')
+            ->with($this->equalTo($expectedSearchCriteria))
+            ->will($this->returnValue($this->searchResults));
+
+        // Now call service collection to load the data.  This causes it to create the search criteria DTO
+        $this->serviceCollection->addFieldToFilter($field, [$conditionType => $value]);
+        $this->serviceCollection->setOrder('name', ServiceCollection::SORT_ORDER_ASC);
+        $this->serviceCollection->loadData();
+    }
+
+    public function testGetSearchCriteriaOr()
+    {
+        // Test ((A == 1) or (B == 1 ))
+        $fieldA = 'A';
+        $fieldB = 'B';
+        $value = 1;
+
+        /** @var SearchCriteria $expectedSearchCriteria */
+        $expectedSearchCriteria = $this->searchCriteriaBuilder
+            ->setCurrentPage(1)
+            ->setPageSize(0)
+            ->addSortOrder('name', SearchCriteria::SORT_ASC)
+            ->addOrGroup(
+                [
+                    $this->filterBuilder->setField($fieldA)->setConditionType('eq')->setValue($value)->create(),
+                    $this->filterBuilder->setField($fieldB)->setConditionType('eq')->setValue($value)->create(),
+                ]
+            )
+            ->create();
+
+        // Verifies that the search criteria DTO created by the serviceCollection matches expected
+        $this->groupServiceMock->expects($this->once())
+            ->method('searchGroups')
+            ->with($this->equalTo($expectedSearchCriteria))
+            ->will($this->returnValue($this->searchResults));
+
+        // Now call service collection to load the data.  This causes it to create the search criteria DTO
+        $this->serviceCollection->addFieldToFilter([$fieldA, $fieldB], [$value, $value]);
+        $this->serviceCollection->setOrder('name', ServiceCollection::SORT_ORDER_ASC);
+        $this->serviceCollection->loadData();
+    }
+
+    public function testGetSearchCriteriaAnd()
+    {
+        // Test ((A > 1) and (B > 1))
+        $fieldA = 'A';
+        $fieldB = 'B';
+        $value = 1;
+
+        /** @var SearchCriteria $expectedSearchCriteria */
+        $expectedSearchCriteria = $this->searchCriteriaBuilder
+            ->setCurrentPage(1)
+            ->setPageSize(0)
+            ->addSortOrder('name', SearchCriteria::SORT_ASC)
+            ->addFilter($this->filterBuilder->setField($fieldA)->setConditionType('gt')->setValue($value)->create())
+            ->addFilter($this->filterBuilder->setField($fieldB)->setConditionType('gt')->setValue($value)->create())
+            ->create();
+
+        // Verifies that the search criteria DTO created by the serviceCollection matches expected
+        $this->groupServiceMock->expects($this->once())
+            ->method('searchGroups')
+            ->with($this->equalTo($expectedSearchCriteria))
+            ->will($this->returnValue($this->searchResults));
+
+        // Now call service collection to load the data.  This causes it to create the search criteria DTO
+        $this->serviceCollection->addFieldToFilter($fieldA, ['gt' => $value]);
+        $this->serviceCollection->addFieldToFilter($fieldB, ['gt' => $value]);
+        $this->serviceCollection->setOrder('name', ServiceCollection::SORT_ORDER_ASC);
+        $this->serviceCollection->loadData();
+    }
+
+    /**
+     * @param string[] $fields
+     * @param array $conditions
+     *
+     * @expectedException \Magento\Exception
+     * @expectedExceptionMessage When passing in a field array there must be a matching condition array
+     * @dataProvider addFieldToFilterInconsistentArraysDataProvider
+     */
+    public function testAddFieldToFilterInconsistentArrays($fields, $conditions)
+    {
+        $this->serviceCollection->addFieldToFilter($fields, $conditions);
+    }
+
+    public function addFieldToFilterInconsistentArraysDataProvider()
+    {
+        return [
+            'missingCondition' => [
+                ['fieldA', 'missingCondition'],
+                [['eq' => 'A']]
+            ],
+            'missingField' => [
+                ['fieldA'],
+                [['eq' => 'A'], ['eq' => 'B']]
+            ],
+        ];
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Customer/Service/V1/CustomerMetadataServiceTest.php b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/CustomerMetadataServiceTest.php
index f0d2e40049c..c210119b326 100644
--- a/dev/tests/unit/testsuite/Magento/Customer/Service/V1/CustomerMetadataServiceTest.php
+++ b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/CustomerMetadataServiceTest.php
@@ -25,6 +25,8 @@
  */
 namespace Magento\Customer\Service\V1;
 
+use Magento\Exception\NoSuchEntityException;
+
 class CustomerMetadataServiceTest extends \PHPUnit_Framework_TestCase
 {
     /** Sample values for testing */
@@ -155,6 +157,41 @@ class CustomerMetadataServiceTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals('value2', $options['label2']->getValue());
     }
 
+    public function testGetAttributeMetadataWithoutAttributeMetadata()
+    {
+        $this->_eavConfigMock->expects($this->any())
+            ->method('getAttribute')
+            ->will($this->returnValue(false));
+
+        $attributeColMock = $this->getMockBuilder('\Magento\Customer\Model\Resource\Form\Attribute\CollectionFactory')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $storeManagerMock = $this->getMockBuilder('\Magento\Core\Model\StoreManager')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $optionBuilder = new \Magento\Customer\Service\V1\Dto\Eav\OptionBuilder();
+
+        $attributeMetadataBuilder = new \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadataBuilder();
+
+        $service = new CustomerMetadataService($this->_eavConfigMock, $attributeColMock, $storeManagerMock,
+            $optionBuilder, $attributeMetadataBuilder);
+
+        try {
+            $service->getAttributeMetadata('entityCode', 'attributeId');
+            $this->fail('Expected exception not thrown.');
+        } catch (\Magento\Exception\NoSuchEntityException $e) {
+            $this->assertEquals(\Magento\Exception\NoSuchEntityException::NO_SUCH_ENTITY, $e->getCode());
+            $this->assertEquals(
+                [
+                    'entityType' => 'entityCode',
+                    'attributeCode' => 'attributeId'
+                ],
+                $e->getParams()
+            );
+        }
+    }
+
     public function testGetAttributeMetadataWithoutOptions()
     {
         $this->_eavConfigMock->expects($this->any())
@@ -221,6 +258,104 @@ class CustomerMetadataServiceTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals(0, count($options));
     }
 
+    public function testGetCustomerAttributeMetadataWithoutAttributeMetadata()
+    {
+        $this->_eavConfigMock->expects($this->any())
+            ->method('getAttribute')
+            ->will($this->returnValue(false));
+
+        $attributeColMock = $this->getMockBuilder('\Magento\Customer\Model\Resource\Form\Attribute\CollectionFactory')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $storeManagerMock = $this->getMockBuilder('\Magento\Core\Model\StoreManager')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $optionBuilder = new \Magento\Customer\Service\V1\Dto\Eav\OptionBuilder();
+
+        $attributeMetadataBuilder = new \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadataBuilder();
+
+        $service = new CustomerMetadataService($this->_eavConfigMock, $attributeColMock, $storeManagerMock,
+            $optionBuilder, $attributeMetadataBuilder);
+
+        try {
+            $service->getCustomerAttributeMetadata('attributeId');
+            $this->fail('Expected exception not thrown.');
+        } catch (NoSuchEntityException $e) {
+            $this->assertEquals(NoSuchEntityException::NO_SUCH_ENTITY, $e->getCode());
+            $this->assertEquals(
+                [
+                    'entityType' => 'customer',
+                    'attributeCode' => 'attributeId'
+                ],
+                $e->getParams()
+            );
+        }
+    }
+
+    public function testGetAddressAttributeMetadataWithoutAttributeMetadata()
+    {
+        $this->_eavConfigMock->expects($this->any())
+            ->method('getAttribute')
+            ->will($this->returnValue(false));
+
+        $attributeColMock = $this->getMockBuilder('\Magento\Customer\Model\Resource\Form\Attribute\CollectionFactory')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $storeManagerMock = $this->getMockBuilder('\Magento\Core\Model\StoreManager')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $optionBuilder = new \Magento\Customer\Service\V1\Dto\Eav\OptionBuilder();
+
+        $attributeMetadataBuilder = new \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadataBuilder();
+
+        $service = new CustomerMetadataService($this->_eavConfigMock, $attributeColMock, $storeManagerMock,
+            $optionBuilder, $attributeMetadataBuilder);
+
+        try {
+            $service->getAddressAttributeMetadata('attributeId');
+            $this->fail('Expected exception not thrown.');
+        } catch (NoSuchEntityException $e) {
+            $this->assertEquals(NoSuchEntityException::NO_SUCH_ENTITY, $e->getCode());
+            $this->assertEquals(
+                [
+                    'entityType' => 'customer_address',
+                    'attributeCode' => 'attributeId'
+                ],
+                $e->getParams()
+            );
+        }
+    }
+
+    public function testGetAllAttributeSetMetadataWithoutAttributeMetadata()
+    {
+        $this->_eavConfigMock->expects($this->any())
+            ->method('getAttribute')
+            ->will($this->returnValue(false));
+
+        $this->_eavConfigMock->expects($this->any())
+            ->method('getEntityAttributeCodes')
+            ->will($this->returnValue(['bogus']));
+
+        $attributeColMock = $this->getMockBuilder('\Magento\Customer\Model\Resource\Form\Attribute\CollectionFactory')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $storeManagerMock = $this->getMockBuilder('\Magento\Core\Model\StoreManager')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $optionBuilder = new \Magento\Customer\Service\V1\Dto\Eav\OptionBuilder();
+
+        $attributeMetadataBuilder = new \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadataBuilder();
+
+        $service = new CustomerMetadataService($this->_eavConfigMock, $attributeColMock, $storeManagerMock,
+            $optionBuilder, $attributeMetadataBuilder);
+
+        $this->assertEquals([], $service->getAllAttributeSetMetadata('entityType', 0, 1));
+    }
+
     /**
      * @param \PHPUnit_Framework_MockObject_MockObject $mock
      * @param array $valueMap
diff --git a/dev/tests/unit/testsuite/Magento/DB/Adapter/Pdo/MysqlTest.php b/dev/tests/unit/testsuite/Magento/DB/Adapter/Pdo/MysqlTest.php
index 18b45c9111d..a5e16aed648 100644
--- a/dev/tests/unit/testsuite/Magento/DB/Adapter/Pdo/MysqlTest.php
+++ b/dev/tests/unit/testsuite/Magento/DB/Adapter/Pdo/MysqlTest.php
@@ -39,14 +39,17 @@ class MysqlTest extends \PHPUnit_Framework_TestCase
 
     /**
      * Adapter for test
-     * @var \Magento\DB\Adapter\Pdo\Mysql
+     *
+     * @var \Magento\DB\Adapter\Pdo\Mysql|\PHPUnit_Framework_MockObject_MockObject
      */
-    private $_adapter;
+    protected $_adapter;
 
-    /*
+    /**
      * Mock DB adapter for DDL query tests
+     *
+     * @var \Magento\DB\Adapter\Pdo\Mysql|\PHPUnit_Framework_MockObject_MockObject
      */
-    private $_mockAdapter;
+    protected $_mockAdapter;
 
     /**
      * Setup
@@ -65,7 +68,7 @@ class MysqlTest extends \PHPUnit_Framework_TestCase
 
         $this->_adapter = $this->getMock(
             'Magento\DB\Adapter\Pdo\Mysql',
-            array('_connect', '_beginTransaction', '_commit', '_rollBack', 'query', '_debugWriteToFile'),
+            array('_connect', '_beginTransaction', '_commit', '_rollBack', 'query', '_debugWriteToFile', 'fetchRow'),
             array(
                 'dbname' => 'not_exists',
                 'username' => 'not_valid',
@@ -407,4 +410,74 @@ class MysqlTest extends \PHPUnit_Framework_TestCase
 
         $this->_adapter->insertOnDuplicate($table, $data, $fields);
     }
+
+    public function testSelectsByRange()
+    {
+        $rangeField = 'test_id';
+        $tableName = 'test';
+
+        $this->_adapter->expects($this->once())
+            ->method('fetchRow')
+            ->with(
+                $this->_adapter->select()
+                    ->from(
+                        $tableName,
+                        [
+                            new \Zend_Db_Expr('MIN(' . $this->_adapter->quoteIdentifier($rangeField) . ') AS min'),
+                            new \Zend_Db_Expr('MAX(' . $this->_adapter->quoteIdentifier($rangeField) . ') AS max'),
+                        ]
+                    )
+            )
+            ->will($this->returnValue(['min' => 1, 'max' => 200]));
+        $this->_adapter->expects($this->any())
+            ->method('quote')
+            ->will(
+                $this->returnCallback(function ($values) {
+                    if (!is_array($values)) {
+                        $values = [$values];
+                    }
+                    foreach ($values as &$value) {
+                        $value = "'" . $value . "'";
+                    }
+                    return implode(',', $values);
+                })
+            );
+
+        $expectedSelect = $this->_adapter->select()
+            ->from($tableName);
+
+        $result = $this->_adapter->selectsByRange($rangeField, $expectedSelect, 50);
+        $this->assertCount(200/50, $result);
+        $prepareField = $this->_adapter->quoteIdentifier($tableName)
+            . '.' . $this->_adapter->quoteIdentifier($rangeField);
+        $this->assertEquals(
+            $this->_adapter->select()
+                ->from($tableName)
+                ->where($prepareField . ' >= ?', 1)
+                ->where($prepareField . ' < ?', 51),
+            $result[0]
+        );
+        $this->assertEquals(
+            $this->_adapter->select()
+                ->from($tableName)
+                ->where($prepareField . ' >= ?', 51)
+                ->where($prepareField . ' < ?', 101),
+            $result[1]
+        );
+        $this->assertEquals(
+            $this->_adapter->select()
+                ->from($tableName)
+                ->where($prepareField . ' >= ?', 101)
+                ->where($prepareField . ' < ?', 151),
+            $result[2]
+        );
+        $this->assertEquals(
+            $this->_adapter->select()
+                ->from($tableName)
+                ->where($prepareField . ' >= ?', 151)
+                ->where($prepareField . ' < ?', 201),
+            $result[3]
+        );
+    }
+
 }
diff --git a/dev/tests/unit/testsuite/Magento/Data/Argument/Interpreter/ArrayTypeTest.php b/dev/tests/unit/testsuite/Magento/Data/Argument/Interpreter/ArrayTypeTest.php
new file mode 100644
index 00000000000..1bc8640f7c6
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Data/Argument/Interpreter/ArrayTypeTest.php
@@ -0,0 +1,76 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Data\Argument\Interpreter;
+
+class ArrayTypeTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Data\Argument\InterpreterInterface
+     */
+    protected $_interpreter;
+
+    /**
+     * @var ArrayType
+     */
+    protected $_model;
+
+    protected function setUp()
+    {
+        $this->_interpreter = $this->getMockForAbstractClass('Magento\Data\Argument\InterpreterInterface');
+        $this->_model = new ArrayType($this->_interpreter);
+    }
+
+    /**
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage Array items are expected
+     *
+     * @dataProvider evaluateExceptionDataProvider
+     */
+    public function testEvaluateException($inputData)
+    {
+        $this->_model->evaluate($inputData);
+    }
+
+    public function evaluateExceptionDataProvider()
+    {
+        return array(
+            'no item' => array(array()),
+            'non-array item' => array(array('item' => 'non-array')),
+        );
+    }
+
+    public function testEvaluate()
+    {
+        $this->_interpreter->expects($this->any())
+            ->method('evaluate')
+            ->will($this->returnCallback(function ($input) {
+                return '-' . $input['value'] . '-';
+            }));
+        $input = array(array('value' => 'value 1'), array('value' => 'value 2'), array('value' => 'value 3'));
+        $expected = array('-value 1-', '-value 2-', '-value 3-');
+        $actual = $this->_model->evaluate(array('item' => $input));
+        $this->assertSame($expected, $actual);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Data/Argument/Interpreter/BooleanTest.php b/dev/tests/unit/testsuite/Magento/Data/Argument/Interpreter/BooleanTest.php
new file mode 100644
index 00000000000..989ea503510
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Data/Argument/Interpreter/BooleanTest.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Data\Argument\Interpreter;
+
+class BooleanTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Boolean
+     */
+    protected $_model;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_booleanUtils;
+
+    protected function setUp()
+    {
+        $this->_booleanUtils = $this->getMock('\Magento\Stdlib\BooleanUtils');
+        $this->_model = new Boolean($this->_booleanUtils);
+    }
+
+    /**
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage Boolean value is missing
+     */
+    public function testEvaluateException()
+    {
+        $this->_model->evaluate(array());
+    }
+
+    public function testEvaluate()
+    {
+        $input = new \stdClass();
+        $expected = new \stdClass();
+        $this->_booleanUtils
+            ->expects($this->once())
+            ->method('toBoolean')
+            ->with($this->identicalTo($input))
+            ->will($this->returnValue($expected))
+        ;
+        $actual = $this->_model->evaluate(array('value' => $input));
+        $this->assertSame($expected, $actual);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Data/Argument/Interpreter/CompositeTest.php b/dev/tests/unit/testsuite/Magento/Data/Argument/Interpreter/CompositeTest.php
new file mode 100644
index 00000000000..e922ca5c167
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Data/Argument/Interpreter/CompositeTest.php
@@ -0,0 +1,123 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Data\Argument\Interpreter;
+
+class CompositeTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Data\Argument\InterpreterInterface
+     */
+    protected $_interpreterOne;
+
+    /**
+     * @var \Magento\Data\Argument\InterpreterInterface
+     */
+    protected $_interpreterTwo;
+
+    /**
+     * @var Composite
+     */
+    protected $_model;
+
+    protected function setUp()
+    {
+        $this->_interpreterOne = $this->getMock('Magento\Data\Argument\InterpreterInterface');
+        $this->_interpreterTwo = $this->getMock('Magento\Data\Argument\InterpreterInterface');
+        $this->_model = new Composite(
+            array('one' => $this->_interpreterOne, 'two' => $this->_interpreterTwo),
+            'interpreter'
+        );
+    }
+
+    /**
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage Interpreter named 'wrong' is expected to be an argument interpreter instance
+     */
+    public function testConstructWrongInterpreter()
+    {
+        $interpreters = array(
+            'correct' => $this->getMock('Magento\Data\Argument\InterpreterInterface'),
+            'wrong'   => $this->getMock('Magento\ObjectManager'),
+        );
+        new Composite($interpreters, 'interpreter');
+    }
+
+    /**
+     * @param array $input
+     * @param string $expectedExceptionMessage
+     *
+     * @dataProvider evaluateWrongDiscriminatorDataProvider
+     */
+    public function testEvaluateWrongDiscriminator($input, $expectedExceptionMessage)
+    {
+        $this->setExpectedException('\InvalidArgumentException', $expectedExceptionMessage);
+        $this->_model->evaluate($input);
+    }
+
+    public function evaluateWrongDiscriminatorDataProvider()
+    {
+        return array(
+            'no discriminator' => array(array(), 'Value for key "interpreter" is missing in the argument data'),
+            'nonexistent interpreter ' => array(
+                array('interpreter' => 'nonexistent'),
+                "Argument interpreter named 'nonexistent' has not been defined"
+            ),
+        );
+    }
+
+    public function testEvaluate()
+    {
+        $input = array('interpreter' => 'one', 'value' => 'test');
+        $expected = array('value' => 'test (updated)');
+
+        $this->_interpreterOne->expects($this->once())
+            ->method('evaluate')
+            ->with(array('value' => 'test'))
+            ->will($this->returnValue($expected));
+        $this->assertSame($expected, $this->_model->evaluate($input));
+    }
+
+    public function testAddInterpreter()
+    {
+        $input = array('interpreter' => 'new', 'value' => 'test');
+        $newInterpreter = $this->getMock('Magento\Data\Argument\InterpreterInterface');
+        $this->_model->addInterpreter('new', $newInterpreter);
+        $newInterpreter->expects($this->once())
+            ->method('evaluate')
+            ->with(array('value' => 'test'));
+        $this->_model->evaluate($input);
+    }
+
+    /**
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage Argument interpreter named 'one' has already been defined
+     *
+     */
+    public function testAddInterpreterException()
+    {
+        $newInterpreter = $this->getMock('Magento\Data\Argument\InterpreterInterface');
+        $this->_model->addInterpreter('one', $newInterpreter);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Data/Argument/Interpreter/ConstantTest.php b/dev/tests/unit/testsuite/Magento/Data/Argument/Interpreter/ConstantTest.php
new file mode 100644
index 00000000000..3127ef0e307
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Data/Argument/Interpreter/ConstantTest.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Data\Argument\Interpreter;
+
+class ConstantTest  extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Constant
+     */
+    private $object;
+
+    protected function setUp()
+    {
+        $this->object = new Constant;
+    }
+
+    public function testEvaluate()
+    {
+        // it is defined in framework/bootstrap.php
+        $this->assertEquals(TESTS_TEMP_DIR, $this->object->evaluate(array('value' => 'TESTS_TEMP_DIR')));
+    }
+
+    /**
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage Constant name is expected.
+     * @dataProvider evaluateBadValueDataProvider
+     */
+    public function testEvaluateBadValue($value)
+    {
+        $this->object->evaluate($value);
+    }
+
+    /**
+     * @return array
+     */
+    public function evaluateBadValueDataProvider()
+    {
+        return array(
+            array(array('value' => 'KNOWINGLY_UNDEFINED_CONSTANT')),
+            array(array('value' => '')),
+            array(array()),
+        );
+    }
+} 
diff --git a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/TestHelper.php b/dev/tests/unit/testsuite/Magento/Data/Argument/Interpreter/NullTypeTest.php
similarity index 79%
rename from dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/TestHelper.php
rename to dev/tests/unit/testsuite/Magento/Data/Argument/Interpreter/NullTypeTest.php
index 704882473e2..51ffbe43824 100644
--- a/dev/tests/unit/testsuite/Magento/Core/Model/Layout/Argument/Handler/TestHelper.php
+++ b/dev/tests/unit/testsuite/Magento/Data/Argument/Interpreter/NullTypeTest.php
@@ -18,18 +18,17 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Core
- * @subpackage  unit_tests
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
-namespace Magento\Core\Model\Layout\Argument\Handler;
+namespace Magento\Data\Argument\Interpreter;
 
-class TestHelper extends \Magento\App\Helper\AbstractHelper
+class NullTypeTest  extends \PHPUnit_Framework_TestCase
 {
-    public function testMethod()
+    public function testEvaluate()
     {
+        $object = new NullType;
+        $this->assertNull($object->evaluate(array('unused')));
     }
-}
+} 
diff --git a/dev/tests/unit/testsuite/Magento/Data/Argument/Interpreter/NumberTest.php b/dev/tests/unit/testsuite/Magento/Data/Argument/Interpreter/NumberTest.php
new file mode 100644
index 00000000000..51a64c6dee3
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Data/Argument/Interpreter/NumberTest.php
@@ -0,0 +1,79 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Data\Argument\Interpreter;
+
+class NumberTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Number
+     */
+    protected $_model;
+
+    protected function setUp()
+    {
+        $this->_model = new Number();
+    }
+
+    /**
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage Numeric value is expected
+     *
+     * @dataProvider evaluateExceptionDataProvider
+     */
+    public function testEvaluateException($input)
+    {
+        $this->_model->evaluate($input);
+    }
+
+    public function evaluateExceptionDataProvider()
+    {
+        return array(
+            'no value' => array(array()),
+            'non-numeric value' => array(array('value' => 'non-numeric')),
+        );
+    }
+
+    /**
+     * @param array $input
+     * @param bool $expected
+     *
+     * @dataProvider evaluateDataProvider
+     */
+    public function testEvaluate($input, $expected)
+    {
+        $actual = $this->_model->evaluate(array('value' => $input));
+        $this->assertSame($expected, $actual);
+    }
+
+    public function evaluateDataProvider()
+    {
+        return array(
+            'integer'                  => array(10, 10),
+            'float'                    => array(10.5, 10.5),
+            'string numeric (integer)' => array('10', '10'),
+            'string numeric (float)'   => array('10.5', '10.5'),
+        );
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Data/Argument/XsdTest.php b/dev/tests/unit/testsuite/Magento/Data/Argument/XsdTest.php
new file mode 100644
index 00000000000..fe1a88bc540
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Data/Argument/XsdTest.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Data\Argument;
+
+class XsdTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * Path to xsd schema file for validating argument types
+     * @var string
+     */
+    protected $_typesXsdSchema;
+
+    /**
+     * @var \Magento\TestFramework\Utility\XsdValidator
+     */
+    protected $_xsdValidator;
+
+    protected function setUp()
+    {
+        $this->_typesXsdSchema = __DIR__ . "/_files/types_schema.xsd";
+        $this->_xsdValidator = new \Magento\TestFramework\Utility\XsdValidator();
+    }
+
+    /**
+     * @param string $xmlString
+     * @param array $expectedError
+     * @dataProvider schemaCorrectlyIdentifiesInvalidTypesXmlDataProvider
+     */
+    public function testSchemaCorrectlyIdentifiesInvalidTypesXml($xmlString, $expectedError)
+    {
+        $actualError = $this->_xsdValidator->validate($this->_typesXsdSchema, $xmlString);
+        $this->assertEquals($expectedError, $actualError);
+    }
+
+    /**
+     * Data provider with invalid type declaration
+     *
+     * @return array
+     */
+    public function schemaCorrectlyIdentifiesInvalidTypesXmlDataProvider()
+    {
+        return include(__DIR__ . '/_files/typesInvalidArray.php');
+    }
+
+    public function testSchemaCorrectlyIdentifiesValidXml()
+    {
+        $xmlString = file_get_contents(__DIR__ . '/_files/types_valid.xml');
+        $actualResult = $this->_xsdValidator->validate($this->_typesXsdSchema, $xmlString);
+
+        $this->assertEmpty($actualResult, join("\n", $actualResult));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Data/Argument/_files/typesInvalidArray.php b/dev/tests/unit/testsuite/Magento/Data/Argument/_files/typesInvalidArray.php
new file mode 100644
index 00000000000..dea0241f916
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Data/Argument/_files/typesInvalidArray.php
@@ -0,0 +1,110 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+return array(
+    'no arguments' => array(
+        '<?xml version="1.0"?><arguments xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />',
+        array("Element 'arguments': Missing child element(s). Expected is ( argument ).")),
+    'argument without type' => array(
+        '<?xml version="1.0"?><arguments xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><argument/></arguments>',
+        array("Element 'argument': The type definition is abstract.")),
+    'forbidden type used' => array(
+        '<?xml version="1.0"?><arguments xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+        <argument name="a" xsi:type="forbiddenType">v</argument></arguments>',
+        array(
+            "Element 'argument', attribute '{http://www.w3.org/2001/XMLSchema-instance}type': The QName value "
+                . "'forbiddenType' of the xsi:type attribute does not resolve to a type definition.",
+            "Element 'argument': The type definition is abstract.")),
+    'abstract type argumentType used' => array(
+        '<?xml version="1.0"?><arguments xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+        <argument name="a" xsi:type="argumentType">v</argument></arguments>',
+        array("Element 'argument': The type definition is abstract.")),
+    'no name attribute' => array(
+        '<?xml version="1.0"?><arguments xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+        <argument xsi:type="number">v</argument></arguments>',
+        array("Element 'argument': The attribute 'name' is required but missing.")),
+    'forbidden attribute' => array(
+        '<?xml version="1.0"?><arguments xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+        <argument name="a" xsi:type="string" forbiddenAttribute="w">v</argument></arguments>',
+        array(
+            "Element 'argument', attribute 'forbiddenAttribute': The attribute 'forbiddenAttribute' is not allowed."
+        )),
+    'forbidden translate attribute value for string' => array(
+        '<?xml version="1.0"?><arguments xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+        <argument name="a" xsi:type="string" translate="forbidden">v</argument></arguments>',
+        array("Element 'argument', attribute 'translate': 'forbidden' is not a valid value of the atomic type "
+                . "'xs:boolean'.")),
+    'attribute translate for non-string' => array(
+        '<?xml version="1.0"?><arguments xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+        <argument name="a" xsi:type="boolean" translate="true">true</argument></arguments>',
+        array("Element 'argument', attribute 'translate': The attribute 'translate' is not allowed.")),
+    'null type should be empty' => array(
+        '<?xml version="1.0"?><arguments xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+        <argument name="a" xsi:type="null">v</argument></arguments>',
+        array("Element 'argument': Character content is not allowed, because the content type is empty.")),
+    'forbidden child node' => array(
+        '<?xml version="1.0"?><arguments xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+        <argument name="a" xsi:type="string"><child>v</child></argument></arguments>',
+        array("Element 'child': This element is not expected.")),
+    'array without items' => array(
+        '<?xml version="1.0"?><arguments xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+        <argument name="a" xsi:type="array">v</argument></arguments>',
+        array("Element 'argument': Missing child element(s). Expected is ( item ).")),
+    'array with forbidden child' => array(
+        '<?xml version="1.0"?><arguments xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+        <argument name="a" xsi:type="array"><child>v</child></argument></arguments>',
+        array("Element 'child': This element is not expected. Expected is ( item ).")),
+    'array with 2 same items' => array(
+        '<?xml version="1.0"?><arguments xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+        <argument name="a" xsi:type="array">
+            <item name="name" xsi:type="string">v1</item>
+            <item name="name" xsi:type="string">v2</item>
+        </argument></arguments>',
+        array("Element 'item': Duplicate key-sequence ['name'] in key identity-constraint 'argumentItemName'.")),
+    'array item without name' => array(
+        '<?xml version="1.0"?><arguments xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+        <argument name="a" xsi:type="array"><item xsi:type="string">v</item></argument></arguments>',
+        array(
+            "Element 'item': The attribute 'name' is required but missing.",
+            "Element 'item': Not all fields of key identity-constraint 'argumentItemName' evaluate to a node."
+        )),
+    'array item with forbidden child' => array(
+        '<?xml version="1.0"?><arguments xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+        <argument name="a" xsi:type="array">
+            <item name="item" xsi:type="string"><child>v</child></item>
+        </argument></arguments>',
+        array("Element 'child': This element is not expected.")),
+    'nested array with same named items' => array(
+        '<?xml version="1.0"?><arguments xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+        <argument name="a" xsi:type="array">
+            <item name="item1" xsi:type="string">v</item>
+            <item name="item2" xsi:type="array">
+                <item name="item1" xsi:type="string">v</item>
+            </item>
+            <item name="item3" xsi:type="array">
+                <item name="item4" xsi:type="string">v</item>
+                <item name="item4" xsi:type="string">v</item>
+            </item>
+        </argument></arguments>',
+        array("Element 'item': Duplicate key-sequence ['item4'] in key identity-constraint 'itemName'.")),
+);
diff --git a/dev/tests/unit/testsuite/Magento/Data/Argument/_files/types_schema.xsd b/dev/tests/unit/testsuite/Magento/Data/Argument/_files/types_schema.xsd
new file mode 100644
index 00000000000..9a5417f754b
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Data/Argument/_files/types_schema.xsd
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Schema file for validation argument types. Includes types.xsd which is actually being tested, because the latter
+ * shouldn't be used by itself, only as a part of larger schema
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+    <xs:include schemaLocation="../../../../../../../../lib/Magento/Data/etc/argument/types.xsd"/>
+    <xs:element name="arguments" type="argumentsType"/>
+</xs:schema>
diff --git a/dev/tests/unit/testsuite/Magento/Data/Argument/_files/types_valid.xml b/dev/tests/unit/testsuite/Magento/Data/Argument/_files/types_valid.xml
new file mode 100644
index 00000000000..d83dfac6d71
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Data/Argument/_files/types_valid.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Valid argument types declaration
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<arguments xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <argument name="string " xsi:type="string">String</argument>
+    <argument name="string with translate" xsi:type="string" translate="true">String with translate</argument>
+    <argument name="string with translate false (for overriding)" xsi:type="string" translate="false">String with translate false</argument>
+    <argument name="boolean true" xsi:type="boolean">true</argument>
+    <argument name="boolean false" xsi:type="boolean">false</argument>
+    <argument name="boolean 0" xsi:type="boolean">0</argument>
+    <argument name="boolean 1" xsi:type="boolean">1</argument>
+    <argument name="number" xsi:type="number">100500</argument>
+    <argument name="object" xsi:type="object">Object</argument>
+    <argument name="null Different symbols 1~!@#$%^&amp;*()_+-=`[]\{}|;':,./&lt;&gt;?" xsi:type="null" />
+    <argument name="single_array" xsi:type="array">
+        <item name="key1 unique for single array" xsi:type="string">value</item>
+        <item name="Different symbols 1~!@#$%^&amp;*()_+-=`[]\{}|;':,./&lt;&gt;?" xsi:type="string">2</item>
+    </argument>
+    <argument name="nested_array" xsi:type="array">
+        <item name="key1 unique for single array" xsi:type="array">
+            <item name="key1 unique for single array" xsi:type="string">value</item>
+            <item name="Different symbols 1~!@#$%^&amp;*()_+-=`[]\{}|;':,./&lt;&gt;?" xsi:type="string">2</item>
+        </item>
+        <item name="backend2" xsi:type="array">
+            <item name="key1 unique for single array" xsi:type="string">value</item>
+            <item name="Different symbols 1~!@#$%^&amp;*()_+-=`[]\{}|;':,./&lt;&gt;?" xsi:type="array">
+                <item name="key1 unique for single array" xsi:type="string">value</item>
+                <item name="Different symbols 1~!@#$%^&amp;*()_+-=`[]\{}|;':,./&lt;&gt;?" xsi:type="string">2</item>
+            </item>
+        </item>
+    </argument>
+</arguments>
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Resource/Product/Flat/IndexerTest.php b/dev/tests/unit/testsuite/Magento/DesignEditor/Model/AreaEmulatorTest.php
similarity index 50%
rename from dev/tests/integration/testsuite/Magento/Catalog/Model/Resource/Product/Flat/IndexerTest.php
rename to dev/tests/unit/testsuite/Magento/DesignEditor/Model/AreaEmulatorTest.php
index f2a58597cb5..256f1ff5317 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Resource/Product/Flat/IndexerTest.php
+++ b/dev/tests/unit/testsuite/Magento/DesignEditor/Model/AreaEmulatorTest.php
@@ -21,30 +21,40 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-namespace Magento\Catalog\Model\Resource\Product\Flat;
 
-class IndexerTest extends \PHPUnit_Framework_TestCase
+namespace Magento\DesignEditor\Model;
+
+class AreaEmulatorTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \Magento\Catalog\Model\Resource\Product\Flat\Indexer
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_objectManager;
+
+    /**
+     * @var AreaEmulator
      */
     protected $_model;
 
     protected function setUp()
     {
-        $this->_model = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
-            ->create('Magento\Catalog\Model\Resource\Product\Flat\Indexer');
+        $this->_objectManager = $this->getMock('Magento\ObjectManager');
+        $this->_model = new AreaEmulator($this->_objectManager);
     }
 
-    public function testGetAttributeCodes()
+    public function testEmulateLayoutArea()
     {
-        $actualResult = $this->_model->getAttributeCodes();
-        $this->assertContains('name', $actualResult);
-        $this->assertContains('price', $actualResult);
-        $nameAttributeId = array_search('name', $actualResult);
-        $priceAttributeId = array_search('price', $actualResult);
-        $this->assertGreaterThan(0, $nameAttributeId, 'Id of the attribute "name" must be valid');
-        $this->assertGreaterThan(0, $priceAttributeId, 'Id of the attribute "name" must be valid');
-        $this->assertNotEquals($nameAttributeId, $priceAttributeId, 'Attribute ids must be different');
+        $configuration = array(
+            'Magento\Core\Model\Layout' => array(
+                'arguments' => array(
+                    'area' => array(
+                        \Magento\ObjectManager\Config\Reader\Dom::TYPE_ATTRIBUTE => 'string',
+                        'value' => 'test_area'
+                    )
+                )
+            )
+        );
+        $this->_objectManager->expects($this->once())->method('configure')->with($configuration);
+        $this->_model->emulateLayoutArea('test_area');
     }
 }
diff --git a/dev/tests/unit/testsuite/Magento/DesignEditor/Model/StateTest.php b/dev/tests/unit/testsuite/Magento/DesignEditor/Model/StateTest.php
index c1c745efc1c..98d481632c0 100644
--- a/dev/tests/unit/testsuite/Magento/DesignEditor/Model/StateTest.php
+++ b/dev/tests/unit/testsuite/Magento/DesignEditor/Model/StateTest.php
@@ -73,9 +73,9 @@ class StateTest extends \PHPUnit_Framework_TestCase
     protected $_backendSession;
 
     /**
-     * @var \Magento\Core\Model\Layout\Factory|\PHPUnit_Framework_MockObject_MockObject
+     * @var AreaEmulator|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $_layoutFactory;
+    protected $_areaEmulator;
 
     /**
      * @var \Magento\DesignEditor\Model\Url\Factory|\PHPUnit_Framework_MockObject_MockObject
@@ -123,7 +123,7 @@ class StateTest extends \PHPUnit_Framework_TestCase
             'Magento\Backend\Model\Session', array('setData', 'getData', 'unsetData'),
             array(), '', false
         );
-        $this->_layoutFactory = $this->getMock('Magento\Core\Model\Layout\Factory', array('createLayout'),
+        $this->_areaEmulator = $this->getMock('Magento\DesignEditor\Model\AreaEmulator', array('emulateLayoutArea'),
             array(), '', false
         );
         $this->_urlModelFactory = $this->getMock('Magento\DesignEditor\Model\Url\Factory', array('replaceClassName'),
@@ -174,7 +174,7 @@ class StateTest extends \PHPUnit_Framework_TestCase
 
         $this->_model = new \Magento\DesignEditor\Model\State(
             $this->_backendSession,
-            $this->_layoutFactory,
+            $this->_areaEmulator,
             $this->_urlModelFactory,
             $this->_cacheStateMock,
             $this->_dataHelper,
@@ -188,7 +188,7 @@ class StateTest extends \PHPUnit_Framework_TestCase
     public function testConstruct()
     {
         $this->assertAttributeEquals($this->_backendSession, '_backendSession', $this->_model);
-        $this->assertAttributeEquals($this->_layoutFactory, '_layoutFactory', $this->_model);
+        $this->assertAttributeEquals($this->_areaEmulator, '_areaEmulator', $this->_model);
         $this->assertAttributeEquals($this->_urlModelFactory, '_urlModelFactory', $this->_model);
         $this->assertAttributeEquals($this->_cacheStateMock, '_cacheState', $this->_model);
         $this->assertAttributeEquals($this->_dataHelper, '_dataHelper', $this->_model);
@@ -253,9 +253,9 @@ class StateTest extends \PHPUnit_Framework_TestCase
             ->method('replaceClassName')
             ->with(self::URL_MODEL_NAVIGATION_MODE_CLASS_NAME);
 
-        $this->_layoutFactory->expects($this->once())
-            ->method('createLayout')
-            ->with(array('area' => self::AREA_CODE), self::LAYOUT_NAVIGATION_CLASS_NAME);
+        $this->_areaEmulator->expects($this->once())
+            ->method('emulateLayoutArea')
+            ->with(self::AREA_CODE);
         $controller = $this->getMock('Magento\Backend\Controller\Adminhtml\Action', array(), array(), '', false);
 
         $this->assertNull($this->_model->update(self::AREA_CODE, $request, $controller));
diff --git a/dev/tests/unit/testsuite/Magento/Downloadable/Model/Product/TypeTransitionManager/Plugin/DownloadableTest.php b/dev/tests/unit/testsuite/Magento/Downloadable/Model/Product/TypeTransitionManager/Plugin/DownloadableTest.php
new file mode 100644
index 00000000000..69b5cac8ede
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Downloadable/Model/Product/TypeTransitionManager/Plugin/DownloadableTest.php
@@ -0,0 +1,145 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Downloadable\Model\Product\TypeTransitionManager\Plugin;
+
+class DownloadableTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $requestMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $invocationChainMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $productMock;
+
+    /**
+     * @var \Magento\Downloadable\Model\Product\TypeTransitionManager\Plugin\Downloadable
+     */
+    protected $model;
+
+    protected function setUp()
+    {
+        $this->requestMock = $this->getMock(
+            'Magento\App\Request\Http',
+            array(),
+            array(),
+            '',
+            false
+        );
+        $this->model = new Downloadable($this->requestMock);
+        $this->productMock = $this->getMock(
+            'Magento\Catalog\Model\Product',
+            array('hasIsVirtual', 'getTypeId', 'setTypeId', '__wakeup'),
+            array(),
+            '',
+            false
+        );
+        $this->invocationChainMock = $this->getMock('Magento\Code\Plugin\InvocationChain', array(), array(), '', false);
+    }
+
+    /**
+     * @param string $currentTypeId
+     * @dataProvider compatibleTypeDataProvider
+     */
+    public function testAroundProcessProductWithProductThatCanBeTransformedToDownloadable($currentTypeId)
+    {
+        $this->requestMock->expects($this->any())->method('getPost')->with('downloadable')
+            ->will($this->returnValue('valid_downloadable_data'));
+        $this->productMock->expects($this->any())->method('hasIsVirtual')->will($this->returnValue(true));
+        $this->productMock->expects($this->once())->method('getTypeId')->will($this->returnValue($currentTypeId));
+        $this->productMock->expects($this->once())->method('setTypeId')
+            ->with(\Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE);
+        $this->invocationChainMock->expects($this->never())->method('proceed');
+        $this->model->aroundProcessProduct(array($this->productMock), $this->invocationChainMock);
+    }
+
+    /**
+     * @return array
+     */
+    public function compatibleTypeDataProvider()
+    {
+        return array(
+            array(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE),
+            array(\Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL),
+            array(\Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE),
+        );
+    }
+
+    /**
+     * @param bool $isVirtual
+     * @param string $currentTypeId
+     * @param string|null $downloadableData
+     * @dataProvider productThatCannotBeTransformedToDownloadableDataProvider
+     */
+    public function testAroundProcessProductWithProductThatCannotBeTransformedToDownloadable(
+        $isVirtual,
+        $currentTypeId,
+        $downloadableData
+    ) {
+        $this->requestMock->expects($this->any())->method('getPost')->with('downloadable')
+            ->will($this->returnValue($downloadableData));
+        $this->productMock->expects($this->any())->method('hasIsVirtual')->will($this->returnValue($isVirtual));
+        $this->productMock->expects($this->once())->method('getTypeId')->will($this->returnValue($currentTypeId));
+        $this->productMock->expects($this->never())->method('setTypeId');
+        $arguments = array($this->productMock);
+        $this->invocationChainMock->expects($this->once())->method('proceed')->with($arguments);
+        $this->model->aroundProcessProduct($arguments, $this->invocationChainMock);
+    }
+
+    /**
+     * @return array
+     */
+    public function productThatCannotBeTransformedToDownloadableDataProvider()
+    {
+        return array(
+            array(
+                true,
+                'custom_product_type',
+                'valid_downloadable_data',
+            ),
+            array(
+                false,
+                \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE,
+                null,
+            ),
+            array(
+                true,
+                \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE,
+                null,
+            ),
+            array(
+                false,
+                \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE,
+                'valid_downloadable_data',
+            ),
+        );
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Eav/Model/Entity/Attribute/Source/BooleanTest.php b/dev/tests/unit/testsuite/Magento/Eav/Model/Entity/Attribute/Source/BooleanTest.php
new file mode 100644
index 00000000000..ac8ea80c9ca
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Eav/Model/Entity/Attribute/Source/BooleanTest.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Eav
+ * @subpackage  unit_tests
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Eav\Model\Entity\Attribute\Source;
+
+use Magento\TestFramework\Helper\ObjectManager;
+
+class BooleanTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Eav\Model\Entity\Attribute\Source\Boolean
+     */
+    protected $_model;
+
+    public function setUp()
+    {
+        $objectManager = new ObjectManager($this);
+        $this->_model = $objectManager->getObject('Magento\Eav\Model\Entity\Attribute\Source\Boolean');
+    }
+
+    public function testGetFlatColums()
+    {
+        $abstractAttributeMock = $this->getMock(
+            '\Magento\Eav\Model\Entity\Attribute\AbstractAttribute',
+            array('getAttributeCode', '__wakeup'), array(), '', false
+        );
+
+        $abstractAttributeMock->expects($this->any())
+            ->method('getAttributeCode')
+            ->will($this->returnValue('code'));
+
+        $this->_model->setAttribute($abstractAttributeMock);
+
+        $flatColums = $this->_model->getFlatColums();
+
+        $this->assertTrue(is_array($flatColums), 'FlatColums must be an array value');
+        $this->assertTrue(!empty($flatColums), 'FlatColums must be not empty');
+        foreach ($flatColums as $result) {
+            $this->assertArrayHasKey('unsigned', $result, 'FlatColums must have "unsigned" column');
+            $this->assertArrayHasKey('default', $result, 'FlatColums must have "default" column');
+            $this->assertArrayHasKey('extra', $result, 'FlatColums must have "extra" column');
+            $this->assertArrayHasKey('type', $result, 'FlatColums must have "type" column');
+            $this->assertArrayHasKey('nullable', $result, 'FlatColums must have "nullable" column');
+            $this->assertArrayHasKey('comment', $result, 'FlatColums must have "comment" column');
+            $this->assertArrayHasKey('length', $result, 'FlatColums must have "length" column');
+        }
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Eav/Model/Entity/Attribute/Source/TableTest.php b/dev/tests/unit/testsuite/Magento/Eav/Model/Entity/Attribute/Source/TableTest.php
new file mode 100644
index 00000000000..6022a03c8c0
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Eav/Model/Entity/Attribute/Source/TableTest.php
@@ -0,0 +1,82 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Eav
+ * @subpackage  unit_tests
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Eav\Model\Entity\Attribute\Source;
+
+use Magento\TestFramework\Helper\ObjectManager;
+
+class TableTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Eav\Model\Entity\Attribute\Source\Table
+     */
+    protected $_model;
+
+    public function setUp()
+    {
+        $objectManager = new ObjectManager($this);
+        $this->_model = $objectManager->getObject('Magento\Eav\Model\Entity\Attribute\Source\Table');
+    }
+
+    public function testGetFlatColums()
+    {
+        $abstractFrontendMock = $this->getMock(
+            'Magento\Eav\Model\Entity\Attribute\Frontend\AbstractFrontend',
+            array(), array(), '', false
+        );
+
+        $abstractAttributeMock = $this->getMock(
+            '\Magento\Eav\Model\Entity\Attribute\AbstractAttribute',
+            array('getFrontend', 'getAttributeCode', '__wakeup'), array(), '', false
+        );
+
+        $abstractAttributeMock->expects($this->any())
+            ->method('getFrontend')
+            ->will($this->returnValue($abstractFrontendMock));
+
+        $abstractAttributeMock->expects($this->any())
+            ->method('getAttributeCode')
+            ->will($this->returnValue('code'));
+
+        $this->_model->setAttribute($abstractAttributeMock);
+
+        $flatColums = $this->_model->getFlatColums();
+
+        $this->assertTrue(is_array($flatColums), 'FlatColums must be an array value');
+        $this->assertTrue(!empty($flatColums), 'FlatColums must be not empty');
+
+        foreach ($flatColums as $result) {
+            $this->assertArrayHasKey('unsigned', $result, 'FlatColums must have "unsigned" column');
+            $this->assertArrayHasKey('default', $result, 'FlatColums must have "default" column');
+            $this->assertArrayHasKey('extra', $result, 'FlatColums must have "extra" column');
+            $this->assertArrayHasKey('type', $result, 'FlatColums must have "type" column');
+            $this->assertArrayHasKey('nullable', $result, 'FlatColums must have "nullable" column');
+            $this->assertArrayHasKey('comment', $result, 'FlatColums must have "comment" column');
+            $this->assertArrayHasKey('length', $result, 'FlatColums must have "length" column');
+        }
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Eav/Model/Resource/Entity/AttributeTest.php b/dev/tests/unit/testsuite/Magento/Eav/Model/Resource/Entity/AttributeTest.php
index 13131375ea7..12e4f2f78fb 100644
--- a/dev/tests/unit/testsuite/Magento/Eav/Model/Resource/Entity/AttributeTest.php
+++ b/dev/tests/unit/testsuite/Magento/Eav/Model/Resource/Entity/AttributeTest.php
@@ -47,7 +47,7 @@ class AttributeTest extends \PHPUnit_Framework_TestCase
             'frontend_input' => 'select',
             'frontend_label' => 'Status',
             'frontend_class' => null,
-            'source_model' => 'Magento\Catalog\Model\Product\Status',
+            'source_model' => 'Magento\Catalog\Model\Product\Attribute\Source\Status',
             'is_required' => 1,
             'is_user_defined' => 0,
             'is_unique' => 0,
diff --git a/dev/tests/unit/testsuite/Magento/Email/Model/Template/Config/XsdTest.php b/dev/tests/unit/testsuite/Magento/Email/Model/Template/Config/XsdTest.php
index a25cdb3b4ba..f6430d81c60 100644
--- a/dev/tests/unit/testsuite/Magento/Email/Model/Template/Config/XsdTest.php
+++ b/dev/tests/unit/testsuite/Magento/Email/Model/Template/Config/XsdTest.php
@@ -118,7 +118,7 @@ class XsdTest extends \PHPUnit_Framework_TestCase
      */
     protected function _testXmlAgainstXsd($fixtureXml, $schemaFile, array $expectedErrors)
     {
-        $dom = new \Magento\Config\Dom($fixtureXml, array(), null, '%message%');
+        $dom = new \Magento\Config\Dom($fixtureXml, array(), null, null, '%message%');
         $actualResult = $dom->validate($schemaFile, $actualErrors);
         $this->assertEquals(empty($expectedErrors), $actualResult);
         $this->assertEquals($expectedErrors, $actualErrors);
diff --git a/dev/tests/unit/testsuite/Magento/GroupedProduct/Model/Product/Type/GroupedTest.php b/dev/tests/unit/testsuite/Magento/GroupedProduct/Model/Product/Type/GroupedTest.php
index dada066bdde..54a1a7e6e8b 100644
--- a/dev/tests/unit/testsuite/Magento/GroupedProduct/Model/Product/Type/GroupedTest.php
+++ b/dev/tests/unit/testsuite/Magento/GroupedProduct/Model/Product/Type/GroupedTest.php
@@ -67,7 +67,7 @@ class GroupedTest extends \PHPUnit_Framework_TestCase
         $productFactoryMock = $this->getMock('Magento\Catalog\Model\ProductFactory', array(), array(), '', false);
         $this->catalogProductLink = $this->getMock('\Magento\GroupedProduct\Model\Resource\Product\Link',
             array(), array(), '', false);
-        $this->productStatusMock = $this->getMock('\Magento\Catalog\Model\Product\Status',
+        $this->productStatusMock = $this->getMock('\Magento\Catalog\Model\Product\Attribute\Source\Status',
             array(), array(), '', false);
         $this->_model = $this->objectHelper->getObject('Magento\GroupedProduct\Model\Product\Type\Grouped', array(
             'eventManager' => $eventManager,
@@ -155,8 +155,8 @@ class GroupedTest extends \PHPUnit_Framework_TestCase
     public function testGetStatusFiltersNoData()
     {
         $result = array(
-            \Magento\Catalog\Model\Product\Status::STATUS_ENABLED,
-            \Magento\Catalog\Model\Product\Status::STATUS_DISABLED
+            \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED,
+            \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_DISABLED
         );
         $this->product->expects($this->once())->method('hasData')->will($this->returnValue(false));
         $this->assertEquals($result, $this->_model->getStatusFilters($this->product));
@@ -165,8 +165,8 @@ class GroupedTest extends \PHPUnit_Framework_TestCase
     public function testGetStatusFiltersWithData()
     {
         $result = array(
-            \Magento\Catalog\Model\Product\Status::STATUS_ENABLED,
-            \Magento\Catalog\Model\Product\Status::STATUS_DISABLED
+            \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED,
+            \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_DISABLED
         );
         $this->product->expects($this->once())->method('hasData')->will($this->returnValue(true));
         $this->product->expects($this->once())->method('getData')->will($this->returnValue($result));
diff --git a/dev/tests/unit/testsuite/Magento/Http/PhpEnvironment/RemoteAddressTest.php b/dev/tests/unit/testsuite/Magento/Http/PhpEnvironment/RemoteAddressTest.php
index 66f6e3da653..36141580eee 100644
--- a/dev/tests/unit/testsuite/Magento/Http/PhpEnvironment/RemoteAddressTest.php
+++ b/dev/tests/unit/testsuite/Magento/Http/PhpEnvironment/RemoteAddressTest.php
@@ -35,7 +35,7 @@ class RemoteAddressTest extends \PHPUnit_Framework_TestCase
     protected $_request;
 
     /**
-     * @var TestFramework\Helper\ObjectManager
+     * @var \Magento\TestFramework\Helper\ObjectManager
      */
     protected $_objectManager;
 
diff --git a/dev/tests/unit/testsuite/Magento/Indexer/App/IndexerTest.php b/dev/tests/unit/testsuite/Magento/Indexer/App/IndexerTest.php
index ebf5fd098c1..94c371fd8c6 100644
--- a/dev/tests/unit/testsuite/Magento/Indexer/App/IndexerTest.php
+++ b/dev/tests/unit/testsuite/Magento/Indexer/App/IndexerTest.php
@@ -40,14 +40,8 @@ class IndexerTest extends \PHPUnit_Framework_TestCase
      */
     protected $filesystemMock;
 
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\App\Console\Response
-     */
-    protected $responseMock;
-
     protected function setUp()
     {
-        $this->responseMock = $this->getMock('Magento\App\Console\Response', array('setCode'), array(), '', false);
         $this->filesystemMock = $this->getMock('Magento\Filesystem', array('getDirectoryWrite'), array(), '', false);
         $directoryMock = $this->getMock('Magento\Filesystem\Directory\Write', array(), array(), '', false);
         $directoryMock->expects($this->any())
@@ -60,17 +54,13 @@ class IndexerTest extends \PHPUnit_Framework_TestCase
         $this->entryPoint = new \Magento\Indexer\App\Indexer(
             'reportDir',
             $this->filesystemMock,
-            $this->processorMock,
-            $this->responseMock
+            $this->processorMock
         );
     }
 
-    public function testLaunch()
+    public function testExecute()
     {
-        $this->responseMock->expects($this->once())
-            ->method('setCode')
-            ->with(0);
         $this->processorMock->expects($this->once())->method('reindexAll');
-        $this->assertSame($this->responseMock, $this->entryPoint->launch());
+        $this->assertEquals('0', $this->entryPoint->launch());
     }
 }
diff --git a/dev/tests/unit/testsuite/Magento/Indexer/App/ShellTest.php b/dev/tests/unit/testsuite/Magento/Indexer/App/ShellTest.php
index c29a7f48901..50385bfd881 100644
--- a/dev/tests/unit/testsuite/Magento/Indexer/App/ShellTest.php
+++ b/dev/tests/unit/testsuite/Magento/Indexer/App/ShellTest.php
@@ -38,11 +38,6 @@ class ShellTest extends \PHPUnit_Framework_TestCase
     /**
      * @var \PHPUnit_Framework_MockObject_MockObject
      */
-    protected $errorHandlerMock;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\App\Console\Response
-     */
     protected $responseMock;
 
     protected function setUp()
@@ -69,10 +64,6 @@ class ShellTest extends \PHPUnit_Framework_TestCase
             ->will($this->returnValue($shellHasErrors));
         $shell->expects($this->once())
             ->method('run');
-        $this->responseMock->expects($this->once())
-            ->method('setCode')
-            ->with($shellHasErrors ? -1 : 0)
-            ->will($this->returnSelf());
         $this->shellFactoryMock->expects($this->any())
             ->method('create')
             ->will($this->returnValue($shell)
diff --git a/dev/tests/unit/testsuite/Magento/Indexer/Model/IndexerTest.php b/dev/tests/unit/testsuite/Magento/Indexer/Model/IndexerTest.php
index b6730672bef..df54dba5791 100644
--- a/dev/tests/unit/testsuite/Magento/Indexer/Model/IndexerTest.php
+++ b/dev/tests/unit/testsuite/Magento/Indexer/Model/IndexerTest.php
@@ -114,20 +114,15 @@ class IndexerTest extends \PHPUnit_Framework_TestCase
         $indexId = 'indexer_internal_name';
         $stateMock = $this->getMock(
             '\Magento\Indexer\Model\Indexer\State',
-            array('load', 'getId', 'setIndexerId', '__wakeup'),
+            array('loadByIndexer', 'getId', '__wakeup'),
             array(),
             '',
             false
         );
         $stateMock->expects($this->once())
-            ->method('load')
-            ->with($indexId, 'indexer_id')
+            ->method('loadByIndexer')
+            ->with($indexId)
             ->will($this->returnSelf());
-        $stateMock->expects($this->never())
-            ->method('setIndexerId');
-        $stateMock->expects($this->once())
-            ->method('getId')
-            ->will($this->returnValue(1));
         $this->stateFactoryMock->expects($this->once())
             ->method('create')
             ->will($this->returnValue($stateMock));
diff --git a/dev/tests/unit/testsuite/Magento/Indexer/Model/ProcessorTest.php b/dev/tests/unit/testsuite/Magento/Indexer/Model/ProcessorTest.php
index 20e16b719a2..e1d81de94d9 100644
--- a/dev/tests/unit/testsuite/Magento/Indexer/Model/ProcessorTest.php
+++ b/dev/tests/unit/testsuite/Magento/Indexer/Model/ProcessorTest.php
@@ -75,8 +75,8 @@ class ProcessorTest extends \PHPUnit_Framework_TestCase
     public function testReindexAllInvalid()
     {
         $indexers = array(
-            'indexer1',
-            'indexer2',
+            'indexer1' => array(),
+            'indexer2' => array(),
         );
 
         $this->configMock->expects($this->once())
diff --git a/dev/tests/unit/testsuite/Magento/Integration/Model/Config/XsdTest.php b/dev/tests/unit/testsuite/Magento/Integration/Model/Config/XsdTest.php
index 99575cd3752..e852cc323be 100644
--- a/dev/tests/unit/testsuite/Magento/Integration/Model/Config/XsdTest.php
+++ b/dev/tests/unit/testsuite/Magento/Integration/Model/Config/XsdTest.php
@@ -46,7 +46,7 @@ class XsdTest extends \PHPUnit_Framework_TestCase
     public function testExemplarXml($fixtureXml, array $expectedErrors)
     {
         $messageFormat = '%message%';
-        $dom = new \Magento\Config\Dom($fixtureXml, array(), null, $messageFormat);
+        $dom = new \Magento\Config\Dom($fixtureXml, array(), null, null, $messageFormat);
         $actualResult = $dom->validate($this->_schemaFile, $actualErrors);
         $this->assertEquals(empty($expectedErrors), $actualResult, "Validation result is invalid.");
         $this->assertEquals($expectedErrors, $actualErrors, "Validation errors does not match.");
diff --git a/dev/tests/unit/testsuite/Magento/Integration/Oauth/OauthTest.php b/dev/tests/unit/testsuite/Magento/Integration/Oauth/OauthTest.php
index 958eba91d12..54ffb49e64d 100644
--- a/dev/tests/unit/testsuite/Magento/Integration/Oauth/OauthTest.php
+++ b/dev/tests/unit/testsuite/Magento/Integration/Oauth/OauthTest.php
@@ -281,6 +281,7 @@ class OauthTest extends \PHPUnit_Framework_TestCase
      */
     public function testGetRequestTokenOauthTimestampRefused($timestamp)
     {
+        $this->markTestIncomplete('MAGETWO-19388');
         $this->_setupConsumer();
         $this->_makeValidExpirationPeriod();
 
diff --git a/dev/tests/unit/testsuite/Magento/Interception/Config/ConfigTest.php b/dev/tests/unit/testsuite/Magento/Interception/Config/ConfigTest.php
index 69bb7733075..9f38c483d58 100644
--- a/dev/tests/unit/testsuite/Magento/Interception/Config/ConfigTest.php
+++ b/dev/tests/unit/testsuite/Magento/Interception/Config/ConfigTest.php
@@ -39,48 +39,16 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
      */
     protected $_model;
 
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $_configScopeMock;
-
     protected function setUp()
     {
-        $fixtureBasePath = __DIR__ . '/..';
-        $fileResolverMock = $this->getMock('Magento\Config\FileResolverInterface');
-        $fileResolverMock->expects($this->any())
-            ->method('get')
-            ->will($this->returnValueMap(array(
-                array(
-                    'di.xml',
-                    'global',
-                    array(file_get_contents($fixtureBasePath . '/Custom/Module/etc/di.xml'))
-                ),
-                array(
-                    'di.xml',
-                    'backend',
-                    array(file_get_contents($fixtureBasePath . '/Custom/Module/etc/backend/di.xml'))
-                ),
-                array(
-                    'di.xml',
-                    'frontend',
-                    array(file_get_contents($fixtureBasePath . '/Custom/Module/etc/frontend/di.xml'))
-                ),
-            )));
+        $readerMap = include(__DIR__ . '/../_files/reader_mock_map.php');
+        $readerMock = $this->getMock('\Magento\ObjectManager\Config\Reader\Dom', array(), array(), '', false);
+        $readerMock->expects($this->any())
+            ->method('read')
+            ->will($this->returnValueMap($readerMap));
 
-        $validationStateMock = $this->getMock('Magento\Config\ValidationStateInterface');
-        $validationStateMock->expects($this->any())
-            ->method('isValidated')
-            ->will($this->returnValue(true));
-
-        $reader = new \Magento\ObjectManager\Config\Reader\Dom(
-            $fileResolverMock,
-            new \Magento\ObjectManager\Config\Mapper\Dom(),
-            new \Magento\ObjectManager\Config\SchemaLocator(),
-            $validationStateMock
-        );
-        $this->_configScopeMock = $this->getMock('Magento\Config\ScopeListInterface');
-        $this->_configScopeMock->expects($this->any())
+        $configScopeMock = $this->getMock('Magento\Config\ScopeListInterface');
+        $configScopeMock->expects($this->any())
             ->method('getAllScopes')
             ->will($this->returnValue(array('global', 'backend', 'frontend')));
         $cacheMock = $this->getMock('Magento\Cache\FrontendInterface');
@@ -94,8 +62,8 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
             ->method('getInstanceType')
             ->will($this->returnArgument(0));
         $this->_model = new \Magento\Interception\Config\Config(
-            $reader,
-            $this->_configScopeMock,
+            $readerMock,
+            $configScopeMock,
             $cacheMock,
             new \Magento\ObjectManager\Relations\Runtime(),
             $omConfigMock,
diff --git a/dev/tests/unit/testsuite/Magento/Interception/FactoryDecoratorTest.php b/dev/tests/unit/testsuite/Magento/Interception/FactoryDecoratorTest.php
new file mode 100644
index 00000000000..c9aaa6cfe81
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Interception/FactoryDecoratorTest.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Interception;
+
+class FactoryDecoratorTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $config;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $factory;
+
+    /**
+     * @var FactoryDecorator
+     */
+    private $decorator;
+
+    protected function setUp()
+    {
+        $this->factory = $this->getMockForAbstractClass('\Magento\ObjectManager\Factory');
+        $this->config = $this->getMockForAbstractClass('\Magento\Interception\Config');
+        $pluginList = $this->getMockForAbstractClass('\Magento\Interception\PluginList');
+        $objectManager = $this->getMockForAbstractClass('\Magento\ObjectManager');
+        $this->decorator = new FactoryDecorator($this->factory, $this->config, $pluginList, $objectManager);
+    }
+
+    public function testCreateDecorated()
+    {
+        $this->config->expects($this->once())->method('hasPlugins')->with('type')->will($this->returnValue(true));
+        $this->config
+            ->expects($this->once())
+            ->method('getInterceptorClassName')
+            ->with('type')
+            ->will($this->returnValue('StdClass'))
+        ;
+        $this->assertInstanceOf('StdClass', $this->decorator->create('type'));
+    }
+
+    public function testCreateClean()
+    {
+        $this->config->expects($this->once())->method('hasPlugins')->with('type')->will($this->returnValue(false));
+        $this->config->expects($this->never())->method('getInterceptorClassName');
+        $this->factory
+            ->expects($this->once())
+            ->method('create')
+            ->with('type', array(1, 2, 3))
+            ->will($this->returnValue('test'))
+        ;
+        $this->assertEquals('test', $this->decorator->create('type', array(1, 2, 3)));
+    }
+} 
diff --git a/dev/tests/unit/testsuite/Magento/Interception/PluginList/PluginListTest.php b/dev/tests/unit/testsuite/Magento/Interception/PluginList/PluginListTest.php
index 17bd200f11d..d3aa909dedc 100644
--- a/dev/tests/unit/testsuite/Magento/Interception/PluginList/PluginListTest.php
+++ b/dev/tests/unit/testsuite/Magento/Interception/PluginList/PluginListTest.php
@@ -46,31 +46,12 @@ class PluginListTest extends \PHPUnit_Framework_TestCase
 
     protected function setUp()
     {
-        $fixtureBasePath        = __DIR__ . '/..';
-        $moduleEtcPath          = $fixtureBasePath . '/Custom/Module/etc/di.xml';
-        $moduleBackendEtcPath   = $fixtureBasePath . '/Custom/Module/etc/backend/di.xml';
-        $moduleFrontendEtcPath  = $fixtureBasePath . '/Custom/Module/etc/frontend/di.xml';
+        $readerMap = include(__DIR__ . '/../_files/reader_mock_map.php');
+        $readerMock = $this->getMock('\Magento\ObjectManager\Config\Reader\Dom', array(), array(), '', false);
+        $readerMock->expects($this->any())
+            ->method('read')
+            ->will($this->returnValueMap($readerMap));
 
-        $fileResolverMock = $this->getMock('Magento\Config\FileResolverInterface');
-        $fileResolverMock->expects($this->any())
-            ->method('get')
-            ->will($this->returnValueMap(array(
-                array('di.xml', 'global', array($moduleEtcPath => file_get_contents($moduleEtcPath))),
-                array('di.xml', 'backend', array($moduleBackendEtcPath => file_get_contents($moduleBackendEtcPath))),
-                array('di.xml', 'frontend', array($moduleFrontendEtcPath => file_get_contents($moduleFrontendEtcPath))),
-            )));
-
-        $validationStateMock = $this->getMock('Magento\Config\ValidationStateInterface');
-        $validationStateMock->expects($this->any())
-            ->method('isValidated')
-            ->will($this->returnValue(true));
-
-        $reader = new \Magento\ObjectManager\Config\Reader\Dom(
-            $fileResolverMock,
-            new \Magento\ObjectManager\Config\Mapper\Dom(),
-            new \Magento\ObjectManager\Config\SchemaLocator(),
-            $validationStateMock
-        );
         $this->_configScopeMock = $this->getMock('\Magento\Config\ScopeInterface');
         $cacheMock = $this->getMock('Magento\Config\CacheInterface');
         // turn cache off
@@ -83,7 +64,7 @@ class PluginListTest extends \PHPUnit_Framework_TestCase
             ->method('getInstanceType')
             ->will($this->returnArgument(0));
         $this->_model = new \Magento\Interception\PluginList\PluginList(
-            $reader,
+            $readerMock,
             $this->_configScopeMock,
             $cacheMock,
             new \Magento\ObjectManager\Relations\Runtime(),
diff --git a/dev/tests/unit/testsuite/Magento/Interception/_files/reader_mock_map.php b/dev/tests/unit/testsuite/Magento/Interception/_files/reader_mock_map.php
new file mode 100644
index 00000000000..a50a11c7cda
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Interception/_files/reader_mock_map.php
@@ -0,0 +1,79 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+return array(
+    array(
+        'global',
+        array(
+            'Magento\Interception\Custom\Module\Model\Item' => array(
+                'plugins' => array(
+                    'simple_plugin' => array(
+                        'sortOrder' => 10,
+                        'instance' => 'Magento\Interception\Custom\Module\Model\ItemPlugin\Simple'
+                    )
+                )
+            )
+        )
+    ),
+    array(
+        'backend',
+        array(
+            'Magento\Interception\Custom\Module\Model\Item' => array(
+                'plugins' => array(
+                    'advanced_plugin' => array(
+                        'sortOrder' => 5,
+                        'instance' => 'Magento\Interception\Custom\Module\Model\ItemPlugin\Advanced'
+                    )
+                )
+            ),
+            'Magento\Interception\Custom\Module\Model\ItemContainer' => array(
+                'plugins' => array(
+                    'simple_plugin' => array(
+                        'sortOrder' => 15,
+                        'instance' => 'Magento\Interception\Custom\Module\Model\ItemContainerPlugin\Simple'
+                    )
+                )
+            )
+        )
+    ),
+    array(
+        'frontend',
+        array(
+            'Magento\Interception\Custom\Module\Model\Item' => array(
+                'plugins' => array(
+                    'simple_plugin' => array(
+                        'disabled' => true,
+                    )
+                )
+            ),
+            'Magento\Interception\Custom\Module\Model\Item\Enhanced' => array(
+                'plugins' => array(
+                    'advanced_plugin' => array(
+                        'sortOrder' => 5,
+                        'instance' => 'Magento\Interception\Custom\Module\Model\ItemPlugin\Advanced'
+                    )
+                )
+            )
+        )
+    ),
+);
diff --git a/dev/tests/unit/testsuite/Magento/Multishipping/Helper/DataTest.php b/dev/tests/unit/testsuite/Magento/Multishipping/Helper/DataTest.php
new file mode 100644
index 00000000000..ac64f654fbd
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Multishipping/Helper/DataTest.php
@@ -0,0 +1,153 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Multishipping\Helper;
+
+/**
+ * Multishipping data helper Test
+ */
+class DataTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * Multishipping data helper
+     *
+     * @var \Magento\Multishipping\Helper\Data
+     */
+    protected $helper;
+
+    /**
+     * Core store config mock
+     *
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Core\Model\Store\Config
+     */
+    protected $coreStoreConfigMock;
+
+    /**
+     * Context mock
+     *
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\App\Helper\Context
+     */
+    protected $contextMock;
+
+    /**
+     * Quote mock
+     *
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Sales\Model\Quote
+     */
+    protected $quoteMock;
+
+    /**
+     * Checkout session mock
+     *
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Checkout\Model\Session
+     */
+    protected $checkoutSessionMock;
+
+    public function setUp()
+    {
+        $this->contextMock = $this->getMock('Magento\App\Helper\Context', array(), array(), '', false);
+        $this->coreStoreConfigMock = $this->getMock('\Magento\Core\Model\Store\Config', array(), array(), '', false);
+        $this->checkoutSessionMock = $this->getMock('\Magento\Checkout\Model\Session', array(), array(), '', false);
+        $this->quoteMock = $this->getMock('\Magento\Sales\Model\Quote', array(), array(), '', false);
+
+        $objectManager = new \Magento\TestFramework\Helper\ObjectManager($this);
+        $this->helper = $objectManager->getObject(
+            'Magento\Multishipping\Helper\Data',
+            array(
+                'context' => $this->contextMock,
+                'coreStoreConfig' => $this->coreStoreConfigMock,
+                'checkoutSession' => $this->checkoutSessionMock,
+            )
+        );
+    }
+
+    public function testGetMaximumQty()
+    {
+        $maximumQty = 10;
+        $this->coreStoreConfigMock->expects($this->once())->method('getConfig')
+            ->with(\Magento\Multishipping\Helper\Data::XML_PATH_CHECKOUT_MULTIPLE_MAXIMUM_QUANTITY)
+            ->will($this->returnValue($maximumQty));
+
+        $this->assertEquals($maximumQty, $this->helper->getMaximumQty());
+    }
+
+    /**
+     * @param bool $result
+     * @param bool $quoteHasItems
+     * @param bool $isMultiShipping
+     * @param bool $hasItemsWithDecimalQty
+     * @param bool $validateMinimumAmount
+     * @param int $itemsSummaryQty
+     * @param int $itemVirtualQty
+     * @param int $maximumQty
+     * @param bool $hasNominalItems
+     * @dataProvider isMultishippingCheckoutAvailableDataProvider
+     */
+    public function testIsMultishippingCheckoutAvailable($result, $quoteHasItems, $isMultiShipping,
+        $hasItemsWithDecimalQty, $validateMinimumAmount, $itemsSummaryQty, $itemVirtualQty, $maximumQty,
+        $hasNominalItems
+    ) {
+        $this->coreStoreConfigMock->expects($this->once())->method('getConfigFlag')
+            ->with(\Magento\Multishipping\Helper\Data::XML_PATH_CHECKOUT_MULTIPLE_AVAILABLE)
+            ->will($this->returnValue($isMultiShipping));
+        $this->checkoutSessionMock->expects($this->once())->method('getQuote')
+            ->will($this->returnValue($this->quoteMock));
+        $this->quoteMock->expects($this->once())->method('hasItems')->will($this->returnValue($quoteHasItems));
+
+        $this->quoteMock->expects($this->any())->method('hasItemsWithDecimalQty')
+            ->will($this->returnValue($hasItemsWithDecimalQty));
+        $this->quoteMock->expects($this->any())->method('validateMinimumAmount')->with(true)
+            ->will($this->returnValue($validateMinimumAmount));
+        $this->quoteMock->expects($this->any())->method('getItemsSummaryQty')
+            ->will($this->returnValue($itemsSummaryQty));
+        $this->quoteMock->expects($this->any())->method('getItemVirtualQty')
+            ->will($this->returnValue($itemVirtualQty));
+        $this->coreStoreConfigMock->expects($this->any())->method('getConfig')
+            ->with(\Magento\Multishipping\Helper\Data::XML_PATH_CHECKOUT_MULTIPLE_MAXIMUM_QUANTITY)
+            ->will($this->returnValue($maximumQty));
+        $this->quoteMock->expects($this->any())->method('hasNominalItems')->will($this->returnValue($hasNominalItems));
+
+        $this->assertEquals($result, $this->helper->isMultishippingCheckoutAvailable());
+    }
+
+    /**
+     * Data provider
+     *
+     * @return array
+     */
+    public function isMultishippingCheckoutAvailableDataProvider()
+    {
+        return array(
+            array(true, false, true, null, null, null, null, null, null),
+            array(false, false, false, null, null, null, null, null, null),
+            array(false, true, true, true, null, null, null, null, null),
+            array(false, true, true, false, false, null, null, null, null),
+            array(true, true, true, false, true, 2, 1, 3, null),
+            array(false, true, true, false, true, 1, 2, null, null),
+            array(false, true, true, false, true, 2, 1, 1, null),
+            array(true, true, true, false, true, 2, 1, 3, false),
+            array(false, true, true, false, true, 2, 1, 3, true),
+        );
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Mview/ViewTest.php b/dev/tests/unit/testsuite/Magento/Mview/ViewTest.php
index 95afcaace75..572cc3bca86 100644
--- a/dev/tests/unit/testsuite/Magento/Mview/ViewTest.php
+++ b/dev/tests/unit/testsuite/Magento/Mview/ViewTest.php
@@ -55,11 +55,6 @@ class ViewTest extends \PHPUnit_Framework_TestCase
      */
     protected $subscriptionFactoryMock;
 
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\App\Resource
-     */
-    protected $resourceMock;
-
     protected function setUp()
     {
         $this->configMock = $this->getMockForAbstractClass(
@@ -86,14 +81,12 @@ class ViewTest extends \PHPUnit_Framework_TestCase
         $this->subscriptionFactoryMock = $this->getMock(
             'Magento\Mview\View\SubscriptionFactory', array('create'), array(), '', false
         );
-        $this->resourceMock = $this->getMock('Magento\App\Resource', array('getTableName'), array(), '', false);
         $this->model = new View(
             $this->configMock,
             $this->actionFactoryMock,
             $this->stateMock,
             $this->changelogMock,
-            $this->subscriptionFactoryMock,
-            $this->resourceMock
+            $this->subscriptionFactoryMock
         );
     }
 
@@ -123,10 +116,6 @@ class ViewTest extends \PHPUnit_Framework_TestCase
 
     public function testSubscribe()
     {
-        $this->resourceMock->expects($this->once())
-            ->method('getTableName')
-            ->with('some_entity')
-            ->will($this->returnArgument(0));
         $this->stateMock->expects($this->once())
             ->method('getMode')
             ->will($this->returnValue('disabled'));
@@ -148,10 +137,6 @@ class ViewTest extends \PHPUnit_Framework_TestCase
 
     public function testUnsubscribe()
     {
-        $this->resourceMock->expects($this->once())
-            ->method('getTableName')
-            ->with('some_entity')
-            ->will($this->returnArgument(0));
         $this->stateMock->expects($this->once())
             ->method('getMode')
             ->will($this->returnValue('enabled'));
diff --git a/dev/tests/unit/testsuite/Magento/ObjectManager/Config/Argument/Interpreter/ObjectTest.php b/dev/tests/unit/testsuite/Magento/ObjectManager/Config/Argument/Interpreter/ObjectTest.php
new file mode 100644
index 00000000000..3e4c0835bdf
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/ObjectManager/Config/Argument/Interpreter/ObjectTest.php
@@ -0,0 +1,99 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ObjectManager\Config\Argument\Interpreter;
+
+use Magento\Stdlib\BooleanUtils;
+
+class ObjectTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @param array $data
+     * @param string $className
+     * @param bool $isShared
+     * @dataProvider evaluateDataProvider
+     */
+    public function testEvaluate($data, $className, $isShared)
+    {
+        $expected = new \StdClass;
+        $factory = $this->getMock(
+            '\Magento\ObjectManager\Config\Argument\ObjectFactory',
+            array('create'),
+            array(),
+            '',
+            false
+        );
+        $factory->expects($this->once())
+            ->method('create')
+            ->with($className, $isShared)
+            ->will($this->returnValue($expected))
+        ;
+        $interpreter = new Object(new BooleanUtils, $factory);
+        $this->assertSame($expected, $interpreter->evaluate($data));
+    }
+
+    /**
+     * @return array
+     */
+    public function evaluateDataProvider()
+    {
+        return array(
+            array(array('value' => 'Class'), 'Class', false),
+            array(array('value' => 'Class', 'shared' => false), 'Class', false),
+            array(array('value' => 'Class', 'shared' => 0), 'Class', false),
+            array(array('value' => 'Class', 'shared' => '0'), 'Class', false),
+            array(array('value' => 'Class', 'shared' => 'false'), 'Class', false),
+            array(array('value' => 'Class', 'shared' => true), 'Class', true),
+            array(array('value' => 'Class', 'shared' => 1), 'Class', true),
+            array(array('value' => 'Class', 'shared' => '1'), 'Class', true),
+            array(array('value' => 'Class', 'shared' => 'true'), 'Class', true),
+        );
+    }
+
+    /**
+     * @param array $data
+     * @dataProvider evaluateErrorDataProvider
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage Object class name is missing.
+     */
+    public function testEvaluateNoClass($data)
+    {
+        $factory = $this->getMock('\Magento\ObjectManager\Config\Argument\ObjectFactory', array(), array(), '', false);
+        $interpreter = new Object(new BooleanUtils, $factory);
+        $interpreter->evaluate($data);
+    }
+
+    /**
+     * @return array
+     */
+    public function evaluateErrorDataProvider()
+    {
+        return array(
+            array(array()),
+            array(array('value' => '')),
+            array(array('value' => false)),
+            array(array('value' => 0)),
+        );
+    }
+} 
diff --git a/dev/tests/unit/testsuite/Magento/ObjectManager/Config/Argument/ObjectFactoryTest.php b/dev/tests/unit/testsuite/Magento/ObjectManager/Config/Argument/ObjectFactoryTest.php
new file mode 100644
index 00000000000..454c5fa51c1
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/ObjectManager/Config/Argument/ObjectFactoryTest.php
@@ -0,0 +1,106 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ObjectManager\Config\Argument;
+
+class ObjectFactoryTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\ObjectManager
+     */
+    private $objectManager;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\ObjectManager\Config
+     */
+    private $config;
+
+    protected function setUp()
+    {
+        $this->objectManager = $this->getMockForAbstractClass('\Magento\ObjectManager');
+        $this->config = $this->getMockForAbstractClass('\Magento\ObjectManager\Config');
+    }
+
+    public function testSetGetObjectManager()
+    {
+        $factory = new ObjectFactory($this->config);
+        $factory->setObjectManager($this->objectManager);
+        $this->objectManager->expects($this->once())->method('create');
+        $factory->create('type', false);
+    }
+
+    /**
+     * @expectedException \LogicException
+     * @expectedExceptionMessage Object manager has not been assigned yet.
+     */
+    public function testGetObjectManagerException()
+    {
+        $factory = new ObjectFactory($this->config);
+        $factory->create('type', false);
+    }
+
+    /**
+     * @param bool $isShared
+     * @param string $expectedMethod
+     * @dataProvider createDataProvider
+     */
+    public function testCreateLookup($isShared, $expectedMethod)
+    {
+        $value = new \StdClass;
+        $factory = new ObjectFactory($this->config, $this->objectManager);
+        $this->objectManager->expects($this->once())
+            ->method($expectedMethod)
+            ->with('type')
+            ->will($this->returnValue($value))
+        ;
+        $this->config->expects($this->once())->method('isShared')->with('type')->will($this->returnValue($isShared));
+        $this->assertSame($value, $factory->create('type'));
+    }
+
+    /**
+     * Returns "is shared" and expectation of which ObjectManager method should be called depending on it
+     *
+     * @return array
+     */
+    public function createDataProvider()
+    {
+        return array(
+            array(true, 'get'),
+            array(false, 'create'),
+        );
+    }
+
+    /**
+     * @param bool $isShared
+     * @param string $expectedMethod
+     * @dataProvider createDataProvider
+     */
+    public function testCreateNoLookup($isShared, $expectedMethod)
+    {
+        $factory = new ObjectFactory($this->config, $this->objectManager);
+        $this->objectManager->expects($this->once())->method($expectedMethod)->with('type');
+        $this->config->expects($this->never())->method('isShared');
+        $factory->create('type', $isShared);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/ObjectManager/Config/ConfigTest.php b/dev/tests/unit/testsuite/Magento/ObjectManager/Config/ConfigTest.php
new file mode 100644
index 00000000000..14399ae3cd1
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/ObjectManager/Config/ConfigTest.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ObjectManager\Config;
+
+class ConfigTest extends \PHPUnit_Framework_TestCase
+{
+    public function testGetArgumentsEmpty()
+    {
+        $config = new Config;
+        $this->assertSame(array(), $config->getArguments('An invalid type'));
+    }
+
+    public function testExtendMergeConfiguration()
+    {
+        $this->_assertFooTypeArguments(new Config);
+    }
+
+    /**
+     * A primitive fixture for testing merging arguments
+     *
+     * @param Config $config
+     */
+    private function _assertFooTypeArguments(Config $config)
+    {
+        $expected = array('argName' => 'argValue');
+        $fixture = array('FooType' => array('arguments' => $expected));
+        $config->extend($fixture);
+        $this->assertEquals($expected, $config->getArguments('FooType'));
+    }
+
+    public function testExtendWithCacheMock()
+    {
+        $definitions = $this->getMockForAbstractClass('\Magento\ObjectManager\Definition');
+        $definitions->expects($this->once())->method('getClasses')->will($this->returnValue(array('FooType')));
+
+        $cache = $this->getMockForAbstractClass('\Magento\ObjectManager\ConfigCache');
+        $cache->expects($this->once())->method('get')->will($this->returnValue(false));
+
+        $config = new Config(null, $definitions);
+        $config->setCache($cache);
+
+        $this->_assertFooTypeArguments($config);
+    }
+} 
diff --git a/dev/tests/unit/testsuite/Magento/ObjectManager/Config/Mapper/ArgumentParserTest.php b/dev/tests/unit/testsuite/Magento/ObjectManager/Config/Mapper/ArgumentParserTest.php
new file mode 100644
index 00000000000..ec8b806d7d6
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/ObjectManager/Config/Mapper/ArgumentParserTest.php
@@ -0,0 +1,58 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ObjectManager\Config\Mapper;
+
+class ArgumentParserTest extends \PHPUnit_Framework_TestCase
+{
+    public function testParse()
+    {
+        $document = new \DOMDocument();
+        $document->load(__DIR__ . '/_files/argument_parser.xml');
+        $parser = new ArgumentParser;
+        $actual = $parser->parse($document->getElementsByTagName('argument')->item(0));
+        $expected = array(
+            'item' => array(
+                'one' => array(
+                    'name' => 'one',
+                    'value' => 'value1',
+                ),
+                'nested' => array(
+                    'name' => 'nested',
+                    'item' => array(
+                        'two' => array(
+                            'name' => 'two',
+                            'value' => 'value2',
+                        ),
+                        'three' => array(
+                            'name' => 'three',
+                            'value' => 'value3',
+                        ),
+                    ),
+                ),
+            ),
+        );
+        $this->assertSame($expected, $actual);
+    }
+} 
diff --git a/dev/tests/unit/testsuite/Magento/ObjectManager/Config/Mapper/DomTest.php b/dev/tests/unit/testsuite/Magento/ObjectManager/Config/Mapper/DomTest.php
index 680e25e983f..4a3ab53abea 100644
--- a/dev/tests/unit/testsuite/Magento/ObjectManager/Config/Mapper/DomTest.php
+++ b/dev/tests/unit/testsuite/Magento/ObjectManager/Config/Mapper/DomTest.php
@@ -32,7 +32,20 @@ class DomTest extends \PHPUnit_Framework_TestCase
 
     protected function setUp()
     {
-        $this->_mapper = new \Magento\ObjectManager\Config\Mapper\Dom();
+        $argumentParser = $this->getMock('\Magento\ObjectManager\Config\Mapper\ArgumentParser');
+        $argumentParser->expects($this->any())
+            ->method('parse')
+            ->will($this->returnCallback(array($this, 'parserMockCallback')));
+
+        $booleanUtils = $this->getMock('\Magento\Stdlib\BooleanUtils');
+        $booleanUtils->expects($this->any())
+            ->method('toBoolean')
+            ->will($this->returnValueMap(array(
+                array('true', true),
+                array('false', false),
+            )));
+
+        $this->_mapper = new Dom($booleanUtils, $argumentParser);
     }
 
     public function testConvert()
@@ -46,6 +59,19 @@ class DomTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals($expectedResult, $this->_mapper->convert($dom));
     }
 
+    /**
+     * Callback for mocking parse() method of the argument parser
+     *
+     * @param \DOMElement $argument
+     * @return string
+     */
+    public function parserMockCallback(\DOMElement $argument)
+    {
+        $this->assertNotEmpty($argument->getAttribute('name'));
+        $this->assertNotEmpty($argument->getAttribute('xsi:type'));
+        return 'test value';
+    }
+
     /**
      * @param string $xmlData
      * @dataProvider wrongXmlDataProvider
@@ -71,9 +97,9 @@ class DomTest extends \PHPUnit_Framework_TestCase
                     . '</type></config>',
             ),
             array(
-                '<?xml version="1.0"?><config><type name="some_type">'
-                    . '<param name="some_param"><wrong_node name="wrong_node" /></param>'
-                    . '</type></config>',
+                '<?xml version="1.0"?><config><virtualType name="some_type">'
+                    . '<wrong_node name="wrong_node" />'
+                    . '</virtualType></config>',
             ),
             array(
                 '<?xml version="1.0"?><config>'
diff --git a/dev/tests/unit/testsuite/Magento/ObjectManager/Config/Mapper/_files/argument_parser.xml b/dev/tests/unit/testsuite/Magento/ObjectManager/Config/Mapper/_files/argument_parser.xml
new file mode 100644
index 00000000000..5fc4a4f01b5
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/ObjectManager/Config/Mapper/_files/argument_parser.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<config>
+    <argument>
+        <item name="one">value1</item>
+        <item name="nested">
+            <item name="two">value2</item>
+            <item name="three">value3</item>
+        </item>
+    </argument>
+</config>
diff --git a/dev/tests/unit/testsuite/Magento/ObjectManager/Config/Mapper/_files/mapped_simple_di_config.php b/dev/tests/unit/testsuite/Magento/ObjectManager/Config/Mapper/_files/mapped_simple_di_config.php
index 9c5c4c92dda..b4418c3502f 100644
--- a/dev/tests/unit/testsuite/Magento/ObjectManager/Config/Mapper/_files/mapped_simple_di_config.php
+++ b/dev/tests/unit/testsuite/Magento/ObjectManager/Config/Mapper/_files/mapped_simple_di_config.php
@@ -28,19 +28,14 @@ return array(
     ),
 
     'Magento\App\State' => array(
-        'parameters' => array(
-            'mode' => array(
-                'argument' => 'MAGE_MODE',
-            ),
+        'arguments' => array(
+            'test name' => 'test value',
         ),
     ),
 
     'Magento\Core\Model\Config\Modules' => array(
-        'parameters' => array(
-            'storage' => array(
-                'instance' => 'Magento\Core\Model\Config\Storage\Modules',
-                'shared' => false
-            ),
+        'arguments' => array(
+            'test name' => 'test value',
         ),
         'plugins' => array(
             'simple_modules_plugin' => array(
@@ -61,56 +56,19 @@ return array(
 
     'Magento\Http\Handler\Composite' => array(
         'shared' => false,
-        'parameters' => array(
-            'factory' => array(
-                'instance' => 'Magento\Http\HandlerFactory',
-            ),
-            'handlers' => array(
-                'custom_handler' => array(
-                    'sortOrder' => 25,
-                    'class' => 'Custom_Cache_Model_Http_Handler',
-                ),
-                'other_handler' => array(
-                    'sortOrder' => 10,
-                    'class' => 'Other_Cache_Model_Http_Handler',
-                ),
-            ),
-        ),
-    ),
-
-    'Magento\Data\Collection\Db\FetchStrategy\Cache' => array(
-        'parameters' => array(
-            'cacheIdPrefix' => 'collection_',
-            'cacheLifetime' => '86400',
-            'cacheTags' => array(
-                'const' => \Magento\Core\Model\Website::CACHE_TAG,
-                'boolFalse' => false, 
-                'boolTrue' => true,
-                'boolOne' => true,
-                'boolZero' => false,
-                'intValue' => 100500,
-                'nullValue' => null,
-                'stringPattern' => 'az-value',
-            ),
-            'constParam' => 'website',
-            'boolFalseParam' => false,
-            'boolTrueParam' => true,
-            'boolOneParam' => true,
-            'boolZeroParam' => false,
-            'intValueParam' => 100500,
-            'nullValueParam' => null,
-            'stringPatternParam' => 'az-value',
+        'arguments' => array(
+            'test name' => 'test value',
         ),
     ),
 
     'customCacheInstance' => array(
         'shared' => true,
         'type' => 'Magento\App\Cache',
-        'parameters' => array(),
+        'arguments' => array(),
     ),
 
     'customOverriddenInstance' => array(
         'shared' => false,
-        'parameters' => array(),
+        'arguments' => array(),
     ),
 );
diff --git a/dev/tests/unit/testsuite/Magento/ObjectManager/Config/Mapper/_files/simple_di_config.xml b/dev/tests/unit/testsuite/Magento/ObjectManager/Config/Mapper/_files/simple_di_config.xml
index bc4af2b1efc..af2ad64467a 100644
--- a/dev/tests/unit/testsuite/Magento/ObjectManager/Config/Mapper/_files/simple_di_config.xml
+++ b/dev/tests/unit/testsuite/Magento/ObjectManager/Config/Mapper/_files/simple_di_config.xml
@@ -23,88 +23,30 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <!-- Comment within root node -->
     <preference for="Magento\Module\UpdaterInterface" type="Magento\Module\Updaterter" />
     <preference for="Magento\AppInterface" type="Magento\Core\Model\App\Proxy" />
+    <!--Arguments only-->
     <type name="Magento\App\State">
-        <param name="mode">
-            <value type="argument">Magento\App\State::PARAM_MODE</value>
-        </param>
+        <arguments>
+            <argument name="test name" xsi:type="test_type">test value</argument>
+        </arguments>
     </type>
+    <!--Arguments and plugins-->
     <type name="Magento\Core\Model\Config\Modules">
-        <!-- Comment within type node -->
-        <param name="storage">
-            <!-- Comment within param node -->
-            <instance type="Magento\Core\Model\Config\Storage\Modules" shared="false" />
-        </param>
+        <arguments>
+            <argument name="test name" xsi:type="test_type">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="overridden_plugin" sortOrder="30" disabled="true" />
     </type>
+    <!--Shared type-->
     <type name="Magento\Http\Handler\Composite" shared="false">
-        <param name="factory">
-            <instance type="Magento\Http\HandlerFactory" />
-        </param>
-        <param name="handlers">
-            <array>
-                <!-- Comment within value node -->
-                <item key="custom_handler">
-                    <array>
-                        <item key="sortOrder"><value>25</value></item>
-                        <item key="class"><value>Custom_Cache_Model_Http_Handler</value></item>
-                    </array>
-                </item>
-                <item key="other_handler">
-                    <array>
-                        <!-- Comment within child node of the value node that represents an assoc array -->
-                        <item key="sortOrder"><value>10</value></item>
-                        <item key="class"><value><![CDATA[Other_Cache_Model_Http_Handler]]></value></item>
-                    </array>
-                </item>
-            </array>
-        </param>
-    </type>
-    <type name="Magento\Data\Collection\Db\FetchStrategy\Cache">
-        <param name="cacheIdPrefix"><value><![CDATA[collection_]]></value></param>
-        <param name="cacheLifetime"><value>86400</value></param>
-        <param name="cacheTags">
-            <array>
-                <item key="const"><value type="const">Magento\Core\Model\Website::CACHE_TAG</value></item>
-                <item key="boolFalse"><value type="bool">false</value></item>
-                <item key="boolTrue"><value type="bool">true</value></item>
-                <item key="boolOne"><value type="bool">1</value></item>
-                <item key="boolZero"><value type="bool">0</value></item>
-                <item key="intValue"><value type="int">100500</value></item>
-                <item key="nullValue"><value type="null"/>
-                </item>
-                <item key="stringPattern"><value type="string" pattern="[a-z\-]*">az-value</value></item>
-            </array>
-        </param>
-        <param name="constParam">
-            <value type='const'>Magento\Core\Model\Website::CACHE_TAG</value>
-        </param>
-        <param name="boolFalseParam">
-            <value type='bool'>false</value>
-        </param>
-        <param name="boolTrueParam">
-            <value type='bool'>true</value>
-        </param>
-        <param name="boolOneParam">
-            <value type='bool'>1</value>
-        </param>
-        <param name="boolZeroParam">
-            <value type='bool'>0</value>
-        </param>
-        <param name="intValueParam">
-            <value type='int'>100500</value>
-        </param>
-        <param name="nullValueParam">
-            <value type='null' />
-        </param>
-        <param name="stringPatternParam">
-            <value type='string' pattern="[a-z\-]*">az-value</value>
-        </param>
+        <arguments>
+            <argument name="test name" xsi:type="test_type">test value</argument>
+        </arguments>
     </type>
     <virtualType name="customCacheInstance" type="Magento\App\Cache" shared="true" />
     <virtualType name="customOverriddenInstance" shared="false" />
diff --git a/dev/tests/unit/testsuite/Magento/ObjectManager/Config/XsdTest.php b/dev/tests/unit/testsuite/Magento/ObjectManager/Config/XsdTest.php
index 55ed9a00aef..68e8d1352a0 100644
--- a/dev/tests/unit/testsuite/Magento/ObjectManager/Config/XsdTest.php
+++ b/dev/tests/unit/testsuite/Magento/ObjectManager/Config/XsdTest.php
@@ -60,7 +60,9 @@ class XsdTest extends \PHPUnit_Framework_TestCase
     }
 
     /**
-     * Data provider with invalid xml array according to events.xsd
+     * Get array of invalid xml strings
+     *
+     * @return array
      */
     public function schemaCorrectlyIdentifiesInvalidXmlDataProvider()
     {
diff --git a/dev/tests/unit/testsuite/Magento/ObjectManager/Config/_files/invalidConfigXmlArray.php b/dev/tests/unit/testsuite/Magento/ObjectManager/Config/_files/invalidConfigXmlArray.php
index ea7a1b3f24d..3a0bc637d9e 100644
--- a/dev/tests/unit/testsuite/Magento/ObjectManager/Config/_files/invalidConfigXmlArray.php
+++ b/dev/tests/unit/testsuite/Magento/ObjectManager/Config/_files/invalidConfigXmlArray.php
@@ -21,8 +21,7 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-return array
-    (
+return array(
     'preference_without_required_for_attribute' => array(
         '<?xml version="1.0"?><config><preference type="Some_Type_Name" /></config>',
         array("Element 'preference': The attribute 'for' is required but missing.")),
@@ -54,51 +53,31 @@ return array
     'type_with_forbidden_attribute' => array(
         '<?xml version="1.0"?><config><type name="Some_Name" forbidden="text"/></config>',
         array("Element 'type', attribute 'forbidden': The attribute 'forbidden' is not allowed.")),
-    'type_shared_attribute_with_invalid_value' => array(
-        '<?xml version="1.0"?><config><type name="Some_Name" shared="test"/></config>',
-        array("Element 'type', attribute 'shared': 'test' is not a valid value of the atomic type 'xs:boolean'.")),
-    'type_param_value_with_forbidden_attribute' => array(
+    'type_shared_attribute_with_forbidden_value' => array(
+        '<?xml version="1.0"?><config><type name="Some_Name" shared="forbidden"/></config>',
+        array("Element 'type', attribute 'shared': 'forbidden' is not a valid value of the atomic type 'xs:boolean'.")),
+    'type_object_with_forbidden_shared_value' => array(
         '<?xml version="1.0"?>
-        <config>
-            <type name="Some_Type_name">
-                <param name="test_param_name"><value forbidden="test" /></param>
-            </type>
-        </config>',
-        array("Element 'value', attribute 'forbidden': The attribute 'forbidden' is not allowed.")),
-    'type_param_empty' => array(
-        '<?xml version="1.0"?><config><type name="Some_Name"><param name="Param_name" /></type></config>',
-        array("Element 'param': Missing child element(s). Expected is one of ( instance, value, array ).")),
-    'type_param_without_required_name_attribute' => array(
-        '<?xml version="1.0"?>
-        <config>
-            <type name="Some_Name"><param><value /></param></type>
-        </config>',
-        array("Element 'param': The attribute 'name' is required but missing.")),
-    'type_param_instance_without_required_type_attribute' => array(
-        '<?xml version="1.0"?>
-        <config><type name="Some_Name"><param name="Param_name"><instance /></param></type></config>',
-        array("Element 'instance': The attribute 'type' is required but missing.")),
-    'type_param_instance_with_invalid_shared_value' => array(
-        '<?xml version="1.0"?>
-        <config>
+        <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
             <type name="Some_Name">
-                <param name="Param_name">
-                    <instance type="Some_type" shared="string" />
-                </param>
+                <arguments>
+                    <argument name="Param_name" xsi:type="object" shared="forbidden">Object</argument>
+                </arguments>
             </type>
         </config>',
-        array("Element 'instance', attribute 'shared': 'string' is not a valid value of the atomic "
-            . "type 'xs:boolean'.")),
+        array(
+            "Element 'argument', attribute 'shared': 'forbidden' is not a valid value of the atomic type 'xs:boolean'."
+        )),
     'type_instance_with_forbidden_attribute' => array(
         '<?xml version="1.0"?>
-        <config>
+        <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
             <type name="Some_Name">
-                <param name="Param_name">
-                    <instance type="Some_type" forbidden="text" />
-                </param>
+                <arguments>
+                    <argument name="Param_name" xsi:type="object" forbidden="text">Object</argument>
+                </arguments>
             </type>
         </config>',
-        array("Element 'instance', attribute 'forbidden': The attribute 'forbidden' is not allowed.")),
+        array("Element 'argument', attribute 'forbidden': The attribute 'forbidden' is not allowed.")),
     'type_plugin_without_required_name_attribute' => array(
         '<?xml version="1.0"?><config><type name="Some_Name"><plugin /></type></config>',
         array("Element 'plugin': The attribute 'name' is required but missing.")),
@@ -115,194 +94,24 @@ return array
         '<?xml version="1.0"?>
         <config><type name="Some_Name"><plugin name="some_name" sortOrder="string" /></type></config>',
         array("Element 'plugin', attribute 'sortOrder': 'string' is not a valid value of the atomic type 'xs:int'.")),
-    'type_same_name_attribute_value' => array(
-        '<?xml version="1.0"?>
-        <config>
-            <type name="Some_Name" />
-            <type name="Some_Name" />
-        </config>',
-        array("Element 'type': Duplicate key-sequence ['Some_Name'] in unique identity-constraint 'uniqueType'.")),
-    'type_value_forbidden_element' => array(
-        '<?xml version="1.0"?>
-        <config>
-            <type name="Some_Name">
-                <param name="test_param_name">
-                    <value>
-                        <forbidden />
-                    </value>
-                </param>
-            </type>
-        </config>',
-        array("Element 'value': Element content is not allowed, because the content type is a simple type definition.")
-     ),
-    'type_param_several_allowed_elements' => array(
-        '<?xml version="1.0"?>
-        <config>
-            <type name="Some_Name">
-                <param name="test_param_name">
-                    <value>value</value>
-                    <array>
-                        <item key="key"><value>value</value></item>
-                    </array>
-                </param>
-            </type>
-        </config>',
-        array("Element 'array': This element is not expected.")
-     ),
-    'type_array_empty' => array(
-        '<?xml version="1.0"?>
-        <config>
-            <type name="Some_Name">
-                <param name="test_param_name">
-                    <array />
-                </param>
-            </type>
-        </config>',
-        array("Element 'array': Missing child element(s). Expected is ( item ).")
-     ),
-    'type_array_forbidden_argument' => array(
-        '<?xml version="1.0"?>
-        <config>
-            <type name="Some_Name">
-                <param name="test_param_name">
-                    <array forbidden="text">
-                        <item key="key"><value>value</value></item>
-                    </array>
-                </param>
-            </type>
-        </config>',
-        array("Element 'array', attribute 'forbidden': The attribute 'forbidden' is not allowed.")
-     ),
-    'type_array_forbidden_element' => array(
-        '<?xml version="1.0"?>
-        <config>
-            <type name="Some_Name">
-                <param name="test_param_name">
-                    <array>
-                        <forbidden />
-                        <item key="key"><value>value</value></item>
-                    </array>
-                </param>
-            </type>
-        </config>',
-        array("Element 'forbidden': This element is not expected. Expected is ( item ).")
-     ),
-    'type_array_item_missed_argument' => array(
-        '<?xml version="1.0"?>
-        <config>
-            <type name="Some_Name">
-                <param name="test_param_name">
-                    <array>
-                        <item><value>value</value></item>
-                    </array>
-                </param>
-            </type>
-        </config>',
-        array("Element 'item': The attribute 'key' is required but missing.")
-     ),
-    'type_array_item_name_argument (difference between item and param)' => array(
-        '<?xml version="1.0"?>
-        <config>
-            <type name="Some_Name">
-                <param name="test_param_name">
-                    <array>
-                        <item key="key" name="text"><value>value</value></item>
-                    </array>
-                </param>
-            </type>
-        </config>',
-        array("Element 'item', attribute 'name': The attribute 'name' is not allowed.")
-     ),
-    'type_array_item_empty_argument' => array(
-        '<?xml version="1.0"?>
-        <config>
-            <type name="Some_Name">
-                <param name="test_param_name">
-                    <array>
-                        <item key="key" />
-                    </array>
-                </param>
-            </type>
-        </config>',
-        array("Element 'item': Missing child element(s). Expected is one of ( instance, value, array ).")
-     ),
-    'type_array_item_forbidden_element' => array(
-        '<?xml version="1.0"?>
-        <config>
-            <type name="Some_Name">
-                <param name="test_param_name">
-                    <array>
-                        <item key="key"><forbidden>value</forbidden></item>
-                    </array>
-                </param>
-            </type>
-        </config>',
-        array("Element 'forbidden': This element is not expected. Expected is one of ( instance, value, array ).")
-     ),
-    'type_array_item_same_keys' => array(
-        '<?xml version="1.0"?>
-        <config>
-            <type name="Some_Name">
-                <param name="test_param_name">
-                    <array>
-                        <item key="key"><value>value</value></item>
-                        <item key="key"><value>value</value></item>
-                    </array>
-                </param>
-            </type>
-        </config>',
-        array("Element 'item': Duplicate key-sequence ['key'] in unique identity-constraint 'uniqueArrayIndex'.")
-     ),
-    'type_array_item_same_keys_in_nested_array' => array(
+    'type_with_same_argument_name_attribute' => array(
         '<?xml version="1.0"?>
-        <config>
+        <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
             <type name="Some_Name">
-                <param name="test_param_name">
-                    <array>
-                        <item key="key_outer">
-                            <array>
-                                <item key="key"><value>value</value></item>
-                                <item key="key"><value>value</value></item>
-                            </array>
-                        </item>
-                    </array>
-                </param>
+                <arguments>
+                    <argument name="same_argument_name" xsi:type="string">value</argument>
+                    <argument name="same_argument_name" xsi:type="string">value2</argument>
+                </arguments>
             </type>
         </config>',
-        array("Element 'item': Duplicate key-sequence ['key'] in unique identity-constraint 'uniqueArrayIndex'.")
-     ),
-    'type_array_item_value_forbidden_argument' => array(
-        '<?xml version="1.0"?>
-        <config>
-            <type name="Some_Name">
-                <param name="test_param_name">
-                    <array>
-                        <item key="key"><value forbidden="text">value</value></item>
-                    </array>
-                </param>
-            </type>
-        </config>',
-        array("Element 'value', attribute 'forbidden': The attribute 'forbidden' is not allowed.")
-     ),
-    'type_array_item_value_forbidden_element' => array(
-        '<?xml version="1.0"?>
-        <config>
-            <type name="Some_Name">
-                <param name="test_param_name">
-                    <array>
-                        <item key="key"><value><forbidden /></value></item>
-                    </array>
-                </param>
-            </type>
-        </config>',
-        array("Element 'value': Element content is not allowed, because the content type is a simple type definition.")
-     ),
+        array("Element 'argument': Duplicate key-sequence ['same_argument_name'] in key identity-constraint "
+            . "'argumentName'.")),
     'virtualtype_without_required_name_attribute' => array(
         '<?xml version="1.0"?><config><virtualType /></config>',
         array("Element 'virtualType': The attribute 'name' is required but missing.")),
-    'virtualtype_with_invalid_shared_attribute_value' => array(
-        '<?xml version="1.0"?><config><virtualType name="virtual_name" shared="string"/></config>',
-        array("Element 'virtualType', attribute 'shared': 'string' is not a valid value of the atomic "
+    'virtualtype_with_forbidden_shared_attribute_value' => array(
+        '<?xml version="1.0"?><config><virtualType name="virtual_name" shared="forbidden"/></config>',
+        array("Element 'virtualType', attribute 'shared': 'forbidden' is not a valid value of the atomic "
             . "type 'xs:boolean'.")),
     'virtualtype_with_forbidden_attribute' => array(
         '<?xml version="1.0"?><config><virtualType name="virtual_name" forbidden="text"/></config>',
@@ -311,14 +120,17 @@ return array
         '<?xml version="1.0"?><config><virtualType name="test_name" /><virtualType name="test_name" /></config>',
         array("Element 'virtualType': Duplicate key-sequence ['test_name'] in unique"
             . " identity-constraint 'uniqueVirtualType'.")),
-    'virtualtype_with_same_param_name_attribute' => array(
+    'virtualtype_with_same_argument_name_attribute' => array(
         '<?xml version="1.0"?>
-        <config>
+        <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
             <virtualType name="virtual_name">
-                <param name="same_param_name"><value>value</value></param>
-                <param name="same_param_name"><value>value</value></param>
+                <arguments>
+                    <argument name="same_param_name" xsi:type="string">value</argument>
+                    <argument name="same_param_name" xsi:type="string">value2</argument>
+                </arguments>
             </virtualType>
         </config>',
-        array("Element 'param': Duplicate key-sequence ['same_param_name'] in unique "
-            . "identity-constraint 'uniqueVirtualTypeParam'.")),
-    );
+        array(
+            "Element 'argument': Duplicate key-sequence ['same_param_name'] in key identity-constraint 'argumentName'."
+        )),
+);
diff --git a/dev/tests/unit/testsuite/Magento/ObjectManager/Config/_files/valid_config.xml b/dev/tests/unit/testsuite/Magento/ObjectManager/Config/_files/valid_config.xml
index 110dbfb89d2..bc1247b644a 100644
--- a/dev/tests/unit/testsuite/Magento/ObjectManager/Config/_files/valid_config.xml
+++ b/dev/tests/unit/testsuite/Magento/ObjectManager/Config/_files/valid_config.xml
@@ -23,71 +23,58 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <preference for="Some_For_Name" type="Some_Type_Name" />
     <virtualType name="" type="" shared="true">
-        <param name="single_array">
-            <array>
-                <item key="key1 unique for single array"><value>value</value></item>
-                <item key="Different symbols 1~!@#$%^&amp;*()_+-=`[]\{}|;':,./&lt;>?"><value>2</value></item>
-            </array>
-        </param>
-        <param name="nested_array">
-            <array>
-                <item key="key1 unique for single array">
-                    <array>
-                        <item key="key1 unique for single array"><value>value</value></item>
-                        <item key="Different symbols 1~!@#$%^&amp;*()_+-=`[]\{}|;':,./&lt;>?"><value>2</value></item>
-                    </array>
+        <arguments>
+            <argument name="object" xsi:type="object" shared="true">Object</argument>
+            <argument name="init_parameter" xsi:type="init_parameter">INIT_PARAMETER</argument>
+            <argument name="const" xsi:type="const">CONST</argument>
+            <argument name="single_array" xsi:type="array">
+                <item name="key1 unique for single array" xsi:type="string">value</item>
+                <item name="Different symbols 1~!@#$%^&amp;*()_+-=`[]\{}|;':,./&lt;&gt;?" xsi:type="string">2</item>
+            </argument>
+            <argument name="nested_array" xsi:type="array">
+                <item name="key1 unique for single array" xsi:type="array">
+                    <item name="key1 unique for single array" xsi:type="string">value</item>
+                    <item name="Different symbols 1~!@#$%^&amp;*()_+-=`[]\{}|;':,./&lt;&gt;?" xsi:type="string">2</item>
                 </item>
-                <item key="backend2">
-                    <array>
-                        <item key="key1 unique for single array"><value>value</value></item>
-                        <item key="Different symbols 1~!@#$%^&amp;*()_+-=`[]\{}|;':,./&lt;>?">
-                            <array>
-                                <item key="key1 unique for single array"><value>value</value></item>
-                                <item key="Different symbols 1~!@#$%^&amp;*()_+-=`[]\{}|;':,./&lt;>?"><value>2</value></item>
-                            </array>
-                        </item>
-                    </array>
+                <item name="backend2" xsi:type="array">
+                    <item name="key1 unique for single array" xsi:type="string">value</item>
+                    <item name="Different symbols 1~!@#$%^&amp;*()_+-=`[]\{}|;':,./&lt;&gt;?" xsi:type="array">
+                        <item name="key1 unique for single array" xsi:type="string">value</item>
+                        <item name="Different symbols 1~!@#$%^&amp;*()_+-=`[]\{}|;':,./&lt;&gt;?" xsi:type="string">2</item>
+                    </item>
                 </item>
-            </array>
-        </param>
+            </argument>
+        </arguments>
     </virtualType>
     <type name="Some_Type_name">
         <plugin name="plugin_name" type="Type_Test_Value"/>
-        <param name="text_value">
-            <instance type="Instance_test_name" />
-        </param>
-        <param name="single_array">
-            <array>
-                <item key="key1 unique for single array"><value>value</value></item>
-                <item key="Different symbols 1~!@#$%^&amp;*()_+-=`[]\{}|;':,./&lt;>?"><instance type="Instance_test_name" /></item>
-            </array>
-        </param>
-        <param name="nested_array">
-            <array>
-                <item key="key1 unique for single array">
-                    <array>
-                        <item key="key1 unique for single array"><value>value</value></item>
-                        <item key="Different symbols 1~!@#$%^&amp;*()_+-=`[]\{}|;':,./&lt;>?"><instance type="Instance_test_name" /></item>
-                    </array>
+        <arguments>
+            <argument name="object" xsi:type="object">Object</argument>
+            <argument name="object_shared" xsi:type="object" shared="true">Object</argument>
+            <argument name="object_shared_false" xsi:type="object" shared="false">Object</argument>
+            <argument name="init_parameter" xsi:type="init_parameter">INIT_PARAMETER</argument>
+            <argument name="const" xsi:type="const">CONST</argument>
+            <argument name="single_array" xsi:type="array">
+                <item name="key1 unique for single array" xsi:type="string">value</item>
+                <item name="Different symbols 1~!@#$%^&amp;*()_+-=`[]\{}|;':,./&lt;&gt;?" xsi:type="object">Instance_test_name</item>
+            </argument>
+            <argument name="nested_array" xsi:type="array">
+                <item name="key1 unique for single array" xsi:type="array">
+                    <item name="key1 unique for single array" xsi:type="string">value</item>
+                    <item name="Different symbols 1~!@#$%^&amp;*()_+-=`[]\{}|;':,./&lt;&gt;?" xsi:type="object">Instance_test_name</item>
                 </item>
-                <item key="backend2">
-                    <array>
-                        <item key="key1 unique for single array"><value>value</value></item>
-                        <item key="Different symbols 1~!@#$%^&amp;*()_+-=`[]\{}|;':,./&lt;>?">
-                            <array>
-                                <item key="key1 unique for single array"><value>value</value></item>
-                                <item key="Different symbols 1~!@#$%^&amp;*()_+-=`[]\{}|;':,./&lt;>?"><instance type="Instance_test_name" /></item>
-                            </array>
-                        </item>
-                    </array>
+                <item name="backend2" xsi:type="array">
+                    <item name="key1 unique for single array" xsi:type="string">value</item>
+                    <item name="Different symbols 1~!@#$%^&amp;*()_+-=`[]\{}|;':,./&lt;&gt;?" xsi:type="array">
+                        <item name="key1 unique for single array" xsi:type="string">value</item>
+                        <item name="Different symbols 1~!@#$%^&amp;*()_+-=`[]\{}|;':,./&lt;&gt;?" xsi:type="object">Instance_test_name</item>
+                    </item>
                 </item>
-            </array>
-        </param>
-        <param name="baseController">
-            <value>some_value</value>
-        </param>
+            </argument>
+            <argument name="baseController" xsi:type="string">some_value</argument>
+        </arguments>
     </type>
 </config>
diff --git a/dev/tests/unit/testsuite/Magento/ObjectManager/Factory/FactoryTest.php b/dev/tests/unit/testsuite/Magento/ObjectManager/Factory/FactoryTest.php
new file mode 100644
index 00000000000..c3dc1d30555
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/ObjectManager/Factory/FactoryTest.php
@@ -0,0 +1,148 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ObjectManager\Factory;
+
+use Magento\ObjectManager\Config\Config;
+use Magento\ObjectManager\ObjectManager;
+use Magento\ObjectManager\Config\Argument\ObjectFactory;
+
+class FactoryTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Factory
+     */
+    private $factory;
+
+    /**
+     * @var Config
+     */
+    private $config;
+
+    /**
+     * @var ObjectFactory
+     */
+    private $objectFactory;
+
+    /**
+     * @var ObjectManager
+     */
+    private $objectManager;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $interpreter;
+
+    protected function setUp()
+    {
+        $this->config = new Config;
+        $this->objectFactory = new ObjectFactory($this->config);
+        $this->interpreter = $this->getMockForAbstractClass('\Magento\Data\Argument\InterpreterInterface');
+        $this->factory = new Factory($this->config, $this->interpreter, $this->objectFactory);
+        $this->objectManager = new ObjectManager($this->factory, $this->config);
+        $this->objectFactory->setObjectManager($this->objectManager);
+    }
+
+    public function testCreateNoArgs()
+    {
+        $this->assertInstanceOf('StdClass', $this->factory->create('StdClass'));
+    }
+
+    public function testCreateOneArg()
+    {
+        /** @var \Magento\ObjectManager\Factory\Fixture\OneScalar $result */
+        $result = $this->factory->create('Magento\ObjectManager\Factory\Fixture\OneScalar', array('foo' => 'bar'));
+        $this->assertInstanceOf('\Magento\ObjectManager\Factory\Fixture\OneScalar', $result);
+        $this->assertEquals('bar', $result->getFoo());
+    }
+
+    public function testCreateWithInjectable()
+    {
+        // let's imitate that One is injectable by providing DI configuration for it
+        $this->config->extend(
+            array('Magento\ObjectManager\Factory\Fixture\OneScalar' =>
+                array('arguments' => array('foo' => array('value' => 'bar')))
+            )
+        );
+        $this->interpreter
+            ->expects($this->once())
+            ->method('evaluate')
+            ->with(array('value' => 'bar'))
+            ->will($this->returnValue('bar'))
+        ;
+        /** @var \Magento\ObjectManager\Factory\Fixture\Two $result */
+        $result = $this->factory->create('Magento\ObjectManager\Factory\Fixture\Two');
+        $this->assertInstanceOf('\Magento\ObjectManager\Factory\Fixture\Two', $result);
+        $this->assertInstanceOf('\Magento\ObjectManager\Factory\Fixture\OneScalar', $result->getOne());
+        $this->assertEquals('bar', $result->getOne()->getFoo());
+        $this->assertEquals('optional', $result->getBaz());
+    }
+
+    /**
+     * @param string $startingClass
+     * @param string $terminationClass
+     * @dataProvider circularDataProvider
+     */
+    public function testCircular($startingClass, $terminationClass)
+    {
+        $this->setExpectedException(
+            '\LogicException',
+            sprintf('Circular dependency: %s depends on %s and vice versa.', $startingClass, $terminationClass)
+        );
+        $this->factory->create($startingClass);
+    }
+
+    /**
+     * @return array
+     */
+    public function circularDataProvider()
+    {
+        $prefix = 'Magento\ObjectManager\Factory\Fixture\\';
+        return array(
+            array("{$prefix}CircularOne", "{$prefix}CircularThree"),
+            array("{$prefix}CircularTwo", "{$prefix}CircularOne"),
+            array("{$prefix}CircularThree", "{$prefix}CircularTwo"),
+        );
+    }
+
+    public function testCreateUsingReflection()
+    {
+        $type = 'Magento\ObjectManager\Factory\Fixture\Polymorphous';
+        $definitions = $this->getMockForAbstractClass('\Magento\ObjectManager\Definition');
+        // should be more than defined in "switch" of create() method
+        $definitions->expects($this->once())->method('getParameters')->with($type)->will($this->returnValue(array(
+            array('one', 'int', false, null), array('two', 'int', false, null), array('three', 'int', false, null),
+            array('four', 'int', false, null), array('five', 'int', false, null), array('six', 'int', false, null),
+            array('seven', 'int', false, null), array('eight', 'int', false, null), array('nine', 'int', false, null),
+            array('ten', 'int', false, null),
+        )));
+        $factory = new Factory($this->config, $this->interpreter, $this->objectFactory, $definitions);
+        $result = $factory->create($type, array(
+            'one' => 1, 'two' => 2, 'three' => 3, 'four' => 4, 'five' => 5,
+            'six' => 6, 'seven' => 7, 'eight' => 8, 'nine' => 9, 'ten' => 10,
+        ));
+        $this->assertSame(10, $result->getArg(9));
+    }
+} 
diff --git a/dev/tests/unit/testsuite/Magento/ObjectManager/Factory/Fixture/CircularOne.php b/dev/tests/unit/testsuite/Magento/ObjectManager/Factory/Fixture/CircularOne.php
new file mode 100644
index 00000000000..3df2d324b30
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/ObjectManager/Factory/Fixture/CircularOne.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ObjectManager\Factory\Fixture;
+
+/**
+ * Part of the chain for circular dependency test
+ */
+class CircularOne
+{
+    /**
+     * @param CircularTwo $two
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+     */
+    public function __construct(CircularTwo $two)
+    {
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/ObjectManager/Factory/Fixture/CircularThree.php b/dev/tests/unit/testsuite/Magento/ObjectManager/Factory/Fixture/CircularThree.php
new file mode 100644
index 00000000000..ee69ce5e5c0
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/ObjectManager/Factory/Fixture/CircularThree.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ObjectManager\Factory\Fixture;
+
+/**
+ * Part of the chain for circular dependency test
+ */
+class CircularThree
+{
+    /**
+     * @param CircularOne $one
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+     */
+    public function __construct(CircularOne $one)
+    {
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/ObjectManager/Factory/Fixture/CircularTwo.php b/dev/tests/unit/testsuite/Magento/ObjectManager/Factory/Fixture/CircularTwo.php
new file mode 100644
index 00000000000..c6212a322db
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/ObjectManager/Factory/Fixture/CircularTwo.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ObjectManager\Factory\Fixture;
+
+/**
+ * Part of the chain for circular dependency test
+ */
+class CircularTwo
+{
+    /**
+     * @param CircularThree $three
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+     */
+    public function __construct(CircularThree $three)
+    {
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/ObjectManager/Factory/Fixture/OneScalar.php b/dev/tests/unit/testsuite/Magento/ObjectManager/Factory/Fixture/OneScalar.php
new file mode 100644
index 00000000000..917d5e18eaa
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/ObjectManager/Factory/Fixture/OneScalar.php
@@ -0,0 +1,52 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ObjectManager\Factory\Fixture;
+
+/**
+ * A "value object" style constructor that requires one non-injectable argument
+ */
+class OneScalar
+{
+    /**
+     * @var string
+     */
+    private $foo;
+
+    /**
+     * @param string $foo
+     */
+    public function __construct($foo)
+    {
+        $this->foo = $foo;
+    }
+
+    /**
+     * @return string
+     */
+    public function getFoo()
+    {
+        return $this->foo;
+    }
+} 
diff --git a/dev/tests/unit/testsuite/Magento/ObjectManager/Factory/Fixture/Polymorphous.php b/dev/tests/unit/testsuite/Magento/ObjectManager/Factory/Fixture/Polymorphous.php
new file mode 100644
index 00000000000..0a8c6b69dcc
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/ObjectManager/Factory/Fixture/Polymorphous.php
@@ -0,0 +1,50 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ObjectManager\Factory\Fixture;
+
+/**
+ * Constructor with undefined number of arguments
+ */
+class Polymorphous
+{
+    /**
+     * @var array
+     */
+    private $args;
+
+    public function __construct()
+    {
+        $this->args = func_get_args();
+    }
+
+    /**
+     * @param string $key
+     * @return mixed
+     */
+    public function getArg($key)
+    {
+        return isset($this->args[$key]) ? $this->args[$key] : null;
+    }
+} 
diff --git a/dev/tests/unit/testsuite/Magento/ObjectManager/Factory/Fixture/Two.php b/dev/tests/unit/testsuite/Magento/ObjectManager/Factory/Fixture/Two.php
new file mode 100644
index 00000000000..b12d12a0b5f
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/ObjectManager/Factory/Fixture/Two.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ObjectManager\Factory\Fixture;
+
+/**
+ * A constructor with 2 dependencies: one injectable, another scalar
+ */
+class Two
+{
+    /**
+     * @var OneScalar
+     */
+    private $one;
+
+    /**
+     * @var string
+     */
+    private $baz;
+
+    /**
+     * @param OneScalar $one
+     * @param string $baz
+     */
+    public function __construct(OneScalar $one, $baz = 'optional')
+    {
+        $this->one = $one;
+        $this->baz = $baz;
+    }
+
+    /**
+     * @return OneScalar
+     */
+    public function getOne()
+    {
+        return $this->one;
+    }
+
+    /**
+     * @return string
+     */
+    public function getBaz()
+    {
+        return $this->baz;
+    }
+} 
diff --git a/dev/tests/unit/testsuite/Magento/ObjectManager/ObjectManagerTest.php b/dev/tests/unit/testsuite/Magento/ObjectManager/ObjectManagerTest.php
index 5d884fc8403..4b9e28fe788 100644
--- a/dev/tests/unit/testsuite/Magento/ObjectManager/ObjectManagerTest.php
+++ b/dev/tests/unit/testsuite/Magento/ObjectManager/ObjectManagerTest.php
@@ -41,13 +41,25 @@ class ObjectManagerTest extends \PHPUnit_Framework_TestCase
      */
     protected $_object;
 
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_argInterpreterMock;
+
     protected function setUp()
     {
+        $this->_argInterpreterMock =
+            $this->getMock('\Magento\Data\Argument\InterpreterInterface', array(), array(), '', false);
         $config = new \Magento\ObjectManager\Config\Config(new \Magento\ObjectManager\Relations\Runtime());
+        $argObjectFactory = new \Magento\ObjectManager\Config\Argument\ObjectFactory($config);
         $factory = new \Magento\ObjectManager\Factory\Factory(
-                $config, null, null, array('one' => 'first_val', 'two' => 'second_val')
+            $config,
+            $this->_argInterpreterMock,
+            $argObjectFactory,
+            null
         );
         $this->_object = new \Magento\ObjectManager\ObjectManager($factory, $config);
+        $argObjectFactory->setObjectManager($this->_object);
     }
 
     public function testCreateCreatesNewInstanceEveryTime()
@@ -106,7 +118,7 @@ class ObjectManagerTest extends \PHPUnit_Framework_TestCase
 
     /**
      * @expectedException \BadMethodCallException
-     * @expectedExceptionMessage Missing required argument $scalar for Magento\Test\Di\Aggregate\AggregateParent
+     * @expectedExceptionMessage Missing required argument $scalar of Magento\Test\Di\Aggregate\AggregateParent
      */
     public function testCreateThrowsExceptionIfRequiredConstructorParameterIsNotProvided()
     {
@@ -121,15 +133,23 @@ class ObjectManagerTest extends \PHPUnit_Framework_TestCase
 
     public function testCreateResolvesScalarParametersAutomatically()
     {
+        $childAMock = $this->getMock('Magento\Test\Di\Child\A', array(), array(), '', false);
+        $this->_argInterpreterMock->expects($this->any())
+            ->method('evaluate')
+            ->will($this->returnValueMap(array(
+                array(array('xsi:type' => 'object', 'value' => 'Magento\Test\Di\Child\A'), $childAMock),
+                array(array('xsi:type' => 'string', 'value' => 'scalarValue'), 'scalarValue'),
+            )));
+
         $this->_object->configure(array(
             'preferences' => array(
                 'Magento\Test\Di\DiInterface' => 'Magento\Test\Di\DiParent',
                 'Magento\Test\Di\DiParent' => 'Magento\Test\Di\Child'
             ),
             'Magento\Test\Di\Aggregate\AggregateParent' => array(
-                'parameters' => array(
-                    'child' => array('instance' => 'Magento\Test\Di\Child\A'),
-                    'scalar' => 'scalarValue'
+                'arguments' => array(
+                    'child' => array('xsi:type' => 'object', 'value' => 'Magento\Test\Di\Child\A'),
+                    'scalar' => array('xsi:type' => 'string', 'value' => 'scalarValue')
                 )
             )
         ));
@@ -143,44 +163,6 @@ class ObjectManagerTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals('1', $result->optionalScalar);
     }
 
-    /**
-     * @param array $arguments
-     * @dataProvider createResolvesScalarCallTimeParametersAutomaticallyDataProvider
-     */
-    public function testCreateResolvesScalarCallTimeParametersAutomatically(array $arguments)
-    {
-        $this->_object->configure(array(
-            'preferences' => array(
-                'Magento\Test\Di\DiInterface' => 'Magento\Test\Di\DiParent',
-                'Magento\Test\Di\DiParent' => 'Magento\Test\Di\Child'
-            ),
-        ));
-        /** @var $result \Magento\Test\Di\Aggregate\Child */
-        $result = $this->_object->create('Magento\Test\Di\Aggregate\Child', $arguments);
-        $this->assertInstanceOf('Magento\Test\Di\Aggregate\Child', $result);
-        $this->assertInstanceOf('Magento\Test\Di\Child', $result->interface);
-        $this->assertInstanceOf('Magento\Test\Di\Child', $result->parent);
-        $this->assertInstanceOf('Magento\Test\Di\Child\A', $result->child);
-        $this->assertEquals('scalarValue', $result->scalar);
-        $this->assertEquals('secondScalarValue', $result->secondScalar);
-        $this->assertEquals('1', $result->optionalScalar);
-        $this->assertEquals('secondOptionalValue', $result->secondOptionalScalar);
-    }
-
-    public function createResolvesScalarCallTimeParametersAutomaticallyDataProvider()
-    {
-        return array(
-            'named binding' => array(
-                array(
-                    'child' => array('instance' => 'Magento\Test\Di\Child\A'),
-                    'scalar' => 'scalarValue',
-                    'secondScalar' => 'secondScalarValue',
-                    'secondOptionalScalar' => 'secondOptionalValue'
-                )
-            )
-        );
-    }
-
     public function testGetCreatesSharedInstancesEveryTime()
     {
         $this->_object->configure(array(
@@ -192,8 +174,8 @@ class ObjectManagerTest extends \PHPUnit_Framework_TestCase
                 'shared' => 0
             ),
             'Magento\Test\Di\Aggregate\AggregateParent' => array(
-                'parameters' => array(
-                    'scalar' => 'scalarValue'
+                'arguments' => array(
+                    'scalar' => array('xsi:type' => 'string', 'value' => 'scalarValue')
                 )
             )
         ));
@@ -210,7 +192,8 @@ class ObjectManagerTest extends \PHPUnit_Framework_TestCase
 
     /**
      * @expectedException \LogicException
-     * @expectedExceptionMessage Magento\Test\Di\Aggregate\AggregateParent depends on Magento\Test\Di\Child\Circular
+     * @expectedExceptionMessage Circular dependency: Magento\Test\Di\Aggregate\AggregateParent depends on
+     * Magento\Test\Di\Child\Circular and vice versa.
      */
     public function testGetDetectsCircularDependency()
     {
@@ -230,17 +213,16 @@ class ObjectManagerTest extends \PHPUnit_Framework_TestCase
         $this->assertNull($instance->child);
     }
 
-    public function testCreateInstantiatesOptionalObjectArgumentsIfTheyreProvided()
-    {
-        $instance = $this->_object->create(
-            'Magento\Test\Di\Aggregate\WithOptional', array('child' => array('instance' => 'Magento\Test\Di\Child'))
-        );
-        $this->assertNull($instance->parent);
-        $this->assertInstanceOf('Magento\Test\Di\Child', $instance->child);
-    }
-
     public function testCreateCreatesPreconfiguredInstance()
     {
+        $this->_argInterpreterMock->expects($this->any())
+            ->method('evaluate')
+            ->will($this->returnValueMap(array(
+                array(array('xsi:type' => 'string', 'value' => 'configuredScalar'), 'configuredScalar'),
+                array(array('xsi:type' => 'string', 'value' => 'configuredSecondScalar'), 'configuredSecondScalar'),
+                array(array('xsi:type' => 'string', 'value' => 'configuredOptionalScalar'), 'configuredOptionalScalar'),
+            )));
+
         $this->_object->configure(array(
             'preferences' => array(
                 'Magento\Test\Di\DiInterface' => 'Magento\Test\Di\DiParent',
@@ -248,10 +230,10 @@ class ObjectManagerTest extends \PHPUnit_Framework_TestCase
             ),
             'customChildType' => array(
                 'type' => 'Magento\Test\Di\Aggregate\Child',
-                'parameters' => array(
-                    'scalar' => 'configuredScalar',
-                    'secondScalar' => 'configuredSecondScalar',
-                    'secondOptionalScalar' => 'configuredOptionalScalar'
+                'arguments' => array(
+                    'scalar' => array('xsi:type' => 'string', 'value' => 'configuredScalar'),
+                    'secondScalar' => array('xsi:type' => 'string', 'value' => 'configuredSecondScalar'),
+                    'secondOptionalScalar' => array('xsi:type' => 'string', 'value' => 'configuredOptionalScalar')
                 )
             )
         ));
@@ -266,13 +248,26 @@ class ObjectManagerTest extends \PHPUnit_Framework_TestCase
 
     public function testParameterShareabilityConfigurationIsApplied()
     {
+        $diParentMock = $this->getMock('Magento\Test\Di\DiParent', array(), array(), '', false);
+        $this->_argInterpreterMock->expects($this->any())
+            ->method('evaluate')
+            ->will($this->returnCallback(function (array $array) use ($diParentMock) {
+                if ($array === array('xsi:type' => 'object', 'value' => 'Magento\Test\Di\DiParent')) {
+                    return $diParentMock;
+                } elseif (
+                    $array === array('xsi:type' => 'object', 'value' => 'Magento\Test\Di\DiParent', 'shared' => false)
+                ) {
+                    return $this->getMock('Magento\Test\Di\DiParent', array(), array(), '', false);
+                }
+            }));
+
         $this->_object->configure(array(
             'customChildType' => array(
                 'type' => 'Magento\Test\Di\Aggregate\Child',
-                'parameters' => array(
-                    'interface' => array('instance' => 'Magento\Test\Di\DiParent'),
-                    'scalar' => 'configuredScalar',
-                    'secondScalar' => 'configuredSecondScalar',
+                'arguments' => array(
+                    'interface' => array('xsi:type' => 'object', 'value' => 'Magento\Test\Di\DiParent'),
+                    'scalar' => array('xsi:type' => 'string', 'value' => 'configuredScalar'),
+                    'secondScalar' => array('xsi:type' => 'string', 'value' => 'configuredSecondScalar'),
                 )
             )
         ));
@@ -283,8 +278,9 @@ class ObjectManagerTest extends \PHPUnit_Framework_TestCase
 
         $this->_object->configure(array(
             'customChildType' => array(
-                'parameters' => array(
-                    'interface' => array('instance' => 'Magento\Test\Di\DiParent', 'shared' => false),
+                'arguments' => array(
+                    'interface'
+                        => array('xsi:type' => 'object', 'value' => 'Magento\Test\Di\DiParent', 'shared' => false),
                 )
             )
         ));
@@ -296,13 +292,20 @@ class ObjectManagerTest extends \PHPUnit_Framework_TestCase
 
     public function testTypeShareabilityConfigurationIsApplied()
     {
+        $diParentMock = $this->getMock('Magento\Test\Di\DiParent', array(), array(), '', false);
+        $this->_argInterpreterMock->expects($this->any())
+            ->method('evaluate')
+            ->will($this->returnValueMap(array(
+                array(array('xsi:type' => 'object', 'value' => 'Magento\Test\Di\DiParent'), $diParentMock),
+            )));
+
         $this->_object->configure(array(
             'customChildType' => array(
                 'type' => 'Magento\Test\Di\Aggregate\Child',
-                'parameters' => array(
-                    'interface' => array('instance' => 'Magento\Test\Di\DiParent'),
-                    'scalar' => 'configuredScalar',
-                    'secondScalar' => 'configuredSecondScalar',
+                'arguments' => array(
+                    'interface' => array('xsi:type' => 'object', 'value' => 'Magento\Test\Di\DiParent'),
+                    'scalar' => array('xsi:type' => 'string', 'value' => 'configuredScalar'),
+                    'secondScalar' => array('xsi:type' => 'string', 'value' => 'configuredSecondScalar'),
                 )
             )
         ));
@@ -316,24 +319,41 @@ class ObjectManagerTest extends \PHPUnit_Framework_TestCase
                 'shared' => false
             )
         ));
+
+        $parent1 = $this->_object->create('Magento\Test\Di\DiParent');
+        $parent2 = $this->_object->create('Magento\Test\Di\DiParent');
+        $this->assertNotSame($parent1, $parent2);
+
         $childA = $this->_object->create('customChildType');
         $childB = $this->_object->create('customChildType');
         $this->assertNotSame($childA, $childB);
-        $this->assertNotSame($childA->interface, $childB->interface);
     }
 
     public function testParameterShareabilityConfigurationOverridesTypeShareability()
     {
+        $diParentMock = $this->getMock('Magento\Test\Di\DiParent', array(), array(), '', false);
+        $this->_argInterpreterMock->expects($this->any())
+            ->method('evaluate')
+            ->will($this->returnCallback(function (array $array) use ($diParentMock) {
+                if ($array === array('xsi:type' => 'object', 'value' => 'Magento\Test\Di\DiParent')) {
+                    return $this->_object->create('Magento\Test\Di\DiParent');
+                } elseif (
+                    $array === array('xsi:type' => 'object', 'value' => 'Magento\Test\Di\DiParent', 'shared' => true)
+                ) {
+                    return $diParentMock;
+                }
+            }));
+
         $this->_object->configure(array(
             'Magento\Test\Di\DiParent' => array(
                 'shared' => false
             ),
             'customChildType' => array(
                 'type' => 'Magento\Test\Di\Aggregate\Child',
-                'parameters' => array(
-                    'interface' => array('instance' => 'Magento\Test\Di\DiParent'),
-                    'scalar' => 'configuredScalar',
-                    'secondScalar' => 'configuredSecondScalar',
+                'arguments' => array(
+                    'interface' => array('xsi:type' => 'object', 'value' => 'Magento\Test\Di\DiParent'),
+                    'scalar' => array('xsi:type' => 'string', 'value' => 'configuredScalar'),
+                    'secondScalar' => array('xsi:type' => 'string', 'value' => 'configuredSecondScalar'),
                 )
             )
         ));
@@ -344,8 +364,9 @@ class ObjectManagerTest extends \PHPUnit_Framework_TestCase
 
         $this->_object->configure(array(
             'customChildType' => array(
-                'parameters' => array(
-                    'interface' => array('instance' => 'Magento\Test\Di\DiParent', 'shared' => true),
+                'arguments' => array(
+                    'interface'
+                        => array('xsi:type' => 'object', 'value' => 'Magento\Test\Di\DiParent', 'shared' => true),
                 )
             )
         ));
@@ -357,14 +378,21 @@ class ObjectManagerTest extends \PHPUnit_Framework_TestCase
 
     public function testGlobalArgumentsCanBeConfigured()
     {
+        $this->_argInterpreterMock->expects($this->any())
+            ->method('evaluate')
+            ->will($this->returnValueMap(array(
+                array(array('xsi:type' => 'init_parameter', 'value' => 'one'), 'first_val'),
+                array(array('xsi:type' => 'init_parameter', 'value' => 'two'), 'second_val'),
+            )));
+
         $this->_object->configure(array(
             'preferences' => array(
                 'Magento\Test\Di\DiInterface' => 'Magento\Test\Di\DiParent',
             ),
             'Magento\Test\Di\Aggregate\AggregateParent' => array(
-                'parameters' => array(
-                    'scalar' => array('argument' => 'one'),
-                    'optionalScalar' => array('argument' => 'two')
+                'arguments' => array(
+                    'scalar' => array('xsi:type' => 'init_parameter', 'value' => 'one'),
+                    'optionalScalar' => array('xsi:type' => 'init_parameter', 'value' => 'two')
                 )
             )
         ));
@@ -376,17 +404,27 @@ class ObjectManagerTest extends \PHPUnit_Framework_TestCase
 
     public function testConfiguredArgumentsAreInherited()
     {
+        $diParentMock = $this->getMock('Magento\Test\Di\DiParent', array(), array(), '', false);
+        $this->_argInterpreterMock->expects($this->any())
+            ->method('evaluate')
+            ->will($this->returnValueMap(array(
+                array(array('xsi:type' => 'init_parameter', 'value' => 'one'), 'first_val'),
+                array(array('xsi:type' => 'object', 'value' => 'Magento\Test\Di\DiParent'), $diParentMock),
+                array(array('xsi:type' => 'string', 'value' => 'parentOptionalScalar'), 'parentOptionalScalar'),
+                array(array('xsi:type' => 'string', 'value' => 'childSecondScalar'), 'childSecondScalar'),
+            )));
+
         $this->_object->configure(array(
             'Magento\Test\Di\Aggregate\AggregateParent' => array(
-                'parameters' => array(
-                    'interface' => array('instance' => 'Magento\Test\Di\DiParent'),
-                    'scalar' => array('argument' => 'one'),
-                    'optionalScalar' => 'parentOptionalScalar'
+                'arguments' => array(
+                    'interface' => array('xsi:type' => 'object', 'value' => 'Magento\Test\Di\DiParent'),
+                    'scalar' => array('xsi:type' => 'init_parameter', 'value' => 'one'),
+                    'optionalScalar' => array('xsi:type' => 'string', 'value' => 'parentOptionalScalar')
                 )
             ),
             'Magento\Test\Di\Aggregate\Child' => array(
-                'parameters' => array(
-                    'secondScalar' => 'childSecondScalar',
+                'arguments' => array(
+                    'secondScalar' => array('xsi:type' => 'string', 'value' => 'childSecondScalar'),
                 )
             )
         ));
@@ -401,20 +439,30 @@ class ObjectManagerTest extends \PHPUnit_Framework_TestCase
 
     public function testConfiguredArgumentsOverrideInheritedArguments()
     {
+        $diChildMock = $this->getMock('Magento\Test\Di\Child', array(), array(), '', false);
+        $this->_argInterpreterMock->expects($this->any())
+            ->method('evaluate')
+            ->will($this->returnValueMap(array(
+                array(array('xsi:type' => 'object', 'value' => 'Magento\Test\Di\Child'), $diChildMock),
+                array(array('xsi:type' => 'init_parameter', 'value' => 'two'), 'second_val'),
+                array(array('xsi:type' => 'string', 'value' => 'childSecondScalar'), 'childSecondScalar'),
+                array(array('xsi:type' => 'string', 'value' => 'childOptionalScalar'), 'childOptionalScalar'),
+            )));
+
         $this->_object->configure(array(
             'Magento\Test\Di\Aggregate\AggregateParent' => array(
-                'parameters' => array(
-                    'interface' => array('instance' => 'Magento\Test\Di\DiParent'),
-                    'scalar' => array('argument' => 'one'),
-                    'optionalScalar' => 'parentOptionalScalar'
+                'arguments' => array(
+                    'interface' => array('xsi:type' => 'object', 'value' => 'Magento\Test\Di\DiParent'),
+                    'scalar' => array('xsi:type' => 'init_parameter', 'value' => 'one'),
+                    'optionalScalar' => array('xsi:type' => 'string', 'value' => 'parentOptionalScalar')
                 )
             ),
             'Magento\Test\Di\Aggregate\Child' => array(
-                'parameters' => array(
-                    'interface' => array('instance' => 'Magento\Test\Di\Child'),
-                    'scalar' => array('argument' => 'two'),
-                    'secondScalar' => 'childSecondScalar',
-                    'optionalScalar' => 'childOptionalScalar'
+                'arguments' => array(
+                    'interface' => array('xsi:type' => 'object', 'value' => 'Magento\Test\Di\Child'),
+                    'scalar' => array('xsi:type' => 'init_parameter', 'value' => 'two'),
+                    'secondScalar' => array('xsi:type' => 'string', 'value' => 'childSecondScalar'),
+                    'optionalScalar' => array('xsi:type' => 'string', 'value' => 'childOptionalScalar')
                 )
             )
         ));
diff --git a/dev/tests/unit/testsuite/Magento/Phrase/Renderer/CompositeTest.php b/dev/tests/unit/testsuite/Magento/Phrase/Renderer/CompositeTest.php
index 6aaf52e1e6b..9ef3c8a390b 100644
--- a/dev/tests/unit/testsuite/Magento/Phrase/Renderer/CompositeTest.php
+++ b/dev/tests/unit/testsuite/Magento/Phrase/Renderer/CompositeTest.php
@@ -26,37 +26,34 @@ namespace Magento\Phrase\Renderer;
 class CompositeTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \Magento\Phrase\Renderer\Factory|PHPUnit_Framework_MockObject_MockObject
+     * @var Composite
      */
-    protected $_rendererFactory;
+    protected $object;
 
-    protected function setUp()
-    {
-        $this->_rendererFactory = $this->getMock('Magento\Phrase\Renderer\Factory', array(), array(), '', false);
-    }
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $rendererOne;
 
     /**
-     * @param array $renderers
-     * @return \Magento\Phrase\Renderer\Composite
+     * @var \PHPUnit_Framework_MockObject_MockObject
      */
-    protected function _createComposite($renderers = array())
-    {
-        $objectManagerHelper = new \Magento\TestFramework\Helper\ObjectManager($this);
+    protected $rendererTwo;
 
-        return $objectManagerHelper->getObject('Magento\Phrase\Renderer\Composite', array(
-            'rendererFactory' => $this->_rendererFactory,
-            'renderers' => $renderers,
-        ));
+    protected function setUp()
+    {
+        $this->rendererOne = $this->getMock('Magento\Phrase\RendererInterface');
+        $this->rendererTwo = $this->getMock('Magento\Phrase\RendererInterface');
+        $this->object = new \Magento\Phrase\Renderer\Composite(array($this->rendererOne, $this->rendererTwo));
     }
 
-    public function testCreatingRenderersWhenCompositeCreating()
+    /**
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage Instance of the phrase renderer is expected, got stdClass instead
+     */
+    public function testConstructorException()
     {
-        $this->_rendererFactory->expects($this->at(0))->method('create')->with('RenderClass1')
-            ->will($this->returnValue($this->getMockForAbstractClass('Magento\Phrase\RendererInterface')));
-        $this->_rendererFactory->expects($this->at(1))->method('create')->with('RenderClass2')
-            ->will($this->returnValue($this->getMockForAbstractClass('Magento\Phrase\RendererInterface')));
-
-        $this->_createComposite(array('RenderClass1', 'RenderClass2'));
+        new \Magento\Phrase\Renderer\Composite(array(new \stdClass()));
     }
 
     public function testRender()
@@ -66,22 +63,15 @@ class CompositeTest extends \PHPUnit_Framework_TestCase
         $resultAfterFirst = 'rendered text first';
         $resultAfterSecond = 'rendered text second';
 
-        $rendererFirst = $this->getMock('Magento\Phrase\RendererInterface');
-        $rendererFirst->expects($this->once())->method('render')->with($text, $arguments)
+        $this->rendererOne->expects($this->once())->method('render')->with($text, $arguments)
             ->will($this->returnValue($resultAfterFirst));
 
-        $rendererSecond = $this->getMock('Magento\Phrase\RendererInterface');
-        $rendererSecond->expects($this->once())->method('render')->with($resultAfterFirst, $arguments)
+        $this->rendererTwo->expects($this->once())->method('render')->with($resultAfterFirst, $arguments)
             ->will($this->returnValue($resultAfterSecond));
 
-        $this->_rendererFactory->expects($this->at(0))->method('create')->with('RenderClass1')
-            ->will($this->returnValue($rendererFirst));
-        $this->_rendererFactory->expects($this->at(1))->method('create')->with('RenderClass2')
-            ->will($this->returnValue($rendererSecond));
-
         $this->assertEquals(
             $resultAfterSecond,
-            $this->_createComposite(array('RenderClass1', 'RenderClass2'))->render($text, $arguments)
+            $this->object->render($text, $arguments)
         );
     }
 }
diff --git a/dev/tests/unit/testsuite/Magento/Phrase/Renderer/FactoryTest.php b/dev/tests/unit/testsuite/Magento/Phrase/Renderer/FactoryTest.php
deleted file mode 100644
index b97dc713610..00000000000
--- a/dev/tests/unit/testsuite/Magento/Phrase/Renderer/FactoryTest.php
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-namespace Magento\Phrase\Renderer;
-
-class FactoryTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \Magento\ObjectManager|PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $_objectManager;
-
-    /**
-     * @var \Magento\Phrase\Renderer\Factory
-     */
-    protected $_factory;
-
-    protected function setUp()
-    {
-        $this->_objectManager = $this->getMock('Magento\ObjectManager', array(), array(), '', false);
-
-        $objectManagerHelper = new \Magento\TestFramework\Helper\ObjectManager($this);
-        $this->_factory = $objectManagerHelper->getObject('Magento\Phrase\Renderer\Factory', array(
-            'objectManager' => $this->_objectManager,
-        ));
-    }
-
-    public function testCreate()
-    {
-        $className = 'class-name';
-        $rendererMock = $this->getMock('Magento\Phrase\RendererInterface');
-
-        $this->_objectManager->expects($this->once())->method('get')->with($className)
-            ->will($this->returnValue($rendererMock));
-
-        $this->assertEquals($rendererMock, $this->_factory->create($className));
-    }
-
-    /**
-     * @expectedException \InvalidArgumentException
-     * @expectedExceptionMessage Wrong renderer class-name
-     */
-    public function testWrongRendererException()
-    {
-        $className = 'class-name';
-        $rendererMock = $this->getMock('WrongInterface');
-
-        $this->_objectManager->expects($this->once())->method('get')->with($className)
-            ->will($this->returnValue($rendererMock));
-
-        $this->_factory->create($className);
-    }
-}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Block/Items/AbstractTest.php b/dev/tests/unit/testsuite/Magento/Sales/Block/Items/AbstractTest.php
index 1736965db12..d40b248d159 100644
--- a/dev/tests/unit/testsuite/Magento/Sales/Block/Items/AbstractTest.php
+++ b/dev/tests/unit/testsuite/Magento/Sales/Block/Items/AbstractTest.php
@@ -35,10 +35,12 @@ class AbstractTest extends \PHPUnit_Framework_TestCase
 
     public function testGetItemRenderer()
     {
-        $renderer = $this->getMock('Magento\View\Element\RendererList', array(), array(), '', false);
+        $rendererType = 'some-type';
+        $renderer = $this->getMock('Magento\View\Element\AbstractBlock', array('setRenderedBlock'), array(), '', false);
 
-        $renderer->expects($this->once())->method('getRenderer')
-            ->with('some-type', AbstractItems::DEFAULT_TYPE)->will($this->returnValue('rendererObject'));
+        $rendererList = $this->getMock('Magento\View\Element\RendererList', array(), array(), '', false);
+        $rendererList->expects($this->once())->method('getRenderer')
+            ->with($rendererType, AbstractItems::DEFAULT_TYPE)->will($this->returnValue($renderer));
 
         $layout = $this->getMock('Magento\Core\Model\Layout', array(
             'getChildName', 'getBlock'
@@ -51,7 +53,7 @@ class AbstractTest extends \PHPUnit_Framework_TestCase
         $layout->expects($this->once())
             ->method('getBlock')
             ->with('renderer.list')
-            ->will($this->returnValue($renderer));
+            ->will($this->returnValue($rendererList));
 
         /** @var $block \Magento\Sales\Block\Items\AbstractItems */
         $block = $this->_objectManager->getObject('Magento\Sales\Block\Items\AbstractItems', array(
@@ -60,14 +62,16 @@ class AbstractTest extends \PHPUnit_Framework_TestCase
             ))
         ));
 
-        $this->assertSame('rendererObject', $block->getItemRenderer('some-type'));
+        $renderer->expects($this->once())->method('setRenderedBlock')->with($block);
+
+        $this->assertSame($renderer, $block->getItemRenderer($rendererType));
     }
 
     /**
      * @expectedException \RuntimeException
      * @expectedExceptionMessage Renderer list for block "" is not defined
      */
-    public function testGetItemRendererThrowsExceptionForNonexistentRenderer()
+    public function te1stGetItemRendererThrowsExceptionForNonexistentRenderer()
     {
         $layout = $this->getMock('Magento\Core\Model\Layout', array(
             'getChildName', 'getBlock'
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/Observer/Backend/CatalogProductQuoteTest.php b/dev/tests/unit/testsuite/Magento/Sales/Model/Observer/Backend/CatalogProductQuoteTest.php
index e5705884fd2..1d4150fa726 100644
--- a/dev/tests/unit/testsuite/Magento/Sales/Model/Observer/Backend/CatalogProductQuoteTest.php
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/Observer/Backend/CatalogProductQuoteTest.php
@@ -79,19 +79,6 @@ class CatalogProductQuoteTest extends \PHPUnit_Framework_TestCase
         $this->_model->catalogProductSaveAfter($this->_observerMock);
     }
 
-    /**
-     * @param int $productId
-     * @param int $productStatus
-     * @dataProvider statusUpdateDataProvider
-     */
-    public function testStatusUpdate($productId, $productStatus)
-    {
-        $this->_eventMock->expects($this->once())->method('getStatus')->will($this->returnValue($productStatus));
-        $this->_eventMock->expects($this->once())->method('getProductId')->will($this->returnValue($productId));
-        $this->_quoteMock->expects($this->any())->method('markQuotesRecollect');
-        $this->_model->catalogProductStatusUpdate($this->_observerMock);
-    }
-
     public function statusUpdateDataProvider()
     {
         return array(
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Pdf/Config/XsdTest.php b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Pdf/Config/XsdTest.php
index 35cd27c2d82..8a226a4f8e4 100644
--- a/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Pdf/Config/XsdTest.php
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Pdf/Config/XsdTest.php
@@ -72,7 +72,7 @@ class XsdTest extends \PHPUnit_Framework_TestCase
      */
     protected function _testSchema($schema, $fixtureXml, array $expectedErrors)
     {
-        $dom = new \Magento\Config\Dom($fixtureXml, array(), null, '%message%');
+        $dom = new \Magento\Config\Dom($fixtureXml, array(), null, null, '%message%');
         $actualResult = $dom->validate($schema, $actualErrors);
         $this->assertEquals(empty($expectedErrors), $actualResult);
         $this->assertEquals($expectedErrors, $actualErrors);
diff --git a/dev/tests/unit/testsuite/Magento/Stdlib/BooleanUtilsTest.php b/dev/tests/unit/testsuite/Magento/Stdlib/BooleanUtilsTest.php
new file mode 100644
index 00000000000..1727f0eae51
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Stdlib/BooleanUtilsTest.php
@@ -0,0 +1,97 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Stdlib;
+
+class BooleanUtilsTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var BooleanUtils
+     */
+    protected $object;
+
+    protected function setUp()
+    {
+        $this->object = new BooleanUtils();
+    }
+
+    public function testConstructor()
+    {
+        $object = new BooleanUtils(array('yep'), array('nope'));
+        $this->assertTrue($object->toBoolean('yep'));
+        $this->assertFalse($object->toBoolean('nope'));
+    }
+
+    /**
+     * @param mixed $input
+     * @param bool $expected
+     *
+     * @dataProvider toBooleanDataProvider
+     */
+    public function testToBoolean($input, $expected)
+    {
+        $actual = $this->object->toBoolean($input);
+        $this->assertSame($expected, $actual);
+    }
+
+    public function toBooleanDataProvider()
+    {
+        return array(
+            'boolean "true"'         => array(true, true),
+            'boolean "false"'        => array(false, false),
+            'boolean string "true"'  => array('true', true),
+            'boolean string "false"' => array('false', false),
+            'boolean numeric "1"'    => array(1, true),
+            'boolean numeric "0"'    => array(0, false),
+            'boolean string "1"'     => array('1', true),
+            'boolean string "0"'     => array('0', false),
+        );
+    }
+
+    /**
+     * @param mixed $input
+     *
+     * @dataProvider toBooleanExceptionDataProvider
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage Boolean value is expected
+     */
+    public function testToBooleanException($input)
+    {
+        $this->object->toBoolean($input);
+    }
+
+    public function toBooleanExceptionDataProvider()
+    {
+        return array(
+            'boolean string "on"'    => array('on'),
+            'boolean string "off"'   => array('off'),
+            'boolean string "yes"'   => array('yes'),
+            'boolean string "no"'    => array('no'),
+            'boolean string "TRUE"'  => array('TRUE'),
+            'boolean string "FALSE"' => array('FALSE'),
+            'empty string'           => array(''),
+            'null'                   => array(null),
+        );
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Tax/Model/Resource/SetupTest.php b/dev/tests/unit/testsuite/Magento/Tax/Model/Resource/SetupTest.php
new file mode 100644
index 00000000000..5afde47193a
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Tax/Model/Resource/SetupTest.php
@@ -0,0 +1,60 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Tax\Model\Resource;
+
+class SetupTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Tax\Model\Resource\Setup
+     */
+    protected $taxSetup;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $typeConfigMock;
+
+    protected function setUp()
+    {
+        $helper = new \Magento\TestFramework\Helper\ObjectManager($this);
+        $this->typeConfigMock = $this->getMock('Magento\Catalog\Model\ProductTypes\ConfigInterface');
+        $this->taxSetup = $helper->getObject('Magento\Tax\Model\Resource\Setup', array(
+                'productTypeConfig' => $this->typeConfigMock
+            )
+        );
+    }
+
+    public function testGetTaxableItems()
+    {
+        $refundable = array('simple', 'simple2');
+        $this->typeConfigMock
+            ->expects($this->once())
+            ->method('filter')
+            ->with('taxable')
+            ->will($this->returnValue($refundable));
+        $this->assertEquals($refundable, $this->taxSetup->getTaxableItems());
+    }
+}
+
diff --git a/dev/tests/unit/testsuite/Magento/Tax/Model/TaxClass/Source/ProductTest.php b/dev/tests/unit/testsuite/Magento/Tax/Model/TaxClass/Source/ProductTest.php
new file mode 100644
index 00000000000..c25a8c8cc19
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Tax/Model/TaxClass/Source/ProductTest.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Tax
+ * @subpackage  unit_tests
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Tax\Model\TaxClass\Source;
+
+use Magento\TestFramework\Helper\ObjectManager;
+
+class ProductTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Tax\Model\TaxClass\Source\Product
+     */
+    protected $_model;
+
+    public function setUp()
+    {
+        $objectManager = new ObjectManager($this);
+        $this->_model = $objectManager->getObject('Magento\Tax\Model\TaxClass\Source\Product');
+    }
+
+    public function testGetFlatColums()
+    {
+        $abstractAttributeMock = $this->getMock(
+            '\Magento\Eav\Model\Entity\Attribute\AbstractAttribute',
+            array('getAttributeCode', '__wakeup'), array(), '', false
+        );
+
+        $abstractAttributeMock->expects($this->any())
+            ->method('getAttributeCode')
+            ->will($this->returnValue('code'));
+
+        $this->_model->setAttribute($abstractAttributeMock);
+
+        $flatColums = $this->_model->getFlatColums();
+
+        $this->assertTrue(is_array($flatColums), 'FlatColums must be an array value');
+        $this->assertTrue(!empty($flatColums), 'FlatColums must be not empty');
+        foreach ($flatColums as $result) {
+            $this->assertArrayHasKey('unsigned', $result, 'FlatColums must have "unsigned" column');
+            $this->assertArrayHasKey('default', $result, 'FlatColums must have "default" column');
+            $this->assertArrayHasKey('extra', $result, 'FlatColums must have "extra" column');
+            $this->assertArrayHasKey('type', $result, 'FlatColums must have "type" column');
+            $this->assertArrayHasKey('nullable', $result, 'FlatColums must have "nullable" column');
+            $this->assertArrayHasKey('comment', $result, 'FlatColums must have "comment" column');
+        }
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Parser/CodeTest.php b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Parser/CodeTest.php
new file mode 100644
index 00000000000..09e3974c003
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Parser/CodeTest.php
@@ -0,0 +1,87 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Test\Tools\Dependency\Parser;
+
+use Magento\TestFramework\Helper\ObjectManager;
+
+class CodeTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Tools\Dependency\Parser\Code
+     */
+    protected $parser;
+
+    protected function setUp()
+    {
+        $objectManagerHelper = new ObjectManager($this);
+        $this->parser = $objectManagerHelper->getObject('Magento\Tools\Dependency\Parser\Code');
+    }
+
+    /**
+     * @param array $options
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage Parse error: Option "files_for_parse" is wrong.
+     * @dataProvider dataProviderWrongOptionFilesForParse
+     */
+    public function testParseWithWrongOptionFilesForParse($options)
+    {
+        $this->parser->parse($options);
+    }
+
+    /**
+     * @return array
+     */
+    public function dataProviderWrongOptionFilesForParse()
+    {
+        return [
+            [['files_for_parse' => [], 'declared_namespaces' => [1, 2]]],
+            [['files_for_parse' => 'sting', 'declared_namespaces' => [1, 2]]],
+            [['there_are_no_files_for_parse' => [1, 3], 'declared_namespaces' => [1, 2]]],
+        ];
+    }
+
+    /**
+     * @param array $options
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage Parse error: Option "declared_namespaces" is wrong.
+     * @dataProvider dataProviderWrongOptionDeclaredNamespace
+     */
+    public function testParseWithWrongOptionDeclaredNamespace($options)
+    {
+        $this->parser->parse($options);
+    }
+
+    /**
+     * @return array
+     */
+    public function dataProviderWrongOptionDeclaredNamespace()
+    {
+        return [
+            [['declared_namespaces' => [], 'files_for_parse' => [1, 2]]],
+            [['declared_namespaces' => 'sting', 'files_for_parse' => [1, 2]]],
+            [['there_are_no_declared_namespaces' => [1, 3], 'files_for_parse' => [1, 2]]],
+        ];
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Parser/Config/XmlTest.php b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Parser/Config/XmlTest.php
new file mode 100644
index 00000000000..1af2a1f0e3b
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Parser/Config/XmlTest.php
@@ -0,0 +1,64 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Test\Tools\Dependency\Parser\Config;
+
+use Magento\TestFramework\Helper\ObjectManager;
+
+class XmlTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Tools\Dependency\Parser\Config\Xml
+     */
+    protected $parser;
+
+    protected function setUp()
+    {
+        $objectManagerHelper = new ObjectManager($this);
+        $this->parser = $objectManagerHelper->getObject('Magento\Tools\Dependency\Parser\Config\Xml');
+    }
+
+    /**
+     * @param array $options
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage Parse error: Option "files_for_parse" is wrong.
+     * @dataProvider dataProviderWrongOptionFilesForParse
+     */
+    public function testParseWithWrongOptionFilesForParse($options)
+    {
+        $this->parser->parse($options);
+    }
+
+    /**
+     * @return array
+     */
+    public function dataProviderWrongOptionFilesForParse()
+    {
+        return [
+            [['files_for_parse' => []]],
+            [['files_for_parse' => 'sting']],
+            [['there_are_no_files_for_parse' => [1, 3]]],
+        ];
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Builder/AbstractBuilderTest.php b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Builder/AbstractBuilderTest.php
new file mode 100644
index 00000000000..63bc5ed92be
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Builder/AbstractBuilderTest.php
@@ -0,0 +1,123 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Test\Tools\Dependency\Report\Builder;
+
+class AbstractBuilderTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Tools\Dependency\ParserInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $dependenciesParserMock;
+
+    /**
+     * @var \Magento\Tools\Dependency\Report\WriterInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $reportWriterMock;
+
+    /**
+     * @var \Magento\Tools\Dependency\Report\Builder\AbstractBuilder|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $builder;
+
+    protected function setUp()
+    {
+        $this->dependenciesParserMock = $this->getMock('Magento\Tools\Dependency\ParserInterface');
+        $this->reportWriterMock = $this->getMock('Magento\Tools\Dependency\Report\WriterInterface');
+
+        $this->builder = $this->getMockForAbstractClass('Magento\Tools\Dependency\Report\Builder\AbstractBuilder', [
+            'dependenciesParser' => $this->dependenciesParserMock,
+            'reportWriter' => $this->reportWriterMock,
+        ]);
+    }
+
+    /**
+     * @param array $options
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage Passed option section "parse" is wrong.
+     * @dataProvider dataProviderWrongParseOptions
+     */
+    public function testBuildWithWrongParseOptions($options)
+    {
+        $this->builder->build($options);
+    }
+
+    /**
+     * @return array
+     */
+    public function dataProviderWrongParseOptions()
+    {
+        return [
+            [['write' => [1, 2]]],
+            [['parse' => [], 'write' => [1, 2]]],
+        ];
+    }
+
+    /**
+     * @param array $options
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage Passed option section "write" is wrong.
+     * @dataProvider dataProviderWrongWriteOptions
+     */
+    public function testBuildWithWrongWriteOptions($options)
+    {
+        $this->builder->build($options);
+    }
+
+    /**
+     * @return array
+     */
+    public function dataProviderWrongWriteOptions()
+    {
+        return [
+            [['parse' => [1, 2]]],
+            [['parse' => [1, 2], 'write' => []]],
+        ];
+    }
+
+    public function testBuild()
+    {
+        $options = [
+            'parse' => [
+                'files_for_parse' => [1, 2, 3],
+            ],
+            'write' => [
+                'report_filename' => 'some_filename'
+            ],
+        ];
+
+
+        $parseResult = ['foo', 'bar', 'baz'];
+        $configMock = $this->getMock('\Magento\Tools\Dependency\Report\Data\ConfigInterface');
+
+        $this->dependenciesParserMock->expects($this->once())->method('parse')->with($options['parse'])
+            ->will($this->returnValue($parseResult));
+        $this->builder->expects($this->once())->method('buildData')->with($parseResult)
+            ->will($this->returnValue($configMock));
+        $this->reportWriterMock->expects($this->once())->method('write')
+            ->with($options['write'], $configMock);
+
+        $this->builder->build($options);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Circular/Data/ChainTest.php b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Circular/Data/ChainTest.php
new file mode 100644
index 00000000000..45898769cd1
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Circular/Data/ChainTest.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Test\Tools\Dependency\Report\Circular\Data;
+
+use Magento\TestFramework\Helper\ObjectManager;
+
+class ChainTest extends \PHPUnit_Framework_TestCase
+{
+    public function testGetModules()
+    {
+        $modules = ['foo', 'baz', 'bar'];
+
+        $objectManagerHelper = new ObjectManager($this);
+        /** @var \Magento\Tools\Dependency\Report\Circular\Data\Chain $chain */
+        $chain = $objectManagerHelper->getObject('Magento\Tools\Dependency\Report\Circular\Data\Chain', [
+            'modules' => $modules,
+        ]);
+
+        $this->assertEquals($modules, $chain->getModules());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Circular/Data/ConfigTest.php b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Circular/Data/ConfigTest.php
new file mode 100644
index 00000000000..e004380309d
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Circular/Data/ConfigTest.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Test\Tools\Dependency\Report\Circular\Data;
+
+use Magento\TestFramework\Helper\ObjectManager;
+
+class ConfigTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Tools\Dependency\Report\Circular\Data\Module|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $moduleFirst;
+
+    /**
+     * @var \Magento\Tools\Dependency\Report\Circular\Data\Module|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $moduleSecond;
+
+    /**
+     * @var \Magento\Tools\Dependency\Report\Circular\Data\Config
+     */
+    protected $config;
+
+    public function setUp()
+    {
+        $this->moduleFirst = $this->getMock('Magento\Tools\Dependency\Report\Circular\Data\Module', [], [], '',
+            false);
+        $this->moduleSecond = $this->getMock('Magento\Tools\Dependency\Report\Circular\Data\Module', [], [], '',
+            false);
+
+        $objectManagerHelper = new ObjectManager($this);
+        $this->config = $objectManagerHelper->getObject('Magento\Tools\Dependency\Report\Circular\Data\Config', [
+            'modules' => [$this->moduleFirst, $this->moduleSecond],
+        ]);
+    }
+
+    public function testGetDependenciesCount()
+    {
+        $this->moduleFirst->expects($this->once())->method('getChainsCount')->will($this->returnValue(0));
+        $this->moduleSecond->expects($this->once())->method('getChainsCount')->will($this->returnValue(2));
+
+        $this->assertEquals(2, $this->config->getDependenciesCount());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Circular/Data/ModuleTest.php b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Circular/Data/ModuleTest.php
new file mode 100644
index 00000000000..b39f1f39f52
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Circular/Data/ModuleTest.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Test\Tools\Dependency\Report\Circular\Data;
+
+use Magento\TestFramework\Helper\ObjectManager;
+
+class ModuleTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @param string $name
+     * @param array $chains
+     * @return \Magento\Tools\Dependency\Report\Circular\Data\Module
+     */
+    protected function createModule($name, $chains = array())
+    {
+        $objectManagerHelper = new ObjectManager($this);
+        return $objectManagerHelper->getObject('Magento\Tools\Dependency\Report\Circular\Data\Module', [
+            'name' => $name,
+            'chains' => $chains,
+        ]);
+    }
+
+    public function testGetName()
+    {
+        $name = 'name';
+        $module = $this->createModule($name, []);
+
+        $this->assertEquals($name, $module->getName());
+    }
+
+    public function testGetChains()
+    {
+        $chains = ['foo', 'baz', 'bar'];
+        $module = $this->createModule('name', $chains);
+
+        $this->assertEquals($chains, $module->getChains());
+    }
+
+    public function testGetChainsCount()
+    {
+        $module = $this->createModule('name', ['foo', 'baz', 'bar']);
+
+        $this->assertEquals(3, $module->getChainsCount());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Data/Config/AbstractConfigTest.php b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Data/Config/AbstractConfigTest.php
new file mode 100644
index 00000000000..bfed7c54c06
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Data/Config/AbstractConfigTest.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Test\Tools\Dependency\Report\Data\Config;
+
+class AbstractConfigTest extends \PHPUnit_Framework_TestCase
+{
+    public function testGetModules()
+    {
+        $modules = ['foo', 'baz', 'bar'];
+
+        /** @var \Magento\Tools\Dependency\Report\Data\Config\AbstractConfig $config */
+        $config = $this->getMockForAbstractClass('Magento\Tools\Dependency\Report\Data\Config\AbstractConfig', [
+            'modules' => $modules,
+        ]);
+
+        $this->assertEquals($modules, $config->getModules());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Dependency/Data/ConfigTest.php b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Dependency/Data/ConfigTest.php
new file mode 100644
index 00000000000..c35bcb5eae5
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Dependency/Data/ConfigTest.php
@@ -0,0 +1,91 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Test\Tools\Dependency\Report\Dependency\Data;
+
+use Magento\TestFramework\Helper\ObjectManager;
+
+class ConfigTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Tools\Dependency\Report\Dependency\Data\Module|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $moduleFirst;
+
+    /**
+     * @var \Magento\Tools\Dependency\Report\Dependency\Data\Module|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $moduleSecond;
+
+    /**
+     * @var \Magento\Tools\Dependency\Report\Dependency\Data\Config
+     */
+    protected $config;
+
+    public function setUp()
+    {
+        $this->moduleFirst = $this->getMock('Magento\Tools\Dependency\Report\Dependency\Data\Module', [], [], '',
+            false);
+        $this->moduleSecond = $this->getMock('Magento\Tools\Dependency\Report\Dependency\Data\Module', [], [], '',
+            false);
+
+        $objectManagerHelper = new ObjectManager($this);
+        $this->config = $objectManagerHelper->getObject('Magento\Tools\Dependency\Report\Dependency\Data\Config', [
+            'modules' => [$this->moduleFirst, $this->moduleSecond],
+        ]);
+    }
+
+    public function testGetDependenciesCount()
+    {
+        $this->moduleFirst->expects($this->once())->method('getHardDependenciesCount')->will($this->returnValue(1));
+        $this->moduleFirst->expects($this->once())->method('getSoftDependenciesCount')->will($this->returnValue(2));
+
+        $this->moduleSecond->expects($this->once())->method('getHardDependenciesCount')->will($this->returnValue(3));
+        $this->moduleSecond->expects($this->once())->method('getSoftDependenciesCount')->will($this->returnValue(4));
+
+        $this->assertEquals(10, $this->config->getDependenciesCount());
+    }
+
+    public function testGetHardDependenciesCount()
+    {
+        $this->moduleFirst->expects($this->once())->method('getHardDependenciesCount')->will($this->returnValue(1));
+        $this->moduleFirst->expects($this->never())->method('getSoftDependenciesCount');
+
+        $this->moduleSecond->expects($this->once())->method('getHardDependenciesCount')->will($this->returnValue(2));
+        $this->moduleSecond->expects($this->never())->method('getSoftDependenciesCount');
+
+        $this->assertEquals(3, $this->config->getHardDependenciesCount());
+    }
+
+    public function testGetSoftDependenciesCount()
+    {
+        $this->moduleFirst->expects($this->never())->method('getHardDependenciesCount');
+        $this->moduleFirst->expects($this->once())->method('getSoftDependenciesCount')->will($this->returnValue(1));
+
+        $this->moduleSecond->expects($this->never())->method('getHardDependenciesCount');
+        $this->moduleSecond->expects($this->once())->method('getSoftDependenciesCount')->will($this->returnValue(3));
+
+        $this->assertEquals(4, $this->config->getSoftDependenciesCount());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Dependency/Data/DependencyTest.php b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Dependency/Data/DependencyTest.php
new file mode 100644
index 00000000000..9723751befd
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Dependency/Data/DependencyTest.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Test\Tools\Dependency\Report\Dependency\Data;
+
+use Magento\TestFramework\Helper\ObjectManager;
+use Magento\Tools\Dependency\Report\Dependency\Data\Dependency;
+
+class DependencyTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @param string $module
+     * @param string|null $type One of \Magento\Tools\Dependency\Dependency::TYPE_ const
+     * @return \Magento\Tools\Dependency\Report\Dependency\Data\Dependency
+     */
+    protected function createDependency($module, $type = null)
+    {
+        $objectManagerHelper = new ObjectManager($this);
+        return $objectManagerHelper->getObject('Magento\Tools\Dependency\Report\Dependency\Data\Dependency', [
+            'module' => $module,
+            'type' => $type,
+        ]);
+    }
+
+    public function testGetModule()
+    {
+        $module = 'module';
+
+        $dependency = $this->createDependency($module);
+
+        $this->assertEquals($module, $dependency->getModule());
+    }
+
+    public function testGetType()
+    {
+        $type = Dependency::TYPE_SOFT;
+
+        $dependency = $this->createDependency('module', $type);
+
+        $this->assertEquals($type, $dependency->getType());
+    }
+
+    public function testThatHardTypeIsDefault()
+    {
+        $dependency = $this->createDependency('module');
+
+        $this->assertEquals(Dependency::TYPE_HARD, $dependency->getType());
+    }
+
+    public function testThatHardTypeIsDefaultIfPassedWrongType()
+    {
+        $dependency = $this->createDependency('module', 'wrong_type');
+
+        $this->assertEquals(Dependency::TYPE_HARD, $dependency->getType());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Dependency/Data/ModuleTest.php b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Dependency/Data/ModuleTest.php
new file mode 100644
index 00000000000..a30b2ff549d
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Dependency/Data/ModuleTest.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Test\Tools\Dependency\Report\Dependency\Data;
+
+use Magento\TestFramework\Helper\ObjectManager;
+
+class ModuleTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Tools\Dependency\Report\Dependency\Data\Dependency|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $dependencyFirst;
+
+    /**
+     * @var \Magento\Tools\Dependency\Report\Dependency\Data\Dependency|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $dependencySecond;
+
+    /**
+     * @var \Magento\Tools\Dependency\Report\Dependency\Data\Module
+     */
+    protected $module;
+
+    public function setUp()
+    {
+        $this->dependencyFirst = $this->getMock('Magento\Tools\Dependency\Report\Dependency\Data\Dependency', [], [],
+            '', false);
+        $this->dependencySecond = $this->getMock('Magento\Tools\Dependency\Report\Dependency\Data\Dependency', [], [],
+            '', false);
+
+        $objectManagerHelper = new ObjectManager($this);
+        $this->module = $objectManagerHelper->getObject('Magento\Tools\Dependency\Report\Dependency\Data\Module', [
+            'name' => 'name',
+            'dependencies' => [$this->dependencyFirst, $this->dependencySecond],
+        ]);
+    }
+
+    public function testGetName()
+    {
+        $this->assertEquals('name', $this->module->getName());
+    }
+
+    public function testGetDependencies()
+    {
+        $this->assertEquals([$this->dependencyFirst, $this->dependencySecond], $this->module->getDependencies());
+    }
+
+    public function testGetDependenciesCount()
+    {
+        $this->assertEquals(2, $this->module->getDependenciesCount());
+    }
+
+    public function testGetHardDependenciesCount()
+    {
+        $this->dependencyFirst->expects($this->once())->method('isHard')->will($this->returnValue(true));
+        $this->dependencyFirst->expects($this->never())->method('isSoft');
+
+        $this->dependencySecond->expects($this->once())->method('isHard')->will($this->returnValue(false));
+        $this->dependencySecond->expects($this->never())->method('isSoft');
+
+        $this->assertEquals(1, $this->module->getHardDependenciesCount());
+    }
+
+    public function testGetSoftDependenciesCount()
+    {
+        $this->dependencyFirst->expects($this->never())->method('isHard');
+        $this->dependencyFirst->expects($this->once())->method('isSoft')->will($this->returnValue(true));
+
+        $this->dependencySecond->expects($this->never())->method('isHard');
+        $this->dependencySecond->expects($this->once())->method('isSoft')->will($this->returnValue(false));
+
+        $this->assertEquals(1, $this->module->getSoftDependenciesCount());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Framework/BuilderTest.php b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Framework/BuilderTest.php
new file mode 100644
index 00000000000..1797911f0e6
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Framework/BuilderTest.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Test\Tools\Dependency\Report\Framework;
+
+use Magento\TestFramework\Helper\ObjectManager;
+
+class BuilderTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Tools\Dependency\Report\Framework\Builder
+     */
+    protected $builder;
+
+    protected function setUp()
+    {
+        $objectManagerHelper = new ObjectManager($this);
+        $this->builder = $objectManagerHelper->getObject('Magento\Tools\Dependency\Report\Framework\Builder');
+    }
+
+    /**
+     * @param array $options
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage Parse error. Passed option "config_files" is wrong.
+     * @dataProvider dataProviderWrongOptionConfigFiles
+     */
+    public function testBuildWithWrongOptionConfigFiles($options)
+    {
+        $this->builder->build($options);
+    }
+
+    /**
+     * @return array
+     */
+    public function dataProviderWrongOptionConfigFiles()
+    {
+        return [
+            [
+                ['parse' => ['files_for_parse' => [1, 2], 'config_files' => []], 'write' => [1, 2]],
+            ],
+            [
+                ['parse' => ['files_for_parse' => [1, 2]], 'write' => [1, 2]],
+            ],
+        ];
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Framework/Data/ConfigTest.php b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Framework/Data/ConfigTest.php
new file mode 100644
index 00000000000..5aa6837cac1
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Framework/Data/ConfigTest.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Test\Tools\Dependency\Report\Framework\Data;
+
+use Magento\TestFramework\Helper\ObjectManager;
+
+class ConfigTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Tools\Dependency\Report\Framework\Data\Module|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $moduleFirst;
+
+    /**
+     * @var \Magento\Tools\Dependency\Report\Framework\Data\Module|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $moduleSecond;
+
+    /**
+     * @var \Magento\Tools\Dependency\Report\Framework\Data\Config
+     */
+    protected $config;
+
+    public function setUp()
+    {
+        $this->moduleFirst = $this->getMock('Magento\Tools\Dependency\Report\Framework\Data\Module', [], [], '',
+            false);
+        $this->moduleSecond = $this->getMock('Magento\Tools\Dependency\Report\Framework\Data\Module', [], [], '',
+            false);
+
+        $objectManagerHelper = new ObjectManager($this);
+        $this->config = $objectManagerHelper->getObject('Magento\Tools\Dependency\Report\Framework\Data\Config', [
+            'modules' => [$this->moduleFirst, $this->moduleSecond],
+        ]);
+    }
+
+    public function testGetDependenciesCount()
+    {
+        $this->moduleFirst->expects($this->once())->method('getDependenciesCount')->will($this->returnValue(0));
+        $this->moduleSecond->expects($this->once())->method('getDependenciesCount')->will($this->returnValue(2));
+
+        $this->assertEquals(2, $this->config->getDependenciesCount());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Framework/Data/DependencyTest.php b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Framework/Data/DependencyTest.php
new file mode 100644
index 00000000000..c5121cc11a5
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Framework/Data/DependencyTest.php
@@ -0,0 +1,62 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Test\Tools\Dependency\Report\Framework\Data;
+
+use Magento\TestFramework\Helper\ObjectManager;
+
+class DependencyTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @param string $lib
+     * @param int $count
+     * @return \Magento\Tools\Dependency\Report\Framework\Data\Dependency
+     */
+    protected function createDependency($lib, $count)
+    {
+        $objectManagerHelper = new ObjectManager($this);
+        return $objectManagerHelper->getObject('Magento\Tools\Dependency\Report\Framework\Data\Dependency', [
+            'lib' => $lib,
+            'count' => $count,
+        ]);
+    }
+
+    public function testGetLib()
+    {
+        $lib = 'lib';
+
+        $dependency = $this->createDependency($lib, 0);
+
+        $this->assertEquals($lib, $dependency->getLib());
+    }
+
+    public function testGetCount()
+    {
+        $count = 3;
+
+        $dependency = $this->createDependency('lib', $count);
+
+        $this->assertEquals($count, $dependency->getCount());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Framework/Data/ModuleTest.php b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Framework/Data/ModuleTest.php
new file mode 100644
index 00000000000..e8a9c66c853
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Framework/Data/ModuleTest.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Test\Tools\Dependency\Report\Framework\Data;
+
+use Magento\TestFramework\Helper\ObjectManager;
+
+class ModuleTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @param string $name
+     * @param array $dependencies
+     * @return \Magento\Tools\Dependency\Report\Framework\Data\Module
+     */
+    protected function createModule($name, $dependencies = array())
+    {
+        $objectManagerHelper = new ObjectManager($this);
+        return $objectManagerHelper->getObject('Magento\Tools\Dependency\Report\Framework\Data\Module', [
+            'name' => $name,
+            'dependencies' => $dependencies,
+        ]);
+    }
+
+    public function testGetName()
+    {
+        $name = 'name';
+        $module = $this->createModule($name, []);
+
+        $this->assertEquals($name, $module->getName());
+    }
+
+    public function testGetDependencies()
+    {
+        $dependencies = ['foo', 'baz', 'bar'];
+        $module = $this->createModule('name', $dependencies);
+
+        $this->assertEquals($dependencies, $module->getDependencies());
+    }
+
+    public function testGetDependenciesCount()
+    {
+        $module = $this->createModule('name', ['foo', 'baz', 'bar']);
+
+        $this->assertEquals(3, $module->getDependenciesCount());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Writer/Csv/AbstractWriterTest.php b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Writer/Csv/AbstractWriterTest.php
new file mode 100644
index 00000000000..f2330f78bb1
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Test/Tools/Dependency/Report/Writer/Csv/AbstractWriterTest.php
@@ -0,0 +1,84 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Test\Tools\Dependency\Report\Writer\Csv;
+
+class AbstractWriterTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Tools\Dependency\Report\Writer\Csv\AbstractWriter|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $writer;
+
+    /**
+     * @var \Magento\File\Csv|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $csvMock;
+
+    protected function setUp()
+    {
+        $this->csvMock = $this->getMock('Magento\File\Csv');
+
+        $this->writer = $this->getMockForAbstractClass('Magento\Tools\Dependency\Report\Writer\Csv\AbstractWriter', [
+            'writer' => $this->csvMock,
+        ]);
+    }
+
+    public function testWrite()
+    {
+        $options = ['report_filename' => 'some_filename'];
+        $configMock = $this->getMock('Magento\Tools\Dependency\Report\Data\ConfigInterface');
+        $preparedData = ['foo', 'baz', 'bar'];
+
+        $this->writer->expects($this->once())->method('prepareData')->with($configMock)
+            ->will($this->returnValue($preparedData));
+        $this->csvMock->expects($this->once())->method('saveData')->with($options['report_filename'], $preparedData);
+
+        $this->writer->write($options, $configMock);
+    }
+
+    /**
+     * @param array $options
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage Writing error: Passed option "report_filename" is wrong.
+     * @dataProvider dataProviderWrongOptionReportFilename
+     */
+    public function testWriteWithWrongOptionReportFilename($options)
+    {
+        $configMock = $this->getMock('Magento\Tools\Dependency\Report\Data\ConfigInterface');
+
+        $this->writer->write($options, $configMock);
+    }
+
+    /**
+     * @return array
+     */
+    public function dataProviderWrongOptionReportFilename()
+    {
+        return [
+            [['report_filename' => '']],
+            [['there_are_no_report_filename' => 'some_name']],
+        ];
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Test/Tools/Di/Code/Scanner/XmlScannerTest.php b/dev/tests/unit/testsuite/Magento/Test/Tools/Di/Code/Scanner/XmlScannerTest.php
index 3731961e320..4e5a3e069c0 100644
--- a/dev/tests/unit/testsuite/Magento/Test/Tools/Di/Code/Scanner/XmlScannerTest.php
+++ b/dev/tests/unit/testsuite/Magento/Test/Tools/Di/Code/Scanner/XmlScannerTest.php
@@ -66,6 +66,8 @@ class XmlScannerTest extends \PHPUnit_Framework_TestCase
             'Invalid proxy class for ' . substr($className, 0, -5));
         $this->_logMock->expects($this->at(1))->method('add')->with(4, '\Magento\SomeModule\Model\Element\Proxy',
             'Invalid proxy class for ' . substr('\Magento\SomeModule\Model\Element\Proxy', 0, -5));
+        $this->_logMock->expects($this->at(2))->method('add')->with(4, '\Magento\SomeModule\Model\Nested\Element\Proxy',
+            'Invalid proxy class for ' . substr('\Magento\SomeModule\Model\Nested\Element\Proxy', 0, -5));
         $actual = $this->_model->collectEntities($this->_testFiles);
         $expected = array(
             'Magento\Core\Model\App\Proxy'
diff --git a/dev/tests/unit/testsuite/Magento/Test/Tools/Di/_files/app/code/Magento/SomeModule/etc/di.xml b/dev/tests/unit/testsuite/Magento/Test/Tools/Di/_files/app/code/Magento/SomeModule/etc/di.xml
index bdc328046b3..da3ddccfbef 100644
--- a/dev/tests/unit/testsuite/Magento/Test/Tools/Di/_files/app/code/Magento/SomeModule/etc/di.xml
+++ b/dev/tests/unit/testsuite/Magento/Test/Tools/Di/_files/app/code/Magento/SomeModule/etc/di.xml
@@ -23,7 +23,7 @@
  * @license    http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <preference for="Magento\AppInterface" type="Magento\Core\Model\App\Proxy" />
     <preference for="Magento\Core\Model\Config\InvalidatorInterface" type="Magento\Core\Model\Config\Invalidator\Proxy" />
     <preference for="Magento\App\CacheInterface" type="Magento\App\Cache\Proxy" />
@@ -31,8 +31,11 @@
         <plugin name="tag" type="Magento\App\Cache\TagPlugin" />
     </virtualType>
     <type name="Magento\SomeModule\Model\Test">
-        <param name="proxy">
-            <instance type="\Magento\SomeModule\Model\Element\Proxy" />
-        </param>
+        <arguments>
+            <argument name="proxy" xsi:type="object">\Magento\SomeModule\Model\Element\Proxy</argument>
+            <argument name="array" xsi:type="array">
+                <item xsi:type="object">\Magento\SomeModule\Model\Nested\Element\Proxy</item>
+            </argument>
+        </arguments>
     </type>
 </config>
diff --git a/dev/tests/unit/testsuite/Magento/Test/Tools/Di/_files/app/etc/di/config.xml b/dev/tests/unit/testsuite/Magento/Test/Tools/Di/_files/app/etc/di/config.xml
index 42dda6ca76c..72290aae726 100644
--- a/dev/tests/unit/testsuite/Magento/Test/Tools/Di/_files/app/etc/di/config.xml
+++ b/dev/tests/unit/testsuite/Magento/Test/Tools/Di/_files/app/etc/di/config.xml
@@ -23,12 +23,16 @@
  * @license    http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 -->
-<config>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <type name="Magento\App\Cache">
-        <param name="storeManager"><instance type="customStoreManagerProxy" /></param>
+        <arguments>
+            <argument name="storeManager" xsi:type="object">customStoreManagerProxy</argument>
+        </arguments>
     </type>
     <type name="Magento\App\Action\Context">
-        <param name="layoutFactory"><instance type="customLayoutFactory" /></param>
+        <arguments>
+            <argument name="layoutFactory" xsi:type="object">customLayoutFactory</argument>
+        </arguments>
         <plugin name="first" type="Magento\Core\Model\Action\Plugin" />
     </type>
     <virtualType name="customStoreManagerProxy" type="Magento\Core\Model\StoreManager\Proxy" />
diff --git a/dev/tests/unit/testsuite/Magento/Validator/BuilderTest.php b/dev/tests/unit/testsuite/Magento/Validator/BuilderTest.php
index 52b6861fee8..21ea56b1824 100644
--- a/dev/tests/unit/testsuite/Magento/Validator/BuilderTest.php
+++ b/dev/tests/unit/testsuite/Magento/Validator/BuilderTest.php
@@ -27,6 +27,11 @@
 
 namespace Magento\Validator;
 
+/**
+ * Class BuilderTest
+ *
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
 class BuilderTest extends \PHPUnit_Framework_TestCase
 {
     /**
@@ -34,9 +39,23 @@ class BuilderTest extends \PHPUnit_Framework_TestCase
      */
     protected $_objectManager;
 
+    /**
+     * @var \Magento\ObjectManager\ObjectManager
+     */
+    protected $_realObjectManager;
+
     protected function setUp()
     {
         $this->_objectManager = new \Magento\TestFramework\Helper\ObjectManager($this);
+
+        $argInterpreter = $this->getMock('\Magento\Data\Argument\InterpreterInterface', array(), array(), '', false);
+        $argObjectFactory =
+            $this->getMock('\Magento\ObjectManager\Config\Argument\ObjectFactory', array(), array(), '', false);
+        $config = new \Magento\ObjectManager\Config\Config(new \Magento\ObjectManager\Relations\Runtime());
+        $factory = new \Magento\ObjectManager\Factory\Factory(
+            $config, $argInterpreter, $argObjectFactory, null
+        );
+        $this->_realObjectManager = new \Magento\ObjectManager\ObjectManager($factory, $config);
     }
 
     /**
@@ -53,12 +72,9 @@ class BuilderTest extends \PHPUnit_Framework_TestCase
         $builder = $this->_objectManager->getObject(
             'Magento\Validator\Builder',
             array(
-                'constraintFactory'
-                    => new \Magento\Validator\ConstraintFactory(new \Magento\ObjectManager\ObjectManager()),
-                'validatorFactory'
-                    => new \Magento\ValidatorFactory(new \Magento\ObjectManager\ObjectManager()),
-                'oneValidatorFactory'
-                    => new \Magento\Validator\UniversalFactory(new \Magento\ObjectManager\ObjectManager()),
+                'constraintFactory' => new \Magento\Validator\ConstraintFactory($this->_realObjectManager),
+                'validatorFactory' => new \Magento\ValidatorFactory($this->_realObjectManager),
+                'oneValidatorFactory' => new \Magento\Validator\UniversalFactory($this->_realObjectManager),
                 'constraints' => $constraints
             )
         );
@@ -85,7 +101,9 @@ class BuilderTest extends \PHPUnit_Framework_TestCase
             'alias' => 'name_alias',
             'class' => 'Magento\Validator\Test\StringLength',
             'options' => array(
-                'arguments' => array('min' => 1, 'max' => new \Magento\Validator\Constraint\Option(20))
+                'arguments' => array(
+                    'options' => array('min' => 1, 'max' => new \Magento\Validator\Constraint\Option(20))
+                )
             ),
             'property' => 'name',
             'type' => 'property',
@@ -211,15 +229,14 @@ class BuilderTest extends \PHPUnit_Framework_TestCase
             array('Magento\Validator\Test\Callback', 'getId')
         );
         $someMethod = array('method' => 'getMessages');
-        $methodWithArgs = array('method' => 'setMax', 'arguments' => array(100));
-        $constructorArgs = array('arguments' => array(array('max' => '50')));
+        $methodWithArgs = array('method' => 'someMethod', 'arguments' => array('some_value_to_pass'));
         $callbackConfig = array('callback' => $callback);
 
         $configuredConstraint = array(
             'alias' => 'current_alias',
-            'class' => 'Magento\Validator\Test\NotEmpty',
+            'class' => 'Some\Validator\Class',
             'options' => array(
-                'arguments' => array(array('min' => 1)),
+                'arguments' => array('some_argument' => 'some_value'),
                 'callback' => array($callback),
                 'methods' => array($someMethod)
             ),
@@ -228,15 +245,15 @@ class BuilderTest extends \PHPUnit_Framework_TestCase
         );
         $emptyConstraint = array(
             'alias' => 'current_alias',
-            'class' => 'Magento\Validator\Test\NotEmpty',
+            'class' => 'Some\Validator\Class',
             'options' => null,
             'property' => 'int',
             'type' => 'property'
         );
         $constraintWithArgs = array(
             'alias' => 'current_alias',
-            'class' => 'Magento\Validator\Test\NotEmpty',
-            'options' => array('arguments' => array(array('min' => 1))),
+            'class' => 'Some\Validator\Class',
+            'options' => array('arguments' => array('some_argument' => 'some_value')),
             'property' => 'int',
             'type' => 'property'
         );
@@ -251,8 +268,25 @@ class BuilderTest extends \PHPUnit_Framework_TestCase
                 $callbackConfig, array($this->_getExpectedConstraints($emptyConstraint, 'callback', array($callback)))),
 
             'constraint options initialized with arguments' => array(
-                array($emptyConstraint), 'current_alias', $constructorArgs,
-                array($this->_getExpectedConstraints($emptyConstraint, 'arguments', array(array('max' => '50'))))
+                array($emptyConstraint),
+                'current_alias',
+                array('arguments' => array('some_argument' => 'some_value')),
+                array(
+                    $this->_getExpectedConstraints($emptyConstraint, 'arguments',
+                        array('some_argument' => 'some_value')
+                    ),
+                ),
+            ),
+
+            'constraint options arguments overwritten by newer arguments' => array(
+                array($configuredConstraint),
+                'current_alias',
+                array('arguments' => array('some_argument' => 'some_value')),
+                array(
+                    $this->_getExpectedConstraints($configuredConstraint, 'arguments',
+                        array('some_argument' => 'some_value')
+                    ),
+                ),
             ),
 
             'methods initialized' => array(
@@ -314,7 +348,7 @@ class BuilderTest extends \PHPUnit_Framework_TestCase
         }
         $constraints = array(array(
             'alias' => 'alias',
-            'class' => 'Magento\Validator\Test\True',
+            'class' => 'Some\Validator\Class',
             'options' => $options,
             'type' => 'entity'
         ));
@@ -339,7 +373,7 @@ class BuilderTest extends \PHPUnit_Framework_TestCase
 
         $constraints = array(array(
             'alias' => 'alias',
-            'class' => 'Magento\Validator\Test\True',
+            'class' => 'Some\Validator\Class',
             'options' => null,
             'type' => 'entity'
         ));
@@ -411,7 +445,7 @@ class BuilderTest extends \PHPUnit_Framework_TestCase
                     'options' => null,
                     'type' => 'entity'
                 )),
-                'validatorFactory' => new \Magento\ValidatorFactory(new \Magento\ObjectManager\ObjectManager()),
+                'validatorFactory' => new \Magento\ValidatorFactory($this->_realObjectManager),
             )
         );
         $builder->createValidator();
@@ -431,7 +465,7 @@ class BuilderTest extends \PHPUnit_Framework_TestCase
     {
         $constraints = array(array(
             'alias' => 'alias',
-            'class' => 'Magento\Validator\Test\True',
+            'class' => 'Some\Validator\Class',
             'options' => null,
             'type' => 'entity'
         ));
diff --git a/dev/tests/unit/testsuite/Magento/Validator/ConfigTest.php b/dev/tests/unit/testsuite/Magento/Validator/ConfigTest.php
index 6a23bf2dff7..800fa628f87 100644
--- a/dev/tests/unit/testsuite/Magento/Validator/ConfigTest.php
+++ b/dev/tests/unit/testsuite/Magento/Validator/ConfigTest.php
@@ -65,11 +65,30 @@ class ConfigTest extends \PHPUnit_Framework_TestCase
         foreach ($files as $path) {
             $configFiles[$path] = file_get_contents($path);
         }
+        $argInterpreter = $this->getMock('\Magento\Data\Argument\InterpreterInterface', array(), array(), '', false);
+
+        $argObjectFactory =
+            $this->getMock('\Magento\ObjectManager\Config\Argument\ObjectFactory', array(), array(), '', false);
+
+        $config = new \Magento\ObjectManager\Config\Config(new \Magento\ObjectManager\Relations\Runtime());
+        $factory = new \Magento\ObjectManager\Factory\Factory($config, $argInterpreter, $argObjectFactory, null);
+        $realObjectManager = new \Magento\ObjectManager\ObjectManager($factory, $config);
+
+        $constraintFactory = new \Magento\Validator\ConstraintFactory($realObjectManager);
+        $validatorFactory = new \Magento\ValidatorFactory($realObjectManager);
+        $universalFactory = new \Magento\Validator\UniversalFactory($realObjectManager);
+        $argObjectFactory->expects($this->any())
+            ->method('create')
+            ->will($this->returnValueMap(array(
+                array('Magento\Validator\ConstraintFactory', null, $constraintFactory),
+                array('Magento\ValidatorFactory', null, $validatorFactory),
+                array('Magento\Validator\UniversalFactory', null, $universalFactory),
+            )));
         $this->_config = $this->_objectManager->getObject(
             'Magento\Validator\Config',
             array(
                 'configFiles' => $configFiles,
-                'builderFactory' => new \Magento\Validator\UniversalFactory(new \Magento\ObjectManager\ObjectManager()),
+                'builderFactory' => $universalFactory,
             )
         );
     }
diff --git a/dev/tests/unit/testsuite/Magento/Validator/Test/NotEmpty.php b/dev/tests/unit/testsuite/Magento/Validator/Test/NotEmpty.php
index 8bbc521e1f6..5172c90bcdd 100644
--- a/dev/tests/unit/testsuite/Magento/Validator/Test/NotEmpty.php
+++ b/dev/tests/unit/testsuite/Magento/Validator/Test/NotEmpty.php
@@ -32,4 +32,15 @@ namespace Magento\Validator\Test;
 
 class NotEmpty extends \Zend_Validate_NotEmpty implements \Magento\Validator\ValidatorInterface
 {
+    /**
+     * Custom constructor.
+     * Needed because parent Zend class has the bug - when default value NULL is passed to the constructor,
+     * then it throws the exception.
+     *
+     * @param array $options
+     */
+    public function __construct($options = array())
+    {
+        parent::__construct($options);
+    }
 }
diff --git a/dev/tests/unit/testsuite/Magento/View/Layout/Argument/HandlerFactoryTest.php b/dev/tests/unit/testsuite/Magento/View/Layout/Argument/HandlerFactoryTest.php
deleted file mode 100644
index 940e063e5c1..00000000000
--- a/dev/tests/unit/testsuite/Magento/View/Layout/Argument/HandlerFactoryTest.php
+++ /dev/null
@@ -1,116 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Magento
- * @package     Magento_Core
- * @subpackage  unit_tests
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-
-/**
- * Test class for \Magento\View\Layout\Argument\HandlerFactory
- */
-namespace Magento\View\Layout\Argument;
-
-class HandlerFactoryTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \Magento\View\Layout\Argument\HandlerFactory
-     */
-    protected $_model;
-
-    /**
-     * @var \PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $_objectManagerMock;
-
-    protected function setUp()
-    {
-        $this->_objectManagerMock = $this->getMock('Magento\ObjectManager');
-        $this->_model = new \Magento\View\Layout\Argument\HandlerFactory(
-            $this->_objectManagerMock,
-            array(
-                'object'  => 'Magento\Core\Model\Layout\Argument\Handler\Object',
-                'options' => 'Magento\Core\Model\Layout\Argument\Handler\Options',
-                'url'     => 'Magento\Core\Model\Layout\Argument\Handler\Url',
-            )
-        );
-    }
-
-    protected function tearDown()
-    {
-        unset($this->_model);
-        unset($this->_objectManagerMock);
-    }
-
-    /**
-     * @param $type
-     * @expectedException \InvalidArgumentException
-     * @dataProvider getArgumentHandlerFactoryByTypeWithNonStringTypeDataProvider
-     */
-    public function testGetArgumentHandlerByTypeWithNonStringType($type)
-    {
-        $this->_model->getArgumentHandlerByType($type);
-    }
-
-    public function getArgumentHandlerFactoryByTypeWithNonStringTypeDataProvider()
-    {
-        return array(
-            'int value' => array(10),
-            'object value' => array(new \StdClass()),
-            'null value' => array(null),
-            'boolean value' => array(false),
-        );
-    }
-
-    /**
-     * @expectedException \InvalidArgumentException
-     */
-    public function testGetArgumentHandlerFactoryByTypeWithInvalidType()
-    {
-        $this->_model->getArgumentHandlerByType('dummy_type');
-    }
-
-    /**
-     * @param string $type
-     * @param string $className
-     * @dataProvider getArgumentHandlerFactoryByTypeWithValidTypeDataProvider
-     */
-    public function testGetArgumentHandlerFactoryByTypeWithValidType($type, $className)
-    {
-        $factoryMock = $this->getMock($className, array(), array(), '', false);
-        $this->_objectManagerMock->expects($this->once())
-            ->method('create')
-            ->with($className)
-            ->will($this->returnValue($factoryMock));
-
-        $this->assertInstanceOf($className, $this->_model->getArgumentHandlerByType($type));
-    }
-
-    public function getArgumentHandlerFactoryByTypeWithValidTypeDataProvider()
-    {
-        return array(
-            'object'  => array('object', 'Magento\Core\Model\Layout\Argument\Handler\Object'),
-            'options' => array('options', 'Magento\Core\Model\Layout\Argument\Handler\Options'),
-            'url'     => array('url', 'Magento\Core\Model\Layout\Argument\Handler\Url')
-        );
-    }
-}
diff --git a/dev/tests/unit/testsuite/Magento/View/Layout/Argument/Interpreter/Decorator/UpdaterTest.php b/dev/tests/unit/testsuite/Magento/View/Layout/Argument/Interpreter/Decorator/UpdaterTest.php
new file mode 100644
index 00000000000..41988384f4f
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/View/Layout/Argument/Interpreter/Decorator/UpdaterTest.php
@@ -0,0 +1,126 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\View\Layout\Argument\Interpreter\Decorator;
+
+class UpdaterTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\ObjectManager|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_objectManager;
+
+    /**
+     * @var \Magento\Data\Argument\InterpreterInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_interpreter;
+
+    /**
+     * @var Updater
+     */
+    protected $_model;
+
+    protected function setUp()
+    {
+        $this->_objectManager = $this->getMock('Magento\ObjectManager');
+        $this->_interpreter = $this->getMockForAbstractClass('Magento\Data\Argument\InterpreterInterface');
+        $this->_model = new Updater($this->_objectManager, $this->_interpreter);
+    }
+
+    public function testEvaluate()
+    {
+        $input = array('value' => 'some text', 'updater' => array('Magento\View\Layout\Argument\UpdaterInterface'));
+        $evaluatedValue = 'some text (new)';
+        $updatedValue = 'some text (updated)';
+
+
+        $this->_interpreter->expects($this->once())
+            ->method('evaluate')
+            ->with(array('value' => 'some text'))
+            ->will($this->returnValue($evaluatedValue));
+
+        $updater = $this->getMockForAbstractClass('Magento\View\Layout\Argument\UpdaterInterface');
+        $updater->expects($this->once())
+            ->method('update')
+            ->with($evaluatedValue)
+            ->will($this->returnValue($updatedValue));
+
+        $this->_objectManager->expects($this->once())
+            ->method('get')
+            ->with('Magento\View\Layout\Argument\UpdaterInterface')
+            ->will($this->returnValue($updater));
+
+        $actual = $this->_model->evaluate($input);
+        $this->assertSame($updatedValue, $actual);
+    }
+
+    public function testEvaluateNoUpdaters()
+    {
+        $input = array('value' => 'some text');
+        $expected = array('value' => 'new text');
+
+        $this->_interpreter->expects($this->once())
+            ->method('evaluate')
+            ->with($input)
+            ->will($this->returnValue($expected));
+        $this->_objectManager->expects($this->never())
+            ->method('get');
+
+        $actual = $this->_model->evaluate($input);
+        $this->assertSame($expected, $actual);
+    }
+
+    /**
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage Layout argument updaters are expected to be an array of classes
+     */
+    public function testEvaluateWrongUpdaterValue()
+    {
+        $input = array('value' => 'some text', 'updater' => 'non-array');
+        $this->_model->evaluate($input);
+    }
+
+    /**
+     * @expectedException \UnexpectedValueException
+     * @expectedExceptionMessage Instance of layout argument updater is expected
+     */
+    public function testEvaluateWrongUpdaterClass()
+    {
+        $input = array(
+            'value' => 'some text',
+            'updater' => array(
+                'Magento\View\Layout\Argument\UpdaterInterface',
+                'Magento\ObjectManager',
+            )
+        );
+        $self = $this;
+        $this->_objectManager->expects($this->exactly(2))
+            ->method('get')
+            ->will($this->returnCallback(function ($className) use ($self) {
+                return $self->getMockForAbstractClass($className);
+            }));
+
+        $this->_model->evaluate($input);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/View/Layout/Argument/Interpreter/HelperMethodTest.php b/dev/tests/unit/testsuite/Magento/View/Layout/Argument/Interpreter/HelperMethodTest.php
new file mode 100644
index 00000000000..e3372ba0c39
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/View/Layout/Argument/Interpreter/HelperMethodTest.php
@@ -0,0 +1,110 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\View\Layout\Argument\Interpreter;
+
+class HelperMethodTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\ObjectManager|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_objectManager;
+
+    /**
+     * @var \Magento\View\Layout\Argument\Interpreter\NamedParams|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_interpreter;
+
+    /**
+     * @var HelperMethod
+     */
+    protected $_model;
+
+    protected function setUp()
+    {
+        $this->_objectManager = $this->getMock('Magento\ObjectManager');
+        $this->_interpreter = $this->getMock(
+            'Magento\View\Layout\Argument\Interpreter\NamedParams', array(), array(), '', false
+        );
+        $this->_model = new HelperMethod($this->_objectManager, $this->_interpreter);
+    }
+
+    public function testEvaluate()
+    {
+        $input = array(
+            'value' => 'some text',
+            'helper' => __CLASS__ . '::help'
+        );
+
+        $evaluatedValue = array('value' => 'some text (evaluated)');
+        $this->_interpreter->expects($this->once())
+            ->method('evaluate')
+            ->with($input)
+            ->will($this->returnValue($evaluatedValue));
+
+        $this->_objectManager->expects($this->once())
+            ->method('get')
+            ->with(__CLASS__)
+            ->will($this->returnValue($this));
+
+        $expected = 'some text (evaluated) (updated)';
+        $actual = $this->_model->evaluate($input);
+        $this->assertSame($expected, $actual);
+    }
+
+    public function help($input)
+    {
+        $this->assertSame('some text (evaluated)', $input);
+        return $input . ' (updated)';
+    }
+
+    /**
+     * @param string $helperMethod
+     * @param string $expectedExceptionMessage
+     *
+     * @dataProvider evaluateExceptionDataProvider
+     */
+    public function testEvaluateException($helperMethod, $expectedExceptionMessage)
+    {
+        $this->setExpectedException('\InvalidArgumentException', $expectedExceptionMessage);
+        $input = array(
+            'value' => 'some text',
+            'helper' => $helperMethod
+        );
+        $this->_model->evaluate($input);
+    }
+
+    public function evaluateExceptionDataProvider()
+    {
+        $nonExistingHelper = __CLASS__ . '::non_existing';
+        return array(
+            'wrong method format' => array(
+                'help', 'Helper method name in format "\Class\Name::methodName" is expected'
+            ),
+            'non-existing method' => array(
+                $nonExistingHelper, "Helper method '$nonExistingHelper' does not exist"
+            ),
+        );
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/View/Layout/Argument/Interpreter/NamedParamsTest.php b/dev/tests/unit/testsuite/Magento/View/Layout/Argument/Interpreter/NamedParamsTest.php
new file mode 100644
index 00000000000..4300d255689
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/View/Layout/Argument/Interpreter/NamedParamsTest.php
@@ -0,0 +1,90 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\View\Layout\Argument\Interpreter;
+
+class NamedParamsTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Data\Argument\InterpreterInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_interpreter;
+
+    /**
+     * @var NamedParams
+     */
+    protected $_model;
+
+    protected function setUp()
+    {
+        $this->_interpreter = $this->getMockForAbstractClass('Magento\Data\Argument\InterpreterInterface');
+        $this->_model = new NamedParams($this->_interpreter);
+    }
+
+    public function testEvaluate()
+    {
+        $input = array(
+            'param' => array(
+                'param1' => array('value' => 'value 1'),
+                'param2' => array('value' => 'value 2'),
+            ),
+        );
+
+        $this->_interpreter->expects($this->at(0))
+            ->method('evaluate')
+            ->with(array('value' => 'value 1'))
+            ->will($this->returnValue('value 1 (evaluated)'));
+        $this->_interpreter->expects($this->at(1))
+            ->method('evaluate')
+            ->with(array('value' => 'value 2'))
+            ->will($this->returnValue('value 2 (evaluated)'));
+        $expected = array('param1' => 'value 1 (evaluated)', 'param2' => 'value 2 (evaluated)');
+
+        $actual = $this->_model->evaluate($input);
+        $this->assertSame($expected, $actual);
+    }
+
+    /**
+     * @dataProvider evaluateWrongParamDataProvider
+     */
+    public function testEvaluateWrongParam($input, $expectedExceptionMessage)
+    {
+        $this->setExpectedException('\InvalidArgumentException', $expectedExceptionMessage);
+        $this->_model->evaluate($input);
+    }
+
+    public function evaluateWrongParamDataProvider()
+    {
+        return array(
+            'root param is non-array' => array(
+                array('param' => 'non-array'),
+                'Layout argument parameters are expected to be an array',
+            ),
+            'individual param is non-array' => array(
+                array('param' => array('sub-param' => 'non-array')),
+                'Parameter data of layout argument is expected to be an array',
+            ),
+        );
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/View/Layout/Argument/Interpreter/ObjectTest.php b/dev/tests/unit/testsuite/Magento/View/Layout/Argument/Interpreter/ObjectTest.php
new file mode 100644
index 00000000000..9098668ed5c
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/View/Layout/Argument/Interpreter/ObjectTest.php
@@ -0,0 +1,95 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\View\Layout\Argument\Interpreter;
+
+class ObjectTest extends \PHPUnit_Framework_TestCase
+{
+    const EXPECTED_CLASS = 'Magento\View\Layout\Argument\Interpreter\ObjectTest';
+
+    /**
+     * @var \Magento\ObjectManager|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_objectManager;
+
+    /**
+     * @var \Magento\Data\Argument\InterpreterInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_interpreter;
+
+    /**
+     * @var Object
+     */
+    protected $_model;
+
+    protected function setUp()
+    {
+        $this->_objectManager = $this->getMock('Magento\ObjectManager');
+        $this->_model = new Object($this->_objectManager, self::EXPECTED_CLASS);
+    }
+
+    public function testEvaluate()
+    {
+        $input = array('value' => self::EXPECTED_CLASS);
+        $this->_objectManager->expects($this->once())
+            ->method('create')
+            ->with(self::EXPECTED_CLASS)
+            ->will($this->returnValue($this));
+
+        $actual = $this->_model->evaluate($input);
+        $this->assertSame($this, $actual);
+    }
+
+    /**
+     * @dataProvider evaluateWrongClassDataProvider
+     */
+    public function testEvaluateWrongClass($input, $expectedException, $expectedExceptionMessage)
+    {
+        $this->setExpectedException($expectedException, $expectedExceptionMessage);
+        $self = $this;
+        $this->_objectManager->expects($this->any())
+            ->method('create')
+            ->will($this->returnCallback(function ($className) use ($self) {
+                return $self->getMock($className);
+            }));
+
+        $this->_model->evaluate($input);
+    }
+
+    public function evaluateWrongClassDataProvider()
+    {
+        return array(
+            'no class' => array(
+                array(),
+                '\InvalidArgumentException',
+                'Object class name is missing',
+            ),
+            'unexpected class' => array(
+                array('value' => 'Magento\ObjectManager'),
+                '\UnexpectedValueException',
+                'Instance of ' . self::EXPECTED_CLASS . ' is expected',
+            ),
+        );
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/View/Layout/Argument/Interpreter/OptionsTest.php b/dev/tests/unit/testsuite/Magento/View/Layout/Argument/Interpreter/OptionsTest.php
new file mode 100644
index 00000000000..20bd2e0a320
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/View/Layout/Argument/Interpreter/OptionsTest.php
@@ -0,0 +1,99 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\View\Layout\Argument\Interpreter;
+
+class OptionsTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\ObjectManager|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_objectManager;
+
+    /**
+     * @var \Magento\Data\Argument\InterpreterInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_interpreter;
+
+    /**
+     * @var Options
+     */
+    protected $_model;
+
+    protected function setUp()
+    {
+        $this->_objectManager = $this->getMock('Magento\ObjectManager');
+        $this->_model = new Options($this->_objectManager);
+    }
+
+    public function testEvaluate()
+    {
+        $modelClass = 'Magento\Data\OptionSourceInterface';
+        $model = $this->getMockForAbstractClass($modelClass);
+        $model->expects($this->once())
+            ->method('toOptionArray')
+            ->will($this->returnValue(array(
+                'value1' => 'label 1',
+                'value2' => 'label 2',
+                array('value' => 'value3', 'label' => 'label 3'),
+            )));
+        $this->_objectManager->expects($this->once())
+            ->method('get')
+            ->with($modelClass)
+            ->will($this->returnValue($model));
+        $input = array('model' => $modelClass);
+        $expected = array(
+            array('value' => 'value1', 'label' => 'label 1'),
+            array('value' => 'value2', 'label' => 'label 2'),
+            array('value' => 'value3', 'label' => 'label 3'),
+        );
+        $actual = $this->_model->evaluate($input);
+        $this->assertSame($expected, $actual);
+    }
+
+    /**
+     * @dataProvider evaluateWrongModelDataProvider
+     */
+    public function testEvaluateWrongModel($input, $expectedException, $expectedExceptionMessage)
+    {
+        $this->setExpectedException($expectedException, $expectedExceptionMessage);
+        $this->_model->evaluate($input);
+    }
+
+    public function evaluateWrongModelDataProvider()
+    {
+        return array(
+            'no model' => array(
+                array(),
+                '\InvalidArgumentException',
+                'Options source model class is missing',
+            ),
+            'wrong model class' => array(
+                array('model' => 'Magento\View\Layout\Argument\Interpreter\OptionsTest'),
+                '\UnexpectedValueException',
+                'Instance of the options source model is expected',
+            ),
+        );
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/View/Layout/Argument/Interpreter/UrlTest.php b/dev/tests/unit/testsuite/Magento/View/Layout/Argument/Interpreter/UrlTest.php
new file mode 100644
index 00000000000..782850d2ade
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/View/Layout/Argument/Interpreter/UrlTest.php
@@ -0,0 +1,82 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\View\Layout\Argument\Interpreter;
+
+class UrlTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\UrlInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_urlResolver;
+
+    /**
+     * @var \Magento\View\Layout\Argument\Interpreter\NamedParams|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_interpreter;
+
+    /**
+     * @var Url
+     */
+    protected $_model;
+
+    protected function setUp()
+    {
+        $this->_urlResolver = $this->getMock('Magento\UrlInterface');
+        $this->_interpreter = $this->getMock(
+            'Magento\View\Layout\Argument\Interpreter\NamedParams', array(), array(), '', false
+        );
+        $this->_model = new Url($this->_urlResolver, $this->_interpreter);
+    }
+
+    public function testEvaluate()
+    {
+        $input = array('path' => 'some/path');
+        $expected = 'http://some.domain.com/some/path/';
+
+        $urlParams = array('param');
+        $this->_interpreter->expects($this->once())
+            ->method('evaluate')
+            ->with($input)
+            ->will($this->returnValue($urlParams));
+
+        $this->_urlResolver->expects($this->once())
+            ->method('getUrl')
+            ->with('some/path', $urlParams)
+            ->will($this->returnValue($expected));
+
+        $actual = $this->_model->evaluate($input);
+        $this->assertSame($expected, $actual);
+    }
+
+    /**
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage URL path is missing
+     */
+    public function testEvaluateWrongPath()
+    {
+        $input = array();
+        $this->_model->evaluate($input);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/View/Layout/Argument/ParserTest.php b/dev/tests/unit/testsuite/Magento/View/Layout/Argument/ParserTest.php
new file mode 100644
index 00000000000..ecd2271003c
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/View/Layout/Argument/ParserTest.php
@@ -0,0 +1,68 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\View\Layout\Argument;
+
+class ParserTest extends \PHPUnit_Framework_TestCase
+{
+    public function testParse()
+    {
+        $document = new \DOMDocument();
+        $document->load(__DIR__ . '/_files/arguments.xml');
+        $parser = new \Magento\View\Layout\Argument\Parser;
+        $actual = $parser->parse($document->getElementsByTagName('argument')->item(0));
+        $expected = array(
+            'updater' => array(
+                'Updater1',
+                'Updater2',
+            ),
+            'param' => array(
+                'param1' => array(
+                    'name' => 'param1',
+                    'value' => 'Param Value 1',
+                ),
+                'param2' => array(
+                    'name' => 'param2',
+                    'value' => 'Param Value 2',
+                ),
+            ),
+            'item' => array(
+                'item1' => array(
+                    'name' => 'item1',
+                    'value' => 'Item Value 1',
+                ),
+                'item2' => array(
+                    'name' => 'item2',
+                    'item' => array(
+                        'item3' => array(
+                            'name' => 'item3',
+                            'value' => 'Item Value 2.3',
+                        ),
+                    ),
+                ),
+            ),
+        );
+        $this->assertSame($expected, $actual);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/View/Layout/Argument/_files/arguments.xml b/dev/tests/unit/testsuite/Magento/View/Layout/Argument/_files/arguments.xml
new file mode 100644
index 00000000000..dd3278bcc95
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/View/Layout/Argument/_files/arguments.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<argument>
+    <updater>Updater1</updater>
+    <updater>Updater2</updater>
+    <param name="param1">Param Value 1</param>
+    <param name="param2">Param Value 2</param>
+    <item name="item1">Item Value 1</item>
+    <item name="item2">
+        <item name="item3">Item Value 2.3</item>
+    </item>
+</argument>
diff --git a/dev/tests/unit/testsuite/Magento/Webapi/Model/Config/Integration/XsdTest.php b/dev/tests/unit/testsuite/Magento/Webapi/Model/Config/Integration/XsdTest.php
index dc9da2431b6..90fe5538276 100644
--- a/dev/tests/unit/testsuite/Magento/Webapi/Model/Config/Integration/XsdTest.php
+++ b/dev/tests/unit/testsuite/Magento/Webapi/Model/Config/Integration/XsdTest.php
@@ -46,7 +46,7 @@ class XsdTest extends \PHPUnit_Framework_TestCase
     public function testExemplarXml($fixtureXml, array $expectedErrors)
     {
         $messageFormat = '%message%';
-        $dom = new \Magento\Config\Dom($fixtureXml, array(), null, $messageFormat);
+        $dom = new \Magento\Config\Dom($fixtureXml, array(), null, null, $messageFormat);
         $actualResult = $dom->validate($this->_schemaFile, $actualErrors);
         $this->assertEquals(empty($expectedErrors), $actualResult, "Validation result is invalid.");
         $this->assertEquals($expectedErrors, $actualErrors, "Validation errors does not match.");
diff --git a/dev/tests/unit/testsuite/Magento/Webapi/Model/Config/XsdTest.php b/dev/tests/unit/testsuite/Magento/Webapi/Model/Config/XsdTest.php
index d20e4d41093..c2be7612803 100644
--- a/dev/tests/unit/testsuite/Magento/Webapi/Model/Config/XsdTest.php
+++ b/dev/tests/unit/testsuite/Magento/Webapi/Model/Config/XsdTest.php
@@ -46,7 +46,7 @@ class XsdTest extends \PHPUnit_Framework_TestCase
     public function testExemplarXml($fixtureXml, array $expectedErrors)
     {
         $messageFormat = '%message%';
-        $dom = new \Magento\Config\Dom($fixtureXml, array(), null, $messageFormat);
+        $dom = new \Magento\Config\Dom($fixtureXml, array(), null, null, $messageFormat);
         $actualResult = $dom->validate($this->_schemaFile, $actualErrors);
         $this->assertEquals(empty($expectedErrors), $actualResult, "Validation result is invalid.");
         $this->assertEquals($expectedErrors, $actualErrors, "Validation errors does not match.");
diff --git a/dev/tools/Magento/Tools/Dependency/Circular.php b/dev/tools/Magento/Tools/Dependency/Circular.php
new file mode 100644
index 00000000000..afeedd5ddae
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/Circular.php
@@ -0,0 +1,154 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Tools\Dependency;
+
+use Magento\Data\Graph;
+
+/**
+ * Build circular dependencies by modules map
+ */
+class Circular
+{
+    /**
+     * Map where the key is the vertex and the value are the adjacent vertices(dependencies) of this vertex
+     *
+     * @var array
+     */
+    protected $dependencies = [];
+
+    /**
+     * Modules circular dependencies map
+     *
+     * @var array
+     */
+    protected $circularDependencies = [];
+
+    /**
+     * Graph object
+     *
+     * @var \Magento\Data\Graph
+     */
+    protected $graph;
+
+    /**
+     * Build modules dependencies
+     *
+     * @param array $dependencies Key is the vertex and the value are the adjacent vertices(dependencies) of this vertex
+     * @return array
+     */
+    public function buildCircularDependencies($dependencies)
+    {
+        $this->init($dependencies);
+
+        foreach (array_keys($this->dependencies) as $vertex) {
+            $this->expandDependencies($vertex);
+        }
+
+        $circulars = $this->graph->findCycle(null, false);
+        foreach ($circulars as $circular) {
+            array_shift($circular);
+            $this->buildCircular($circular);
+        }
+
+        return $this->divideByModules($this->circularDependencies);
+    }
+
+    /**
+     * Init data before building
+     *
+     * @param array $dependencies
+     */
+    protected function init($dependencies)
+    {
+        $this->dependencies = $dependencies;
+        $this->circularDependencies = [];
+        $this->graph = new Graph(array_keys($this->dependencies), []);
+    }
+
+    /**
+     * Expand modules dependencies from chain
+     *
+     * @param string $vertex
+     * @param array $path nesting path
+     */
+    protected function expandDependencies($vertex, $path = [])
+    {
+        if (!$this->dependencies[$vertex]) {
+            return;
+        }
+
+        $path[] = $vertex;
+        foreach ($this->dependencies[$vertex] as $dependency) {
+            $relations = $this->graph->getRelations();
+            if (isset($relations[$vertex][$dependency])) {
+                continue;
+            }
+            $this->graph->addRelation($vertex, $dependency);
+
+            $searchResult = array_search($dependency, $path);
+
+            if (false !== $searchResult) {
+                $this->buildCircular(array_slice($path, $searchResult));
+                break;
+            } else {
+                $this->expandDependencies($dependency, $path);
+            }
+        }
+    }
+
+    /**
+     * Build all circular dependencies based on chain
+     *
+     * @param array $modules
+     */
+    protected function buildCircular($modules)
+    {
+        $path = '/' . implode('/', $modules);
+        if (isset($this->circularDependencies[$path])) {
+            return;
+        }
+        $this->circularDependencies[$path] = $modules;
+        array_push($modules, array_shift($modules));
+        $this->buildCircular($modules);
+    }
+
+    /**
+     * Divide dependencies by modules
+     *
+     * @param array $circularDependencies
+     * @return array
+     */
+    protected function divideByModules($circularDependencies)
+    {
+        $dependenciesByModule = [];
+        foreach ($circularDependencies as $circularDependency) {
+            $module = $circularDependency[0];
+            array_push($circularDependency, $module);
+            $dependenciesByModule[$module][] = $circularDependency;
+        }
+
+        return $dependenciesByModule;
+    }
+}
diff --git a/dev/tools/Magento/Tools/Dependency/Parser/Code.php b/dev/tools/Magento/Tools/Dependency/Parser/Code.php
new file mode 100644
index 00000000000..37991ca986f
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/Parser/Code.php
@@ -0,0 +1,121 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Tools\Dependency\Parser;
+
+use Magento\Tools\Dependency\ParserInterface;
+
+/**
+ * Code parser
+ */
+class Code implements ParserInterface
+{
+    /**
+     * Declared namespaces
+     *
+     * @var array
+     */
+    protected $declaredNamespaces;
+
+    /**
+     * Template method. Main algorithm
+     *
+     * {@inheritdoc}
+     */
+    public function parse(array $options)
+    {
+        $this->checkOptions($options);
+
+        $this->declaredNamespaces = $options['declared_namespaces'];
+
+        $pattern = '#\b((?<module>(' . implode('[\\\\]|', $this->declaredNamespaces)
+            . '[\\\\])[a-zA-Z0-9]+)[a-zA-Z0-9_\\\\]*)\b#';
+
+        $modules = [];
+        foreach ($options['files_for_parse'] as $file) {
+            $content = file_get_contents($file);
+            $module = $this->extractModuleName($file);
+
+            // also collect modules without dependencies
+            if (!isset($modules[$module])) {
+                $modules[$module] = [
+                    'name' => $module,
+                    'dependencies' => [],
+                ];
+            }
+
+            if (preg_match_all($pattern, $content, $matches)) {
+                $dependencies = array_count_values($matches['module']);
+                foreach ($dependencies as $dependency => $count) {
+                    if ($module == $dependency) {
+                        continue;
+                    }
+                    if (isset($modules[$module]['dependencies'][$dependency])) {
+                        $modules[$module]['dependencies'][$dependency]['count'] += $count;
+                    } else {
+                        $modules[$module]['dependencies'][$dependency] = [
+                            'lib' => $dependency,
+                            'count' => $count,
+                        ];
+                    }
+                }
+            }
+        }
+        return $modules;
+    }
+
+    /**
+     * Template method. Check passed options step
+     *
+     * @param array $options
+     * @throws \InvalidArgumentException
+     */
+    protected function checkOptions($options)
+    {
+        if (!isset($options['files_for_parse']) || !is_array($options['files_for_parse'])
+            || !$options['files_for_parse']) {
+            throw new \InvalidArgumentException('Parse error: Option "files_for_parse" is wrong.');
+        }
+
+        if (!isset($options['declared_namespaces']) || !is_array($options['declared_namespaces'])
+            || !$options['declared_namespaces']) {
+            throw new \InvalidArgumentException('Parse error: Option "declared_namespaces" is wrong.');
+        }
+    }
+
+    /**
+     * Extract module name form file path
+     *
+     * @param string $file
+     * @return string
+     */
+    protected function extractModuleName($file)
+    {
+        $pattern = '#code/(?<namespace>' . $this->declaredNamespaces[0] . ')[/_\\\\]?(?<module>[^/]+)/#';
+        if (preg_match($pattern, $file, $matches)) {
+            return $matches['namespace'] . '\\' . $matches['module'];
+        }
+        return '';
+    }
+}
diff --git a/dev/tools/Magento/Tools/Dependency/Parser/Config/Xml.php b/dev/tools/Magento/Tools/Dependency/Parser/Config/Xml.php
new file mode 100644
index 00000000000..1608e53f045
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/Parser/Config/Xml.php
@@ -0,0 +1,121 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Tools\Dependency\Parser\Config;
+
+use Magento\Tools\Dependency\ParserInterface;
+
+/**
+ * Config xml parser
+ */
+class Xml implements ParserInterface
+{
+    /**
+     * Template method. Main algorithm
+     *
+     * {@inheritdoc}
+     */
+    public function parse(array $options)
+    {
+        $this->checkOptions($options);
+
+        $modules = [];
+        foreach ($options['files_for_parse'] as $file) {
+            $config = $this->getModuleConfig($file);
+            $modules[] = [
+                'name' => $this->extractModuleName($config),
+                'dependencies' => $this->extractDependencies($config),
+            ];
+        }
+        return $modules;
+    }
+
+    /**
+     * Template method. Check passed options step
+     *
+     * @param array $options
+     * @throws \InvalidArgumentException
+     */
+    protected function checkOptions($options)
+    {
+        if (!isset($options['files_for_parse']) || !is_array($options['files_for_parse'])
+            || !$options['files_for_parse']) {
+            throw new \InvalidArgumentException('Parse error: Option "files_for_parse" is wrong.');
+        }
+    }
+
+    /**
+     * Template method. Extract module step
+     *
+     * @param \SimpleXMLElement $config
+     * @return string
+     */
+    protected function extractModuleName($config)
+    {
+        return $this->prepareModuleName((string)$config->attributes()->name);
+    }
+
+    /**
+     * Template method. Extract dependencies step
+     *
+     * @param \SimpleXMLElement $config
+     * @return array
+     */
+    protected function extractDependencies($config)
+    {
+        $dependencies = [];
+        /** @var \SimpleXMLElement $dependency */
+        if ($config->depends) {
+            foreach ($config->depends->module as $dependency) {
+                $dependencies[] = [
+                    'module' => $this->prepareModuleName((string)$dependency->attributes()->name),
+                    'type' => (string)$dependency->attributes()->type,
+                ];
+            }
+        }
+        return $dependencies;
+    }
+
+    /**
+     * Template method. Load module config step
+     *
+     * @param string $file
+     * @return \SimpleXMLElement
+     */
+    protected function getModuleConfig($file)
+    {
+        return \simplexml_load_file($file)->xpath('/config/module')[0];
+    }
+
+    /**
+     * Prepare module name
+     *
+     * @param string $name
+     * @return string
+     */
+    protected function prepareModuleName($name)
+    {
+        return str_replace('_', '\\', $name);
+    }
+}
diff --git a/dev/tools/Magento/Tools/Dependency/ParserInterface.php b/dev/tools/Magento/Tools/Dependency/ParserInterface.php
new file mode 100644
index 00000000000..657dd4d9a96
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/ParserInterface.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Tools\Dependency;
+
+/**
+ * Parser Interface
+ */
+interface ParserInterface
+{
+    /**
+     * Parse files
+     *
+     * @param array $options
+     * @return array
+     */
+    public function parse(array $options);
+}
diff --git a/dev/tools/Magento/Tools/Dependency/Report/Builder/AbstractBuilder.php b/dev/tools/Magento/Tools/Dependency/Report/Builder/AbstractBuilder.php
new file mode 100644
index 00000000000..ebfd8e7a02a
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/Report/Builder/AbstractBuilder.php
@@ -0,0 +1,107 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Tools\Dependency\Report\Builder;
+
+use Magento\Tools\Dependency\Report\BuilderInterface;
+use Magento\Tools\Dependency\ParserInterface;
+use Magento\Tools\Dependency\Report\WriterInterface;
+
+/**
+ *  Abstract report builder by config files
+ */
+abstract class AbstractBuilder implements BuilderInterface
+{
+    /**
+     * Dependencies parser
+     *
+     * @var \Magento\Tools\Dependency\ParserInterface
+     */
+    protected $dependenciesParser;
+
+    /**
+     * Report writer
+     *
+     * @var \Magento\Tools\Dependency\Report\WriterInterface
+     */
+    protected $reportWriter;
+
+    /**
+     * @var array
+     */
+    protected $options = [];
+
+    /**
+     * Builder constructor
+     *
+     * @param \Magento\Tools\Dependency\ParserInterface $dependenciesParser
+     * @param \Magento\Tools\Dependency\Report\WriterInterface $reportWriter
+     */
+    public function __construct(
+        ParserInterface $dependenciesParser,
+        WriterInterface $reportWriter
+    ) {
+        $this->dependenciesParser = $dependenciesParser;
+        $this->reportWriter = $reportWriter;
+    }
+
+    /**
+     * Template method. Main algorithm
+     *
+     * {@inheritdoc}
+     */
+    public function build(array $options)
+    {
+        $this->checkOptions($options);
+        $this->options = $options;
+
+        $config = $this->buildData($this->dependenciesParser->parse($options['parse']));
+        $this->reportWriter->write($options['write'], $config);
+    }
+
+    /**
+     * Template method. Check passed options step
+     *
+     * @param array $options
+     * @throws \InvalidArgumentException
+     */
+    protected function checkOptions($options)
+    {
+        if (!isset($options['parse']) || empty($options['parse'])) {
+            throw new \InvalidArgumentException('Passed option section "parse" is wrong.');
+        }
+
+        if (!isset($options['write']) || empty($options['write'])) {
+            throw new \InvalidArgumentException('Passed option section "write" is wrong.');
+        }
+    }
+
+    /**
+     * Template method. Prepare data for writer step
+     *
+     * @param array $modulesData
+     * @return \Magento\Tools\Dependency\Report\Data\ConfigInterface
+     */
+    abstract protected function buildData($modulesData);
+}
diff --git a/dev/tools/Magento/Tools/Dependency/Report/BuilderInterface.php b/dev/tools/Magento/Tools/Dependency/Report/BuilderInterface.php
new file mode 100644
index 00000000000..d0d240668df
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/Report/BuilderInterface.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Tools\Dependency\Report;
+
+/**
+ *  Builder Interface
+ */
+interface BuilderInterface
+{
+    /**
+     * Build a report
+     *
+     * @param array $options
+     */
+    public function build(array $options);
+}
diff --git a/dev/tools/Magento/Tools/Dependency/Report/Circular/Builder.php b/dev/tools/Magento/Tools/Dependency/Report/Circular/Builder.php
new file mode 100644
index 00000000000..e886fd4ec5f
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/Report/Circular/Builder.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Tools\Dependency\Report\Circular;
+
+use Magento\Tools\Dependency\Circular;
+use Magento\Tools\Dependency\ParserInterface;
+use Magento\Tools\Dependency\Report\Builder\AbstractBuilder;
+use Magento\Tools\Dependency\Report\WriterInterface;
+
+/**
+ *  Dependencies report builder
+ */
+class Builder extends AbstractBuilder
+{
+    /**
+     * Circular dependencies builder
+     *
+     * @var \Magento\Tools\Dependency\Circular
+     */
+    protected $circularBuilder;
+
+    /**
+     * Builder constructor
+     *
+     * @param \Magento\Tools\Dependency\ParserInterface $dependenciesParser
+     * @param \Magento\Tools\Dependency\Report\WriterInterface $reportWriter
+     * @param \Magento\Tools\Dependency\Circular $circularBuilder
+     */
+    public function __construct(
+        ParserInterface $dependenciesParser,
+        WriterInterface $reportWriter,
+        Circular $circularBuilder
+    ) {
+        parent::__construct($dependenciesParser, $reportWriter);
+
+        $this->circularBuilder = $circularBuilder;
+    }
+
+    /**
+     * Template method. Prepare data for writer step
+     *
+     * @param array $modulesData
+     * @return \Magento\Tools\Dependency\Report\Circular\Data\Config
+     */
+    protected function buildData($modulesData)
+    {
+        $modules = [];
+        foreach ($this->buildCircularDependencies($modulesData) as $moduleName => $modulesChains) {
+            $chains = [];
+            foreach ($modulesChains as $modulesChain) {
+                $chains[] = new Data\Chain($modulesChain);
+            }
+            $modules[] = new Data\Module($moduleName, $chains);
+        }
+        return new Data\Config($modules);
+    }
+
+    /**
+     * Build circular dependencies data by dependencies data
+     *
+     * @param array $modulesData
+     * @return array
+     */
+    protected function buildCircularDependencies($modulesData)
+    {
+        $dependencies = [];
+        foreach ($modulesData as $moduleData) {
+            foreach ($moduleData['dependencies'] as $dependencyData) {
+                $dependencies[$moduleData['name']][] = $dependencyData['module'];
+            }
+        }
+        return $this->circularBuilder->buildCircularDependencies($dependencies);
+    }
+}
diff --git a/dev/tools/Magento/Tools/Dependency/Report/Circular/Data/Chain.php b/dev/tools/Magento/Tools/Dependency/Report/Circular/Data/Chain.php
new file mode 100644
index 00000000000..19bc5afe109
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/Report/Circular/Data/Chain.php
@@ -0,0 +1,51 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Tools\Dependency\Report\Circular\Data;
+
+/**
+ * Chain
+ */
+class Chain
+{
+    /**
+     * Chain construct
+     *
+     * @param array $modules
+     */
+    public function __construct($modules)
+    {
+        $this->modules = $modules;
+    }
+
+    /**
+     * Get modules
+     *
+     * @return array
+     */
+    public function getModules()
+    {
+        return $this->modules;
+    }
+}
diff --git a/dev/tools/Magento/Tools/Dependency/Report/Circular/Data/Config.php b/dev/tools/Magento/Tools/Dependency/Report/Circular/Data/Config.php
new file mode 100644
index 00000000000..1b67bed156b
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/Report/Circular/Data/Config.php
@@ -0,0 +1,47 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Tools\Dependency\Report\Circular\Data;
+
+use Magento\Tools\Dependency\Report\Data\Config\AbstractConfig;
+
+/**
+ * Config
+ *
+ * @method \Magento\Tools\Dependency\Report\Circular\Data\Module[] getModules()
+ */
+class Config extends AbstractConfig
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getDependenciesCount()
+    {
+        $dependenciesCount = 0;
+        foreach ($this->getModules() as $module) {
+            $dependenciesCount += $module->getChainsCount();
+        }
+        return $dependenciesCount;
+    }
+}
diff --git a/dev/tools/Magento/Tools/Dependency/Report/Circular/Data/Module.php b/dev/tools/Magento/Tools/Dependency/Report/Circular/Data/Module.php
new file mode 100644
index 00000000000..dd612cff8a5
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/Report/Circular/Data/Module.php
@@ -0,0 +1,87 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Tools\Dependency\Report\Circular\Data;
+
+/**
+ * Module
+ */
+class Module
+{
+    /**
+     * Module name
+     *
+     * @var string
+     */
+    protected $name;
+
+    /**
+     * Circular dependencies chains
+     *
+     * @var \Magento\Tools\Dependency\Report\Circular\Data\Chain[]
+     */
+    protected $chains;
+
+    /**
+     * Module construct
+     *
+     * @param array $name
+     * @param \Magento\Tools\Dependency\Report\Circular\Data\Chain[] $chains
+     */
+    public function __construct($name, array $chains = [])
+    {
+        $this->name = $name;
+        $this->chains = $chains;
+    }
+
+    /**
+     * Get name
+     *
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Get circular dependencies chains
+     *
+     * @return \Magento\Tools\Dependency\Report\Circular\Data\Chain[]
+     */
+    public function getChains()
+    {
+        return $this->chains;
+    }
+
+    /**
+     * Get circular dependencies chains count
+     *
+     * @return int
+     */
+    public function getChainsCount()
+    {
+        return count($this->chains);
+    }
+}
diff --git a/dev/tools/Magento/Tools/Dependency/Report/Circular/Writer.php b/dev/tools/Magento/Tools/Dependency/Report/Circular/Writer.php
new file mode 100644
index 00000000000..adaf20b7c47
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/Report/Circular/Writer.php
@@ -0,0 +1,65 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Tools\Dependency\Report\Circular;
+
+use Magento\Tools\Dependency\Report\Writer\Csv\AbstractWriter;
+
+/**
+ * Csv file writer for circular dependencies report
+ */
+class Writer extends AbstractWriter
+{
+    /**
+     * Modules chain separator
+     */
+    const MODULES_SEPARATOR = '->';
+
+    /**
+     * Template method. Prepare data step
+     *
+     * @param \Magento\Tools\Dependency\Report\Circular\Data\Config $config
+     * @return array
+     */
+    protected function prepareData($config)
+    {
+        $data[] = ['Circular dependencies:', 'Total number of chains'];
+        $data[] = ['', $config->getDependenciesCount()];
+        $data[] = [];
+
+        if ($config->getDependenciesCount()) {
+            $data[] = ['Circular dependencies for each module:', ''];
+            foreach ($config->getModules() as $module) {
+                $data[] = [$module->getName(), $module->getChainsCount()];
+                foreach ($module->getChains() as $chain) {
+                    $data[] = [implode(self::MODULES_SEPARATOR, $chain->getModules())];
+                }
+                $data[] = [];
+            }
+        }
+        array_pop($data);
+
+        return $data;
+    }
+}
diff --git a/dev/tools/Magento/Tools/Dependency/Report/Data/Config/AbstractConfig.php b/dev/tools/Magento/Tools/Dependency/Report/Data/Config/AbstractConfig.php
new file mode 100644
index 00000000000..e0db2689029
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/Report/Data/Config/AbstractConfig.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Tools\Dependency\Report\Data\Config;
+
+use Magento\Tools\Dependency\Report\Data\ConfigInterface;
+
+/**
+ * Config
+ */
+abstract class AbstractConfig implements ConfigInterface
+{
+    /**
+     * Modules
+     *
+     * @var array
+     */
+    private $modules;
+
+    /**
+     * Config construct
+     *
+     * @param array $modules
+     */
+    public function __construct(array $modules = [])
+    {
+        $this->modules = $modules;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getModules()
+    {
+        return $this->modules;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    abstract public function getDependenciesCount();
+}
diff --git a/dev/tools/Magento/Tools/Dependency/Report/Data/ConfigInterface.php b/dev/tools/Magento/Tools/Dependency/Report/Data/ConfigInterface.php
new file mode 100644
index 00000000000..962c78c3de2
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/Report/Data/ConfigInterface.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Tools\Dependency\Report\Data;
+
+/**
+ * Config
+ */
+interface ConfigInterface
+{
+    /**
+     * Get modules
+     *
+     * @return array
+     */
+    public function getModules();
+
+    /**
+     * Get total dependencies count
+     *
+     * @return int
+     */
+    public function getDependenciesCount();
+}
diff --git a/dev/tools/Magento/Tools/Dependency/Report/Dependency/Builder.php b/dev/tools/Magento/Tools/Dependency/Report/Dependency/Builder.php
new file mode 100644
index 00000000000..19c629d4275
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/Report/Dependency/Builder.php
@@ -0,0 +1,52 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Tools\Dependency\Report\Dependency;
+
+use Magento\Tools\Dependency\Report\Builder\AbstractBuilder;
+
+/**
+ *  Modules dependencies report builder
+ */
+class Builder extends AbstractBuilder
+{
+    /**
+     * Template method. Prepare data for writer step
+     *
+     * @param array $modulesData
+     * @return \Magento\Tools\Dependency\Report\Dependency\Data\Config
+     */
+    protected function buildData($modulesData)
+    {
+        $modules = [];
+        foreach ($modulesData as $moduleData) {
+            $dependencies = [];
+            foreach ($moduleData['dependencies'] as $dependencyData) {
+                $dependencies[] = new Data\Dependency($dependencyData['module'], $dependencyData['type']);
+            }
+            $modules[] = new Data\Module($moduleData['name'], $dependencies);
+        }
+        return new Data\Config($modules);
+    }
+}
diff --git a/dev/tools/Magento/Tools/Dependency/Report/Dependency/Data/Config.php b/dev/tools/Magento/Tools/Dependency/Report/Dependency/Data/Config.php
new file mode 100644
index 00000000000..23627e44106
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/Report/Dependency/Data/Config.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Tools\Dependency\Report\Dependency\Data;
+
+use Magento\Tools\Dependency\Report\Data\Config\AbstractConfig;
+
+/**
+ * Config
+ *
+ * @method \Magento\Tools\Dependency\Report\Dependency\Data\Module[] getModules()
+ */
+class Config extends AbstractConfig
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getDependenciesCount()
+    {
+        return $this->getHardDependenciesCount() + $this->getSoftDependenciesCount();
+    }
+
+    /**
+     * Get hard dependencies count
+     *
+     * @return int
+     */
+    public function getHardDependenciesCount()
+    {
+        $dependenciesCount = 0;
+        foreach ($this->getModules() as $module) {
+            $dependenciesCount += $module->getHardDependenciesCount();
+        }
+        return $dependenciesCount;
+    }
+
+    /**
+     * Get soft dependencies count
+     *
+     * @return int
+     */
+    public function getSoftDependenciesCount()
+    {
+        $dependenciesCount = 0;
+        foreach ($this->getModules() as $module) {
+            $dependenciesCount += $module->getSoftDependenciesCount();
+        }
+        return $dependenciesCount;
+    }
+}
diff --git a/dev/tools/Magento/Tools/Dependency/Report/Dependency/Data/Dependency.php b/dev/tools/Magento/Tools/Dependency/Report/Dependency/Data/Dependency.php
new file mode 100644
index 00000000000..eb87a8d0851
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/Report/Dependency/Data/Dependency.php
@@ -0,0 +1,105 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Tools\Dependency\Report\Dependency\Data;
+
+/**
+ * Dependency
+ */
+class Dependency
+{
+    /**#@+
+     * Dependencies types
+     */
+    const TYPE_HARD = 'hard';
+    const TYPE_SOFT = 'soft';
+    /**#@-*/
+
+    /**
+     * Module we depend on
+     *
+     * @var string
+     */
+    protected $module;
+
+    /**
+     * Dependency type
+     *
+     * @var string
+     */
+    protected $type;
+
+    /**
+     * Dependency construct
+     *
+     * @param string $module
+     * @param string $type One of self::TYPE_* constants
+     */
+    public function __construct($module, $type = self::TYPE_HARD)
+    {
+        $this->module = $module;
+
+        $this->type = (self::TYPE_SOFT == $type) ? self::TYPE_SOFT : self::TYPE_HARD;
+    }
+
+    /**
+     * Get module
+     *
+     * @return string
+     */
+    public function getModule()
+    {
+        return $this->module;
+    }
+
+    /**
+     * Get type
+     *
+     * @return string
+     */
+    public function getType()
+    {
+        return $this->type;
+    }
+
+    /**
+     * Check is hard dependency
+     *
+     * @return bool
+     */
+    public function isHard()
+    {
+        return self::TYPE_HARD == $this->getType();
+    }
+
+    /**
+     * Check is soft dependency
+     *
+     * @return bool
+     */
+    public function isSoft()
+    {
+        return self::TYPE_SOFT == $this->getType();
+    }
+}
diff --git a/dev/tools/Magento/Tools/Dependency/Report/Dependency/Data/Module.php b/dev/tools/Magento/Tools/Dependency/Report/Dependency/Data/Module.php
new file mode 100644
index 00000000000..f903b6449ae
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/Report/Dependency/Data/Module.php
@@ -0,0 +1,119 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Tools\Dependency\Report\Dependency\Data;
+
+/**
+ * Module
+ */
+class Module
+{
+    /**
+     * Module name
+     *
+     * @var string
+     */
+    protected $name;
+
+    /**
+     * Module dependencies
+     *
+     * @var \Magento\Tools\Dependency\Report\Dependency\Data\Dependency[]
+     */
+    protected $dependencies;
+
+    /**
+     * Module construct
+     *
+     * @param array $name
+     * @param \Magento\Tools\Dependency\Report\Dependency\Data\Dependency[] $dependencies
+     */
+    public function __construct($name, array $dependencies = [])
+    {
+        $this->name = $name;
+        $this->dependencies = $dependencies;
+    }
+
+    /**
+     * Get name
+     *
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Get dependencies
+     *
+     * @return \Magento\Tools\Dependency\Report\Dependency\Data\Dependency[]
+     */
+    public function getDependencies()
+    {
+        return $this->dependencies;
+    }
+
+    /**
+     * Get total dependencies count
+     *
+     * @return int
+     */
+    public function getDependenciesCount()
+    {
+        return count($this->dependencies);
+    }
+
+    /**
+     * Get hard dependencies count
+     *
+     * @return int
+     */
+    public function getHardDependenciesCount()
+    {
+        $dependenciesCount = 0;
+        foreach ($this->getDependencies() as $dependency) {
+            if ($dependency->isHard()) {
+                $dependenciesCount++;
+            }
+        }
+        return $dependenciesCount;
+    }
+
+    /**
+     * Get soft dependencies count
+     *
+     * @return int
+     */
+    public function getSoftDependenciesCount()
+    {
+        $dependenciesCount = 0;
+        foreach ($this->getDependencies() as $dependency) {
+            if ($dependency->isSoft()) {
+                $dependenciesCount++;
+            }
+        }
+        return $dependenciesCount;
+    }
+}
diff --git a/dev/tools/Magento/Tools/Dependency/Report/Dependency/Writer.php b/dev/tools/Magento/Tools/Dependency/Report/Dependency/Writer.php
new file mode 100644
index 00000000000..9ce5dab81ae
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/Report/Dependency/Writer.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Tools\Dependency\Report\Dependency;
+
+use Magento\Tools\Dependency\Report\Writer\Csv\AbstractWriter;
+
+/**
+ * Csv file writer for modules dependencies report
+ */
+class Writer extends AbstractWriter
+{
+    /**
+     * Template method. Prepare data step
+     *
+     * @param \Magento\Tools\Dependency\Report\Dependency\Data\Config $config
+     * @return array
+     */
+    protected function prepareData($config)
+    {
+        $data[] = ['', 'All', 'Hard', 'Soft'];
+        $data[] = [
+            'Total number of dependencies',
+            $config->getDependenciesCount(),
+            $config->getHardDependenciesCount(),
+            $config->getSoftDependenciesCount(),
+        ];
+        $data[] = [];
+
+        if ($config->getDependenciesCount()) {
+            $data[] = ['Dependencies for each module:', 'All', 'Hard', 'Soft'];
+            foreach ($config->getModules() as $module) {
+                if ($module->getDependenciesCount()) {
+                    $data[] = [
+                        $module->getName(),
+                        $module->getDependenciesCount(),
+                        $module->getHardDependenciesCount(),
+                        $module->getSoftDependenciesCount(),
+                    ];
+                    foreach ($module->getDependencies() as $dependency) {
+                        $data[] = [
+                            ' -- ' . $dependency->getModule(),
+                            '',
+                            (int)$dependency->isHard(),
+                            (int)!$dependency->isHard(),
+                        ];
+                    }
+                    $data[] = [];
+                }
+            }
+        }
+        array_pop($data);
+
+        return $data;
+    }
+}
diff --git a/dev/tools/Magento/Tools/Dependency/Report/Framework/Builder.php b/dev/tools/Magento/Tools/Dependency/Report/Framework/Builder.php
new file mode 100644
index 00000000000..6b2b798da81
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/Report/Framework/Builder.php
@@ -0,0 +1,109 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Tools\Dependency\Report\Framework;
+
+use Magento\Tools\Dependency\ParserInterface;
+use Magento\Tools\Dependency\Report\Builder\AbstractBuilder;
+use Magento\Tools\Dependency\Report\WriterInterface;
+
+/**
+ *  Framework dependencies report builder
+ */
+class Builder extends AbstractBuilder
+{
+    /**
+     * Config parser
+     *
+     * @var \Magento\Tools\Dependency\ParserInterface
+     */
+    protected $configParser;
+
+    /**
+     * Builder constructor
+     *
+     * @param \Magento\Tools\Dependency\ParserInterface $dependenciesParser
+     * @param \Magento\Tools\Dependency\Report\WriterInterface $reportWriter
+     * @param \Magento\Tools\Dependency\ParserInterface $configParser
+     */
+    public function __construct(
+        ParserInterface $dependenciesParser,
+        WriterInterface $reportWriter,
+        ParserInterface $configParser
+    ) {
+        parent::__construct($dependenciesParser, $reportWriter);
+
+        $this->configParser = $configParser;
+    }
+
+    /**
+     * Template method. Check passed options step
+     *
+     * @param array $options
+     * @throws \InvalidArgumentException
+     */
+    protected function checkOptions($options)
+    {
+        parent::checkOptions($options);
+
+        if (!isset($options['parse']['config_files']) || empty($options['parse']['config_files'])) {
+            throw new \InvalidArgumentException('Parse error. Passed option "config_files" is wrong.');
+        }
+    }
+
+    /**
+     * Template method. Prepare data for writer step
+     *
+     * @param array $modulesData
+     * @return \Magento\Tools\Dependency\Report\Framework\Data\Config
+     */
+    protected function buildData($modulesData)
+    {
+        $allowedModules = $this->getAllowedModules();
+
+        $modules = [];
+        foreach ($modulesData as $moduleData) {
+            $dependencies = [];
+            foreach ($moduleData['dependencies'] as $dependencyData) {
+                if (!in_array($dependencyData['lib'], $allowedModules)) {
+                    $dependencies[] = new Data\Dependency($dependencyData['lib'], $dependencyData['count']);
+                }
+            }
+            $modules[] = new Data\Module($moduleData['name'], $dependencies);
+        }
+        return new Data\Config($modules);
+    }
+
+    /**
+     * Get allowed modules
+     *
+     * @return array
+     */
+    protected function getAllowedModules()
+    {
+        return array_map(function ($element) {
+            return $element['name'];
+        }, $this->configParser->parse(['files_for_parse' => $this->options['parse']['config_files']]));
+    }
+}
diff --git a/dev/tools/Magento/Tools/Dependency/Report/Framework/Data/Config.php b/dev/tools/Magento/Tools/Dependency/Report/Framework/Data/Config.php
new file mode 100644
index 00000000000..2194ea65004
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/Report/Framework/Data/Config.php
@@ -0,0 +1,47 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Tools\Dependency\Report\Framework\Data;
+
+use Magento\Tools\Dependency\Report\Data\Config\AbstractConfig;
+
+/**
+ * Config
+ *
+ * @method \Magento\Tools\Dependency\Report\Framework\Data\Module[] getModules()
+ */
+class Config extends AbstractConfig
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getDependenciesCount()
+    {
+        $dependenciesCount = 0;
+        foreach ($this->getModules() as $module) {
+            $dependenciesCount += $module->getDependenciesCount();
+        }
+        return $dependenciesCount;
+    }
+}
diff --git a/dev/tools/Magento/Tools/Dependency/Report/Framework/Data/Dependency.php b/dev/tools/Magento/Tools/Dependency/Report/Framework/Data/Dependency.php
new file mode 100644
index 00000000000..9713e4c3aed
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/Report/Framework/Data/Dependency.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Tools\Dependency\Report\Framework\Data;
+
+/**
+ * Dependency
+ */
+class Dependency
+{
+    /**
+     * Lib we depend on
+     *
+     * @var string
+     */
+    protected $lib;
+
+    /**
+     * Dependencies count
+     *
+     * @var int
+     */
+    protected $count;
+
+    /**
+     * Dependency construct
+     *
+     * @param string $lib
+     * @param int $count
+     */
+    public function __construct($lib, $count)
+    {
+        $this->lib = $lib;
+        $this->count = $count;
+    }
+
+    /**
+     * Get lib
+     *
+     * @return string
+     */
+    public function getLib()
+    {
+        return $this->lib;
+    }
+
+    /**
+     * Get count
+     *
+     * @return int
+     */
+    public function getCount()
+    {
+        return $this->count;
+    }
+}
diff --git a/dev/tools/Magento/Tools/Dependency/Report/Framework/Data/Module.php b/dev/tools/Magento/Tools/Dependency/Report/Framework/Data/Module.php
new file mode 100644
index 00000000000..0f59e1c1e1e
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/Report/Framework/Data/Module.php
@@ -0,0 +1,87 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Tools\Dependency\Report\Framework\Data;
+
+/**
+ * Module
+ */
+class Module
+{
+    /**
+     * Module name
+     *
+     * @var string
+     */
+    protected $name;
+
+    /**
+     * Module dependencies
+     *
+     * @var \Magento\Tools\Dependency\Report\Framework\Data\Dependency[]
+     */
+    protected $dependencies;
+
+    /**
+     * Module construct
+     *
+     * @param array $name
+     * @param \Magento\Tools\Dependency\Report\Framework\Data\Dependency[] $dependencies
+     */
+    public function __construct($name, array $dependencies = [])
+    {
+        $this->name = $name;
+        $this->dependencies = $dependencies;
+    }
+
+    /**
+     * Get name
+     *
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Get dependencies
+     *
+     * @return \Magento\Tools\Dependency\Report\Framework\Data\Dependency[]
+     */
+    public function getDependencies()
+    {
+        return $this->dependencies;
+    }
+
+    /**
+     * Get total dependencies count
+     *
+     * @return int
+     */
+    public function getDependenciesCount()
+    {
+        return count($this->dependencies);
+    }
+}
diff --git a/dev/tools/Magento/Tools/Dependency/Report/Framework/Writer.php b/dev/tools/Magento/Tools/Dependency/Report/Framework/Writer.php
new file mode 100644
index 00000000000..c200f9ab3d4
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/Report/Framework/Writer.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Tools\Dependency\Report\Framework;
+
+use Magento\Tools\Dependency\Report\Writer\Csv\AbstractWriter;
+
+/**
+ * Csv file writer for framework dependencies report
+ */
+class Writer extends AbstractWriter
+{
+    /**
+     * Template method. Prepare data step
+     *
+     * @param \Magento\Tools\Dependency\Report\Framework\Data\Config $config
+     * @return array
+     */
+    protected function prepareData($config)
+    {
+        $data[] = ['Dependencies of framework:', 'Total number'];
+        $data[] = ['', $config->getDependenciesCount()];
+        $data[] = [];
+
+
+        if ($config->getDependenciesCount()) {
+            $data[] = ['Dependencies for each module:', ''];
+            foreach ($config->getModules() as $module) {
+                $data[] = [$module->getName(), $module->getDependenciesCount()];
+                foreach ($module->getDependencies() as $dependency) {
+                    $data[] = [' -- ' . $dependency->getLib(), $dependency->getCount()];
+                }
+                $data[] = [];
+            }
+        }
+        array_pop($data);
+
+        return $data;
+    }
+}
diff --git a/dev/tools/Magento/Tools/Dependency/Report/Writer/Csv/AbstractWriter.php b/dev/tools/Magento/Tools/Dependency/Report/Writer/Csv/AbstractWriter.php
new file mode 100644
index 00000000000..5c123a7659a
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/Report/Writer/Csv/AbstractWriter.php
@@ -0,0 +1,95 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Tools\Dependency\Report\Writer\Csv;
+
+use Magento\Tools\Dependency\Report\Data\ConfigInterface;
+use Magento\Tools\Dependency\Report\WriterInterface;
+
+/**
+ * Abstract csv file writer for reports
+ */
+abstract class AbstractWriter implements WriterInterface
+{
+    /**
+     * Csv write object
+     *
+     * @var \Magento\File\Csv
+     */
+    protected $writer;
+
+    /**
+     * Writer constructor
+     *
+     * @param \Magento\File\Csv $writer
+     */
+    public function __construct($writer)
+    {
+        $this->writer = $writer;
+    }
+
+    /**
+     * Template method. Main algorithm
+     *
+     * {@inheritdoc}
+     */
+    public function write(array $options, ConfigInterface $config)
+    {
+        $this->checkOptions($options);
+
+        $this->writeToFile($options['report_filename'], $this->prepareData($config));
+    }
+
+    /**
+     * Template method. Check passed options step
+     *
+     * @param array $options
+     * @throws \InvalidArgumentException
+     */
+    protected function checkOptions($options)
+    {
+        if (!isset($options['report_filename']) || empty($options['report_filename'])) {
+            throw new \InvalidArgumentException('Writing error: Passed option "report_filename" is wrong.');
+        }
+    }
+
+    /**
+     * Template method. Prepare data step
+     *
+     * @param \Magento\Tools\Dependency\Report\Data\ConfigInterface $config
+     * @return array
+     */
+    abstract protected function prepareData($config);
+
+    /**
+     * Template method. Write to file step
+     *
+     * @param string $filename
+     * @param array $data
+     */
+    protected function writeToFile($filename, $data)
+    {
+        $this->writer->saveData($filename, $data);
+    }
+}
diff --git a/dev/tools/Magento/Tools/Dependency/Report/WriterInterface.php b/dev/tools/Magento/Tools/Dependency/Report/WriterInterface.php
new file mode 100644
index 00000000000..6fc9fb71e16
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/Report/WriterInterface.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Tools\Dependency\Report;
+
+use Magento\Tools\Dependency\Report\Data\ConfigInterface;
+
+/**
+ *  Writer Interface
+ */
+interface WriterInterface
+{
+    /**
+     * Write a report file
+     *
+     * @param array $options
+     * @param \Magento\Tools\Dependency\Report\Data\ConfigInterface $config
+     */
+    public function write(array $options, ConfigInterface $config);
+}
diff --git a/dev/tools/Magento/Tools/Dependency/ServiceLocator.php b/dev/tools/Magento/Tools/Dependency/ServiceLocator.php
new file mode 100644
index 00000000000..5d5f65b295b
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/ServiceLocator.php
@@ -0,0 +1,171 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Tools\Dependency;
+
+use Magento\File\Csv;
+use Magento\Tools\Dependency\Circular as CircularTool;
+use Magento\Tools\Dependency\Parser;
+use Magento\Tools\Dependency\Report\Dependency;
+use Magento\Tools\Dependency\Report\Circular as CircularReport;
+use Magento\Tools\Dependency\Report\Framework;
+
+/**
+ * Service Locator (instead DI container)
+ *
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
+class ServiceLocator
+{
+    /**
+     * Xml config dependencies parser
+     *
+     * @var \Magento\Tools\Dependency\ParserInterface
+     */
+    private static $xmlConfigParser;
+
+    /**
+     * Framework dependencies parser
+     *
+     * @var \Magento\Tools\Dependency\ParserInterface
+     */
+    private static $frameworkDependenciesParser;
+
+    /**
+     * Modules dependencies report builder
+     *
+     * @var \Magento\Tools\Dependency\Report\BuilderInterface
+     */
+    private static $dependenciesReportBuilder;
+
+    /**
+     * Modules circular dependencies report builder
+     *
+     * @var \Magento\Tools\Dependency\Report\BuilderInterface
+     */
+    private static $circularDependenciesReportBuilder;
+
+    /**
+     * Framework dependencies report builder
+     *
+     * @var \Magento\Tools\Dependency\Report\BuilderInterface
+     */
+    private static $frameworkDependenciesReportBuilder;
+
+    /**
+     * Csv file writer
+     *
+     * @var \Magento\File\Csv
+     */
+    private static $csvWriter;
+
+    /**
+     * Get modules dependencies report builder
+     *
+     * @return \Magento\Tools\Dependency\Report\BuilderInterface
+     */
+    public static function getDependenciesReportBuilder()
+    {
+        if (null === self::$dependenciesReportBuilder) {
+            self::$dependenciesReportBuilder = new Dependency\Builder(
+                self::getXmlConfigParser(),
+                new Dependency\Writer(self::getCsvWriter())
+            );
+        }
+        return self::$dependenciesReportBuilder;
+    }
+
+    /**
+     * Get modules circular dependencies report builder
+     *
+     * @return \Magento\Tools\Dependency\Report\BuilderInterface
+     */
+    public static function getCircularDependenciesReportBuilder()
+    {
+        if (null === self::$circularDependenciesReportBuilder) {
+            self::$circularDependenciesReportBuilder = new CircularReport\Builder(
+                self::getXmlConfigParser(),
+                new CircularReport\Writer(self::getCsvWriter()),
+                new CircularTool([], null)
+            );
+        }
+        return self::$circularDependenciesReportBuilder;
+    }
+
+    /**
+     * Get framework dependencies report builder
+     *
+     * @return \Magento\Tools\Dependency\Report\BuilderInterface
+     */
+    public static function getFrameworkDependenciesReportBuilder()
+    {
+        if (null === self::$frameworkDependenciesReportBuilder) {
+            self::$frameworkDependenciesReportBuilder = new Framework\Builder(
+                self::getFrameworkDependenciesParser(),
+                new Framework\Writer(self::getCsvWriter()),
+                self::getXmlConfigParser()
+            );
+        }
+        return self::$frameworkDependenciesReportBuilder;
+    }
+
+    /**
+     * Get modules dependencies parser
+     *
+     * @return \Magento\Tools\Dependency\ParserInterface
+     */
+    private static function getXmlConfigParser()
+    {
+        if (null === self::$xmlConfigParser) {
+            self::$xmlConfigParser = new Parser\Config\Xml();
+        }
+        return self::$xmlConfigParser;
+    }
+
+    /**
+     * Get framework dependencies parser
+     *
+     * @return \Magento\Tools\Dependency\ParserInterface
+     */
+    private static function getFrameworkDependenciesParser()
+    {
+        if (null === self::$frameworkDependenciesParser) {
+            self::$frameworkDependenciesParser = new Parser\Code();
+        }
+        return self::$frameworkDependenciesParser;
+    }
+
+    /**
+     * Get csv file writer
+     *
+     * @return \Magento\File\Csv
+     */
+    private static function getCsvWriter()
+    {
+        if (null === self::$csvWriter) {
+            self::$csvWriter = (new Csv())->setDelimiter(';');
+        }
+        return self::$csvWriter;
+    }
+}
diff --git a/dev/tools/Magento/Tools/Dependency/generate/bootstrap.php b/dev/tools/Magento/Tools/Dependency/generate/bootstrap.php
new file mode 100644
index 00000000000..6d5b93b67df
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/generate/bootstrap.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license   http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+define('BP', realpath(__DIR__ . '/../../../../../../') . '/');
+
+require_once BP . 'app/autoload.php';
+\Magento\Autoload\IncludePath::addIncludePath([
+    BP . 'dev/tests/static/framework',
+    BP . 'dev/tools',
+    BP . '/lib',
+]);
diff --git a/dev/tools/Magento/Tools/Dependency/generate/framework-dependencies.php b/dev/tools/Magento/Tools/Dependency/generate/framework-dependencies.php
new file mode 100644
index 00000000000..95cdcab69a4
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/generate/framework-dependencies.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright  Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+require_once __DIR__ . '/bootstrap.php';
+
+use Magento\TestFramework\Utility\Files;
+use Magento\Tools\Dependency\ServiceLocator;
+
+try {
+    $console = new \Zend_Console_Getopt([
+        'directory|d=s' => 'Path to base directory for parsing',
+    ]);
+    $console->parse();
+
+    $directory = $console->getOption('directory') ?: BP;
+
+    Files::setInstance(new \Magento\TestFramework\Utility\Files($directory));
+    $filesForParse = Files::init()->getFiles([Files::init()->getPathToSource() . '/app/code/Magento'], '*');
+    $configFiles = Files::init()->getConfigFiles('module.xml', [], false);
+
+    ServiceLocator::getFrameworkDependenciesReportBuilder()->build([
+        'parse' => [
+            'files_for_parse' => $filesForParse,
+            'config_files' => $configFiles,
+            'declared_namespaces' => Files::init()->getNamespaces(),
+        ],
+        'write' => [
+            'report_filename' => 'framework-dependencies.csv',
+        ],
+    ]);
+
+    fwrite(STDOUT, PHP_EOL . 'Report successfully processed.' . PHP_EOL);
+
+} catch (\Zend_Console_Getopt_Exception $e) {
+    fwrite(STDERR, $e->getUsageMessage() . PHP_EOL);
+    exit(1);
+} catch (\Exception $e) {
+    fwrite(STDERR, 'Please, check passed path. Dependencies report generator failed: ' . $e->getMessage() . PHP_EOL);
+    exit(1);
+}
diff --git a/dev/tools/Magento/Tools/Dependency/generate/modules-circular-dependencies.php b/dev/tools/Magento/Tools/Dependency/generate/modules-circular-dependencies.php
new file mode 100644
index 00000000000..e59cc3698c8
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/generate/modules-circular-dependencies.php
@@ -0,0 +1,58 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright  Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+require_once __DIR__ . '/bootstrap.php';
+
+use Magento\TestFramework\Utility\Files;
+use Magento\Tools\Dependency\ServiceLocator;
+
+try {
+    $console = new \Zend_Console_Getopt([
+        'directory|d=s' => 'Path to base directory for parsing',
+    ]);
+    $console->parse();
+
+    $directory = $console->getOption('directory') ?: BP;
+
+    Files::setInstance(new \Magento\TestFramework\Utility\Files($directory));
+    $filesForParse = Files::init()->getConfigFiles('module.xml', [], false);
+
+    ServiceLocator::getCircularDependenciesReportBuilder()->build([
+        'parse' => [
+            'files_for_parse' => $filesForParse,
+        ],
+        'write' => [
+            'report_filename' => 'modules-circular-dependencies.csv',
+        ],
+    ]);
+
+    fwrite(STDOUT, PHP_EOL . 'Report successfully processed.' . PHP_EOL);
+
+} catch (\Zend_Console_Getopt_Exception $e) {
+    fwrite(STDERR, $e->getUsageMessage() . PHP_EOL);
+    exit(1);
+} catch (\Exception $e) {
+    fwrite(STDERR, 'Please, check passed path. Dependencies report generator failed: ' . $e->getMessage() . PHP_EOL);
+    exit(1);
+}
diff --git a/dev/tools/Magento/Tools/Dependency/generate/modules-dependencies.php b/dev/tools/Magento/Tools/Dependency/generate/modules-dependencies.php
new file mode 100644
index 00000000000..72397f9e93e
--- /dev/null
+++ b/dev/tools/Magento/Tools/Dependency/generate/modules-dependencies.php
@@ -0,0 +1,58 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright  Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+require_once __DIR__ . '/bootstrap.php';
+
+use Magento\TestFramework\Utility\Files;
+use Magento\Tools\Dependency\ServiceLocator;
+
+try {
+    $console = new \Zend_Console_Getopt([
+        'directory|d=s' => 'Path to base directory for parsing',
+    ]);
+    $console->parse();
+
+    $directory = $console->getOption('directory') ?: BP;
+
+    Files::setInstance(new \Magento\TestFramework\Utility\Files($directory));
+    $filesForParse = Files::init()->getConfigFiles('module.xml', [], false);
+
+    ServiceLocator::getDependenciesReportBuilder()->build([
+        'parse' => [
+            'files_for_parse' => $filesForParse,
+        ],
+        'write' => [
+            'report_filename' => 'modules-dependencies.csv',
+        ],
+    ]);
+
+    fwrite(STDOUT, PHP_EOL . 'Report successfully processed.' . PHP_EOL);
+
+} catch (\Zend_Console_Getopt_Exception $e) {
+    fwrite(STDERR, $e->getUsageMessage() . PHP_EOL);
+    exit(1);
+} catch (\Exception $e) {
+    fwrite(STDERR, 'Please, check passed path. Dependencies report generator failed: ' . $e->getMessage() . PHP_EOL);
+    exit(1);
+}
diff --git a/dev/tools/Magento/Tools/Di/Code/Scanner/XmlScanner.php b/dev/tools/Magento/Tools/Di/Code/Scanner/XmlScanner.php
index bbc5fd203d7..2c8d10e7808 100644
--- a/dev/tools/Magento/Tools/Di/Code/Scanner/XmlScanner.php
+++ b/dev/tools/Magento/Tools/Di/Code/Scanner/XmlScanner.php
@@ -54,13 +54,14 @@ class XmlScanner implements ScannerInterface
             $xpath = new \DOMXPath($dom);
             $xpath->registerNamespace("php", "http://php.net/xpath");
             $xpath->registerPhpFunctions('preg_match');
-            $regex = '/(.*)Proxy/';
-            $query = "/config/preference[ php:functionString('preg_match', '$regex', @type) > 0] | "
-                . "/config/type/param/instance[ php:functionString('preg_match', '$regex', @type) > 0] | "
-                . "/config/virtualType[ php:functionString('preg_match', '$regex', @type) > 0]";
+            $regex = '/^(.*)\\\(.*)Proxy$/';
+            $query = "/config/preference[ php:functionString('preg_match', '$regex', @type) > 0]/@type | "
+                . "//argument[@xsi:type='object' and php:functionString('preg_match', '$regex', text()) > 0] |"
+                . "//item[@xsi:type='object' and php:functionString('preg_match', '$regex', text()) > 0] |"
+                . "/config/virtualType[ php:functionString('preg_match', '$regex', @type) > 0]/@type";
             /** @var \DOMNode $node */
             foreach ($xpath->query($query) as $node) {
-                $output[] = $node->attributes->getNamedItem('type')->nodeValue;
+                $output[] = $node->nodeValue;
             }
         }
         $output = array_unique($output);
diff --git a/dev/tools/Magento/Tools/Di/Definition/Compressor/UniqueList.php b/dev/tools/Magento/Tools/Di/Definition/Compressor/UniqueList.php
index 2db5821696e..e7ea795da13 100644
--- a/dev/tools/Magento/Tools/Di/Definition/Compressor/UniqueList.php
+++ b/dev/tools/Magento/Tools/Di/Definition/Compressor/UniqueList.php
@@ -40,8 +40,8 @@ class UniqueList
      */
     public function getNumber($item)
     {
-        if (in_array($item, $this->_items)) {
-            return array_search($item, $this->_items);
+        if (in_array($item, $this->_items, true)) {
+            return array_search($item, $this->_items, true);
         } else {
             $this->_items[] = $item;
             return count($this->_items) - 1;
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 72200fd86dc..0d020e77c1a 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
@@ -63,17 +63,9 @@ return array(
     'bundle/stock_index' => 'catalog_product_bundle_stock_index',
     'captcha/log' => 'captcha_log',
     'catalog/category' => 'catalog_category_entity',
-    'catalog/category_anchor_indexer_idx' => 'catalog_category_anc_categs_index_idx',
-    'catalog/category_anchor_indexer_tmp' => 'catalog_category_anc_categs_index_tmp',
-    'catalog/category_anchor_products_indexer_idx' => 'catalog_category_anc_products_index_idx',
-    'catalog/category_anchor_products_indexer_tmp' => 'catalog_category_anc_products_index_tmp',
     'catalog/category_flat' => 'catalog_category_flat',
     'catalog/category_product' => 'catalog_category_product',
-    'catalog/category_product_enabled_indexer_idx' => 'catalog_category_product_index_enbl_idx',
-    'catalog/category_product_enabled_indexer_tmp' => 'catalog_category_product_index_enbl_tmp',
     'catalog/category_product_index' => 'catalog_category_product_index',
-    'catalog/category_product_indexer_idx' => 'catalog_category_product_index_idx',
-    'catalog/category_product_indexer_tmp' => 'catalog_category_product_index_tmp',
     'catalog/compare_item' => 'catalog_compare_item',
     'catalog/eav_attribute' => 'catalog_eav_attribute',
     'catalog/product' => 'catalog_product_entity',
@@ -85,7 +77,6 @@ return array(
     'catalog/product_eav_decimal_indexer_tmp' => 'catalog_product_index_eav_decimal_tmp',
     'catalog/product_eav_indexer_idx' => 'catalog_product_index_eav_idx',
     'catalog/product_eav_indexer_tmp' => 'catalog_product_index_eav_tmp',
-    'catalog/product_enabled_index' => 'catalog_product_enabled_index',
     'catalog/product_flat' => 'catalog_product_flat',
     'catalog/product_index_eav' => 'catalog_product_index_eav',
     'catalog/product_index_eav_decimal' => 'catalog_product_index_eav_decimal',
diff --git a/lib/Magento/App/Arguments/ArgumentInterpreter.php b/lib/Magento/App/Arguments/ArgumentInterpreter.php
new file mode 100644
index 00000000000..ac22d335ad5
--- /dev/null
+++ b/lib/Magento/App/Arguments/ArgumentInterpreter.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\App\Arguments;
+
+use Magento\Data\Argument\InterpreterInterface;
+use Magento\Data\Argument\Interpreter\Constant;
+use Magento\Data\Argument\MissingOptionalValueException;
+use Magento\App\Arguments;
+
+/**
+ * Interpreter that returns value of an application argument, retrieving its name from a constant
+ */
+class ArgumentInterpreter implements InterpreterInterface
+{
+    /**
+     * @var Arguments
+     */
+    private $arguments;
+
+    /**
+     * @var Constant
+     */
+    private $constInterpreter;
+
+    /**
+     * @param Arguments $arguments
+     * @param Constant $constInterpreter
+     */
+    public function __construct(Arguments $arguments, Constant $constInterpreter)
+    {
+        $this->arguments = $arguments;
+        $this->constInterpreter = $constInterpreter;
+    }
+
+    /**
+     * {@inheritdoc}
+     * @return mixed
+     * @throws MissingOptionalValueException
+     */
+    public function evaluate(array $data)
+    {
+        $argumentName = $this->constInterpreter->evaluate($data);
+        $result = $this->arguments->get($argumentName);
+        if ($result === null) {
+            throw new MissingOptionalValueException("Value of application argument '$argumentName' is not defined.");
+        }
+        return $result;
+    }
+}
diff --git a/lib/Magento/App/Arguments/Loader.php b/lib/Magento/App/Arguments/Loader.php
index b285790a332..706eff29481 100644
--- a/lib/Magento/App/Arguments/Loader.php
+++ b/lib/Magento/App/Arguments/Loader.php
@@ -94,7 +94,10 @@ class Loader
             }
         }
 
-        $converter = new \Magento\Config\Converter\Dom\Flat($this->_idAttributes);
+        $arrayNodeConfig = new \Magento\Config\Dom\ArrayNodeConfig(
+            new \Magento\Config\Dom\NodePathMatcher, $this->_idAttributes
+        );
+        $converter = new \Magento\Config\Converter\Dom\Flat($arrayNodeConfig);
 
         $result = $converter->convert($localConfig->getDom());
         return !empty($result['config']) ? $result['config'] : array();
diff --git a/lib/Magento/App/Config/Initial/Reader.php b/lib/Magento/App/Config/Initial/Reader.php
index 04bf7834ba0..d59183ab30f 100644
--- a/lib/Magento/App/Config/Initial/Reader.php
+++ b/lib/Magento/App/Config/Initial/Reader.php
@@ -122,6 +122,7 @@ class Reader
                     $domDocument = new $class(
                         $file,
                         array(),
+                        null,
                         $this->_schemaFile
                     );
                 } else {
@@ -138,4 +139,4 @@ class Reader
         }
         return $output;
     }
-}
\ No newline at end of file
+}
diff --git a/lib/Magento/App/Console/Request.php b/lib/Magento/App/Console/Request.php
index 173abd2d50c..6e03ed68251 100644
--- a/lib/Magento/App/Console/Request.php
+++ b/lib/Magento/App/Console/Request.php
@@ -35,15 +35,16 @@ class Request implements \Magento\App\RequestInterface
     /**
      * @param array $parameters
      */
-    public function __construct($parameters = array())
-    {
-        $this->params = $this->setParam($parameters);
+    public function __construct(
+        array $parameters = array()
+    ) {
+        $this->setParam($parameters);
     }
 
     /**
      * Initialize console parameters
      *
-     * @param $parameters
+     * @param array $parameters
      */
     public function setParam($parameters)
     {
diff --git a/lib/Magento/App/ObjectManager.php b/lib/Magento/App/ObjectManager.php
index cb739abc5d6..22999d933a3 100644
--- a/lib/Magento/App/ObjectManager.php
+++ b/lib/Magento/App/ObjectManager.php
@@ -1,7 +1,5 @@
 <?php
 /**
- * Magento application object manager. Configures and application application
- *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -27,6 +25,8 @@ namespace Magento\App;
 use Magento\ObjectManager\Factory;
 
 /**
+ * A wrapper around object manager with workarounds to access it in client code
+ *
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class ObjectManager extends \Magento\ObjectManager\ObjectManager
@@ -36,11 +36,6 @@ class ObjectManager extends \Magento\ObjectManager\ObjectManager
      */
     protected static $_instance;
 
-    /**
-     * @var \Magento\ObjectManager\Relations
-     */
-    protected $_compiledRelations;
-
     /**
      * Retrieve object manager
      *
@@ -76,7 +71,7 @@ class ObjectManager extends \Magento\ObjectManager\ObjectManager
      * @param array $sharedInstances
      */
     public function __construct(
-        Factory $factory = null, \Magento\ObjectManager\Config $config = null, array $sharedInstances = array()
+        Factory $factory, \Magento\ObjectManager\Config $config, array $sharedInstances = array()
     ) {
         parent::__construct($factory, $config, $sharedInstances);
         self::$_instance = $this;
diff --git a/lib/Magento/App/ObjectManager/ConfigLoader/Primary.php b/lib/Magento/App/ObjectManager/ConfigLoader/Primary.php
index 951fd0c29c8..cb1dcb72a1a 100644
--- a/lib/Magento/App/ObjectManager/ConfigLoader/Primary.php
+++ b/lib/Magento/App/ObjectManager/ConfigLoader/Primary.php
@@ -1,7 +1,5 @@
 <?php
 /**
- * Primary configuration loader for application object manager
- *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -25,6 +23,9 @@
  */
 namespace Magento\App\ObjectManager\ConfigLoader;
 
+/**
+ * Primary configuration loader for application object manager
+ */
 class Primary
 {
     /**
@@ -67,7 +68,10 @@ class Primary
                 ),
                 new \Magento\Config\FileIteratorFactory()
             ),
-            new \Magento\ObjectManager\Config\Mapper\Dom(),
+            new \Magento\ObjectManager\Config\Mapper\Dom(
+                new \Magento\Stdlib\BooleanUtils(),
+                new \Magento\ObjectManager\Config\Mapper\ArgumentParser()
+            ),
             new \Magento\ObjectManager\Config\SchemaLocator(),
             new \Magento\App\Arguments\ValidationState($this->_appMode)
         );
diff --git a/lib/Magento/App/ObjectManagerFactory.php b/lib/Magento/App/ObjectManagerFactory.php
index f86e841841c..671544dca20 100644
--- a/lib/Magento/App/ObjectManagerFactory.php
+++ b/lib/Magento/App/ObjectManagerFactory.php
@@ -73,29 +73,21 @@ class ObjectManagerFactory
             array($directoryList->getDir(\Magento\App\Filesystem::GENERATION_DIR))
         );
 
-        $options = new \Magento\App\Arguments(
-            $arguments,
-            new \Magento\App\Arguments\Loader(
-                $directoryList,
-                isset($arguments[\Magento\App\Arguments\Loader::PARAM_CUSTOM_FILE])
-                    ? $arguments[\Magento\App\Arguments\Loader::PARAM_CUSTOM_FILE]
-                    : null
-            )
-        );
+        $appArguments = $this->createAppArguments($directoryList, $arguments);
 
         $definitionFactory = new \Magento\ObjectManager\DefinitionFactory(
             new \Magento\Filesystem\Driver\File(),
             $directoryList->getDir(\Magento\App\Filesystem::DI_DIR),
             $directoryList->getDir(\Magento\App\Filesystem::GENERATION_DIR),
-            $options->get('definition.format', 'serialized')
+            $appArguments->get('definition.format', 'serialized')
         );
 
-        $definitions = $definitionFactory->createClassDefinition($options->get('definitions'));
+        $definitions = $definitionFactory->createClassDefinition($appArguments->get('definitions'));
         $relations = $definitionFactory->createRelations();
         $configClass = $this->_configClassName;
         /** @var \Magento\ObjectManager\Config\Config $diConfig */
         $diConfig = new $configClass($relations, $definitions);
-        $appMode = $options->get(State::PARAM_MODE, State::MODE_DEFAULT);
+        $appMode = $appArguments->get(State::PARAM_MODE, State::MODE_DEFAULT);
 
         $configData = $this->_loadPrimaryConfig($directoryList, $appMode);
 
@@ -103,16 +95,21 @@ class ObjectManagerFactory
             $diConfig->extend($configData);
         }
 
-        $factory = new \Magento\ObjectManager\Factory\Factory($diConfig, null, $definitions, $options->get());
+        $booleanUtils = new \Magento\Stdlib\BooleanUtils();
+        $argFactory = new \Magento\ObjectManager\Config\Argument\ObjectFactory($diConfig);
+        $argInterpreter = $this->createArgumentInterpreter($booleanUtils, $argFactory, $appArguments);
+        $factory = new \Magento\ObjectManager\Factory\Factory($diConfig, $argInterpreter, $argFactory, $definitions);
 
         $className = $this->_locatorClassName;
         /** @var \Magento\ObjectManager $objectManager */
         $objectManager = new $className($factory, $diConfig, array(
-            'Magento\App\Arguments' => $options,
+            'Magento\App\Arguments' => $appArguments,
             'Magento\App\Filesystem\DirectoryList' => $directoryList,
-            'Magento\Filesystem\DirectoryList' => $directoryList
+            'Magento\Filesystem\DirectoryList' => $directoryList,
+            'Magento\Stdlib\BooleanUtils' => $booleanUtils,
         ));
 
+        $argFactory->setObjectManager($objectManager);
         \Magento\App\ObjectManager::setInstance($objectManager);
 
         /** @var \Magento\App\Filesystem\DirectoryList\Verification $verification */
@@ -150,6 +147,57 @@ class ObjectManagerFactory
         return $objectManager;
     }
 
+    /**
+     * Create instance of application arguments
+     *
+     * @param Filesystem\DirectoryList $directoryList
+     * @param array $arguments
+     * @return Arguments
+     */
+    protected function createAppArguments(\Magento\App\Filesystem\DirectoryList $directoryList, array $arguments)
+    {
+        return new \Magento\App\Arguments(
+            $arguments,
+            new \Magento\App\Arguments\Loader(
+                $directoryList,
+                isset($arguments[\Magento\App\Arguments\Loader::PARAM_CUSTOM_FILE])
+                    ? $arguments[\Magento\App\Arguments\Loader::PARAM_CUSTOM_FILE]
+                    : null
+            )
+        );
+    }
+
+    /**
+     * Return newly created instance on an argument interpreter, suitable for processing DI arguments
+     *
+     * @param \Magento\Stdlib\BooleanUtils $booleanUtils
+     * @param \Magento\ObjectManager\Config\Argument\ObjectFactory $objFactory
+     * @param \Magento\App\Arguments $appArguments
+     * @return \Magento\Data\Argument\InterpreterInterface
+     */
+    protected function createArgumentInterpreter(
+        \Magento\Stdlib\BooleanUtils $booleanUtils,
+        \Magento\ObjectManager\Config\Argument\ObjectFactory $objFactory,
+        \Magento\App\Arguments $appArguments
+    ) {
+        $constInterpreter = new \Magento\Data\Argument\Interpreter\Constant();
+        $result = new \Magento\Data\Argument\Interpreter\Composite(
+            array(
+                'boolean' => new \Magento\Data\Argument\Interpreter\Boolean($booleanUtils),
+                'string' => new \Magento\Data\Argument\Interpreter\String($booleanUtils),
+                'number' => new \Magento\Data\Argument\Interpreter\Number(),
+                'null' => new \Magento\Data\Argument\Interpreter\NullType(),
+                'const' => $constInterpreter,
+                'object' => new \Magento\ObjectManager\Config\Argument\Interpreter\Object($booleanUtils, $objFactory),
+                'init_parameter' => new \Magento\App\Arguments\ArgumentInterpreter($appArguments, $constInterpreter),
+            ),
+            \Magento\ObjectManager\Config\Reader\Dom::TYPE_ATTRIBUTE
+        );
+        // Add interpreters that reference the composite
+        $result->addInterpreter('array', new \Magento\Data\Argument\Interpreter\ArrayType($result));
+        return $result;
+    }
+
     /**
      * @param \Magento\ObjectManager $objectManager
      */
diff --git a/lib/Magento/Config/AbstractXml.php b/lib/Magento/Config/AbstractXml.php
index d4ab16d5871..c1669001659 100644
--- a/lib/Magento/Config/AbstractXml.php
+++ b/lib/Magento/Config/AbstractXml.php
@@ -48,7 +48,7 @@ abstract class AbstractXml
     /**
      * Instantiate with the list of files to merge
      *
-     * @param $configFiles
+     * @param array $configFiles
      * @throws \InvalidArgumentException
      */
     public function __construct($configFiles)
@@ -89,7 +89,7 @@ abstract class AbstractXml
      *
      * @param array $configFiles
      * @return \DOMDocument
-     * @throws \Magento\Exception if a non-existing or invalid XML-file passed
+     * @throws \Magento\Exception If a non-existing or invalid XML-file passed
      */
     protected function _merge($configFiles)
     {
@@ -110,8 +110,8 @@ abstract class AbstractXml
      * Perform xml validation
      *
      * @param string $file
-     * @return \Magento\Config\AbstractXml
-     * @throws \Magento\Exception if invalid XML-file passed
+     * @return $this
+     * @throws \Magento\Exception If invalid XML-file passed
      */
     protected function _performValidate($file = null)
     {
@@ -145,7 +145,7 @@ abstract class AbstractXml
                 ? $this->getPerFileSchemaFile()
                 : null;
             $this->_domConfig =
-                new \Magento\Config\Dom($this->_getInitialXml(), $this->_getIdAttributes(), $schemaFile);
+                new \Magento\Config\Dom($this->_getInitialXml(), $this->_getIdAttributes(), null, $schemaFile);
         }
         return $this->_domConfig;
     }
diff --git a/lib/Magento/Config/Converter/Dom.php b/lib/Magento/Config/Converter/Dom.php
index 8ca06dc0271..34385f76911 100644
--- a/lib/Magento/Config/Converter/Dom.php
+++ b/lib/Magento/Config/Converter/Dom.php
@@ -31,7 +31,7 @@ class Dom implements \Magento\Config\ConverterInterface
     /**
      * Convert dom node tree to array
      *
-     * @param $source
+     * @param mixed $source
      * @return array
      */
     public function convert($source)
diff --git a/lib/Magento/Config/Converter/Dom/Flat.php b/lib/Magento/Config/Converter/Dom/Flat.php
index d89db141c15..deb4a380c21 100644
--- a/lib/Magento/Config/Converter/Dom/Flat.php
+++ b/lib/Magento/Config/Converter/Dom/Flat.php
@@ -1,19 +1,5 @@
 <?php
 /**
- * Converter that dom to array converting all attributes to general array items.
- * Examlpe:
- * <node attr="val">
- *     <subnode>val2<subnode>
- * </node>
- *
- * is converted to
- *
- * array(
- *     'node' => array(
- *         'attr' => 'wal',
- *         'subnode' => 'val2'
- *     )
- * )
  * Magento
  *
  * NOTICE OF LICENSE
@@ -37,71 +23,125 @@
  */
 namespace Magento\Config\Converter\Dom;
 
-class Flat implements \Magento\Config\ConverterInterface
+use Magento\Config\Dom\ArrayNodeConfig;
+
+/**
+ * Universal converter of any XML data to an array representation with no data loss
+ */
+class Flat
 {
     /**
-     * Node identifier attributes
-     *
-     * @var array
+     * @var ArrayNodeConfig
      */
-    protected $_idAttributes;
+    protected $arrayNodeConfig;
 
     /**
-     * @param $idAttributes
+     * Constructor
+     *
+     * @param ArrayNodeConfig $arrayNodeConfig
      */
-    public function __construct($idAttributes)
+    public function __construct(ArrayNodeConfig $arrayNodeConfig)
     {
-        $this->_idAttributes = $idAttributes;
+        $this->arrayNodeConfig = $arrayNodeConfig;
     }
 
     /**
-     * Convert dom node tree to array
+     * Convert dom node tree to array in general case or to string in a case of a text node
+     *
+     * Example:
+     * <node attr="val">
+     *     <subnode>val2<subnode>
+     * </node>
+     *
+     * is converted to
+     *
+     * array(
+     *     'node' => array(
+     *         'attr' => 'wal',
+     *         'subnode' => 'val2'
+     *     )
+     * )
      *
      * @param \DOMNode $source
-     * @param string $path
-     * @return array
+     * @param string $basePath
+     * @return string|array
+     * @throws \UnexpectedValueException
      * @SuppressWarnings(PHPMD.CyclomaticComplexity)
      */
-    public function convert($source, $path = '')
+    public function convert(\DOMNode $source, $basePath = '')
     {
-        $nodeListData = array();
-
-        /** @var $node \DOMNode */
+        $value = array();
+        /** @var \DOMNode $node */
         foreach ($source->childNodes as $node) {
             if ($node->nodeType == XML_ELEMENT_NODE) {
-                $nodeData = array();
-                /** @var $attribute \DOMNode */
-                foreach ($node->attributes as $attribute) {
-                    if ($attribute->nodeType == XML_ATTRIBUTE_NODE) {
-                        $nodeData[$attribute->nodeName] = $attribute->nodeValue;
-                    }
+                $nodeName = $node->nodeName;
+                $nodePath = $basePath . '/' . $nodeName;
+
+                $arrayKeyAttribute = $this->arrayNodeConfig->getAssocArrayKeyAttribute($nodePath);
+                $isNumericArrayNode = $this->arrayNodeConfig->isNumericArray($nodePath);
+                $isArrayNode = $isNumericArrayNode || $arrayKeyAttribute;
+
+                if (isset($value[$nodeName]) && !$isArrayNode) {
+                    throw new \UnexpectedValueException(
+                        "Node path '$nodePath' is not unique, but it has not been marked as array."
+                    );
                 }
-                $fullPath = $path . '/' . $node->nodeName;
-                $childrenData = $this->convert($node, $fullPath);
 
-                if (is_array($childrenData)) {
-                    $nodeData = array_merge($nodeData, $childrenData);
-                    if (!count($nodeData)) {
-                        $nodeListData[$node->nodeName] = '';
-                    } else if (isset($this->_idAttributes[$fullPath])) {
-                        $nodeListData[$node->nodeName][$nodeData[$this->_idAttributes[$fullPath]]] = $nodeData;
+                $nodeData = $this->convert($node, $nodePath);
+
+                if ($isArrayNode) {
+                    if ($isNumericArrayNode) {
+                        $value[$nodeName][] = $nodeData;
+                    } else if (isset($nodeData[$arrayKeyAttribute])) {
+                        $arrayKeyValue = $nodeData[$arrayKeyAttribute];
+                        $value[$nodeName][$arrayKeyValue] = $nodeData;
                     } else {
-                        $nodeListData[$node->nodeName] = $nodeData;
+                        throw new \UnexpectedValueException(
+                            "Array is expected to contain value for key '$arrayKeyAttribute'."
+                        );
                     }
                 } else {
-                    if (count($nodeData)) {
-                        $nodeData['value'] = $childrenData;
-                    } else {
-                        $nodeData = $childrenData;
-                    }
-                    $nodeListData[$node->nodeName] = $nodeData;
+                    $value[$nodeName] = $nodeData;
                 }
-            } elseif ($node->nodeType == XML_CDATA_SECTION_NODE
+            } else if ($node->nodeType == XML_CDATA_SECTION_NODE
                 || ($node->nodeType == XML_TEXT_NODE && trim($node->nodeValue) != '')
             ) {
-                return (string) $node->nodeValue;
+                $value = $node->nodeValue;
+                break;
+            }
+        }
+        $result = $this->getNodeAttributes($source);
+        if (is_array($value)) {
+            $result = array_merge($result, $value);
+            if (!$result) {
+                $result = '';
+            }
+        } else {
+            if ($result) {
+                $result['value'] = $value;
+            } else {
+                $result = $value;
+            }
+        }
+        return $result;
+    }
+
+    /**
+     * Retrieve key-value pairs of node attributes
+     *
+     * @param \DOMNode $node
+     * @return array
+     */
+    protected function getNodeAttributes(\DOMNode $node)
+    {
+        $result = array();
+        $attributes = $node->attributes ?: array();
+        /** @var \DOMNode $attribute */
+        foreach ($attributes as $attribute) {
+            if ($attribute->nodeType == XML_ATTRIBUTE_NODE) {
+                $result[$attribute->nodeName] = $attribute->nodeValue;
             }
         }
-        return $nodeListData;
+        return $result;
     }
 }
diff --git a/lib/Magento/Config/ConverterInterface.php b/lib/Magento/Config/ConverterInterface.php
index fa72d47fba3..697e275c2a2 100644
--- a/lib/Magento/Config/ConverterInterface.php
+++ b/lib/Magento/Config/ConverterInterface.php
@@ -28,8 +28,8 @@ interface ConverterInterface
     /**
      * Convert config
      *
-     * @param mixed $source
-     * @param array
+     * @param \DOMDocument $source
+     * @return array
      */
     public function convert($source);
 }
diff --git a/lib/Magento/Config/Data.php b/lib/Magento/Config/Data.php
index 3d5fad64a48..f701b83bae3 100644
--- a/lib/Magento/Config/Data.php
+++ b/lib/Magento/Config/Data.php
@@ -57,9 +57,11 @@ class Data implements \Magento\Config\DataInterface
     protected $_data = array();
 
     /**
+     * Constructor
+     *
      * @param \Magento\Config\ReaderInterface $reader
      * @param \Magento\Config\CacheInterface $cache
-     * @param $cacheId
+     * @param string $cacheId
      */
     public function __construct(
         \Magento\Config\ReaderInterface $reader,
@@ -80,6 +82,7 @@ class Data implements \Magento\Config\DataInterface
      * Merge config data to the object
      *
      * @param array $config
+     * @return void
      */
     public function merge(array $config)
     {
@@ -91,7 +94,7 @@ class Data implements \Magento\Config\DataInterface
      *
      * @param string $path
      * @param mixed $default
-     * @return mixed
+     * @return array|mixed|null
      */
     public function get($path = null, $default = null)
     {
diff --git a/lib/Magento/Config/Data/Scoped.php b/lib/Magento/Config/Data/Scoped.php
index 74eb447a8fc..5581568d690 100644
--- a/lib/Magento/Config/Data/Scoped.php
+++ b/lib/Magento/Config/Data/Scoped.php
@@ -56,7 +56,7 @@ class Scoped extends \Magento\Config\Data
     /**
      * Scope priority loading scheme
      *
-     * @var array
+     * @var string[]
      */
     protected $_scopePriorityScheme = array();
 
@@ -68,6 +68,8 @@ class Scoped extends \Magento\Config\Data
     protected $_loadedScopes = array();
 
     /**
+     * Constructor
+     *
      * @param \Magento\Config\ReaderInterface $reader
      * @param \Magento\Config\ScopeInterface $configScope
      * @param \Magento\Config\CacheInterface $cache
@@ -90,7 +92,7 @@ class Scoped extends \Magento\Config\Data
      *
      * @param string $path
      * @param mixed $default
-     * @return mixed
+     * @return array|mixed|null
      */
     public function get($path = null, $default = null)
     {
@@ -100,6 +102,8 @@ class Scoped extends \Magento\Config\Data
 
     /**
      * Load data for current scope
+     *
+     * @return void
      */
     protected function _loadScopedData()
     {
diff --git a/lib/Magento/Config/DataInterface.php b/lib/Magento/Config/DataInterface.php
index e86b957b1d7..74ffd5ca93a 100644
--- a/lib/Magento/Config/DataInterface.php
+++ b/lib/Magento/Config/DataInterface.php
@@ -29,6 +29,7 @@ interface DataInterface
      * Merge config data to the object
      *
      * @param array $config
+     * @return void
      */
     public function merge(array $config);
 
diff --git a/lib/Magento/Config/Dom.php b/lib/Magento/Config/Dom.php
index 94edf8bfb2b..19c83f52f16 100644
--- a/lib/Magento/Config/Dom.php
+++ b/lib/Magento/Config/Dom.php
@@ -50,11 +50,16 @@ class Dom
     protected $_dom;
 
     /**
-     * List of id attributes for merge
+     * @var Dom\NodeMergingConfig
+     */
+    protected $_nodeMergingConfig;
+
+    /**
+     * Name of attribute that specifies type of argument node
      *
-     * @var array
+     * @var string|null
      */
-    protected $_idAttributes;
+    protected $_typeAttributeName;
 
     /**
      * Schema validation file
@@ -85,14 +90,20 @@ class Dom
      *
      * @param string $xml
      * @param array $idAttributes
+     * @param string $typeAttributeName
      * @param string $schemaFile
      * @param string $errorFormat
      */
     public function __construct(
-        $xml, array $idAttributes = array(), $schemaFile = null, $errorFormat = self::ERROR_FORMAT_DEFAULT
+        $xml,
+        array $idAttributes = array(),
+        $typeAttributeName = null,
+        $schemaFile = null,
+        $errorFormat = self::ERROR_FORMAT_DEFAULT
     ) {
         $this->_schemaFile    = $schemaFile;
-        $this->_idAttributes  = $idAttributes;
+        $this->_nodeMergingConfig = new Dom\NodeMergingConfig(new Dom\NodePathMatcher, $idAttributes);
+        $this->_typeAttributeName = $typeAttributeName;
         $this->_errorFormat   = $errorFormat;
         $this->_dom           = $this->_initDom($xml);
         $this->_rootNamespace = $this->_dom->lookupNamespaceUri($this->_dom->namespaceURI);
@@ -120,6 +131,7 @@ class Dom
      *
      * @param \DOMElement $node
      * @param string $parentPath path to parent node
+     * @return void
      */
     protected function _mergeNode(\DOMElement $node, $parentPath)
     {
@@ -129,6 +141,19 @@ class Dom
 
         /* Update matched node attributes and value */
         if ($matchedNode) {
+
+            //different node type
+            if ($this->_typeAttributeName
+                && $node->hasAttribute($this->_typeAttributeName)
+                && $matchedNode->hasAttribute($this->_typeAttributeName)
+                && ($node->getAttribute($this->_typeAttributeName)
+                    !== $matchedNode->getAttribute($this->_typeAttributeName))) {
+                $parentMatchedNode = $this->_getMatchedNode($parentPath);
+                $newNode = $this->_dom->importNode($node, true);
+                $parentMatchedNode->replaceChild($newNode, $matchedNode);
+                return;
+            }
+
             $this->_mergeAttributes($matchedNode, $node);
             if (!$node->hasChildNodes()) {
                 return;
@@ -157,7 +182,7 @@ class Dom
     /**
      * Check if the node content is text
      *
-     * @param $node
+     * @param \DOMElement $node
      * @return bool
      */
     protected function _isTextNode($node)
@@ -168,9 +193,9 @@ class Dom
     /**
      * Merges attributes of the merge node to the base node
      *
-     * @param $baseNode
-     * @param $mergeNode
-     * @return null
+     * @param \DOMElement $baseNode
+     * @param \DOMNode $mergeNode
+     * @return void
      */
     protected function _mergeAttributes($baseNode, $mergeNode)
     {
@@ -190,37 +215,19 @@ class Dom
     {
         $prefix = is_null($this->_rootNamespace) ? '' : self::ROOT_NAMESPACE_PREFIX . ':';
         $path = $parentPath . '/' . $prefix . $node->tagName;
-        $idAttribute = $this->_findIdAttribute($path);
+        $idAttribute = $this->_nodeMergingConfig->getIdAttribute($path);
         if ($idAttribute && $value = $node->getAttribute($idAttribute)) {
             $path .= "[@{$idAttribute}='{$value}']";
         }
         return $path;
     }
 
-    /**
-     * Determine whether an XPath matches registered identifiable attribute
-     *
-     * @param string $xPath
-     * @return string|false
-     */
-    protected function _findIdAttribute($xPath)
-    {
-        $path = preg_replace('/\[@[^\]]+?\]/', '', $xPath);
-        $path = preg_replace('/\/[^:]+?\:/', '/', $path);
-        foreach ($this->_idAttributes as $pathPattern => $id) {
-            if (preg_match("#^$pathPattern$#", $path)) {
-                return $id;
-            }
-        }
-        return false;
-    }
-
     /**
      * Getter for node by path
      *
      * @param string $nodePath
-     * @throws \Magento\Exception an exception is possible if original document contains multiple nodes for identifier
-     * @return \DOMElement | null
+     * @throws \Magento\Exception An exception is possible if original document contains multiple nodes for identifier
+     * @return \DOMElement|null
      */
     protected function _getMatchedNode($nodePath)
     {
@@ -341,7 +348,7 @@ class Dom
      * Set schema file
      *
      * @param string $schemaFile
-     * @return \Magento\Config\Dom
+     * @return $this
      */
     public function setSchemaFile($schemaFile)
     {
@@ -352,7 +359,7 @@ class Dom
     /**
      * Returns the attribute name with prefix, if there is one
      *
-     * @param DOMAttr $attribute
+     * @param \DOMAttr $attribute
      * @return string
      */
     private function _getAttributeName($attribute)
diff --git a/lib/Magento/Config/Dom/ArrayNodeConfig.php b/lib/Magento/Config/Dom/ArrayNodeConfig.php
new file mode 100644
index 00000000000..8d4467e5523
--- /dev/null
+++ b/lib/Magento/Config/Dom/ArrayNodeConfig.php
@@ -0,0 +1,91 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Config\Dom;
+
+/**
+ * Configuration of nodes that represent numeric or associative arrays
+ */
+class ArrayNodeConfig
+{
+    /**
+     * @var NodePathMatcher
+     */
+    private $nodePathMatcher;
+
+    /**
+     * @var array Format: array('/associative/array/path' => '<array_key_attribute>', ...)
+     */
+    private $assocArrays = array();
+
+    /**
+     * @var array Format: array('/numeric/array/path', ...)
+     */
+    private $numericArrays = array();
+
+    /**
+     * @param NodePathMatcher $nodePathMatcher
+     * @param array $assocArrayAttributes
+     * @param array $numericArrays
+     */
+    public function __construct(
+        NodePathMatcher $nodePathMatcher, array $assocArrayAttributes, array $numericArrays = array()
+    ) {
+        $this->nodePathMatcher = $nodePathMatcher;
+        $this->assocArrays = $assocArrayAttributes;
+        $this->numericArrays = $numericArrays;
+    }
+
+    /**
+     * Whether a node is a numeric array or not
+     *
+     * @param string $nodeXpath
+     * @return bool
+     */
+    public function isNumericArray($nodeXpath)
+    {
+        foreach ($this->numericArrays as $pathPattern) {
+            if ($this->nodePathMatcher->match($pathPattern, $nodeXpath)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Retrieve name of array key attribute, if a node is an associative array
+     *
+     * @param string $nodeXpath
+     * @return string|null
+     */
+    public function getAssocArrayKeyAttribute($nodeXpath)
+    {
+        foreach ($this->assocArrays as $pathPattern => $keyAttribute) {
+            if ($this->nodePathMatcher->match($pathPattern, $nodeXpath)) {
+                return $keyAttribute;
+            }
+        }
+        return null;
+    }
+}
diff --git a/lib/Magento/Config/Dom/NodeMergingConfig.php b/lib/Magento/Config/Dom/NodeMergingConfig.php
new file mode 100644
index 00000000000..1d3f6415f7a
--- /dev/null
+++ b/lib/Magento/Config/Dom/NodeMergingConfig.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Config\Dom;
+
+/**
+ * Configuration of identifier attributes to be taken into account during merging
+ */
+class NodeMergingConfig
+{
+    /**
+     * @var NodePathMatcher
+     */
+    private $nodePathMatcher;
+
+    /**
+     * @var array Format: array('/node/path' => '<node_id_attribute>', ...)
+     */
+    private $idAttributes = array();
+
+    /**
+     * @param NodePathMatcher $nodePathMatcher
+     * @param array $idAttributes
+     */
+    public function __construct(NodePathMatcher $nodePathMatcher, array $idAttributes)
+    {
+        $this->nodePathMatcher = $nodePathMatcher;
+        $this->idAttributes = $idAttributes;
+    }
+
+    /**
+     * Retrieve name of an identifier attribute for a node
+     *
+     * @param string $nodeXpath
+     * @return string|null
+     */
+    public function getIdAttribute($nodeXpath)
+    {
+        foreach ($this->idAttributes as $pathPattern => $idAttribute) {
+            if ($this->nodePathMatcher->match($pathPattern, $nodeXpath)) {
+                return $idAttribute;
+            }
+        }
+        return null;
+    }
+}
diff --git a/lib/Magento/Config/Dom/NodePathMatcher.php b/lib/Magento/Config/Dom/NodePathMatcher.php
new file mode 100644
index 00000000000..fa7ba25f009
--- /dev/null
+++ b/lib/Magento/Config/Dom/NodePathMatcher.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Config\Dom;
+
+/**
+ * Matching of XPath expressions to path patterns
+ */
+class NodePathMatcher
+{
+    /**
+     * Whether a subject XPath matches to a given path pattern
+     *
+     * @param string $pathPattern Example: '/some/static/path' or '/some/regexp/path(/item)+'
+     * @param string $xpathSubject Example: '/some[@attr="value"]/static/ns:path'
+     * @return bool
+     */
+    public function match($pathPattern, $xpathSubject)
+    {
+        $pathSubject = $this->simplifyXpath($xpathSubject);
+        $pathPattern = '#^' . $pathPattern . '$#';
+        return (bool)preg_match($pathPattern, $pathSubject);
+    }
+
+    /**
+     * Strip off predicates and namespaces from the XPath
+     *
+     * @param string $xpath
+     * @return string
+     */
+    protected function simplifyXpath($xpath)
+    {
+        $result = $xpath;
+        $result = preg_replace('/\[@[^\]]+?\]/', '', $result);
+        $result = preg_replace('/\/[^:]+?\:/', '/', $result);
+        return $result;
+    }
+}
diff --git a/lib/Magento/Config/DomFactory.php b/lib/Magento/Config/DomFactory.php
index 38470494a53..fcf78daba1f 100644
--- a/lib/Magento/Config/DomFactory.php
+++ b/lib/Magento/Config/DomFactory.php
@@ -25,22 +25,26 @@
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
+namespace Magento\Config;
+
 /**
  * Magento configuration DOM factory
  */
-namespace Magento\Config;
-
 class DomFactory
 {
 
     const CLASS_NAME = 'Magento\Config\Dom';
 
     /**
+     * Object manager
+     *
      * @var \Magento\ObjectManager
      */
     protected $_objectManager;
 
     /**
+     * Constructor
+     *
      * @param \Magento\ObjectManager $objectManger
      */
     public function __construct(\Magento\ObjectManager $objectManger)
diff --git a/lib/Magento/Config/FileIterator.php b/lib/Magento/Config/FileIterator.php
index 3a9f2415258..df0f99737fc 100644
--- a/lib/Magento/Config/FileIterator.php
+++ b/lib/Magento/Config/FileIterator.php
@@ -30,26 +30,36 @@ namespace Magento\Config;
 class FileIterator implements \Iterator, \Countable
 {
     /**
+     * Cache
+     *
      * @var array
      */
     protected $cached = array();
 
     /**
+     * Paths
+     *
      * @var array
      */
     protected $paths = array();
 
     /**
+     * Position
+     *
      * @var int
      */
     protected $position;
 
     /**
+     * Read directory
+     *
      * @var \Magento\Filesystem\Directory\ReadInterface
      */
     protected $directoryRead;
 
     /**
+     * Constructor
+     *
      * @param \Magento\Filesystem\Directory\ReadInterface $directory
      * @param array $paths
      */
@@ -63,7 +73,9 @@ class FileIterator implements \Iterator, \Countable
     }
 
     /**
+     *Rewind
      *
+     * @return void
      */
     function rewind()
     {
@@ -71,6 +83,8 @@ class FileIterator implements \Iterator, \Countable
     }
 
     /**
+     * Current
+     *
      * @return string
      */
     function current()
@@ -83,6 +97,8 @@ class FileIterator implements \Iterator, \Countable
     }
 
     /**
+     * Key
+     *
      * @return mixed
      */
     function key()
@@ -91,7 +107,9 @@ class FileIterator implements \Iterator, \Countable
     }
 
     /**
+     * Next
      *
+     * @return void
      */
     function next()
     {
@@ -99,6 +117,8 @@ class FileIterator implements \Iterator, \Countable
     }
 
     /**
+     * Valid
+     *
      * @return bool
      */
     function valid()
@@ -107,6 +127,8 @@ class FileIterator implements \Iterator, \Countable
     }
 
     /**
+     * Convert to an array
+     *
      * @return array
      */
     public function toArray()
@@ -119,6 +141,8 @@ class FileIterator implements \Iterator, \Countable
     }
 
     /**
+     * Count
+     *
      * @return int
      */
     public function count()
diff --git a/lib/Magento/Config/Reader/Filesystem.php b/lib/Magento/Config/Reader/Filesystem.php
index bcf3da125e8..39e1c3e8076 100644
--- a/lib/Magento/Config/Reader/Filesystem.php
+++ b/lib/Magento/Config/Reader/Filesystem.php
@@ -88,6 +88,8 @@ class Filesystem implements \Magento\Config\ReaderInterface
     protected $_isValidated;
 
     /**
+     * Constructor
+     *
      * @param \Magento\Config\FileResolverInterface $fileResolver
      * @param \Magento\Config\ConverterInterface $converter
      * @param \Magento\Config\SchemaLocatorInterface $schemaLocator
@@ -150,15 +152,14 @@ class Filesystem implements \Magento\Config\ReaderInterface
      */
     protected function _readFiles($fileList)
     {
-        /** @var \Magento\Config\Dom $domDocument */
-        $domDocument = null;
+        /** @var \Magento\Config\Dom $configMerger */
+        $configMerger = null;
         foreach ($fileList as $key => $content) {
             try {
-                if (is_null($domDocument)) {
-                    $class = $this->_domDocumentClass;
-                    $domDocument = new $class($content, $this->_idAttributes, $this->_perFileSchema);
+                if (!$configMerger) {
+                    $configMerger = $this->_createConfigMerger($this->_domDocumentClass, $content);
                 } else {
-                    $domDocument->merge($content);
+                    $configMerger->merge($content);
                 }
             } catch (\Magento\Config\Dom\ValidationException $e) {
                 throw new \Magento\Exception("Invalid XML in file " . $key . ":\n" . $e->getMessage());
@@ -166,16 +167,35 @@ class Filesystem implements \Magento\Config\ReaderInterface
         }
         if ($this->_isValidated) {
             $errors = array();
-            if ($domDocument && !$domDocument->validate($this->_schemaFile, $errors)) {
+            if ($configMerger && !$configMerger->validate($this->_schemaFile, $errors)) {
                 $message = "Invalid Document \n";
                 throw new \Magento\Exception($message . implode("\n", $errors));
             }
         }
 
         $output = array();
-        if ($domDocument) {
-            $output = $this->_converter->convert($domDocument->getDom());
+        if ($configMerger) {
+            $output = $this->_converter->convert($configMerger->getDom());
         }
         return $output;
     }
+
+    /**
+     * Return newly created instance of a config merger
+     *
+     * @param string $mergerClass
+     * @param string $initialContents
+     * @return \Magento\Config\Dom
+     * @throws \UnexpectedValueException
+     */
+    protected function _createConfigMerger($mergerClass, $initialContents)
+    {
+        $result = new $mergerClass($initialContents, $this->_idAttributes, null, $this->_perFileSchema);
+        if (!($result instanceof \Magento\Config\Dom)) {
+            throw new \UnexpectedValueException(
+                "Instance of the DOM config merger is expected, got $mergerClass instead."
+            );
+        }
+        return $result;
+    }
 }
diff --git a/lib/Magento/Config/Scope.php b/lib/Magento/Config/Scope.php
index d51fe8f567b..1c5610f3f68 100644
--- a/lib/Magento/Config/Scope.php
+++ b/lib/Magento/Config/Scope.php
@@ -47,6 +47,8 @@ class Scope implements \Magento\Config\ScopeInterface, \Magento\Config\ScopeList
     protected $_areaList;
 
     /**
+     * Constructor
+     *
      * @param \Magento\App\AreaList $areaList
      * @param string $defaultScope
      */
@@ -70,6 +72,7 @@ class Scope implements \Magento\Config\ScopeInterface, \Magento\Config\ScopeList
      * Set current configuration scope
      *
      * @param string $scope
+     * @return void
      */
     public function setCurrentScope($scope)
     {
@@ -79,7 +82,7 @@ class Scope implements \Magento\Config\ScopeInterface, \Magento\Config\ScopeList
     /**
      * Retrieve list of available config scopes
      *
-     * @return array
+     * @return string[]
      */
     public function getAllScopes()
     {
diff --git a/lib/Magento/Config/ScopeInterface.php b/lib/Magento/Config/ScopeInterface.php
index d812e3c5a50..57076ba9797 100644
--- a/lib/Magento/Config/ScopeInterface.php
+++ b/lib/Magento/Config/ScopeInterface.php
@@ -36,6 +36,7 @@ interface ScopeInterface
      * Set current configuration scope
      *
      * @param string $scope
+     * @return void
      */
     public function setCurrentScope($scope);
 }
diff --git a/lib/Magento/Config/ScopeListInterface.php b/lib/Magento/Config/ScopeListInterface.php
index 10c34a9af5c..1d32f514fca 100644
--- a/lib/Magento/Config/ScopeListInterface.php
+++ b/lib/Magento/Config/ScopeListInterface.php
@@ -29,7 +29,7 @@ interface ScopeListInterface
     /**
      * Retrieve list of all scopes
      *
-     * @return array
+     * @return string[]
      */
     public function getAllScopes();
 }
diff --git a/lib/Magento/Config/Theme.php b/lib/Magento/Config/Theme.php
index 9b8db0a67cc..e4b3aec56ef 100644
--- a/lib/Magento/Config/Theme.php
+++ b/lib/Magento/Config/Theme.php
@@ -45,6 +45,8 @@ class Theme
     protected $_data;
 
     /**
+     * Constructor
+     *
      * @param string $configContent
      */
     public function __construct($configContent)
diff --git a/lib/Magento/DB/Adapter/AdapterInterface.php b/lib/Magento/DB/Adapter/AdapterInterface.php
index 20077c703c3..af6317b2ce3 100644
--- a/lib/Magento/DB/Adapter/AdapterInterface.php
+++ b/lib/Magento/DB/Adapter/AdapterInterface.php
@@ -128,6 +128,34 @@ interface AdapterInterface
      */
     public function dropTable($tableName, $schemaName = null);
 
+    /**
+     * Create temporary table from DDL object
+     *
+     * @param \Magento\DB\Ddl\Table $table
+     * @throws \Zend_Db_Exception
+     * @return \Zend_Db_Statement_Interface
+     */
+    public function createTemporaryTable(\Magento\DB\Ddl\Table $table);
+
+    /**
+     * Drop temporary table from database
+     *
+     * @param string $tableName
+     * @param string $schemaName
+     * @return boolean
+     */
+    public function dropTemporaryTable($tableName, $schemaName = null);
+
+    /**
+     * Rename several tables
+     *
+     * @param array $tablePairs array('oldName' => 'Name1', 'newName' => 'Name2')
+     *
+     * @return boolean
+     * @throws \Zend_Db_Exception
+     */
+    public function renameTablesBatch(array $tablePairs);
+
     /**
      * Truncate a table
      *
@@ -340,7 +368,7 @@ interface AdapterInterface
      * @param string $schemaName
      * @param string $refSchemaName
      * @return \Magento\DB\Adapter\AdapterInterface
-     * 
+     *
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function addForeignKey($fkName, $tableName, $columnName, $refTableName, $refColumnName,
@@ -947,6 +975,17 @@ interface AdapterInterface
      */
     public function insertFromSelect(\Magento\DB\Select $select, $table, array $fields = array(), $mode = false);
 
+    /**
+     * Get insert queries in array for insert by range with step parameter
+     *
+     * @param string $rangeField
+     * @param \Magento\DB\Select $select
+     * @param int $stepCount
+     * @return \Magento\DB\Select[]
+     * @throws \Magento\DB\DBException
+     */
+    public function selectsByRange($rangeField, \Magento\DB\Select $select, $stepCount = 100);
+
     /**
      * Get update table query using select object for join and update
      *
@@ -1040,4 +1079,12 @@ interface AdapterInterface
      * @return mixed
      */
     public function dropTrigger($triggerName, $schemaName = null);
+
+    /**
+     * Retrieve tables list
+     *
+     * @param null|string $likeCondition
+     * @return array
+     */
+    public function getTables($likeCondition = null);
 }
diff --git a/lib/Magento/DB/Adapter/Pdo/Mysql.php b/lib/Magento/DB/Adapter/Pdo/Mysql.php
index b1e63e1e79c..9e89b0b9f07 100644
--- a/lib/Magento/DB/Adapter/Pdo/Mysql.php
+++ b/lib/Magento/DB/Adapter/Pdo/Mysql.php
@@ -2082,6 +2082,65 @@ class Mysql extends \Zend_Db_Adapter_Pdo_Mysql implements AdapterInterface
         return $this->query($sql);
     }
 
+    /**
+     * Create temporary table
+     *
+     * @param \Magento\DB\Ddl\Table $table
+     * @throws \Zend_Db_Exception
+     * @return \Zend_Db_Pdo_Statement
+     */
+    public function createTemporaryTable(\Magento\DB\Ddl\Table $table)
+    {
+        $columns = $table->getColumns();
+        $sqlFragment    = array_merge(
+            $this->_getColumnsDefinition($table),
+            $this->_getIndexesDefinition($table),
+            $this->_getForeignKeysDefinition($table)
+        );
+        $tableOptions   = $this->_getOptionsDefinition($table);
+        $sql = sprintf("CREATE TEMPORARY TABLE %s (\n%s\n) %s",
+            $this->quoteIdentifier($table->getName()),
+            implode(",\n", $sqlFragment),
+            implode(" ", $tableOptions));
+
+        return $this->query($sql);
+    }
+
+    /**
+     * Rename several tables
+     *
+     * @param array $tablePairs array('oldName' => 'Name1', 'newName' => 'Name2')
+     *
+     * @return boolean
+     * @throws \Zend_Db_Exception
+     */
+    public function renameTablesBatch(array $tablePairs)
+    {
+        if (count($tablePairs) == 0) {
+            throw new \Zend_Db_Exception('Please provide tables for rename');
+        }
+
+        $renamesList = array();
+        $tablesList  = array();
+        foreach ($tablePairs as $pair) {
+            $oldTableName  = $pair['oldName'];
+            $newTableName  = $pair['newName'];
+            $renamesList[] = sprintf('%s TO %s', $oldTableName, $newTableName);
+
+            $tablesList[$oldTableName] = $oldTableName;
+            $tablesList[$newTableName] = $newTableName;
+        }
+
+        $query = sprintf('RENAME TABLE %s', implode(',', $renamesList));
+        $this->query($query);
+
+        foreach ($tablesList as $table) {
+            $this->resetDdlCache($table);
+        }
+
+        return true;
+    }
+
     /**
      * Retrieve columns and primary keys definition array for create table
      *
@@ -2396,6 +2455,22 @@ class Mysql extends \Zend_Db_Adapter_Pdo_Mysql implements AdapterInterface
         return true;
     }
 
+    /**
+     * Drop temporary table from database
+     *
+     * @param string $tableName
+     * @param string $schemaName
+     * @return boolean
+     */
+    public function dropTemporaryTable($tableName, $schemaName = null)
+    {
+        $table = $this->quoteIdentifier($this->_getTableName($tableName, $schemaName));
+        $query = 'DROP TEMPORARY TABLE IF EXISTS ' . $table;
+        $this->query($query);
+
+        return true;
+    }
+
     /**
      * Truncate a table
      *
@@ -3317,6 +3392,61 @@ class Mysql extends \Zend_Db_Adapter_Pdo_Mysql implements AdapterInterface
         return $query;
     }
 
+    /**
+     * Get insert queries in array for insert by range with step parameter
+     *
+     * @param string $rangeField
+     * @param \Magento\DB\Select $select
+     * @param int $stepCount
+     * @return \Magento\DB\Select[]
+     * @throws \Magento\DB\DBException
+     */
+    public function selectsByRange($rangeField, \Magento\DB\Select $select, $stepCount = 100)
+    {
+        $fromSelect = $select->getPart(\Magento\DB\Select::FROM);
+        if (empty($fromSelect)) {
+            throw new \Magento\DB\DBException('Select object must have correct "FROM" part');
+        }
+
+        $tableName = array();
+        $correlationName = '';
+        foreach ($fromSelect as $correlationName => $formPart) {
+            if ($formPart['joinType'] == \Magento\DB\Select::FROM) {
+                $tableName = $formPart['tableName'];
+                break;
+            }
+        }
+
+        $selectRange = $this->select()
+            ->from(
+                $tableName,
+                [
+                    new \Zend_Db_Expr('MIN(' . $this->quoteIdentifier($rangeField) . ') AS min'),
+                    new \Zend_Db_Expr('MAX(' . $this->quoteIdentifier($rangeField) . ') AS max'),
+                ]
+            );
+
+        $rangeResult = $this->fetchRow($selectRange);
+        $min = $rangeResult['min'];
+        $max = $rangeResult['max'];
+
+        $queries = [];
+        while ($min <= $max) {
+            $partialSelect = clone $select;
+            $partialSelect->where(
+                    $this->quoteIdentifier($correlationName) . '.'
+                        . $this->quoteIdentifier($rangeField) . ' >= ?', $min
+                )
+                ->where(
+                    $this->quoteIdentifier($correlationName) . '.'
+                        . $this->quoteIdentifier($rangeField) . ' < ?', $min + $stepCount
+                );
+            $queries[] = $partialSelect;
+            $min += $stepCount;
+        }
+        return $queries;
+    }
+
     /**
      * Get update table query using select object for join and update
      *
@@ -3700,4 +3830,23 @@ class Mysql extends \Zend_Db_Adapter_Pdo_Mysql implements AdapterInterface
             trigger_error('Some transactions have not been committed or rolled back', E_USER_ERROR);
         }
     }
+
+    /**
+     * Retrieve tables list
+     *
+     * @param null|string $likeCondition
+     * @return array
+     */
+    public function getTables($likeCondition = null)
+    {
+        $sql = is_null($likeCondition) ? 'SHOW TABLES' : sprintf("SHOW TABLES LIKE '%s'", $likeCondition);
+        $result = $this->query($sql);
+        $tables = [];
+        while ($row = $result->fetchColumn()) {
+            $tables[] = $row;
+        }
+        return $tables;
+    }
+
+
 }
diff --git a/app/code/Magento/Core/Model/Layout/Argument/Handler/Boolean.php b/lib/Magento/Data/Argument/Interpreter/ArrayType.php
similarity index 52%
rename from app/code/Magento/Core/Model/Layout/Argument/Handler/Boolean.php
rename to lib/Magento/Data/Argument/Interpreter/ArrayType.php
index e913ca8b8d7..0447e97b4cc 100644
--- a/app/code/Magento/Core/Model/Layout/Argument/Handler/Boolean.php
+++ b/lib/Magento/Data/Argument/Interpreter/ArrayType.php
@@ -18,46 +18,49 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Core
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-namespace Magento\Core\Model\Layout\Argument\Handler;
+
+namespace Magento\Data\Argument\Interpreter;
+
+use Magento\Data\Argument\InterpreterInterface;
 
 /**
- * Layout argument. Type boolean.
- *
- * @category    Magento
- * @package     Magento_Core
- * @author      Magento Core Team <core@magentocommerce.com>
+ * Interpreter of array data type that supports arrays of unlimited depth
  */
-
-class Boolean extends \Magento\Core\Model\Layout\Argument\AbstractHandler
+class ArrayType implements InterpreterInterface
 {
     /**
-     * Process argument value
+     * Interpreter of individual array item
      *
-     * @param array $argument
-     * @return mixed
-     * @throws \InvalidArgumentException
+     * @var InterpreterInterface
      */
-    public function process(array $argument)
+    private $itemInterpreter;
+
+    /**
+     * @param InterpreterInterface $itemInterpreter
+     */
+    public function __construct(InterpreterInterface $itemInterpreter)
     {
-        $this->_validate($argument);
-        return filter_var($argument['value'], FILTER_VALIDATE_BOOLEAN);
+        $this->itemInterpreter = $itemInterpreter;
     }
 
     /**
-     * @param array $argument
-     * @return void
+     * {@inheritdoc}
+     * @return array
      * @throws \InvalidArgumentException
      */
-    protected function _validate(array $argument)
+    public function evaluate(array $data)
     {
-        parent::_validate($argument);
-        if (!in_array($argument['value'], array('true', 'false'))) {
-            throw new \InvalidArgumentException('Value is not boolean argument. ' . $this->_getArgumentInfo($argument));
+        if (!isset($data['item']) || !is_array($data['item'])) {
+            throw new \InvalidArgumentException('Array items are expected.');
+        }
+        $result = array();
+        $items = $data['item'];
+        foreach ($items as $itemKey => $itemData) {
+            $result[$itemKey] = $this->itemInterpreter->evaluate($itemData);
         }
+        return $result;
     }
 }
diff --git a/lib/Magento/Data/Argument/Interpreter/Boolean.php b/lib/Magento/Data/Argument/Interpreter/Boolean.php
new file mode 100644
index 00000000000..f6bc318d310
--- /dev/null
+++ b/lib/Magento/Data/Argument/Interpreter/Boolean.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Data\Argument\Interpreter;
+
+use Magento\Data\Argument\InterpreterInterface;
+use Magento\Stdlib\BooleanUtils;
+
+/**
+ * Interpreter of boolean data type, such as boolean itself or boolean string
+ */
+class Boolean implements InterpreterInterface
+{
+    /**
+     * @var BooleanUtils
+     */
+    private $booleanUtils;
+
+    /**
+     * @param BooleanUtils $booleanUtils
+     */
+    public function __construct(BooleanUtils $booleanUtils)
+    {
+        $this->booleanUtils = $booleanUtils;
+    }
+
+    /**
+     * {@inheritdoc}
+     * @return bool
+     * @throws \InvalidArgumentException
+     */
+    public function evaluate(array $data)
+    {
+        if (!isset($data['value'])) {
+            throw new \InvalidArgumentException('Boolean value is missing.');
+        }
+        $value = $data['value'];
+        return $this->booleanUtils->toBoolean($value);
+    }
+}
diff --git a/lib/Magento/Data/Argument/Interpreter/Composite.php b/lib/Magento/Data/Argument/Interpreter/Composite.php
new file mode 100644
index 00000000000..abe712e62d0
--- /dev/null
+++ b/lib/Magento/Data/Argument/Interpreter/Composite.php
@@ -0,0 +1,111 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Data\Argument\Interpreter;
+
+use Magento\ObjectManager;
+use Magento\Data\Argument\InterpreterInterface;
+
+/**
+ * Interpreter that aggregates named interpreters and delegates every evaluation to one of them
+ */
+class Composite implements InterpreterInterface
+{
+    /**
+     * @var InterpreterInterface[] Format: array('<name>' => <instance>, ...)
+     */
+    private $interpreters;
+
+    /**
+     * Data key that holds name of an interpreter to be used for that data
+     *
+     * @var string
+     */
+    private $discriminator;
+
+    /**
+     * @param InterpreterInterface[] $interpreters
+     * @param $discriminator
+     * @throws \InvalidArgumentException
+     */
+    public function __construct(array $interpreters, $discriminator)
+    {
+        foreach ($interpreters as $interpreterName => $interpreterInstance) {
+            if (!($interpreterInstance instanceof InterpreterInterface)) {
+                throw new \InvalidArgumentException(
+                    "Interpreter named '$interpreterName' is expected to be an argument interpreter instance."
+                );
+            }
+        }
+        $this->interpreters = $interpreters;
+        $this->discriminator = $discriminator;
+    }
+
+    /**
+     * {@inheritdoc}
+     * @throws \InvalidArgumentException
+     */
+    public function evaluate(array $data)
+    {
+        if (!isset($data[$this->discriminator])) {
+            throw new \InvalidArgumentException(sprintf(
+                'Value for key "%s" is missing in the argument data.', $this->discriminator
+            ));
+        }
+        $interpreterName = $data[$this->discriminator];
+        unset($data[$this->discriminator]);
+        $interpreter = $this->getInterpreter($interpreterName);
+        return $interpreter->evaluate($data);
+    }
+
+    /**
+     * Register interpreter instance under a given unique name
+     *
+     * @param string $name
+     * @param InterpreterInterface $instance
+     * @throws \InvalidArgumentException
+     */
+    public function addInterpreter($name, InterpreterInterface $instance)
+    {
+        if (isset($this->interpreters[$name])) {
+            throw new \InvalidArgumentException("Argument interpreter named '$name' has already been defined.");
+        }
+        $this->interpreters[$name] = $instance;
+    }
+
+    /**
+     * Retrieve interpreter instance by its unique name
+     *
+     * @param string $name
+     * @return InterpreterInterface
+     * @throws \InvalidArgumentException
+     */
+    protected function getInterpreter($name)
+    {
+        if (!isset($this->interpreters[$name])) {
+            throw new \InvalidArgumentException("Argument interpreter named '$name' has not been defined.");
+        }
+        return $this->interpreters[$name];
+    }
+}
diff --git a/lib/Magento/Data/Argument/Interpreter/Constant.php b/lib/Magento/Data/Argument/Interpreter/Constant.php
new file mode 100644
index 00000000000..469cddce56f
--- /dev/null
+++ b/lib/Magento/Data/Argument/Interpreter/Constant.php
@@ -0,0 +1,47 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Data\Argument\Interpreter;
+
+use Magento\Data\Argument\InterpreterInterface;
+
+/**
+ * Interpreter that returns value of a constant by its name
+ */
+class Constant implements InterpreterInterface
+{
+    /**
+     * {@inheritdoc}
+     * @return mixed
+     * @throws \InvalidArgumentException
+     */
+    public function evaluate(array $data)
+    {
+        if (!isset($data['value']) || !defined($data['value'])) {
+            throw new \InvalidArgumentException('Constant name is expected.');
+        }
+        $constantName = $data['value'];
+        return constant($constantName);
+    }
+}
diff --git a/lib/Magento/Data/Argument/Interpreter/NullType.php b/lib/Magento/Data/Argument/Interpreter/NullType.php
new file mode 100644
index 00000000000..7c98269bb25
--- /dev/null
+++ b/lib/Magento/Data/Argument/Interpreter/NullType.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Data\Argument\Interpreter;
+
+use Magento\Data\Argument\InterpreterInterface;
+
+/**
+ * Interpreter of NULL data type
+ */
+class NullType implements InterpreterInterface
+{
+    /**
+     * {@inheritdoc}
+     * @return null
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+     */
+    public function evaluate(array $data)
+    {
+        return null;
+    }
+}
diff --git a/lib/Magento/Data/Argument/Interpreter/Number.php b/lib/Magento/Data/Argument/Interpreter/Number.php
new file mode 100644
index 00000000000..bf6147f04fa
--- /dev/null
+++ b/lib/Magento/Data/Argument/Interpreter/Number.php
@@ -0,0 +1,47 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Data\Argument\Interpreter;
+
+use Magento\Data\Argument\InterpreterInterface;
+
+/**
+ * Interpreter of numeric data, such as integer, float, or numeric string
+ */
+class Number implements InterpreterInterface
+{
+    /**
+     * {@inheritdoc}
+     * @return string|int|float
+     * @throws \InvalidArgumentException
+     */
+    public function evaluate(array $data)
+    {
+        if (!isset($data['value']) || !is_numeric($data['value'])) {
+            throw new \InvalidArgumentException('Numeric value is expected.');
+        }
+        $result = $data['value'];
+        return $result;
+    }
+}
diff --git a/lib/Magento/Data/Argument/Interpreter/String.php b/lib/Magento/Data/Argument/Interpreter/String.php
new file mode 100644
index 00000000000..22632d0ec30
--- /dev/null
+++ b/lib/Magento/Data/Argument/Interpreter/String.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Data\Argument\Interpreter;
+
+use Magento\Data\Argument\InterpreterInterface;
+use Magento\Stdlib\BooleanUtils;
+
+/**
+ * Interpreter of string data type that may optionally perform text translation
+ */
+class String implements InterpreterInterface
+{
+    /**
+     * @var BooleanUtils
+     */
+    private $booleanUtils;
+
+    /**
+     * @param BooleanUtils $booleanUtils
+     */
+    public function __construct(BooleanUtils $booleanUtils)
+    {
+        $this->booleanUtils = $booleanUtils;
+    }
+
+    /**
+     * {@inheritdoc}
+     * @return string
+     * @throws \InvalidArgumentException
+     */
+    public function evaluate(array $data)
+    {
+        if (isset($data['value'])) {
+            $result = $data['value'];
+            if (!is_string($result)) {
+                throw new \InvalidArgumentException('String value is expected.');
+            }
+            $needTranslation = isset($data['translate']) ? $this->booleanUtils->toBoolean($data['translate']) : false;
+            if ($needTranslation) {
+                $result = __($result);
+            }
+        } else {
+            $result = '';
+        }
+        return $result;
+    }
+}
diff --git a/lib/Magento/View/Layout/Argument/HandlerInterface.php b/lib/Magento/Data/Argument/InterpreterInterface.php
similarity index 68%
rename from lib/Magento/View/Layout/Argument/HandlerInterface.php
rename to lib/Magento/Data/Argument/InterpreterInterface.php
index 343f3b7a3fa..0b03ac52cf4 100644
--- a/lib/Magento/View/Layout/Argument/HandlerInterface.php
+++ b/lib/Magento/Data/Argument/InterpreterInterface.php
@@ -22,29 +22,21 @@
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
+namespace Magento\Data\Argument;
+
 /**
- * Layout object argument interface
- *
- * @author      Magento Core Team <core@magentocommerce.com>
+ * Interface that encapsulates complexity of expression computation
  */
-namespace Magento\View\Layout\Argument;
-
-interface HandlerInterface
+interface InterpreterInterface
 {
     /**
-     * Parse specified argument node
-     *
-     * @param \Magento\View\Layout\Element $argument
-     * @return array
-     */
-    public function parse(\Magento\View\Layout\Element $argument);
-
-    /**
-     * Process argument value
+     * Compute and return effective value of an argument
      *
-     * @param array $argument
+     * @param array $data
      * @return mixed
      * @throws \InvalidArgumentException
+     * @throws \UnexpectedValueException
+     * @throws MissingOptionalValueException
      */
-    public function process(array $argument);
+    public function evaluate(array $data);
 }
diff --git a/lib/Magento/Data/Argument/MissingOptionalValueException.php b/lib/Magento/Data/Argument/MissingOptionalValueException.php
new file mode 100644
index 00000000000..7365abe6b3c
--- /dev/null
+++ b/lib/Magento/Data/Argument/MissingOptionalValueException.php
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Data\Argument;
+
+/**
+ * Recoverable situation of a missing argument value, presence of which is optional according to the business logic.
+ * Possible resolution is to use a default argument value, if there is one.
+ */
+class MissingOptionalValueException extends \RuntimeException
+{
+}
diff --git a/lib/Magento/Data/Collection.php b/lib/Magento/Data/Collection.php
index a4d58e3b0f5..410ef95f9f9 100644
--- a/lib/Magento/Data/Collection.php
+++ b/lib/Magento/Data/Collection.php
@@ -150,6 +150,49 @@ class Collection implements \IteratorAggregate, \Countable, \Magento\Core\Model\
         return $this;
     }
 
+    /**
+     * Add field filter to collection
+     *
+     * If $condition integer or string - exact value will be filtered ('eq' condition)
+     *
+     * If $condition is array - one of the following structures is expected:
+     * <pre>
+     * - ["from" => $fromValue, "to" => $toValue]
+     * - ["eq" => $equalValue]
+     * - ["neq" => $notEqualValue]
+     * - ["like" => $likeValue]
+     * - ["in" => [$inValues]]
+     * - ["nin" => [$notInValues]]
+     * - ["notnull" => $valueIsNotNull]
+     * - ["null" => $valueIsNull]
+     * - ["moreq" => $moreOrEqualValue]
+     * - ["gt" => $greaterValue]
+     * - ["lt" => $lessValue]
+     * - ["gteq" => $greaterOrEqualValue]
+     * - ["lteq" => $lessOrEqualValue]
+     * - ["finset" => $valueInSet]
+     * </pre>
+     *
+     * If non matched - sequential parallel arrays are expected and OR conditions
+     * will be built using above mentioned structure.
+     *
+     * Example:
+     * <pre>
+     * $field = ['age', 'name'];
+     * $condition = [42, ['like' => 'Mage']];
+     * </pre>
+     * The above would find where age equal to 42 OR name like %Mage%.
+     *
+     * @param string|array $field
+     * @param string|int|array $condition
+     * @throws \Magento\Exception if some error in the input could be detected.
+     * @return $this
+     */
+    public function addFieldToFilter($field, $condition)
+    {
+        throw new \Magento\Exception('Not implemented');
+    }
+
     /**
      * Search for a filter by specified field
      *
diff --git a/lib/Magento/Data/OptionSourceInterface.php b/lib/Magento/Data/OptionSourceInterface.php
new file mode 100644
index 00000000000..cea843eb7cb
--- /dev/null
+++ b/lib/Magento/Data/OptionSourceInterface.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Data;
+
+/**
+ * Source of option values in a form of value-label pairs
+ */
+interface OptionSourceInterface
+{
+    /**
+     * Return array of options as value-label pairs
+     *
+     * @return array Format: array(array('value' => '<value>', 'label' => '<label>'), ...)
+     */
+    public function toOptionArray();
+}
diff --git a/lib/Magento/Data/etc/argument/types.xsd b/lib/Magento/Data/etc/argument/types.xsd
new file mode 100644
index 00000000000..99f8f702684
--- /dev/null
+++ b/lib/Magento/Data/etc/argument/types.xsd
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Academic Free License (AFL 3.0)
+ * that is bundled with this package in the file LICENSE_AFL.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/afl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Core
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
+ */
+-->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+    <xs:complexType name="argumentType" abstract="true" mixed="true">
+        <xs:attribute name="name" use="required"/>
+    </xs:complexType>
+
+    <xs:complexType name="array" mixed="true">
+        <xs:complexContent>
+            <xs:extension base="argumentType">
+                <xs:sequence>
+                    <xs:element name="item" type="argumentType" minOccurs="1" maxOccurs="unbounded">
+                        <xs:key name="itemName">
+                            <xs:selector xpath="item"></xs:selector>
+                            <xs:field xpath="@name"></xs:field>
+                        </xs:key>
+                    </xs:element>
+                </xs:sequence>
+            </xs:extension>
+        </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="string">
+        <xs:complexContent>
+            <xs:extension base="argumentType">
+                <xs:attribute name="translate" use="optional" type="xs:boolean"/>
+            </xs:extension>
+        </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="boolean">
+        <xs:complexContent>
+            <xs:extension base="argumentType"/>
+        </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="object">
+        <xs:complexContent>
+            <xs:extension base="argumentType"/>
+        </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="number">
+        <xs:complexContent>
+            <xs:extension base="argumentType"/>
+        </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="null">
+        <xs:complexContent>
+            <xs:restriction base="argumentType"/>
+        </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="argumentsType">
+        <xs:sequence>
+            <xs:element name="argument" type="argumentType" minOccurs="1" maxOccurs="unbounded">
+                <xs:key name="argumentItemName">
+                    <xs:selector xpath="item"></xs:selector>
+                    <xs:field xpath="@name"></xs:field>
+                </xs:key>
+            </xs:element>
+        </xs:sequence>
+    </xs:complexType>
+
+</xs:schema>
diff --git a/lib/Magento/HTTP/PhpEnvironment/RemoteAddress.php b/lib/Magento/HTTP/PhpEnvironment/RemoteAddress.php
index a2022d27c62..bbbd203b139 100644
--- a/lib/Magento/HTTP/PhpEnvironment/RemoteAddress.php
+++ b/lib/Magento/HTTP/PhpEnvironment/RemoteAddress.php
@@ -53,21 +53,12 @@ class RemoteAddress
     /**
      * @param \Magento\App\RequestInterface $httpRequest
      * @param array $alternativeHeaders
-     * @throws \InvalidArgumentException
      */
     public function __construct(
         \Magento\App\RequestInterface $httpRequest,
-        $alternativeHeaders = array()
+        array $alternativeHeaders = array()
     ) {
         $this->request = $httpRequest;
-
-        if (!is_array($alternativeHeaders)) {
-            throw new \InvalidArgumentException(sprintf(
-                'Invalid value of type "%s" given while array is expected as alternative headers',
-                gettype($alternativeHeaders)
-            ));
-        }
-
         $this->alternativeHeaders = $alternativeHeaders;
     }
 
diff --git a/lib/Magento/Interception/FactoryDecorator.php b/lib/Magento/Interception/FactoryDecorator.php
index 5b1a7cd5e63..5c3b9a8b97b 100644
--- a/lib/Magento/Interception/FactoryDecorator.php
+++ b/lib/Magento/Interception/FactoryDecorator.php
@@ -78,29 +78,6 @@ class FactoryDecorator implements Factory
         $this->_config = $config;
     }
 
-    /**
-     * Set object manager
-     *
-     * @param ObjectManager $objectManager
-     * @return void
-     */
-    public function setObjectManager(ObjectManager $objectManager)
-    {
-        $this->_objectManager = $objectManager;
-        $this->_factory->setObjectManager($objectManager);
-    }
-
-    /**
-     * Set application arguments
-     *
-     * @param array $arguments
-     * @return void
-     */
-    public function setArguments($arguments)
-    {
-        $this->_factory->setArguments($arguments);
-    }
-
     /**
      * Create instance of requested type with requested arguments
      *
diff --git a/lib/Magento/Mview/View.php b/lib/Magento/Mview/View.php
index c4aa6223063..badbf9362bb 100644
--- a/lib/Magento/Mview/View.php
+++ b/lib/Magento/Mview/View.php
@@ -56,11 +56,6 @@ class View extends \Magento\Object implements ViewInterface
      */
     protected $state;
 
-    /**
-     * @var \Magento\App\Resource
-     */
-    protected $resource;
-
     /**
      * @param ConfigInterface $config
      * @param ActionFactory $actionFactory
@@ -75,7 +70,6 @@ class View extends \Magento\Object implements ViewInterface
         View\StateInterface $state,
         View\ChangelogInterface $changelog,
         View\SubscriptionFactory $subscriptionFactory,
-        \Magento\App\Resource $resource,
         array $data = array()
     ) {
         $this->config = $config;
@@ -83,7 +77,6 @@ class View extends \Magento\Object implements ViewInterface
         $this->state = $state;
         $this->changelog = $changelog;
         $this->subscriptionFactory = $subscriptionFactory;
-        $this->resource = $resource;
         parent::__construct($data);
     }
 
@@ -155,7 +148,7 @@ class View extends \Magento\Object implements ViewInterface
                     /** @var \Magento\Mview\View\SubscriptionInterface $subscription */
                     $subscription = $this->subscriptionFactory->create(array(
                         'view' => $this,
-                        'tableName' => $this->resource->getTableName($subscription['name']),
+                        'tableName' => $subscription['name'],
                         'columnName' => $subscription['column'],
                     ));
                     $subscription->create();
@@ -188,7 +181,7 @@ class View extends \Magento\Object implements ViewInterface
                     /** @var \Magento\Mview\View\SubscriptionInterface $subscription */
                     $subscription = $this->subscriptionFactory->create(array(
                         'view' => $this,
-                        'tableName' => $this->resource->getTableName($subscription['name']),
+                        'tableName' => $subscription['name'],
                         'columnName' => $subscription['column'],
                     ));
                     $subscription->remove();
@@ -257,10 +250,12 @@ class View extends \Magento\Object implements ViewInterface
      */
     public function suspend()
     {
-        $this->getState()
-            ->setVersionId($this->getChangelog()->getVersion())
-            ->setStatus(View\StateInterface::STATUS_SUSPENDED)
-            ->save();
+        if ($this->getState()->getMode() == View\StateInterface::MODE_ENABLED) {
+            $state = $this->getState();
+            $state->setVersionId($this->getChangelog()->getVersion());
+            $state->setStatus(View\StateInterface::STATUS_SUSPENDED);
+            $state->save();
+        }
     }
 
     /**
@@ -268,8 +263,10 @@ class View extends \Magento\Object implements ViewInterface
      */
     public function resume()
     {
-        if ($this->getState()->getStatus() == View\StateInterface::STATUS_SUSPENDED) {
-            $this->getState()->setStatus(View\StateInterface::STATUS_IDLE)->save();
+        $state = $this->getState();
+        if ($state->getStatus() == View\StateInterface::STATUS_SUSPENDED) {
+            $state->setStatus(View\StateInterface::STATUS_IDLE);
+            $state->save();
         }
     }
 
@@ -278,7 +275,9 @@ class View extends \Magento\Object implements ViewInterface
      */
     public function clearChangelog()
     {
-        $this->getChangelog()->clear($this->getState()->getVersionId());
+        if ($this->getState()->getMode() == View\StateInterface::MODE_ENABLED) {
+            $this->getChangelog()->clear($this->getState()->getVersionId());
+        }
     }
 
     /**
diff --git a/lib/Magento/Mview/View/AbstractFactory.php b/lib/Magento/Mview/View/AbstractFactory.php
new file mode 100644
index 00000000000..71e9cb16863
--- /dev/null
+++ b/lib/Magento/Mview/View/AbstractFactory.php
@@ -0,0 +1,58 @@
+<?php
+
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Mview\View;
+
+abstract class AbstractFactory
+{
+    /**
+     * @var \Magento\ObjectManager
+     */
+    protected $objectManager;
+
+    /**
+     * Instance name
+     */
+    const INSTANCE_NAME = '';
+
+    /**
+     * @param \Magento\ObjectManager $objectManager
+     */
+    public function __construct(\Magento\ObjectManager $objectManager)
+    {
+        $this->objectManager = $objectManager;
+    }
+
+    /**
+     * Create class instance with specified parameters
+     *
+     * @param array $data
+     * @return CollectionInterface
+     */
+    public function create(array $data = array())
+    {
+        return $this->objectManager->create(static::INSTANCE_NAME, $data);
+    }
+}
diff --git a/lib/Magento/Mview/View/Changelog.php b/lib/Magento/Mview/View/Changelog.php
index 91f964b66fb..86b54d7543e 100644
--- a/lib/Magento/Mview/View/Changelog.php
+++ b/lib/Magento/Mview/View/Changelog.php
@@ -175,11 +175,12 @@ class Changelog implements ChangelogInterface
         if (!$this->write->isTableExists($changelogTableName)) {
             throw new \Exception("Table {$changelogTableName} does not exist");
         }
-
-        $select = $this->write->select()
-            ->from($changelogTableName, new \Zend_Db_Expr('MAX(`version_id`)'));
-
-        return (int)$this->write->fetchOne($select);
+        $row = $this->write->fetchRow('SHOW TABLE STATUS LIKE ?', array($changelogTableName));
+        if (isset($row['Auto_increment'])) {
+            return (int)$row['Auto_increment'] - 1;
+        } else {
+            throw new \Exception("Table status for `{$changelogTableName}` is incorrect. Can`t fetch version id.");
+        }
     }
 
     /**
@@ -212,10 +213,12 @@ class Changelog implements ChangelogInterface
      * Set view's identifier
      *
      * @param string $viewId
+     * @return Changelog
      */
     public function setViewId($viewId)
     {
         $this->viewId = $viewId;
+        return $this;
     }
 
     /**
diff --git a/lib/Magento/Mview/View/ChangelogInterface.php b/lib/Magento/Mview/View/ChangelogInterface.php
index 11c803e574d..9219664923e 100644
--- a/lib/Magento/Mview/View/ChangelogInterface.php
+++ b/lib/Magento/Mview/View/ChangelogInterface.php
@@ -82,6 +82,7 @@ interface ChangelogInterface
      * Set view's identifier
      *
      * @param string $viewId
+     * @return ChangelogInterface
      */
     public function setViewId($viewId);
 
diff --git a/lib/Magento/Mview/View/CollectionFactory.php b/lib/Magento/Mview/View/CollectionFactory.php
index 1f3c3faed30..5aa5051d010 100644
--- a/lib/Magento/Mview/View/CollectionFactory.php
+++ b/lib/Magento/Mview/View/CollectionFactory.php
@@ -24,29 +24,10 @@
 
 namespace Magento\Mview\View;
 
-class CollectionFactory
+class CollectionFactory extends AbstractFactory
 {
     /**
-     * @var \Magento\ObjectManager
+     * Instance name
      */
-    protected $objectManager;
-
-    /**
-     * @param \Magento\ObjectManager $objectManager
-     */
-    public function __construct(\Magento\ObjectManager $objectManager)
-    {
-        $this->objectManager = $objectManager;
-    }
-
-    /**
-     * Create class instance with specified parameters
-     *
-     * @param array $data
-     * @return CollectionInterface
-     */
-    public function create(array $data = array())
-    {
-        return $this->objectManager->create('Magento\Mview\View\CollectionInterface', $data);
-    }
+    const INSTANCE_NAME = 'Magento\Mview\View\CollectionInterface';
 }
diff --git a/lib/Magento/Mview/View/State/CollectionFactory.php b/lib/Magento/Mview/View/State/CollectionFactory.php
index bf55fc39c98..2414e6d6df6 100644
--- a/lib/Magento/Mview/View/State/CollectionFactory.php
+++ b/lib/Magento/Mview/View/State/CollectionFactory.php
@@ -24,29 +24,10 @@
 
 namespace Magento\Mview\View\State;
 
-class CollectionFactory
+class CollectionFactory extends \Magento\Mview\View\AbstractFactory
 {
     /**
-     * @var \Magento\ObjectManager
+     * Instance name
      */
-    protected $objectManager;
-
-    /**
-     * @param \Magento\ObjectManager $objectManager
-     */
-    public function __construct(\Magento\ObjectManager $objectManager)
-    {
-        $this->objectManager = $objectManager;
-    }
-
-    /**
-     * Create class instance with specified parameters
-     *
-     * @param array $data
-     * @return CollectionInterface
-     */
-    public function create(array $data = array())
-    {
-        return $this->objectManager->create('Magento\Mview\View\State\CollectionInterface', $data);
-    }
+    const INSTANCE_NAME = 'Magento\Mview\View\State\CollectionInterface';
 }
diff --git a/lib/Magento/Mview/View/StateInterface.php b/lib/Magento/Mview/View/StateInterface.php
index cadcfb5d7f5..2e29805d71b 100644
--- a/lib/Magento/Mview/View/StateInterface.php
+++ b/lib/Magento/Mview/View/StateInterface.php
@@ -45,7 +45,7 @@ interface StateInterface
      * Fill object with state data by view ID
      *
      * @param string $viewId
-     * @return \Magento\Mview\View\StateInterface
+     * @return $this
      */
     public function loadByView($viewId);
 
diff --git a/lib/Magento/Mview/View/Subscription.php b/lib/Magento/Mview/View/Subscription.php
index a5bed5f5c49..55fe2228c1c 100644
--- a/lib/Magento/Mview/View/Subscription.php
+++ b/lib/Magento/Mview/View/Subscription.php
@@ -112,7 +112,7 @@ class Subscription implements SubscriptionInterface
     {
         foreach (\Magento\DB\Ddl\Trigger::getListOfEvents() as $event) {
             $triggerName = $this->getTriggerName(
-                $this->getTableName(),
+                $this->resource->getTableName($this->getTableName()),
                 \Magento\DB\Ddl\Trigger::TIME_AFTER,
                 $event
             );
@@ -122,7 +122,7 @@ class Subscription implements SubscriptionInterface
                 ->setName($triggerName)
                 ->setTime(\Magento\DB\Ddl\Trigger::TIME_AFTER)
                 ->setEvent($event)
-                ->setTable($this->getTableName());
+                ->setTable($this->resource->getTableName($this->getTableName()));
 
             $trigger->addStatement(
                 $this->buildStatement($event, $this->getView()->getChangelog())
@@ -152,7 +152,7 @@ class Subscription implements SubscriptionInterface
     {
         foreach (\Magento\DB\Ddl\Trigger::getListOfEvents() as $event) {
             $triggerName = $this->getTriggerName(
-                $this->getTableName(),
+                $this->resource->getTableName($this->getTableName()),
                 \Magento\DB\Ddl\Trigger::TIME_AFTER,
                 $event
             );
@@ -162,7 +162,7 @@ class Subscription implements SubscriptionInterface
                 ->setName($triggerName)
                 ->setTime(\Magento\DB\Ddl\Trigger::TIME_AFTER)
                 ->setEvent($event)
-                ->setTable($this->getTableName());
+                ->setTable($this->resource->getTableName($this->getTableName()));
 
             // Add statements for linked views
             foreach ($this->getLinkedViews() as $view) {
diff --git a/lib/Magento/Mview/View/SubscriptionFactory.php b/lib/Magento/Mview/View/SubscriptionFactory.php
index ac870d93c20..8caa291f4b9 100644
--- a/lib/Magento/Mview/View/SubscriptionFactory.php
+++ b/lib/Magento/Mview/View/SubscriptionFactory.php
@@ -24,29 +24,10 @@
 
 namespace Magento\Mview\View;
 
-class SubscriptionFactory
+class SubscriptionFactory extends AbstractFactory
 {
     /**
-     * @var \Magento\ObjectManager
+     * Instance name
      */
-    protected $objectManager;
-
-    /**
-     * @param \Magento\ObjectManager $objectManager
-     */
-    public function __construct(\Magento\ObjectManager $objectManager)
-    {
-        $this->objectManager = $objectManager;
-    }
-
-    /**
-     * Create class instance with specified parameters
-     *
-     * @param array $data
-     * @return StateInterface
-     */
-    public function create(array $data = array())
-    {
-        return $this->objectManager->create('Magento\Mview\View\SubscriptionInterface', $data);
-    }
+    const INSTANCE_NAME = 'Magento\Mview\View\SubscriptionInterface';
 }
diff --git a/lib/Magento/ObjectManager/Config.php b/lib/Magento/ObjectManager/Config.php
index 8a039f51f1a..58d8df3ed67 100644
--- a/lib/Magento/ObjectManager/Config.php
+++ b/lib/Magento/ObjectManager/Config.php
@@ -47,10 +47,9 @@ interface Config
      * Retrieve list of arguments per type
      *
      * @param string $type
-     * @param array $arguments
      * @return array
      */
-    public function getArguments($type, $arguments);
+    public function getArguments($type);
 
     /**
      * Check whether type is shared
diff --git a/lib/Magento/ObjectManager/Config/Argument/Interpreter/Object.php b/lib/Magento/ObjectManager/Config/Argument/Interpreter/Object.php
new file mode 100644
index 00000000000..f2add8ba385
--- /dev/null
+++ b/lib/Magento/ObjectManager/Config/Argument/Interpreter/Object.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ObjectManager\Config\Argument\Interpreter;
+
+use Magento\ObjectManager\Config;
+use Magento\ObjectManager\Config\Argument\ObjectFactory;
+use Magento\Data\Argument\InterpreterInterface;
+use Magento\Stdlib\BooleanUtils;
+
+/**
+ * Interpreter that creates an instance by a type name taking into account whether it's shared or not
+ */
+class Object implements InterpreterInterface
+{
+    /**
+     * @var BooleanUtils
+     */
+    private $booleanUtils;
+
+    /**
+     * @var ObjectFactory
+     */
+    private $objectFactory;
+
+    /**
+     * @param BooleanUtils $booleanUtils
+     * @param ObjectFactory $objectFactory
+     */
+    public function __construct(BooleanUtils $booleanUtils, ObjectFactory $objectFactory)
+    {
+        $this->booleanUtils = $booleanUtils;
+        $this->objectFactory = $objectFactory;
+    }
+
+    /**
+     * {@inheritdoc}
+     * @return object
+     * @throws \InvalidArgumentException
+     */
+    public function evaluate(array $data)
+    {
+        if (empty($data['value'])) {
+            throw new \InvalidArgumentException('Object class name is missing.');
+        }
+        $className = $data['value'];
+        $isShared = isset($data['shared']) ? $this->booleanUtils->toBoolean($data['shared']) : null;
+        $result = $this->objectFactory->create($className, $isShared);
+        return $result;
+    }
+}
diff --git a/lib/Magento/ObjectManager/Config/Argument/ObjectFactory.php b/lib/Magento/ObjectManager/Config/Argument/ObjectFactory.php
new file mode 100644
index 00000000000..0954a6634ea
--- /dev/null
+++ b/lib/Magento/ObjectManager/Config/Argument/ObjectFactory.php
@@ -0,0 +1,93 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ObjectManager\Config\Argument;
+
+use Magento\ObjectManager;
+use Magento\ObjectManager\Config;
+
+/**
+ * Factory that creates an instance by a type name taking into account whether it's shared or not
+ */
+class ObjectFactory
+{
+    /**
+     * @var Config
+     */
+    private $config;
+
+    /**
+     * @var ObjectManager
+     */
+    private $objectManager;
+
+    /**
+     * @param Config $config
+     * @param ObjectManager $objectManager
+     */
+    public function __construct(Config $config, ObjectManager $objectManager = null)
+    {
+        $this->config = $config;
+        $this->objectManager = $objectManager;
+    }
+
+    /**
+     * Assign object manager instance
+     *
+     * @param ObjectManager $objectManager
+     */
+    public function setObjectManager(ObjectManager $objectManager)
+    {
+        $this->objectManager = $objectManager;
+    }
+
+    /**
+     * Retrieve instance of the object manager
+     *
+     * @return ObjectManager
+     * @throws \LogicException
+     */
+    protected function getObjectManager()
+    {
+        if (!$this->objectManager) {
+            throw new \LogicException('Object manager has not been assigned yet.');
+        }
+        return $this->objectManager;
+    }
+
+    /**
+     * Return new or shared instance of a given type
+     *
+     * @param string $type
+     * @param bool|null $isShared NULL - use the sharing configuration
+     * @return object
+     */
+    public function create($type, $isShared = null)
+    {
+        $objectManager = $this->getObjectManager();
+        $isShared = isset($isShared) ? $isShared : $this->config->isShared($type);
+        $result = $isShared ? $objectManager->get($type) : $objectManager->create($type);
+        return $result;
+    }
+}
diff --git a/lib/Magento/ObjectManager/Config/Config.php b/lib/Magento/ObjectManager/Config/Config.php
index 8b14c5afeba..9d690d1c4df 100644
--- a/lib/Magento/ObjectManager/Config/Config.php
+++ b/lib/Magento/ObjectManager/Config/Config.php
@@ -144,19 +144,13 @@ class Config implements \Magento\ObjectManager\Config
      * Retrieve list of arguments per type
      *
      * @param string $type
-     * @param array $arguments
      * @return array
      */
-    public function getArguments($type, $arguments)
+    public function getArguments($type)
     {
-        $configuredArguments = isset($this->_mergedArguments[$type])
+        return isset($this->_mergedArguments[$type])
             ? $this->_mergedArguments[$type]
             : $this->_collectConfiguration($type);
-
-        if (is_array($configuredArguments)) {
-            $arguments = array_replace($configuredArguments, $arguments);
-        }
-        return $arguments;
     }
 
     /**
@@ -265,14 +259,14 @@ class Config implements \Magento\ObjectManager\Config
                     if (isset($curConfig['type'])) {
                         $this->_virtualTypes[$key] = $curConfig['type'];
                     }
-                    if (isset($curConfig['parameters'])) {
+                    if (isset($curConfig['arguments'])) {
                         if (!empty($this->_mergedArguments)) {
                             $this->_mergedArguments = array();
                         }
                         if (isset($this->_arguments[$key])) {
-                            $this->_arguments[$key] = array_replace($this->_arguments[$key], $curConfig['parameters']);
+                            $this->_arguments[$key] = array_replace($this->_arguments[$key], $curConfig['arguments']);
                         } else {
-                            $this->_arguments[$key] = $curConfig['parameters'];
+                            $this->_arguments[$key] = $curConfig['arguments'];
                         }
                     }
                     if (isset($curConfig['shared'])) {
diff --git a/lib/Magento/ObjectManager/Config/Mapper/ArgumentParser.php b/lib/Magento/ObjectManager/Config/Mapper/ArgumentParser.php
new file mode 100644
index 00000000000..bcf3ac7db7d
--- /dev/null
+++ b/lib/Magento/ObjectManager/Config/Mapper/ArgumentParser.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\ObjectManager\Config\Mapper;
+
+use Magento\Config\Converter\Dom\Flat as FlatConverter;
+use Magento\Config\Dom\NodePathMatcher;
+use Magento\Config\Dom\ArrayNodeConfig;
+
+/**
+ * Parser of a DI argument node that returns its array representation with no data loss
+ */
+class ArgumentParser
+{
+    /**
+     * @var FlatConverter
+     */
+    private $converter;
+
+    /**
+     * Build and return array representation of DI argument node
+     *
+     * @param \DOMNode $argumentNode
+     * @return array|string
+     */
+    public function parse(\DOMNode $argumentNode)
+    {
+        // Base path is specified to use more meaningful XPaths in config
+        return $this->getConverter()->convert($argumentNode, 'argument');
+    }
+
+    /**
+     * Retrieve instance of XML converter, suitable for DI argument nodes
+     *
+     * @return FlatConverter
+     */
+    protected function getConverter()
+    {
+        if (!$this->converter) {
+            $arrayNodeConfig = new ArrayNodeConfig(
+                new NodePathMatcher(),
+                array(
+                    'argument(/item)+' => 'name',
+                )
+            );
+            $this->converter = new FlatConverter($arrayNodeConfig);
+        }
+        return $this->converter;
+    }
+}
diff --git a/lib/Magento/ObjectManager/Config/Mapper/Dom.php b/lib/Magento/ObjectManager/Config/Mapper/Dom.php
index 8d8d364d3b4..488b0f9d12e 100644
--- a/lib/Magento/ObjectManager/Config/Mapper/Dom.php
+++ b/lib/Magento/ObjectManager/Config/Mapper/Dom.php
@@ -1,7 +1,5 @@
 <?php
 /**
- * ObjectManager configuration DOM mapper
- *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -25,8 +23,30 @@
  */
 namespace Magento\ObjectManager\Config\Mapper;
 
+use Magento\Stdlib\BooleanUtils;
+
 class Dom implements \Magento\Config\ConverterInterface
 {
+    /**
+     * @var BooleanUtils
+     */
+    private $booleanUtils;
+
+    /**
+     * @var ArgumentParser
+     */
+    private $argumentParser;
+
+    /**
+     * @param BooleanUtils $booleanUtils
+     * @param ArgumentParser $argumentParser
+     */
+    public function __construct(BooleanUtils $booleanUtils, ArgumentParser $argumentParser)
+    {
+        $this->booleanUtils = $booleanUtils;
+        $this->argumentParser = $argumentParser;
+    }
+
     /**
      * Convert configuration in DOM format to assoc array that can be used by object manager
      *
@@ -57,17 +77,17 @@ class Dom implements \Magento\Config\ConverterInterface
                     $typeData = array();
                     $typeNodeAttributes = $node->attributes;
                     $typeNodeShared = $typeNodeAttributes->getNamedItem('shared');
-                    if (!is_null($typeNodeShared)) {
-                        $typeData['shared'] = ($typeNodeShared->nodeValue == 'false') ? false : true;
+                    if ($typeNodeShared) {
+                        $typeData['shared'] = $this->booleanUtils->toBoolean($typeNodeShared->nodeValue);
                     }
                     if ($node->nodeName == 'virtualType') {
                         $attributeType = $typeNodeAttributes->getNamedItem('type');
                         // attribute type is required for virtual type only in merged configuration
-                        if (!is_null($attributeType)) {
+                        if ($attributeType) {
                             $typeData['type'] = $attributeType->nodeValue;
                         }
                     }
-                    $typeParameters = array();
+                    $typeArguments = array();
                     $typePlugins = array();
                     /** @var \DOMNode $typeChildNode */
                     foreach ($node->childNodes as $typeChildNode) {
@@ -75,40 +95,16 @@ class Dom implements \Magento\Config\ConverterInterface
                             continue;
                         }
                         switch ($typeChildNode->nodeName) {
-                            case 'param':
-                                $paramData = array();
-                                /** @var \DOMNode $paramChildNode */
-                                foreach ($typeChildNode->childNodes as $paramChildNode) {
-                                    if ($paramChildNode->nodeType != XML_ELEMENT_NODE) {
+                            case 'arguments':
+                                /** @var \DOMNode $argumentNode */
+                                foreach ($typeChildNode->childNodes as $argumentNode) {
+                                    if ($argumentNode->nodeType != XML_ELEMENT_NODE) {
                                         continue;
                                     }
-                                    switch ($paramChildNode->nodeName) {
-                                        case 'instance':
-                                            $instanceSharedNode = $paramChildNode->attributes->getNamedItem('shared');
-                                            $paramData = array(
-                                                'instance' => $paramChildNode->attributes
-                                                    ->getNamedItem('type')
-                                                    ->nodeValue,
-                                            );
-                                            if ($instanceSharedNode) {
-                                                $paramData['shared'] = ($instanceSharedNode->nodeValue == 'false')
-                                                    ? false : true;
-                                            }
-                                            break;
-                                        case 'value':
-                                            $paramData = $this->_processValueNode($paramChildNode);
-                                            break;
-                                        case 'array':
-                                            $paramData = $this->_processArrayNode($paramChildNode);
-                                            break;
-                                        default:
-                                            throw new \Exception(
-                                                "Invalid application config. Unknown node: {$paramChildNode->nodeName}."
-                                            );
-                                    }
+                                    $argumentName = $argumentNode->attributes->getNamedItem('name')->nodeValue;
+                                    $argumentData = $this->argumentParser->parse($argumentNode);
+                                    $typeArguments[$argumentName] = $argumentData;
                                 }
-                                $typeParameters[$typeChildNode->attributes->getNamedItem('name')->nodeValue]
-                                    = $paramData;
                                 break;
                             case 'plugin':
                                 $pluginAttributes = $typeChildNode->attributes;
@@ -119,7 +115,8 @@ class Dom implements \Magento\Config\ConverterInterface
                                     'sortOrder' => ($pluginSortOrderNode) ? (int)$pluginSortOrderNode->nodeValue : 0,
                                 );
                                 if ($pluginDisabledNode) {
-                                    $pluginData['disabled'] = ($pluginDisabledNode->nodeValue == 'true') ? true : false;
+                                    $pluginData['disabled']
+                                        = $this->booleanUtils->toBoolean($pluginDisabledNode->nodeValue);
                                 }
                                 if ($pluginTypeNode) {
                                     $pluginData['instance'] = $pluginTypeNode->nodeValue;
@@ -133,7 +130,7 @@ class Dom implements \Magento\Config\ConverterInterface
                         }
                     }
 
-                    $typeData['parameters'] = $typeParameters;
+                    $typeData['arguments'] = $typeArguments;
                     if (!empty($typePlugins)) {
                         $typeData['plugins'] = $typePlugins;
                     }
@@ -146,119 +143,4 @@ class Dom implements \Magento\Config\ConverterInterface
 
         return $output;
     }
-
-    /**
-     * Get value of array node
-     *
-     * Expected structure:
-     * <array>
-     *     <item key="key1"><value>...</value></value>
-     *     <item key="key2">
-     *         <array>...</array>
-     *     </item>
-     * </array>
-     *
-     * Which will convert to: array('key1' => ..., 'key2' => array(...))
-     *
-     * @param \DOMNode $valueNode
-     * @return array
-     * @throws \Exception
-     */
-    protected function _processArrayNode(\DOMNode $valueNode)
-    {
-        $result = array();
-        foreach ($valueNode->childNodes as $item) {
-            if ($item->nodeType != XML_ELEMENT_NODE) {
-                continue;
-            }
-            if ($item->nodeName != 'item') {
-                throw new \Exception("Unexpected node {$item->nodeName} under 'array' node.");
-            }
-            $count = 0;
-            $key = (string)$item->attributes->getNamedItem('key')->nodeValue;
-            foreach ($item->childNodes as $subItem) {
-                if ($subItem->nodeType != XML_ELEMENT_NODE) {
-                    continue;
-                }
-                $count++;
-                if ($count > 1) {
-                    throw new \Exception("The 'item' node expects one and only one child node.");
-                }
-                switch ($subItem->nodeName) {
-                    case 'value':
-                        $result[$key] = $this->_processValueNode($subItem);
-                        break;
-                    case 'array':
-                        $result[$key] = $this->_processArrayNode($subItem);
-                        break;
-                    default:
-                        throw new \Exception("Unexpected node {$subItem->nodeName} under 'item' node.");
-                }
-            }
-        }
-        return $result;
-    }
-
-    /**
-     * Retrieve value of the given node
-     * Treat all child nodes as an assoc array
-     *
-     * @param \DOMNode $valueNode
-     * @return array|string
-     * @throws \InvalidArgumentException
-     * @todo this method has high cyclomatic complexity in order to avoid performance issues
-     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
-     */
-    protected function _processValueNode(\DOMNode $valueNode)
-    {
-        $output = array();
-        $childNodesCount = $valueNode->childNodes->length;
-        $valueNodeType = $valueNode->attributes->getNamedItem('type');
-        if ($valueNodeType && 'null' == $valueNodeType->nodeValue) {
-            return null;
-        }
-        
-        /** @var \DOMNode $node */
-        foreach ($valueNode->childNodes as $node) {
-            if ($node->nodeType == XML_ELEMENT_NODE) {
-                $nodeType = $node->attributes->getNamedItem('type');
-                if ($nodeType && 'null' == $nodeType->nodeValue) {
-                    $output[$node->nodeName] = null;
-                }
-            } elseif (($node->nodeType == XML_TEXT_NODE || $node->nodeType == XML_CDATA_SECTION_NODE)
-                && $childNodesCount == 1
-            ) {
-                // process DomText or \DOMCharacterData node only if it is a single child of its parent
-                $output = trim($node->nodeValue);
-                if ($valueNodeType) {
-                    switch ($valueNodeType->nodeValue) {
-                        case 'const':
-                            $output = constant($output);
-                            break;
-                        case 'argument':
-                            $output = array('argument' => constant($output));
-                            break;
-                        case 'bool':
-                            $output = strtolower($output) == 'true' || $output == '1';
-                            break;
-                        case 'int':
-                            if (!preg_match('/^[0-9]*$/', $output)) {
-                                throw new \InvalidArgumentException('Invalid integer value');
-                            }
-                            $output = (int)$output;
-                            break;
-                        case 'string':
-                            $pattern = $valueNode->attributes->getNamedItem('pattern')->nodeValue;
-                            if (!preg_match('/^' . $pattern . '$/', $output)) {
-                                throw new \InvalidArgumentException('Invalid string value format');
-                            }
-                            break;
-                        default:
-                            throw new \InvalidArgumentException('Unknown parameter type');
-                    }
-                }
-            }
-        }
-        return $output;
-    }
 }
diff --git a/lib/Magento/ObjectManager/Config/Reader/Dom.php b/lib/Magento/ObjectManager/Config/Reader/Dom.php
index a5f88c46f73..03facb779d9 100644
--- a/lib/Magento/ObjectManager/Config/Reader/Dom.php
+++ b/lib/Magento/ObjectManager/Config/Reader/Dom.php
@@ -1,7 +1,5 @@
 <?php
 /**
- * ObjectManager DOM configuration reader
- *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -28,19 +26,19 @@ namespace Magento\ObjectManager\Config\Reader;
 class Dom extends \Magento\Config\Reader\Filesystem
 {
     /**
-     * List of paths to identifiable nodes
-     *
+     * Name of an attribute that stands for data type of node values
+     */
+    const TYPE_ATTRIBUTE = 'xsi:type';
+
+    /**
      * @var array
      */
     protected $_idAttributes = array(
-        '/config/preference'                             => 'for',
-        '/config/type'                                   => 'name',
-        '/config/type/param'                             => 'name',
-        '/config/type/plugin'                            => 'name',
-        '/config/virtualType'                            => 'name',
-        '/config/virtualType/param'                      => 'name',
-        '/config/virtualType/plugin'                     => 'name',
-        '/config/(type|virtualType)/param(/array/item)+' => 'key',
+        '/config/preference'                                    => 'for',
+        '/config/(type|virtualType)'                            => 'name',
+        '/config/(type|virtualType)/plugin'                     => 'name',
+        '/config/(type|virtualType)/arguments/argument'         => 'name',
+        '/config/(type|virtualType)/arguments/argument(/item)+' => 'name',
     );
 
     /**
@@ -74,4 +72,14 @@ class Dom extends \Magento\Config\Reader\Filesystem
             $defaultScope
         );
     }
+
+    /**
+     * Create and return a config merger instance that takes into account types of arguments
+     *
+     * {@inheritdoc}
+     */
+    protected function _createConfigMerger($mergerClass, $initialContents)
+    {
+        return new $mergerClass($initialContents, $this->_idAttributes, self::TYPE_ATTRIBUTE, $this->_perFileSchema);
+    }
 }
diff --git a/lib/Magento/ObjectManager/Factory.php b/lib/Magento/ObjectManager/Factory.php
index 6d9fb84016d..369f76637ec 100644
--- a/lib/Magento/ObjectManager/Factory.php
+++ b/lib/Magento/ObjectManager/Factory.php
@@ -25,22 +25,6 @@ namespace Magento\ObjectManager;
 
 interface Factory
 {
-    /**
-     * Set object manager
-     *
-     * @param \Magento\ObjectManager $objectManager
-     * @return void
-     */
-    public function setObjectManager(\Magento\ObjectManager $objectManager);
-
-    /**
-     * Set application arguments
-     *
-     * @param array $array
-     * @return void
-     */
-    public function setArguments($array);
-
     /**
      * Create instance with call time arguments
      *
diff --git a/lib/Magento/ObjectManager/Factory/Factory.php b/lib/Magento/ObjectManager/Factory/Factory.php
index 87531d7e5c8..4f6a128af39 100644
--- a/lib/Magento/ObjectManager/Factory/Factory.php
+++ b/lib/Magento/ObjectManager/Factory/Factory.php
@@ -25,11 +25,6 @@ namespace Magento\ObjectManager\Factory;
 
 class Factory implements \Magento\ObjectManager\Factory
 {
-    /**
-     * @var \Magento\ObjectManager\ObjectManager
-     */
-    protected $_objectManager;
-
     /**
      * @var \Magento\ObjectManager\Config
      */
@@ -43,35 +38,36 @@ class Factory implements \Magento\ObjectManager\Factory
     protected $_definitions;
 
     /**
-     * List of classes being created
-     *
      * @var array
      */
-    protected $_creationStack = array();
+    private $_creationStack = array();
 
     /**
-     * Application init arguments
-     *
-     * @var array
+     * @var \Magento\Data\Argument\InterpreterInterface
      */
-    protected $_globalArguments = array();
+    protected $_argInterpreter;
+
+    /**
+     * @var \Magento\ObjectManager\Config\Argument\ObjectFactory
+     */
+    protected $_argObjectFactory;
 
     /**
      * @param \Magento\ObjectManager\Config $config
-     * @param \Magento\ObjectManager\ObjectManager $objectManager
+     * @param \Magento\Data\Argument\InterpreterInterface $argInterpreter
+     * @param \Magento\ObjectManager\Config\Argument\ObjectFactory $argObjectFactory
      * @param \Magento\ObjectManager\Definition $definitions
-     * @param array $globalArguments
      */
     public function __construct(
         \Magento\ObjectManager\Config $config,
-        \Magento\ObjectManager\ObjectManager $objectManager = null,
-        \Magento\ObjectManager\Definition $definitions = null,
-        $globalArguments = array()
+        \Magento\Data\Argument\InterpreterInterface $argInterpreter,
+        \Magento\ObjectManager\Config\Argument\ObjectFactory $argObjectFactory,
+        \Magento\ObjectManager\Definition $definitions = null
     ) {
-        $this->_objectManager = $objectManager;
         $this->_config = $config;
+        $this->_argInterpreter = $argInterpreter;
+        $this->_argObjectFactory = $argObjectFactory;
         $this->_definitions = $definitions ? : new \Magento\ObjectManager\Definition\Runtime();
-        $this->_globalArguments = $globalArguments;
     }
 
     /**
@@ -79,78 +75,47 @@ class Factory implements \Magento\ObjectManager\Factory
      *
      * @param string $requestedType
      * @param array $parameters
-     * @param array $arguments
+     * @param array $argumentValues
      * @return array
-     * @throws \LogicException
-     * @throws \InvalidArgumentException
+     * @throws \UnexpectedValueException
      * @throws \BadMethodCallException
      *
      * @SuppressWarnings(PHPMD.CyclomaticComplexity)
      * @SuppressWarnings(PHPMD.NPathComplexity)
      */
-    protected function _resolveArguments($requestedType, array $parameters, array $arguments = array())
+    protected function _resolveArguments($requestedType, array $parameters, array $argumentValues = array())
     {
-        $resolvedArguments = array();
-        $arguments = $this->_config->getArguments($requestedType, $arguments);
+        $result = array();
+        $arguments = $this->_config->getArguments($requestedType);
         foreach ($parameters as $parameter) {
             list($paramName, $paramType, $paramRequired, $paramDefault) = $parameter;
-            $argument = null;
-            if (array_key_exists($paramName, $arguments)) {
-                $argument = $arguments[$paramName];
-            } elseif (array_key_exists('options', $arguments) && array_key_exists($paramName, $arguments['options'])) {
-                // The parameter name doesn't exist in the arguments, but it is contained in the 'options' argument.
-                $argument = $arguments['options'][$paramName];
-            } elseif ($paramRequired) {
-                if ($paramType) {
-                    $argument = array('instance' => $paramType);
-                } else {
-                    $this->_creationStack = array();
-                    throw new \BadMethodCallException(
-                        'Missing required argument $' . $paramName . ' for ' . $requestedType . '.'
-                    );
+            if (array_key_exists($paramName, $argumentValues)) {
+                $value = $argumentValues[$paramName];
+            } else if (array_key_exists($paramName, $arguments)) {
+                $argumentData = $arguments[$paramName];
+                if (!is_array($argumentData)) {
+                    throw new \UnexpectedValueException(sprintf(
+                        'Invalid parameter configuration provided for $%s argument of %s.', $paramName, $requestedType
+                    ));
                 }
-            } else {
-                $argument = $paramDefault;
-            }
-            if ($paramType && !is_object($argument) && $argument !== $paramDefault) {
-                if (!is_array($argument) || !isset($argument['instance'])) {
-                    $this->_creationStack = array();
-                    throw new \InvalidArgumentException(
-                        'Invalid parameter configuration provided for $' . $paramName . ' argument in ' . $requestedType
-                    );
+                try {
+                    $value = $this->_argInterpreter->evaluate($argumentData);
+                } catch (\Magento\Data\Argument\MissingOptionalValueException $e) {
+                    $value = $paramDefault;
                 }
-                $argumentType = $argument['instance'];
-                if (isset($this->_creationStack[$argumentType])) {
-                    $this->_creationStack = array();
-                    throw new \LogicException(
-                        'Circular dependency: ' . $argumentType . ' depends on ' . $requestedType . ' and viceversa.'
-                    );
+            } else if ($paramRequired) {
+                if (!$paramType) {
+                    throw new \BadMethodCallException(sprintf(
+                        'Missing required argument $%s of %s.', $paramName, $requestedType
+                    ));
                 }
-                $this->_creationStack[$requestedType] = 1;
-                $isShared = (!isset($argument['shared']) && $this->_config->isShared($argumentType))
-                    || (isset($argument['shared']) && $argument['shared']);
-                $argument = $isShared
-                    ? $this->_objectManager->get($argumentType)
-                    : $this->_objectManager->create($argumentType);
-                unset($this->_creationStack[$requestedType]);
-            } elseif (is_array($argument) && isset($argument['argument'])) {
-                $argKey = $argument['argument'];
-                $argument = isset($this->_globalArguments[$argKey]) ? $this->_globalArguments[$argKey] : $paramDefault;
+                $value = $this->_argObjectFactory->create($paramType);
+            } else {
+                $value = $paramDefault;
             }
-            $resolvedArguments[] = $argument;
+            $result[] = $value;
         }
-        return $resolvedArguments;
-    }
-
-    /**
-     * Set object manager
-     *
-     * @param \Magento\ObjectManager $objectManager
-     * @return void
-     */
-    public function setObjectManager(\Magento\ObjectManager $objectManager)
-    {
-        $this->_objectManager = $objectManager;
+        return $result;
     }
 
     /**
@@ -159,8 +124,7 @@ class Factory implements \Magento\ObjectManager\Factory
      * @param string $requestedType
      * @param array $arguments
      * @return object
-     * @throws \LogicException
-     * @throws \BadMethodCallException
+     * @throws \Exception
      *
      * @SuppressWarnings(PHPMD.CyclomaticComplexity)
      */
@@ -171,7 +135,15 @@ class Factory implements \Magento\ObjectManager\Factory
         if ($parameters == null) {
             return new $type();
         }
-        $args = $this->_resolveArguments($requestedType, $parameters, $arguments);
+        $this->_assertNoCircularDependency($requestedType);
+        $this->_creationStack[$requestedType] = $requestedType;
+        try {
+            $args = $this->_resolveArguments($requestedType, $parameters, $arguments);
+            unset($this->_creationStack[$requestedType]);
+        } catch (\Exception $e) {
+            unset($this->_creationStack[$requestedType]);
+            throw $e;
+        }
         switch (count($args)) {
             case 1:
                 return new $type($args[0]);
@@ -196,13 +168,17 @@ class Factory implements \Magento\ObjectManager\Factory
     }
 
     /**
-     * Set application arguments
+     * Prevent circular dependencies using creation stack
      *
-     * @param array $arguments
-     * @return void
+     * @param string $type
+     * @throws \LogicException
      */
-    public function setArguments($arguments)
+    private function _assertNoCircularDependency($type)
     {
-        $this->_globalArguments = $arguments;
+        if (isset($this->_creationStack[$type])) {
+            $lastFound = end($this->_creationStack);
+            $this->_creationStack = array();
+            throw new \LogicException("Circular dependency: {$type} depends on {$lastFound} and vice versa.");
+        }
     }
 }
diff --git a/lib/Magento/ObjectManager/ObjectManager.php b/lib/Magento/ObjectManager/ObjectManager.php
index 14b54a63b3c..6f2c232cd5d 100644
--- a/lib/Magento/ObjectManager/ObjectManager.php
+++ b/lib/Magento/ObjectManager/ObjectManager.php
@@ -54,11 +54,10 @@ class ObjectManager implements \Magento\ObjectManager
      * @param Config $config
      * @param array $sharedInstances
      */
-    public function __construct(Factory $factory = null, Config $config = null, array $sharedInstances = array())
+    public function __construct(Factory $factory, Config $config, array $sharedInstances = array())
     {
-        $this->_config = $config ?: new Config\Config();
-        $this->_factory = $factory ?: new Factory\Factory($this->_config, $this);
-        $this->_factory->setObjectManager($this);
+        $this->_config = $config;
+        $this->_factory = $factory;
         $this->_sharedInstances = $sharedInstances;
         $this->_sharedInstances['Magento\ObjectManager'] = $this;
     }
diff --git a/lib/Magento/ObjectManager/etc/config.xsd b/lib/Magento/ObjectManager/etc/config.xsd
index b5e31712721..77b16c6d94d 100644
--- a/lib/Magento/ObjectManager/etc/config.xsd
+++ b/lib/Magento/ObjectManager/etc/config.xsd
@@ -26,6 +26,35 @@
  */
 -->
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+    <xs:redefine schemaLocation="../../Data/etc/argument/types.xsd">
+        <xs:complexType name="argumentType" abstract="true" mixed="false">
+            <xs:complexContent>
+                <xs:extension base="argumentType" />
+            </xs:complexContent>
+        </xs:complexType>
+
+        <xs:complexType name="object">
+            <xs:complexContent>
+                <xs:extension base="object">
+                    <xs:attribute name="shared" use="optional" type="xs:boolean"/>
+                </xs:extension>
+            </xs:complexContent>
+        </xs:complexType>
+    </xs:redefine>
+
+    <xs:complexType name="init_parameter">
+        <xs:complexContent>
+            <xs:extension base="argumentType" />
+        </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="const">
+        <xs:complexContent>
+            <xs:extension base="argumentType" />
+        </xs:complexContent>
+    </xs:complexType>
+
     <xs:element name="config">
         <xs:complexType>
             <xs:choice maxOccurs="unbounded">
@@ -101,7 +130,12 @@
             </xs:documentation>
         </xs:annotation>
         <xs:choice maxOccurs="unbounded">
-            <xs:element name="param" type="paramType" minOccurs="0" maxOccurs="unbounded" />
+            <xs:element name="arguments" type="argumentsType" minOccurs="0" maxOccurs="1">
+                <xs:key name="argumentName">
+                    <xs:selector xpath="argument"></xs:selector>
+                    <xs:field xpath="@name"></xs:field>
+                </xs:key>
+            </xs:element>
             <xs:element name="plugin" type="pluginType" minOccurs="0" maxOccurs="unbounded" />
         </xs:choice>
         <xs:attribute name="name" type="xs:string" use="required" />
@@ -121,66 +155,6 @@
         </xs:complexContent>
     </xs:complexType>
 
-    <xs:complexType name="paramTypeBase">
-        <xs:annotation>
-            <xs:documentation>
-                Base type to be used for both param and array's item nodes
-            </xs:documentation>
-        </xs:annotation>
-        <xs:choice>
-            <xs:element name="instance" type="instanceType" />
-            <xs:element name="value" type="valueType" />
-            <xs:element name="array" type="arrayType">
-                <xs:unique name="uniqueArrayIndex">
-                    <xs:annotation>
-                        <xs:documentation>
-                            Array index should be unique for single array
-                        </xs:documentation>
-                    </xs:annotation>
-                    <xs:selector xpath="item" />
-                    <xs:field xpath="@key" />
-                </xs:unique>
-            </xs:element>
-        </xs:choice>
-    </xs:complexType>
-
-    <xs:complexType name="paramType">
-        <xs:complexContent>
-            <xs:extension base="paramTypeBase">
-                <xs:attribute name="name" type="xs:string" use="required" />
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="arrayType">
-        <xs:choice maxOccurs="unbounded">
-            <xs:element name="item" type="arrayItemType" />
-        </xs:choice>
-    </xs:complexType>
-
-    <xs:complexType name="arrayItemType">
-        <xs:complexContent>
-            <xs:extension base="paramTypeBase">
-                <xs:attribute name="key" type="xs:string" use="required" />
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="instanceType">
-        <xs:attribute name="type" type="xs:string" use="required" />
-        <xs:attribute name="shared" type="xs:boolean" use="optional" />
-    </xs:complexType>
-
-    <xs:complexType name="valueType">
-        <xs:simpleContent>
-            <xs:extension base="xs:string">
-                <xs:attribute name="translate" type="xs:string" use="optional" />
-                <xs:attribute name="module" type="xs:string" use="optional" />
-                <xs:attribute name="type" type="xs:string" use="optional" />
-            </xs:extension>
-        </xs:simpleContent>
-    </xs:complexType>
-
     <xs:complexType name="pluginType">
         <xs:attribute name="name" type="xs:string" use="required" />
         <xs:attribute name="type" type="xs:string" use="optional" />
diff --git a/lib/Magento/Phrase/Renderer/Composite.php b/lib/Magento/Phrase/Renderer/Composite.php
index 7affc8eadd1..2aab673b933 100644
--- a/lib/Magento/Phrase/Renderer/Composite.php
+++ b/lib/Magento/Phrase/Renderer/Composite.php
@@ -25,48 +25,29 @@
  */
 namespace Magento\Phrase\Renderer;
 
-class Composite implements \Magento\Phrase\RendererInterface
-{
-    /**
-     * Renderer factory
-     *
-     * @var Factory
-     */
-    protected $_rendererFactory;
-
-    /**
-     * List of \Magento\Phrase\RendererInterface
-     *
-     * @var array
-     */
-    protected $_renderers = array();
+use Magento\Phrase\RendererInterface;
 
+class Composite implements RendererInterface
+{
     /**
-     * Renderer construct
-     *
-     * @param Factory $rendererFactory
-     * @param array $renderers
+     * @var RendererInterface[]
      */
-    public function __construct(
-        Factory $rendererFactory,
-        array $renderers = array()
-    ) {
-        $this->_rendererFactory = $rendererFactory;
-
-        foreach ($renderers as $render) {
-            $this->_append($render);
-        }
-    }
+    protected $_renderers;
 
     /**
-     * Add renderer to the end of the chain
-     *
-     * @param string $render
-     * @return void
+     * @param RendererInterface[] $renderers
+     * @throws \InvalidArgumentException
      */
-    protected function _append($render)
+    public function __construct(array $renderers)
     {
-        $this->_renderers[] = $this->_rendererFactory->create($render);
+        foreach ($renderers as $renderer) {
+            if (!($renderer instanceof RendererInterface)) {
+                throw new \InvalidArgumentException(sprintf(
+                    'Instance of the phrase renderer is expected, got %s instead.', get_class($renderer)
+                ));
+            }
+        }
+        $this->_renderers = $renderers;
     }
 
     /**
@@ -78,7 +59,6 @@ class Composite implements \Magento\Phrase\RendererInterface
      */
     public function render($text, array $arguments = array())
     {
-        /** @var \Magento\Phrase\Renderer\Composite $render */
         foreach ($this->_renderers as $render) {
             $text = $render->render($text, $arguments);
         }
diff --git a/lib/Magento/Session/Generic.php b/lib/Magento/Session/Generic.php
index 850c938c140..77c80bb83db 100644
--- a/lib/Magento/Session/Generic.php
+++ b/lib/Magento/Session/Generic.php
@@ -26,6 +26,8 @@ namespace Magento\Session;
 class Generic extends SessionManager
 {
     /**
+     * Constructor
+     *
      * @param \Magento\App\RequestInterface $request
      * @param SidResolverInterface $sidResolver
      * @param \Magento\Session\Config\ConfigInterface $sessionConfig
diff --git a/lib/Magento/Session/SaveHandler.php b/lib/Magento/Session/SaveHandler.php
index 7487c655dce..f1a35822017 100644
--- a/lib/Magento/Session/SaveHandler.php
+++ b/lib/Magento/Session/SaveHandler.php
@@ -32,11 +32,15 @@ namespace Magento\Session;
 class SaveHandler implements SaveHandlerInterface
 {
     /**
+     * Session handler
+     *
      * @var \SessionHandler
      */
     protected $saveHandlerAdapter;
 
     /**
+     * Constructor
+     *
      * @param SaveHandlerFactory $saveHandlerFactory
      * @param string $saveMethod
      * @param string $default
@@ -65,6 +69,8 @@ class SaveHandler implements SaveHandlerInterface
 
     /**
      * Close Session - free resources
+     *
+     * @return bool
      */
     public function close()
     {
@@ -86,7 +92,7 @@ class SaveHandler implements SaveHandlerInterface
      * Write Session - commit data to resource
      *
      * @param string $sessionId
-     * @param mixed $data
+     * @param string $data
      * @return bool
      */
     public function write($sessionId, $data)
diff --git a/lib/Magento/Session/SaveHandler/DbTable.php b/lib/Magento/Session/SaveHandler/DbTable.php
index 42d7286ccd9..55fa43af222 100644
--- a/lib/Magento/Session/SaveHandler/DbTable.php
+++ b/lib/Magento/Session/SaveHandler/DbTable.php
@@ -57,6 +57,9 @@ class DbTable extends \SessionHandler
 
     /**
      * Check DB connection
+     *
+     * @return void
+     * @throws \Magento\Session\SaveHandlerException
      */
     protected function checkConnection()
     {
@@ -73,7 +76,7 @@ class DbTable extends \SessionHandler
      *
      * @param string $savePath ignored
      * @param string $sessionName ignored
-     * @return boolean
+     * @return bool
      */
     public function open($savePath, $sessionName)
     {
@@ -83,7 +86,7 @@ class DbTable extends \SessionHandler
     /**
      * Close session
      *
-     * @return boolean
+     * @return bool
      */
     public function close()
     {
@@ -118,7 +121,7 @@ class DbTable extends \SessionHandler
      *
      * @param string $sessionId
      * @param string $sessionData
-     * @return boolean
+     * @return bool
      */
     public function write($sessionId, $sessionData)
     {
@@ -149,7 +152,7 @@ class DbTable extends \SessionHandler
      * Destroy session
      *
      * @param string $sessionId
-     * @return boolean
+     * @return bool
      */
     public function destroy($sessionId)
     {
@@ -162,7 +165,7 @@ class DbTable extends \SessionHandler
      * Garbage collection
      *
      * @param int $maxLifeTime
-     * @return boolean
+     * @return bool
      */
     public function gc($maxLifeTime)
     {
diff --git a/lib/Magento/Session/SaveHandlerFactory.php b/lib/Magento/Session/SaveHandlerFactory.php
index b3ce6a0fe95..228be593038 100644
--- a/lib/Magento/Session/SaveHandlerFactory.php
+++ b/lib/Magento/Session/SaveHandlerFactory.php
@@ -37,16 +37,22 @@ class SaveHandlerFactory
     const PHP_NATIVE_HANDLER = 'Magento\Session\SaveHandler\Native';
 
     /**
+     * Object manager
+     *
      * @var \Magento\ObjectManager
      */
     protected $objectManager;
 
     /**
+     * Handlers
+     *
      * @var array
      */
     protected $handlers = array();
 
     /**
+     * Constructor
+     *
      * @param \Magento\ObjectManager $objectManger
      * @param array $handlers
      */
diff --git a/lib/Magento/Session/SessionManager.php b/lib/Magento/Session/SessionManager.php
index 58c1c595df0..b7648f75e11 100644
--- a/lib/Magento/Session/SessionManager.php
+++ b/lib/Magento/Session/SessionManager.php
@@ -33,6 +33,7 @@ class SessionManager implements SessionManagerInterface
     /**
      * Default options when a call destroy()
      *
+     * Description:
      * - send_expire_cookie: whether or not to send a cookie expiring the current session cookie
      * - clear_storage: whether or not to empty the storage object of any stored values
      *
@@ -51,36 +52,50 @@ class SessionManager implements SessionManagerInterface
     protected static $urlHostCache = array();
 
     /**
+     * Validator
+     *
      * @var \Magento\Session\ValidatorInterface
      */
     protected $validator;
 
     /**
+     * Request
+     *
      * @var \Magento\App\RequestInterface
      */
     protected $request;
 
     /**
+     * SID resolver
+     *
      * @var \Magento\Session\SidResolverInterface
      */
     protected $sidResolver;
 
     /**
+     * Session config
+     *
      * @var \Magento\Session\Config\ConfigInterface
      */
     protected $sessionConfig;
 
     /**
+     * Save handler
+     *
      * @var \Magento\Session\SaveHandlerInterface
      */
     protected $saveHandler;
 
     /**
+     * Storage
+     *
      * @var \Magento\Session\StorageInterface
      */
     protected $storage;
 
     /**
+     * Constructor
+     *
      * @param \Magento\App\RequestInterface $request
      * @param SidResolverInterface $sidResolver
      * @param Config\ConfigInterface $sessionConfig
@@ -106,6 +121,7 @@ class SessionManager implements SessionManagerInterface
 
     /**
      * This method needs to support sessions with APC enabled
+     * @return void
      */
     public function writeClose()
     {
@@ -135,7 +151,7 @@ class SessionManager implements SessionManagerInterface
      * Configure session handler and start session
      *
      * @param string $sessionName
-     * @return \Magento\Session\SessionManager
+     * @return $this
      */
     public function start($sessionName = null)
     {
@@ -230,7 +246,7 @@ class SessionManager implements SessionManagerInterface
      * Set session name
      *
      * @param string $name
-     * @return \Magento\Session\SessionManager
+     * @return $this
      */
     public function setName($name)
     {
@@ -242,6 +258,7 @@ class SessionManager implements SessionManagerInterface
      * Destroy/end a session
      *
      * @param  array $options
+     * @return void
      */
     public function destroy(array $options = null)
     {
@@ -310,7 +327,7 @@ class SessionManager implements SessionManagerInterface
      * Specify session identifier
      *
      * @param   string|null $sessionId
-     * @return  \Magento\Session\SessionManager
+     * @return  $this
      */
     public function setSessionId($sessionId)
     {
@@ -383,7 +400,7 @@ class SessionManager implements SessionManagerInterface
     /**
      * Register request host name as used with session
      *
-     * @return \Magento\Session\SessionManager
+     * @return $this
      */
     protected function _addHost()
     {
@@ -411,7 +428,7 @@ class SessionManager implements SessionManagerInterface
     /**
      * Clean all host names that were registered with session
      *
-     * @return \Magento\Session\SessionManager
+     * @return $this
      */
     protected function _cleanHosts()
     {
@@ -423,7 +440,7 @@ class SessionManager implements SessionManagerInterface
      * Renew session id and update session cookie
      *
      * @param bool $deleteOldSession
-     * @return \Magento\Session\SessionManager
+     * @return $this
      */
     public function regenerateId($deleteOldSession = true)
     {
@@ -440,6 +457,8 @@ class SessionManager implements SessionManagerInterface
 
     /**
      * Expire the session cookie for sub domains
+     *
+     * @return void
      */
     protected function clearSubDomainSessionCookie()
     {
@@ -463,6 +482,8 @@ class SessionManager implements SessionManagerInterface
      * Expire the session cookie
      *
      * Sends a session cookie with no value, and with an expiry in the past.
+     *
+     * @return void
      */
     public function expireSessionCookie()
     {
diff --git a/lib/Magento/Session/SessionManagerInterface.php b/lib/Magento/Session/SessionManagerInterface.php
index 93912a1fb43..2fdf81d158b 100644
--- a/lib/Magento/Session/SessionManagerInterface.php
+++ b/lib/Magento/Session/SessionManagerInterface.php
@@ -45,6 +45,8 @@ interface SessionManagerInterface
 
     /**
      * Session write close
+     *
+     * @return void
      */
     public function writeClose();
 
@@ -81,6 +83,7 @@ interface SessionManagerInterface
      * Destroy/end a session
      *
      * @param  array $options
+     * @return void
      */
     public function destroy(array $options = null);
 
@@ -132,6 +135,8 @@ interface SessionManagerInterface
      * Expire the session cookie
      *
      * Sends a session cookie with no value, and with an expiry in the past.
+     *
+     * @return void
      */
     public function expireSessionCookie();
 
diff --git a/lib/Magento/Session/SidResolverInterface.php b/lib/Magento/Session/SidResolverInterface.php
index 5ab13fa9d4c..3f3782ba58f 100644
--- a/lib/Magento/Session/SidResolverInterface.php
+++ b/lib/Magento/Session/SidResolverInterface.php
@@ -36,6 +36,8 @@ interface SidResolverInterface
     const SESSION_ID_QUERY_PARAM = 'SID';
 
     /**
+     * Get SID
+     *
      * @param \Magento\Session\SessionManagerInterface $session
      * @return string
      */
@@ -53,7 +55,7 @@ interface SidResolverInterface
      * Set use session var instead of SID for URL
      *
      * @param bool $var
-     * @return \Magento\Session\SidResolverInterface
+     * @return $this
      */
     public function setUseSessionVar($var);
 
@@ -68,7 +70,7 @@ interface SidResolverInterface
      * Set Use session in URL flag
      *
      * @param bool $flag
-     * @return \Magento\Session\SidResolverInterface
+     * @return $this
      */
     public function setUseSessionInUrl($flag = true);
 
diff --git a/lib/Magento/Session/Storage.php b/lib/Magento/Session/Storage.php
index 66e26a0f537..979c562f12d 100644
--- a/lib/Magento/Session/Storage.php
+++ b/lib/Magento/Session/Storage.php
@@ -38,6 +38,8 @@ class Storage extends \Magento\Object implements StorageInterface
     protected $namespace;
 
     /**
+     * Constructor
+     *
      * @param string $namespace
      * @param array $data
      */
diff --git a/lib/Magento/Session/ValidatorInterface.php b/lib/Magento/Session/ValidatorInterface.php
index 13dbe22f635..c1304eaf884 100644
--- a/lib/Magento/Session/ValidatorInterface.php
+++ b/lib/Magento/Session/ValidatorInterface.php
@@ -37,6 +37,7 @@ interface ValidatorInterface
      * Validate session
      *
      * @param \Magento\Session\SessionManagerInterface $session
+     * @return void
      * @throws \Magento\Session\Exception
      */
     public function validate(\Magento\Session\SessionManagerInterface $session);
diff --git a/lib/Magento/Stdlib/BooleanUtils.php b/lib/Magento/Stdlib/BooleanUtils.php
new file mode 100644
index 00000000000..b1c3179cf60
--- /dev/null
+++ b/lib/Magento/Stdlib/BooleanUtils.php
@@ -0,0 +1,82 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Stdlib;
+
+/**
+ * Utility methods for the boolean data type
+ */
+class BooleanUtils
+{
+    /**
+     * Expressions that mean boolean TRUE
+     *
+     * @var array
+     */
+    private $trueValues;
+
+    /**
+     * Expressions that mean boolean FALSE
+     *
+     * @var array
+     */
+    private $falseValues;
+
+    /**
+     * @param array $trueValues
+     * @param array $falseValues
+     */
+    public function __construct(
+        array $trueValues = array(true, 1, 'true', '1'),
+        array $falseValues = array(false, 0, 'false', '0')
+    ) {
+        $this->trueValues = $trueValues;
+        $this->falseValues = $falseValues;
+    }
+
+    /**
+     * Retrieve boolean value for an expression
+     *
+     * @param mixed $value Boolean expression
+     * @return bool
+     * @throws \InvalidArgumentException
+     */
+    public function toBoolean($value)
+    {
+        /**
+         * Built-in function filter_var() is not used, because such values as on/off are irrelevant in some contexts
+         * @link http://www.php.net/manual/en/filter.filters.validate.php
+         */
+        if (in_array($value, $this->trueValues, true)) {
+            return true;
+        }
+        if (in_array($value, $this->falseValues, true)) {
+            return false;
+        }
+        $allowedValues = array_merge($this->trueValues, $this->falseValues);
+        throw new \InvalidArgumentException(
+            'Boolean value is expected, supported values: ' . var_export($allowedValues, true)
+        );
+    }
+}
diff --git a/lib/Magento/Validator/Builder.php b/lib/Magento/Validator/Builder.php
index 2d9c76969aa..7feaf25c072 100644
--- a/lib/Magento/Validator/Builder.php
+++ b/lib/Magento/Validator/Builder.php
@@ -289,10 +289,9 @@ class Builder
     {
         $validator = $this->_oneValidatorFactory->create(
             $data['class'],
-            array('options' => isset($data['options']['arguments'])
+            isset($data['options']['arguments'])
                 ? $this->_applyArgumentsCallback($data['options']['arguments'])
                 : array()
-            )
         );
 
         // Check validator type
@@ -348,7 +347,9 @@ class Builder
     protected function _applyArgumentsCallback(array $arguments)
     {
         foreach ($arguments as &$argument) {
-            if ($argument instanceof OptionInterface) {
+            if (is_array($argument)) {
+                $argument = $this->_applyArgumentsCallback($argument);
+            } else if ($argument instanceof OptionInterface) {
                 $argument = $argument->getValue();
             }
         }
diff --git a/lib/Magento/View/Asset/Collection.php b/lib/Magento/View/Asset/Collection.php
index 1f0756338ae..e12183e9ead 100644
--- a/lib/Magento/View/Asset/Collection.php
+++ b/lib/Magento/View/Asset/Collection.php
@@ -30,6 +30,8 @@ namespace Magento\View\Asset;
 class Collection
 {
     /**
+     * Assets
+     *
      * @var AssetInterface[]
      */
     protected $assets = array();
@@ -39,6 +41,7 @@ class Collection
      *
      * @param string $identifier
      * @param AssetInterface $asset
+     * @return void
      */
     public function add($identifier, AssetInterface $asset)
     {
@@ -60,6 +63,7 @@ class Collection
      * Remove an item from the list
      *
      * @param string $identifier
+     * @return void
      */
     public function remove($identifier)
     {
diff --git a/lib/Magento/View/Asset/GroupedCollection.php b/lib/Magento/View/Asset/GroupedCollection.php
index 9122d53b2ff..7dde8f7055d 100644
--- a/lib/Magento/View/Asset/GroupedCollection.php
+++ b/lib/Magento/View/Asset/GroupedCollection.php
@@ -37,16 +37,22 @@ class GroupedCollection extends Collection
     /**#@-*/
 
     /**
+     * Property Factory
+     *
      * @var \Magento\View\Asset\PropertyGroupFactory
      */
     protected $propertyFactory;
 
     /**
+     * Property Groups
+     *
      * @var PropertyGroup[]
      */
     protected $groups = array();
 
     /**
+     * Constructor
+     *
      * @param PropertyGroupFactory $propertyFactory
      */
     public function __construct(PropertyGroupFactory $propertyFactory)
@@ -60,6 +66,7 @@ class GroupedCollection extends Collection
      * @param string $identifier
      * @param AssetInterface $asset
      * @param array $properties
+     * @return void
      */
     public function add($identifier, AssetInterface $asset, array $properties = array())
     {
@@ -94,11 +101,12 @@ class GroupedCollection extends Collection
      * Remove an instance from the list and from the corresponding group
      *
      * @param string $identifier
+     * @return void
      */
     public function remove($identifier)
     {
         parent::remove($identifier);
-        /** @var $group PropertyGroup */
+        /** @var PropertyGroup $group  */
         foreach ($this->groups as $group) {
             if ($group->has($identifier)) {
                 $group->remove($identifier);
diff --git a/lib/Magento/View/Asset/MergeService.php b/lib/Magento/View/Asset/MergeService.php
index 8d700a0e819..cafc47f57f4 100644
--- a/lib/Magento/View/Asset/MergeService.php
+++ b/lib/Magento/View/Asset/MergeService.php
@@ -30,29 +30,39 @@ namespace Magento\View\Asset;
 class MergeService
 {
     /**
+     * Object Manager
+     *
      * @var \Magento\ObjectManager
      */
     protected $objectManager;
 
     /**
+     * Config
+     *
      * @var ConfigInterface
      */
     protected $config;
 
     /**
+     * Filesystem
+     *
      * @var \Magento\App\Filesystem
      */
     protected $filesystem;
 
     /**
+     * State
+     *
      * @var \Magento\App\State
      */
     protected $state;
 
     /**
+     * Constructor
+     *
      * @param \Magento\ObjectManager $objectManager
      * @param ConfigInterface $config
-     * @param \Magento\App\Filesystem $filesystem,
+     * @param \Magento\App\Filesystem $filesystem
      * @param \Magento\App\State $state
      */
     public function __construct(
@@ -103,6 +113,8 @@ class MergeService
 
     /**
      * Remove all merged js/css files
+     *
+     * @return void
      */
     public function cleanMergedJsCss()
     {
diff --git a/lib/Magento/View/Asset/MergeStrategy/Checksum.php b/lib/Magento/View/Asset/MergeStrategy/Checksum.php
index ebfe570e10a..28a8e9c9c4e 100644
--- a/lib/Magento/View/Asset/MergeStrategy/Checksum.php
+++ b/lib/Magento/View/Asset/MergeStrategy/Checksum.php
@@ -31,16 +31,22 @@ namespace Magento\View\Asset\MergeStrategy;
 class Checksum implements \Magento\View\Asset\MergeStrategyInterface
 {
     /**
+     * Strategy
+     *
      * @var \Magento\View\Asset\MergeStrategyInterface
      */
     protected $strategy;
 
     /**
+     * Filesystem
+     *
      * @var \Magento\App\Filesystem
      */
     protected $filesystem;
 
     /**
+     * Constructor
+     *
      * @param \Magento\View\Asset\MergeStrategyInterface $strategy
      * @param \Magento\App\Filesystem $filesystem
      */
diff --git a/lib/Magento/View/Asset/MergeStrategy/Direct.php b/lib/Magento/View/Asset/MergeStrategy/Direct.php
index 1009bb04e53..568b48b3a9e 100644
--- a/lib/Magento/View/Asset/MergeStrategy/Direct.php
+++ b/lib/Magento/View/Asset/MergeStrategy/Direct.php
@@ -30,16 +30,22 @@ namespace Magento\View\Asset\MergeStrategy;
 class Direct implements \Magento\View\Asset\MergeStrategyInterface
 {
     /**
+     * Directory Write
+     *
      * @var \Magento\Filesystem\Directory\Write
      */
     private $_directory;
 
     /**
+     * Css Resolver
+     *
      * @var \Magento\View\Url\CssResolver
      */
     protected $cssUrlResolver;
 
     /**
+     * Constructor
+     *
      * @param \Magento\App\Filesystem $filesystem
      * @param \Magento\View\Url\CssResolver $cssUrlResolver
      */
diff --git a/lib/Magento/View/Asset/MergeStrategy/FileExists.php b/lib/Magento/View/Asset/MergeStrategy/FileExists.php
index 69f50c32e80..9f1a8f99a9a 100644
--- a/lib/Magento/View/Asset/MergeStrategy/FileExists.php
+++ b/lib/Magento/View/Asset/MergeStrategy/FileExists.php
@@ -30,16 +30,22 @@ namespace Magento\View\Asset\MergeStrategy;
 class FileExists implements \Magento\View\Asset\MergeStrategyInterface
 {
     /**
+     * Strategy
+     *
      * @var \Magento\View\Asset\MergeStrategyInterface
      */
     protected $strategy;
 
     /**
+     * Filesystem
+     *
      * @var \Magento\App\Filesystem
      */
     protected $filesystem;
 
     /**
+     * Constructor
+     *
      * @param \Magento\View\Asset\MergeStrategyInterface $strategy
      * @param \Magento\App\Filesystem $filesystem
      */
diff --git a/lib/Magento/View/Asset/MergeStrategyInterface.php b/lib/Magento/View/Asset/MergeStrategyInterface.php
index efd86375a74..035cfd2cf0d 100644
--- a/lib/Magento/View/Asset/MergeStrategyInterface.php
+++ b/lib/Magento/View/Asset/MergeStrategyInterface.php
@@ -35,6 +35,7 @@ interface MergeStrategyInterface
      * @param array $publicFiles List of full file paths to merge
      * @param string $destinationFile Full file path for merged file
      * @param string $contentType Asset content type
+     * @return void
      */
     public function mergeFiles(array $publicFiles, $destinationFile, $contentType);
 }
diff --git a/lib/Magento/View/Asset/Merged.php b/lib/Magento/View/Asset/Merged.php
index 475b53901c0..418baa7df5a 100644
--- a/lib/Magento/View/Asset/Merged.php
+++ b/lib/Magento/View/Asset/Merged.php
@@ -35,26 +35,36 @@ class Merged implements \Iterator
     const PUBLIC_MERGE_DIR  = '_merged';
 
     /**
+     * ObjectManager
+     *
      * @var \Magento\ObjectManager
      */
     protected $objectManager;
 
     /**
+     * Logger
+     *
      * @var \Magento\Logger
      */
     protected $logger;
 
     /**
+     * MergeStrategyInterface
+     *
      * @var MergeStrategyInterface
      */
     protected $mergeStrategy;
 
     /**
+     * Assets
+     *
      * @var MergeableInterface[]
      */
     protected $assets;
 
     /**
+     * Content type
+     *
      * @var string
      */
     protected $contentType;
@@ -67,6 +77,8 @@ class Merged implements \Iterator
     protected $isInitialized = false;
 
     /**
+     * Constructor
+     *
      * @param \Magento\ObjectManager $objectManager
      * @param \Magento\Logger $logger
      * @param MergeStrategyInterface $mergeStrategy
@@ -106,6 +118,8 @@ class Merged implements \Iterator
 
     /**
      * Attempt to merge assets, falling back to original non-merged ones, if merging fails
+     *
+     * @return void
      */
     protected function initialize()
     {
diff --git a/lib/Magento/View/Asset/Minified.php b/lib/Magento/View/Asset/Minified.php
index 504e88f3db2..a620cbcf41e 100644
--- a/lib/Magento/View/Asset/Minified.php
+++ b/lib/Magento/View/Asset/Minified.php
@@ -29,38 +29,51 @@ namespace Magento\View\Asset;
  */
 class Minified implements MergeableInterface
 {
-
     /**
+     * LocalInterface
+     *
      * @var LocalInterface
      */
     protected $originalAsset;
 
     /**
+     * Minfier
+     *
      * @var \Magento\Code\Minifier
      */
     protected $minifier;
 
     /**
+     * File
+     *
      * @var string
      */
     protected $file;
 
     /**
+     * URL
+     *
      * @var string
      */
     protected $url;
 
     /**
+     * View URL
+     *
      * @var \Magento\View\Url
      */
     protected $viewUrl;
 
     /**
+     * Logger
+     *
      * @var \Magento\Logger
      */
     protected $logger;
 
     /**
+     * Constructor
+     *
      * @param LocalInterface $asset
      * @param \Magento\Code\Minifier $minifier
      * @param \Magento\View\Url $viewUrl
@@ -110,6 +123,8 @@ class Minified implements MergeableInterface
 
     /**
      * Minify content of child asset
+     *
+     * @return void
      */
     protected function process()
     {
diff --git a/lib/Magento/View/Asset/MinifyService.php b/lib/Magento/View/Asset/MinifyService.php
index 2113f2dbc26..d5debed5bea 100644
--- a/lib/Magento/View/Asset/MinifyService.php
+++ b/lib/Magento/View/Asset/MinifyService.php
@@ -30,26 +30,36 @@ namespace Magento\View\Asset;
 class MinifyService
 {
     /**
+     * Config
+     *
      * @var ConfigInterface
      */
     protected $config;
 
     /**
+     * ObjectManager
+     *
      * @var \Magento\ObjectManager
      */
     protected $objectManager;
 
     /**
+     * Enabled
+     *
      * @var array
      */
     protected $enabled = array();
 
     /**
+     * Minfiers
+     *
      * @var \Magento\Code\Minifier[]
      */
     protected $minifiers = array();
 
     /**
+     * Applicaiton State
+     *
      * @var \Magento\App\State
      */
     protected $appState;
@@ -62,6 +72,8 @@ class MinifyService
     protected $_filesystem;
 
     /**
+     * Constructor
+     *
      * @param ConfigInterface $config
      * @param \Magento\ObjectManager $objectManager
      * @param \Magento\App\State $appState
@@ -142,7 +154,7 @@ class MinifyService
     /**
      * Check if minification is enabled for specified content type
      *
-     * @param $contentType
+     * @param string $contentType
      * @return bool
      */
     protected function isEnabled($contentType)
@@ -156,7 +168,7 @@ class MinifyService
     /**
      * Get minification adapter by specified content type
      *
-     * @param $contentType
+     * @param string $contentType
      * @return mixed
      * @throws \Magento\Exception
      */
diff --git a/lib/Magento/View/Asset/PreProcessor/Composite.php b/lib/Magento/View/Asset/PreProcessor/Composite.php
index 0992a13b73c..03397049a81 100644
--- a/lib/Magento/View/Asset/PreProcessor/Composite.php
+++ b/lib/Magento/View/Asset/PreProcessor/Composite.php
@@ -32,21 +32,29 @@ use \Magento\View\Asset\PreProcessorFactory;
 class Composite implements PreProcessorInterface
 {
     /**
+     * Pre-processor config
+     *
      * @var array
      */
     protected $preProcessorsConfig = array();
 
     /**
+     * Asset type pre-processor
+     *
      * @var PreProcessorInterface[]
      */
     protected $assetTypePreProcessors = array();
 
     /**
+     * Pre-processor factory
+     *
      * @var \Magento\View\Asset\PreProcessorFactory
      */
     protected $preProcessorFactory;
 
     /**
+     * Constructor
+     *
      * @param PreProcessorFactory $preProcessorFactory
      * @param array $preProcessorsConfig
      */
diff --git a/lib/Magento/View/Asset/PreProcessorFactory.php b/lib/Magento/View/Asset/PreProcessorFactory.php
index ee96ac031b9..f141d75f85c 100644
--- a/lib/Magento/View/Asset/PreProcessorFactory.php
+++ b/lib/Magento/View/Asset/PreProcessorFactory.php
@@ -37,6 +37,8 @@ class PreProcessorFactory
     protected $objectManager;
 
     /**
+     * Object manager
+     *
      * @param \Magento\ObjectManager $objectManager
      */
     public function __construct(\Magento\ObjectManager $objectManager)
diff --git a/lib/Magento/View/Asset/PropertyGroup.php b/lib/Magento/View/Asset/PropertyGroup.php
index f00a1ccd36e..c5567b746eb 100644
--- a/lib/Magento/View/Asset/PropertyGroup.php
+++ b/lib/Magento/View/Asset/PropertyGroup.php
@@ -30,11 +30,15 @@ namespace Magento\View\Asset;
 class PropertyGroup extends Collection
 {
     /**
+     * Properties
+     *
      * @var array
      */
     protected $properties = array();
 
     /**
+     * Constructor
+     *
      * @param array $properties
      */
     public function __construct(array $properties)
@@ -45,7 +49,7 @@ class PropertyGroup extends Collection
     /**
      * Retrieve values of all properties
      *
-     * @return array()
+     * @return array
      */
     public function getProperties()
     {
diff --git a/lib/Magento/View/Asset/PropertyGroupFactory.php b/lib/Magento/View/Asset/PropertyGroupFactory.php
index 39478301907..f342b9e7485 100644
--- a/lib/Magento/View/Asset/PropertyGroupFactory.php
+++ b/lib/Magento/View/Asset/PropertyGroupFactory.php
@@ -37,6 +37,8 @@ class PropertyGroupFactory
     protected $objectManager;
 
     /**
+     * Constructor
+     *
      * @param \Magento\ObjectManager $objectManager
      */
     public function __construct(\Magento\ObjectManager $objectManager)
diff --git a/lib/Magento/View/Asset/PublicFile.php b/lib/Magento/View/Asset/PublicFile.php
index 7e5b0962cbd..00e42d0209c 100644
--- a/lib/Magento/View/Asset/PublicFile.php
+++ b/lib/Magento/View/Asset/PublicFile.php
@@ -30,21 +30,28 @@ namespace Magento\View\Asset;
 class PublicFile implements LocalInterface
 {
     /**
+     * View URL
+     *
      * @var \Magento\View\Url
      */
     protected $viewUrl;
 
     /**
+     * File
+     *
      * @var string
      */
     protected $file;
 
     /**
+     * Content type
      * @var string
      */
     protected $contentType;
 
     /**
+     * Constructor
+     *
      * @param \Magento\View\Url $viewUrl
      * @param string $file
      * @param string $contentType
diff --git a/lib/Magento/View/Asset/Remote.php b/lib/Magento/View/Asset/Remote.php
index 6ca23223881..6d921f3a187 100644
--- a/lib/Magento/View/Asset/Remote.php
+++ b/lib/Magento/View/Asset/Remote.php
@@ -30,16 +30,22 @@ namespace Magento\View\Asset;
 class Remote implements AssetInterface
 {
     /**
+     * URL
+     *
      * @var string
      */
     protected $url;
 
     /**
+     * Content type
+     *
      * @var string
      */
     protected $contentType;
 
     /**
+     * Constructor
+     *
      * @param string $url
      * @param string $contentType
      */
diff --git a/lib/Magento/View/Asset/ViewFile.php b/lib/Magento/View/Asset/ViewFile.php
index 086f0522c39..8a25b0c9c50 100644
--- a/lib/Magento/View/Asset/ViewFile.php
+++ b/lib/Magento/View/Asset/ViewFile.php
@@ -30,21 +30,29 @@ namespace Magento\View\Asset;
 class ViewFile implements MergeableInterface
 {
     /**
+     * View URL
+     *
      * @var \Magento\View\Url
      */
     protected $viewUrl;
 
     /**
+     * File
+     *
      * @var string
      */
     protected $file;
 
     /**
+     * Content type
+     *
      * @var string
      */
     protected $contentType;
 
     /**
+     * Constructor
+     *
      * @param \Magento\View\Url $viewUrl
      * @param string $file
      * @param string $contentType
diff --git a/lib/Magento/View/BlockPool.php b/lib/Magento/View/BlockPool.php
index eec7bd52a5b..8308e7df9cf 100644
--- a/lib/Magento/View/BlockPool.php
+++ b/lib/Magento/View/BlockPool.php
@@ -35,16 +35,21 @@ use Magento\ObjectManager;
 class BlockPool
 {
     /**
+     * Block factory
      * @var \Magento\View\Element\BlockFactory
      */
     protected $blockFactory;
 
     /**
+     * Blocks
+     *
      * @var array
      */
     protected $blocks = array();
 
     /**
+     * Constructor
+     *
      * @param ObjectManager $objectManager
      * @param BlockFactory $blockFactory
      */
@@ -55,6 +60,8 @@ class BlockPool
     }
 
     /**
+     * Add a block
+     *
      * @param string $name
      * @param string $class
      * @param array $arguments [optional]
@@ -75,8 +82,10 @@ class BlockPool
     }
 
     /**
+     * Get blocks
+     *
      * @param string $name
-     * @return BlockInterface | null
+     * @return BlockInterface|null
      */
     public function get($name = null)
     {
diff --git a/lib/Magento/View/Config.php b/lib/Magento/View/Config.php
index a6405be371b..60eea19d3ea 100644
--- a/lib/Magento/View/Config.php
+++ b/lib/Magento/View/Config.php
@@ -46,11 +46,15 @@ class Config implements \Magento\View\ConfigInterface
     protected $moduleReader;
 
     /**
+     * Root directory
+     *
      * @var ReadInterface
      */
     protected $rootDirectory;
 
     /**
+     * View service
+     *
      * @var \Magento\View\Service
      */
     protected $viewService;
@@ -63,22 +67,28 @@ class Config implements \Magento\View\ConfigInterface
     protected $viewFileSystem;
 
     /**
+     * File name
+     *
      * @var string
      */
     protected $filename;
 
     /**
+     * File iterator factory
+     *
      * @var \Magento\Config\FileIteratorFactory
      */
     protected $fileIteratorFactory;
 
     /**
+     * Constructor
+     *
      * @param \Magento\Module\Dir\Reader $moduleReader
      * @param \Magento\App\Filesystem $filesystem
-     * @param Service $viewService
-     * @param FileSystem $viewFileSystem
+     * @param \Magento\View\Service  $viewService
+     * @param \Magento\View\FileSystem $viewFileSystem
      * @param \Magento\Config\FileIteratorFactory $fileIteratorFactory
-     * @param $filename
+     * @param string $filename
      */
     public function __construct(
         \Magento\Module\Dir\Reader $moduleReader,
diff --git a/lib/Magento/View/Context.php b/lib/Magento/View/Context.php
index 842c39491dc..b41333a05e1 100644
--- a/lib/Magento/View/Context.php
+++ b/lib/Magento/View/Context.php
@@ -53,56 +53,77 @@ use Magento\Event\ManagerInterface;
 class Context
 {
     /**
+     * Request
+     *
      * @var Request
      */
     protected $request;
 
     /**
+     * Event manager
+     *
      * @var ManagerInterface
      */
     protected $eventManager;
 
     /**
+     * URL builder
      * @var \Magento\UrlInterface
      */
     protected $urlBuilder;
 
     /**
+     * Translator
+     *
      * @var \Magento\TranslateInterface
      */
     protected $translator;
 
     /**
+     * Cache
+     *
      * @var \Magento\App\CacheInterface
      */
     protected $cache;
 
     /**
+     * Design
+     *
      * @var \Magento\View\DesignInterface
      */
     protected $design;
 
     /**
+     * Session
+     *
      * @var \Magento\Session\SessionManagerInterface
      */
     protected $session;
 
     /**
+     * Store config
+     *
      * @var \Magento\Core\Model\Store\Config
      */
     protected $storeConfig;
 
     /**
+     * Front controller
+     *
      * @var FrontControllerInterface
      */
     protected $frontController;
 
     /**
+     * View URL
+     *
      * @var \Magento\View\Url
      */
     protected $viewUrl;
 
     /**
+     * Layout
+     *
      * @var \Magento\View\LayoutInterface
      */
     protected $layout;
@@ -115,26 +136,36 @@ class Context
     protected $viewConfig;
 
     /**
+     * Cache state
+     *
      * @var \Magento\App\Cache\StateInterface
      */
     protected $cacheState;
 
     /**
+     * Logger
+     *
      * @var \Magento\Logger
      */
     protected $logger;
 
     /**
+     * Application
+     *
      * @var \Magento\Core\Model\App
      */
     protected $app;
 
     /**
+     * Application state
+     *
      * @var \Magento\App\State
      */
     protected $appState;
 
     /**
+     * Constructor
+     *
      * @param Request $request
      * @param ManagerInterface $eventManager
      * @param UrlInterface $urlBuilder
@@ -190,6 +221,8 @@ class Context
     }
 
     /**
+     * Retrieve cache
+     *
      * @return \Magento\App\CacheInterface
      */
     public function getCache()
@@ -198,6 +231,8 @@ class Context
     }
 
     /**
+     * Retrieve design package
+     *
      * @return \Magento\View\DesignInterface
      */
     public function getDesignPackage()
@@ -206,6 +241,8 @@ class Context
     }
 
     /**
+     * Retrieve event manager
+     *
      * @return ManagerInterface
      */
     public function getEventManager()
@@ -214,6 +251,8 @@ class Context
     }
 
     /**
+     * Retrieve front controller
+     *
      * @return FrontControllerInterface
      */
     public function getFrontController()
@@ -222,6 +261,8 @@ class Context
     }
 
     /**
+     * Retrieve layout
+     *
      * @return \Magento\View\LayoutInterface
      */
     public function getLayout()
@@ -230,6 +271,8 @@ class Context
     }
 
     /**
+     * Retrieve request
+     *
      * @return Request
      */
     public function getRequest()
@@ -238,6 +281,8 @@ class Context
     }
 
     /**
+     * Retrieve session
+     *
      * @return \Magento\Session\SessionManagerInterface
      */
     public function getSession()
@@ -246,6 +291,8 @@ class Context
     }
 
     /**
+     * Retrieve store config
+     *
      * @return \Magento\Core\Model\Store\Config
      */
     public function getStoreConfig()
@@ -254,6 +301,8 @@ class Context
     }
 
     /**
+     * Retrieve translator
+     *
      * @return \Magento\TranslateInterface
      */
     public function getTranslator()
@@ -262,6 +311,8 @@ class Context
     }
 
     /**
+     * Retrieve URL builder
+     *
      * @return \Magento\UrlInterface
      */
     public function getUrlBuilder()
@@ -270,6 +321,8 @@ class Context
     }
 
     /**
+     * Retrieve View URL
+     *
      * @return \Magento\View\Url
      */
     public function getViewUrl()
@@ -278,6 +331,8 @@ class Context
     }
 
     /**
+     * Retrieve view config
+     *
      * @return \Magento\View\ConfigInterface
      */
     public function getViewConfig()
@@ -286,6 +341,8 @@ class Context
     }
 
     /**
+     * Retrieve cache state
+     *
      * @return \Magento\App\Cache\StateInterface
      */
     public function getCacheState()
@@ -294,6 +351,8 @@ class Context
     }
 
     /**
+     * Retrieve logger
+     *
      * @return \Magento\Logger
      */
     public function getLogger()
@@ -302,6 +361,8 @@ class Context
     }
 
     /**
+     * Retrieve application
+     *
      * @return \Magento\Core\Model\App
      */
     public function getApp()
@@ -372,6 +433,8 @@ class Context
     }
 
     /**
+     * Retrieve acceptance type
+     *
      * @return string
      */
     public function getAcceptType()
@@ -394,7 +457,7 @@ class Context
      *
      * @param string $key
      * @param mixed $default Default value to use if key not found
-     * @return mixed Returns null if key does not exist
+     * @return mixed|null if key does not exist
      */
     public function getPost($key = null, $default = null)
     {
@@ -404,7 +467,7 @@ class Context
     /**
      * Retrieve a member of the $_POST superglobal
      *
-     * @param string $key
+     * @param string|null $key
      * @param mixed $default Default value to use if key not found
      * @return mixed alias of getPost
      */
@@ -416,7 +479,7 @@ class Context
     /**
      * Retrieve a parameter
      *
-     * @param mixed $key
+     * @param string|null $key
      * @param mixed $default Default value to use if key not found
      * @return mixed
      */
@@ -438,7 +501,7 @@ class Context
     /**
      * Return the value of the given HTTP header.
      *
-     * @param $header
+     * @param string $header
      * @return string|false HTTP header value, or false if not found
      */
     public function getHeader($header)
@@ -457,6 +520,8 @@ class Context
     }
 
     /**
+     * Retrieve application state
+     *
      * @return \Magento\App\State
      */
     public function getAppState()
diff --git a/lib/Magento/View/DataSourcePool.php b/lib/Magento/View/DataSourcePool.php
index cbef1cf985a..60b1a40be67 100644
--- a/lib/Magento/View/DataSourcePool.php
+++ b/lib/Magento/View/DataSourcePool.php
@@ -32,22 +32,30 @@ use Magento\View\Element\BlockFactory;
 class DataSourcePool
 {
     /**
+     * Block factory
+     *
      * @var \Magento\View\Element\BlockFactory
      */
     protected $blockFactory;
 
     /**
+     * Data sources
+     *
      * @var array
      */
     protected $dataSources = array();
 
     /**
+     * Assignments
+     *
      * @var array
      */
     protected $assignments = array();
 
     /**
-     * @param \Magento\View\Element\BlockFactory $blockFactory
+     * Constructors
+     *
+     * @param BlockFactory $blockFactory
      */
     public function __construct(BlockFactory $blockFactory)
     {
@@ -55,6 +63,8 @@ class DataSourcePool
     }
 
     /**
+     * Add data source
+     *
      * @param string $name
      * @param string $class
      * @return object
@@ -77,7 +87,9 @@ class DataSourcePool
     }
 
     /**
-     * @param null $name
+     * Get data source
+     *
+     * @param string|null $name
      * @return array|object|null
      */
     public function get($name = null)
@@ -90,9 +102,12 @@ class DataSourcePool
     }
 
     /**
-     * @param $dataName
-     * @param $namespace
-     * @param $alias
+     * Assign
+     *
+     * @param string $dataName
+     * @param string $namespace
+     * @param string $alias
+     * @return void
      */
     public function assign($dataName, $namespace, $alias)
     {
@@ -103,7 +118,9 @@ class DataSourcePool
     }
 
     /**
-     * @param $namespace
+     * Retrieve namespace data
+     *
+     * @param string $namespace
      * @return array
      */
     public function getNamespaceData($namespace)
diff --git a/lib/Magento/View/DeployedFilesManager.php b/lib/Magento/View/DeployedFilesManager.php
index 4c66e4f5b68..5e1f9c00810 100644
--- a/lib/Magento/View/DeployedFilesManager.php
+++ b/lib/Magento/View/DeployedFilesManager.php
@@ -30,11 +30,15 @@ namespace Magento\View;
 class DeployedFilesManager implements \Magento\View\PublicFilesManagerInterface
 {
     /**
+     * View service
+     *
      * @var \Magento\View\Service
      */
     protected $_viewService;
 
     /**
+     * Constructor
+     *
      * @param \Magento\View\Service $viewService
      */
     public function __construct(\Magento\View\Service $viewService)
diff --git a/lib/Magento/View/Design/Fallback/Factory.php b/lib/Magento/View/Design/Fallback/Factory.php
index 672783e46f4..53e285a7dd6 100644
--- a/lib/Magento/View/Design/Fallback/Factory.php
+++ b/lib/Magento/View/Design/Fallback/Factory.php
@@ -39,6 +39,8 @@ use Magento\View\Design\Fallback\Rule\Theme;
 class Factory
 {
     /**
+     * File system
+     *
      * @var Filesystem
      */
     protected $filesystem;
diff --git a/lib/Magento/View/Design/Fallback/Rule/Composite.php b/lib/Magento/View/Design/Fallback/Rule/Composite.php
index 8ec6929be53..703bf0f6185 100644
--- a/lib/Magento/View/Design/Fallback/Rule/Composite.php
+++ b/lib/Magento/View/Design/Fallback/Rule/Composite.php
@@ -32,11 +32,15 @@ namespace Magento\View\Design\Fallback\Rule;
 class Composite implements RuleInterface
 {
     /**
+     * Rules
+     *
      * @var RuleInterface[]
      */
     protected $rules = array();
 
     /**
+     * Constructors
+     *
      * @param RuleInterface[] $rules
      * @throws \InvalidArgumentException
      */
diff --git a/lib/Magento/View/Design/Fallback/Rule/ModularSwitch.php b/lib/Magento/View/Design/Fallback/Rule/ModularSwitch.php
index 7e6b8f77314..fdcb8ee4240 100644
--- a/lib/Magento/View/Design/Fallback/Rule/ModularSwitch.php
+++ b/lib/Magento/View/Design/Fallback/Rule/ModularSwitch.php
@@ -32,16 +32,22 @@ namespace Magento\View\Design\Fallback\Rule;
 class ModularSwitch implements RuleInterface
 {
     /**
+     * Rule non-modular
+     *
      * @var RuleInterface
      */
     protected $ruleNonModular;
 
     /**
+     * Rule modular
+     *
      * @var RuleInterface
      */
     protected $ruleModular;
 
     /**
+     * Constructor
+     *
      * @param RuleInterface $ruleNonModular
      * @param RuleInterface $ruleModular
      */
diff --git a/lib/Magento/View/Design/Fallback/Rule/Simple.php b/lib/Magento/View/Design/Fallback/Rule/Simple.php
index c692799da4b..85c629e5228 100644
--- a/lib/Magento/View/Design/Fallback/Rule/Simple.php
+++ b/lib/Magento/View/Design/Fallback/Rule/Simple.php
@@ -44,6 +44,8 @@ class Simple implements RuleInterface
     protected $pattern;
 
     /**
+     * Constructor
+     *
      * @param string $pattern
      * @param array $optionalParams
      */
diff --git a/lib/Magento/View/Design/Fallback/Rule/Theme.php b/lib/Magento/View/Design/Fallback/Rule/Theme.php
index 6428b16ff7a..def0208c827 100644
--- a/lib/Magento/View/Design/Fallback/Rule/Theme.php
+++ b/lib/Magento/View/Design/Fallback/Rule/Theme.php
@@ -34,11 +34,15 @@ use Magento\View\Design\ThemeInterface;
 class Theme implements RuleInterface
 {
     /**
+     * Rule
+     *
      * @var RuleInterface
      */
     protected $rule;
 
     /**
+     * Constructors
+     *
      * @param RuleInterface $rule
      */
     public function __construct(RuleInterface $rule)
diff --git a/lib/Magento/View/Design/FileResolution/Strategy/Fallback.php b/lib/Magento/View/Design/FileResolution/Strategy/Fallback.php
index 2c8c710a948..9f7491ac60d 100644
--- a/lib/Magento/View/Design/FileResolution/Strategy/Fallback.php
+++ b/lib/Magento/View/Design/FileResolution/Strategy/Fallback.php
@@ -38,21 +38,29 @@ use Magento\Filesystem\Directory\Read;
 class Fallback implements FileInterface, LocaleInterface, ViewInterface
 {
     /**
+     * Fallback factory
+     *
      * @var Factory
      */
     protected $fallbackFactory;
 
     /**
+     * Rule file
+     *
      * @var RuleInterface
      */
     protected $ruleFile;
 
     /**
+     * Rule locale file
+     *
      * @var RuleInterface
      */
     protected $ruleLocaleFile;
 
     /**
+     * Rule view file
+     *
      * @var RuleInterface
      */
     protected $ruleViewFile;
@@ -65,6 +73,8 @@ class Fallback implements FileInterface, LocaleInterface, ViewInterface
     protected $rootDirectory;
 
     /**
+     * Constructor
+     *
      * @param Filesystem $filesystem
      * @param Factory $fallbackFactory
      */
diff --git a/lib/Magento/View/Design/FileResolution/Strategy/Fallback/CachingProxy.php b/lib/Magento/View/Design/FileResolution/Strategy/Fallback/CachingProxy.php
index bd1468fb035..634c5ad0dfa 100644
--- a/lib/Magento/View/Design/FileResolution/Strategy/Fallback/CachingProxy.php
+++ b/lib/Magento/View/Design/FileResolution/Strategy/Fallback/CachingProxy.php
@@ -70,6 +70,8 @@ class CachingProxy implements FileInterface, LocaleInterface, ViewInterface, Not
     protected $canSaveMap;
 
     /**
+     * Var directory
+     *
      * @var Write
      */
     protected $varDirectory;
@@ -82,6 +84,8 @@ class CachingProxy implements FileInterface, LocaleInterface, ViewInterface, Not
     protected $sections = array();
 
     /**
+     * Constructor
+     *
      * @param Fallback $fallback
      * @param Filesystem $filesystem
      * @param string $mapDir
@@ -220,6 +224,7 @@ class CachingProxy implements FileInterface, LocaleInterface, ViewInterface, Not
      * @param string|null $module
      * @param string $file
      * @param string $filePath
+     * @return void
      * @throws \Magento\Exception
      */
     protected function setToMap($fileType, $area, ThemeInterface $theme, $locale, $module, $file, $filePath)
@@ -284,7 +289,7 @@ class CachingProxy implements FileInterface, LocaleInterface, ViewInterface, Not
      * @param string|null $module
      * @param string $file
      * @param string $newFilePath
-     * @return \Magento\View\Design\FileResolution\Strategy\Fallback\CachingProxy
+     * @return $this
      */
     public function setViewFilePathToMap($area, ThemeInterface $themeModel, $locale, $module, $file, $newFilePath)
     {
diff --git a/lib/Magento/View/Design/FileResolution/StrategyPool.php b/lib/Magento/View/Design/FileResolution/StrategyPool.php
index 174c70b0e1f..5b49f006e80 100644
--- a/lib/Magento/View/Design/FileResolution/StrategyPool.php
+++ b/lib/Magento/View/Design/FileResolution/StrategyPool.php
@@ -42,16 +42,22 @@ class StrategyPool
     const FALLBACK_MAP_DIR = 'maps/fallback';
 
     /**
+     * Object manager
+     *
      * @var ObjectManager
      */
     protected $objectManager;
 
     /**
+     * Application state
+     *
      * @var string
      */
     protected $appState;
 
     /**
+     * File system
+     *
      * @var Filesystem
      */
     protected $filesystem;
@@ -87,6 +93,8 @@ class StrategyPool
     );
 
     /**
+     * Constructor
+     *
      * @param ObjectManager $objectManager
      * @param State $appState
      * @param Filesystem $filesystem
@@ -113,7 +121,7 @@ class StrategyPool
     }
 
     /**
-     * * Get strategy to resolve locale files (e.g. locale settings)
+     * Get strategy to resolve locale files (e.g. locale settings)
      *
      * @param bool $skipProxy
      * @return \Magento\View\Design\FileResolution\Strategy\LocaleInterface
diff --git a/lib/Magento/View/Design/Theme/Customization.php b/lib/Magento/View/Design/Theme/Customization.php
index 079f5692ff5..d5e95a91801 100644
--- a/lib/Magento/View/Design/Theme/Customization.php
+++ b/lib/Magento/View/Design/Theme/Customization.php
@@ -30,31 +30,43 @@ namespace Magento\View\Design\Theme;
 class Customization implements CustomizationInterface
 {
     /**
+     * File provider
+     *
      * @var \Magento\View\Design\Theme\FileProviderInterface
      */
     protected $fileProvider;
 
     /**
+     * Theme customization path
+     *
      * @var \Magento\View\Design\Theme\Customization\Path
      */
     protected $customizationPath;
 
     /**
+     * Theme
+     *
      * @var \Magento\View\Design\ThemeInterface
      */
     protected $theme;
 
     /**
+     * Theme files
+     *
      * @var \Magento\View\Design\Theme\FileInterface[]
      */
     protected $themeFiles;
 
     /**
+     * Theme files by type
+     *
      * @var \Magento\View\Design\Theme\FileInterface[]
      */
     protected $themeFilesByType = array();
 
     /**
+     * Constructor
+     *
      * @param \Magento\View\Design\Theme\FileProviderInterface $fileProvider
      * @param \Magento\View\Design\Theme\Customization\Path $customizationPath
      * @param \Magento\View\Design\ThemeInterface $theme
@@ -149,6 +161,8 @@ class Customization implements CustomizationInterface
     }
 
     /**
+     * Reorder
+     *
      * @param string $type
      * @param array $sequence
      * @return $this|CustomizationInterface
diff --git a/lib/Magento/View/Design/Theme/Customization/AbstractFile.php b/lib/Magento/View/Design/Theme/Customization/AbstractFile.php
index 374d55bba97..b4087ab05b1 100644
--- a/lib/Magento/View/Design/Theme/Customization/AbstractFile.php
+++ b/lib/Magento/View/Design/Theme/Customization/AbstractFile.php
@@ -32,21 +32,29 @@ abstract class AbstractFile
                \Magento\View\Design\Theme\Customization\FileAssetInterface
 {
     /**
+     * Customization path
+     *
      * @var \Magento\View\Design\Theme\Customization\Path
      */
     protected $_customizationPath;
 
     /**
+     * File factory
+     *
      * @var \Magento\View\Design\Theme\FileFactory
      */
     protected $_fileFactory;
 
     /**
+     * File system
+     *
      * @var \Magento\App\Filesystem
      */
     protected $_filesystem;
 
     /**
+     * Constructor
+     *
      * @param \Magento\View\Design\Theme\Customization\Path $customizationPath
      * @param \Magento\View\Design\Theme\FileFactory $fileFactory
      * @param \Magento\App\Filesystem $filesystem
@@ -86,6 +94,8 @@ abstract class AbstractFile
     }
 
     /**
+     * Prepare the file
+     *
      * @param \Magento\View\Design\Theme\FileInterface $file
      * @return $this
      */
@@ -128,6 +138,7 @@ abstract class AbstractFile
      * Prepares filename of file
      *
      * @param \Magento\View\Design\Theme\FileInterface $file
+     * @return void
      */
     protected function _prepareFileName(\Magento\View\Design\Theme\FileInterface $file)
     {
@@ -149,6 +160,7 @@ abstract class AbstractFile
      * Prepares relative path of file
      *
      * @param \Magento\View\Design\Theme\FileInterface $file
+     * @return void
      */
     protected function _prepareFilePath(\Magento\View\Design\Theme\FileInterface $file)
     {
@@ -159,6 +171,7 @@ abstract class AbstractFile
      * Prepares sort order of custom file
      *
      * @param \Magento\View\Design\Theme\FileInterface $file
+     * @return void
      */
     protected function _prepareSortOrder(\Magento\View\Design\Theme\FileInterface $file)
     {
@@ -178,6 +191,7 @@ abstract class AbstractFile
      *
      * @param string $filePath
      * @param string $content
+     * @return void
      */
     protected function _saveFileContent($filePath, $content)
     {
@@ -191,6 +205,7 @@ abstract class AbstractFile
      * Deletes file of customization in filesystem
      *
      * @param string $filePath
+     * @return void
      */
     protected function _deleteFileContent($filePath)
     {
diff --git a/lib/Magento/View/Design/Theme/Customization/File/Css.php b/lib/Magento/View/Design/Theme/Customization/File/Css.php
index 88601a568a3..be7e7d77428 100644
--- a/lib/Magento/View/Design/Theme/Customization/File/Css.php
+++ b/lib/Magento/View/Design/Theme/Customization/File/Css.php
@@ -37,6 +37,8 @@ class Css extends \Magento\View\Design\Theme\Customization\AbstractFile
     /**#@-*/
 
     /**
+     * Get type
+     *
      * @return string
      */
     public function getType()
@@ -45,6 +47,8 @@ class Css extends \Magento\View\Design\Theme\Customization\AbstractFile
     }
 
     /**
+     * Get content type
+     *
      * @return string
      */
     public function getContentType()
diff --git a/lib/Magento/View/Design/Theme/Customization/File/Js.php b/lib/Magento/View/Design/Theme/Customization/File/Js.php
index 6c1f820eca1..8fd251ef3c9 100644
--- a/lib/Magento/View/Design/Theme/Customization/File/Js.php
+++ b/lib/Magento/View/Design/Theme/Customization/File/Js.php
@@ -37,6 +37,8 @@ class Js extends \Magento\View\Design\Theme\Customization\AbstractFile
     /**#@-*/
 
     /**
+     * Get type
+     *
      * @return string
      */
     public function getType()
@@ -45,6 +47,8 @@ class Js extends \Magento\View\Design\Theme\Customization\AbstractFile
     }
 
     /**
+     * Get content type
+     *
      * @return string
      */
     public function getContentType()
diff --git a/lib/Magento/View/Design/Theme/Customization/FileServiceFactory.php b/lib/Magento/View/Design/Theme/Customization/FileServiceFactory.php
index 6b857ea026e..407e469c62e 100644
--- a/lib/Magento/View/Design/Theme/Customization/FileServiceFactory.php
+++ b/lib/Magento/View/Design/Theme/Customization/FileServiceFactory.php
@@ -30,13 +30,17 @@ namespace Magento\View\Design\Theme\Customization;
 class FileServiceFactory
 {
     /**
+     * Object manager
+     *
      * @var \Magento\ObjectManager
      */
     protected $_objectManager;
 
     /**
+     * Constructor
+     *
      * @param \Magento\ObjectManager $objectManager
-     * @param \Magento\View\Design\Theme\Customization\ConfigInterface $config
+     * @param ConfigInterface $config
      */
     public function __construct(\Magento\ObjectManager $objectManager, ConfigInterface $config)
     {
@@ -47,7 +51,7 @@ class FileServiceFactory
     /**
      * Create new instance
      *
-     * @param $type
+     * @param string $type
      * @param array $data
      * @return \Magento\View\Design\Theme\Customization\FileInterface
      * @throws \InvalidArgumentException
diff --git a/lib/Magento/View/Design/Theme/Customization/Path.php b/lib/Magento/View/Design/Theme/Customization/Path.php
index 797af847ad6..fbd38a51b80 100644
--- a/lib/Magento/View/Design/Theme/Customization/Path.php
+++ b/lib/Magento/View/Design/Theme/Customization/Path.php
@@ -38,21 +38,29 @@ class Path
     const DIR_NAME = 'theme_customization';
 
     /**
+     * File name
+     *
      * @var string
      */
     protected $filename;
 
     /**
+     * File system
+     *
      * @var \Magento\App\Filesystem
      */
     protected $filesystem;
 
     /**
+     * Media directory read
+     *
      * @var \Magento\Filesystem\Directory\Read
      */
     protected $mediaDirectoryRead;
 
     /**
+     * Theme directory read
+     *
      * @var \Magento\Filesystem\Directory\Read
      */
     protected $themeDirectoryRead;
@@ -61,7 +69,7 @@ class Path
      * Constructor
      *
      * @param \Magento\App\Filesystem $filesystem
-     * @param $filename
+     * @param string $filename
      */
     public function __construct(
         \Magento\App\Filesystem $filesystem,
diff --git a/lib/Magento/View/Design/Theme/Domain/Factory.php b/lib/Magento/View/Design/Theme/Domain/Factory.php
index d5ffe516bba..2d1fefa3197 100644
--- a/lib/Magento/View/Design/Theme/Domain/Factory.php
+++ b/lib/Magento/View/Design/Theme/Domain/Factory.php
@@ -32,11 +32,15 @@ use \Magento\View\Design\ThemeInterface;
 class Factory
 {
     /**
+     * Object manager
+     *
      * @var \Magento\ObjectManager
      */
     protected $_objectManager;
 
     /**
+     * Types
+     *
      * @var array
      */
     protected $_types = array(
@@ -46,6 +50,8 @@ class Factory
     );
 
     /**
+     * Constructor
+     *
      * @param \Magento\ObjectManager $objectManager
      */
     public function __construct(\Magento\ObjectManager $objectManager)
diff --git a/lib/Magento/View/Design/Theme/File/CollectionInterface.php b/lib/Magento/View/Design/Theme/File/CollectionInterface.php
index 99c5bb62deb..ac8ee88bc6c 100644
--- a/lib/Magento/View/Design/Theme/File/CollectionInterface.php
+++ b/lib/Magento/View/Design/Theme/File/CollectionInterface.php
@@ -29,6 +29,8 @@ namespace Magento\View\Design\Theme\File;
 interface CollectionInterface
 {
     /**
+     * Get items
+     *
      * @return \Magento\View\Design\Theme\FileInterface[]
      */
     public function getItems();
@@ -52,7 +54,7 @@ interface CollectionInterface
     /**
      * Add field filter to collection
      *
-     * @param string|array $field
+     * @param string $field
      * @param null|string|array $condition
      * @return CollectionInterface
      */
diff --git a/lib/Magento/View/Design/Theme/FileFactory.php b/lib/Magento/View/Design/Theme/FileFactory.php
index c83964e9653..7b13b7491e3 100644
--- a/lib/Magento/View/Design/Theme/FileFactory.php
+++ b/lib/Magento/View/Design/Theme/FileFactory.php
@@ -37,6 +37,8 @@ class FileFactory
     protected $_objectManager;
 
     /**
+     * Object manager
+     *
      * @param \Magento\ObjectManager $objectManager
      */
     public function __construct(\Magento\ObjectManager $objectManager)
diff --git a/lib/Magento/View/Design/Theme/FileInterface.php b/lib/Magento/View/Design/Theme/FileInterface.php
index 579b8681d9b..e75db3eedb6 100644
--- a/lib/Magento/View/Design/Theme/FileInterface.php
+++ b/lib/Magento/View/Design/Theme/FileInterface.php
@@ -32,7 +32,7 @@ interface FileInterface
     /**
      * Set customization service model
      *
-     * @param \Magento\View\Design\Theme\Customization\FileInterface $service
+     * @param Customization\FileInterface $service
      * @return $this
      */
     public function setCustomizationService(Customization\FileInterface $service);
diff --git a/lib/Magento/View/Design/Theme/FileProviderInterface.php b/lib/Magento/View/Design/Theme/FileProviderInterface.php
index f1e9a8d495a..bd0349a3974 100644
--- a/lib/Magento/View/Design/Theme/FileProviderInterface.php
+++ b/lib/Magento/View/Design/Theme/FileProviderInterface.php
@@ -29,6 +29,8 @@ namespace Magento\View\Design\Theme;
 interface FileProviderInterface
 {
     /**
+     * Get items
+     *
      * @param \Magento\View\Design\ThemeInterface $theme
      * @param array $filters
      * @return \Magento\View\Design\Theme\FileInterface[]
diff --git a/lib/Magento/View/Design/Theme/FlyweightFactory.php b/lib/Magento/View/Design/Theme/FlyweightFactory.php
index 0fd74a19098..df73e4f45c0 100644
--- a/lib/Magento/View/Design/Theme/FlyweightFactory.php
+++ b/lib/Magento/View/Design/Theme/FlyweightFactory.php
@@ -30,21 +30,29 @@ namespace Magento\View\Design\Theme;
 class FlyweightFactory
 {
     /**
+     * Theme provider
+     *
      * @var ThemeProviderInterface
      */
     protected $themeProvider;
 
     /**
+     * Themes
+     *
      * @var \Magento\View\Design\ThemeInterface[]
      */
     protected $themes = array();
 
     /**
+     * Themes by path
+     *
      * @var \Magento\View\Design\ThemeInterface[]
      */
     protected $themesByPath = array();
 
     /**
+     * Constructor
+     *
      * @param ThemeProviderInterface $themeProvider
      */
     public function __construct(
@@ -113,7 +121,7 @@ class FlyweightFactory
      * Add theme to shared collection
      *
      * @param \Magento\View\Design\ThemeInterface $themeModel
-     * @return FlyweightFactory
+     * @return $this
      */
     protected function _addTheme(\Magento\View\Design\ThemeInterface $themeModel)
     {
diff --git a/lib/Magento/View/Design/Theme/Image.php b/lib/Magento/View/Design/Theme/Image.php
index 404a4ce1d23..ef3452c5299 100644
--- a/lib/Magento/View/Design/Theme/Image.php
+++ b/lib/Magento/View/Design/Theme/Image.php
@@ -42,31 +42,43 @@ class Image
     const PREVIEW_IMAGE_HEIGHT = 800;
 
     /**
+     * Image factory
+     *
      * @var \Magento\Image\Factory
      */
     protected $_imageFactory;
 
     /**
+     * Image uploader
+     *
      * @var Image\Uploader
      */
     protected $_uploader;
 
     /**
+     * Theme image path
+     *
      * @var Image\PathInterface
      */
     protected $_themeImagePath;
 
     /**
+     * Logger
+     *
      * @var \Magento\Logger
      */
     protected $_logger;
 
     /**
+     * Theme
+     *
      * @var \Magento\View\Design\ThemeInterface
      */
     protected $_theme;
 
     /**
+     * Media directory
+     *
      * @var WriteInterface
      */
     protected $_mediaDirectory;
@@ -101,7 +113,7 @@ class Image
      * Create preview image
      *
      * @param string $imagePath
-     * @return Image
+     * @return $this
      */
     public function createPreviewImage($imagePath)
     {
@@ -170,7 +182,7 @@ class Image
      * Upload and create preview image
      *
      * @param string $scope the request key for file
-     * @return Image
+     * @return $this
      */
     public function uploadPreviewImage($scope)
     {
diff --git a/lib/Magento/View/Design/Theme/Image/Uploader.php b/lib/Magento/View/Design/Theme/Image/Uploader.php
index 1d642f9701f..d7c912c57f9 100644
--- a/lib/Magento/View/Design/Theme/Image/Uploader.php
+++ b/lib/Magento/View/Design/Theme/Image/Uploader.php
@@ -37,21 +37,29 @@ class Uploader
     protected  $_allowedExtensions = array('jpg', 'jpeg', 'gif', 'png', 'xbm', 'wbmp');
 
     /**
+     * File system
+     *
      * @var \Magento\App\Filesystem
      */
     protected $_filesystem;
 
     /**
+     * Transfer adapter
+     *
      * @var \Zend_File_Transfer_Adapter_Http
      */
     protected $_transferAdapter;
 
     /**
+     * Uploader factory
+     *
      * @var \Magento\File\UploaderFactory
      */
     protected $_uploaderFactory;
 
     /**
+     * Constructor
+     *
      * @param \Magento\App\Filesystem $filesystem
      * @param \Magento\HTTP\Adapter\FileTransferFactory $adapterFactory
      * @param \Magento\File\UploaderFactory $uploaderFactory
diff --git a/lib/Magento/View/Design/Theme/ImageFactory.php b/lib/Magento/View/Design/Theme/ImageFactory.php
index 2ccf22100bb..6ea13c7b1d5 100644
--- a/lib/Magento/View/Design/Theme/ImageFactory.php
+++ b/lib/Magento/View/Design/Theme/ImageFactory.php
@@ -44,6 +44,8 @@ class ImageFactory
     protected $_instanceName;
 
     /**
+     * Constructor
+     *
      * @param \Magento\ObjectManager $objectManager
      * @param string $instanceName
      */
diff --git a/lib/Magento/View/Design/Theme/Label.php b/lib/Magento/View/Design/Theme/Label.php
index 74af00aad7e..0a4d3f7d081 100644
--- a/lib/Magento/View/Design/Theme/Label.php
+++ b/lib/Magento/View/Design/Theme/Label.php
@@ -37,6 +37,8 @@ class Label
     protected $_labelsCollection;
 
     /**
+     * Constructor
+     *
      * @param \Magento\View\Design\Theme\Label\ListInterface $labelList
      */
     public function __construct(\Magento\View\Design\Theme\Label\ListInterface $labelList)
diff --git a/lib/Magento/View/Design/Theme/ThemeProviderInterface.php b/lib/Magento/View/Design/Theme/ThemeProviderInterface.php
index 92712546d52..5870045b215 100644
--- a/lib/Magento/View/Design/Theme/ThemeProviderInterface.php
+++ b/lib/Magento/View/Design/Theme/ThemeProviderInterface.php
@@ -46,6 +46,8 @@ interface ThemeProviderInterface
     public function getThemeCustomizations($area, $type = \Magento\View\Design\ThemeInterface::TYPE_VIRTUAL);
 
     /**
+     * Get theme by id
+     *
      * @param int $themeId
      * @return \Magento\View\Design\ThemeInterface
      */
diff --git a/lib/Magento/View/Design/Theme/Validator.php b/lib/Magento/View/Design/Theme/Validator.php
index 782401b0762..db446a27855 100644
--- a/lib/Magento/View/Design/Theme/Validator.php
+++ b/lib/Magento/View/Design/Theme/Validator.php
@@ -30,7 +30,6 @@ class Validator
 {
     /**
      * Validators list by data key
-     *
      * array('dataKey' => array('validator_name' => [validators], ...), ...)
      *
      * @var array
@@ -39,7 +38,6 @@ class Validator
 
     /**
      * List of errors after validation process
-     *
      * array('dataKey' => 'Error message')
      *
      * @var array
@@ -59,7 +57,7 @@ class Validator
     /**
      * Set version validators
      *
-     * @return Validator
+     * @return $this
      */
     protected function _setVersionValidators()
     {
@@ -79,7 +77,7 @@ class Validator
     /**
      * Set title validators
      *
-     * @return Validator
+     * @return $this
      */
     protected function _setTitleValidators()
     {
@@ -100,7 +98,7 @@ class Validator
     /**
      * Set theme type validators
      *
-     * @return Validator
+     * @return $this
      */
     protected function _setTypeValidators()
     {
@@ -137,7 +135,7 @@ class Validator
      *
      * @param string $dataKey
      * @param array $validators
-     * @return Validator
+     * @return $this
      */
     public function addDataValidators($dataKey, $validators)
     {
@@ -167,8 +165,8 @@ class Validator
     /**
      * Instantiate class validator
      *
-     * @param array $validators
-     * @return Validator
+     * @param array &$validators
+     * @return $this
      */
     protected function _instantiateValidators(array &$validators)
     {
diff --git a/lib/Magento/View/Design/ThemeFactory.php b/lib/Magento/View/Design/ThemeFactory.php
index 1f7f8ed51ef..6f63c03f5af 100644
--- a/lib/Magento/View/Design/ThemeFactory.php
+++ b/lib/Magento/View/Design/ThemeFactory.php
@@ -34,11 +34,15 @@ use Magento\ObjectManager;
 class ThemeFactory
 {
     /**
+     * Object manager
+     *
      * @var ObjectManager
      */
     protected $objectManager;
 
     /**
+     * Constructor
+     *
      * @param ObjectManager $objectManager
      */
     public function __construct(ObjectManager $objectManager)
@@ -47,8 +51,10 @@ class ThemeFactory
     }
 
     /**
+     * Get theme
+     *
      * @param int $themeId
-     * @return \Magento\View\Design\ThemeInterface
+     * @return null|\Magento\View\Design\ThemeInterface
      * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
     public function getTheme($themeId)
diff --git a/lib/Magento/View/Design/ThemeInterface.php b/lib/Magento/View/Design/ThemeInterface.php
index e7376c6d9e5..1790244ca5c 100644
--- a/lib/Magento/View/Design/ThemeInterface.php
+++ b/lib/Magento/View/Design/ThemeInterface.php
@@ -100,8 +100,9 @@ interface ThemeInterface
 
     /**
      * Return the full theme inheritance sequence, from the root theme till a specified one
+     * Format: array([<root_theme>, ..., <parent_theme>,] <current_theme>)
      *
-     * @return ThemeInterface[] Format: array([<root_theme>, ..., <parent_theme>,] <current_theme>)
+     * @return ThemeInterface[]
      */
     public function getInheritedThemes();
 
diff --git a/lib/Magento/View/DesignInterface.php b/lib/Magento/View/DesignInterface.php
index f23e9e445c0..32fb8110e9e 100644
--- a/lib/Magento/View/DesignInterface.php
+++ b/lib/Magento/View/DesignInterface.php
@@ -42,9 +42,9 @@ interface DesignInterface
     /**
      * Set package area
      *
-     * @deprecated
      * @param string $area
      * @return DesignInterface
+     * @deprecated
      */
     public function setArea($area);
 
@@ -59,7 +59,7 @@ interface DesignInterface
      * Set theme path
      *
      * @param Design\ThemeInterface|int|string $theme
-     * @param string $area
+     * @param string|null $area
      * @return DesignInterface
      */
     public function setDesignTheme($theme, $area = null);
@@ -67,7 +67,7 @@ interface DesignInterface
     /**
      * Get default theme which declared in configuration
      *
-     * @param string $area
+     * @param string|null $area
      * @param array $params
      * @return string
      */
diff --git a/lib/Magento/View/DesignLoader.php b/lib/Magento/View/DesignLoader.php
index d5065a4b3d0..e2ca77e96e4 100644
--- a/lib/Magento/View/DesignLoader.php
+++ b/lib/Magento/View/DesignLoader.php
@@ -27,21 +27,29 @@ namespace Magento\View;
 class DesignLoader
 {
     /**
+     * Request
+     *
      * @var \Magento\App\RequestInterface
      */
     protected $_request;
 
     /**
+     * Application
+     *
      * @var \Magento\Core\Model\App
      */
     protected $_app;
 
     /**
+     * Layout
+     *
      * @var \Magento\View\LayoutInterface
      */
     protected $_layout;
 
     /**
+     * Constructor
+     *
      * @param \Magento\App\RequestInterface $request
      * @param \Magento\Core\Model\App $app
      * @param \Magento\View\LayoutInterface $layout
@@ -58,6 +66,8 @@ class DesignLoader
 
     /**
      * Load design
+     *
+     * @return void
      */
     public function load()
     {
diff --git a/lib/Magento/View/Element/AbstractBlock.php b/lib/Magento/View/Element/AbstractBlock.php
index 214d5c6ab34..e334749e399 100644
--- a/lib/Magento/View/Element/AbstractBlock.php
+++ b/lib/Magento/View/Element/AbstractBlock.php
@@ -43,21 +43,29 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface
     const CACHE_GROUP = \Magento\App\Cache\Type\Block::TYPE_IDENTIFIER;
 
     /**
+     * Design
+     *
      * @var \Magento\View\DesignInterface
      */
     protected $_design;
 
     /**
+     * Session
+     *
      * @var \Magento\Session\SessionManagerInterface
      */
     protected $_session;
 
     /**
+     * SID Resolver
+     *
      * @var \Magento\Session\SidResolverInterface
      */
     protected $_sidResolver;
 
     /**
+     * Translator
+     *
      * @var \Magento\TranslateInterface
      */
     protected $_translator;
@@ -77,6 +85,8 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface
     protected $_layout;
 
     /**
+     * Request
+     *
      * @var \Magento\App\RequestInterface
      */
     protected $_request;
@@ -104,6 +114,8 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface
     protected $_frontController;
 
     /**
+     * View URL
+     *
      * @var \Magento\View\Url
      */
     protected $_viewUrl;
@@ -116,31 +128,43 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface
     protected $_viewConfig;
 
     /**
+     * Cache State
+     *
      * @var \Magento\App\Cache\StateInterface
      */
     protected $_cacheState;
 
     /**
+     * Logger
+     *
      * @var \Magento\Logger
      */
     protected $_logger;
 
     /**
+     * Application
+     *
      * @var \Magento\Core\Model\App
      */
     protected $_app;
 
     /**
+     * Escaper
+     *
      * @var \Magento\Escaper
      */
     protected $_escaper;
 
     /**
+     * Filter manager
+     *
      * @var \Magento\Filter\FilterManager
      */
     protected $filterManager;
 
     /**
+     * Locale
+     *
      * @var \Magento\Core\Model\LocaleInterface
      */
     protected $_locale;
@@ -154,6 +178,8 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface
     protected $_isScopePrivate;
 
     /**
+     * Constructor
+     *
      * @param \Magento\View\Element\Context $context
      * @param array $data
      */
@@ -184,6 +210,8 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface
     }
 
     /**
+     * Get request
+     *
      * @return \Magento\App\RequestInterface
      */
     public function getRequest()
@@ -195,6 +223,8 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface
      * Internal constructor, that is called from real constructor
      *
      * Please override this one instead of overriding real __construct constructor
+     *
+     * @return void
      */
     protected function _construct()
     {
@@ -225,7 +255,7 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface
      * Set layout object
      *
      * @param   \Magento\View\LayoutInterface $layout
-     * @return  \Magento\View\Element\AbstractBlock
+     * @return  $this
      */
     public function setLayout(\Magento\View\LayoutInterface $layout)
     {
@@ -239,7 +269,7 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface
      *
      * You can redefine this method in child classes for changing layout
      *
-     * @return \Magento\View\Element\AbstractBlock
+     * @return $this
      */
     protected function _prepareLayout()
     {
@@ -260,7 +290,7 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface
      * Sets/changes name of a block in layout
      *
      * @param string $name
-     * @return \Magento\View\Element\AbstractBlock
+     * @return $this
      */
     public function setNameInLayout($name)
     {
@@ -296,7 +326,7 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface
      *
      * @param   string $name
      * @param   mixed $value
-     * @return  \Magento\View\Element\AbstractBlock
+     * @return  $this
      */
     public function setAttribute($name, $value = null)
     {
@@ -308,7 +338,7 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface
      *
      * @param   string $alias
      * @param   \Magento\View\Element\AbstractBlock|string $block
-     * @return  \Magento\View\Element\AbstractBlock
+     * @return  $this
      */
     public function setChild($alias, $block)
     {
@@ -335,7 +365,7 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface
      * @param string $alias
      * @param string $block
      * @param array $data
-     * @return \Magento\View\Element\AbstractBlock new block
+     * @return $this new block
      */
     public function addChild($alias, $block, $data = array())
     {
@@ -350,7 +380,7 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface
      * Unset child block
      *
      * @param  string $alias
-     * @return \Magento\View\Element\AbstractBlock
+     * @return $this
      */
     public function unsetChild($alias)
     {
@@ -365,7 +395,7 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface
     /**
      * Call a child and unset it, if callback matched result
      *
-     * $params will pass to child callback
+     * Variable $params will pass to child callback
      * $params may be array, if called from layout with elements with same name, for example:
      * ...<foo>value_1</foo><foo>value_2</foo><foo>value_3</foo>
      *
@@ -379,7 +409,7 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface
      * @param string $callback
      * @param mixed $result
      * @param array $params
-     * @return \Magento\View\Element\AbstractBlock
+     * @return $this
      */
     public function unsetCallChild($alias, $callback, $result, $params)
     {
@@ -403,7 +433,7 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface
     /**
      * Unset all children blocks
      *
-     * @return \Magento\View\Element\AbstractBlock
+     * @return $this
      */
     public function unsetChildren()
     {
@@ -521,7 +551,7 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface
      * @param string|int|null $siblingName
      * @param bool $after
      * @param string $alias
-     * @return \Magento\View\Element\AbstractBlock|bool
+     * @return $this|bool
      */
     public function insert($element, $siblingName = 0, $after = true, $alias = '')
     {
@@ -544,7 +574,7 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface
      *
      * @param \Magento\View\Element\AbstractBlock|string $element
      * @param string $alias
-     * @return \Magento\View\Element\AbstractBlock
+     * @return $this
      */
     public function append($element, $alias = '')
     {
@@ -585,7 +615,7 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface
     /**
      * Before rendering html, but after trying to load cache
      *
-     * @return \Magento\View\Element\AbstractBlock
+     * @return $this
      */
     protected function _beforeToHtml()
     {
@@ -691,8 +721,8 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface
      * @param string $file path to file in theme
      * @param array $params
      * @return string
-     * @throws \Magento\Exception
      */
+
     public function getViewFileUrl($file = null, array $params = array())
     {
         try {
@@ -773,7 +803,7 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface
      * Escape html entities
      *
      * @param   string|array $data
-     * @param   array $allowedTags
+     * @param   array|null $allowedTags
      * @return  string
      */
     public function escapeHtml($data, $allowedTags = null)
@@ -785,7 +815,7 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface
      * Wrapper for standard strip_tags() function with extra functionality for html entities
      *
      * @param string $data
-     * @param string $allowableTags
+     * @param string|null $allowableTags
      * @param bool $allowHtmlEntities
      * @return string
      */
@@ -825,9 +855,9 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface
     /**
      * Escape quotes in java scripts
      *
-     * @param mixed $data
+     * @param string|array $data
      * @param string $quote
-     * @return mixed
+     * @return string|array
      */
     public function escapeJsQuote($data, $quote = '\'')
     {
@@ -849,7 +879,7 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface
      *
      * Provide string array key to share specific info item with FPC placeholder
      *
-     * @return array
+     * @return string[]
      */
     public function getCacheKeyInfo()
     {
@@ -912,7 +942,7 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface
     /**
      * Load block html from cache storage
      *
-     * @return string | false
+     * @return string|false
      */
     protected function _loadCache()
     {
@@ -935,7 +965,7 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface
      * Save block content to cache storage
      *
      * @param string $data
-     * @return \Magento\View\Element\AbstractBlock
+     * @return $this
      */
     protected function _saveCache($data)
     {
@@ -974,7 +1004,7 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface
      * Module name can be omitted. If omitted, it will be determined automatically.
      *
      * @param string $name variable name
-     * @param string $module optional module name
+     * @param string|null $module optional module name
      * @return string|false
      */
     public function getVar($name, $module = null)
diff --git a/lib/Magento/View/Element/BlockFactory.php b/lib/Magento/View/Element/BlockFactory.php
index 2f5238f6ced..413269f0b6b 100644
--- a/lib/Magento/View/Element/BlockFactory.php
+++ b/lib/Magento/View/Element/BlockFactory.php
@@ -32,11 +32,15 @@ use Magento\ObjectManager;
 class BlockFactory
 {
     /**
+     * Object manager
+     *
      * @var ObjectManager
      */
     protected $objectManager;
 
     /**
+     * Constructor
+     *
      * @param ObjectManager $objectManager
      */
     public function __construct(ObjectManager $objectManager)
@@ -45,9 +49,11 @@ class BlockFactory
     }
 
     /**
+     * Create block
+     *
      * @param string $blockName
      * @param array $arguments
-     * @return mixed
+     * @return \Magento\View\Element\BlockInterface
      * @throws \LogicException
      */
     public function createBlock($blockName, array $arguments = array())
diff --git a/lib/Magento/View/Element/Context.php b/lib/Magento/View/Element/Context.php
index 99b0f8cef9f..1d52aaffeb0 100644
--- a/lib/Magento/View/Element/Context.php
+++ b/lib/Magento/View/Element/Context.php
@@ -36,61 +36,85 @@ namespace Magento\View\Element;
 class Context implements \Magento\ObjectManager\ContextInterface
 {
     /**
+     * Request
+     *
      * @var \Magento\App\RequestInterface
      */
     protected $_request;
 
     /**
+     * Layout
+     *
      * @var \Magento\View\LayoutInterface
      */
     protected $_layout;
 
     /**
+     * Event manager
+     *
      * @var \Magento\Event\ManagerInterface
      */
     protected $_eventManager;
 
     /**
+     * URL builder
+     *
      * @var \Magento\UrlInterface
      */
     protected $_urlBuilder;
 
     /**
+     * Translator
+     *
      * @var \Magento\TranslateInterface
      */
     protected $_translator;
 
     /**
+     * Cache
+     *
      * @var \Magento\App\CacheInterface
      */
     protected $_cache;
 
     /**
+     * Design
+     *
      * @var \Magento\View\DesignInterface
      */
     protected $_design;
 
     /**
+     * Session
+     *
      * @var \Magento\Session\SessionManagerInterface
      */
     protected $_session;
 
     /**
+     * SID Resolver
+     *
      * @var \Magento\Session\SidResolverInterface
      */
     protected $_sidResolver;
 
     /**
+     * Store config
+     *
      * @var \Magento\Core\Model\Store\Config
      */
     protected $_storeConfig;
 
     /**
+     * Front controller
+     *
      * @var \Magento\App\FrontController
      */
     protected $_frontController;
 
     /**
+     * View URL
+     *
      * @var \Magento\View\Url
      */
     protected $_viewUrl;
@@ -103,36 +127,50 @@ class Context implements \Magento\ObjectManager\ContextInterface
     protected $_viewConfig;
 
     /**
+     * Cache state
+     *
      * @var \Magento\App\Cache\StateInterface
      */
     protected $_cacheState;
 
     /**
+     * Logger
+     *
      * @var \Magento\Logger
      */
     protected $_logger;
 
     /**
+     * Application
+     *
      * @var \Magento\Core\Model\App
      */
     protected $_app;
 
     /**
+     * Escaper
+     *
      * @var \Magento\Escaper
      */
     protected $_escaper;
 
     /**
+     * Filter manager
+     *
      * @var \Magento\Filter\FilterManager
      */
     protected $_filterManager;
 
     /**
+     * Locale
+     *
      * @var \Magento\Core\Model\LocaleInterface
      */
     protected $_locale;
 
     /**
+     * Constructor
+     *
      * @param \Magento\App\RequestInterface $request
      * @param \Magento\View\LayoutInterface $layout
      * @param \Magento\Event\ManagerInterface $eventManager
@@ -201,6 +239,8 @@ class Context implements \Magento\ObjectManager\ContextInterface
     }
 
     /**
+     * Get cache
+     *
      * @return \Magento\App\CacheInterface
      */
     public function getCache()
@@ -209,6 +249,8 @@ class Context implements \Magento\ObjectManager\ContextInterface
     }
 
     /**
+     * Get design package
+     *
      * @return \Magento\View\DesignInterface
      */
     public function getDesignPackage()
@@ -217,6 +259,8 @@ class Context implements \Magento\ObjectManager\ContextInterface
     }
 
     /**
+     * Get event manager
+     *
      * @return \Magento\Event\ManagerInterface
      */
     public function getEventManager()
@@ -225,6 +269,8 @@ class Context implements \Magento\ObjectManager\ContextInterface
     }
 
     /**
+     * Get front controller
+     *
      * @return \Magento\App\FrontController
      */
     public function getFrontController()
@@ -233,6 +279,8 @@ class Context implements \Magento\ObjectManager\ContextInterface
     }
 
     /**
+     * Get layout
+     *
      * @return \Magento\View\LayoutInterface
      */
     public function getLayout()
@@ -241,6 +289,8 @@ class Context implements \Magento\ObjectManager\ContextInterface
     }
 
     /**
+     * Get request
+     *
      * @return \Magento\App\RequestInterface
      */
     public function getRequest()
@@ -249,6 +299,8 @@ class Context implements \Magento\ObjectManager\ContextInterface
     }
 
     /**
+     * Get session
+     *
      * @return \Magento\Session\SessionManagerInterface
      */
     public function getSession()
@@ -257,6 +309,8 @@ class Context implements \Magento\ObjectManager\ContextInterface
     }
 
     /**
+     * Get SID resolver
+     *
      * @return \Magento\Session\SidResolverInterface
      */
     public function getSidResolver()
@@ -265,6 +319,8 @@ class Context implements \Magento\ObjectManager\ContextInterface
     }
 
     /**
+     * Get store config
+     *
      * @return \Magento\Core\Model\Store\Config
      */
     public function getStoreConfig()
@@ -273,6 +329,8 @@ class Context implements \Magento\ObjectManager\ContextInterface
     }
 
     /**
+     * Get translator
+     *
      * @return \Magento\TranslateInterface
      */
     public function getTranslator()
@@ -281,6 +339,8 @@ class Context implements \Magento\ObjectManager\ContextInterface
     }
 
     /**
+     * Get URL builder
+     *
      * @return \Magento\UrlInterface
      */
     public function getUrlBuilder()
@@ -289,6 +349,8 @@ class Context implements \Magento\ObjectManager\ContextInterface
     }
 
     /**
+     * Get view URL
+     *
      * @return \Magento\View\Url
      */
     public function getViewUrl()
@@ -297,6 +359,8 @@ class Context implements \Magento\ObjectManager\ContextInterface
     }
 
     /**
+     * Get view config
+     *
      * @return \Magento\View\ConfigInterface
      */
     public function getViewConfig()
@@ -305,6 +369,8 @@ class Context implements \Magento\ObjectManager\ContextInterface
     }
 
     /**
+     * Get cache state
+     *
      * @return \Magento\App\Cache\StateInterface
      */
     public function getCacheState()
@@ -313,6 +379,8 @@ class Context implements \Magento\ObjectManager\ContextInterface
     }
 
     /**
+     * Get logger
+     *
      * @return \Magento\Logger
      */
     public function getLogger()
@@ -321,6 +389,8 @@ class Context implements \Magento\ObjectManager\ContextInterface
     }
 
     /**
+     * Get application
+     *
      * @return \Magento\Core\Model\App
      */
     public function getApp()
@@ -329,6 +399,8 @@ class Context implements \Magento\ObjectManager\ContextInterface
     }
 
     /**
+     * Get escaper
+     *
      * @return \Magento\Escaper
      */
     public function getEscaper()
@@ -337,6 +409,8 @@ class Context implements \Magento\ObjectManager\ContextInterface
     }
 
     /**
+     * Get filter manager
+     *
      * @return \Magento\Filter\FilterManager
      */
     public function getFilterManager()
@@ -345,6 +419,8 @@ class Context implements \Magento\ObjectManager\ContextInterface
     }
 
     /**
+     * Get locale
+     *
      * @return \Magento\Core\Model\LocaleInterface
      */
     public function getLocale()
diff --git a/lib/Magento/View/Element/Html/Calendar.php b/lib/Magento/View/Element/Html/Calendar.php
index f5413246a8e..a6b50b29f12 100644
--- a/lib/Magento/View/Element/Html/Calendar.php
+++ b/lib/Magento/View/Element/Html/Calendar.php
@@ -39,11 +39,15 @@ class Calendar extends \Magento\View\Element\Template
     protected $_date;
 
     /**
+     * JSON Encoder
+     *
      * @var \Magento\Json\EncoderInterface
      */
     protected $encoder;
 
     /**
+     * Constructor
+     *
      * @param \Magento\View\Element\Template\Context $context
      * @param \Magento\Core\Model\Date $date
      * @param \Magento\Json\EncoderInterface $encoder
@@ -124,7 +128,7 @@ class Calendar extends \Magento\View\Element\Template
     /**
      * Return offset of current timezone with GMT in seconds
      *
-     * @return integer
+     * @return int
      */
     public function getTimezoneOffsetSeconds()
     {
@@ -134,7 +138,7 @@ class Calendar extends \Magento\View\Element\Template
     /**
      * Getter for store timestamp based on store timezone settings
      *
-     * @param mixed $store
+     * @param null|string|bool|int|\Magento\Core\Model\Store $store
      * @return int
      */
     public function getStoreTimestamp($store = null)
diff --git a/lib/Magento/View/Element/Html/Link.php b/lib/Magento/View/Element/Html/Link.php
index 4dc08275d18..af4f3b511c0 100644
--- a/lib/Magento/View/Element/Html/Link.php
+++ b/lib/Magento/View/Element/Html/Link.php
@@ -65,7 +65,7 @@ class Link extends \Magento\View\Element\Template
     }
 
     /**
-     * serialize attributes
+     * Serialize attributes
      *
      * @param   array $attributes
      * @param   string $valueSeparator
@@ -98,6 +98,8 @@ class Link extends \Magento\View\Element\Template
     }
 
     /**
+     * Get href URL
+     *
      * @return string
      */
     public function getHref()
diff --git a/lib/Magento/View/Element/Html/Link/Current.php b/lib/Magento/View/Element/Html/Link/Current.php
index 68e9df33a1d..60d614795f5 100644
--- a/lib/Magento/View/Element/Html/Link/Current.php
+++ b/lib/Magento/View/Element/Html/Link/Current.php
@@ -44,6 +44,8 @@ class Current extends \Magento\View\Element\Template
     protected $_defaultPath;
 
     /**
+     * Constructor
+     *
      * @param \Magento\View\Element\Template\Context $context
      * @param \Magento\App\DefaultPathInterface $defaultPath
      * @param array $data
@@ -59,6 +61,8 @@ class Current extends \Magento\View\Element\Template
 
 
     /**
+     * Get href URL
+     *
      * @return string
      */
     public function getHref()
diff --git a/lib/Magento/View/Element/Html/Links.php b/lib/Magento/View/Element/Html/Links.php
index 84bd50ff3f4..484b476c88b 100644
--- a/lib/Magento/View/Element/Html/Links.php
+++ b/lib/Magento/View/Element/Html/Links.php
@@ -30,6 +30,8 @@ namespace Magento\View\Element\Html;
 class Links extends \Magento\View\Element\Template
 {
     /**
+     * Get links
+     *
      * @return \Magento\View\Element\Html\Link[]
      */
     public function getLinks()
diff --git a/lib/Magento/View/Element/Html/Select.php b/lib/Magento/View/Element/Html/Select.php
index 2f1cbbb68ef..5881c8de955 100644
--- a/lib/Magento/View/Element/Html/Select.php
+++ b/lib/Magento/View/Element/Html/Select.php
@@ -30,6 +30,8 @@ namespace Magento\View\Element\Html;
 class Select extends \Magento\View\Element\AbstractBlock
 {
     /**
+     * Options
+     *
      * @var array
      */
     protected $_options = array();
@@ -48,7 +50,7 @@ class Select extends \Magento\View\Element\AbstractBlock
      * Set options for the HTML select
      *
      * @param array $options
-     * @return Select
+     * @return $this
      */
     public function setOptions($options)
     {
@@ -62,7 +64,7 @@ class Select extends \Magento\View\Element\AbstractBlock
      * @param string $value  HTML value
      * @param string $label  HTML label
      * @param array  $params HTML attributes
-     * @return Select
+     * @return $this
      */
     public function addOption($value, $label, $params = array())
     {
@@ -74,7 +76,7 @@ class Select extends \Magento\View\Element\AbstractBlock
      * Set element's HTML ID
      *
      * @param string $elementId ID
-     * @return Select
+     * @return $this
      */
     public function setId($elementId)
     {
@@ -86,7 +88,7 @@ class Select extends \Magento\View\Element\AbstractBlock
      * Set element's CSS class
      *
      * @param string $class Class
-     * @return Select
+     * @return $this
      */
     public function setClass($class)
     {
@@ -98,7 +100,7 @@ class Select extends \Magento\View\Element\AbstractBlock
      * Set element's HTML title
      *
      * @param string $title Title
-     * @return Select
+     * @return $this
      */
     public function setTitle($title)
     {
diff --git a/lib/Magento/View/Element/Js/Components.php b/lib/Magento/View/Element/Js/Components.php
index 13b1135fa4f..aa5239e7865 100644
--- a/lib/Magento/View/Element/Js/Components.php
+++ b/lib/Magento/View/Element/Js/Components.php
@@ -30,6 +30,8 @@ use Magento\View\Element\Template;
 class Components extends Template
 {
     /**
+     * Developer mode
+     *
      * @return bool
      */
     public function isDeveloperMode()
diff --git a/lib/Magento/View/Element/Js/Cookie.php b/lib/Magento/View/Element/Js/Cookie.php
index ad3c5785b5d..7d92c5207d3 100644
--- a/lib/Magento/View/Element/Js/Cookie.php
+++ b/lib/Magento/View/Element/Js/Cookie.php
@@ -31,11 +31,15 @@ use Magento\View\Element\Template\Context;
 class Cookie extends Template
 {
     /**
+     * Session config
+     *
      * @var ConfigInterface
      */
     protected $sessionConfig;
 
     /**
+     * Constructor
+     *
      * @param Context $context
      * @param ConfigInterface $cookieConfig
      * @param array $data
diff --git a/lib/Magento/View/Element/Messages.php b/lib/Magento/View/Element/Messages.php
index 5b5d19a6ec6..b479de60b9e 100644
--- a/lib/Magento/View/Element/Messages.php
+++ b/lib/Magento/View/Element/Messages.php
@@ -67,7 +67,7 @@ class Messages extends Template
     /**
      * Grouped message types
      *
-     * @var array
+     * @var string[]
      */
     protected $messageTypes = array(
         \Magento\Message\MessageInterface::TYPE_ERROR,
@@ -91,12 +91,16 @@ class Messages extends Template
     protected $collectionFactory;
 
     /**
+     * Message manager
+     *
      * @var \Magento\Message\ManagerInterface
      */
     protected $messageManager;
     
     /**
-     * @param \Magento\View\Element\Template\Context $context
+     * Constructor
+     *
+     * @param Template\Context $context
      * @param \Magento\Message\Factory $messageFactory
      * @param \Magento\Message\CollectionFactory $collectionFactory
      * @param \Magento\Message\ManagerInterface $messageManager
@@ -118,7 +122,7 @@ class Messages extends Template
     /**
      * Preparing global layout
      *
-     * @return \Magento\View\Element\Messages
+     * @return $this
      */
     protected function _prepareLayout()
     {
@@ -132,7 +136,7 @@ class Messages extends Template
      * Set messages collection
      *
      * @param   \Magento\Message\Collection $messages
-     * @return  \Magento\View\Element\Messages
+     * @return  $this
      */
     public function setMessages(\Magento\Message\Collection $messages)
     {
@@ -144,7 +148,7 @@ class Messages extends Template
      * Add messages to display
      *
      * @param \Magento\Message\Collection $messages
-     * @return \Magento\View\Element\Messages
+     * @return $this
      */
     public function addMessages(\Magento\Message\Collection $messages)
     {
@@ -171,7 +175,7 @@ class Messages extends Template
      * Adding new message to message collection
      *
      * @param   \Magento\Message\AbstractMessage $message
-     * @return  \Magento\View\Element\Messages
+     * @return  $this
      */
     public function addMessage(\Magento\Message\AbstractMessage $message)
     {
@@ -183,7 +187,7 @@ class Messages extends Template
      * Adding new error message
      *
      * @param   string $message
-     * @return  \Magento\View\Element\Messages
+     * @return  $this
      */
     public function addError($message)
     {
@@ -195,7 +199,7 @@ class Messages extends Template
      * Adding new warning message
      *
      * @param   string $message
-     * @return  \Magento\View\Element\Messages
+     * @return  $this
      */
     public function addWarning($message)
     {
@@ -207,7 +211,7 @@ class Messages extends Template
      * Adding new notice message
      *
      * @param   string $message
-     * @return  \Magento\View\Element\Messages
+     * @return  $this
      */
     public function addNotice($message)
     {
@@ -219,7 +223,7 @@ class Messages extends Template
      * Adding new success message
      *
      * @param   string $message
-     * @return  \Magento\View\Element\Messages
+     * @return  $this
      */
     public function addSuccess($message)
     {
@@ -263,7 +267,8 @@ class Messages extends Template
     /**
      * Dispatch render after event
      *
-     * @param $html
+     * @param null|string|array|\Magento\Object &$html
+     * @return void
      */
     protected function _dispatchRenderGroupedAfterEvent(&$html)
     {
@@ -329,6 +334,7 @@ class Messages extends Template
      * Set messages first level html tag name for output messages as html
      *
      * @param string $tagName
+     * @return void
      */
     public function setFirstLevelTagName($tagName)
     {
@@ -339,6 +345,7 @@ class Messages extends Template
      * Set messages first level html tag name for output messages as html
      *
      * @param string $tagName
+     * @return void
      */
     public function setSecondLevelTagName($tagName)
     {
@@ -361,6 +368,7 @@ class Messages extends Template
      * Add used storage type
      *
      * @param string $type
+     * @return void
      */
     public function addStorageType($type)
     {
diff --git a/lib/Magento/View/Element/Redirect.php b/lib/Magento/View/Element/Redirect.php
index 6d712c0bc75..bc3893eb20f 100644
--- a/lib/Magento/View/Element/Redirect.php
+++ b/lib/Magento/View/Element/Redirect.php
@@ -31,16 +31,22 @@ class Redirect extends Template
 {
     /**
      *  HTML form hidden fields
+     *
+     * @var array
      */
     protected $formFields = array();
 
     /**
+     * Form factory
+     *
      * @var \Magento\Data\FormFactory
      */
     protected $formFactory;
 
     /**
-     * @param \Magento\View\Element\Template\Context $context
+     * Constructor
+     *
+     * @param Template\Context $context
      * @param \Magento\Data\FormFactory $formFactory
      * @param array $data
      */
@@ -125,7 +131,7 @@ class Redirect extends Template
     /**
      * HTML form or JS redirect
      *
-     * @return boolean
+     * @return bool
      */
     public function isHtmlFormRedirect()
     {
diff --git a/lib/Magento/View/Element/Template.php b/lib/Magento/View/Element/Template.php
index de5cc66732a..4a972ccb58a 100644
--- a/lib/Magento/View/Element/Template.php
+++ b/lib/Magento/View/Element/Template.php
@@ -45,11 +45,15 @@ class Template extends AbstractBlock
     protected $_viewVars = array();
 
     /**
+     * Base URL
+     *
      * @var string
      */
     protected $_baseUrl;
 
     /**
+     * JS URL
+     *
      * @var string
      */
     protected $_jsUrl;
@@ -69,6 +73,8 @@ class Template extends AbstractBlock
     protected $_filesystem;
 
     /**
+     * View file system
+     *
      * @var \Magento\View\FileSystem
      */
     protected $_viewFileSystem;
@@ -81,16 +87,22 @@ class Template extends AbstractBlock
     protected $_template;
 
     /**
+     * Template engine pool
+     *
      * @var \Magento\View\TemplateEnginePool
      */
     protected $templateEnginePool;
 
     /**
+     * Store manager
+     *
      * @var \Magento\Core\Model\StoreManagerInterface
      */
     protected $_storeManager;
 
     /**
+     * Application state
+     *
      * @var \Magento\App\State
      */
     protected $_appState;
@@ -110,11 +122,15 @@ class Template extends AbstractBlock
     private $mediaDirectory;
 
     /**
+     * Template context
+     *
      * @var \Magento\View\Element\BlockInterface
      */
     protected $templateContext;
 
     /**
+     * Constructor
+     *
      * @param Template\Context $context
      * @param array $data
      */
@@ -134,7 +150,8 @@ class Template extends AbstractBlock
     /**
      * Set template context. Sets the object that should represent $this in template
      *
-     * @param $templateContext
+     * @param \Magento\View\Element\BlockInterface $templateContext
+     * @return void
      */
     public function setTemplateContext($templateContext)
     {
@@ -143,6 +160,7 @@ class Template extends AbstractBlock
 
     /**
      * Internal constructor, that is called from real constructor
+     * @return void
      */
     protected function _construct()
     {
@@ -173,7 +191,7 @@ class Template extends AbstractBlock
      * Set path to template used for generating block's output.
      *
      * @param string $template
-     * @return \Magento\View\Element\Template
+     * @return $this
      */
     public function setTemplate($template)
     {
@@ -212,7 +230,7 @@ class Template extends AbstractBlock
      *
      * @param   string|array $key
      * @param   mixed $value
-     * @return  \Magento\View\Element\Template
+     * @return  $this
      */
     public function assign($key, $value = null)
     {
diff --git a/lib/Magento/View/Element/Template/Context.php b/lib/Magento/View/Element/Template/Context.php
index 7f5f814876f..96f70e37594 100644
--- a/lib/Magento/View/Element/Template/Context.php
+++ b/lib/Magento/View/Element/Template/Context.php
@@ -32,26 +32,36 @@ class Context extends \Magento\View\Element\Context
     protected $_filesystem;
 
     /**
+     * View file system
+     *
      * @var \Magento\View\FileSystem
      */
     protected $_viewFileSystem;
 
     /**
+     * Template engine pool
+     *
      * @var \Magento\View\TemplateEnginePool
      */
     protected $enginePool;
 
     /**
+     * Application state
+     *
      * @var \Magento\App\State
      */
     protected $_appState;
 
     /**
+     * Store manager
+     *
      * @var \Magento\Core\Model\StoreManagerInterface
      */
     protected $_storeManager;
 
     /**
+     * Constructor
+     *
      * @param \Magento\App\RequestInterface $request
      * @param \Magento\View\LayoutInterface $layout
      * @param \Magento\Event\ManagerInterface $eventManager
diff --git a/lib/Magento/View/Element/Text.php b/lib/Magento/View/Element/Text.php
index ba19c19dd0a..a16a6bbcb66 100644
--- a/lib/Magento/View/Element/Text.php
+++ b/lib/Magento/View/Element/Text.php
@@ -56,6 +56,7 @@ class Text extends \Magento\View\Element\AbstractBlock
      *
      * @param string $text
      * @param bool $before
+     * @return void
      */
     public function addText($text, $before = false)
     {
diff --git a/lib/Magento/View/Element/Text/TextList/Item.php b/lib/Magento/View/Element/Text/TextList/Item.php
index 9b6ba9305be..4fa364ff74d 100644
--- a/lib/Magento/View/Element/Text/TextList/Item.php
+++ b/lib/Magento/View/Element/Text/TextList/Item.php
@@ -32,6 +32,8 @@ use Magento\View\Element\Text;
 class Item extends \Magento\View\Element\Text
 {
     /**
+     * Set link
+     *
      * @param array|string $liParams
      * @param string $innerText
      * @return $this
diff --git a/lib/Magento/View/Element/Text/TextList/Link.php b/lib/Magento/View/Element/Text/TextList/Link.php
index 0c8f081f855..3dd711bf30a 100644
--- a/lib/Magento/View/Element/Text/TextList/Link.php
+++ b/lib/Magento/View/Element/Text/TextList/Link.php
@@ -32,6 +32,8 @@ use Magento\View\Element\Text;
 class Link extends \Magento\View\Element\Text
 {
     /**
+     * Set link
+     *
      * @param array|string $liParams
      * @param array|string $aParams
      * @param string $innerText
diff --git a/lib/Magento/View/FileSystem.php b/lib/Magento/View/FileSystem.php
index 83c76c1e814..878e014dcab 100644
--- a/lib/Magento/View/FileSystem.php
+++ b/lib/Magento/View/FileSystem.php
@@ -37,11 +37,15 @@ class FileSystem
     protected $_resolutionPool;
 
     /**
+     * View service
+     *
      * @var Service
      */
     protected $_viewService;
 
     /**
+     * Constructor
+     *
      * @param \Magento\View\Design\FileResolution\StrategyPool $resolutionPool
      * @param Service $viewService
      */
diff --git a/lib/Magento/View/Layout/Argument/HandlerFactory.php b/lib/Magento/View/Layout/Argument/HandlerFactory.php
deleted file mode 100644
index 959ab85778e..00000000000
--- a/lib/Magento/View/Layout/Argument/HandlerFactory.php
+++ /dev/null
@@ -1,103 +0,0 @@
-<?php
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
- */
-
-/**
- * Layout config processor
- *
- * @author      Magento Core Team <core@magentocommerce.com>
- */
-namespace Magento\View\Layout\Argument;
-
-class HandlerFactory
-{
-    /**
-     * Array of argument handler factories
-     * @var array
-     */
-    protected $_handlerFactories = array();
-
-    /**
-     * Argument handlers list
-     *
-     * @var array
-     */
-    protected $_argumentHandlers = array();
-
-    /**
-     * @var \Magento\ObjectManager
-     */
-    protected $_objectManager;
-
-    /**
-     * @param \Magento\ObjectManager $objectManager
-     * @param array $handlerFactories
-     */
-    public function __construct(
-        \Magento\ObjectManager $objectManager,
-        array $handlerFactories = array()
-    ) {
-        $this->_objectManager = $objectManager;
-        $this->_handlerFactories = $handlerFactories;
-    }
-
-    /**
-     * Get argument handler factory by given type
-     * @param string $type
-     * @return \Magento\View\Layout\Argument\HandlerInterface
-     * @throws \InvalidArgumentException
-     */
-    public function getArgumentHandlerByType($type)
-    {
-        if (false == is_string($type)) {
-            throw new \InvalidArgumentException('Passed invalid argument handler type');
-        }
-
-        if (!isset($this->_handlerFactories[$type])) {
-            throw new \InvalidArgumentException("Argument handler {$type} does not exist");
-        }
-
-        if (isset($this->_argumentHandlers[$type])) {
-            return $this->_argumentHandlers[$type];
-        }
-        /** @var $handler \Magento\View\Layout\Argument\HandlerInterface */
-        $handler = $this->_objectManager->create($this->_handlerFactories[$type], array());
-
-        if (false === ($handler instanceof \Magento\View\Layout\Argument\HandlerInterface)) {
-            throw new \InvalidArgumentException(
-                "{$type} type handler must implement \\Magento\\View\\Layout\\Argument\\HandlerInterface"
-            );
-        }
-
-        $this->_argumentHandlers[$type] = $handler;
-        return $handler;
-    }
-
-    /**
-     * @return array
-     */
-    public function getTypes()
-    {
-        return array_keys($this->_handlerFactories);
-    }
-}
diff --git a/lib/Magento/View/Layout/Argument/Interpreter/Decorator/Updater.php b/lib/Magento/View/Layout/Argument/Interpreter/Decorator/Updater.php
new file mode 100644
index 00000000000..13f349cc2fd
--- /dev/null
+++ b/lib/Magento/View/Layout/Argument/Interpreter/Decorator/Updater.php
@@ -0,0 +1,92 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\View\Layout\Argument\Interpreter\Decorator;
+
+use Magento\ObjectManager;
+use Magento\Data\Argument\InterpreterInterface;
+
+/**
+ * Interpreter decorator that passes value, computed by subject of decoration, through the sequence of "updaters"
+ */
+class Updater implements InterpreterInterface
+{
+    /**
+     * @var ObjectManager
+     */
+    private $objectManager;
+
+    /**
+     * @var InterpreterInterface
+     */
+    private $subject;
+
+    /**
+     * @param ObjectManager $objectManager
+     * @param InterpreterInterface $subject
+     */
+    public function __construct(ObjectManager $objectManager, InterpreterInterface $subject)
+    {
+        $this->objectManager = $objectManager;
+        $this->subject = $subject;
+    }
+
+    /**
+     * {@inheritdoc}
+     * @throws \InvalidArgumentException
+     */
+    public function evaluate(array $data)
+    {
+        $updaters = !empty($data['updater']) ? $data['updater'] : array();
+        unset($data['updater']);
+        if (!is_array($updaters)) {
+            throw new \InvalidArgumentException('Layout argument updaters are expected to be an array of classes.');
+        }
+        $result = $this->subject->evaluate($data);
+        foreach ($updaters as $updaterClass) {
+            $result = $this->applyUpdater($result, $updaterClass);
+        }
+        return $result;
+    }
+
+    /**
+     * Invoke an updater, passing an input value to it, and return invocation result
+     *
+     * @param mixed $value
+     * @param string $updaterClass
+     * @return mixed
+     * @throws \UnexpectedValueException
+     */
+    protected function applyUpdater($value, $updaterClass)
+    {
+        /** @var \Magento\View\Layout\Argument\UpdaterInterface $updaterInstance */
+        $updaterInstance = $this->objectManager->get($updaterClass);
+        if (!($updaterInstance instanceof \Magento\View\Layout\Argument\UpdaterInterface)) {
+            throw new \UnexpectedValueException(sprintf(
+                'Instance of layout argument updater is expected, got %s instead.', get_class($updaterInstance)
+            ));
+        }
+        return $updaterInstance->update($value);
+    }
+}
diff --git a/lib/Magento/View/Layout/Argument/Interpreter/HelperMethod.php b/lib/Magento/View/Layout/Argument/Interpreter/HelperMethod.php
new file mode 100644
index 00000000000..c3431af25f4
--- /dev/null
+++ b/lib/Magento/View/Layout/Argument/Interpreter/HelperMethod.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\View\Layout\Argument\Interpreter;
+
+use Magento\ObjectManager;
+use Magento\Data\Argument\InterpreterInterface;
+
+/**
+ * Interpreter that returns invocation result of a helper method
+ */
+class HelperMethod implements InterpreterInterface
+{
+    /**
+     * @var ObjectManager
+     */
+    private $objectManager;
+
+    /**
+     * @var NamedParams
+     */
+    private $paramsInterpreter;
+
+    /**
+     * @param ObjectManager $objectManager
+     * @param NamedParams $paramsInterpreter
+     */
+    public function __construct(ObjectManager $objectManager, NamedParams $paramsInterpreter)
+    {
+        $this->objectManager = $objectManager;
+        $this->paramsInterpreter = $paramsInterpreter;
+    }
+
+    /**
+     * {@inheritdoc}
+     * @throws \InvalidArgumentException
+     */
+    public function evaluate(array $data)
+    {
+        if (!isset($data['helper']) || substr_count($data['helper'], '::') != 1) {
+            throw new \InvalidArgumentException('Helper method name in format "\Class\Name::methodName" is expected.');
+        }
+        $helperMethod = $data['helper'];
+        list($helperClass, $methodName) = explode('::', $helperMethod, 2);
+        if (!method_exists($helperClass, $methodName)) {
+            throw new \InvalidArgumentException("Helper method '$helperMethod' does not exist.");
+        }
+        $methodParams = $this->paramsInterpreter->evaluate($data);
+        $methodParams = array_values($methodParams); // Use positional argument binding instead of named binding
+        $helperInstance = $this->objectManager->get($helperClass);
+        return call_user_func_array(array($helperInstance, $methodName), $methodParams);
+    }
+}
diff --git a/lib/Magento/View/Layout/Argument/Interpreter/NamedParams.php b/lib/Magento/View/Layout/Argument/Interpreter/NamedParams.php
new file mode 100644
index 00000000000..0ba894bba75
--- /dev/null
+++ b/lib/Magento/View/Layout/Argument/Interpreter/NamedParams.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\View\Layout\Argument\Interpreter;
+
+use Magento\Data\Argument\InterpreterInterface;
+
+/**
+ * Interpreter of named parameters
+ */
+class NamedParams implements InterpreterInterface
+{
+    /**
+     * Interpreter of individual parameter
+     *
+     * @var InterpreterInterface
+     */
+    private $paramInterpreter;
+
+    /**
+     * @param InterpreterInterface $paramInterpreter
+     */
+    public function __construct(InterpreterInterface $paramInterpreter)
+    {
+        $this->paramInterpreter = $paramInterpreter;
+    }
+
+    /**
+     * {@inheritdoc}
+     * @return array
+     * @throws \InvalidArgumentException
+     */
+    public function evaluate(array $data)
+    {
+        $params = isset($data['param']) ? $data['param'] : array();
+        if (!is_array($params)) {
+            throw new \InvalidArgumentException('Layout argument parameters are expected to be an array.');
+        }
+        $result = array();
+        foreach ($params as $paramKey => $paramData) {
+            if (!is_array($paramData)) {
+                throw new \InvalidArgumentException('Parameter data of layout argument is expected to be an array.');
+            }
+            $result[$paramKey] = $this->paramInterpreter->evaluate($paramData);
+        }
+        return $result;
+    }
+}
diff --git a/lib/Magento/View/Layout/Argument/Interpreter/Object.php b/lib/Magento/View/Layout/Argument/Interpreter/Object.php
new file mode 100644
index 00000000000..4e5acf80743
--- /dev/null
+++ b/lib/Magento/View/Layout/Argument/Interpreter/Object.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\View\Layout\Argument\Interpreter;
+
+use Magento\ObjectManager;
+use Magento\Data\Argument\InterpreterInterface;
+
+/**
+ * Interpreter that instantiates object by a class name
+ */
+class Object implements InterpreterInterface
+{
+    /**
+     * @var ObjectManager
+     */
+    private $objectManager;
+
+    /**
+     * @var string|null
+     */
+    private $expectedClass;
+
+    /**
+     * @param ObjectManager $objectManager
+     * @param string|null $expectedClass
+     */
+    public function __construct(ObjectManager $objectManager, $expectedClass = null)
+    {
+        $this->objectManager = $objectManager;
+        $this->expectedClass = $expectedClass;
+    }
+
+    /**
+     * {@inheritdoc}
+     * @return object
+     * @throws \InvalidArgumentException
+     * @throws \UnexpectedValueException
+     */
+    public function evaluate(array $data)
+    {
+        if (!isset($data['value'])) {
+            throw new \InvalidArgumentException('Object class name is missing.');
+        }
+        $className = $data['value'];
+        $result = $this->objectManager->create($className);
+        if ($this->expectedClass && !($result instanceof $this->expectedClass)) {
+            throw new \UnexpectedValueException(sprintf(
+                "Instance of %s is expected, got %s instead.", $this->expectedClass, get_class($result)
+            ));
+        }
+        return $result;
+    }
+}
diff --git a/lib/Magento/View/Layout/Argument/Interpreter/Options.php b/lib/Magento/View/Layout/Argument/Interpreter/Options.php
new file mode 100644
index 00000000000..62794e0028f
--- /dev/null
+++ b/lib/Magento/View/Layout/Argument/Interpreter/Options.php
@@ -0,0 +1,76 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\View\Layout\Argument\Interpreter;
+
+use Magento\ObjectManager;
+use Magento\Data\Argument\InterpreterInterface;
+
+/**
+ * Interpreter that retrieves options from an option source model
+ */
+class Options implements InterpreterInterface
+{
+    /**
+     * @var ObjectManager
+     */
+    protected $objectManager;
+
+    /**
+     * @param ObjectManager $objectManager
+     */
+    public function __construct(ObjectManager $objectManager)
+    {
+        $this->objectManager = $objectManager;
+    }
+
+    /**
+     * {@inheritdoc}
+     * @return array Format: array(array('value' => <value>, 'label' => '<label>'), ...)
+     * @throws \InvalidArgumentException
+     * @throws \UnexpectedValueException
+     */
+    public function evaluate(array $data)
+    {
+        if (!isset($data['model'])) {
+            throw new \InvalidArgumentException('Options source model class is missing.');
+        }
+        $modelClass = $data['model'];
+        $modelInstance = $this->objectManager->get($modelClass);
+        if (!($modelInstance instanceof \Magento\Data\OptionSourceInterface)) {
+            throw new \UnexpectedValueException(sprintf(
+                "Instance of the options source model is expected, got %s instead.", get_class($modelInstance)
+            ));
+        }
+        $result = array();
+        foreach ($modelInstance->toOptionArray() as $value => $label) {
+            if (is_array($label)) {
+                $result[] = $label;
+            } else {
+                $result[] = array('value' => $value, 'label' => $label);
+            }
+        }
+        return $result;
+    }
+}
diff --git a/lib/Magento/View/Layout/Argument/Interpreter/Url.php b/lib/Magento/View/Layout/Argument/Interpreter/Url.php
new file mode 100644
index 00000000000..8de32f4fd44
--- /dev/null
+++ b/lib/Magento/View/Layout/Argument/Interpreter/Url.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\View\Layout\Argument\Interpreter;
+
+use Magento\UrlInterface;
+use Magento\Data\Argument\InterpreterInterface;
+
+/**
+ * Interpreter that builds URL by input path and optional parameters
+ */
+class Url implements InterpreterInterface
+{
+    /**
+     * @var UrlInterface
+     */
+    private $urlResolver;
+
+    /**
+     * @var NamedParams
+     */
+    private $paramsInterpreter;
+
+    /**
+     * @param UrlInterface $urlResolver
+     * @param NamedParams $paramsInterpreter
+     */
+    public function __construct(UrlInterface $urlResolver, NamedParams $paramsInterpreter)
+    {
+        $this->urlResolver = $urlResolver;
+        $this->paramsInterpreter = $paramsInterpreter;
+    }
+
+    /**
+     * {@inheritdoc}
+     * @return string
+     * @throws \InvalidArgumentException
+     */
+    public function evaluate(array $data)
+    {
+        if (!isset($data['path'])) {
+            throw new \InvalidArgumentException('URL path is missing.');
+        }
+        $urlPath = $data['path'];
+        $urlParams = $this->paramsInterpreter->evaluate($data);
+        return $this->urlResolver->getUrl($urlPath, $urlParams);
+    }
+}
diff --git a/lib/Magento/View/Layout/Argument/Parser.php b/lib/Magento/View/Layout/Argument/Parser.php
new file mode 100644
index 00000000000..74adf1150e6
--- /dev/null
+++ b/lib/Magento/View/Layout/Argument/Parser.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\View\Layout\Argument;
+
+use Magento\Config\Converter\Dom\Flat as FlatConverter;
+use Magento\Config\Dom\NodePathMatcher;
+use Magento\Config\Dom\ArrayNodeConfig;
+
+/**
+ * Parser of a layout argument node that returns its array representation with no data loss
+ */
+class Parser
+{
+    /**
+     * @var FlatConverter
+     */
+    private $converter;
+
+    /**
+     * Build and return array representation of layout argument node
+     *
+     * @param \DOMNode $argumentNode
+     * @return array|string
+     */
+    public function parse(\DOMNode $argumentNode)
+    {
+        // Base path is specified to use more meaningful XPaths in config
+        return $this->getConverter()->convert($argumentNode, 'argument');
+    }
+
+    /**
+     * Retrieve instance of XML converter, suitable for layout argument nodes
+     *
+     * @return FlatConverter
+     */
+    protected function getConverter()
+    {
+        if (!$this->converter) {
+            $arrayNodeConfig = new ArrayNodeConfig(
+                new NodePathMatcher(),
+                array(
+                    'argument/param' => 'name',
+                    'argument(/item)+' => 'name',
+                ),
+                array(
+                    'argument/updater',
+                )
+            );
+            $this->converter = new FlatConverter($arrayNodeConfig);
+        }
+        return $this->converter;
+    }
+}
diff --git a/app/code/Magento/Core/Model/Layout/Argument/UpdaterInterface.php b/lib/Magento/View/Layout/Argument/UpdaterInterface.php
similarity index 73%
rename from app/code/Magento/Core/Model/Layout/Argument/UpdaterInterface.php
rename to lib/Magento/View/Layout/Argument/UpdaterInterface.php
index 940c0c23135..aa8ca86321c 100644
--- a/app/code/Magento/Core/Model/Layout/Argument/UpdaterInterface.php
+++ b/lib/Magento/View/Layout/Argument/UpdaterInterface.php
@@ -18,28 +18,22 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    Magento
- * @package     Magento_Core
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-namespace Magento\Core\Model\Layout\Argument;
+
+namespace Magento\View\Layout\Argument;
 
 /**
- * Layout object argument updater interface
- *
- * @category    Magento
- * @package     Magento_Core
- * @author      Magento Core Team <core@magentocommerce.com>
+ * Interface of value modification with no value loss
  */
-
 interface UpdaterInterface
 {
     /**
-     * Update specified argument
+     * Return modified version of an input value
      *
-     * @param mixed $argument
+     * @param mixed $value
      * @return mixed
      */
-    public function update($argument);
+    public function update($value);
 }
diff --git a/lib/Magento/View/Layout/Element.php b/lib/Magento/View/Layout/Element.php
index 5b703bb22d3..bb0e0c1893f 100644
--- a/lib/Magento/View/Layout/Element.php
+++ b/lib/Magento/View/Layout/Element.php
@@ -56,7 +56,9 @@ class Element extends \Magento\Simplexml\Element
     /**#@-*/
 
     /**
-     * @return Element
+     * Prepare the element
+     *
+     * @return $this
      *
      * @SuppressWarnings(PHPMD.CyclomaticComplexity)
      */
@@ -90,6 +92,8 @@ class Element extends \Magento\Simplexml\Element
     }
 
     /**
+     * Get block name
+     *
      * @return bool|string
      */
     public function getBlockName()
@@ -150,7 +154,7 @@ class Element extends \Magento\Simplexml\Element
     /**
      * Add parent element name to parent attribute
      *
-     * @return Element
+     * @return $this
      */
     public function prepareBlock()
     {
@@ -163,7 +167,9 @@ class Element extends \Magento\Simplexml\Element
     }
 
     /**
-     * @return Element
+     * Prepare references
+     *
+     * @return $this
      */
     public function prepareReference()
     {
@@ -173,7 +179,7 @@ class Element extends \Magento\Simplexml\Element
     /**
      * Add parent element name to block attribute
      *
-     * @return Element
+     * @return $this
      */
     public function prepareAction()
     {
@@ -184,7 +190,9 @@ class Element extends \Magento\Simplexml\Element
     }
 
     /**
-     * @return Element
+     * Prepare action argument
+     *
+     * @return $this
      */
     public function prepareActionArgument()
     {
diff --git a/lib/Magento/View/Layout/File.php b/lib/Magento/View/Layout/File.php
index bf871b0af35..b94758428ca 100644
--- a/lib/Magento/View/Layout/File.php
+++ b/lib/Magento/View/Layout/File.php
@@ -32,26 +32,36 @@ use Magento\View\Design\ThemeInterface;
 class File
 {
     /**
+     * File name
+     *
      * @var string
      */
     protected $filename;
 
     /**
+     * Module
+     *
      * @var string
      */
     protected $module;
 
     /**
+     * Theme
+     *
      * @var ThemeInterface
      */
     protected $theme;
 
     /**
+     * Identifier
+     *
      * @var string
      */
     protected $identifier;
 
     /**
+     * Constructor
+     *
      * @param string $filename
      * @param string $module
      * @param ThemeInterface $theme
diff --git a/lib/Magento/View/Layout/File/Factory.php b/lib/Magento/View/Layout/File/Factory.php
index 66a3d6c31d0..047f01bddc7 100644
--- a/lib/Magento/View/Layout/File/Factory.php
+++ b/lib/Magento/View/Layout/File/Factory.php
@@ -33,11 +33,15 @@ use Magento\View\Design\ThemeInterface;
 class Factory
 {
     /**
+     * Object manager
+     *
      * @var ObjectManager
      */
     private $objectManager;
 
     /**
+     * Constructor
+     *
      * @param ObjectManager $objectManager
      */
     public function __construct(ObjectManager $objectManager)
@@ -50,7 +54,7 @@ class Factory
      *
      * @param string $filename
      * @param string $module
-     * @param ThemeInterface $theme
+     * @param ThemeInterface|null $theme
      * @return \Magento\View\Layout\File
      */
     public function create($filename, $module, ThemeInterface $theme = null)
diff --git a/lib/Magento/View/Layout/File/FileList.php b/lib/Magento/View/Layout/File/FileList.php
index e1ade158ed0..437c8665e26 100644
--- a/lib/Magento/View/Layout/File/FileList.php
+++ b/lib/Magento/View/Layout/File/FileList.php
@@ -33,16 +33,22 @@ use Magento\View\Layout\File\FileList\CollateInterface;
 class FileList
 {
     /**
+     * Array of files
+     *
      * @var File[]
      */
     protected $files = array();
 
     /**
+     * Collator
+     *
      * @var CollateInterface
      */
     protected $collator;
 
     /**
+     * Constructor
+     *
      * @param CollateInterface $collator
      */
     public function __construct(CollateInterface $collator)
@@ -64,6 +70,7 @@ class FileList
      * Add layout file instances to the list, preventing identity coincidence
      *
      * @param File[] $files
+     * @return void
      * @throws \LogicException
      */
     public function add(array $files)
@@ -84,6 +91,7 @@ class FileList
      * Replace already added layout files with specified ones, checking for identity match
      *
      * @param File[] $files
+     * @return void
      */
     public function replace(array $files)
     {
diff --git a/lib/Magento/View/Layout/File/FileList/Factory.php b/lib/Magento/View/Layout/File/FileList/Factory.php
index 5f8857b7591..bde65d00003 100644
--- a/lib/Magento/View/Layout/File/FileList/Factory.php
+++ b/lib/Magento/View/Layout/File/FileList/Factory.php
@@ -37,11 +37,15 @@ class Factory
     const FILE_LIST_COLLATOR = 'Magento\View\Layout\File\FileList\Collator';
 
     /**
+     * Object manager
+     *
      * @var ObjectManager
      */
     protected $objectManager;
 
     /**
+     * Constructor
+     *
      * @param ObjectManager $objectManager
      */
     public function __construct(ObjectManager $objectManager)
diff --git a/lib/Magento/View/Layout/File/Source/Aggregated.php b/lib/Magento/View/Layout/File/Source/Aggregated.php
index f7c960ed10a..92956b04e65 100644
--- a/lib/Magento/View/Layout/File/Source/Aggregated.php
+++ b/lib/Magento/View/Layout/File/Source/Aggregated.php
@@ -34,31 +34,43 @@ use Magento\View\Layout\File\FileList\Factory;
 class Aggregated implements SourceInterface
 {
     /**
+     * File list factory
+     *
      * @var Factory
      */
     protected $fileListFactory;
 
     /**
+     * Base files
+     *
      * @var SourceInterface
      */
     protected $baseFiles;
 
     /**
+     * Theme files
+     *
      * @var SourceInterface
      */
     protected $themeFiles;
 
     /**
+     * Overridden base files
+     *
      * @var SourceInterface
      */
     protected $overrideBaseFiles;
 
     /**
+     * Overridden theme files
+     *
      * @var SourceInterface
      */
     protected $overrideThemeFiles;
 
     /**
+     * Constructor
+     *
      * @param Factory $fileListFactory
      * @param SourceInterface $baseFiles
      * @param SourceInterface $themeFiles
diff --git a/lib/Magento/View/Layout/File/Source/Base.php b/lib/Magento/View/Layout/File/Source/Base.php
index eeefa64a687..eae3a636a54 100644
--- a/lib/Magento/View/Layout/File/Source/Base.php
+++ b/lib/Magento/View/Layout/File/Source/Base.php
@@ -36,16 +36,22 @@ use Magento\View\Layout\File\Factory;
 class Base implements SourceInterface
 {
     /**
+     * File factory
+     *
      * @var Factory
      */
     private $fileFactory;
 
     /**
+     * Modules directory
+     *
      * @var ReadInterface
      */
     protected $modulesDirectory;
 
     /**
+     * Constructor
+     *
      * @param Filesystem $filesystem
      * @param Factory $fileFactory
      */
diff --git a/lib/Magento/View/Layout/File/Source/Decorator/ModuleDependency.php b/lib/Magento/View/Layout/File/Source/Decorator/ModuleDependency.php
index 2d850c33a13..15029575828 100644
--- a/lib/Magento/View/Layout/File/Source/Decorator/ModuleDependency.php
+++ b/lib/Magento/View/Layout/File/Source/Decorator/ModuleDependency.php
@@ -35,11 +35,15 @@ use Magento\View\Design\ThemeInterface;
 class ModuleDependency implements SourceInterface
 {
     /**
+     * Subject
+     *
      * @var SourceInterface
      */
     private $subject;
 
     /**
+     * Module list
+     *
      * @var ModuleListInterface
      */
     private $moduleList;
@@ -52,6 +56,8 @@ class ModuleDependency implements SourceInterface
     private $orderedModules;
 
     /**
+     * Constructor
+     *
      * @param SourceInterface $subject
      * @param ModuleListInterface $listInterface
      */
diff --git a/lib/Magento/View/Layout/File/Source/Decorator/ModuleOutput.php b/lib/Magento/View/Layout/File/Source/Decorator/ModuleOutput.php
index 234403a3177..cd999875a68 100644
--- a/lib/Magento/View/Layout/File/Source/Decorator/ModuleOutput.php
+++ b/lib/Magento/View/Layout/File/Source/Decorator/ModuleOutput.php
@@ -35,16 +35,22 @@ use Magento\View\Design\ThemeInterface;
 class ModuleOutput implements SourceInterface
 {
     /**
+     * Subject
+     *
      * @var SourceInterface
      */
     private $subject;
 
     /**
+     * Module manager
+     *
      * @var \Magento\Module\Manager
      */
     private $moduleManager;
 
     /**
+     * Constructor
+     *
      * @param SourceInterface $subject
      * @param Manager $moduleManager
      */
diff --git a/lib/Magento/View/Layout/File/Source/Override/Base.php b/lib/Magento/View/Layout/File/Source/Override/Base.php
index db99303df49..9b6f96eb61d 100644
--- a/lib/Magento/View/Layout/File/Source/Override/Base.php
+++ b/lib/Magento/View/Layout/File/Source/Override/Base.php
@@ -36,16 +36,22 @@ use Magento\View\Layout\File\Factory;
 class Base implements SourceInterface
 {
     /**
+     * File factory
+     *
      * @var Factory
      */
     private $fileFactory;
 
     /**
+     * Themes directory
+     *
      * @var ReadInterface
      */
     protected $themesDirectory;
 
     /**
+     * Constructor
+     *
      * @param Filesystem $filesystem
      * @param Factory $fileFactory
      */
diff --git a/lib/Magento/View/Layout/File/Source/Override/Theme.php b/lib/Magento/View/Layout/File/Source/Override/Theme.php
index 26dae12eea6..77bcbf6e91a 100644
--- a/lib/Magento/View/Layout/File/Source/Override/Theme.php
+++ b/lib/Magento/View/Layout/File/Source/Override/Theme.php
@@ -37,16 +37,22 @@ use Magento\Exception;
 class Theme implements SourceInterface
 {
     /**
+     * Themes directory
+     *
      * @var ReadInterface
      */
     protected $themesDirectory;
 
     /**
+     * File factory
+     *
      * @var Factory
      */
     private $fileFactory;
 
     /**
+     * Constructor
+     *
      * @param Filesystem $filesystem
      * @param Factory $fileFactory
      */
diff --git a/lib/Magento/View/Layout/File/Source/Theme.php b/lib/Magento/View/Layout/File/Source/Theme.php
index 307a8cab448..db7e13ca1fb 100644
--- a/lib/Magento/View/Layout/File/Source/Theme.php
+++ b/lib/Magento/View/Layout/File/Source/Theme.php
@@ -36,16 +36,22 @@ use Magento\View\Layout\File\Factory;
 class Theme implements SourceInterface
 {
     /**
+     * File factory
+     *
      * @var Factory
      */
     private $fileFactory;
 
     /**
+     * Themes directory
+     *
      * @var ReadInterface
      */
     protected $themesDirectory;
 
     /**
+     * Constructor
+     *
      * @param Filesystem $filesystem
      * @param Factory $fileFactory
      */
diff --git a/lib/Magento/View/Layout/PageType/Config.php b/lib/Magento/View/Layout/PageType/Config.php
index e46f7fd07c5..cde09a832e7 100644
--- a/lib/Magento/View/Layout/PageType/Config.php
+++ b/lib/Magento/View/Layout/PageType/Config.php
@@ -34,7 +34,11 @@ class Config
      */
     protected $_pageTypes = null;
 
-    /** @var  \Magento\Config\DataInterface */
+    /**
+     * Data storage
+     *
+     * @var  \Magento\Config\DataInterface
+     */
     protected $_dataStorage;
 
     /**
@@ -51,7 +55,7 @@ class Config
     /**
      * Initialize page types list
      *
-     * @return \Magento\View\Layout\PageType\Config
+     * @return $this
      */
     protected function _initPageTypes()
     {
@@ -68,7 +72,7 @@ class Config
     /**
      * Retrieve available page types
      *
-     * @return array \Magento\Object[]
+     * @return \Magento\Object[]
      */
     public function getPageTypes()
     {
diff --git a/lib/Magento/View/Layout/PageType/Config/SchemaLocator.php b/lib/Magento/View/Layout/PageType/Config/SchemaLocator.php
index ab7c044e3ab..e1b674d9111 100644
--- a/lib/Magento/View/Layout/PageType/Config/SchemaLocator.php
+++ b/lib/Magento/View/Layout/PageType/Config/SchemaLocator.php
@@ -35,6 +35,8 @@ class SchemaLocator implements \Magento\Config\SchemaLocatorInterface
     protected $_schema = null;
 
     /**
+     * Constructor
+     *
      * @param \Magento\Module\Dir\Reader $moduleReader
      */
     public function __construct(\Magento\Module\Dir\Reader $moduleReader)
diff --git a/lib/Magento/View/Layout/ProcessorFactory.php b/lib/Magento/View/Layout/ProcessorFactory.php
index 37a3808c9d5..fa4ebc7630e 100644
--- a/lib/Magento/View/Layout/ProcessorFactory.php
+++ b/lib/Magento/View/Layout/ProcessorFactory.php
@@ -44,6 +44,8 @@ class ProcessorFactory
     protected $instanceName;
 
     /**
+     * Constructor
+     *
      * @param \Magento\ObjectManager $objectManager
      * @param string $instanceName
      */
diff --git a/lib/Magento/View/Layout/ProcessorInterface.php b/lib/Magento/View/Layout/ProcessorInterface.php
index c0bd0464157..0c1a6db671e 100644
--- a/lib/Magento/View/Layout/ProcessorInterface.php
+++ b/lib/Magento/View/Layout/ProcessorInterface.php
@@ -54,7 +54,7 @@ interface ProcessorInterface
     /**
      * Add handle(s) to update
      *
-     * @param array|string $handleName
+     * @param string|string[] $handleName
      * @return ProcessorInterface
      */
     public function addHandle($handleName);
diff --git a/lib/Magento/View/LayoutFactory.php b/lib/Magento/View/LayoutFactory.php
index 117ad6ec4bc..1f6ef7020c5 100644
--- a/lib/Magento/View/LayoutFactory.php
+++ b/lib/Magento/View/LayoutFactory.php
@@ -44,6 +44,8 @@ class LayoutFactory
     protected $_instanceName;
 
     /**
+     * Constructor
+     *
      * @param \Magento\ObjectManager $objectManager
      * @param string $instanceName
      */
diff --git a/lib/Magento/View/LayoutInterface.php b/lib/Magento/View/LayoutInterface.php
index 6221730d500..fa036b2f0af 100644
--- a/lib/Magento/View/LayoutInterface.php
+++ b/lib/Magento/View/LayoutInterface.php
@@ -45,6 +45,8 @@ interface LayoutInterface
 
     /**
      * Create structure of elements from the loaded XML configuration
+     *
+     * @return void
      */
     public function generateElements();
 
@@ -133,6 +135,7 @@ interface LayoutInterface
      * @param string $childName
      * @param string|int|null $offsetOrSibling
      * @param bool $after
+     * @return void
      */
     public function reorderChild($parentName, $childName, $offsetOrSibling, $after = true);
 
@@ -227,6 +230,7 @@ interface LayoutInterface
      * @param array $options
      * @param string $parent
      * @param string $alias
+     * @return void
      */
     public function addContainer($name, $label, array $options = array(), $parent = '', $alias = '');
 
@@ -287,7 +291,7 @@ interface LayoutInterface
     /**
      * Set layout area
      *
-     * @param $area
+     * @param string $area
      * @return LayoutInterface
      */
     public function setArea($area);
diff --git a/lib/Magento/View/Publisher.php b/lib/Magento/View/Publisher.php
index 27fef205ff2..304b6fc671a 100644
--- a/lib/Magento/View/Publisher.php
+++ b/lib/Magento/View/Publisher.php
@@ -52,6 +52,8 @@ class Publisher implements \Magento\View\PublicFilesManagerInterface
     /**#@-*/
 
     /**
+     * File system
+     *
      * @var \Magento\App\Filesystem
      */
     protected $_filesystem;
@@ -64,16 +66,22 @@ class Publisher implements \Magento\View\PublicFilesManagerInterface
     protected $_cssUrlResolver;
 
     /**
+     * View service
+     *
      * @var \Magento\View\Service
      */
     protected $_viewService;
 
     /**
+     * View file system
+     *
      * @var \Magento\View\FileSystem
      */
     protected $_viewFileSystem;
 
     /**
+     * Logger
+     *
      * @var \Magento\Logger
      */
     protected $_logger;
@@ -86,31 +94,41 @@ class Publisher implements \Magento\View\PublicFilesManagerInterface
     protected $_allowDuplication;
 
     /**
+     * Modules reader
+     *
      * @var \Magento\Module\Dir\Reader
      */
     protected $_modulesReader;
 
     /**
+     * Root directory
+     *
      * @var WriteInterface
      */
     protected $rootDirectory;
 
     /**
+     * Related file
+     *
      * @var RelatedFile
      */
     protected $relatedFile;
 
     /**
+     * Pre-processor
+     *
      * @var \Magento\View\Asset\PreProcessor\PreProcessorInterface
      */
     protected $preProcessor;
 
     /**
+     * Constructor
+     *
      * @param \Magento\Logger $logger
      * @param \Magento\App\Filesystem $filesystem
      * @param \Magento\View\Url\CssResolver $cssUrlResolver
-     * @param Service $viewService
-     * @param FileSystem $viewFileSystem
+     * @param \Magento\View\Service $viewService
+     * @param \Magento\View\FileSystem $viewFileSystem
      * @param \Magento\Module\Dir\Reader $modulesReader
      * @param RelatedFile $relatedFile
      * @param \Magento\View\Asset\PreProcessor\PreProcessorInterface $preProcessor
diff --git a/lib/Magento/View/RelatedFile.php b/lib/Magento/View/RelatedFile.php
index bcf2ad31b85..6c724e402cf 100644
--- a/lib/Magento/View/RelatedFile.php
+++ b/lib/Magento/View/RelatedFile.php
@@ -30,21 +30,29 @@ namespace Magento\View;
 class RelatedFile
 {
     /**
+     * View service
+     *
      * @var Service
      */
     protected $viewService;
 
     /**
+     * View file system
+     *
      * @var FileSystem
      */
     protected $viewFileSystem;
 
     /**
+     * File system
+     *
      * @var \Magento\Filesystem
      */
     protected $filesystem;
 
     /**
+     * Constructor
+     *
      * @param Service $viewService
      * @param FileSystem $viewFileSystem
      * @param \Magento\App\Filesystem $filesystem
@@ -65,7 +73,7 @@ class RelatedFile
      * @param string $relatedFilePath URL to the file that was extracted from $parentPath
      * @param string $parentPath path to the file
      * @param string $parentRelativePath original file name identifier that was requested for processing
-     * @param array $params theme/module parameters array
+     * @param array &$params theme/module parameters array
      * @return string
      */
     public function buildPath($relatedFilePath, $parentPath, $parentRelativePath, &$params)
diff --git a/lib/Magento/View/Render/RenderFactory.php b/lib/Magento/View/Render/RenderFactory.php
index 331d5614440..590f5b971cc 100644
--- a/lib/Magento/View/Render/RenderFactory.php
+++ b/lib/Magento/View/Render/RenderFactory.php
@@ -33,11 +33,15 @@ use Magento\View\RenderInterface;
 class RenderFactory
 {
     /**
+     * Object manager
+     *
      * @var ObjectManager
      */
     protected $objectManager;
 
     /**
+     * Constructor
+     *
      * @param ObjectManager $objectManager
      */
     public function __construct(ObjectManager $objectManager)
@@ -46,8 +50,10 @@ class RenderFactory
     }
 
     /**
+     * Get method
+     *
      * @param string $type
-     * @return mixed
+     * @return RenderInterface
      * @throws \InvalidArgumentException
      */
     public function get($type)
diff --git a/lib/Magento/View/RenderInterface.php b/lib/Magento/View/RenderInterface.php
index 2d58a769edd..61ee2b33067 100644
--- a/lib/Magento/View/RenderInterface.php
+++ b/lib/Magento/View/RenderInterface.php
@@ -30,6 +30,8 @@ namespace Magento\View;
 interface RenderInterface
 {
     /**
+     * Render template
+     *
      * @param string $template
      * @param array $data
      * @return string
@@ -37,6 +39,8 @@ interface RenderInterface
     public function renderTemplate($template, array $data);
 
     /**
+     * Render container
+     *
      * @param string $content
      * @param array $containerInfo
      * @return string
diff --git a/lib/Magento/View/Service.php b/lib/Magento/View/Service.php
index 5b5586b3d36..9e4682b2cb4 100644
--- a/lib/Magento/View/Service.php
+++ b/lib/Magento/View/Service.php
@@ -35,26 +35,36 @@ class Service
     const SCOPE_SEPARATOR = '::';
 
     /**
+     * Application state
+     *
      * @var \Magento\App\State
      */
     protected $_appState;
 
     /**
+     * Design
+     *
      * @var \Magento\View\DesignInterface
      */
     private $_design;
 
     /**
+     * Theme factory
+     *
      * @var \Magento\View\Design\Theme\FlyweightFactory
      */
     protected $themeFactory;
 
     /**
+     * Pub directory
+     *
      * @var string
      */
     protected $_pubDirectory;
 
     /**
+     * Constructor
+     *
      * @param \Magento\App\State $appState
      * @param \Magento\View\DesignInterface $design
      * @param \Magento\View\Design\Theme\FlyweightFactory $themeFactory
@@ -134,7 +144,7 @@ class Service
     /**
      * Update required parameters with default values if custom not specified
      *
-     * @param array $params
+     * @param array &$params
      * @return $this
      *
      * @SuppressWarnings(PHPMD.CyclomaticComplexity)
diff --git a/lib/Magento/View/TemplateEngine/Php.php b/lib/Magento/View/TemplateEngine/Php.php
index 7d052dbf091..8df65d8b9d0 100644
--- a/lib/Magento/View/TemplateEngine/Php.php
+++ b/lib/Magento/View/TemplateEngine/Php.php
@@ -33,16 +33,22 @@ use Magento\View\Element\BlockInterface;
 class Php implements TemplateEngineInterface
 {
     /**
+     * Current block
+     *
      * @var BlockInterface
      */
     protected $_currentBlock;
 
     /**
-     * @var
+     * Helper factory
+     *
+     * @var \Magento\ObjectManager
      */
     protected $_helperFactory;
 
     /**
+     * Constructor
+     *
      * @param \Magento\ObjectManager $helperFactory
      */
     public function __construct(\Magento\ObjectManager $helperFactory)
@@ -60,7 +66,7 @@ class Php implements TemplateEngineInterface
      * @param string                   $fileName
      * @param array                    $dictionary
      * @return string
-     * @throws \Exception any exception that the template may throw
+     * @throws \Exception
      */
     public function render(BlockInterface $block, $fileName, array $dictionary = array())
     {
diff --git a/lib/Magento/View/TemplateEngineFactory.php b/lib/Magento/View/TemplateEngineFactory.php
index 706dc3af6d6..76fa1039ff9 100644
--- a/lib/Magento/View/TemplateEngineFactory.php
+++ b/lib/Magento/View/TemplateEngineFactory.php
@@ -32,16 +32,22 @@ use Magento\ObjectManager;
 class TemplateEngineFactory
 {
     /**
+     * Object manager
+     *
      * @var ObjectManager
      */
     protected $objectManager;
 
     /**
+     * Engines
+     *
      * @var array
      */
     protected $engines;
 
     /**
+     * Constructor
+     *
      * @param ObjectManager $objectManager
      * @param array $engines Format: array('<name>' => 'TemplateEngine\Class', ...)
      */
@@ -56,7 +62,7 @@ class TemplateEngineFactory
     /**
      * Retrieve a template engine instance by its unique name
      *
-     * @param $name
+     * @param string $name
      * @return TemplateEngineInterface
      * @throws \UnexpectedValueException If template engine doesn't implement the necessary interface
      * @throws \InvalidArgumentException If template engine doesn't exist
diff --git a/lib/Magento/View/TemplateEngineInterface.php b/lib/Magento/View/TemplateEngineInterface.php
index 5f546befa9a..70f979c6e17 100644
--- a/lib/Magento/View/TemplateEngineInterface.php
+++ b/lib/Magento/View/TemplateEngineInterface.php
@@ -36,7 +36,7 @@ interface TemplateEngineInterface
      * the data provided in $vars.
      *
      * @param \Magento\View\Element\BlockInterface $block
-     * @param $templateFile
+     * @param string $templateFile
      * @param array $dictionary
      * @return string rendered template
      */
diff --git a/lib/Magento/View/TemplateEnginePool.php b/lib/Magento/View/TemplateEnginePool.php
index 8e0b64bf381..f5f5c7ae52d 100644
--- a/lib/Magento/View/TemplateEnginePool.php
+++ b/lib/Magento/View/TemplateEnginePool.php
@@ -28,16 +28,22 @@ use Magento\View\TemplateEngineFactory;
 class TemplateEnginePool
 {
     /**
+     * Factory
+     *
      * @var TemplateEngineFactory
      */
     protected $factory;
 
     /**
+     * Template engines
+     *
      * @var \Magento\View\TemplateEngineInterface[]
      */
     protected $engines = array();
 
     /**
+     * Constructor
+     *
      * @param TemplateEngineFactory $factory
      */
     public function __construct(TemplateEngineFactory $factory)
diff --git a/lib/Magento/View/Url.php b/lib/Magento/View/Url.php
index d87622d4888..972fa5c49d2 100644
--- a/lib/Magento/View/Url.php
+++ b/lib/Magento/View/Url.php
@@ -35,31 +35,43 @@ class Url
     const XML_PATH_STATIC_FILE_SIGNATURE = 'dev/static/sign';
 
     /**
+     * File system
+     *
      * @var \Magento\App\Filesystem
      */
     protected $_filesystem;
 
     /**
+     * View service
+     *
      * @var \Magento\View\Service
      */
     protected $_viewService;
 
     /**
+     * Publisher
+     *
      * @var \Magento\View\Publisher
      */
     protected $_publisher;
 
     /**
+     * Deployed file manager
+     *
      * @var \Magento\View\DeployedFilesManager
      */
     protected $_deployedFileManager;
 
     /**
+     * URL builder
+     *
      * @var \Magento\UrlInterface
      */
     protected $_urlBuilder;
 
     /**
+     * Config
+     *
      * @var \Magento\View\Url\ConfigInterface
      */
     protected $_config;
@@ -72,18 +84,22 @@ class Url
     protected $_fileUrlMap;
 
     /**
+     * View file system
+     *
      * @var \Magento\View\FileSystem
      */
     protected $_viewFileSystem;
 
     /**
+     * Constructor
+     *
      * @param \Magento\App\Filesystem $filesystem
      * @param \Magento\UrlInterface $urlBuilder
-     * @param Url\ConfigInterface $config
-     * @param Service $viewService
-     * @param Publisher $publisher
-     * @param DeployedFilesManager $deployedFileManager
-     * @param \Magento\View\FileSystem $viewFileSystem,
+     * @param \Magento\View\Url\ConfigInterface $config
+     * @param \Magento\View\Service $viewService
+     * @param \Magento\View\Publisher $publisher
+     * @param \Magento\View\DeployedFilesManager $deployedFileManager
+     * @param \Magento\View\FileSystem $viewFileSystem
      * @param array $fileUrlMap
      */
     public function __construct(
diff --git a/lib/Magento/View/Url/CssResolver.php b/lib/Magento/View/Url/CssResolver.php
index bc172ca8cda..1c63ad90a3c 100644
--- a/lib/Magento/View/Url/CssResolver.php
+++ b/lib/Magento/View/Url/CssResolver.php
@@ -36,16 +36,22 @@ class CssResolver
         = '#url\s*\(\s*(?(?=\'|").)(?!http\://|https\://|/|data\:)(.+?)(?:[\#\?].*?|[\'"])?\s*\)#';
 
     /**
+     * File system
+     *
      * @var \Magento\App\Filesystem
      */
     protected $filesystem;
 
     /**
+     * View file system
+     *
      * @var \Magento\View\FileSystem
      */
     protected $viewFileSystem;
 
     /**
+     * Constructor
+     *
      * @param \Magento\App\Filesystem $filesystem
      * @param \Magento\View\FileSystem $viewFileSystem
      */
@@ -66,7 +72,7 @@ class CssResolver
      * @param string $originalPath
      * @param string $newPath
      * @param callable|null $cbRelUrlToPublicPath Optional custom callback to resolve relative urls to file paths
-     * @return mixed
+     * @return string
      */
     public function replaceCssRelativeUrls($cssContent, $originalPath, $newPath, $cbRelUrlToPublicPath = null)
     {
diff --git a/pub/lib/varien/product.js b/pub/lib/varien/product.js
deleted file mode 100644
index 6b4a2199bb5..00000000000
--- a/pub/lib/varien/product.js
+++ /dev/null
@@ -1,779 +0,0 @@
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Academic Free License (AFL 3.0)
- * that is bundled with this package in the file LICENSE_AFL.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/afl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Varien
- * @package     js
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
- */
-if(typeof Product=='undefined') {
-    var Product = {};
-}
-
-/********************* IMAGE ZOOMER ***********************/
-
-Product.Zoom = Class.create();
-/**
- * Image zoom control
- *
- * @author      Magento Core Team <core@magentocommerce.com>
- */
-Product.Zoom.prototype = {
-    initialize: function(imageEl, trackEl, handleEl, zoomInEl, zoomOutEl, hintEl){
-        this.containerEl = $(imageEl).parentNode;
-        this.imageEl = $(imageEl);
-        this.handleEl = $(handleEl);
-        this.trackEl = $(trackEl);
-        this.hintEl = $(hintEl);
-
-        this.containerDim = Element.getDimensions(this.containerEl);
-        this.imageDim = Element.getDimensions(this.imageEl);
-
-        this.imageDim.ratio = this.imageDim.width/this.imageDim.height;
-
-        this.floorZoom = 1;
-
-        if (this.imageDim.width > this.imageDim.height) {
-            this.ceilingZoom = this.imageDim.width / this.containerDim.width;
-        } else {
-            this.ceilingZoom = this.imageDim.height / this.containerDim.height;
-        }
-
-        if (this.imageDim.width <= this.containerDim.width
-            && this.imageDim.height <= this.containerDim.height) {
-            this.trackEl.up().hide();
-            this.hintEl.hide();
-            this.containerEl.removeClassName('product-image-zoom');
-            return;
-        }
-
-        this.imageX = 0;
-        this.imageY = 0;
-        this.imageZoom = 1;
-
-        this.sliderSpeed = 0;
-        this.sliderAccel = 0;
-        this.zoomBtnPressed = false;
-
-        this.showFull = false;
-
-        this.selects = document.getElementsByTagName('select');
-
-        this.draggable = new Draggable(imageEl, {
-            starteffect:false,
-            reverteffect:false,
-            endeffect:false,
-            snap:this.contain.bind(this)
-        });
-
-        this.slider = new Control.Slider(handleEl, trackEl, {
-            axis:'horizontal',
-            minimum:0,
-            maximum:Element.getDimensions(this.trackEl).width,
-            alignX:0,
-            increment:1,
-            sliderValue:0,
-            onSlide:this.scale.bind(this),
-            onChange:this.scale.bind(this)
-        });
-
-        this.scale(0);
-
-        Event.observe(this.imageEl, 'dblclick', this.toggleFull.bind(this));
-
-        Event.observe($(zoomInEl), 'mousedown', this.startZoomIn.bind(this));
-        Event.observe($(zoomInEl), 'mouseup', this.stopZooming.bind(this));
-        Event.observe($(zoomInEl), 'mouseout', this.stopZooming.bind(this));
-
-        Event.observe($(zoomOutEl), 'mousedown', this.startZoomOut.bind(this));
-        Event.observe($(zoomOutEl), 'mouseup', this.stopZooming.bind(this));
-        Event.observe($(zoomOutEl), 'mouseout', this.stopZooming.bind(this));
-    },
-
-    toggleFull: function () {
-        this.showFull = !this.showFull;
-
-        //Hide selects for IE6 only
-        if (typeof document.body.style.maxHeight == "undefined")  {
-            for (i=0; i<this.selects.length; i++) {
-                this.selects[i].style.visibility = this.showFull ? 'hidden' : 'visible';
-            }
-        }
-        val_scale = !this.showFull ? this.slider.value : 1;
-        this.scale(val_scale);
-
-        this.trackEl.style.visibility = this.showFull ? 'hidden' : 'visible';
-        this.containerEl.style.overflow = this.showFull ? 'visible' : 'hidden';
-        this.containerEl.style.zIndex = this.showFull ? '1000' : '9';
-
-        return this;
-    },
-
-    scale: function (v) {
-        var centerX  = (this.containerDim.width*(1-this.imageZoom)/2-this.imageX)/this.imageZoom;
-        var centerY  = (this.containerDim.height*(1-this.imageZoom)/2-this.imageY)/this.imageZoom;
-        var overSize = (this.imageDim.width > this.containerDim.width || this.imageDim.height > this.containerDim.height);
-
-        this.imageZoom = this.floorZoom+(v*(this.ceilingZoom-this.floorZoom));
-
-        if (overSize) {
-            if (this.imageDim.width > this.imageDim.height) {
-                this.imageEl.style.width = (this.imageZoom*this.containerDim.width)+'px';
-            } else {
-                this.imageEl.style.height = (this.imageZoom*this.containerDim.height)+'px';
-            }
-            if (this.containerDim.ratio) {
-                if (this.imageDim.width > this.imageDim.height) {
-                    this.imageEl.style.height = (this.imageZoom*this.containerDim.width*this.containerDim.ratio)+'px'; // for safari
-                } else {
-                    this.imageEl.style.width = (this.imageZoom*this.containerDim.height*this.containerDim.ratio)+'px'; // for safari
-                }
-            }
-        } else {
-            this.slider.setDisabled();
-        }
-
-        this.imageX = this.containerDim.width*(1-this.imageZoom)/2-centerX*this.imageZoom;
-        this.imageY = this.containerDim.height*(1-this.imageZoom)/2-centerY*this.imageZoom;
-
-        this.contain(this.imageX, this.imageY, this.draggable);
-
-        return true;
-    },
-
-    startZoomIn: function()
-    {
-        if (!this.slider.disabled) {
-            this.zoomBtnPressed = true;
-            this.sliderAccel = .002;
-            this.periodicalZoom();
-            this.zoomer = new PeriodicalExecuter(this.periodicalZoom.bind(this), .05);
-        }
-        return this;
-    },
-
-    startZoomOut: function()
-    {
-        if (!this.slider.disabled) {
-            this.zoomBtnPressed = true;
-            this.sliderAccel = -.002;
-            this.periodicalZoom();
-            this.zoomer = new PeriodicalExecuter(this.periodicalZoom.bind(this), .05);
-        }
-        return this;
-    },
-
-    stopZooming: function()
-    {
-        if (!this.zoomer || this.sliderSpeed==0) {
-            return;
-        }
-        this.zoomBtnPressed = false;
-        this.sliderAccel = 0;
-    },
-
-    periodicalZoom: function()
-    {
-        if (!this.zoomer) {
-            return this;
-        }
-
-        if (this.zoomBtnPressed) {
-            this.sliderSpeed += this.sliderAccel;
-        } else {
-            this.sliderSpeed /= 1.5;
-            if (Math.abs(this.sliderSpeed)<.001) {
-                this.sliderSpeed = 0;
-                this.zoomer.stop();
-                this.zoomer = null;
-            }
-        }
-        this.slider.value += this.sliderSpeed;
-
-        this.slider.setValue(this.slider.value);
-        this.scale(this.slider.value);
-
-        return this;
-    },
-
-    contain: function (x,y,draggable) {
-
-        var dim = Element.getDimensions(draggable.element);
-
-        var xMin = 0, xMax = this.containerDim.width-dim.width;
-        var yMin = 0, yMax = this.containerDim.height-dim.height;
-
-        x = x>xMin ? xMin : x;
-        x = x<xMax ? xMax : x;
-        y = y>yMin ? yMin : y;
-        y = y<yMax ? yMax : y;
-
-        if (this.containerDim.width > dim.width) {
-            x = (this.containerDim.width/2) - (dim.width/2);
-        }
-
-        if (this.containerDim.height > dim.height) {
-            y = (this.containerDim.height/2) - (dim.height/2);
-        }
-
-        this.imageX = x;
-        this.imageY = y;
-
-        this.imageEl.style.left = this.imageX+'px';
-        this.imageEl.style.top = this.imageY+'px';
-
-        return [x,y];
-    }
-}
-
-/**************************** CONFIGURABLE PRODUCT **************************/
-Product.Config = Class.create();
-Product.Config.prototype = {
-    initialize: function(config){
-        this.config     = config;
-        this.taxConfig  = this.config.taxConfig;
-        this.settings   = $$('.super-attribute-select');
-        this.state      = new Hash();
-        this.priceTemplate = new Template(this.config.template);
-        this.prices     = config.prices;
-
-        this.settings.each(function(element){
-            Event.observe(element, 'change', this.configure.bind(this))
-        }.bind(this));
-
-        // fill state
-        this.settings.each(function(element){
-            var attributeId = element.id.replace(/[a-z]*/, '');
-            if(attributeId && this.config.attributes[attributeId]) {
-                element.config = this.config.attributes[attributeId];
-                element.attributeId = attributeId;
-                this.state[attributeId] = false;
-            }
-        }.bind(this))
-
-        // Init settings dropdown
-        var childSettings = [];
-        for(var i=this.settings.length-1;i>=0;i--){
-            var prevSetting = this.settings[i-1] ? this.settings[i-1] : false;
-            var nextSetting = this.settings[i+1] ? this.settings[i+1] : false;
-            if(i==0){
-                this.fillSelect(this.settings[i])
-            }
-            else {
-                this.settings[i].disabled=true;
-            }
-            $(this.settings[i]).childSettings = childSettings.clone();
-            $(this.settings[i]).prevSetting   = prevSetting;
-            $(this.settings[i]).nextSetting   = nextSetting;
-            childSettings.push(this.settings[i]);
-        }
-
-        // Set default values - from config and overwrite them by url values
-        if (config.defaultValues) {
-            this.values = config.defaultValues;
-        }
-
-        var separatorIndex = window.location.href.indexOf('#');
-        if (separatorIndex != -1) {
-            var paramsStr = window.location.href.substr(separatorIndex+1);
-            var urlValues = paramsStr.toQueryParams();
-            if (!this.values) {
-                this.values = {};
-            }
-            for (var i in urlValues) {
-                this.values[i] = urlValues[i];
-            }
-        }
-
-        this.configureForValues();
-        document.observe("dom:loaded", this.configureForValues.bind(this));
-    },
-
-    configureForValues: function () {
-        if (this.values) {
-            this.settings.each(function(element){
-                var attributeId = element.attributeId;
-                element.value = (typeof(this.values[attributeId]) == 'undefined')? '' : this.values[attributeId];
-                this.configureElement(element);
-            }.bind(this));
-        }
-    },
-
-    configure: function(event){
-        var element = Event.element(event);
-        this.configureElement(element);
-    },
-
-    configureElement : function(element) {
-        this.reloadOptionLabels(element);
-        if(element.value){
-            this.state[element.config.id] = element.value;
-            if(element.nextSetting){
-                element.nextSetting.disabled = false;
-                this.fillSelect(element.nextSetting);
-                this.resetChildren(element.nextSetting);
-            }
-        }
-        else {
-            this.resetChildren(element);
-        }
-        this.reloadPrice();
-//      Calculator.updatePrice();
-    },
-
-    reloadOptionLabels: function(element){
-        var selectedPrice;
-        if(element.options[element.selectedIndex].config){
-            selectedPrice = parseFloat(element.options[element.selectedIndex].config.price)
-        }
-        else{
-            selectedPrice = 0;
-        }
-        for(var i=0;i<element.options.length;i++){
-            if(element.options[i].config){
-                element.options[i].text = this.getOptionLabel(element.options[i].config, element.options[i].config.price-selectedPrice);
-            }
-        }
-    },
-
-    resetChildren : function(element){
-        if(element.childSettings) {
-            for(var i=0;i<element.childSettings.length;i++){
-                element.childSettings[i].selectedIndex = 0;
-                element.childSettings[i].disabled = true;
-                if(element.config){
-                    this.state[element.config.id] = false;
-                }
-            }
-        }
-    },
-
-    fillSelect: function(element){
-        var attributeId = element.id.replace(/[a-z]*/, '');
-        var options = this.getAttributeOptions(attributeId);
-        this.clearSelect(element);
-        element.options[0] = new Option('', '');
-        element.options[0].innerHTML = this.config.chooseText;
-
-        var prevConfig = false;
-        if(element.prevSetting){
-            prevConfig = element.prevSetting.options[element.prevSetting.selectedIndex];
-        }
-
-        if(options) {
-            var index = 1;
-            for(var i=0;i<options.length;i++){
-                var allowedProducts = [];
-                if(prevConfig) {
-                    for(var j=0;j<options[i].products.length;j++){
-                        if(prevConfig.config.allowedProducts
-                            && prevConfig.config.allowedProducts.indexOf(options[i].products[j])>-1){
-                            allowedProducts.push(options[i].products[j]);
-                        }
-                    }
-                } else {
-                    allowedProducts = options[i].products.clone();
-                }
-
-                if(allowedProducts.size()>0){
-                    options[i].allowedProducts = allowedProducts;
-                    element.options[index] = new Option(this.getOptionLabel(options[i], options[i].price), options[i].id);
-                    element.options[index].config = options[i];
-                    index++;
-                }
-            }
-        }
-    },
-
-    getOptionLabel: function(option, price){
-        var price = parseFloat(price);
-        if (this.taxConfig.includeTax) {
-            var tax = price / (100 + this.taxConfig.defaultTax) * this.taxConfig.defaultTax;
-            var excl = price - tax;
-            var incl = excl*(1+(this.taxConfig.currentTax/100));
-        } else {
-            var tax = price * (this.taxConfig.currentTax / 100);
-            var excl = price;
-            var incl = excl + tax;
-        }
-
-        if (this.taxConfig.showIncludeTax || this.taxConfig.showBothPrices) {
-            price = incl;
-        } else {
-            price = excl;
-        }
-
-        var str = option.label;
-        if(price){
-            if (this.taxConfig.showBothPrices) {
-                str+= ' ' + this.formatPrice(excl, true) + ' (' + this.formatPrice(price, true) + ' ' + this.taxConfig.inclTaxTitle + ')';
-            } else {
-                str+= ' ' + this.formatPrice(price, true);
-            }
-        }
-        return str;
-    },
-
-    formatPrice: function(price, showSign){
-        var str = '';
-        price = parseFloat(price);
-        if(showSign){
-            if(price<0){
-                str+= '-';
-                price = -price;
-            }
-            else{
-                str+= '+';
-            }
-        }
-
-        var roundedPrice = (Math.round(price*100)/100).toString();
-
-        if (this.prices && this.prices[roundedPrice]) {
-            str+= this.prices[roundedPrice];
-        }
-        else {
-            str+= this.priceTemplate.evaluate({price:price.toFixed(2)});
-        }
-        return str;
-    },
-
-    clearSelect: function(element){
-        for(var i=element.options.length-1;i>=0;i--){
-            element.remove(i);
-        }
-    },
-
-    getAttributeOptions: function(attributeId){
-        if(this.config.attributes[attributeId]){
-            return this.config.attributes[attributeId].options;
-        }
-    },
-
-    reloadPrice: function(){
-        var price    = 0;
-        var oldPrice = 0;
-        for(var i=this.settings.length-1;i>=0;i--){
-            var selected = this.settings[i].options[this.settings[i].selectedIndex];
-            if(selected.config){
-                price    += parseFloat(selected.config.price);
-                oldPrice += parseFloat(selected.config.oldPrice);
-            }
-        }
-
-        optionsPrice.changePrice('config', {'price': price, 'oldPrice': oldPrice});
-        optionsPrice.reload();
-
-        return price;
-
-        if($('product-price-'+this.config.productId)){
-            $('product-price-'+this.config.productId).innerHTML = price;
-        }
-        this.reloadOldPrice();
-    },
-
-    reloadOldPrice: function(){
-        if ($('old-price-'+this.config.productId)) {
-
-            var price = parseFloat(this.config.oldPrice);
-            for(var i=this.settings.length-1;i>=0;i--){
-                var selected = this.settings[i].options[this.settings[i].selectedIndex];
-                if(selected.config){
-                    var parsedOldPrice = parseFloat(selected.config.oldPrice);
-                    price += isNaN(parsedOldPrice) ? 0 : parsedOldPrice;
-                }
-            }
-            if (price < 0)
-                price = 0;
-            price = this.formatPrice(price);
-
-            if($('old-price-'+this.config.productId)){
-                $('old-price-'+this.config.productId).innerHTML = price;
-            }
-
-        }
-    }
-}
-
-
-/**************************** SUPER PRODUCTS ********************************/
-
-Product.Super = {};
-Product.Super.Configurable = Class.create();
-
-Product.Super.Configurable.prototype = {
-    initialize: function(container, observeCss, updateUrl, updatePriceUrl, priceContainerId) {
-        this.container = $(container);
-        this.observeCss = observeCss;
-        this.updateUrl = updateUrl;
-        this.updatePriceUrl = updatePriceUrl;
-        this.priceContainerId = priceContainerId;
-        this.registerObservers();
-    },
-    registerObservers: function() {
-        var elements = this.container.getElementsByClassName(this.observeCss);
-        elements.each(function(element){
-            Event.observe(element, 'change', this.update.bindAsEventListener(this));
-        }.bind(this));
-        return this;
-    },
-    update: function(event) {
-        var elements = this.container.getElementsByClassName(this.observeCss);
-        var parameters = Form.serializeElements(elements, true);
-
-        new Ajax.Updater(this.container, this.updateUrl + '?ajax=1', {
-                parameters:parameters,
-                onComplete:this.registerObservers.bind(this)
-        });
-        var priceContainer = $(this.priceContainerId);
-        if(priceContainer) {
-            new Ajax.Updater(priceContainer, this.updatePriceUrl + '?ajax=1', {
-                parameters:parameters
-            });
-        }
-    }
-}
-
-/**************************** PRICE RELOADER ********************************/
-Product.OptionsPrice = Class.create();
-Product.OptionsPrice.prototype = {
-    initialize: function(config) {
-        this.productId          = config.productId;
-        this.priceFormat        = config.priceFormat;
-        this.includeTax         = config.includeTax;
-        this.defaultTax         = config.defaultTax;
-        this.currentTax         = config.currentTax;
-        this.productPrice       = config.productPrice;
-        this.showIncludeTax     = config.showIncludeTax;
-        this.showBothPrices     = config.showBothPrices;
-        this.productOldPrice    = config.productOldPrice;
-        this.priceInclTax       = config.priceInclTax;
-        this.priceExclTax       = config.priceExclTax;
-        this.duplicateIdSuffix  = config.idSuffix;
-        this.specialTaxPrice    = config.specialTaxPrice;
-        this.tierPrices         = config.tierPrices;
-        this.tierPricesInclTax  = config.tierPricesInclTax;
-
-        this.oldPlusDisposition = config.oldPlusDisposition;
-        this.plusDisposition    = config.plusDisposition;
-        this.plusDispositionTax = config.plusDispositionTax;
-
-        this.oldMinusDisposition = config.oldMinusDisposition;
-        this.minusDisposition    = config.minusDisposition;
-
-        this.exclDisposition     = config.exclDisposition;
-
-        this.optionPrices   = {};
-        this.customPrices   = {};
-        this.containers     = {};
-
-        this.displayZeroPrice   = true;
-
-        this.initPrices();
-    },
-
-    setDuplicateIdSuffix: function(idSuffix) {
-        this.duplicateIdSuffix = idSuffix;
-    },
-
-    initPrices: function() {
-        this.containers[0] = 'product-price-' + this.productId;
-        this.containers[1] = 'bundle-price-' + this.productId;
-        this.containers[2] = 'price-including-tax-' + this.productId;
-        this.containers[3] = 'price-excluding-tax-' + this.productId;
-        this.containers[4] = 'old-price-' + this.productId;
-    },
-
-    changePrice: function(key, price) {
-        this.optionPrices[key] = price;
-    },
-
-    addCustomPrices: function(key, price) {
-        this.customPrices[key] = price;
-    },
-    getOptionPrices: function() {
-        var price = 0;
-        var nonTaxable = 0;
-        var oldPrice = 0;
-        var priceInclTax = 0;
-        var currentTax = this.currentTax;
-        $H(this.optionPrices).each(function(pair) {
-            if ('undefined' != typeof(pair.value.price) && 'undefined' != typeof(pair.value.oldPrice)) {
-                price += parseFloat(pair.value.price);
-                oldPrice += parseFloat(pair.value.oldPrice);
-            } else if (pair.key == 'nontaxable') {
-                nonTaxable = pair.value;
-            } else if (pair.key == 'priceInclTax') {
-                priceInclTax += pair.value;
-            } else if (pair.key == 'optionsPriceInclTax') {
-                priceInclTax += pair.value * (100 + currentTax) / 100;
-            } else {
-                price += parseFloat(pair.value);
-                oldPrice += parseFloat(pair.value);
-            }
-        });
-        var result = [price, nonTaxable, oldPrice, priceInclTax];
-        return result;
-    },
-
-    reload: function() {
-        var price;
-        var formattedPrice;
-        var optionPrices = this.getOptionPrices();
-        var nonTaxable = optionPrices[1];
-        var optionOldPrice = optionPrices[2];
-        var priceInclTax = optionPrices[3];
-        optionPrices = optionPrices[0];
-
-        $H(this.containers).each(function(pair) {
-            var _productPrice;
-            var _plusDisposition;
-            var _minusDisposition;
-            var _priceInclTax;
-            if ($(pair.value)) {
-                if (pair.value == 'old-price-'+this.productId && this.productOldPrice != this.productPrice) {
-                    _productPrice = this.productOldPrice;
-                    _plusDisposition = this.oldPlusDisposition;
-                    _minusDisposition = this.oldMinusDisposition;
-                } else {
-                    _productPrice = this.productPrice;
-                    _plusDisposition = this.plusDisposition;
-                    _minusDisposition = this.minusDisposition;
-                }
-                _priceInclTax = priceInclTax;
-
-                if (pair.value == 'old-price-'+this.productId && optionOldPrice !== undefined) {
-                    price = optionOldPrice+parseFloat(_productPrice);
-                } else if (this.specialTaxPrice == 'true' && this.priceInclTax !== undefined && this.priceExclTax !== undefined) {
-                    price = optionPrices+parseFloat(this.priceExclTax);
-                    _priceInclTax += this.priceInclTax;
-                } else {
-                    price = optionPrices+parseFloat(_productPrice);
-                    _priceInclTax += parseFloat(_productPrice) * (100 + this.currentTax) / 100;
-                }
-
-                if (this.specialTaxPrice == 'true') {
-                    var excl = price;
-                    var incl = _priceInclTax;
-                } else if (this.includeTax == 'true') {
-                    // tax = tax included into product price by admin
-                    var tax = price / (100 + this.defaultTax) * this.defaultTax;
-                    var excl = price - tax;
-                    var incl = excl*(1+(this.currentTax/100));
-                } else {
-                    var tax = price * (this.currentTax / 100);
-                    var excl = price;
-                    var incl = excl + tax;
-                }
-
-                var subPrice = 0;
-                var subPriceincludeTax = 0;
-                Object.values(this.customPrices).each(function(el){
-                    if (el.excludeTax && el.includeTax) {
-                        subPrice += parseFloat(el.excludeTax);
-                        subPriceincludeTax += parseFloat(el.includeTax);
-                    } else {
-                        subPrice += parseFloat(el.price);
-                        subPriceincludeTax += parseFloat(el.price);
-                    }
-                });
-                excl += subPrice;
-                incl += subPriceincludeTax;
-
-                if (typeof this.exclDisposition == 'undefined') {
-                    excl += parseFloat(_plusDisposition);
-                }
-
-                incl += parseFloat(_plusDisposition) + parseFloat(this.plusDispositionTax);
-                excl -= parseFloat(_minusDisposition);
-                incl -= parseFloat(_minusDisposition);
-
-                //adding nontaxlable part of options
-                excl += parseFloat(nonTaxable);
-                incl += parseFloat(nonTaxable);
-
-                if (pair.value == 'price-including-tax-'+this.productId) {
-                    price = incl;
-                } else if (pair.value == 'price-excluding-tax-'+this.productId) {
-                    price = excl;
-                } else if (pair.value == 'old-price-'+this.productId) {
-                    if (this.showIncludeTax || this.showBothPrices) {
-                        price = incl;
-                    } else {
-                        price = excl;
-                    }
-                } else {
-                    if (this.showIncludeTax) {
-                        price = incl;
-                    } else {
-                        price = excl;
-                    }
-                }
-
-                if (price < 0) price = 0;
-
-                if (price > 0 || this.displayZeroPrice) {
-                    formattedPrice = this.formatPrice(price);
-                } else {
-                    formattedPrice = '';
-                }
-
-                if ($(pair.value).select('.price')[0]) {
-                    $(pair.value).select('.price')[0].innerHTML = formattedPrice;
-                    if ($(pair.value+this.duplicateIdSuffix) && $(pair.value+this.duplicateIdSuffix).select('.price')[0]) {
-                        $(pair.value+this.duplicateIdSuffix).select('.price')[0].innerHTML = formattedPrice;
-                    }
-                } else {
-                    $(pair.value).innerHTML = formattedPrice;
-                    if ($(pair.value+this.duplicateIdSuffix)) {
-                        $(pair.value+this.duplicateIdSuffix).innerHTML = formattedPrice;
-                    }
-                }
-            };
-        }.bind(this));
-
-        for (var i = 0; i < this.tierPrices.length; i++) {
-            $$('.price.tier-' + i).each(function (el) {
-                var price = this.tierPrices[i] + parseFloat(optionPrices);
-                el.innerHTML = this.formatPrice(price);
-            }, this);
-            $$('.price.tier-' + i + '-incl-tax').each(function (el) {
-                var price = this.tierPricesInclTax[i] + parseFloat(optionPrices);
-                el.innerHTML = this.formatPrice(price);
-            }, this);
-            $$('.benefit').each(function (el) {
-                var parsePrice = function (html) {
-                    return parseFloat(/\d+\.?\d*/.exec(html));
-                };
-                var container = $(this.containers[3]) ? this.containers[3] : this.containers[0];
-                var price = parsePrice($(container).innerHTML);
-                var tierPrice = $$('.price.tier-' + i);
-                tierPrice = tierPrice.length ? parseInt(tierPrice[0].innerHTML, 10) : 0;
-                var $percent = Selector.findChildElements(el, ['.percent.tier-' + i]);
-                $percent.each(function (el) {
-                    el.innerHTML = Math.ceil(100 - ((100 / price) * tierPrice));
-                });
-            }, this);
-        }
-
-    },
-    formatPrice: function(price) {
-        return formatCurrency(price, this.priceFormat);
-    }
-}
-- 
GitLab