diff --git a/.gitignore b/.gitignore
index 7a2f12aac25417e9176e1c68b7255f6d4cc6922e..90b240f3af0e98af18e659f3adeb7848c45d8dbf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -34,3 +34,4 @@ atlassian*
 
 /var/*
 !/var/.htaccess
+/vendor
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4a4d7ccf5c67ce18a3e7839d240dcfcf524a2ee5..a00a72467d328cf8d1843a468b459dea08429655 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,58 @@
+0.1.0-alpha90
+=============
+ * Service layer implementation:
+   * Created the Admin Shopping Cart Service
+   * Created the Create Shopping Cart Items Service
+   * Created the Create Shopping Cart Shipping Address Service
+   * Created the Create Shopping Cart Billing Address Service
+   * Created the Service Layer for Orders
+   * Created CRUD service & APIs to manage options for configurable products
+   * Created CRUD service & APIs to manage options for bundle products
+ * Fixed bugs:
+   * Fixed an issue where adding a customer address with an invalid value of the custom address attribute caused a fatal error in SOAP
+   * Fixed an issue where the wrong FedEx rates were displayed
+   * Fixed an issue where the Bill Me Later option did not work in Payflow payment methods
+   * Fixed an issue where order comments were broken for orders placed with Authorize.net
+   * Fixed the naming of the My Account -> Recurring Payment page
+   * Fixed a UI elements issue in the disabled Magento_PayPalRecurringPayment and Magento_RecurringPayment modules
+   * Fixed an issue where it was impossible to save configuration of a configurable product when adding it to an order in the Admin panel
+   * Fixed an issue where the Select a store page was displayed during admin order creation when the Single Store mode was enabled
+   * Fixed an issue when an exception was thrown when attempting to open the Customer Account page if the Recently Viewed widget was configured for the store
+   * Updated the content of the Privacy Policy page
+   * Fixed an issue where it was possible to update a tax rate using the POST http method
+   * Fixed an issue where it was impossible to update Inventory Qty for a SKU using API
+   * Fixed a JavaScript syntax error on the Create New Customer page
+   * Fixed an issue where it was impossible to add new sample while creating a downloadable product
+   * Fixed a JavaScript which appeared when clicking the Add New Address button in the Address Book on the storefront
+   * Fixed an issue where it was possible to update Tax Rules using the PUT http method which is supposed to be used for create operation only
+   * Fixed an issue where it was possible to create a Tax Rule specifying a product tax class instead of a customer tax class and vice versa
+   * Fixed an issue with making websiteId a mandatory field when updating a customer using REST
+   * Fixed an issue where the default value was not applied after clicking the 'Use default' link for a product price field in the catalog in the Admin panel
+   * Fixed an issue where the price update mass action could not be performed
+   * Fixed a JS error in the cross-sells product settings in the Admin panel
+ * Added the following functional tests:
+   * Mass Delete Backend Customer
+   * Moderate Product Review
+ * Framework improvements:
+   * Added the ability to access admin functionality using admin user login for mobile
+   * Refactored and unified Access Control List (ACL) to make it more consistent
+   * Created a Cookie Manager (a cookie management class)
+ * Changes in functional tests:
+   * Enabled the CustomerMetadataService tests for SOAP
+ * Themes update:
+   * Fixed issues in the Blank theme
+   * Implemented improvements for the Blank theme, core templates and Storefront UI Library
+ * Modularity:
+   * Created the Notification library component and made it possible to disable the AdminNotification module
+   * Made it possible to disable the SendToFriend module
+   * Created an optional ConfigurableImportExport module to remove dependency between the CatalogImportExport and ConfigurableProduct modules
+   * Created an optional GroupedImportExport module to remove dependency between the CatalogImportExport and GroupedProduct modules
+ * Introduce search library:
+   * Created a Search request configuration
+   * Created a Query object structure from the XML declaration
+ * Composer Integration:
+   * Added support for using 3rd-party components as Composer packages
+
 0.1.0-alpha89
 =============
 * Fixed bugs:
diff --git a/README.md b/README.md
index fe79310ea4cca97077ee90a3c1933bc417d50f81..2b7d837ea1746b5e66e40e2929329ef1f3dd2b65 100644
--- a/README.md
+++ b/README.md
@@ -6,3 +6,4 @@ All Submissions you make to Magento, an eBay Inc. company (“Magento”) throug
 
 1. You grant Magento a perpetual, worldwide, non-exclusive, no charge, royalty free, irrevocable license under your applicable copyrights and patents to reproduce, prepare derivative works of, display, publically perform, sublicense and distribute any feedback, ideas, code, or other information (“Submission”) you submit through GitHub.
 2. Your Submission is an original work of authorship and you are the owner or are legally entitled to grant the license stated above.
+3. You agree to the X.commerce Agreement found here: https://www.x.com/developers/x.commerce/x.commerce-user-agreement.
diff --git a/app/autoload.php b/app/autoload.php
index f2ab699eefe54883c61dac4f79f0c254eaeea046..073340091ce7a5b81df26b20efd01a702767ddfd 100644
--- a/app/autoload.php
+++ b/app/autoload.php
@@ -23,5 +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)
  */
+$vendorDir = require __DIR__ . '/etc/vendor_path.php';
+$vendorAutoload = __DIR__ . '/../' . $vendorDir . '/autoload.php';
+if (file_exists($vendorAutoload)) {
+    require_once $vendorAutoload;
+}
 require_once __DIR__ . '/../lib/internal/Magento/Framework/Autoload/IncludePath.php';
 spl_autoload_register([new \Magento\Framework\Autoload\IncludePath(), 'load']);
diff --git a/app/bootstrap.php b/app/bootstrap.php
index f9b998c6bce1ac8f43b9bd0ea6153cf32e68c00c..31abb9bdfa5c7714917afc3533b81c23108d3ae5 100644
--- a/app/bootstrap.php
+++ b/app/bootstrap.php
@@ -30,9 +30,9 @@ error_reporting(E_ALL);
 umask(0);
 
 /* PHP version validation */
-if (version_compare(phpversion(), '5.4.0', '<') === true) {
+if (version_compare(phpversion(), '5.4.11', '<') === true) {
     if (PHP_SAPI == 'cli') {
-        echo 'Magento supports PHP 5.4.0 or newer. Please read http://www.magento.com/install.';
+        echo 'Magento supports PHP 5.4.11 or newer. Please read http://www.magento.com/install.';
     } else {
         echo <<<HTML
 <div style="font:12px/1.35em arial, helvetica, sans-serif;">
@@ -40,7 +40,7 @@ if (version_compare(phpversion(), '5.4.0', '<') === true) {
         <h3 style="margin:0;font-size:1.7em;font-weight:normal;text-transform:none;text-align:left;color:#2f2f2f;">
         Whoops, it looks like you have an invalid PHP version.</h3>
     </div>
-    <p>Magento supports PHP 5.4.0 or newer.
+    <p>Magento supports PHP 5.4.11 or newer.
     <a href="http://www.magento.com/install" target="">Find out</a>
     how to install Magento using PHP-CGI as a work-around.
     </p>
@@ -60,7 +60,6 @@ define('BP', dirname(__DIR__));
  * Require necessary files
  */
 require_once BP . '/app/functions.php';
-
 require_once __DIR__ . '/autoload.php';
 (new \Magento\Framework\Autoload\IncludePath())->addIncludePath(array(BP . '/app/code', BP . '/lib/internal'));
 $classMapPath = BP . '/var/classmap.ser';
diff --git a/app/code/Magento/AdminNotification/Block/Grid/Renderer/Severity.php b/app/code/Magento/AdminNotification/Block/Grid/Renderer/Severity.php
index e227a878d8c22833da611f8beaf0741fd1b63bcf..a3be2bc9ccef4a4a2aad946603b0320d9e41c6a9 100644
--- a/app/code/Magento/AdminNotification/Block/Grid/Renderer/Severity.php
+++ b/app/code/Magento/AdminNotification/Block/Grid/Renderer/Severity.php
@@ -25,6 +25,8 @@
  */
 namespace Magento\AdminNotification\Block\Grid\Renderer;
 
+use \Magento\Framework\Notification\MessageInterface;
+
 class Severity extends \Magento\Backend\Block\Widget\Grid\Column\Renderer\AbstractRenderer
 {
     /**
@@ -58,21 +60,21 @@ class Severity extends \Magento\Backend\Block\Widget\Grid\Column\Renderer\Abstra
         $value = '';
 
         switch ($row->getData($this->getColumn()->getIndex())) {
-            case \Magento\AdminNotification\Model\Inbox::SEVERITY_CRITICAL:
+            case MessageInterface::SEVERITY_CRITICAL:
                 $class = 'critical';
-                $value = $this->_notice->getSeverities(\Magento\AdminNotification\Model\Inbox::SEVERITY_CRITICAL);
+                $value = $this->_notice->getSeverities(MessageInterface::SEVERITY_CRITICAL);
                 break;
-            case \Magento\AdminNotification\Model\Inbox::SEVERITY_MAJOR:
+            case MessageInterface::SEVERITY_MAJOR:
                 $class = 'major';
-                $value = $this->_notice->getSeverities(\Magento\AdminNotification\Model\Inbox::SEVERITY_MAJOR);
+                $value = $this->_notice->getSeverities(MessageInterface::SEVERITY_MAJOR);
                 break;
-            case \Magento\AdminNotification\Model\Inbox::SEVERITY_MINOR:
+            case MessageInterface::SEVERITY_MINOR:
                 $class = 'minor';
-                $value = $this->_notice->getSeverities(\Magento\AdminNotification\Model\Inbox::SEVERITY_MINOR);
+                $value = $this->_notice->getSeverities(MessageInterface::SEVERITY_MINOR);
                 break;
-            case \Magento\AdminNotification\Model\Inbox::SEVERITY_NOTICE:
+            case MessageInterface::SEVERITY_NOTICE:
                 $class = 'notice';
-                $value = $this->_notice->getSeverities(\Magento\AdminNotification\Model\Inbox::SEVERITY_NOTICE);
+                $value = $this->_notice->getSeverities(MessageInterface::SEVERITY_NOTICE);
                 break;
         }
         return '<span class="grid-severity-' . $class . '"><span>' . $value . '</span></span>';
diff --git a/app/code/Magento/AdminNotification/Block/System/Messages.php b/app/code/Magento/AdminNotification/Block/System/Messages.php
index 19695d3a9e4b5406efbe790fb9721cedfa2b39d9..9af0a88bfcc201aa7c810e9f1dcfe964b485a59a 100644
--- a/app/code/Magento/AdminNotification/Block/System/Messages.php
+++ b/app/code/Magento/AdminNotification/Block/System/Messages.php
@@ -70,14 +70,14 @@ class Messages extends \Magento\Backend\Block\Template
     /**
      * Retrieve message list
      *
-     * @return \Magento\AdminNotification\Model\System\MessageInterface[]
+     * @return \Magento\Framework\Notification\MessageInterface[]
      */
     public function getLastCritical()
     {
         $items = array_values($this->_messages->getItems());
         if (isset(
             $items[0]
-        ) && $items[0]->getSeverity() == \Magento\AdminNotification\Model\System\MessageInterface::SEVERITY_CRITICAL
+        ) && $items[0]->getSeverity() == \Magento\Framework\Notification\MessageInterface::SEVERITY_CRITICAL
         ) {
             return $items[0];
         }
@@ -92,7 +92,7 @@ class Messages extends \Magento\Backend\Block\Template
     public function getCriticalCount()
     {
         return $this->_messages->getCountBySeverity(
-            \Magento\AdminNotification\Model\System\MessageInterface::SEVERITY_CRITICAL
+            \Magento\Framework\Notification\MessageInterface::SEVERITY_CRITICAL
         );
     }
 
@@ -104,7 +104,7 @@ class Messages extends \Magento\Backend\Block\Template
     public function getMajorCount()
     {
         return $this->_messages->getCountBySeverity(
-            \Magento\AdminNotification\Model\System\MessageInterface::SEVERITY_MAJOR
+            \Magento\Framework\Notification\MessageInterface::SEVERITY_MAJOR
         );
     }
 
diff --git a/app/code/Magento/AdminNotification/Block/System/Messages/UnreadMessagePopup.php b/app/code/Magento/AdminNotification/Block/System/Messages/UnreadMessagePopup.php
index fbc13f17552682bcf0443283b9f0a9cd4922514e..e5e88769696bdd2b72e7d1a28fb46f245f0f631e 100644
--- a/app/code/Magento/AdminNotification/Block/System/Messages/UnreadMessagePopup.php
+++ b/app/code/Magento/AdminNotification/Block/System/Messages/UnreadMessagePopup.php
@@ -17,13 +17,13 @@
  * Do not edit or add to this file if you wish to upgrade Magento to newer
  * versions in the future. If you wish to customize Magento for your
  * needs please refer 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\AdminNotification\Block\System\Messages;
 
-use Magento\AdminNotification\Model\System\MessageInterface;
+use Magento\Framework\Notification\MessageInterface;
 
 class UnreadMessagePopup extends \Magento\Backend\Block\Template
 {
diff --git a/app/code/Magento/AdminNotification/Model/Inbox.php b/app/code/Magento/AdminNotification/Model/Inbox.php
index 7e762b79a6e08371d56e6d989f901c0abb09d7c5..e620d1472a61a052aea4c52331dc995dab352a07 100644
--- a/app/code/Magento/AdminNotification/Model/Inbox.php
+++ b/app/code/Magento/AdminNotification/Model/Inbox.php
@@ -23,6 +23,9 @@
  */
 namespace Magento\AdminNotification\Model;
 
+use \Magento\Framework\Notification\MessageInterface;
+use \Magento\Framework\Notification\NotifierInterface;
+
 /**
  * AdminNotification Inbox model
  *
@@ -45,16 +48,8 @@ namespace Magento\AdminNotification\Model;
  *
  * @author      Magento Core Team <core@magentocommerce.com>
  */
-class Inbox extends \Magento\Framework\Model\AbstractModel
+class Inbox extends \Magento\Framework\Model\AbstractModel implements NotifierInterface
 {
-    const SEVERITY_CRITICAL = 1;
-
-    const SEVERITY_MAJOR = 2;
-
-    const SEVERITY_MINOR = 3;
-
-    const SEVERITY_NOTICE = 4;
-
     /**
      * @return void
      */
@@ -72,10 +67,10 @@ class Inbox extends \Magento\Framework\Model\AbstractModel
     public function getSeverities($severity = null)
     {
         $severities = array(
-            self::SEVERITY_CRITICAL => __('critical'),
-            self::SEVERITY_MAJOR => __('major'),
-            self::SEVERITY_MINOR => __('minor'),
-            self::SEVERITY_NOTICE => __('notice')
+            MessageInterface::SEVERITY_CRITICAL => __('critical'),
+            MessageInterface::SEVERITY_MAJOR => __('major'),
+            MessageInterface::SEVERITY_MINOR => __('minor'),
+            MessageInterface::SEVERITY_NOTICE => __('notice')
         );
 
         if (!is_null($severity)) {
@@ -118,7 +113,8 @@ class Inbox extends \Magento\Framework\Model\AbstractModel
      */
     public function parse(array $data)
     {
-        return $this->getResource()->parse($this, $data);
+        $this->getResource()->parse($this, $data);
+        return $this;
     }
 
     /**
@@ -167,7 +163,7 @@ class Inbox extends \Magento\Framework\Model\AbstractModel
      */
     public function addCritical($title, $description, $url = '', $isInternal = true)
     {
-        $this->add(self::SEVERITY_CRITICAL, $title, $description, $url, $isInternal);
+        $this->add(MessageInterface::SEVERITY_CRITICAL, $title, $description, $url, $isInternal);
         return $this;
     }
 
@@ -182,7 +178,7 @@ class Inbox extends \Magento\Framework\Model\AbstractModel
      */
     public function addMajor($title, $description, $url = '', $isInternal = true)
     {
-        $this->add(self::SEVERITY_MAJOR, $title, $description, $url, $isInternal);
+        $this->add(MessageInterface::SEVERITY_MAJOR, $title, $description, $url, $isInternal);
         return $this;
     }
 
@@ -197,7 +193,7 @@ class Inbox extends \Magento\Framework\Model\AbstractModel
      */
     public function addMinor($title, $description, $url = '', $isInternal = true)
     {
-        $this->add(self::SEVERITY_MINOR, $title, $description, $url, $isInternal);
+        $this->add(MessageInterface::SEVERITY_MINOR, $title, $description, $url, $isInternal);
         return $this;
     }
 
@@ -212,7 +208,7 @@ class Inbox extends \Magento\Framework\Model\AbstractModel
      */
     public function addNotice($title, $description, $url = '', $isInternal = true)
     {
-        $this->add(self::SEVERITY_NOTICE, $title, $description, $url, $isInternal);
+        $this->add(MessageInterface::SEVERITY_NOTICE, $title, $description, $url, $isInternal);
         return $this;
     }
 }
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 870c60a0c1a08f278c82e8c2af2f2ddbcc59a2b1..48086ca6ec0373748665c94f9a1ed364681fb726 100644
--- a/app/code/Magento/AdminNotification/Model/Resource/Inbox/Collection/Critical.php
+++ b/app/code/Magento/AdminNotification/Model/Resource/Inbox/Collection/Critical.php
@@ -54,7 +54,7 @@ class Critical extends \Magento\Framework\Model\Resource\Db\Collection\AbstractC
             array('neq' => 1)
         )->addFieldToFilter(
             'severity',
-            \Magento\AdminNotification\Model\Inbox::SEVERITY_CRITICAL
+            \Magento\Framework\Notification\MessageInterface::SEVERITY_CRITICAL
         )->setPageSize(
             1
         );
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 8e44afd3851e1bfb14b4f40e7e0706a85aaa1767..bea61d7a1c4258d2e3ac6805a978663889d86eee 100644
--- a/app/code/Magento/AdminNotification/Model/Resource/System/Message/Collection.php
+++ b/app/code/Magento/AdminNotification/Model/Resource/System/Message/Collection.php
@@ -17,7 +17,7 @@
  * Do not edit or add to this file if you wish to upgrade Magento to newer
  * versions in the future. If you wish to customize Magento for your
  * needs please refer 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)
  */
@@ -28,7 +28,7 @@ class Collection extends \Magento\Framework\Model\Resource\Db\Collection\Abstrac
     /**
      * System message list
      *
-     * @var \Magento\AdminNotification\Model\System\MessageList
+     * @var \Magento\Framework\Notification\MessageList
      */
     protected $_messageList;
 
@@ -44,7 +44,7 @@ class Collection extends \Magento\Framework\Model\Resource\Db\Collection\Abstrac
      * @param \Magento\Framework\Logger $logger
      * @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy
      * @param \Magento\Framework\Event\ManagerInterface $eventManager
-     * @param \Magento\AdminNotification\Model\System\MessageList $messageList
+     * @param \Magento\Framework\Notification\MessageList $messageList
      * @param mixed $connection
      * @param \Magento\Framework\Model\Resource\Db\AbstractDb $resource
      */
@@ -53,7 +53,7 @@ class Collection extends \Magento\Framework\Model\Resource\Db\Collection\Abstrac
         \Magento\Framework\Logger $logger,
         \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
         \Magento\Framework\Event\ManagerInterface $eventManager,
-        \Magento\AdminNotification\Model\System\MessageList $messageList,
+        \Magento\Framework\Notification\MessageList $messageList,
         $connection = null,
         \Magento\Framework\Model\Resource\Db\AbstractDb $resource = null
     ) {
diff --git a/app/code/Magento/AdminNotification/Model/Resource/System/Message/Collection/Synchronized.php b/app/code/Magento/AdminNotification/Model/Resource/System/Message/Collection/Synchronized.php
index c848602c9de06cba85b9c65cf225cb229cb5fd2f..444e85dfa2e709062008331464077964aaae7eeb 100644
--- a/app/code/Magento/AdminNotification/Model/Resource/System/Message/Collection/Synchronized.php
+++ b/app/code/Magento/AdminNotification/Model/Resource/System/Message/Collection/Synchronized.php
@@ -17,7 +17,7 @@
  * Do not edit or add to this file if you wish to upgrade Magento to newer
  * versions in the future. If you wish to customize Magento for your
  * needs please refer 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)
  */
@@ -28,7 +28,7 @@ class Synchronized extends \Magento\AdminNotification\Model\Resource\System\Mess
     /**
      * Unread message list
      *
-     * @var \Magento\AdminNotification\Model\System\MessageInterface[]
+     * @var \Magento\Framework\Notification\MessageInterface[]
      */
     protected $_unreadMessages = array();
 
@@ -74,7 +74,7 @@ class Synchronized extends \Magento\AdminNotification\Model\Resource\System\Mess
     /**
      * Retrieve list of unread messages
      *
-     * @return \Magento\AdminNotification\Model\System\MessageInterface[]
+     * @return \Magento\Framework\Notification\MessageInterface[]
      */
     public function getUnread()
     {
diff --git a/app/code/Magento/AdminNotification/Model/System/Message.php b/app/code/Magento/AdminNotification/Model/System/Message.php
index d4588cf27e11a54e8e665146d6a4bc68ddf8fed2..4701404784803150938b5648071088ea95b8bf00 100644
--- a/app/code/Magento/AdminNotification/Model/System/Message.php
+++ b/app/code/Magento/AdminNotification/Model/System/Message.php
@@ -17,13 +17,13 @@
  * Do not edit or add to this file if you wish to upgrade Magento to newer
  * versions in the future. If you wish to customize Magento for your
  * needs please refer 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\AdminNotification\Model\System;
 
-class Message extends \Magento\Framework\Model\AbstractModel implements \Magento\AdminNotification\Model\System\MessageInterface
+class Message extends \Magento\Framework\Model\AbstractModel implements \Magento\Framework\Notification\MessageInterface
 {
     /**
      * @return void
diff --git a/app/code/Magento/AdminNotification/Model/System/Message/Baseurl.php b/app/code/Magento/AdminNotification/Model/System/Message/Baseurl.php
index 2ede00eb20d10d868d39cc124d38850525998427..92cc992a3b3a9bddd017ec22cbf45607ab9559a4 100644
--- a/app/code/Magento/AdminNotification/Model/System/Message/Baseurl.php
+++ b/app/code/Magento/AdminNotification/Model/System/Message/Baseurl.php
@@ -23,7 +23,7 @@
  */
 namespace Magento\AdminNotification\Model\System\Message;
 
-class Baseurl implements \Magento\AdminNotification\Model\System\MessageInterface
+class Baseurl implements \Magento\Framework\Notification\MessageInterface
 {
     /**
      * @var \Magento\Framework\UrlInterface
diff --git a/app/code/Magento/AdminNotification/Model/System/Message/CacheOutdated.php b/app/code/Magento/AdminNotification/Model/System/Message/CacheOutdated.php
index a7f57b85e212303158cbec5bdc12e341e32e7f54..75154b6ad9c51469b9ff150ee753939d7691ddda 100644
--- a/app/code/Magento/AdminNotification/Model/System/Message/CacheOutdated.php
+++ b/app/code/Magento/AdminNotification/Model/System/Message/CacheOutdated.php
@@ -23,7 +23,7 @@
  */
 namespace Magento\AdminNotification\Model\System\Message;
 
-class CacheOutdated implements \Magento\AdminNotification\Model\System\MessageInterface
+class CacheOutdated implements \Magento\Framework\Notification\MessageInterface
 {
     /**
      * @var \Magento\Framework\UrlInterface
@@ -124,6 +124,6 @@ class CacheOutdated implements \Magento\AdminNotification\Model\System\MessageIn
      */
     public function getSeverity()
     {
-        return \Magento\AdminNotification\Model\System\MessageInterface::SEVERITY_CRITICAL;
+        return \Magento\Framework\Notification\MessageInterface::SEVERITY_CRITICAL;
     }
 }
diff --git a/app/code/Magento/AdminNotification/Model/System/Message/Media/AbstractSynchronization.php b/app/code/Magento/AdminNotification/Model/System/Message/Media/AbstractSynchronization.php
index 5e1c628a00dcd9eecfc4138f925ab8b51a7389c5..515b60a1229b5abf7b08854ba5f521d3437d7368 100644
--- a/app/code/Magento/AdminNotification/Model/System/Message/Media/AbstractSynchronization.php
+++ b/app/code/Magento/AdminNotification/Model/System/Message/Media/AbstractSynchronization.php
@@ -23,7 +23,7 @@
  */
 namespace Magento\AdminNotification\Model\System\Message\Media;
 
-abstract class AbstractSynchronization implements \Magento\AdminNotification\Model\System\MessageInterface
+abstract class AbstractSynchronization implements \Magento\Framework\Notification\MessageInterface
 {
     /**
      * @var \Magento\Core\Model\File\Storage\Flag
@@ -94,6 +94,6 @@ abstract class AbstractSynchronization implements \Magento\AdminNotification\Mod
      */
     public function getSeverity()
     {
-        return \Magento\AdminNotification\Model\System\MessageInterface::SEVERITY_MAJOR;
+        return \Magento\Framework\Notification\MessageInterface::SEVERITY_MAJOR;
     }
 }
diff --git a/app/code/Magento/AdminNotification/Model/System/Message/Security.php b/app/code/Magento/AdminNotification/Model/System/Message/Security.php
index 6a67afb6d0ff6374dba46aa555610afd221c9471..be4632352156b53ba1a99aa9c8c7fab6dceaec5a 100644
--- a/app/code/Magento/AdminNotification/Model/System/Message/Security.php
+++ b/app/code/Magento/AdminNotification/Model/System/Message/Security.php
@@ -23,7 +23,7 @@
  */
 namespace Magento\AdminNotification\Model\System\Message;
 
-class Security implements \Magento\AdminNotification\Model\System\MessageInterface
+class Security implements \Magento\Framework\Notification\MessageInterface
 {
     /**
      * Cache key for saving verification result
@@ -160,6 +160,6 @@ class Security implements \Magento\AdminNotification\Model\System\MessageInterfa
      */
     public function getSeverity()
     {
-        return \Magento\AdminNotification\Model\System\MessageInterface::SEVERITY_CRITICAL;
+        return \Magento\Framework\Notification\MessageInterface::SEVERITY_CRITICAL;
     }
 }
diff --git a/app/code/Magento/AdminNotification/composer.json b/app/code/Magento/AdminNotification/composer.json
index d6f84501f5473fcf7887b249bd7ecb6561428065..ebd21d9c35d9de685e07957491529fb0557d61c7 100644
--- a/app/code/Magento/AdminNotification/composer.json
+++ b/app/code/Magento/AdminNotification/composer.json
@@ -2,17 +2,17 @@
     "name": "magento/module-admin-notification",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "lib-libxml": "*",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/AdminNotification/etc/adminhtml/acl.xml b/app/code/Magento/AdminNotification/etc/acl.xml
similarity index 95%
rename from app/code/Magento/AdminNotification/etc/adminhtml/acl.xml
rename to app/code/Magento/AdminNotification/etc/acl.xml
index 86839ec9013dbdd8a0aac1be8a9228cc8cbe14f7..46059d5147d9243e180cd618bab7b7cbe622666a 100644
--- a/app/code/Magento/AdminNotification/etc/adminhtml/acl.xml
+++ b/app/code/Magento/AdminNotification/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/AdminNotification/etc/adminhtml/di.xml b/app/code/Magento/AdminNotification/etc/adminhtml/di.xml
index 3c16d79e9a5ea205a3eec1e9d2236c0fdd025fab..9c8ba85f63df1b5760995401845ec8bb73bef76c 100644
--- a/app/code/Magento/AdminNotification/etc/adminhtml/di.xml
+++ b/app/code/Magento/AdminNotification/etc/adminhtml/di.xml
@@ -24,13 +24,12 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
-    <type name="Magento\AdminNotification\Model\System\MessageList">
+    <type name="Magento\Framework\Notification\MessageList">
         <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>
diff --git a/app/code/Magento/AdminNotification/etc/di.xml b/app/code/Magento/AdminNotification/etc/di.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a6372146ba8fd2b159e4697da1ce2a32fc954faf
--- /dev/null
+++ b/app/code/Magento/AdminNotification/etc/di.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 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
+    <type name="Magento\Framework\Notification\NotifierList">
+        <arguments>
+            <argument name="notifiers" xsi:type="array">
+                <item name="adminnotification" xsi:type="string">Magento\AdminNotification\Model\Inbox</item>
+            </argument>
+        </arguments>
+    </type>
+</config>
diff --git a/app/code/Magento/AdminNotification/view/adminhtml/web/system/notification.js b/app/code/Magento/AdminNotification/view/adminhtml/web/system/notification.js
index 710f9b6561af6de531bb914be8829c6d8b110335..b5710b6b028611433bc744f9a7075eb287d60b91 100644
--- a/app/code/Magento/AdminNotification/view/adminhtml/web/system/notification.js
+++ b/app/code/Magento/AdminNotification/view/adminhtml/web/system/notification.js
@@ -55,18 +55,6 @@ define([
     });
 
     $(document).ready(function(){
-        $('body').on('surveyYes surveyNo', function(e, data) {
-            if (e.type == 'surveyYes') {
-                var win = window.open(data.surveyUrl, '', 'width=900,height=600,resizable=1,scrollbars=1');
-                win.focus();
-            }
-            $.ajax({
-                url: data.surveyAction,
-                type: 'post',
-                data: {decision: data.decision}
-            })
-        });
-
         $('#system_messages .message-system-short .error').on('click', function() {
             $('#message-system-all').systemMessageDialog('open', 1);
         });
@@ -75,4 +63,4 @@ define([
         });
     });
 
-});
\ No newline at end of file
+});
diff --git a/app/code/Magento/Authorization/Model/Acl/AclRetriever.php b/app/code/Magento/Authorization/Model/Acl/AclRetriever.php
new file mode 100644
index 0000000000000000000000000000000000000000..2e131fb3e149b187098ed6043f055bdcac10cc63
--- /dev/null
+++ b/app/code/Magento/Authorization/Model/Acl/AclRetriever.php
@@ -0,0 +1,165 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Authorization\Model\Acl;
+
+use Magento\Authorization\Model\Resource\Role\CollectionFactory as RoleCollectionFactory;
+use Magento\Authorization\Model\Resource\Rules\CollectionFactory as RulesCollectionFactory;
+use Magento\Authorization\Model\Role;
+use Magento\Authorization\Model\UserContextInterface;
+use Magento\Framework\Acl\Builder as AclBuilder;
+use Magento\Framework\Exception\AuthorizationException;
+use Magento\Framework\Exception\LocalizedException;
+use Magento\Framework\Logger;
+
+/**
+ * Permission tree retriever
+ */
+class AclRetriever
+{
+    const PERMISSION_ANONYMOUS = 'anonymous';
+    const PERMISSION_SELF = 'self';
+
+    /** @var Logger */
+    protected $logger;
+
+    /** @var RulesCollectionFactory */
+    protected $rulesCollectionFactory;
+
+    /** @var AclBuilder */
+    protected $aclBuilder;
+
+    /** @var RoleCollectionFactory */
+    protected $roleCollectionFactory;
+
+    /**
+     * Initialize dependencies.
+     *
+     * @param AclBuilder $aclBuilder
+     * @param RoleCollectionFactory $roleCollectionFactory
+     * @param RulesCollectionFactory $rulesCollectionFactory
+     * @param Logger $logger
+     */
+    public function __construct(
+        AclBuilder $aclBuilder,
+        RoleCollectionFactory $roleCollectionFactory,
+        RulesCollectionFactory $rulesCollectionFactory,
+        Logger $logger
+    ) {
+        $this->logger = $logger;
+        $this->rulesCollectionFactory = $rulesCollectionFactory;
+        $this->aclBuilder = $aclBuilder;
+        $this->roleCollectionFactory = $roleCollectionFactory;
+    }
+
+    /**
+     * Get a list of available resources using user details
+     *
+     * @param string $userType
+     * @param int $userId
+     * @return string[]
+     * @throws AuthorizationException
+     * @throws LocalizedException
+     */
+    public function getAllowedResourcesByUser($userType, $userId)
+    {
+        if ($userType == UserContextInterface::USER_TYPE_GUEST) {
+            return [self::PERMISSION_ANONYMOUS];
+        } elseif ($userType == UserContextInterface::USER_TYPE_CUSTOMER) {
+            return [self::PERMISSION_SELF];
+        }
+        try {
+            $role = $this->_getUserRole($userType, $userId);
+            if (!$role) {
+                throw new AuthorizationException('The role associated with the specified user cannot be found.');
+            }
+            $allowedResources = $this->getAllowedResourcesByRole($role->getId());
+        } catch (AuthorizationException $e) {
+            throw $e;
+        } catch (\Exception $e) {
+            $this->logger->logException($e);
+            throw new LocalizedException(
+                'Error happened while getting a list of allowed resources. Check exception log for details.'
+            );
+        }
+        return $allowedResources;
+    }
+
+    /**
+     * Get a list of available resource using user role id
+     *
+     * @param string $roleId
+     * @return string[]
+     */
+    public function getAllowedResourcesByRole($roleId)
+    {
+        $allowedResources = [];
+        $rulesCollection = $this->rulesCollectionFactory->create();
+        $rulesCollection->getByRoles($roleId)->load();
+        $acl = $this->aclBuilder->getAcl();
+        /** @var \Magento\Authorization\Model\Rules $ruleItem */
+        foreach ($rulesCollection->getItems() as $ruleItem) {
+            $resourceId = $ruleItem->getResourceId();
+            if ($acl->has($resourceId) && $acl->isAllowed($roleId, $resourceId)) {
+                $allowedResources[] = $resourceId;
+            }
+        }
+        return $allowedResources;
+    }
+
+    /**
+     * Identify user role from user identifier.
+     *
+     * @param string $userType
+     * @param int $userId
+     * @return \Magento\Authorization\Model\Role|bool False if no role associated with provided user was found.
+     * @throws \LogicException
+     */
+    protected function _getUserRole($userType, $userId)
+    {
+        if (!$this->_canRoleBeCreatedForUserType($userType)) {
+            throw new \LogicException(
+                "The role with user type '{$userType}' does not exist and cannot be created"
+            );
+        }
+        $roleCollection = $this->roleCollectionFactory->create();
+        /** @var Role $role */
+        $role = $roleCollection->setUserFilter($userId, $userType)->getFirstItem();
+        return $role->getId() ? $role : false;
+    }
+
+    /**
+     * Check if the role can be associated with user having provided user type.
+     *
+     * Roles can be created for integrations and admin users only.
+     *
+     * @param int $userType
+     * @return bool
+     */
+    protected function _canRoleBeCreatedForUserType($userType)
+    {
+        return ($userType == UserContextInterface::USER_TYPE_INTEGRATION)
+            || ($userType == UserContextInterface::USER_TYPE_ADMIN);
+    }
+}
diff --git a/app/code/Magento/User/Model/Acl/Loader/Role.php b/app/code/Magento/Authorization/Model/Acl/Loader/Role.php
similarity index 79%
rename from app/code/Magento/User/Model/Acl/Loader/Role.php
rename to app/code/Magento/Authorization/Model/Acl/Loader/Role.php
index 4054deab325089fbf619c6bd16062f632522d2e6..dc82131a87f36fc1c20d5fe1b6c7162b70a657df 100644
--- a/app/code/Magento/User/Model/Acl/Loader/Role.php
+++ b/app/code/Magento/Authorization/Model/Acl/Loader/Role.php
@@ -21,10 +21,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\User\Model\Acl\Loader;
+namespace Magento\Authorization\Model\Acl\Loader;
 
-use Magento\User\Model\Acl\Role\Group as RoleGroup;
-use Magento\User\Model\Acl\Role\User as RoleUser;
+use Magento\Authorization\Model\Acl\Role\Group as RoleGroup;
+use Magento\Authorization\Model\Acl\Role\User as RoleUser;
 
 class Role implements \Magento\Framework\Acl\LoaderInterface
 {
@@ -34,23 +34,23 @@ class Role implements \Magento\Framework\Acl\LoaderInterface
     protected $_resource;
 
     /**
-     * @var \Magento\User\Model\Acl\Role\GroupFactory
+     * @var \Magento\Authorization\Model\Acl\Role\GroupFactory
      */
     protected $_groupFactory;
 
     /**
-     * @var \Magento\User\Model\Acl\Role\UserFactory
+     * @var \Magento\Authorization\Model\Acl\Role\UserFactory
      */
     protected $_roleFactory;
 
     /**
-     * @param \Magento\User\Model\Acl\Role\GroupFactory $groupFactory
-     * @param \Magento\User\Model\Acl\Role\UserFactory $roleFactory
+     * @param \Magento\Authorization\Model\Acl\Role\GroupFactory $groupFactory
+     * @param \Magento\Authorization\Model\Acl\Role\UserFactory $roleFactory
      * @param \Magento\Framework\App\Resource $resource
      */
     public function __construct(
-        \Magento\User\Model\Acl\Role\GroupFactory $groupFactory,
-        \Magento\User\Model\Acl\Role\UserFactory $roleFactory,
+        \Magento\Authorization\Model\Acl\Role\GroupFactory $groupFactory,
+        \Magento\Authorization\Model\Acl\Role\UserFactory $roleFactory,
         \Magento\Framework\App\Resource $resource
     ) {
         $this->_resource = $resource;
@@ -66,7 +66,7 @@ class Role implements \Magento\Framework\Acl\LoaderInterface
      */
     public function populateAcl(\Magento\Framework\Acl $acl)
     {
-        $roleTableName = $this->_resource->getTableName('admin_role');
+        $roleTableName = $this->_resource->getTableName('authorization_role');
         $adapter = $this->_resource->getConnection('core_read');
 
         $select = $adapter->select()->from($roleTableName)->order('tree_level');
diff --git a/app/code/Magento/User/Model/Acl/Loader/Rule.php b/app/code/Magento/Authorization/Model/Acl/Loader/Rule.php
similarity index 95%
rename from app/code/Magento/User/Model/Acl/Loader/Rule.php
rename to app/code/Magento/Authorization/Model/Acl/Loader/Rule.php
index 25230c259ff89b1ca22eadf3887a1212a6de21ff..8a2953d65d1f20219213eb57ce91217e16166047 100644
--- a/app/code/Magento/User/Model/Acl/Loader/Rule.php
+++ b/app/code/Magento/Authorization/Model/Acl/Loader/Rule.php
@@ -21,7 +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\User\Model\Acl\Loader;
+namespace Magento\Authorization\Model\Acl\Loader;
 
 class Rule implements \Magento\Framework\Acl\LoaderInterface
 {
@@ -53,7 +53,7 @@ class Rule implements \Magento\Framework\Acl\LoaderInterface
      */
     public function populateAcl(\Magento\Framework\Acl $acl)
     {
-        $ruleTable = $this->_resource->getTableName("admin_rule");
+        $ruleTable = $this->_resource->getTableName("authorization_rule");
 
         $adapter = $this->_resource->getConnection('core_read');
 
diff --git a/app/code/Magento/User/Model/Acl/Role/Generic.php b/app/code/Magento/Authorization/Model/Acl/Role/Generic.php
similarity index 93%
rename from app/code/Magento/User/Model/Acl/Role/Generic.php
rename to app/code/Magento/Authorization/Model/Acl/Role/Generic.php
index 80a8b3f6cdee375a247db98398935da1f20991db..3b39cf76eaacd9a8cd1add4936c2df932dc1e095 100644
--- a/app/code/Magento/User/Model/Acl/Role/Generic.php
+++ b/app/code/Magento/Authorization/Model/Acl/Role/Generic.php
@@ -21,10 +21,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\User\Model\Acl\Role;
+namespace Magento\Authorization\Model\Acl\Role;
 
 /**
- * User acl role
+ * Generic acl role
  */
 class Generic extends \Zend_Acl_Role
 {
diff --git a/app/code/Magento/User/Model/Acl/Role/Group.php b/app/code/Magento/Authorization/Model/Acl/Role/Group.php
similarity index 90%
rename from app/code/Magento/User/Model/Acl/Role/Group.php
rename to app/code/Magento/Authorization/Model/Acl/Role/Group.php
index 08b5df2068844253611d27867e382ec0eae93e54..7c2346d4f59d35e87421ec0ab3b44beb41e1d116 100644
--- a/app/code/Magento/User/Model/Acl/Role/Group.php
+++ b/app/code/Magento/Authorization/Model/Acl/Role/Group.php
@@ -21,12 +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\User\Model\Acl\Role;
+namespace Magento\Authorization\Model\Acl\Role;
 
 /**
  * Acl Group model
  */
-class Group extends \Magento\User\Model\Acl\Role\Generic
+class Group extends \Magento\Authorization\Model\Acl\Role\Generic
 {
     /**
      * All the group roles are prepended by G
diff --git a/app/code/Magento/User/Model/Acl/Role/User.php b/app/code/Magento/Authorization/Model/Acl/Role/User.php
similarity index 90%
rename from app/code/Magento/User/Model/Acl/Role/User.php
rename to app/code/Magento/Authorization/Model/Acl/Role/User.php
index 4d37e7ca89adbd75d68246946b5dd33c8c7cca92..69383609782c72e582f882f5ceac10855dc8ee3b 100644
--- a/app/code/Magento/User/Model/Acl/Role/User.php
+++ b/app/code/Magento/Authorization/Model/Acl/Role/User.php
@@ -21,12 +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\User\Model\Acl\Role;
+namespace Magento\Authorization\Model\Acl\Role;
 
 /**
  * User acl role
  */
-class User extends \Magento\User\Model\Acl\Role\Generic
+class User extends \Magento\Authorization\Model\Acl\Role\Generic
 {
     /**
      * All the user roles are prepended by U
diff --git a/app/code/Magento/Authorization/Model/CompositeUserContext.php b/app/code/Magento/Authorization/Model/CompositeUserContext.php
new file mode 100644
index 0000000000000000000000000000000000000000..5707ac12a3252fd4ca86fcb0d3a4755a952d31d6
--- /dev/null
+++ b/app/code/Magento/Authorization/Model/CompositeUserContext.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\Authorization\Model;
+
+class CompositeUserContext implements \Magento\Authorization\Model\UserContextInterface
+{
+    /**
+     * @var UserContextInterface[]
+     */
+    protected $userContexts = [];
+
+    /**
+     * @var UserContextInterface|bool
+     */
+    protected $chosenUserContext;
+
+    /**
+     * Register user contexts.
+     *
+     * @param UserContextInterface[] $userContexts
+     */
+    public function __construct($userContexts = [])
+    {
+        $userContexts = array_filter(
+            $userContexts,
+            function ($item) {
+                return isset($item['type']) && isset($item['sortOrder']);
+            }
+        );
+
+        uasort($userContexts, array($this, 'compareContextsSortOrder'));
+
+        foreach ($userContexts as $userContext) {
+            $this->add($userContext['type']);
+        }
+    }
+
+    /**
+     * Add user context.
+     *
+     * @param UserContextInterface $userContext
+     * @return CompositeUserContext
+     */
+    protected function add(UserContextInterface $userContext)
+    {
+        $this->userContexts[] = $userContext;
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getUserId()
+    {
+        return $this->getUserContext() ? $this->getUserContext()->getUserId() : null;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getUserType()
+    {
+        return $this->getUserContext() ? $this->getUserContext()->getUserType() : null;
+    }
+
+    /**
+     * Retrieve user context
+     *
+     * @return UserContextInterface|bool False if none of the registered user contexts can identify user type
+     */
+    protected function getUserContext()
+    {
+        if (is_null($this->chosenUserContext)) {
+            /** @var UserContextInterface $userContext */
+            foreach ($this->userContexts as $userContext) {
+                if ($userContext->getUserType() && !is_null($userContext->getUserId())) {
+                    $this->chosenUserContext = $userContext;
+                    break;
+                }
+            }
+            if (is_null($this->chosenUserContext)) {
+                $this->chosenUserContext = false;
+            }
+        }
+        return $this->chosenUserContext;
+    }
+
+    /**
+     * Compare contexts sortOrder
+     *
+     * @param array $contextDataFirst
+     * @param array $contextDataSecond
+     * @return int
+     */
+    protected function compareContextsSortOrder($contextDataFirst, $contextDataSecond)
+    {
+        if ((int)$contextDataFirst['sortOrder'] == (int)$contextDataSecond['sortOrder']) {
+            return 0;
+        }
+
+        if ((int)$contextDataFirst['sortOrder'] < (int)$contextDataSecond['sortOrder']) {
+            return -1;
+        } else {
+            return 1;
+        }
+    }
+}
diff --git a/app/code/Magento/User/Model/Resource/Permissions/Collection.php b/app/code/Magento/Authorization/Model/Resource/Permissions/Collection.php
similarity index 88%
rename from app/code/Magento/User/Model/Resource/Permissions/Collection.php
rename to app/code/Magento/Authorization/Model/Resource/Permissions/Collection.php
index 2ca9f8d6506b42515501059b399be1afd91414d4..4fca3cee80e135c7b38c9d87c021fbc724d252b9 100644
--- a/app/code/Magento/User/Model/Resource/Permissions/Collection.php
+++ b/app/code/Magento/Authorization/Model/Resource/Permissions/Collection.php
@@ -21,7 +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\User\Model\Resource\Permissions;
+namespace Magento\Authorization\Model\Resource\Permissions;
 
 /**
  * Admin permissions collection
@@ -37,6 +37,6 @@ class Collection extends \Magento\Framework\Model\Resource\Db\Collection\Abstrac
      */
     protected function _construct()
     {
-        $this->_init('Magento\User\Model\Rules', 'Magento\User\Model\Resource\Rules');
+        $this->_init('Magento\Authorization\Model\Rules', 'Magento\Authorization\Model\Resource\Rules');
     }
 }
diff --git a/app/code/Magento/User/Model/Resource/Role.php b/app/code/Magento/Authorization/Model/Resource/Role.php
similarity index 76%
rename from app/code/Magento/User/Model/Resource/Role.php
rename to app/code/Magento/Authorization/Model/Resource/Role.php
index ea45c024f84d91d58ec9f9eab4124687a40d6818..e79cf181e42bc1dbaf964bb193c9e0caeaecf519 100644
--- a/app/code/Magento/User/Model/Resource/Role.php
+++ b/app/code/Magento/Authorization/Model/Resource/Role.php
@@ -21,22 +21,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\User\Model\Resource;
+namespace Magento\Authorization\Model\Resource;
 
-use Magento\User\Model\Acl\Role\User as RoleUser;
+use Magento\Authorization\Model\Acl\Role\User as RoleUser;
 
 /**
  * Admin role resource model
  */
 class Role extends \Magento\Framework\Model\Resource\Db\AbstractDb
 {
-    /**
-     * Users table
-     *
-     * @var string
-     */
-    protected $_usersTable;
-
     /**
      * Rule table
      *
@@ -78,10 +71,8 @@ class Role extends \Magento\Framework\Model\Resource\Db\AbstractDb
      */
     protected function _construct()
     {
-        $this->_init('admin_role', 'role_id');
-
-        $this->_usersTable = $this->getTable('admin_user');
-        $this->_ruleTable = $this->getTable('admin_rule');
+        $this->_init('authorization_role', 'role_id');
+        $this->_ruleTable = $this->getTable('authorization_rule');
     }
 
     /**
@@ -139,7 +130,6 @@ class Role extends \Magento\Framework\Model\Resource\Db\AbstractDb
      */
     protected function _afterSave(\Magento\Framework\Model\AbstractModel $role)
     {
-        $this->_updateRoleUsersAcl($role);
         $this->_cache->clean(\Zend_Cache::CLEANING_MODE_MATCHING_TAG, array(\Magento\Backend\Block\Menu::CACHE_TAGS));
         return $this;
     }
@@ -164,47 +154,21 @@ class Role extends \Magento\Framework\Model\Resource\Db\AbstractDb
     /**
      * Get role users
      *
-     * @param \Magento\User\Model\Role $role
+     * @param \Magento\Authorization\Model\Role $role
      * @return array
      */
-    public function getRoleUsers(\Magento\User\Model\Role $role)
+    public function getRoleUsers(\Magento\Authorization\Model\Role $role)
     {
         $read = $this->_getReadAdapter();
 
         $binds = array('role_id' => $role->getId(), 'role_type' => RoleUser::ROLE_TYPE);
 
-        $select = $read->select()->from(
-            $this->getMainTable(),
-            array('user_id')
-        )->where(
-            'parent_id = :role_id'
-        )->where(
-            'role_type = :role_type'
-        )->where(
-            'user_id > 0'
-        );
+        $select = $read->select()
+            ->from($this->getMainTable(), array('user_id'))
+            ->where('parent_id = :role_id')
+            ->where('role_type = :role_type')
+            ->where('user_id > 0');
 
         return $read->fetchCol($select, $binds);
     }
-
-    /**
-     * Update role users ACL
-     *
-     * @param \Magento\User\Model\Role $role
-     * @return bool
-     */
-    private function _updateRoleUsersAcl(\Magento\User\Model\Role $role)
-    {
-        $write = $this->_getWriteAdapter();
-        $users = $this->getRoleUsers($role);
-        $rowsCount = 0;
-
-        if (sizeof($users) > 0) {
-            $bind = array('reload_acl_flag' => 1);
-            $where = array('user_id IN(?)' => $users);
-            $rowsCount = $write->update($this->_usersTable, $bind, $where);
-        }
-
-        return $rowsCount > 0;
-    }
 }
diff --git a/app/code/Magento/User/Model/Resource/Role/Collection.php b/app/code/Magento/Authorization/Model/Resource/Role/Collection.php
similarity index 89%
rename from app/code/Magento/User/Model/Resource/Role/Collection.php
rename to app/code/Magento/Authorization/Model/Resource/Role/Collection.php
index 3cce8f1b699cca6ec6785989366b09f31486c50a..98e25949f8a51c6f504ee2236f72b19ce3b67086 100644
--- a/app/code/Magento/User/Model/Resource/Role/Collection.php
+++ b/app/code/Magento/Authorization/Model/Resource/Role/Collection.php
@@ -21,9 +21,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\User\Model\Resource\Role;
+namespace Magento\Authorization\Model\Resource\Role;
 
-use Magento\User\Model\Acl\Role\Group as RoleGroup;
+use Magento\Authorization\Model\Acl\Role\Group as RoleGroup;
 
 /**
  * Admin role collection
@@ -37,7 +37,7 @@ class Collection extends \Magento\Framework\Model\Resource\Db\Collection\Abstrac
      */
     protected function _construct()
     {
-        $this->_init('Magento\User\Model\Role', 'Magento\User\Model\Resource\Role');
+        $this->_init('Magento\Authorization\Model\Role', 'Magento\Authorization\Model\Resource\Role');
     }
 
     /**
diff --git a/app/code/Magento/User/Model/Resource/Role/Grid/Collection.php b/app/code/Magento/Authorization/Model/Resource/Role/Grid/Collection.php
similarity index 85%
rename from app/code/Magento/User/Model/Resource/Role/Grid/Collection.php
rename to app/code/Magento/Authorization/Model/Resource/Role/Grid/Collection.php
index a111d9b1d60a9b38506d436e7daa775f9ba21332..9355017b41d60a0bf5b8a6d41f8b69c0d9692c0f 100644
--- a/app/code/Magento/User/Model/Resource/Role/Grid/Collection.php
+++ b/app/code/Magento/Authorization/Model/Resource/Role/Grid/Collection.php
@@ -21,14 +21,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\User\Model\Resource\Role\Grid;
+namespace Magento\Authorization\Model\Resource\Role\Grid;
 
-use Magento\User\Model\Acl\Role\Group as RoleGroup;
+use Magento\Authorization\Model\Acl\Role\Group as RoleGroup;
 
 /**
  * Admin role data grid collection
  */
-class Collection extends \Magento\User\Model\Resource\Role\Collection
+class Collection extends \Magento\Authorization\Model\Resource\Role\Collection
 {
     /**
      * Prepare select for load
diff --git a/app/code/Magento/User/Model/Resource/Rules.php b/app/code/Magento/Authorization/Model/Resource/Rules.php
similarity index 95%
rename from app/code/Magento/User/Model/Resource/Rules.php
rename to app/code/Magento/Authorization/Model/Resource/Rules.php
index 1a82b9a4982897133a4e4c6ed0d804dcdbdf80c4..478eff8864c7728e914a871a7a6228d10e11fab9 100644
--- a/app/code/Magento/User/Model/Resource/Rules.php
+++ b/app/code/Magento/Authorization/Model/Resource/Rules.php
@@ -21,7 +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\User\Model\Resource;
+namespace Magento\Authorization\Model\Resource;
 
 /**
  * Admin rule resource model
@@ -80,17 +80,17 @@ class Rules extends \Magento\Framework\Model\Resource\Db\AbstractDb
      */
     protected function _construct()
     {
-        $this->_init('admin_rule', 'rule_id');
+        $this->_init('authorization_rule', 'rule_id');
     }
 
     /**
      * Save ACL resources
      *
-     * @param \Magento\User\Model\Rules $rule
+     * @param \Magento\Authorization\Model\Rules $rule
      * @return void
      * @throws \Magento\Framework\Model\Exception
      */
-    public function saveRel(\Magento\User\Model\Rules $rule)
+    public function saveRel(\Magento\Authorization\Model\Rules $rule)
     {
         try {
             $adapter = $this->_getWriteAdapter();
diff --git a/app/code/Magento/User/Model/Resource/Rules/Collection.php b/app/code/Magento/Authorization/Model/Resource/Rules/Collection.php
similarity index 91%
rename from app/code/Magento/User/Model/Resource/Rules/Collection.php
rename to app/code/Magento/Authorization/Model/Resource/Rules/Collection.php
index 8814282b440432e09b2f07e1e2f26a18fe04423d..a07788825876b9cadab513d0a7d835d1fc0e850a 100644
--- a/app/code/Magento/User/Model/Resource/Rules/Collection.php
+++ b/app/code/Magento/Authorization/Model/Resource/Rules/Collection.php
@@ -21,7 +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\User\Model\Resource\Rules;
+namespace Magento\Authorization\Model\Resource\Rules;
 
 /**
  * Rules collection
@@ -37,7 +37,7 @@ class Collection extends \Magento\Framework\Model\Resource\Db\Collection\Abstrac
      */
     protected function _construct()
     {
-        $this->_init('Magento\User\Model\Rules', 'Magento\User\Model\Resource\Rules');
+        $this->_init('Magento\Authorization\Model\Rules', 'Magento\Authorization\Model\Resource\Rules');
     }
 
     /**
diff --git a/app/code/Magento/User/Model/Resource/Setup.php b/app/code/Magento/Authorization/Model/Resource/Setup.php
similarity index 69%
rename from app/code/Magento/User/Model/Resource/Setup.php
rename to app/code/Magento/Authorization/Model/Resource/Setup.php
index da215bd1e5866225ac855b00311b3b46b7101936..e66ee4ec3dd3272e821db3363582106a4942f8bc 100644
--- a/app/code/Magento/User/Model/Resource/Setup.php
+++ b/app/code/Magento/Authorization/Model/Resource/Setup.php
@@ -21,7 +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\User\Model\Resource;
+namespace Magento\Authorization\Model\Resource;
 
 /**
  * Resource Setup Model
@@ -34,49 +34,49 @@ class Setup extends \Magento\Framework\Module\Setup
     /**
      * Role model factory
      *
-     * @var \Magento\User\Model\RoleFactory
+     * @var \Magento\Authorization\Model\RoleFactory
      */
     protected $_roleCollectionFactory;
 
     /**
-     * Factory for user rules model
+     * Factory for rules model
      *
-     * @var \Magento\User\Model\RulesFactory
+     * @var \Magento\Authorization\Model\RulesFactory
      */
     protected $_rulesCollectionFactory;
 
     /**
      * Role model factory
      *
-     * @var \Magento\User\Model\RoleFactory
+     * @var \Magento\Authorization\Model\RoleFactory
      */
     protected $_roleFactory;
 
     /**
      * Rules model factory
      *
-     * @var \Magento\User\Model\RulesFactory
+     * @var \Magento\Authorization\Model\RulesFactory
      */
     protected $_rulesFactory;
 
     /**
      * @param \Magento\Framework\Module\Setup\Context $context
      * @param string $resourceName
-     * @param \Magento\User\Model\Resource\Role\CollectionFactory $roleCollectionFactory
-     * @param \Magento\User\Model\Resource\Rules\CollectionFactory $rulesCollectionFactory
-     * @param \Magento\User\Model\RoleFactory $roleFactory
-     * @param \Magento\User\Model\RulesFactory $rulesFactory
+     * @param \Magento\Authorization\Model\Resource\Role\CollectionFactory $roleCollectionFactory
+     * @param \Magento\Authorization\Model\Resource\Rules\CollectionFactory $rulesCollectionFactory
+     * @param \Magento\Authorization\Model\RoleFactory $roleFactory
+     * @param \Magento\Authorization\Model\RulesFactory $rulesFactory
      * @param string $moduleName
      * @param string $connectionName
      */
     public function __construct(
         \Magento\Framework\Module\Setup\Context $context,
         $resourceName,
-        \Magento\User\Model\Resource\Role\CollectionFactory $roleCollectionFactory,
-        \Magento\User\Model\Resource\Rules\CollectionFactory $rulesCollectionFactory,
-        \Magento\User\Model\RoleFactory $roleFactory,
-        \Magento\User\Model\RulesFactory $rulesFactory,
-        $moduleName = 'Magento_User',
+        \Magento\Authorization\Model\Resource\Role\CollectionFactory $roleCollectionFactory,
+        \Magento\Authorization\Model\Resource\Rules\CollectionFactory $rulesCollectionFactory,
+        \Magento\Authorization\Model\RoleFactory $roleFactory,
+        \Magento\Authorization\Model\RulesFactory $rulesFactory,
+        $moduleName = 'Magento_Authorization',
         $connectionName = \Magento\Framework\Module\Updater\SetupInterface::DEFAULT_SETUP_CONNECTION
     ) {
         $this->_roleCollectionFactory = $roleCollectionFactory;
@@ -89,7 +89,7 @@ class Setup extends \Magento\Framework\Module\Setup
     /**
      * Creates role collection
      *
-     * @return \Magento\User\Model\Resource\Role\Collection
+     * @return \Magento\Authorization\Model\Resource\Role\Collection
      */
     public function createRoleCollection()
     {
@@ -99,7 +99,7 @@ class Setup extends \Magento\Framework\Module\Setup
     /**
      * Creates rules collection
      *
-     * @return \Magento\User\Model\Resource\Rules\Collection
+     * @return \Magento\Authorization\Model\Resource\Rules\Collection
      */
     public function createRulesCollection()
     {
@@ -109,7 +109,7 @@ class Setup extends \Magento\Framework\Module\Setup
     /**
      * Creates role model
      *
-     * @return \Magento\User\Model\Role
+     * @return \Magento\Authorization\Model\Role
      */
     public function createRole()
     {
@@ -119,7 +119,7 @@ class Setup extends \Magento\Framework\Module\Setup
     /**
      * Creates rules model
      *
-     * @return \Magento\User\Model\Rules
+     * @return \Magento\Authorization\Model\Rules
      */
     public function createRules()
     {
diff --git a/app/code/Magento/User/Model/Role.php b/app/code/Magento/Authorization/Model/Role.php
similarity index 58%
rename from app/code/Magento/User/Model/Role.php
rename to app/code/Magento/Authorization/Model/Role.php
index ae3bc63f6346aba57c6d2b62b32d49c07bdf30a0..68d9f927631225ec3aaacc2aec14d4c316046c94 100644
--- a/app/code/Magento/User/Model/Role.php
+++ b/app/code/Magento/Authorization/Model/Role.php
@@ -21,57 +21,49 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-namespace Magento\User\Model;
+namespace Magento\Authorization\Model;
 
 /**
  * Admin Role Model
  *
- * @method \Magento\User\Model\Resource\Role _getResource()
- * @method \Magento\User\Model\Resource\Role getResource()
+ * @method \Magento\Authorization\Model\Resource\Role _getResource()
+ * @method \Magento\Authorization\Model\Resource\Role getResource()
  * @method int getParentId()
- * @method \Magento\User\Model\Role setParentId(int $value)
+ * @method \Magento\Authorization\Model\Role setParentId(int $value)
  * @method int getTreeLevel()
- * @method \Magento\User\Model\Role setTreeLevel(int $value)
+ * @method \Magento\Authorization\Model\Role setTreeLevel(int $value)
  * @method int getSortOrder()
- * @method \Magento\User\Model\Role setSortOrder(int $value)
+ * @method \Magento\Authorization\Model\Role setSortOrder(int $value)
  * @method string getRoleType()
- * @method \Magento\User\Model\Role setRoleType(string $value)
+ * @method \Magento\Authorization\Model\Role setRoleType(string $value)
  * @method int getUserId()
- * @method \Magento\User\Model\Role setUserId(int $value)
+ * @method \Magento\Authorization\Model\Role setUserId(int $value)
  * @method string getUserType()
- * @method \Magento\User\Model\Role setUserType(string $value)
+ * @method \Magento\Authorization\Model\Role setUserType(string $value)
  * @method string getRoleName()
- * @method \Magento\User\Model\Role setRoleName(string $value)
+ * @method \Magento\Authorization\Model\Role setRoleName(string $value)
  */
 class Role extends \Magento\Framework\Model\AbstractModel
 {
     /**
      * @var string
      */
-    protected $_eventPrefix = 'admin_roles';
-
-    /**
-     * @var \Magento\User\Model\Resource\Role\User\CollectionFactory
-     */
-    protected $_userRolesFactory;
+    protected $_eventPrefix = 'authorization_roles';
 
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param Resource\Role\User\CollectionFactory $userRolesFactory
-     * @param Resource\Role $resource
-     * @param Resource\Role\Collection $resourceCollection
+     * @param \Magento\Authorization\Model\Resource\Role $resource
+     * @param \Magento\Authorization\Model\Resource\Role\Collection $resourceCollection
      * @param array $data
      */
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\User\Model\Resource\Role\User\CollectionFactory $userRolesFactory,
-        \Magento\User\Model\Resource\Role $resource,
-        \Magento\User\Model\Resource\Role\Collection $resourceCollection,
+        \Magento\Authorization\Model\Resource\Role $resource,
+        \Magento\Authorization\Model\Resource\Role\Collection $resourceCollection,
         array $data = array()
     ) {
-        $this->_userRolesFactory = $userRolesFactory;
         parent::__construct($context, $registry, $resource, $resourceCollection, $data);
     }
 
@@ -81,7 +73,7 @@ class Role extends \Magento\Framework\Model\AbstractModel
     public function __sleep()
     {
         $properties = parent::__sleep();
-        return array_diff($properties, array('_userRolesFactory', '_resource', '_resourceCollection'));
+        return array_diff($properties, array('_resource', '_resourceCollection'));
     }
 
     /**
@@ -91,9 +83,8 @@ class Role extends \Magento\Framework\Model\AbstractModel
     {
         parent::__wakeup();
         $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
-        $this->_userRolesFactory = $objectManager->get('Magento\User\Model\Resource\Role\User\CollectionFactory');
-        $this->_resource = $objectManager->get('Magento\User\Model\Resource\Role');
-        $this->_resourceCollection = $objectManager->get('Magento\User\Model\Resource\Role\Collection');
+        $this->_resource = $objectManager->get('Magento\Authorization\Model\Resource\Role');
+        $this->_resourceCollection = $objectManager->get('Magento\Authorization\Model\Resource\Role\Collection');
     }
 
     /**
@@ -103,7 +94,7 @@ class Role extends \Magento\Framework\Model\AbstractModel
      */
     protected function _construct()
     {
-        $this->_init('Magento\User\Model\Resource\Role');
+        $this->_init('Magento\Authorization\Model\Resource\Role');
     }
 
     /**
@@ -117,16 +108,6 @@ class Role extends \Magento\Framework\Model\AbstractModel
         return $this;
     }
 
-    /**
-     * Retrieve users collection
-     *
-     * @return \Magento\User\Model\Resource\Role\User\Collection
-     */
-    public function getUsersCollection()
-    {
-        return $this->_userRolesFactory->create();
-    }
-
     /**
      * Return users for role
      *
diff --git a/app/code/Magento/User/Model/Rules.php b/app/code/Magento/Authorization/Model/Rules.php
similarity index 68%
rename from app/code/Magento/User/Model/Rules.php
rename to app/code/Magento/Authorization/Model/Rules.php
index abfa69254f8884959753748d61cbe4218727814c..8418ffaa3ff647d0d2b38f14fead8f32ff03c955 100644
--- a/app/code/Magento/User/Model/Rules.php
+++ b/app/code/Magento/Authorization/Model/Rules.php
@@ -21,23 +21,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\User\Model;
+
+namespace Magento\Authorization\Model;
 
 /**
  * Admin Rules Model
  *
- * @method \Magento\User\Model\Resource\Rules _getResource()
- * @method \Magento\User\Model\Resource\Rules getResource()
+ * @method \Magento\Authorization\Model\Resource\Rules _getResource()
+ * @method \Magento\Authorization\Model\Resource\Rules getResource()
  * @method int getRoleId()
- * @method \Magento\User\Model\Rules setRoleId(int $value)
+ * @method \Magento\Authorization\Model\Rules setRoleId(int $value)
  * @method string getResourceId()
- * @method \Magento\User\Model\Rules setResourceId(string $value)
+ * @method \Magento\Authorization\Model\Rules setResourceId(string $value)
  * @method string getPrivileges()
- * @method \Magento\User\Model\Rules setPrivileges(string $value)
+ * @method \Magento\Authorization\Model\Rules setPrivileges(string $value)
  * @method int getAssertId()
- * @method \Magento\User\Model\Rules setAssertId(int $value)
+ * @method \Magento\Authorization\Model\Rules setAssertId(int $value)
  * @method string getPermission()
- * @method \Magento\User\Model\Rules setPermission(string $value)
+ * @method \Magento\Authorization\Model\Rules setPermission(string $value)
  */
 class Rules extends \Magento\Framework\Model\AbstractModel
 {
@@ -46,15 +47,15 @@ class Rules extends \Magento\Framework\Model\AbstractModel
      *
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
-     * @param Resource\Rules $resource
-     * @param Resource\Permissions\Collection $resourceCollection
+     * @param \Magento\Authorization\Model\Resource\Rules $resource
+     * @param \Magento\Authorization\Model\Resource\Permissions\Collection $resourceCollection
      * @param array $data
      */
     public function __construct(
         \Magento\Framework\Model\Context $context,
         \Magento\Framework\Registry $registry,
-        \Magento\User\Model\Resource\Rules $resource,
-        \Magento\User\Model\Resource\Permissions\Collection $resourceCollection,
+        \Magento\Authorization\Model\Resource\Rules $resource,
+        \Magento\Authorization\Model\Resource\Permissions\Collection $resourceCollection,
         array $data = array()
     ) {
         parent::__construct($context, $registry, $resource, $resourceCollection, $data);
@@ -67,7 +68,7 @@ class Rules extends \Magento\Framework\Model\AbstractModel
      */
     protected function _construct()
     {
-        $this->_init('Magento\User\Model\Resource\Rules');
+        $this->_init('Magento\Authorization\Model\Resource\Rules');
     }
 
     /**
diff --git a/app/code/Magento/Authz/Model/UserLocatorInterface.php b/app/code/Magento/Authorization/Model/UserContextInterface.php
similarity index 76%
rename from app/code/Magento/Authz/Model/UserLocatorInterface.php
rename to app/code/Magento/Authorization/Model/UserContextInterface.php
index 361e62e09cebd2a1bc5ff6a49e6b62a769cc911f..948eb755390f20e1565fdb859d0e45dbb689c8a6 100644
--- a/app/code/Magento/Authz/Model/UserLocatorInterface.php
+++ b/app/code/Magento/Authorization/Model/UserContextInterface.php
@@ -21,24 +21,34 @@
  * @copyright   Copyright (c) 2014 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;
+
+namespace Magento\Authorization\Model;
 
 /**
  * Interface for current user identification.
  */
-interface UserLocatorInterface
+interface UserContextInterface
 {
+    /**#@+
+     * User type
+     */
+    const USER_TYPE_INTEGRATION = 1;
+    const USER_TYPE_ADMIN = 2;
+    const USER_TYPE_CUSTOMER = 3;
+    const USER_TYPE_GUEST = 4;
+    /**#@-*/
+
     /**
      * Identify current user ID.
      *
-     * @return int
+     * @return int|null
      */
     public function getUserId();
 
     /**
-     * Retrieve current user type (Admin, Customer, Guest, Integration).
+     * Retrieve current user type.
      *
-     * @return string
+     * @return int|null
      */
     public function getUserType();
 }
diff --git a/app/code/Magento/Authorization/composer.json b/app/code/Magento/Authorization/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..a00c08d4b68deaec3e5c9ec8ba1da9b83e8465ec
--- /dev/null
+++ b/app/code/Magento/Authorization/composer.json
@@ -0,0 +1,20 @@
+{
+    "name": "magento/module-authorization",
+    "description": "Authorization module provides access to Magento ACL functionality.",
+    "require": {
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
+        "magento/magento-composer-installer": "*"
+    },
+    "type": "magento2-module",
+    "version": "0.1.0-alpha90",
+    "extra": {
+        "map": [
+            [
+                "*",
+                "Magento/Authorization"
+            ]
+        ]
+    }
+}
diff --git a/app/code/Magento/User/data/user_setup/data-install-1.6.0.0.php b/app/code/Magento/Authorization/data/authorization_setup/data-install-1.0.0.0.php
similarity index 69%
rename from app/code/Magento/User/data/user_setup/data-install-1.6.0.0.php
rename to app/code/Magento/Authorization/data/authorization_setup/data-install-1.0.0.0.php
index 013d4117f470f3589f60f8cfecb17efb62ebe1a9..483a6ee18fca6afb470ffabb2f6dd62e36f2302f 100644
--- a/app/code/Magento/User/data/user_setup/data-install-1.6.0.0.php
+++ b/app/code/Magento/Authorization/data/authorization_setup/data-install-1.0.0.0.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)
  */
-use Magento\User\Model\Acl\Role\Group as RoleGroup;
+use Magento\Authorization\Model\Acl\Role\Group as RoleGroup;
+use Magento\Authorization\Model\UserContextInterface;
 
 /**
  * Save administrators group role and rules
  */
 
-/** @var \Magento\User\Model\Resource\Setup $this */
+/** @var \Magento\Authorization\Model\Resource\Setup $this */
 
-$roleCollection = $this->createRoleCollection()->addFieldToFilter(
-    'parent_id',
-    0
-)->addFieldToFilter(
-    'tree_level',
-    1
-)->addFieldToFilter(
-    'role_type',
-    RoleGroup::ROLE_TYPE
-)->addFieldToFilter(
-    'user_id',
-    0
-)->addFieldToFilter(
-    'role_name',
-    'Administrators'
-);
+$roleCollection = $this->createRoleCollection()
+    ->addFieldToFilter('parent_id', 0)
+    ->addFieldToFilter('tree_level', 1)
+    ->addFieldToFilter('role_type', RoleGroup::ROLE_TYPE)
+    ->addFieldToFilter('user_id', 0)
+    ->addFieldToFilter('user_type', UserContextInterface::USER_TYPE_ADMIN)
+    ->addFieldToFilter('role_name', 'Administrators');
 
 if ($roleCollection->count() == 0) {
     $admGroupRole = $this->createRole()->setData(
@@ -54,6 +46,7 @@ if ($roleCollection->count() == 0) {
             'sort_order' => 1,
             'role_type' => RoleGroup::ROLE_TYPE,
             'user_id' => 0,
+            'user_type' => UserContextInterface::USER_TYPE_ADMIN,
             'role_name' => 'Administrators'
         )
     )->save();
@@ -64,13 +57,9 @@ if ($roleCollection->count() == 0) {
     }
 }
 
-$rulesCollection = $this->createRulesCollection()->addFieldToFilter(
-    'role_id',
-    $admGroupRole->getId()
-)->addFieldToFilter(
-    'resource_id',
-    'all'
-);
+$rulesCollection = $this->createRulesCollection()
+    ->addFieldToFilter('role_id', $admGroupRole->getId())
+    ->addFieldToFilter('resource_id', 'all');
 
 if ($rulesCollection->count() == 0) {
     $this->createRules()->setData(
@@ -82,7 +71,7 @@ if ($rulesCollection->count() == 0) {
         )
     )->save();
 } else {
-    /** @var \Magento\User\Model\Rules $rule */
+    /** @var \Magento\Authorization\Model\Rules $rule */
     foreach ($rulesCollection as $rule) {
         $rule->setData('resource_id', 'Magento_Adminhtml::all')->save();
     }
diff --git a/app/code/Magento/Authorization/etc/di.xml b/app/code/Magento/Authorization/etc/di.xml
new file mode 100644
index 0000000000000000000000000000000000000000..afd3f40acd4f9919f85b1abff8667d9d2110b568
--- /dev/null
+++ b/app/code/Magento/Authorization/etc/di.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)
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
+    <type name="Magento\Authorization\Model\Role" shared="false" />
+    <type name="Magento\Authorization\Model\Resource\Rules">
+        <arguments>
+            <argument name="rootResource" xsi:type="object">Magento\Framework\Acl\RootResource\Proxy</argument>
+            <argument name="aclCache" xsi:type="object">Magento\Framework\Acl\Cache\Proxy</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Framework\Module\Updater\SetupFactory">
+        <arguments>
+            <argument name="resourceTypes" xsi:type="array">
+                <item name="authorization_setup" xsi:type="string">Magento\Authorization\Model\Resource\Setup</item>
+            </argument>
+        </arguments>
+    </type>
+    <type name="Magento\Framework\Acl\Builder">
+        <arguments>
+            <argument name="ruleLoader" xsi:type="object">Magento\Authorization\Model\Acl\Loader\Rule</argument>
+            <argument name="roleLoader" xsi:type="object">Magento\Authorization\Model\Acl\Loader\Role</argument>
+        </arguments>
+    </type>
+</config>
diff --git a/app/code/Magento/Authz/etc/di.xml b/app/code/Magento/Authorization/etc/module.xml
similarity index 80%
rename from app/code/Magento/Authz/etc/di.xml
rename to app/code/Magento/Authorization/etc/module.xml
index 324792fc21e25fd27ff50409ce0c08ddfe9f9e54..4224828dc06f423aae5d2c9b3ffe340eec481adf 100644
--- a/app/code/Magento/Authz/etc/di.xml
+++ b/app/code/Magento/Authorization/etc/module.xml
@@ -23,7 +23,10 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
-    <preference for="Magento\Authz\Service\AuthorizationV1Interface" type="Magento\Authz\Service\AuthorizationV1"/>
-    <preference for="Magento\Authz\Model\UserLocatorInterface" type="Magento\Authz\Model\UserLocator\Guest"/>
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
+    <module name="Magento_Authorization" schema_version="1.0.0.0" active="true">
+        <depends>
+            <module name="Magento_Backend"/>
+        </depends>
+    </module>
 </config>
diff --git a/app/code/Magento/Authorization/sql/authorization_setup/install-1.0.0.0.php b/app/code/Magento/Authorization/sql/authorization_setup/install-1.0.0.0.php
new file mode 100644
index 0000000000000000000000000000000000000000..eb6661c9dc29a560fb212ec3fd6306886404cd4b
--- /dev/null
+++ b/app/code/Magento/Authorization/sql/authorization_setup/install-1.0.0.0.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)
+ */
+
+/* @var $installer \Magento\Framework\Module\Setup */
+$installer = $this;
+
+$installer->startSetup();
+
+if ($installer->getConnection()->isTableExists($installer->getTable('admin_role'))) {
+    /**
+     * Rename existing 'admin_role' table into 'authorization_role' (to avoid forcing Magento re-installation)
+     * TODO: This conditional logic can be removed some time after pull request is delivered to the mainline
+     */
+    $installer->getConnection()->renameTable(
+        $installer->getTable('admin_role'),
+        $installer->getTable('authorization_role')
+    );
+
+} else if (!$installer->getConnection()->isTableExists($installer->getTable('authorization_role'))) {
+    /**
+     * Create table 'authorization_role'
+     */
+    $table = $installer->getConnection()->newTable(
+        $installer->getTable('authorization_role')
+    )->addColumn(
+        'role_id',
+        \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
+        null,
+        array('identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true),
+        'Role ID'
+    )->addColumn(
+        'parent_id',
+        \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
+        null,
+        array('unsigned' => true, 'nullable' => false, 'default' => '0'),
+        'Parent Role ID'
+    )->addColumn(
+        'tree_level',
+        \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
+        null,
+        array('unsigned' => true, 'nullable' => false, 'default' => '0'),
+        'Role Tree Level'
+    )->addColumn(
+        'sort_order',
+        \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
+        null,
+        array('unsigned' => true, 'nullable' => false, 'default' => '0'),
+        'Role Sort Order'
+    )->addColumn(
+        'role_type',
+        \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
+        1,
+        array('nullable' => false, 'default' => '0'),
+        'Role Type'
+    )->addColumn(
+        'user_id',
+        \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
+        null,
+        array('unsigned' => true, 'nullable' => false, 'default' => '0'),
+        'User ID'
+    )->addColumn(
+        'user_type',
+        \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
+        16,
+        array('nullable' => true, 'default' => null),
+        'User Type'
+    )->addColumn(
+        'role_name',
+        \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
+        50,
+        array('nullable' => true, 'default' => null),
+        'Role Name'
+    )->addIndex(
+        $installer->getIdxName('authorization_role', array('parent_id', 'sort_order')),
+        array('parent_id', 'sort_order')
+    )->addIndex(
+        $installer->getIdxName('authorization_role', array('tree_level')),
+        array('tree_level')
+    )->setComment(
+        'Admin Role Table'
+    );
+    $installer->getConnection()->createTable($table);
+}
+
+if ($installer->getConnection()->isTableExists($installer->getTable('admin_rule'))) {
+    /**
+     * Rename existing 'admin_rule' table into 'authorization_rule' (to avoid forcing Magento re-installation)
+     * TODO: This conditional logic can be removed some time after pull request is delivered to the mainline
+     */
+    $installer->getConnection()->renameTable(
+        $installer->getTable('admin_rule'),
+        $installer->getTable('authorization_rule')
+    );
+
+} else if (!$installer->getConnection()->isTableExists($installer->getTable('authorization_rule'))) {
+    /**
+     * Create table 'authorization_rule'
+     */
+    $table = $installer->getConnection()->newTable(
+        $installer->getTable('authorization_rule')
+    )->addColumn(
+        'rule_id',
+        \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
+        null,
+        array('identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true),
+        'Rule ID'
+    )->addColumn(
+        'role_id',
+        \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
+        null,
+        array('unsigned' => true, 'nullable' => false, 'default' => '0'),
+        'Role ID'
+    )->addColumn(
+        'resource_id',
+        \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
+        255,
+        array('nullable' => true, 'default' => null),
+        'Resource ID'
+    )->addColumn(
+        'privileges',
+        \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
+        20,
+        array('nullable' => true),
+        'Privileges'
+    )->addColumn(
+        'permission',
+        \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
+        10,
+        array(),
+        'Permission'
+    )->addIndex(
+        $installer->getIdxName('authorization_rule', array('resource_id', 'role_id')),
+        array('resource_id', 'role_id')
+    )->addIndex(
+        $installer->getIdxName('authorization_rule', array('role_id', 'resource_id')),
+        array('role_id', 'resource_id')
+    )->addForeignKey(
+        $installer->getFkName('authorization_rule', 'role_id', 'authorization_role', 'role_id'),
+        'role_id',
+        $installer->getTable('authorization_role'),
+        'role_id',
+        \Magento\Framework\DB\Ddl\Table::ACTION_CASCADE,
+        \Magento\Framework\DB\Ddl\Table::ACTION_CASCADE
+    )->setComment(
+        'Admin Rule Table'
+    );
+    $installer->getConnection()->createTable($table);
+}
+
+$installer->endSetup();
diff --git a/app/code/Magento/Authorizenet/Helper/Data.php b/app/code/Magento/Authorizenet/Helper/Data.php
index 8bcfa32014dec351e18082c5bc30a6fe5eb2dbb8..0398481a245a2d458fb636a6fdafabacd3ac3705 100644
--- a/app/code/Magento/Authorizenet/Helper/Data.php
+++ b/app/code/Magento/Authorizenet/Helper/Data.php
@@ -197,39 +197,10 @@ class Data extends \Magento\Framework\App\Helper\AbstractHelper implements Helpe
      * @param \Magento\Framework\Object $card
      * @param bool|float $amount
      * @param bool|string $exception
+     * @param bool|string $additionalMessage
      * @return bool|string
      */
     public function getTransactionMessage(
-        $payment,
-        $requestType,
-        $lastTransactionId,
-        $card,
-        $amount = false,
-        $exception = false
-    ) {
-        return $this->getExtendedTransactionMessage(
-            $payment,
-            $requestType,
-            $lastTransactionId,
-            $card,
-            $amount,
-            $exception
-        );
-    }
-
-    /**
-     * Return message for gateway transaction request
-     * 
-     * @param \Magento\Payment\Model\Info $payment
-     * @param string $requestType
-     * @param string $lastTransactionId
-     * @param \Magento\Framework\Object $card
-     * @param bool|float $amount
-     * @param bool|string $exception
-     * @param bool|string $additionalMessage
-     * @return bool|mixed
-     */
-    public function getExtendedTransactionMessage(
         $payment,
         $requestType,
         $lastTransactionId,
@@ -238,40 +209,27 @@ class Data extends \Magento\Framework\App\Helper\AbstractHelper implements Helpe
         $exception = false,
         $additionalMessage = false
     ) {
+        $message[] = __('Credit Card: xxxx-%1', $card->getCcLast4());
+        if ($amount) {
+            $message[] = __('amount %1', $this->_formatPrice($payment, $amount));
+        }
         $operation = $this->_getOperation($requestType);
-
         if (!$operation) {
             return false;
-        }
-
-        if ($amount) {
-            $amount = __('amount %1', $this->_formatPrice($payment, $amount));
-        }
-
-        if ($exception) {
-            $result = __('failed');
         } else {
-            $result = __('successful');
+            $message[] = $operation;
         }
-
-        $card = __('Credit Card: xxxx-%1', $card->getCcLast4());
-
-        $pattern = '%s %s %s - %s.';
-        $texts = array($card, $amount, $operation, $result);
-
+        $message[] = ($exception) ? '- ' . __('failed.') : '- ' . __('successful.');
         if (!is_null($lastTransactionId)) {
-            $pattern .= ' %s.';
-            $texts[] = __('Authorize.Net Transaction ID %1', $lastTransactionId);
+            $message[] = __('Authorize.Net Transaction ID %1.', $lastTransactionId);
         }
-
         if ($additionalMessage) {
-            $pattern .= ' %s.';
-            $texts[] = $additionalMessage;
+            $message[] = $additionalMessage;
         }
-        $pattern .= ' %s';
-        $texts[] = $exception;
-
-        return call_user_func_array('__', array_merge(array($pattern), $texts));
+        if ($exception) {
+            $message[] = $exception;
+        }
+        return implode(' ', $message);
     }
 
     /**
diff --git a/app/code/Magento/Authorizenet/Model/Authorizenet.php b/app/code/Magento/Authorizenet/Model/Authorizenet.php
index cf5b2a3bf553d6580e306ac38c440c4f7dcc3030..df8c1202f6eb2bba07c063299b8ada7f149c773e 100644
--- a/app/code/Magento/Authorizenet/Model/Authorizenet.php
+++ b/app/code/Magento/Authorizenet/Model/Authorizenet.php
@@ -1054,14 +1054,14 @@ class Authorizenet extends \Magento\Payment\Model\Method\Cc
                             'parent_transaction_id' => $authTransactionId
                         ),
                         array(),
-                        $this->_authorizenetData->getExtendedTransactionMessage(
+                        $this->_authorizenetData->getTransactionMessage(
                             $payment,
                             self::REQUEST_TYPE_VOID,
                             null,
                             $card,
                             false,
                             false,
-                            __('Parent Authorize.Net transaction (ID %1) expired', $realAuthTransactionId)
+                            __('Parent Authorize.Net transaction (ID %1) expired.', $realAuthTransactionId)
                         )
                     );
                 }
diff --git a/app/code/Magento/Authorizenet/Model/Directpost.php b/app/code/Magento/Authorizenet/Model/Directpost.php
index ef24c34cdb2df1f40a1e665e41f49012774babe5..9d3f76530f6b2cac54969c671b038efa031ba1a8 100644
--- a/app/code/Magento/Authorizenet/Model/Directpost.php
+++ b/app/code/Magento/Authorizenet/Model/Directpost.php
@@ -23,6 +23,8 @@
  */
 namespace Magento\Authorizenet\Model;
 
+use Magento\Sales\Model\Order\Email\Sender\OrderSender;
+
 /**
  * Authorize.net DirectPost payment method model.
  */
@@ -90,6 +92,11 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet
      */
     protected $_helper;
 
+    /**
+     * @var OrderSender
+     */
+    protected $orderSender;
+
     /**
      * @param \Magento\Framework\Event\ManagerInterface $eventManager
      * @param \Magento\Payment\Helper\Data $paymentData
@@ -110,6 +117,7 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet
      * @param \Magento\Authorizenet\Model\Directpost\RequestFactory $directRequestFactory
      * @param \Magento\Authorizenet\Model\Directpost\Response $response
      * @param \Magento\Authorizenet\Helper\HelperInterface $helper
+     * @param OrderSender $orderSender
      * @param array $data
      *
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
@@ -134,6 +142,7 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet
         \Magento\Authorizenet\Model\Directpost\RequestFactory $directRequestFactory,
         \Magento\Authorizenet\Model\Directpost\Response $response,
         \Magento\Authorizenet\Helper\HelperInterface $helper,
+        OrderSender $orderSender,
         array $data = array()
     ) {
         parent::__construct(
@@ -158,6 +167,7 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet
         $this->_requestFactory = $directRequestFactory;
         $this->_response = $response;
         $this->_helper = $helper;
+        $this->orderSender = $orderSender;
     }
 
     /**
@@ -705,7 +715,7 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet
 
         try {
             if (!$response->hasOrderSendConfirmation() || $response->getOrderSendConfirmation()) {
-                $order->sendNewOrderEmail();
+                $this->orderSender->send($order);
             }
 
             $this->_quoteFactory->create()->load($order->getQuoteId())->setIsActive(false)->save();
diff --git a/app/code/Magento/Authorizenet/composer.json b/app/code/Magento/Authorizenet/composer.json
index 83732fee6399df273ec3b54771839bd00540d8c3..6b8835ccde63b1859ad7c3b3dae646dbb600aabe 100644
--- a/app/code/Magento/Authorizenet/composer.json
+++ b/app/code/Magento/Authorizenet/composer.json
@@ -2,20 +2,20 @@
     "name": "magento/module-authorizenet",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-checkout": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-payment": "0.1.0-alpha89",
-        "magento/module-centinel": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-checkout": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-payment": "0.1.0-alpha90",
+        "magento/module-centinel": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Authz/Model/UserIdentifier.php b/app/code/Magento/Authz/Model/UserIdentifier.php
deleted file mode 100644
index 999a7f259c84f2fd84e70f9e7e836d039b931fb1..0000000000000000000000000000000000000000
--- a/app/code/Magento/Authz/Model/UserIdentifier.php
+++ /dev/null
@@ -1,135 +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\Authz\Model;
-
-/**
- * User identifier class. By user can be understood admin, customer, guest, web API integration.
- */
-class UserIdentifier
-{
-    /**#@+
-     * User types.
-     */
-    const USER_TYPE_GUEST = 'Guest';
-
-    const USER_TYPE_CUSTOMER = 'Customer';
-
-    const USER_TYPE_ADMIN = 'Admin';
-
-    const USER_TYPE_INTEGRATION = 'Integration';
-
-    /**#@-*/
-
-    /**
-     * User type (admin, customer, guest, web API integration).
-     *
-     * @var string
-     */
-    protected $_userType;
-
-    /**
-     * @var  int
-     */
-    protected $_userId;
-
-    /**
-     * Initialize user type and user id.
-     *
-     * @param UserLocatorInterface $userLocator Locator of active user.
-     * @param string|null $userType
-     * @param int|null $userId
-     * @throws \LogicException
-     */
-    public function __construct(UserLocatorInterface $userLocator, $userType = null, $userId = null)
-    {
-        $userType = isset($userType) ? $userType : $userLocator->getUserType();
-        $userId = isset($userId) ? $userId : $userLocator->getUserId();
-        if ($userType == self::USER_TYPE_GUEST && $userId) {
-            throw new \LogicException('Guest user must not have user ID set.');
-        }
-        $this->_setUserId($userId);
-        $this->_setUserType($userType);
-    }
-
-    /**
-     * Get user ID. Null is possible when user type is 'guest'.
-     *
-     * @return int
-     */
-    public function getUserId()
-    {
-        return $this->_userId;
-    }
-
-    /**
-     * Retrieve user type (admin, customer, guest, web API integration).
-     *
-     * @return string
-     */
-    public function getUserType()
-    {
-        return $this->_userType;
-    }
-
-    /**
-     * Set user ID.
-     *
-     * @param int $userId
-     * @return $this
-     * @throws \LogicException
-     */
-    protected function _setUserId($userId)
-    {
-        $userId = is_numeric($userId) ? (int)$userId : $userId;
-        if (!is_integer($userId) || $userId < 0) {
-            throw new \LogicException("Invalid user ID: '{$userId}'.");
-        }
-        $this->_userId = $userId;
-        return $this;
-    }
-
-    /**
-     * Set user type.
-     *
-     * @param string $userType
-     * @return $this
-     * @throws \LogicException
-     */
-    protected function _setUserType($userType)
-    {
-        $availableTypes = array(
-            self::USER_TYPE_GUEST,
-            self::USER_TYPE_CUSTOMER,
-            self::USER_TYPE_ADMIN,
-            self::USER_TYPE_INTEGRATION
-        );
-        if (!in_array($userType, $availableTypes)) {
-            throw new \LogicException(
-                "Invalid user type: '{$userType}'. Allowed types: " . implode(", ", $availableTypes)
-            );
-        }
-        $this->_userType = $userType;
-        return $this;
-    }
-}
diff --git a/app/code/Magento/Authz/Service/AuthorizationV1.php b/app/code/Magento/Authz/Service/AuthorizationV1.php
deleted file mode 100644
index 216c3c56c8aca5f798f57f0e34a097d38adf8af8..0000000000000000000000000000000000000000
--- a/app/code/Magento/Authz/Service/AuthorizationV1.php
+++ /dev/null
@@ -1,377 +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\Authz\Service;
-
-use Magento\Authz\Model\UserIdentifier;
-use Magento\Framework\Acl;
-use Magento\Framework\Acl\Builder as AclBuilder;
-use Magento\Framework\Acl\RootResource as RootAclResource;
-use Magento\Framework\Exception\AuthorizationException;
-use Magento\Framework\Exception\LocalizedException;
-use Magento\Framework\Exception\NoSuchEntityException;
-use Magento\Framework\Logger;
-use Magento\User\Model\Resource\Role\CollectionFactory as RoleCollectionFactory;
-use Magento\User\Model\Resource\Rules\CollectionFactory as RulesCollectionFactory;
-use Magento\User\Model\Role;
-use Magento\User\Model\RoleFactory;
-use Magento\User\Model\RulesFactory;
-
-/**
- * Authorization service.
- *
- * @SuppressWarnings(PHPMD.LongVariable)
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- */
-class AuthorizationV1 implements AuthorizationV1Interface
-{
-    const PERMISSION_ANONYMOUS = 'anonymous';
-    const PERMISSION_SELF = 'self';
-
-    /**
-     * @var AclBuilder
-     */
-    protected $_aclBuilder;
-
-    /**
-     * @var UserIdentifier
-     */
-    protected $_userIdentifier;
-
-    /**
-     * @var RoleFactory
-     */
-    protected $_roleFactory;
-
-    /**
-     * @var RoleCollectionFactory
-     */
-    protected $_roleCollectionFactory;
-
-    /**
-     * @var RulesFactory
-     */
-    protected $_rulesFactory;
-
-    /**
-     * @var RulesCollectionFactory
-     */
-    protected $_rulesCollectionFactory;
-
-    /**
-     * @var Logger
-     */
-    protected $_logger;
-
-    /**
-     * @var RootAclResource
-     */
-    protected $_rootAclResource;
-
-    /**
-     * Initialize dependencies.
-     *
-     * @param AclBuilder $aclBuilder
-     * @param UserIdentifier $userIdentifier
-     * @param RoleFactory $roleFactory
-     * @param RoleCollectionFactory $roleCollectionFactory
-     * @param RulesFactory $rulesFactory
-     * @param RulesCollectionFactory $rulesCollectionFactory
-     * @param Logger $logger
-     * @param RootAclResource $rootAclResource
-     */
-    public function __construct(
-        AclBuilder $aclBuilder,
-        UserIdentifier $userIdentifier,
-        RoleFactory $roleFactory,
-        RoleCollectionFactory $roleCollectionFactory,
-        RulesFactory $rulesFactory,
-        RulesCollectionFactory $rulesCollectionFactory,
-        Logger $logger,
-        RootAclResource $rootAclResource
-    ) {
-        $this->_aclBuilder = $aclBuilder;
-        $this->_userIdentifier = $userIdentifier;
-        $this->_roleFactory = $roleFactory;
-        $this->_rulesFactory = $rulesFactory;
-        $this->_rulesCollectionFactory = $rulesCollectionFactory;
-        $this->_roleCollectionFactory = $roleCollectionFactory;
-        $this->_logger = $logger;
-        $this->_rootAclResource = $rootAclResource;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function isAllowed($resources, UserIdentifier $userIdentifier = null)
-    {
-        $resources = is_array($resources) ? $resources : [$resources];
-        $userIdentifier = $userIdentifier ? $userIdentifier : $this->_userIdentifier;
-        if ($this->_isAnonymousOrSelfAllowed($resources, $userIdentifier)) {
-            return true;
-        }
-        return $this->_isUserWithRoleAllowed($resources, $userIdentifier);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function grantPermissions(UserIdentifier $userIdentifier, array $resources)
-    {
-        try {
-            $role = $this->_getUserRole($userIdentifier);
-            if (!$role) {
-                $role = $this->_createRole($userIdentifier);
-            }
-            $this->_associateResourcesWithRole($role, $resources);
-        } catch (\Exception $e) {
-            $this->_logger->logException($e);
-            throw new LocalizedException('Error happened while granting permissions. Check exception log for details.');
-        }
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function grantAllPermissions(UserIdentifier $userIdentifier)
-    {
-        $this->grantPermissions($userIdentifier, array($this->_rootAclResource->getId()));
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function getAllowedResources(UserIdentifier $userIdentifier)
-    {
-        if ($userIdentifier->getUserType() == UserIdentifier::USER_TYPE_GUEST) {
-            return [self::PERMISSION_ANONYMOUS];
-        } elseif ($userIdentifier->getUserType() == UserIdentifier::USER_TYPE_CUSTOMER) {
-            return [self::PERMISSION_SELF];
-        }
-        $allowedResources = [];
-        try {
-            $role = $this->_getUserRole($userIdentifier);
-            if (!$role) {
-                throw new AuthorizationException('The role associated with the specified user cannot be found.');
-            }
-            $rulesCollection = $this->_rulesCollectionFactory->create();
-            $rulesCollection->getByRoles($role->getId())->load();
-            $acl = $this->_aclBuilder->getAcl();
-            /** @var \Magento\User\Model\Rules $ruleItem */
-            foreach ($rulesCollection->getItems() as $ruleItem) {
-                $resourceId = $ruleItem->getResourceId();
-                if ($acl->has($resourceId) && $acl->isAllowed($role->getId(), $resourceId)) {
-                    $allowedResources[] = $resourceId;
-                }
-            }
-        } catch (AuthorizationException $e) {
-            throw $e;
-        } catch (\Exception $e) {
-            $this->_logger->logException($e);
-            throw new LocalizedException(
-                'Error happened while getting a list of allowed resources. Check exception log for details.'
-            );
-        }
-        return $allowedResources;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function removePermissions(UserIdentifier $userIdentifier)
-    {
-        try {
-            $this->_deleteRole($userIdentifier);
-        } catch (NoSuchEntityException $e) {
-            throw $e;
-        } catch (\Exception $e) {
-            $this->_logger->logException($e);
-            throw new LocalizedException(
-                'Error happened while deleting role and permissions. Check exception log for details.'
-            );
-        }
-    }
-
-    /**
-     * Create new ACL role.
-     *
-     * @param UserIdentifier $userIdentifier
-     * @return Role
-     * @throws NoSuchEntityException
-     * @throws \LogicException
-     */
-    protected function _createRole($userIdentifier)
-    {
-        $userType = $userIdentifier->getUserType();
-        if (!$this->_canRoleBeCreatedForUserType($userType)) {
-            throw new \LogicException("The role with user type '{$userType}' cannot be created");
-        }
-        $userId = $userIdentifier->getUserId();
-        switch ($userType) {
-            case UserIdentifier::USER_TYPE_INTEGRATION:
-                $roleName = $userType . $userId;
-                $roleType = \Magento\User\Model\Acl\Role\User::ROLE_TYPE;
-                $parentId = 0;
-                $userId = $userIdentifier->getUserId();
-                break;
-            default:
-                throw NoSuchEntityException::singleField('userType', $userType);
-        }
-        $role = $this->_roleFactory->create();
-        $role->setRoleName($roleName)
-            ->setUserType($userType)
-            ->setUserId($userId)
-            ->setRoleType($roleType)
-            ->setParentId($parentId)
-            ->save();
-        return $role;
-    }
-
-    /**
-     * Remove an ACL role. This deletes the cascading permissions
-     *
-     * @param UserIdentifier $userIdentifier
-     * @return Role
-     * @throws NoSuchEntityException
-     * @throws \LogicException
-     */
-    protected function _deleteRole($userIdentifier)
-    {
-        $userType = $userIdentifier->getUserType();
-        if (!$this->_canRoleBeCreatedForUserType($userType)) {
-            throw new \LogicException("The role with user type '{$userType}' cannot be created or deleted.");
-        }
-        $userId = $userIdentifier->getUserId();
-        switch ($userType) {
-            case UserIdentifier::USER_TYPE_INTEGRATION:
-                $roleName = $userType . $userId;
-                break;
-            default:
-                throw NoSuchEntityException::singleField('userType', $userType);
-        }
-        $role = $this->_roleFactory->create()->load($roleName, 'role_name');
-        return $role->delete();
-    }
-
-    /**
-     * Identify user role from user identifier.
-     *
-     * @param UserIdentifier $userIdentifier
-     * @return Role|false Return false in case when no role associated with provided user was found.
-     * @throws \LogicException
-     */
-    protected function _getUserRole($userIdentifier)
-    {
-        if (!$this->_canRoleBeCreatedForUserType($userIdentifier)) {
-            throw new \LogicException(
-                "The role with user type '{$userIdentifier->getUserType()}' does not exist and cannot be created"
-            );
-        }
-        $roleCollection = $this->_roleCollectionFactory->create();
-        $userType = $userIdentifier->getUserType();
-        /** @var Role $role */
-        $userId = $userIdentifier->getUserId();
-        $role = $roleCollection->setUserFilter($userId, $userType)->getFirstItem();
-        return $role->getId() ? $role : false;
-    }
-
-    /**
-     * Associate resources with the specified role. All resources previously assigned to the role will be unassigned.
-     *
-     * @param Role $role
-     * @param string[] $resources
-     * @return void
-     * @throws \LogicException
-     */
-    protected function _associateResourcesWithRole($role, array $resources)
-    {
-        /** @var \Magento\User\Model\Rules $rules */
-        $rules = $this->_rulesFactory->create();
-        $rules->setRoleId($role->getId())->setResources($resources)->saveRel();
-    }
-
-    /**
-     * Check if there role can be associated with user having provided user type.
-     *
-     * Roles cannot be created for guests and customers.
-     *
-     * @param string $userType
-     * @return bool
-     */
-    protected function _canRoleBeCreatedForUserType($userType)
-    {
-        return ($userType != UserIdentifier::USER_TYPE_CUSTOMER) && ($userType != UserIdentifier::USER_TYPE_GUEST);
-    }
-
-    /**
-     * Check if the user has permission to access the requested resources.
-     *
-     * @param string[] $resources
-     * @param UserIdentifier $userIdentifier
-     * @return bool
-     */
-    protected function _isAnonymousOrSelfAllowed($resources, UserIdentifier $userIdentifier)
-    {
-        if (count($resources) == 1) {
-            $resource = reset($resources);
-            $isAnonymousAccess = ($resource == self::PERMISSION_ANONYMOUS);
-            $isSelfAccess = ($userIdentifier->getUserType() == UserIdentifier::USER_TYPE_CUSTOMER)
-                && ($resource == self::PERMISSION_SELF);
-            if ($isAnonymousAccess || $isSelfAccess) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Check if user who has role is allowed to access requested resources.
-     *
-     * @param string[] $resources
-     * @param UserIdentifier $userIdentifier
-     * @return bool
-     */
-    protected function _isUserWithRoleAllowed($resources, UserIdentifier $userIdentifier)
-    {
-        try {
-            $role = $this->_getUserRole($userIdentifier);
-            if (!$role) {
-                throw NoSuchEntityException::doubleField(
-                    'userId',
-                    $userIdentifier->getUserId(),
-                    'userType',
-                    $userIdentifier->getUserType()
-                );
-            }
-            foreach ($resources as $resource) {
-                if (!$this->_aclBuilder->getAcl()->isAllowed($role->getId(), $resource)) {
-                    return false;
-                }
-            }
-            return true;
-        } catch (\Exception $e) {
-            $this->_logger->logException($e);
-            return false;
-        }
-    }
-}
diff --git a/app/code/Magento/Authz/Service/AuthorizationV1Interface.php b/app/code/Magento/Authz/Service/AuthorizationV1Interface.php
deleted file mode 100644
index 9fbd2a5cc86623e6baee7962d97e169c7145c48b..0000000000000000000000000000000000000000
--- a/app/code/Magento/Authz/Service/AuthorizationV1Interface.php
+++ /dev/null
@@ -1,88 +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\Authz\Service;
-
-use Magento\Authz\Model\UserIdentifier;
-use Magento\Framework\Exception\AuthorizationException;
-use Magento\Framework\Exception\LocalizedException;
-use Magento\Framework\Exception\NoSuchEntityException;
-
-/**
- * Authorization service interface.
- */
-interface AuthorizationV1Interface
-{
-    /**
-     * Grant permissions to user to access the specified resources.
-     *
-     * @param UserIdentifier $userIdentifier
-     * @param string[] $resources List of resources which should be available to the specified user.
-     * @return void
-     * @throws NoSuchEntityException
-     * @throws LocalizedException
-     */
-    public function grantPermissions(UserIdentifier $userIdentifier, array $resources);
-
-    /**
-     * Grant permissions to the user to access all resources available in the system.
-     *
-     * @param UserIdentifier $userIdentifier
-     * @return void
-     * @throws NoSuchEntityException
-     * @throws LocalizedException
-     */
-    public function grantAllPermissions(UserIdentifier $userIdentifier);
-
-    /**
-     * Check if the user has permission to access the requested resources.
-     *
-     * Access is prohibited if there is a lack of permissions to any of the requested resources.
-     *
-     * @param string|string[] $resources Single resource or a list of resources
-     * @param UserIdentifier|null $userIdentifier Context of current user is used by default
-     * @return bool
-     * @throws NoSuchEntityException
-     */
-    public function isAllowed($resources, UserIdentifier $userIdentifier = null);
-
-    /**
-     * Get a list of resources available to the specified user.
-     *
-     * @param UserIdentifier $userIdentifier
-     * @return string[]
-     * @throws AuthorizationException
-     * @throws LocalizedException
-     */
-    public function getAllowedResources(UserIdentifier $userIdentifier);
-
-    /**
-     * Remove user role and associated permissions.
-     *
-     * @param UserIdentifier $userIdentifier
-     * @return void
-     * @throws NoSuchEntityException
-     * @throws LocalizedException
-     */
-    public function removePermissions(UserIdentifier $userIdentifier);
-}
diff --git a/app/code/Magento/Authz/composer.json b/app/code/Magento/Authz/composer.json
deleted file mode 100644
index 97348d965fc6947aef8c4f509f44a149ebce4d9f..0000000000000000000000000000000000000000
--- a/app/code/Magento/Authz/composer.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
-    "name": "magento/module-authz",
-    "description": "N/A",
-    "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-user": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
-        "magento/magento-composer-installer": "*"
-    },
-    "type": "magento2-module",
-    "version": "0.1.0-alpha89",
-    "extra": {
-        "map": [
-            [
-                "*",
-                "Magento/Authz"
-            ]
-        ]
-    }
-}
diff --git a/app/code/Magento/Authz/i18n/de_DE.csv b/app/code/Magento/Authz/i18n/de_DE.csv
deleted file mode 100644
index e3b440441951b5ea7f3091f8dd23213eea0464b1..0000000000000000000000000000000000000000
--- a/app/code/Magento/Authz/i18n/de_DE.csv
+++ /dev/null
@@ -1,5 +0,0 @@
-"Error happened while granting permissions. Check exception log for details.","Error happened while granting permissions. Check exception log for details."
-"The role associated with the specified user cannot be found.","The role associated with the specified user cannot be found."
-"Error happened while getting a list of allowed resources. Check exception log for details.","Error happened while getting a list of allowed resources. Check exception log for details."
-"Error happened while deleting role and permissions. Check exception log for details.","Error happened while deleting role and permissions. Check exception log for details."
-"Role for user with ID ""%1"" and user type ""%2"" cannot be found.","Role for user with ID ""%1"" and user type ""%2"" cannot be found."
diff --git a/app/code/Magento/Authz/i18n/en_US.csv b/app/code/Magento/Authz/i18n/en_US.csv
deleted file mode 100644
index e3b440441951b5ea7f3091f8dd23213eea0464b1..0000000000000000000000000000000000000000
--- a/app/code/Magento/Authz/i18n/en_US.csv
+++ /dev/null
@@ -1,5 +0,0 @@
-"Error happened while granting permissions. Check exception log for details.","Error happened while granting permissions. Check exception log for details."
-"The role associated with the specified user cannot be found.","The role associated with the specified user cannot be found."
-"Error happened while getting a list of allowed resources. Check exception log for details.","Error happened while getting a list of allowed resources. Check exception log for details."
-"Error happened while deleting role and permissions. Check exception log for details.","Error happened while deleting role and permissions. Check exception log for details."
-"Role for user with ID ""%1"" and user type ""%2"" cannot be found.","Role for user with ID ""%1"" and user type ""%2"" cannot be found."
diff --git a/app/code/Magento/Authz/i18n/es_ES.csv b/app/code/Magento/Authz/i18n/es_ES.csv
deleted file mode 100644
index e3b440441951b5ea7f3091f8dd23213eea0464b1..0000000000000000000000000000000000000000
--- a/app/code/Magento/Authz/i18n/es_ES.csv
+++ /dev/null
@@ -1,5 +0,0 @@
-"Error happened while granting permissions. Check exception log for details.","Error happened while granting permissions. Check exception log for details."
-"The role associated with the specified user cannot be found.","The role associated with the specified user cannot be found."
-"Error happened while getting a list of allowed resources. Check exception log for details.","Error happened while getting a list of allowed resources. Check exception log for details."
-"Error happened while deleting role and permissions. Check exception log for details.","Error happened while deleting role and permissions. Check exception log for details."
-"Role for user with ID ""%1"" and user type ""%2"" cannot be found.","Role for user with ID ""%1"" and user type ""%2"" cannot be found."
diff --git a/app/code/Magento/Authz/i18n/fr_FR.csv b/app/code/Magento/Authz/i18n/fr_FR.csv
deleted file mode 100644
index e3b440441951b5ea7f3091f8dd23213eea0464b1..0000000000000000000000000000000000000000
--- a/app/code/Magento/Authz/i18n/fr_FR.csv
+++ /dev/null
@@ -1,5 +0,0 @@
-"Error happened while granting permissions. Check exception log for details.","Error happened while granting permissions. Check exception log for details."
-"The role associated with the specified user cannot be found.","The role associated with the specified user cannot be found."
-"Error happened while getting a list of allowed resources. Check exception log for details.","Error happened while getting a list of allowed resources. Check exception log for details."
-"Error happened while deleting role and permissions. Check exception log for details.","Error happened while deleting role and permissions. Check exception log for details."
-"Role for user with ID ""%1"" and user type ""%2"" cannot be found.","Role for user with ID ""%1"" and user type ""%2"" cannot be found."
diff --git a/app/code/Magento/Authz/i18n/nl_NL.csv b/app/code/Magento/Authz/i18n/nl_NL.csv
deleted file mode 100644
index e3b440441951b5ea7f3091f8dd23213eea0464b1..0000000000000000000000000000000000000000
--- a/app/code/Magento/Authz/i18n/nl_NL.csv
+++ /dev/null
@@ -1,5 +0,0 @@
-"Error happened while granting permissions. Check exception log for details.","Error happened while granting permissions. Check exception log for details."
-"The role associated with the specified user cannot be found.","The role associated with the specified user cannot be found."
-"Error happened while getting a list of allowed resources. Check exception log for details.","Error happened while getting a list of allowed resources. Check exception log for details."
-"Error happened while deleting role and permissions. Check exception log for details.","Error happened while deleting role and permissions. Check exception log for details."
-"Role for user with ID ""%1"" and user type ""%2"" cannot be found.","Role for user with ID ""%1"" and user type ""%2"" cannot be found."
diff --git a/app/code/Magento/Authz/i18n/pt_BR.csv b/app/code/Magento/Authz/i18n/pt_BR.csv
deleted file mode 100644
index e3b440441951b5ea7f3091f8dd23213eea0464b1..0000000000000000000000000000000000000000
--- a/app/code/Magento/Authz/i18n/pt_BR.csv
+++ /dev/null
@@ -1,5 +0,0 @@
-"Error happened while granting permissions. Check exception log for details.","Error happened while granting permissions. Check exception log for details."
-"The role associated with the specified user cannot be found.","The role associated with the specified user cannot be found."
-"Error happened while getting a list of allowed resources. Check exception log for details.","Error happened while getting a list of allowed resources. Check exception log for details."
-"Error happened while deleting role and permissions. Check exception log for details.","Error happened while deleting role and permissions. Check exception log for details."
-"Role for user with ID ""%1"" and user type ""%2"" cannot be found.","Role for user with ID ""%1"" and user type ""%2"" cannot be found."
diff --git a/app/code/Magento/Authz/i18n/zh_CN.csv b/app/code/Magento/Authz/i18n/zh_CN.csv
deleted file mode 100644
index e3b440441951b5ea7f3091f8dd23213eea0464b1..0000000000000000000000000000000000000000
--- a/app/code/Magento/Authz/i18n/zh_CN.csv
+++ /dev/null
@@ -1,5 +0,0 @@
-"Error happened while granting permissions. Check exception log for details.","Error happened while granting permissions. Check exception log for details."
-"The role associated with the specified user cannot be found.","The role associated with the specified user cannot be found."
-"Error happened while getting a list of allowed resources. Check exception log for details.","Error happened while getting a list of allowed resources. Check exception log for details."
-"Error happened while deleting role and permissions. Check exception log for details.","Error happened while deleting role and permissions. Check exception log for details."
-"Role for user with ID ""%1"" and user type ""%2"" cannot be found.","Role for user with ID ""%1"" and user type ""%2"" cannot be found."
diff --git a/app/code/Magento/Backend/Model/Auth/Session.php b/app/code/Magento/Backend/Model/Auth/Session.php
index 4137ab6844a27ca06d086b6233b6ab3f94b368c2..42b75dd1e62b5c8250685942203235715ee9a303 100644
--- a/app/code/Magento/Backend/Model/Auth/Session.php
+++ b/app/code/Magento/Backend/Model/Auth/Session.php
@@ -234,7 +234,7 @@ class Session extends \Magento\Framework\Session\SessionManager implements \Mage
     public function processLogin()
     {
         if ($this->getUser()) {
-            $this->regenerateId(false);
+            $this->regenerateId();
 
             if ($this->_backendUrl->useSecretKey()) {
                 $this->_backendUrl->renewSecretUrls();
diff --git a/app/code/Magento/Backend/Model/Observer.php b/app/code/Magento/Backend/Model/Observer.php
index a95b840671a2abc4ca8c02b33b71efe4dff6d7a3..fced5d795f618f5aaa8a0481a69b78d0186cc25f 100644
--- a/app/code/Magento/Backend/Model/Observer.php
+++ b/app/code/Magento/Backend/Model/Observer.php
@@ -85,27 +85,4 @@ class Observer
     {
         return $this;
     }
-
-    /**
-     * Set url class name for store 'admin'
-     *
-     * @param \Magento\Framework\Event\Observer $observer
-     * @return $this
-     */
-    public function setUrlClassName(\Magento\Framework\Event\Observer $observer)
-    {
-        /** @var $storeCollection \Magento\Store\Model\Resource\Store\Collection */
-        $storeCollection = $observer->getEvent()->getStoreCollection();
-        /** @var $store \Magento\Store\Model\Store */
-        foreach ($storeCollection as $store) {
-            if ($store->getId() == 0) {
-                $store->setUrlClassName('Magento\Backend\Model\UrlInterface');
-                break;
-            }
-        }
-        $this->cache->remove(
-            \Magento\AdminNotification\Model\System\Message\Security::VERIFICATION_RESULT_CACHE_KEY
-        );
-        return $this;
-    }
 }
diff --git a/app/code/Magento/Backend/composer.json b/app/code/Magento/Backend/composer.json
index 22d9a7215c106c2d5fb3c88d2fd519fce1b25190..2ff611ae678f27f5ce2ae81b94effa0cc01268ee 100644
--- a/app/code/Magento/Backend/composer.json
+++ b/app/code/Magento/Backend/composer.json
@@ -2,34 +2,33 @@
     "name": "magento/module-backend",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-directory": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/module-admin-notification": "0.1.0-alpha89",
-        "magento/module-cron": "0.1.0-alpha89",
-        "magento/module-sendfriend": "0.1.0-alpha89",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/module-weee": "0.1.0-alpha89",
-        "magento/module-reports": "0.1.0-alpha89",
-        "magento/module-catalog-search": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-user": "0.1.0-alpha89",
-        "magento/module-cms": "0.1.0-alpha89",
-        "magento/module-backup": "0.1.0-alpha89",
-        "magento/module-email": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-tax": "0.1.0-alpha89",
-        "magento/module-checkout": "0.1.0-alpha89",
-        "magento/module-url-rewrite": "0.1.0-alpha89",
-        "magento/module-translation": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-directory": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/module-cron": "0.1.0-alpha90",
+        "magento/module-sendfriend": "0.1.0-alpha90",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/module-weee": "0.1.0-alpha90",
+        "magento/module-reports": "0.1.0-alpha90",
+        "magento/module-catalog-search": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-user": "0.1.0-alpha90",
+        "magento/module-cms": "0.1.0-alpha90",
+        "magento/module-backup": "0.1.0-alpha90",
+        "magento/module-email": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-tax": "0.1.0-alpha90",
+        "magento/module-checkout": "0.1.0-alpha90",
+        "magento/module-url-rewrite": "0.1.0-alpha90",
+        "magento/module-translation": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Backend/etc/adminhtml/acl.xml b/app/code/Magento/Backend/etc/acl.xml
similarity index 98%
rename from app/code/Magento/Backend/etc/adminhtml/acl.xml
rename to app/code/Magento/Backend/etc/acl.xml
index 45f9521fd7a3792ab4748aec830050894abe9408..3393e749dbba1066bf93ef089021e1de54b63122 100644
--- a/app/code/Magento/Backend/etc/adminhtml/acl.xml
+++ b/app/code/Magento/Backend/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::all" title="Allow everything" sortOrder="10" />
diff --git a/app/code/Magento/Backend/etc/module.xml b/app/code/Magento/Backend/etc/module.xml
index 101b83e07768aba96c80dc05c181ece64bda28a4..1b15e3702c4933aa3de51e8ac5dbeea989b3bbd8 100644
--- a/app/code/Magento/Backend/etc/module.xml
+++ b/app/code/Magento/Backend/etc/module.xml
@@ -33,7 +33,6 @@
             <module name="Magento_Directory"/>
             <module name="Magento_Core"/>
             <module name="Magento_Eav"/>
-            <module name="Magento_AdminNotification"/>
             <module name="Magento_Cron"/>
             <module name="Magento_Sendfriend"/>
             <module name="Magento_Theme"/>
diff --git a/app/code/Magento/Backup/composer.json b/app/code/Magento/Backup/composer.json
index 8af68b4da0463afaa33a6460dc946d616df0712e..b14d72430261184eebe956aab2769cf7933932e4 100644
--- a/app/code/Magento/Backup/composer.json
+++ b/app/code/Magento/Backup/composer.json
@@ -2,17 +2,17 @@
     "name": "magento/module-backup",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-cron": "0.1.0-alpha89",
-        "magento/module-index": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-cron": "0.1.0-alpha90",
+        "magento/module-index": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Backup/etc/adminhtml/acl.xml b/app/code/Magento/Backup/etc/acl.xml
similarity index 94%
rename from app/code/Magento/Backup/etc/adminhtml/acl.xml
rename to app/code/Magento/Backup/etc/acl.xml
index eb2139dc270aa411673188926176803f95a8f21c..1abed0fc99ef5d5740d713a89776c90b4043b7dc 100644
--- a/app/code/Magento/Backup/etc/adminhtml/acl.xml
+++ b/app/code/Magento/Backup/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/Bundle/Model/Plugin/PriceBackend.php b/app/code/Magento/Bundle/Model/Plugin/PriceBackend.php
index 1a70af60d6375a3334da66c6bfdb27ccee5b481e..678da2ceea6a0e2c3e632ef8b72849e185ecb6cd 100644
--- a/app/code/Magento/Bundle/Model/Plugin/PriceBackend.php
+++ b/app/code/Magento/Bundle/Model/Plugin/PriceBackend.php
@@ -33,21 +33,22 @@ class PriceBackend
     /**
      * @param \Magento\Catalog\Model\Product\Attribute\Backend\Price $subject
      * @param \Closure $proceed
-     * @param \Magento\Catalog\Model\Product $product
+     * @param \Magento\Catalog\Model\Product|\Magento\Framework\Object $object
      * @return bool
      * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
     public function aroundValidate(
         \Magento\Catalog\Model\Product\Attribute\Backend\Price $subject,
         \Closure $proceed,
-        \Magento\Catalog\Model\Product $product
+        $object
     ) {
-        if ($product->getTypeId() == \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE
-            && $product->getPriceType() == \Magento\Bundle\Model\Product\Price::PRICE_TYPE_DYNAMIC
+        if ($object instanceof \Magento\Catalog\Model\Product
+            && $object->getTypeId() == \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE
+            && $object->getPriceType() == \Magento\Bundle\Model\Product\Price::PRICE_TYPE_DYNAMIC
         ) {
             return true;
         } else {
-            return $proceed($product);
+            return $proceed($object);
         }
     }
 }
diff --git a/app/code/Magento/Bundle/Service/V1/Data/Product/Option.php b/app/code/Magento/Bundle/Service/V1/Data/Product/Option.php
new file mode 100644
index 0000000000000000000000000000000000000000..dfb605d843b2985a3943832c84f90ff2da49b347
--- /dev/null
+++ b/app/code/Magento/Bundle/Service/V1/Data/Product/Option.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\Bundle\Service\V1\Data\Product;
+
+use \Magento\Framework\Service\Data\AbstractObject;
+
+/**
+ * @codeCoverageIgnore
+ */
+class Option extends AbstractObject
+{
+    const ID = 'id';
+
+    const TITLE = 'title';
+
+    const REQUIRED = 'required';
+
+    const TYPE = 'type';
+
+    const POSITION = 'position';
+
+    const SKU = 'sku';
+
+    /**
+     * Get option id
+     *
+     * @return int|null
+     */
+    public function getId()
+    {
+        return $this->_get(self::ID);
+    }
+
+    /**
+     * Get option title
+     *
+     * @return string|null
+     */
+    public function getTitle()
+    {
+        return $this->_get(self::TITLE);
+    }
+
+    /**
+     * Get is required option
+     *
+     * @return bool|null
+     */
+    public function isRequired()
+    {
+        return $this->_get(self::REQUIRED);
+    }
+
+    /**
+     * Get input type
+     *
+     * @return string|null
+     */
+    public function getType()
+    {
+        return $this->_get(self::TYPE);
+    }
+
+    /**
+     * Get option position
+     *
+     * @return int|null
+     */
+    public function getPosition()
+    {
+        return $this->_get(self::POSITION);
+    }
+
+    /**
+     * Get product sku
+     *
+     * @return string|null
+     */
+    public function getSku()
+    {
+        return $this->_get(self::SKU);
+    }
+}
diff --git a/app/code/Magento/Bundle/Service/V1/Data/Product/Option/Type.php b/app/code/Magento/Bundle/Service/V1/Data/Product/Option/Type.php
new file mode 100644
index 0000000000000000000000000000000000000000..596a44f534326eefe2acdbffeaa6a39d59ecc522
--- /dev/null
+++ b/app/code/Magento/Bundle/Service/V1/Data/Product/Option/Type.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.
+ *
+ * @copyright   Copyright (c) 2014 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\Service\V1\Data\Product\Option;
+
+use \Magento\Framework\Service\Data\AbstractObject;
+
+/**
+ * @codeCoverageIgnore
+ */
+class Type extends AbstractObject
+{
+    const LABEL = 'label';
+
+    const CODE = 'code';
+
+    /**
+     * Get type label
+     *
+     * @return string
+     */
+    public function getLabel()
+    {
+        return $this->_get(self::LABEL);
+    }
+
+    /**
+     * Get type code
+     *
+     * @return string
+     */
+    public function getCode()
+    {
+        return $this->_get(self::CODE);
+    }
+}
diff --git a/app/code/Magento/Bundle/Service/V1/Data/Product/Option/TypeBuilder.php b/app/code/Magento/Bundle/Service/V1/Data/Product/Option/TypeBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..04af6800a31061bf3299691e15aeb7dfd35b9532
--- /dev/null
+++ b/app/code/Magento/Bundle/Service/V1/Data/Product/Option/TypeBuilder.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\Bundle\Service\V1\Data\Product\Option;
+
+use Magento\Framework\Service\Data\AbstractObjectBuilder;
+
+/**
+ * @codeCoverageIgnore
+ */
+class TypeBuilder extends AbstractObjectBuilder
+{
+    /**
+     * Set type label
+     *
+     * @param int $value
+     * @return $this
+     */
+    public function setLabel($value)
+    {
+        return $this->_set(Type::LABEL, $value);
+    }
+
+    /**
+     * Set type code
+     *
+     * @param int $value
+     * @return $this
+     */
+    public function setCode($value)
+    {
+        return $this->_set(Type::CODE, $value);
+    }
+}
diff --git a/app/code/Magento/Bundle/Service/V1/Data/Product/Option/TypeConverter.php b/app/code/Magento/Bundle/Service/V1/Data/Product/Option/TypeConverter.php
new file mode 100644
index 0000000000000000000000000000000000000000..b64fecdbd27fc5daaf93aeead71e07adcb1d8c01
--- /dev/null
+++ b/app/code/Magento/Bundle/Service/V1/Data/Product/Option/TypeConverter.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\Bundle\Service\V1\Data\Product\Option;
+
+
+class TypeConverter
+{
+    /**
+     * @var TypeBuilder
+     */
+    private $builder;
+
+    /**
+     * @param TypeBuilder $builder
+     */
+    public function __construct(TypeBuilder $builder)
+    {
+        $this->builder = $builder;
+    }
+
+    /**
+     * @param array $option
+     * @return Type
+     */
+    public function createDataFromModel(array $option)
+    {
+        $this->builder->populateWithArray($option)
+            ->setCode($option['value']);
+        return $this->builder->create();
+    }
+}
diff --git a/app/code/Magento/Bundle/Service/V1/Data/Product/OptionBuilder.php b/app/code/Magento/Bundle/Service/V1/Data/Product/OptionBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..398f8f1a995b03f98f388adccf404381ee50f8ca
--- /dev/null
+++ b/app/code/Magento/Bundle/Service/V1/Data/Product/OptionBuilder.php
@@ -0,0 +1,98 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Bundle\Service\V1\Data\Product;
+
+use Magento\Framework\Service\Data\AbstractObjectBuilder;
+
+/**
+ * @codeCoverageIgnore
+ */
+class OptionBuilder extends AbstractObjectBuilder
+{
+    /**
+     * Set option id
+     *
+     * @param int $value
+     * @return $this
+     */
+    public function setId($value)
+    {
+        return $this->_set(Option::ID, $value);
+    }
+
+    /**
+     * Set option title
+     *
+     * @param string $value
+     * @return $this
+     */
+    public function setTitle($value)
+    {
+        return $this->_set(Option::TITLE, $value);
+    }
+
+    /**
+     * Set is required option
+     *
+     * @param bool $value
+     * @return $this
+     */
+    public function setRequired($value)
+    {
+        return $this->_set(Option::REQUIRED, $value);
+    }
+
+    /**
+     * Set input type
+     *
+     * @param string $value
+     * @return $this
+     */
+    public function setType($value)
+    {
+        return $this->_set(Option::TYPE, $value);
+    }
+
+    /**
+     * Set option position
+     *
+     * @param int $value
+     * @return $this
+     */
+    public function setPosition($value)
+    {
+        return $this->_set(Option::POSITION, $value);
+    }
+
+    /**
+     * Set product sku
+     *
+     * @param string $value
+     * @return $this
+     */
+    public function setSku($value)
+    {
+        return $this->_set(Option::SKU, $value);
+    }
+}
diff --git a/app/code/Magento/Bundle/Service/V1/Data/Product/OptionConverter.php b/app/code/Magento/Bundle/Service/V1/Data/Product/OptionConverter.php
new file mode 100644
index 0000000000000000000000000000000000000000..b5de09c3576a2b308ffb01be052245518652585f
--- /dev/null
+++ b/app/code/Magento/Bundle/Service/V1/Data/Product/OptionConverter.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\Bundle\Service\V1\Data\Product;
+
+use Magento\Bundle\Model\Option as OptionModel;
+use Magento\Bundle\Model\OptionFactory;
+use Magento\Catalog\Model\Product;
+
+/**
+ * @codeCoverageIgnore
+ */
+class OptionConverter
+{
+    /**
+     * @var OptionBuilder
+     */
+    private $builder;
+    /**
+     * @var \Magento\Bundle\Model\OptionFactory
+     */
+    private $optionFactory;
+
+    /**
+     * @param OptionBuilder $builder
+     * @param OptionFactory $optionFactory
+     */
+    public function __construct(
+        OptionBuilder $builder,
+        OptionFactory $optionFactory
+    ) {
+        $this->builder = $builder;
+        $this->optionFactory = $optionFactory;
+    }
+
+    /**
+     * @param OptionModel $option
+     * @param Product $product
+     * @return Option
+     */
+    public function createDataFromModel(OptionModel $option, Product $product)
+    {
+        $this->builder->populateWithArray($option->getData())
+            ->setId($option->getId())
+            ->setTitle(is_null($option->getTitle()) ? $option->getDefaultTitle() : $option->getTitle())
+            ->setSku($product->getSku());
+        return $this->builder->create();
+    }
+
+    /**
+     * @param Option $option
+     * @param Product $product
+     * @return OptionModel
+     */
+    public function createModelFromData(Option $option, Product $product)
+    {
+        $optionModel = $this->optionFactory->create();
+        $optionModel->addData($option->__toArray())
+            ->unsetData($optionModel->getIdFieldName())
+            ->setParentId($product->getId())
+            ->setDefaultTitle($option->getTitle());
+        return $optionModel;
+    }
+
+    /**
+     * @param Option $option
+     * @param OptionModel $optionModel
+     * @return OptionModel
+     */
+    public function getModelFromData(Option $option, OptionModel $optionModel)
+    {
+        $newOptionModel = $this->optionFactory->create();
+        $newOptionModel->setData($optionModel->getData())
+            ->addData($option->__toArray())
+            ->setId($optionModel->getId())
+            ->setDefaultTitle(is_null($option->getTitle()) ? $optionModel->getTitle() : $option->getTitle());
+        return $newOptionModel;
+    }
+}
diff --git a/app/code/Magento/Bundle/Service/V1/Product/Link/WriteService.php b/app/code/Magento/Bundle/Service/V1/Product/Link/WriteService.php
index 1218d7fcfa70afd466d9eb365b15a2eafd022538..2964310bc693c25faa781cb82469dabb0bd5ad79 100644
--- a/app/code/Magento/Bundle/Service/V1/Product/Link/WriteService.php
+++ b/app/code/Magento/Bundle/Service/V1/Product/Link/WriteService.php
@@ -169,7 +169,7 @@ class WriteService implements WriteServiceInterface
         $removeSelectionIds = array();
         foreach ($this->getOptions($product) as $option) {
             foreach ($option->getSelections() as $selection) {
-                if (($selection->getSku() == $childSku) && ($selection->getOptionId() == $optionId)) {
+                if ((strcasecmp($selection->getSku(), $childSku) == 0) && ($selection->getOptionId() == $optionId)) {
                     $removeSelectionIds[] = $selection->getSelectionId();
                     continue;
                 }
diff --git a/app/code/Magento/Bundle/Service/V1/Product/Option/ReadService.php b/app/code/Magento/Bundle/Service/V1/Product/Option/ReadService.php
new file mode 100644
index 0000000000000000000000000000000000000000..714401d72e441e215c3630de193a395af5c1eedc
--- /dev/null
+++ b/app/code/Magento/Bundle/Service/V1/Product/Option/ReadService.php
@@ -0,0 +1,113 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Bundle\Service\V1\Product\Option;
+
+use Magento\Bundle\Model\Product\Type;
+use Magento\Bundle\Service\V1\Data\Product\OptionConverter;
+use Magento\Catalog\Model\Product;
+use Magento\Catalog\Model\ProductRepository;
+use Magento\Framework\Exception\NoSuchEntityException;
+use Magento\Webapi\Exception;
+
+class ReadService implements ReadServiceInterface
+{
+    /**
+     * @var ProductRepository
+     */
+    private $productRepository;
+
+    /**
+     * @var OptionConverter
+     */
+    private $optionConverter;
+    /**
+     * @var Type
+     */
+    private $type;
+
+    /**
+     * @param OptionConverter $optionConverter
+     * @param ProductRepository $productRepository
+     * @param Type $type
+     */
+    public function __construct(
+        OptionConverter $optionConverter,
+        ProductRepository $productRepository,
+        Type $type
+    ) {
+        $this->optionConverter = $optionConverter;
+        $this->productRepository = $productRepository;
+        $this->type = $type;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function get($productSku, $optionId)
+    {
+        $product = $this->getProduct($productSku);
+        $optionCollection = $this->type->getOptionsCollection($product);
+        $optionCollection->setIdFilter($optionId);
+
+        /** @var \Magento\Bundle\Model\Option $option */
+        $option = $optionCollection->getFirstItem();
+        if (!$option->getId()) {
+            throw new NoSuchEntityException('Requested option doesn\'t exist');
+        }
+        return $this->optionConverter->createDataFromModel($option, $product);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getList($productSku)
+    {
+        $product = $this->getProduct($productSku);
+        $optionCollection = $this->type->getOptionsCollection($product);
+
+        /** @var \Magento\Bundle\Service\V1\Data\Product\Option[] $optionDtoList */
+        $optionDtoList = [];
+        /** @var \Magento\Bundle\Model\Option $option */
+        foreach ($optionCollection as $option) {
+            $optionDtoList[] = $this->optionConverter->createDataFromModel($option, $product);
+        }
+        return $optionDtoList;
+    }
+
+    /**
+     * @param string $productSku
+     * @return Product
+     * @throws Exception
+     */
+    private function getProduct($productSku)
+    {
+        $product = $this->productRepository->get($productSku);
+
+        if ($product->getTypeId() != \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE) {
+            throw new Exception('Only implemented for bundle product', Exception::HTTP_FORBIDDEN);
+        }
+
+        return $product;
+    }
+}
diff --git a/app/code/Magento/Bundle/Service/V1/Product/Option/ReadServiceInterface.php b/app/code/Magento/Bundle/Service/V1/Product/Option/ReadServiceInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..14abab5ec34a52d840c40d9dcf2561cb6df501fe
--- /dev/null
+++ b/app/code/Magento/Bundle/Service/V1/Product/Option/ReadServiceInterface.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.
+ *
+ * @copyright   Copyright (c) 2014 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\Service\V1\Product\Option;
+
+interface ReadServiceInterface
+{
+    /**
+     * Get option for bundle product
+     *
+     * @param string $productSku
+     * @param int $optionId
+     * @return \Magento\Bundle\Service\V1\Data\Product\Option
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     * @throws \Magento\Webapi\Exception
+     */
+    public function get($productSku, $optionId);
+
+    /**
+     * Get all options for bundle product
+     *
+     * @param string $productSku
+     * @return \Magento\Bundle\Service\V1\Data\Product\Option[]
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     * @throws \Magento\Webapi\Exception
+     */
+    public function getList($productSku);
+}
diff --git a/app/code/Magento/Bundle/Service/V1/Product/Option/Type/ReadService.php b/app/code/Magento/Bundle/Service/V1/Product/Option/Type/ReadService.php
new file mode 100644
index 0000000000000000000000000000000000000000..073a80b88aef85a005de5418611c8fc2c85424e7
--- /dev/null
+++ b/app/code/Magento/Bundle/Service/V1/Product/Option/Type/ReadService.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\Bundle\Service\V1\Product\Option\Type;
+
+use Magento\Bundle\Model\Source\Option\Type as TypeModel;
+use Magento\Bundle\Service\V1\Data\Product\Option\Type;
+use Magento\Bundle\Service\V1\Data\Product\Option\TypeConverter;
+
+class ReadService implements ReadServiceInterface
+{
+    /**
+     * @var TypeModel
+     */
+    private $type;
+
+    /**
+     * @var TypeConverter
+     */
+    private $typeConverter;
+
+    /**
+     * @param TypeModel $type
+     * @param TypeConverter $typeConverter
+     */
+    public function __construct(TypeModel $type, TypeConverter $typeConverter)
+    {
+        $this->type = $type;
+        $this->typeConverter = $typeConverter;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getTypes()
+    {
+        $optionList = $this->type->toOptionArray();
+
+        /** @var Type[] $typeDtoList */
+        $typeDtoList = [];
+        foreach ($optionList as $option) {
+            $typeDtoList[] = $this->typeConverter->createDataFromModel($option);
+        }
+        return $typeDtoList;
+    }
+}
diff --git a/app/code/Magento/Bundle/Service/V1/Product/Option/Type/ReadServiceInterface.php b/app/code/Magento/Bundle/Service/V1/Product/Option/Type/ReadServiceInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..90fbc02a75e15f9fcba34e163c94f9afc6637b91
--- /dev/null
+++ b/app/code/Magento/Bundle/Service/V1/Product/Option/Type/ReadServiceInterface.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\Bundle\Service\V1\Product\Option\Type;
+
+interface ReadServiceInterface
+{
+    /**
+     * Get all types for options for bundle products
+     *
+     * @return \Magento\Bundle\Service\V1\Data\Product\Option\Type[]
+     */
+    public function getTypes();
+}
diff --git a/app/code/Magento/Bundle/Service/V1/Product/Option/WriteService.php b/app/code/Magento/Bundle/Service/V1/Product/Option/WriteService.php
new file mode 100644
index 0000000000000000000000000000000000000000..d48888f52295d6d8ad98279be65a749c4bb9190e
--- /dev/null
+++ b/app/code/Magento/Bundle/Service/V1/Product/Option/WriteService.php
@@ -0,0 +1,159 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Bundle\Service\V1\Product\Option;
+
+use Magento\Bundle\Model\Product\Type;
+use Magento\Bundle\Service\V1\Data\Product\Option;
+use Magento\Bundle\Service\V1\Data\Product\OptionConverter;
+use Magento\Catalog\Model\Product;
+use Magento\Catalog\Model\ProductRepository;
+use Magento\Framework\Exception\CouldNotSaveException;
+use Magento\Framework\Exception\NoSuchEntityException;
+use Magento\Store\Model\StoreManagerInterface;
+use Magento\Webapi\Exception;
+
+class WriteService implements WriteServiceInterface
+{
+    /**
+     * @var ProductRepository
+     */
+    private $productRepository;
+    /**
+     * @var Type
+     */
+    private $type;
+    /**
+     * @var \Magento\Bundle\Service\V1\Data\Product\OptionConverter
+     */
+    private $optionConverter;
+    /**
+     * @var \Magento\Store\Model\StoreManager
+     */
+    private $storeManager;
+
+    /**
+     * @param ProductRepository $productRepository
+     * @param Type $type
+     * @param OptionConverter $optionConverter
+     * @param StoreManagerInterface $storeManager
+     */
+    public function __construct(
+        ProductRepository $productRepository,
+        Type $type,
+        OptionConverter $optionConverter,
+        StoreManagerInterface $storeManager
+    ) {
+        $this->productRepository = $productRepository;
+        $this->type = $type;
+        $this->optionConverter = $optionConverter;
+        $this->storeManager = $storeManager;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function remove($productSku, $optionId)
+    {
+        $product = $this->getProduct($productSku);
+        $optionCollection = $this->type->getOptionsCollection($product);
+        $optionCollection->setIdFilter($optionId);
+
+        /** @var \Magento\Bundle\Model\Option $removeOption */
+        $removeOption = $optionCollection->getFirstItem();
+        if (!$removeOption->getId()) {
+            throw new NoSuchEntityException('Requested option doesn\'t exist');
+        }
+        $removeOption->delete();
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function add($productSku, Option $option)
+    {
+        $product = $this->getProduct($productSku);
+        $optionModel = $this->optionConverter->createModelFromData($option, $product);
+        $optionModel->setStoreId($this->storeManager->getStore()->getId());
+
+        try {
+            $optionModel->save();
+        } catch (\Exception $e) {
+            throw new CouldNotSaveException('Could not save option', [], $e);
+        }
+
+        return $optionModel->getId();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function update($productSku, $optionId, \Magento\Bundle\Service\V1\Data\Product\Option $option)
+    {
+        $product = $this->getProduct($productSku);
+        $optionCollection = $this->type->getOptionsCollection($product);
+        $optionCollection->setIdFilter($optionId);
+
+        /** @var \Magento\Bundle\Model\Option $optionModel */
+        $optionModel = $optionCollection->getFirstItem();
+        $updateOption = $this->optionConverter->getModelFromData($option, $optionModel);
+
+        if (!$updateOption->getId()) {
+            throw new NoSuchEntityException('Requested option doesn\'t exist');
+        }
+        $updateOption->setStoreId($this->storeManager->getStore()->getId());
+
+        try {
+            $updateOption->save();
+        } catch (\Exception $e) {
+            throw new CouldNotSaveException('Could not save option', [], $e);
+        }
+
+        return true;
+    }
+
+    /**
+     * @param string $productSku
+     * @return Product
+     * @throws Exception
+     */
+    private function getProduct($productSku)
+    {
+        $product = $this->productRepository->get($productSku);
+
+        if ($product->getTypeId() != \Magento\Catalog\Model\Product\Type::TYPE_BUNDLE) {
+            throw new Exception(
+                'Product with specified sku: "%1" is not a bundle product',
+                Exception::HTTP_FORBIDDEN,
+                Exception::HTTP_FORBIDDEN,
+                [
+                    $product->getSku()
+                ]
+            );
+        }
+
+        return $product;
+    }
+}
diff --git a/app/code/Magento/Bundle/Service/V1/Product/Option/WriteServiceInterface.php b/app/code/Magento/Bundle/Service/V1/Product/Option/WriteServiceInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..a5992eb2f7af9698c10e2101d9092aa4279b75c3
--- /dev/null
+++ b/app/code/Magento/Bundle/Service/V1/Product/Option/WriteServiceInterface.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\Bundle\Service\V1\Product\Option;
+
+interface WriteServiceInterface
+{
+    /**
+     * Remove bundle option
+     *
+     * @param string $productSku
+     * @param int $optionId
+     * @return bool
+     * @throws \Magento\Framework\Exception\CouldNotSaveException
+     * @throws \Magento\Webapi\Exception
+     */
+    public function remove($productSku, $optionId);
+
+    /**
+     * Add new option for bundle product
+     *
+     * @param string $productSku
+     * @param \Magento\Bundle\Service\V1\Data\Product\Option $option
+     * @return int
+     * @throws \Magento\Framework\Exception\CouldNotSaveException
+     * @throws \Magento\Webapi\Exception
+     */
+    public function add($productSku, \Magento\Bundle\Service\V1\Data\Product\Option $option);
+
+    /**
+     * Update option for bundle product
+     *
+     * @param string $productSku
+     * @param int $optionId
+     * @param \Magento\Bundle\Service\V1\Data\Product\Option $option
+     * @return bool
+     * @throws \Magento\Framework\Exception\CouldNotSaveException
+     * @throws \Magento\Webapi\Exception
+     */
+    public function update($productSku, $optionId, \Magento\Bundle\Service\V1\Data\Product\Option $option);
+}
diff --git a/app/code/Magento/Bundle/composer.json b/app/code/Magento/Bundle/composer.json
index 8bc03c3398594931486d39a0a971f6ea53481430..c0a9d91f9b573214144cd68177d600808e4f1f85 100644
--- a/app/code/Magento/Bundle/composer.json
+++ b/app/code/Magento/Bundle/composer.json
@@ -2,27 +2,27 @@
     "name": "magento/module-bundle",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-tax": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-checkout": "0.1.0-alpha89",
-        "magento/module-catalog-inventory": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-catalog-rule": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/module-weee": "0.1.0-alpha89",
-        "magento/module-gift-message": "0.1.0-alpha89",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
-        "magento/module-webapi": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-tax": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-checkout": "0.1.0-alpha90",
+        "magento/module-catalog-inventory": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-catalog-rule": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/module-weee": "0.1.0-alpha90",
+        "magento/module-gift-message": "0.1.0-alpha90",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
+        "magento/module-webapi": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Bundle/etc/di.xml b/app/code/Magento/Bundle/etc/di.xml
index fd02cc8f4cc9c6f51757c711d460ddbcfb692bd3..b33dcd27d2b05a88b71b97fa60227c921f0d0df6 100644
--- a/app/code/Magento/Bundle/etc/di.xml
+++ b/app/code/Magento/Bundle/etc/di.xml
@@ -26,6 +26,9 @@
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
     <preference for="Magento\Bundle\Service\V1\Product\Link\ReadServiceInterface" type="Magento\Bundle\Service\V1\Product\Link\ReadService" />
     <preference for="Magento\Bundle\Service\V1\Product\Link\WriteServiceInterface" type="Magento\Bundle\Service\V1\Product\Link\WriteService" />
+    <preference for="Magento\Bundle\Service\V1\Product\Option\ReadServiceInterface" type="Magento\Bundle\Service\V1\Product\Option\ReadService" />
+    <preference for="Magento\Bundle\Service\V1\Product\Option\WriteServiceInterface" type="Magento\Bundle\Service\V1\Product\Option\WriteService" />
+    <preference for="Magento\Bundle\Service\V1\Product\Option\Type\ReadServiceInterface" type="Magento\Bundle\Service\V1\Product\Option\Type\ReadService" />
     <type name="Magento\Bundle\Model\Source\Option\Type">
         <arguments>
             <argument name="options" xsi:type="array">
diff --git a/app/code/Magento/Bundle/etc/webapi.xml b/app/code/Magento/Bundle/etc/webapi.xml
index 757c74cee5b1333e78145dedf60219d3239f1f0f..8e9ea1b5287af32f7a9d52fac20c709088f38496 100644
--- a/app/code/Magento/Bundle/etc/webapi.xml
+++ b/app/code/Magento/Bundle/etc/webapi.xml
@@ -43,4 +43,40 @@
             <resource ref="Magento_Catalog::products"/>
         </resources>
     </route>
+    <route url="/V1/bundle-products/:productSku/option/all" method="GET">
+        <service class="Magento\Bundle\Service\V1\Product\Option\ReadServiceInterface" method="getList" />
+        <resources>
+            <resource ref="Magento_Catalog::products" />
+        </resources>
+    </route>
+    <route url="/V1/bundle-products/option/types" method="GET">
+        <service class="Magento\Bundle\Service\V1\Product\Option\Type\ReadServiceInterface" method="getTypes" />
+        <resources>
+            <resource ref="Magento_Catalog::products" />
+        </resources>
+    </route>
+    <route url="/V1/bundle-products/:productSku/option/:optionId" method="GET">
+        <service class="Magento\Bundle\Service\V1\Product\Option\ReadServiceInterface" method="get" />
+        <resources>
+            <resource ref="Magento_Catalog::products" />
+        </resources>
+    </route>
+    <route url="/V1/bundle-products/:productSku/option/add" method="POST">
+        <service class="Magento\Bundle\Service\V1\Product\Option\WriteServiceInterface" method="add" />
+        <resources>
+            <resource ref="Magento_Catalog::products" />
+        </resources>
+    </route>
+    <route url="/V1/bundle-products/:productSku/option/:optionId" method="PUT">
+        <service class="Magento\Bundle\Service\V1\Product\Option\WriteServiceInterface" method="update" />
+        <resources>
+            <resource ref="Magento_Catalog::products" />
+        </resources>
+    </route>
+    <route url="/V1/bundle-products/:productSku/option/:optionId" method="DELETE">
+        <service class="Magento\Bundle\Service\V1\Product\Option\WriteServiceInterface" method="remove" />
+        <resources>
+            <resource ref="Magento_Catalog::products" />
+        </resources>
+    </route>
 </routes>
diff --git a/app/code/Magento/Bundle/view/frontend/templates/sales/order/creditmemo/items/renderer.phtml b/app/code/Magento/Bundle/view/frontend/templates/sales/order/creditmemo/items/renderer.phtml
index c66e9c8e7070c1852be8242538f3dcac810fa2cf..f59849e66d53f2c7b910b98df53c8a4ea9f6a603 100644
--- a/app/code/Magento/Bundle/view/frontend/templates/sales/order/creditmemo/items/renderer.phtml
+++ b/app/code/Magento/Bundle/view/frontend/templates/sales/order/creditmemo/items/renderer.phtml
@@ -42,19 +42,19 @@
     <?php if ($_item->getOrderItem()->getParentItem()): ?>
         <?php $attributes = $this->getSelectionAttributes($_item) ?>
         <?php if ($_prevOptionId != $attributes['option_id']): ?>
-            <tr>
+            <tr class="options-label">
                 <td class="col label" colspan="7"><div class="option label"><?php echo $attributes['option_label'] ?></div></td>
             </tr>
             <?php $_prevOptionId = $attributes['option_id'] ?>
         <?php endif; ?>
     <?php endif; ?>
-<tr id="order-item-row-<?php echo $_item->getId() ?>" class="<?php if ($_item->getOrderItem()->getParentItem()): ?>item-options<?php else: ?>item-parent<?php endif; ?>">
+<tr id="order-item-row-<?php echo $_item->getId() ?>" class="<?php if ($_item->getOrderItem()->getParentItem()): ?>item-options<?php else: ?>item-parent<?php endif; ?>"<?php if ($_item->getParentItem()): ?> data-th="<?php echo $attributes['option_label'] ?>"<?php endif; ?>>
     <?php if (!$_item->getOrderItem()->getParentItem()): ?>
         <td class="col name" data-th="<?php echo $this->escapeHtml(__('Product Name')); ?>">
             <strong class="product name product-item-name"><?php echo $this->escapeHtml($_item->getName()) ?></strong>
         </td>
     <?php else: ?>
-        <td class="col value"><?php echo $this->getValueHtml($_item) ?></td>
+        <td class="col value" data-th="<?php echo $this->escapeHtml(__('Product Name')); ?>"><?php echo $this->getValueHtml($_item) ?></td>
     <?php endif; ?>
     <td class="col sku" data-th="<?php echo $this->escapeHtml(__('SKU')); ?>"><?php echo $this->escapeHtml($_item->getSku()) ?></td>
     <td class="col price" data-th="<?php echo $this->escapeHtml(__('Price')); ?>">
diff --git a/app/code/Magento/Bundle/view/frontend/templates/sales/order/invoice/items/renderer.phtml b/app/code/Magento/Bundle/view/frontend/templates/sales/order/invoice/items/renderer.phtml
index 2515d5a29c3a269a9eb8fde19f5703c3e9ea8444..20b29c9f31724e56ec3a413c181e255f3a4e2926 100644
--- a/app/code/Magento/Bundle/view/frontend/templates/sales/order/invoice/items/renderer.phtml
+++ b/app/code/Magento/Bundle/view/frontend/templates/sales/order/invoice/items/renderer.phtml
@@ -41,19 +41,19 @@
     <?php if ($_item->getOrderItem()->getParentItem()): ?>
         <?php $attributes = $this->getSelectionAttributes($_item) ?>
         <?php if ($_prevOptionId != $attributes['option_id']): ?>
-            <tr>
+            <tr class="options-label">
                 <td class="col label" colspan="5"><div class="option label"><?php echo $attributes['option_label'] ?></div></td>
             </tr>
             <?php $_prevOptionId = $attributes['option_id'] ?>
         <?php endif; ?>
     <?php endif; ?>
-    <tr id="order-item-row-<?php echo $_item->getId() ?>" class="<?php if ($_item->getOrderItem()->getParentItem()): ?>item-options<?php else: ?>item-parent<?php endif; ?>">
+    <tr id="order-item-row-<?php echo $_item->getId() ?>" class="<?php if ($_item->getOrderItem()->getParentItem()): ?>item-options<?php else: ?>item-parent<?php endif; ?>"<?php if ($_item->getOrderItem()->getParentItem()): ?> data-th="<?php echo $attributes['option_label'] ?>"<?php endif; ?>>
     <?php if (!$_item->getOrderItem()->getParentItem()): ?>
         <td class="col name" data-th="<?php echo $this->escapeHtml(__('Product Name')); ?>">
             <strong class="product name product-item-name"><?php echo $this->escapeHtml($_item->getName()) ?></strong>
         </td>
     <?php else: ?>
-        <td class="col value"><?php echo $this->getValueHtml($_item) ?></td>
+        <td class="col value" data-th="<?php echo $this->escapeHtml(__('Product Name')); ?>"><?php echo $this->getValueHtml($_item) ?></td>
     <?php endif; ?>
     <td class="col sku" data-th="<?php echo $this->escapeHtml(__('SKU')); ?>"><?php echo $this->escapeHtml($_item->getSku()) ?></td>
     <td class="col price" data-th="<?php echo $this->escapeHtml(__('Price')); ?>">
diff --git a/app/code/Magento/Bundle/view/frontend/templates/sales/order/items/renderer.phtml b/app/code/Magento/Bundle/view/frontend/templates/sales/order/items/renderer.phtml
index 1581213677eaf570900524d4a02159261bbbf1f8..b1908e1964b73b6e6d79a68082193c9ab168d9e0 100644
--- a/app/code/Magento/Bundle/view/frontend/templates/sales/order/items/renderer.phtml
+++ b/app/code/Magento/Bundle/view/frontend/templates/sales/order/items/renderer.phtml
@@ -42,19 +42,19 @@
     <?php if ($_item->getParentItem()): ?>
         <?php $attributes = $this->getSelectionAttributes($_item) ?>
         <?php if ($_prevOptionId != $attributes['option_id']): ?>
-            <tr<?php if ($_item->getLastRow()) echo 'class="last"'; ?>>
-                <td class="col label" colspan="5"><div class="option label"><?php echo $attributes['option_label'] ?></div></td>
+            <tr class="options-label">
+                <td class="col label" colspan="5"><?php echo $attributes['option_label'] ?></td>
             </tr>
             <?php $_prevOptionId = $attributes['option_id'] ?>
         <?php endif; ?>
     <?php endif; ?>
-<tr id="order-item-row-<?php echo $_item->getId() ?>" class="<?php if ($_item->getParentItem()): ?>item-options<?php else: ?>item-parent<?php endif; ?>">
+<tr id="order-item-row-<?php echo $_item->getId() ?>" class="<?php if ($_item->getParentItem()): ?>item-options<?php else: ?>item-parent<?php endif; ?>"<?php if ($_item->getParentItem()): ?> data-th="<?php echo $attributes['option_label'] ?>"<?php endif; ?>>
     <?php if (!$_item->getParentItem()): ?>
         <td class="col name" data-th="<?php echo $this->escapeHtml(__('Product Name')); ?>">
             <strong class="product name product-item-name"><?php echo $this->escapeHtml($_item->getName()) ?></strong>
         </td>
     <?php else: ?>
-        <td class="col value"><?php echo $this->getValueHtml($_item)?></td>
+        <td class="col value" data-th="<?php echo $this->escapeHtml(__('Product Name')); ?>"><?php echo $this->getValueHtml($_item)?></td>
     <?php endif; ?>
     <td class="col sku" data-th="<?php echo $this->escapeHtml(__('SKU')); ?>"><?php echo $this->prepareSku($_item->getSku()) ?></td>
     <td class="col price" data-th="<?php echo $this->escapeHtml(__('Price')); ?>">
@@ -295,7 +295,7 @@
 <?php endforeach; ?>
 <?php if ($_showlastRow): ?>
 <tr>
-    <td class="col options" colspan="5">
+    <td class="col options" colspan="5" >
         <?php if($_options = $this->getItemOptions()): ?>
             <dl class="item options">
                 <?php foreach ($_options as $_option) : ?>
diff --git a/app/code/Magento/Bundle/view/frontend/templates/sales/order/shipment/items/renderer.phtml b/app/code/Magento/Bundle/view/frontend/templates/sales/order/shipment/items/renderer.phtml
index d47b684a7d80d8891f45eca990aa4bfd502bf86d..5e3fc45b43d7ebe0278b7cb73b5563c9763dc4c2 100644
--- a/app/code/Magento/Bundle/view/frontend/templates/sales/order/shipment/items/renderer.phtml
+++ b/app/code/Magento/Bundle/view/frontend/templates/sales/order/shipment/items/renderer.phtml
@@ -41,19 +41,19 @@
     <?php if ($_item->getParentItem()): ?>
         <?php $attributes = $this->getSelectionAttributes($_item) ?>
         <?php if ($_prevOptionId != $attributes['option_id']): ?>
-            <tr>
+            <tr class="options-label">
                 <td colspan="3" class="col label"><div class="option label"><?php echo $attributes['option_label'] ?></div></td>
             </tr>
             <?php $_prevOptionId = $attributes['option_id'] ?>
         <?php endif; ?>
     <?php endif; ?>
-    <tr id="order-item-row-<?php echo $_item->getId() ?>" class="<?php if ($_item->getParentItem()): ?>item-options<?php else: ?>item-parent<?php endif; ?>">
+    <tr id="order-item-row-<?php echo $_item->getId() ?>" class="<?php if ($_item->getParentItem()): ?>item-options<?php else: ?>item-parent<?php endif; ?>"<?php if ($_item->getParentItem()): ?> data-th="<?php echo $attributes['option_label'] ?>"<?php endif; ?>>
         <?php if (!$_item->getParentItem()): ?>
             <td class="col name" data-th="<?php echo $this->escapeHtml(__('Product Name')); ?>">
                 <strong class="product name product-item-name"><?php echo $this->escapeHtml($_item->getName()) ?></strong>
             </td>
         <?php else: ?>
-            <td class="col value"><?php echo $this->getValueHtml($_item) ?></td>
+            <td class="col value" data-th="<?php echo $this->escapeHtml(__('Product Name')); ?>"><?php echo $this->getValueHtml($_item) ?></td>
         <?php endif; ?>
         <td class="col sku" data-th="<?php echo $this->escapeHtml(__('SKU')); ?>"><?php echo $this->escapeHtml($_item->getSku()) ?></td>
         <td class="col qty" data-th="<?php echo $this->escapeHtml(__('Qty Shipped')); ?>">
diff --git a/app/code/Magento/Captcha/composer.json b/app/code/Magento/Captcha/composer.json
index 958b9216861f45076c955401e3ed9b4bb97edd65..c00bf2b08251e7ae6399bb96602a973bedd73bc8 100644
--- a/app/code/Magento/Captcha/composer.json
+++ b/app/code/Magento/Captcha/composer.json
@@ -2,17 +2,17 @@
     "name": "magento/module-captcha",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-checkout": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-checkout": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Captcha/view/frontend/templates/default.phtml b/app/code/Magento/Captcha/view/frontend/templates/default.phtml
index ef872a1f592710358d2dd84695d5bb8b0ec25123..f382e4f6eb35311a1389d55bbd979c9621024eb8 100644
--- a/app/code/Magento/Captcha/view/frontend/templates/default.phtml
+++ b/app/code/Magento/Captcha/view/frontend/templates/default.phtml
@@ -36,13 +36,13 @@
                  data-mage-init='{"captcha":{"url": "<?php echo $this->getRefreshUrl()?>",
                                              "type": "<?php echo $this->getFormId() ?>"}}'>
                 <div class="control captcha-image">
-                    <button type="button" class="action reload captcha-reload" title="<?php echo __('Reload captcha') ?>"><span><?php echo __('Reload captcha') ?></span></button>
                     <img alt="<?php echo __('Please type the letters below')?>" class="captcha-img" height="<?php echo $this->getImgHeight() ?>" src="<?php echo $captcha->getImgSrc() ?>"/>
                     <?php if ($captcha->isCaseSensitive()) :?>
                         <div class="captcha-note note">
                             <?php echo __('<strong>Attention</strong>: Captcha is case sensitive.') ?>
                         </div>
                     <?php endif; ?>
+                    <button type="button" class="action reload captcha-reload" title="<?php echo __('Reload captcha') ?>"><span><?php echo __('Reload captcha') ?></span></button>
                 </div>
             </div>
         </div>
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 5d17b451a4a8770ba27e7e1f5ce94cef0d4a62be..d4a5e5e111d466056037cc3f13e78a903436a7b9 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
@@ -334,7 +334,8 @@ class Crosssell extends Extended
                 'editable' => !$this->isReadonly(),
                 'edit_only' => !$this->getProduct()->getId(),
                 'header_css_class' => 'col-position',
-                'column_css_class' => 'col-position'
+                'column_css_class' => 'col-position',
+                'filter_condition_callback' => array($this, 'filterProductPosition')
             )
         );
 
@@ -385,4 +386,17 @@ class Crosssell extends Extended
         }
         return $products;
     }
+
+    /**
+     * Apply `position` filter to cross-sell grid.
+     *
+     * @param \Magento\Catalog\Model\Resource\Product\Link\Product\Collection $collection $collection
+     * @param \Magento\Backend\Block\Widget\Grid\Column\Extended $column
+     * @return $this
+     */
+    public function filterProductPosition($collection, $column)
+    {
+        $collection->addLinkAttributeToFilter($column->getIndex(), $column->getFilter()->getCondition());
+        return $this;
+    }
 }
diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Options/Option.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Options/Option.php
index 738fe7b50d242f722bdf70b57ed866dd24366810..323ead3a5cfda77e6edc928f54a51edc0bc6d070 100644
--- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Options/Option.php
+++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Options/Option.php
@@ -340,7 +340,7 @@ class Option extends Widget
                             ) : '',
                             'price_type' => $showPrice ? $_value->getPriceType() : 0,
                             'sku' => $this->escapeHtml($_value->getSku()),
-                            'sort_order' => $_value->getSortOrder()
+                            'sort_order' => $_value->getSortOrder(),
                         );
 
                         if ($this->getProduct()->getStoreId() != '0') {
@@ -358,7 +358,8 @@ class Option extends Widget
                                     $_value->getOptionId(),
                                     'price',
                                     is_null($_value->getstorePrice()),
-                                    $_value->getOptionTypeId()
+                                    $_value->getOptionTypeId(),
+                                    ['$(this).up(1).previous()']
                                 );
                                 $value['optionValues'][$i]['scopePriceDisabled'] = is_null(
                                     $_value->getStorePrice()
@@ -404,9 +405,10 @@ class Option extends Widget
      * @param string $name
      * @param boolean $checked
      * @param string $select_id
+     * @param array $containers
      * @return string
      */
-    public function getCheckboxScopeHtml($id, $name, $checked = true, $select_id = '-1')
+    public function getCheckboxScopeHtml($id, $name, $checked = true, $select_id = '-1', array $containers = [])
     {
         $checkedHtml = '';
         if ($checked) {
@@ -418,14 +420,20 @@ class Option extends Widget
             $selectNameHtml = '[values][' . $select_id . ']';
             $selectIdHtml = 'select_' . $select_id . '_';
         }
+        $containers[] = '$(this).up(1)';
+        $containers = implode(',', $containers);
+        $localId = $this->getFieldId() . '_' . $id . '_' . $selectIdHtml . $name . '_use_default';
+        $localName = "options_use_default[" . $id . "]" . $selectNameHtml . "[" . $name . "]";
         $useDefault =
-            '<div class="field-service">' . '<label for="' . $this->getFieldId() . '_' . $id . '_' . $selectIdHtml
-            . $name . '" class="use-default">' . '<input value="1" type="checkbox" class="use-default-control"'
-            . 'name="' . $this->getFieldName() . '[' . $id . ']' . $selectNameHtml . '[scope][' . $name . ']"' . 'id="'
-            . $this->getFieldId() . '_' . $id . '_' . $selectIdHtml . $name . '_use_default"' . $checkedHtml
-            . ' /><span class="use-default-label">' . __(
-                'Use Default'
-            ) . '</span></label></div>';
+            '<div class="field-service">'
+            . '<input type="checkbox" class="use-default-control"'
+            . ' name="' . $localName . '"' . 'id="' . $localId . '"'
+            . ' value=""'
+            . $checkedHtml
+            . ' onchange="toggleSeveralValueElements(this, [' . $containers . ']);" '
+            . ' />'
+            . '<label for="' . $localId . '" class="use-default">'
+            . '<span class="use-default-label">' . __('Use Default') . '</span></label></div>';
 
         return $useDefault;
     }
diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Options/Type/Select.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Options/Type/Select.php
index 5fc2bd2a1460b33b927d5f1091c3d9b5536c7f0e..e55b1ef0ec37de3f6144f1fde92842c3b56cc2df 100644
--- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Options/Type/Select.php
+++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tab/Options/Type/Select.php
@@ -94,9 +94,12 @@ class Select extends \Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Options\T
     }
 
     /**
+     * Return select input for price type
+     *
+     * @param string $extraParams
      * @return string
      */
-    public function getPriceTypeSelectHtml()
+    public function getPriceTypeSelectHtml($extraParams = '')
     {
         $this->getChildBlock(
             'option_price_type'
@@ -105,7 +108,7 @@ class Select extends \Magento\Catalog\Block\Adminhtml\Product\Edit\Tab\Options\T
             'product_option_${id}_select_${select_id}_price_type'
         )->setName(
             'product[options][${id}][values][${select_id}][price_type]'
-        );
+        )->setExtraParams($extraParams);
 
         return parent::getPriceTypeSelectHtml();
     }
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 b17bdfcbb78c38511323c3d7b9c7bf36d1094261..746bb97b500013f8559ff68f15ef4f0b839ffad1 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
@@ -325,7 +325,8 @@ class Upsell extends \Magento\Backend\Block\Widget\Grid\Extended
                 'editable' => !$this->getProduct()->getUpsellReadonly(),
                 'edit_only' => !$this->getProduct()->getId(),
                 'header_css_class' => 'col-position',
-                'column_css_class' => 'col-position'
+                'column_css_class' => 'col-position',
+                'filter_condition_callback' => array($this, 'filterProductPosition')
             )
         );
 
@@ -376,4 +377,17 @@ class Upsell extends \Magento\Backend\Block\Widget\Grid\Extended
         }
         return $products;
     }
+
+    /**
+     * Apply `position` filter to cross-sell grid.
+     *
+     * @param \Magento\Catalog\Model\Resource\Product\Link\Product\Collection $collection
+     * @param \Magento\Backend\Block\Widget\Grid\Column\Extended $column
+     * @return $this
+     */
+    public function filterProductPosition($collection, $column)
+    {
+        $collection->addLinkAttributeToFilter($column->getIndex(), $column->getFilter()->getCondition());
+        return $this;
+    }
 }
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 c8d62fa9e671e8c6a57d91d3c082a0cbb4e25298..81a22bbbdd45abaafcec5f012c033319007950a6 100644
--- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tabs.php
+++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Edit/Tabs.php
@@ -122,6 +122,18 @@ class Tabs extends \Magento\Backend\Block\Widget\Tabs
         $this->setDestElementId('product-edit-form-tabs');
     }
 
+    /**
+     * @param int $attributeSetId
+     * @return \Magento\Eav\Model\Resource\Entity\Attribute\Group\Collection
+     */
+    public function getGroupCollection($attributeSetId)
+    {
+        return $this->_collectionFactory->create()
+            ->setAttributeSetFilter($attributeSetId)
+            ->setSortOrder()
+            ->load();
+    }
+
     /**
      * @return $this
      */
@@ -134,16 +146,13 @@ class Tabs extends \Magento\Backend\Block\Widget\Tabs
         }
 
         if ($setId) {
-            $groupCollection = $this->_collectionFactory->create()->setAttributeSetFilter(
-                $setId
-            )->setSortOrder()->load();
-
             $tabAttributesBlock = $this->getLayout()->createBlock(
                 $this->getAttributeTabBlock(),
                 $this->getNameInLayout() . '_attributes_tab'
             );
             $advancedGroups = array();
-            foreach ($groupCollection as $group) {
+
+            foreach ($this->getGroupCollection($setId) as $group) {
                 /** @var $group \Magento\Eav\Model\Entity\Attribute\Group*/
                 $attributes = $product->getAttributes($group->getId(), true);
 
diff --git a/app/code/Magento/Catalog/Block/Product/AbstractProduct.php b/app/code/Magento/Catalog/Block/Product/AbstractProduct.php
index 0e5cc16085e42c14069940c8b1978f56ac90e0f4..d1a2a44fcf66eb53d33d1011cfbd66a7b1b6e7d4 100644
--- a/app/code/Magento/Catalog/Block/Product/AbstractProduct.php
+++ b/app/code/Magento/Catalog/Block/Product/AbstractProduct.php
@@ -244,36 +244,6 @@ abstract class AbstractProduct extends \Magento\Framework\View\Element\Template
         return $minSaleQty > 0 ? $minSaleQty : null;
     }
 
-    /**
-     * Returns product price block html
-     *
-     * @param \Magento\Catalog\Model\Product $product
-     * @param boolean $displayMinimalPrice
-     * @param string $idSuffix
-     * @return string
-     * @deprecated
-     */
-    public function getPriceHtml($product, $displayMinimalPrice = false, $idSuffix = '')
-    {
-        $typeId = $product->getTypeId();
-        if ($this->_catalogData->canApplyMsrp($product)) {
-            $realPriceHtml = $this->_preparePriceRenderer($typeId)
-                ->setProduct($product)
-                ->setDisplayMinimalPrice($displayMinimalPrice)
-                ->setIdSuffix($idSuffix)
-                ->toHtml();
-            $product->setAddToCartUrl($this->getAddToCartUrl($product));
-            $product->setRealPriceHtml($realPriceHtml);
-            $typeId = $this->_mapRenderer;
-        }
-
-        return $this->_preparePriceRenderer($typeId)
-            ->setProduct($product)
-            ->setDisplayMinimalPrice($displayMinimalPrice)
-            ->setIdSuffix($idSuffix)
-            ->toHtml();
-    }
-
     /**
      * Get product reviews summary
      *
diff --git a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper.php b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper.php
index e16c7a36c3bd545ff43b264389efb381a8cbd835..c6ef67d19479044ef5240b63b916a4b51b01141a 100644
--- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper.php
+++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Initialization/Helper.php
@@ -139,7 +139,12 @@ class Helper
          * Initialize product options
          */
         if (isset($productData['options']) && !$product->getOptionsReadonly()) {
-            $product->setProductOptions($productData['options']);
+            // mark custom options that should to fall back to default value
+            $options = $this->mergeProductOptions(
+                $productData['options'],
+                $this->request->getPost('options_use_default')
+            );
+            $product->setProductOptions($options);
         }
 
         $product->setCanSaveCustomOptions(
@@ -148,4 +153,30 @@ class Helper
 
         return $product;
     }
+
+    /**
+     * Merge product and default options for product
+     *
+     * @param array $productOptions product options
+     * @param array $overwriteOptions default value options
+     * @return array
+     */
+    public function mergeProductOptions($productOptions, $overwriteOptions)
+    {
+        if (!is_array($productOptions)) {
+            $productOptions = [];
+        }
+        if (is_array($overwriteOptions)) {
+            $options = array_replace_recursive($productOptions, $overwriteOptions);
+            array_walk_recursive($options, function (&$item) {
+                if ($item === "") {
+                    $item = null;
+                }
+            });
+        } else {
+            $options = $productOptions;
+        }
+
+        return $options;
+    }
 }
diff --git a/app/code/Magento/Catalog/Model/Product/Link.php b/app/code/Magento/Catalog/Model/Product/Link.php
index 447b1712261d6088843fb6c14b17fd9da55a3489..40955dc3b44b0c49d8113f53b547638a99a66998 100644
--- a/app/code/Magento/Catalog/Model/Product/Link.php
+++ b/app/code/Magento/Catalog/Model/Product/Link.php
@@ -51,7 +51,7 @@ class Link extends \Magento\Framework\Model\AbstractModel
     /**
      * @var mixed
      */
-    protected $_attributeCollection = null;
+    protected $_attributes = null;
 
     /**
      * Product collection factory
@@ -169,7 +169,11 @@ class Link extends \Magento\Framework\Model\AbstractModel
         if (is_null($type)) {
             $type = $this->getLinkTypeId();
         }
-        return $this->_getResource()->getAttributesByType($type);
+        if (!isset($this->_attributes[$type])) {
+            $this->_attributes[$type] = $this->_getResource()->getAttributesByType($type);
+        }
+
+        return $this->_attributes[$type];
     }
 
     /**
diff --git a/app/code/Magento/Catalog/Model/Product/Option/Validator/DefaultValidator.php b/app/code/Magento/Catalog/Model/Product/Option/Validator/DefaultValidator.php
index 6433e327fcb86af321f3be4baedd70ecc16b55ce..72067a2e19356d83c70ed9b346d1c8a70a29cf65 100644
--- a/app/code/Magento/Catalog/Model/Product/Option/Validator/DefaultValidator.php
+++ b/app/code/Magento/Catalog/Model/Product/Option/Validator/DefaultValidator.php
@@ -102,7 +102,33 @@ class DefaultValidator extends \Magento\Framework\Validator\AbstractValidator
      */
     protected function validateOptionRequiredFields(Option $option)
     {
-        return !$this->isEmpty($option->getTitle()) && !$this->isEmpty($option->getType());
+        $storeId = \Magento\Store\Model\Store::DEFAULT_STORE_ID;
+        $product = $option->getProduct();
+        if ($product) {
+            $storeId = $product->getStoreId();
+        }
+        $title = $option->getTitle();
+        return $this->isValidOptionTitle($title, $storeId) && !$this->isEmpty($option->getType());
+    }
+
+    /**
+     * Validate option title
+     *
+     * @param string $title
+     * @param int $storeId
+     * @return bool
+     */
+    protected function isValidOptionTitle($title, $storeId)
+    {
+        // we should be able to set null title for not default store (used for deletion from store view)
+        if ($storeId > \Magento\Store\Model\Store::DEFAULT_STORE_ID && $title === null) {
+            return true;
+        }
+        if ($this->isEmpty($title)) {
+            return false;
+        }
+
+        return true;
     }
 
     /**
diff --git a/app/code/Magento/Catalog/Model/Product/Option/Validator/Select.php b/app/code/Magento/Catalog/Model/Product/Option/Validator/Select.php
index 37a8dfc9ad0b815a3f6be371ed8b71c1c508e0f3..4ee412006c0a749866ab055444113ab5246c7560 100644
--- a/app/code/Magento/Catalog/Model/Product/Option/Validator/Select.php
+++ b/app/code/Magento/Catalog/Model/Product/Option/Validator/Select.php
@@ -62,14 +62,41 @@ class Select extends DefaultValidator
             return false;
         }
 
+        $storeId = \Magento\Store\Model\Store::DEFAULT_STORE_ID;
+        if ($option->getProduct()) {
+            $storeId = $option->getProduct()->getStoreId();
+        }
         foreach ($option->getData('values') as $value) {
-            $type = isset($value['price_type']) ? $value['price_type'] : '';
-            $price = isset($value['price']) ? $value['price'] : 0;
-            $title = isset($value['title']) ? $value['title'] : '';
-            if (!$this->isInRange($type, $this->priceTypes) || $this->isNegative($price) || $this->isEmpty($title)) {
+            $type = isset($value['price_type']) ? $value['price_type'] : null;
+            $price = isset($value['price']) ? $value['price'] : null;
+            $title = isset($value['title']) ? $value['title'] : null;
+            if (!$this->isValidOptionPrice($type, $price, $storeId)
+                || !$this->isValidOptionTitle($title, $storeId)
+            ) {
                 return false;
             }
         }
         return true;
     }
+
+    /**
+     * Validate option price
+     *
+     * @param string $priceType
+     * @param int $price
+     * @param int $storeId
+     * @return bool
+     */
+    protected function isValidOptionPrice($priceType, $price, $storeId)
+    {
+        // we should be able to remove website values for default store fallback
+        if ($storeId > \Magento\Store\Model\Store::DEFAULT_STORE_ID && $priceType === null && $price === null) {
+            return true;
+        }
+        if (!$this->isInRange($priceType, $this->priceTypes) || $this->isNegative($price)) {
+            return false;
+        }
+
+        return true;
+    }
 }
diff --git a/app/code/Magento/Catalog/Model/Resource/Product/Link/Product/Collection.php b/app/code/Magento/Catalog/Model/Resource/Product/Link/Product/Collection.php
index 6fa34b625770c3098dcbfd9ae580b9dbd4ced6c5..a23c57bfcd11a8e1a00ff4b6a2d4ef2f2ca95ce4 100644
--- a/app/code/Magento/Catalog/Model/Resource/Product/Link/Product/Collection.php
+++ b/app/code/Magento/Catalog/Model/Resource/Product/Link/Product/Collection.php
@@ -280,10 +280,8 @@ class Collection extends \Magento\Catalog\Model\Resource\Product\Collection
         if (!$this->getLinkModel()) {
             return $this;
         }
-        $attributes = $this->getLinkModel()->getAttributes();
 
-        $attributesByType = array();
-        foreach ($attributes as $attribute) {
+        foreach ($this->getLinkAttributes() as $attribute) {
             $table = $this->getLinkModel()->getAttributeTypeTable($attribute['type']);
             $alias = sprintf('link_attribute_%s_%s', $attribute['code'], $attribute['type']);
 
@@ -319,4 +317,34 @@ class Collection extends \Magento\Catalog\Model\Resource\Product\Collection
         }
         return parent::setOrder($attribute, $dir);
     }
+
+    /**
+     * Get attributes of specified link type
+     *
+     * @param int $type
+     * @return array
+     */
+    public function getLinkAttributes($type = null)
+    {
+        return $this->getLinkModel()->getAttributes($type);
+    }
+
+    /**
+     * Add link attribute to filter.
+     *
+     * @param string $code
+     * @param array $condition
+     * @return $this
+     */
+    public function addLinkAttributeToFilter($code, $condition)
+    {
+        foreach ($this->getLinkAttributes() as $attribute) {
+            if ($attribute['code'] == $code) {
+                $alias = sprintf('link_attribute_%s_%s', $code, $attribute['type']);
+                $whereCondition = $this->_getConditionSql($alias.'.`value`', $condition);
+                $this->getSelect()->where($whereCondition);
+            }
+        }
+        return $this;
+    }
 }
diff --git a/app/code/Magento/Catalog/Model/Resource/Product/Option.php b/app/code/Magento/Catalog/Model/Resource/Product/Option.php
index 60578fff48f9452844b2fe0484dfb2fa898ccf4c..a87e5e2bdf8a77e2bef95e8554a17525a9eaae18 100644
--- a/app/code/Magento/Catalog/Model/Resource/Product/Option.php
+++ b/app/code/Magento/Catalog/Model/Resource/Product/Option.php
@@ -252,95 +252,87 @@ class Option extends \Magento\Framework\Model\Resource\Db\AbstractDb
      */
     protected function _saveValueTitles(\Magento\Framework\Model\AbstractModel $object)
     {
-        $readAdapter = $this->_getReadAdapter();
         $writeAdapter = $this->_getWriteAdapter();
-        $titleTable = $this->getTable('catalog_product_option_title');
-
-        //title
-        if (!$object->getData('scope', 'title')) {
-            $statement = $readAdapter->select()->from(
-                $titleTable
-            )->where(
-                'option_id = ?',
-                $object->getId()
-            )->where(
-                'store_id  = ?',
+        $titleTableName = $this->getTable('catalog_product_option_title');
+        foreach ([\Magento\Store\Model\Store::DEFAULT_STORE_ID, $object->getStoreId()] as $storeId) {
+            $existInCurrentStore = $this->getColFromOptionTable($titleTableName, (int)$object->getId(), (int)$storeId);
+            $existInDefaultStore = $this->getColFromOptionTable(
+                $titleTableName,
+                (int)$object->getId(),
                 \Magento\Store\Model\Store::DEFAULT_STORE_ID
             );
-
-            if ($readAdapter->fetchOne($statement)) {
-                if ($object->getStoreId() == '0') {
-                    $data = $this->_prepareDataForTable(
-                        new \Magento\Framework\Object(array('title' => $object->getTitle())),
-                        $titleTable
-                    );
-
-                    $writeAdapter->update(
-                        $titleTable,
-                        $data,
+            if ($object->getTitle()) {
+                if ($existInCurrentStore) {
+                    if ($object->getStoreId() == $storeId) {
+                        $data = $this->_prepareDataForTable(
+                            new \Magento\Framework\Object(array('title' => $object->getTitle())),
+                            $titleTableName
+                        );
+                        $writeAdapter->update(
+                            $titleTableName,
+                            $data,
+                            array(
+                                'option_id = ?' => $object->getId(),
+                                'store_id  = ?' => $storeId,
+                            )
+                        );
+                    }
+                } else {
+                    // we should insert record into not default store only of if it does not exist in default store
+                    if (($storeId == \Magento\Store\Model\Store::DEFAULT_STORE_ID && !$existInDefaultStore)
+                        || ($storeId != \Magento\Store\Model\Store::DEFAULT_STORE_ID && !$existInCurrentStore)
+                    ) {
+                        $data = $this->_prepareDataForTable(
+                            new \Magento\Framework\Object(
+                                array(
+                                    'option_id' => $object->getId(),
+                                    'store_id' => $storeId,
+                                    'title' => $object->getTitle(),
+                                )
+                            ),
+                            $titleTableName
+                        );
+                        $writeAdapter->insert($titleTableName, $data);
+                    }
+                }
+            } else {
+                if ($object->getId() && $object->getStoreId() > \Magento\Store\Model\Store::DEFAULT_STORE_ID
+                    && $storeId
+                ) {
+                    $writeAdapter->delete(
+                        $titleTableName,
                         array(
                             'option_id = ?' => $object->getId(),
-                            'store_id  = ?' => \Magento\Store\Model\Store::DEFAULT_STORE_ID
+                            'store_id  = ?' => $object->getStoreId(),
                         )
                     );
                 }
-            } else {
-                $data = $this->_prepareDataForTable(
-                    new \Magento\Framework\Object(
-                        array(
-                            'option_id' => $object->getId(),
-                            'store_id' => \Magento\Store\Model\Store::DEFAULT_STORE_ID,
-                            'title' => $object->getTitle()
-                        )
-                    ),
-                    $titleTable
-                );
-
-                $writeAdapter->insert($titleTable, $data);
             }
         }
+    }
 
-        if ($object->getStoreId() != '0' && !$object->getData('scope', 'title')) {
-            $statement = $readAdapter->select()->from(
-                $titleTable
-            )->where(
-                'option_id = ?',
-                $object->getId()
-            )->where(
-                'store_id  = ?',
-                $object->getStoreId()
-            );
-
-            if ($readAdapter->fetchOne($statement)) {
-                $data = $this->_prepareDataForTable(
-                    new \Magento\Framework\Object(array('title' => $object->getTitle())),
-                    $titleTable
-                );
+    /**
+     * Get first col from from first row for option table
+     *
+     * @param string $tableName
+     * @param int $optionId
+     * @param int $storeId
+     * @return string
+     */
+    protected function getColFromOptionTable($tableName, $optionId, $storeId)
+    {
+        $readAdapter = $this->_getReadAdapter();
+        $statement = $readAdapter->select()->from(
+            $tableName
+        )->where(
+            'option_id = ?',
+            $optionId
+        )->where(
+            'store_id  = ?',
+            $storeId
+        );
 
-                $writeAdapter->update(
-                    $titleTable,
-                    $data,
-                    array('option_id = ?' => $object->getId(), 'store_id  = ?' => $object->getStoreId())
-                );
-            } else {
-                $data = $this->_prepareDataForTable(
-                    new \Magento\Framework\Object(
-                        array(
-                            'option_id' => $object->getId(),
-                            'store_id' => $object->getStoreId(),
-                            'title' => $object->getTitle()
-                        )
-                    ),
-                    $titleTable
-                );
-                $writeAdapter->insert($titleTable, $data);
-            }
-        } elseif ($object->getData('scope', 'title')) {
-            $writeAdapter->delete(
-                $titleTable,
-                array('option_id = ?' => $object->getId(), 'store_id  = ?' => $object->getStoreId())
-            );
-        }
+        return $readAdapter->fetchOne($statement);
     }
 
     /**
diff --git a/app/code/Magento/Catalog/Model/Resource/Product/Option/Value.php b/app/code/Magento/Catalog/Model/Resource/Product/Option/Value.php
index 8cbe4443b0ac2d94d979a7925b518d1f9242482d..741aa4c7c3ea1b065e341f5664495b0199efc65c 100644
--- a/app/code/Magento/Catalog/Model/Resource/Product/Option/Value.php
+++ b/app/code/Magento/Catalog/Model/Resource/Product/Option/Value.php
@@ -109,7 +109,7 @@ class Value extends \Magento\Framework\Model\Resource\Db\AbstractDb
         $price = (double)sprintf('%F', $object->getPrice());
         $priceType = $object->getPriceType();
 
-        if (!$object->getData('scope', 'price')) {
+        if ($object->getPrice() && $priceType) {
             //save for store_id = 0
             $select = $this->_getReadAdapter()->select()->from(
                 $priceTable,
@@ -149,7 +149,11 @@ class Value extends \Magento\Framework\Model\Resource\Db\AbstractDb
             \Magento\Store\Model\ScopeInterface::SCOPE_STORE
         );
 
-        if ($object->getStoreId() != '0' && $scope == \Magento\Store\Model\Store::PRICE_SCOPE_WEBSITE) {
+        if ($scope == \Magento\Store\Model\Store::PRICE_SCOPE_WEBSITE
+            && $priceType
+            && $object->getPrice()
+            && $object->getStoreId() != \Magento\Store\Model\Store::DEFAULT_STORE_ID
+        ) {
 
             $baseCurrency = $this->_config->getValue(
                 \Magento\Directory\Model\Currency::XML_PATH_CURRENCY_BASE,
@@ -203,12 +207,18 @@ class Value extends \Magento\Framework\Model\Resource\Db\AbstractDb
                 }
             }
         } else {
-            if ($scope == \Magento\Store\Model\Store::PRICE_SCOPE_WEBSITE && $object->getData('scope', 'price')) {
-                $where = array(
-                    'option_type_id = ?' => (int)$object->getId(),
-                    'store_id = ?' => (int)$object->getStoreId()
-                );
-                $this->_getWriteAdapter()->delete($priceTable, $where);
+            if ($scope == \Magento\Store\Model\Store::PRICE_SCOPE_WEBSITE
+                && !$object->getPrice()
+                && !$priceType
+            ) {
+                $storeIds = $this->_storeManager->getStore($object->getStoreId())->getWebsite()->getStoreIds();
+                foreach ($storeIds as $storeId) {
+                    $where = array(
+                        'option_type_id = ?' => (int)$object->getId(),
+                        'store_id = ?' => $storeId,
+                    );
+                    $this->_getWriteAdapter()->delete($priceTable, $where);
+                }
             }
         }
     }
@@ -221,9 +231,8 @@ class Value extends \Magento\Framework\Model\Resource\Db\AbstractDb
      */
     protected function _saveValueTitles(\Magento\Framework\Model\AbstractModel $object)
     {
-        $titleTable = $this->getTable('catalog_product_option_type_title');
-
-        if (!$object->getData('scope', 'title')) {
+        foreach ([\Magento\Store\Model\Store::DEFAULT_STORE_ID, $object->getStoreId()] as $storeId) {
+            $titleTable = $this->getTable('catalog_product_option_type_title');
             $select = $this->_getReadAdapter()->select()->from(
                 $titleTable,
                 array('option_type_id')
@@ -232,69 +241,78 @@ class Value extends \Magento\Framework\Model\Resource\Db\AbstractDb
                 (int)$object->getId()
             )->where(
                 'store_id = ?',
-                \Magento\Store\Model\Store::DEFAULT_STORE_ID
+                (int)$storeId
             );
             $optionTypeId = $this->_getReadAdapter()->fetchOne($select);
-
-            if ($optionTypeId) {
-                if ($object->getStoreId() == '0') {
+            $existInCurrentStore = $this->getOptionIdFromOptionTable($titleTable, (int)$object->getId(), (int)$storeId);
+            if ($object->getTitle()) {
+                if ($existInCurrentStore) {
+                    if ($storeId == $object->getStoreId()) {
+                        $where = array(
+                            'option_type_id = ?' => (int)$optionTypeId,
+                            'store_id = ?' => $storeId,
+                        );
+                        $bind = array('title' => $object->getTitle());
+                        $this->_getWriteAdapter()->update($titleTable, $bind, $where);
+                    }
+                } else {
+                    $existInDefaultStore = $this->getOptionIdFromOptionTable(
+                        $titleTable,
+                        (int)$object->getId(),
+                        \Magento\Store\Model\Store::DEFAULT_STORE_ID
+                    );
+                    // we should insert record into not default store only of if it does not exist in default store
+                    if (($storeId == \Magento\Store\Model\Store::DEFAULT_STORE_ID && !$existInDefaultStore)
+                        || ($storeId != \Magento\Store\Model\Store::DEFAULT_STORE_ID && !$existInCurrentStore)
+                    ) {
+                        $bind = array(
+                            'option_type_id' => (int)$object->getId(),
+                            'store_id' => $storeId,
+                            'title' => $object->getTitle()
+                        );
+                        $this->_getWriteAdapter()->insert($titleTable, $bind);
+                    }
+                }
+            } else {
+                if ($storeId
+                    && $optionTypeId
+                    && $object->getStoreId() > \Magento\Store\Model\Store::DEFAULT_STORE_ID
+                ) {
                     $where = array(
                         'option_type_id = ?' => (int)$optionTypeId,
-                        'store_id = ?' => \Magento\Store\Model\Store::DEFAULT_STORE_ID
+                        'store_id = ?' => $storeId,
                     );
-                    $bind = array('title' => $object->getTitle());
-                    $bind = array('title' => $object->getTitle());
-                    $this->_getWriteAdapter()->update($titleTable, $bind, $where);
+                    $this->_getWriteAdapter()->delete($titleTable, $where);
                 }
-            } else {
-                $bind = array(
-                    'option_type_id' => (int)$object->getId(),
-                    'store_id' => \Magento\Store\Model\Store::DEFAULT_STORE_ID,
-                    'title' => $object->getTitle()
-                );
-                $this->_getWriteAdapter()->insert($titleTable, $bind);
             }
         }
+    }
 
-        if ($object->getStoreId() != '0' && !$object->getData('scope', 'title')) {
-            $select = $this->_getReadAdapter()->select()->from(
-                $titleTable,
-                array('option_type_id')
-            )->where(
-                'option_type_id = ?',
-                (int)$object->getId()
-            )->where(
-                'store_id = ?',
-                (int)$object->getStoreId()
-            );
-            $optionTypeId = $this->_getReadAdapter()->fetchOne($select);
-
-            if ($optionTypeId) {
-                $bind = array('title' => $object->getTitle());
-                $where = array(
-                    'option_type_id = ?' => (int)$optionTypeId,
-                    'store_id = ?' => (int)$object->getStoreId()
-                );
-                $this->_getWriteAdapter()->update($titleTable, $bind, $where);
-            } else {
-                $bind = array(
-                    'option_type_id' => (int)$object->getId(),
-                    'store_id' => (int)$object->getStoreId(),
-                    'title' => $object->getTitle()
-                );
-                $this->_getWriteAdapter()->insert($titleTable, $bind);
-            }
-        } else {
-            if ($object->getData('scope', 'title')) {
-                $where = array(
-                    'option_type_id = ?' => (int)$object->getId(),
-                    'store_id = ?' => (int)$object->getStoreId()
-                );
-                $this->_getWriteAdapter()->delete($titleTable, $where);
-            }
-        }
+    /**
+     * Get first col from from first row for option table
+     *
+     * @param string $tableName
+     * @param int $optionId
+     * @param int $storeId
+     * @return string
+     */
+    protected function getOptionIdFromOptionTable($tableName, $optionId, $storeId)
+    {
+        $readAdapter = $this->_getReadAdapter();
+        $select = $readAdapter->select()->from(
+            $tableName,
+            array('option_type_id')
+        )->where(
+            'option_type_id = ?',
+            $optionId
+        )->where(
+            'store_id = ?',
+            (int)$storeId
+        );
+        return $readAdapter->fetchOne($select);
     }
 
+
     /**
      * Delete values by option id
      *
diff --git a/app/code/Magento/Catalog/Service/V1/Category/ProductLinks/ReadService.php b/app/code/Magento/Catalog/Service/V1/Category/ProductLinks/ReadService.php
index 6b8b1d3fa5a5eb1d084ea7b479c9a0d5236e7a27..15a67d8eac56cba8719099cdf265ba753d1f3f0d 100644
--- a/app/code/Magento/Catalog/Service/V1/Category/ProductLinks/ReadService.php
+++ b/app/code/Magento/Catalog/Service/V1/Category/ProductLinks/ReadService.php
@@ -26,9 +26,8 @@ namespace Magento\Catalog\Service\V1\Category\ProductLinks;
 use Magento\Catalog\Model\Category as CategoryModel;
 use Magento\Catalog\Model\CategoryFactory;
 use Magento\Catalog\Service\V1\Data\Category;
-use Magento\Catalog\Service\V1\Data\Eav\Category\ProductConverterFactory;
-use Magento\Catalog\Service\V1\Data\Eav\Category\ProductLink;
-use Magento\Catalog\Service\V1\Data\Eav\Category\ProductLinkBuilder;
+use Magento\Catalog\Service\V1\Data\Category\ProductLink;
+use Magento\Catalog\Service\V1\Data\Category\ProductLinkBuilder;
 use Magento\Framework\App\ObjectManager;
 use Magento\Framework\Exception\NoSuchEntityException;
 
diff --git a/app/code/Magento/Catalog/Service/V1/Category/ProductLinks/ReadServiceInterface.php b/app/code/Magento/Catalog/Service/V1/Category/ProductLinks/ReadServiceInterface.php
index 597d54019382dca8d71701a1f9025f32411f8672..2d9601c55df9c6aac88e5b2b087996950ffd013b 100644
--- a/app/code/Magento/Catalog/Service/V1/Category/ProductLinks/ReadServiceInterface.php
+++ b/app/code/Magento/Catalog/Service/V1/Category/ProductLinks/ReadServiceInterface.php
@@ -27,7 +27,7 @@ interface ReadServiceInterface
 {
     /**
      * @param int $categoryId
-     * @return \Magento\Catalog\Service\V1\Data\Eav\Category\ProductLink[]
+     * @return \Magento\Catalog\Service\V1\Data\Category\ProductLink[]
      * @throws \Magento\Framework\Exception\NoSuchEntityException
      */
     public function assignedProducts($categoryId);
diff --git a/app/code/Magento/Catalog/Service/V1/Category/ProductLinks/WriteService.php b/app/code/Magento/Catalog/Service/V1/Category/ProductLinks/WriteService.php
index b52114a39f18e6996091d426bdd604448825744a..082b927dd1099112feab7911e5ca1ebf955c8542 100644
--- a/app/code/Magento/Catalog/Service/V1/Category/ProductLinks/WriteService.php
+++ b/app/code/Magento/Catalog/Service/V1/Category/ProductLinks/WriteService.php
@@ -29,7 +29,7 @@ use Magento\Catalog\Model\Product as ProductModel;
 use Magento\Catalog\Model\ProductFactory;
 use Magento\Catalog\Service\V1\Category\CategoryLoaderFactory;
 use Magento\Catalog\Service\V1\Data\Category;
-use Magento\Catalog\Service\V1\Data\Eav\Category\ProductLink;
+use Magento\Catalog\Service\V1\Data\Category\ProductLink;
 use Magento\Framework\Exception\CouldNotSaveException;
 use Magento\Framework\Exception\StateException;
 
diff --git a/app/code/Magento/Catalog/Service/V1/Category/ProductLinks/WriteServiceInterface.php b/app/code/Magento/Catalog/Service/V1/Category/ProductLinks/WriteServiceInterface.php
index cd0c22d8e44aa04ebdab239e9832554cb6b4fee8..bcf6f7525040434b13a38c95e4933be979f48c6e 100644
--- a/app/code/Magento/Catalog/Service/V1/Category/ProductLinks/WriteServiceInterface.php
+++ b/app/code/Magento/Catalog/Service/V1/Category/ProductLinks/WriteServiceInterface.php
@@ -23,7 +23,7 @@
  */
 namespace Magento\Catalog\Service\V1\Category\ProductLinks;
 
-use Magento\Catalog\Service\V1\Data\Eav\Category\ProductLink;
+use Magento\Catalog\Service\V1\Data\Category\ProductLink;
 
 interface WriteServiceInterface
 {
@@ -31,7 +31,7 @@ interface WriteServiceInterface
      * Assign a product to the required category
      *
      * @param int $categoryId
-     * @param \Magento\Catalog\Service\V1\Data\Eav\Category\ProductLink $productLink
+     * @param \Magento\Catalog\Service\V1\Data\Category\ProductLink $productLink
      * @return bool Will returned True if assigned
      * @throws \Magento\Framework\Exception\CouldNotSaveException
      * @throws \Magento\Framework\Exception\NoSuchEntityException
@@ -41,7 +41,7 @@ interface WriteServiceInterface
 
     /**
      * @param int $categoryId
-     * @param \Magento\Catalog\Service\V1\Data\Eav\Category\ProductLink $productLink
+     * @param \Magento\Catalog\Service\V1\Data\Category\ProductLink $productLink
      * @return bool Will returned True if updated
      * @throws \Magento\Framework\Exception\CouldNotSaveException
      * @throws \Magento\Framework\Exception\NoSuchEntityException
diff --git a/app/code/Magento/Catalog/Service/V1/Category/WriteService.php b/app/code/Magento/Catalog/Service/V1/Category/WriteService.php
index 8936631404a7d6b95f6882ab558969d6f83cb08e..8e0a607ff18689353e5051ed11393234ca12dcd0 100644
--- a/app/code/Magento/Catalog/Service/V1/Category/WriteService.php
+++ b/app/code/Magento/Catalog/Service/V1/Category/WriteService.php
@@ -27,7 +27,9 @@ use Magento\Catalog\Model\Category;
 use Magento\Catalog\Model\CategoryFactory;
 use Magento\Catalog\Service\V1\Data\Category as CategoryDataObject;
 use Magento\Framework\Exception\CouldNotSaveException;
+use Magento\Framework\Exception\InputException;
 use Magento\Framework\Exception\NoSuchEntityException;
+use Magento\Framework\Exception\StateException;
 use Magento\Catalog\Service\V1\Data\Category\Mapper as CategoryMapper;
 use Magento\Store\Model\StoreManagerInterface;
 
@@ -94,13 +96,16 @@ class WriteService implements WriteServiceInterface
      */
     public function delete($categoryId)
     {
+        if (\Magento\Catalog\Model\Category::TREE_ROOT_ID == $categoryId) {
+            throw new InputException('Cannot remove the system category.');
+        }
         /** @var Category $category */
         $category = $this->loadCategory($categoryId);
 
         try {
             $category->delete();
         } catch (\Exception $e) {
-            throw new CouldNotSaveException('Cannot delete category with id %1', [$categoryId], $e);
+            throw new StateException('Cannot delete category with id %1', [$categoryId], $e);
         }
 
         return true;
@@ -131,10 +136,11 @@ class WriteService implements WriteServiceInterface
         $model = $this->loadCategory($categoryId);
         $parentCategory = $this->loadCategory($parentId);
 
-        if (is_null($afterId) && $parentCategory->hasChildren()) {
+        if ($parentCategory->hasChildren()) {
             $parentChildren = $parentCategory->getChildren();
             $categoryIds = explode(',', $parentChildren);
-            $afterId = array_pop($categoryIds);
+            $lastId = array_pop($categoryIds);
+            $afterId = (is_null($afterId) || $afterId > $lastId) ? $lastId : $afterId;
         }
 
         if (strpos($parentCategory->getPath(), $model->getPath()) === 0) {
diff --git a/app/code/Magento/Catalog/Service/V1/Category/WriteServiceInterface.php b/app/code/Magento/Catalog/Service/V1/Category/WriteServiceInterface.php
index 29a6ec664644130bf00354182fcc5c04d591f0d9..46d46f87299572e1c346cf82882f7374188466af 100644
--- a/app/code/Magento/Catalog/Service/V1/Category/WriteServiceInterface.php
+++ b/app/code/Magento/Catalog/Service/V1/Category/WriteServiceInterface.php
@@ -39,7 +39,8 @@ interface WriteServiceInterface
      *
      * @param int $categoryId category which will deleted
      * @return bool Will returned True if deleted
-     * @throws \Magento\Framework\Exception\CouldNotSaveException
+     * @throws \Magento\Framework\Exception\InputException
+     * @throws \Magento\Framework\Exception\StateException
      * @throws \Magento\Framework\Exception\NoSuchEntityException
      */
     public function delete($categoryId);
diff --git a/app/code/Magento/Catalog/Service/V1/Data/Eav/Category/ProductLink.php b/app/code/Magento/Catalog/Service/V1/Data/Category/ProductLink.php
similarity index 96%
rename from app/code/Magento/Catalog/Service/V1/Data/Eav/Category/ProductLink.php
rename to app/code/Magento/Catalog/Service/V1/Data/Category/ProductLink.php
index fe5a6a1976bcdc59fb17da9d144630dded3c8ec4..8383aa9a983ae10b32e708797b6110a9e90134ab 100644
--- a/app/code/Magento/Catalog/Service/V1/Data/Eav/Category/ProductLink.php
+++ b/app/code/Magento/Catalog/Service/V1/Data/Category/ProductLink.php
@@ -21,7 +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\Catalog\Service\V1\Data\Eav\Category;
+namespace Magento\Catalog\Service\V1\Data\Category;
 
 /**
  * @codeCoverageIgnore
diff --git a/app/code/Magento/Catalog/Service/V1/Data/Eav/Category/ProductLinkBuilder.php b/app/code/Magento/Catalog/Service/V1/Data/Category/ProductLinkBuilder.php
similarity index 96%
rename from app/code/Magento/Catalog/Service/V1/Data/Eav/Category/ProductLinkBuilder.php
rename to app/code/Magento/Catalog/Service/V1/Data/Category/ProductLinkBuilder.php
index 7b0a76b7e1095044b6922960af2b108b1cea1311..6f00b75e6869e22123fbc3875c5f112fb0efa01d 100644
--- a/app/code/Magento/Catalog/Service/V1/Data/Eav/Category/ProductLinkBuilder.php
+++ b/app/code/Magento/Catalog/Service/V1/Data/Category/ProductLinkBuilder.php
@@ -21,7 +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\Catalog\Service\V1\Data\Eav\Category;
+namespace Magento\Catalog\Service\V1\Data\Category;
 
 /**
  * @codeCoverageIgnore
diff --git a/app/code/Magento/Catalog/Service/V1/Data/Category/Tree.php b/app/code/Magento/Catalog/Service/V1/Data/Category/Tree.php
index 33bf85cbaa6d479554948d4f50aa69ee01ad5dc1..e0eb7642466796bea9cd5c4532f79f1add38f0ad 100644
--- a/app/code/Magento/Catalog/Service/V1/Data/Category/Tree.php
+++ b/app/code/Magento/Catalog/Service/V1/Data/Category/Tree.php
@@ -136,6 +136,7 @@ class Tree
             ->setPosition($node->getPosition())
             ->setLevel($node->getLevel())
             ->setActive($node->getIsActive())
+            ->setProductCount($node->getProductCount())
             ->setChildren([]);
 
         if ($node->hasChildren()) {
diff --git a/app/code/Magento/Catalog/Service/V1/Data/Eav/Category/Tree.php b/app/code/Magento/Catalog/Service/V1/Data/Eav/Category/Tree.php
index 1b77875b87cb36c4e24be8b86a1e9bbdd3170e32..087b9798c7fb72374eb0accc49763c54ead92499 100644
--- a/app/code/Magento/Catalog/Service/V1/Data/Eav/Category/Tree.php
+++ b/app/code/Magento/Catalog/Service/V1/Data/Eav/Category/Tree.php
@@ -32,6 +32,7 @@ class Tree extends \Magento\Framework\Service\Data\AbstractObject
     const POSITION = 'position';
     const LEVEL = 'level';
     const CHILDREN = 'children';
+    const PRODUCT_COUNT = 'product_count';
 
     /**
      * Get category ID
@@ -93,6 +94,16 @@ class Tree extends \Magento\Framework\Service\Data\AbstractObject
         return $this->_get(self::LEVEL);
     }
 
+    /**
+     * Get product count
+     *
+     * @return int
+     */
+    public function getProductCount()
+    {
+        return $this->_get(self::PRODUCT_COUNT);
+    }
+
     /**
      * Get category level
      *
diff --git a/app/code/Magento/Catalog/Service/V1/Data/Eav/Category/TreeBuilder.php b/app/code/Magento/Catalog/Service/V1/Data/Eav/Category/TreeBuilder.php
index b2250ff04e57d22c23cb06b55307f604b213019e..f46ca55aaddcf7b06f5893365e0df2ed7840d8d5 100644
--- a/app/code/Magento/Catalog/Service/V1/Data/Eav/Category/TreeBuilder.php
+++ b/app/code/Magento/Catalog/Service/V1/Data/Eav/Category/TreeBuilder.php
@@ -82,6 +82,17 @@ class TreeBuilder extends AbstractObjectBuilder
         return $this->_set(Tree::POSITION, $position);
     }
 
+    /**
+     * Set product count
+     *
+     * @param int $productCount
+     * @return int
+     */
+    public function setProductCount($productCount)
+    {
+        return $this->_set(Tree::PRODUCT_COUNT, $productCount);
+    }
+
     /**
      * Set category level
      *
diff --git a/app/code/Magento/Catalog/composer.json b/app/code/Magento/Catalog/composer.json
index ff3ef067362d93006a87b9a450538f5885d8634b..76630102310a3ec8463117dc6b70a9134239c2f3 100644
--- a/app/code/Magento/Catalog/composer.json
+++ b/app/code/Magento/Catalog/composer.json
@@ -2,35 +2,35 @@
     "name": "magento/module-catalog",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/module-cms": "0.1.0-alpha89",
-        "magento/module-index": "0.1.0-alpha89",
-        "magento/module-indexer": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/module-checkout": "0.1.0-alpha89",
-        "magento/module-log": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-widget": "0.1.0-alpha89",
-        "magento/module-wishlist": "0.1.0-alpha89",
-        "magento/module-tax": "0.1.0-alpha89",
-        "magento/module-bundle": "0.1.0-alpha89",
-        "magento/module-catalog-inventory": "0.1.0-alpha89",
-        "magento/module-directory": "0.1.0-alpha89",
-        "magento/module-catalog-rule": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-catalog-search": "0.1.0-alpha89",
-        "magento/module-weee": "0.1.0-alpha89",
-        "magento/module-product-alert": "0.1.0-alpha89",
-        "magento/module-url-rewrite": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/module-cms": "0.1.0-alpha90",
+        "magento/module-index": "0.1.0-alpha90",
+        "magento/module-indexer": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/module-checkout": "0.1.0-alpha90",
+        "magento/module-log": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-widget": "0.1.0-alpha90",
+        "magento/module-wishlist": "0.1.0-alpha90",
+        "magento/module-tax": "0.1.0-alpha90",
+        "magento/module-bundle": "0.1.0-alpha90",
+        "magento/module-catalog-inventory": "0.1.0-alpha90",
+        "magento/module-directory": "0.1.0-alpha90",
+        "magento/module-catalog-rule": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-catalog-search": "0.1.0-alpha90",
+        "magento/module-weee": "0.1.0-alpha90",
+        "magento/module-product-alert": "0.1.0-alpha90",
+        "magento/module-url-rewrite": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Catalog/etc/adminhtml/acl.xml b/app/code/Magento/Catalog/etc/acl.xml
similarity index 96%
rename from app/code/Magento/Catalog/etc/adminhtml/acl.xml
rename to app/code/Magento/Catalog/etc/acl.xml
index ca0bad3473dc208cefca91b11dd0cd95bc5e9590..d7e160064098799284b57ddf4b1bb2439dcda165 100644
--- a/app/code/Magento/Catalog/etc/adminhtml/acl.xml
+++ b/app/code/Magento/Catalog/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/options/option.phtml b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/options/option.phtml
index 96c4185e5a750b117e720398ea7fc90240b78b8f..15128975a4c51288c5e7ed3ef9233af50e09d770 100644
--- a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/options/option.phtml
+++ b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/options/option.phtml
@@ -58,7 +58,9 @@
                                    class="required-entry input-text"
                                    type="text"
                                    value="${title}"
-                                   data-store-label="${title}">
+                                   data-store-label="${title}"
+                                   {{if typeof(scopeTitleDisabled) != 'undefined' && scopeTitleDisabled != null}} disabled="disabled" {{/if}}
+                                   >
                             {{html checkboxScopeTitle}}
                         </div>
                     </div>
@@ -83,7 +85,7 @@
                     </div>
                 </fieldset>
             </fieldset>
-        </div>    
+        </div>
     </div>
 </script>
 
diff --git a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/options/type/select.phtml b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/options/type/select.phtml
index 732dc463639044fe994cc330ed1fcf487177497f..ea85c37c21b576621e3e9519b739818004cfd6b4 100644
--- a/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/options/type/select.phtml
+++ b/app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/options/type/select.phtml
@@ -59,11 +59,12 @@
         <td class="col-name select-opt-title">
             <input name="product[options][${id}][values][${select_id}][option_type_id]" type="hidden" value="${option_type_id}">
             <input id="product_option_${id}_select_${select_id}_is_delete" name="product[options][${id}][values][${select_id}][is_delete]" type="hidden" value="">
-            <input id="product_option_${id}_select_${select_id}_title" name="product[options][${id}][values][${select_id}][title]" class="required-entry input-text select-type-title" type="text" value="${title}" data-store-label="${title}">{{html checkboxScopeTitle}}
+            <input id="product_option_${id}_select_${select_id}_title" {{if typeof(scopeTitleDisabled) != 'undefined' && scopeTitleDisabled != null}} disabled="disabled" {{/if}} name="product[options][${id}][values][${select_id}][title]" class="required-entry input-text select-type-title {{if typeof(scopeTitleDisabled) != 'undefined' && scopeTitleDisabled != null}} disabled {{/if}}" type="text" value="${title}" data-store-label="${title}">{{html checkboxScopeTitle}}
         </td>
         <?php if ($this->getCanReadPrice() !== false) : ?>
         <td class="col-price select-opt-price">
             <input id="product_option_${id}_select_${select_id}_price"
+                   {{if typeof(scopePriceDisabled) != 'undefined' && scopePriceDisabled != null}} disabled="disabled" {{/if}}
                    name="product[options][${id}][values][${select_id}][price]"
                    class="input-text validate-number product-option-price"
                    type="text" value="${price}" data-store-label="${price}"
@@ -71,7 +72,7 @@
                    disabled="disabled"
                 <?php endif; ?>>
         </td>
-        <td class="col-price-type select-opt-price-type"><?php echo $this->getPriceTypeSelectHtml() ?>{{html checkboxScopePrice}}</td>
+        <td class="col-price-type select-opt-price-type"><?php echo $this->getPriceTypeSelectHtml('{{if typeof(scopePriceDisabled) != "undefined" && scopePriceDisabled != null}} disabled="disabled" {{/if}}') ?>{{html checkboxScopePrice}}</td>
         <?php else : ?>
         <input id="product_option_${id}_select_${select_id}_price" name="product[options][${id}][values][${select_id}][price]" type="hidden">
         <input id="product_option_${id}_select_${select_id}_price_type" name="product[options][${id}][values][${select_id}][price_type]" type="hidden">
diff --git a/app/code/Magento/Catalog/view/frontend/templates/product/compare/list.phtml b/app/code/Magento/Catalog/view/frontend/templates/product/compare/list.phtml
index e3692359697b63390f34e3e3e0deaa05de0d6c05..8aef6a6e4b96394e4061b07f9b15ec868c9c389b 100644
--- a/app/code/Magento/Catalog/view/frontend/templates/product/compare/list.phtml
+++ b/app/code/Magento/Catalog/view/frontend/templates/product/compare/list.phtml
@@ -30,7 +30,7 @@
     </a>
     <?php $imageBlock =  $this->getLayout()->createBlock('Magento\Catalog\Block\Product\Image'); ?>
         <div class="table-wrapper comparison">
-            <table class="data-table data table comparison" id="product-comparison"
+            <table class="data table table-comparison" id="product-comparison"
                 data-mage-init='{"compareList":{
                     "windowPrintSelector":".action.print",
                     "productsInRow":"5",
@@ -65,19 +65,19 @@
                             <th scope="row" class="cell label product"><span><?php echo __('Product') ?></span></th>
                         <?php endif; ?>
                         <td class="cell product info">
-                            <a class="product photo" href="<?php echo $this->getProductUrl($_item) ?>" title="<?php echo $this->stripTags($_item->getName(), null, true) ?>">
+                            <a class="product-item-photo" href="<?php echo $this->getProductUrl($_item) ?>" title="<?php echo $this->stripTags($_item->getName(), null, true) ?>">
                                 <?php /* product_comparison_list */ ?>
                                 <?php echo $imageBlock->init($_item, 'product_comparison_list')->toHtml() ?>
                             </a>
-                            <strong class="product name">
+                            <strong class="product-item-name">
                                 <a href="<?php echo $this->getProductUrl($_item) ?>" title="<?php echo $this->stripTags($_item->getName(), null, true) ?>">
                                     <?php echo $_helper->productAttribute($_item, $_item->getName(), 'name') ?>
                                 </a>
                             </strong>
                             <?php echo $this->getReviewsSummaryHtml($_item, 'short') ?>
                             <?php echo $this->getProductPrice($_item, '-compare-list-top') ?>
-                            <div class="product actions">
-                                <div class="primary">
+                            <div class="product-item-actions">
+                                <div class="actions-primary">
                                     <?php if($_item->isSaleable()): ?>
                                         <button type="button" class="action tocart primary"
                                                 data-url="<?php echo $this->helper('Magento\Catalog\Helper\Product\Compare')->getAddToCartUrl($_item) ?>">
@@ -92,7 +92,7 @@
                                     <?php endif; ?>
                                 </div>
                                 <?php if ($this->helper('Magento\Wishlist\Helper\Data')->isAllow()) : ?>
-                                    <div class="secondary-addto-links" data-role="add-to-links">
+                                    <div class="secondary-addto-links actions-secondary" data-role="add-to-links">
                                         <a href="#" data-post='<?php echo $this->getAddToWishlistParams($_item); ?>' class="action towishlist" data-action="add-to-wishlist">
                                             <span><?php echo __('Add to Wishlist') ?></span>
                                         </a>
diff --git a/app/code/Magento/Catalog/view/frontend/templates/product/list/toolbar.phtml b/app/code/Magento/Catalog/view/frontend/templates/product/list/toolbar.phtml
index 85a7526d9620991f2b84ed50b25d7988b990e85f..1c1b3024f7df83ee5a7110c289487ff2e1cfee9d 100644
--- a/app/code/Magento/Catalog/view/frontend/templates/product/list/toolbar.phtml
+++ b/app/code/Magento/Catalog/view/frontend/templates/product/list/toolbar.phtml
@@ -31,17 +31,19 @@
 use \Magento\Catalog\Model\Product\ProductList\Toolbar;
 ?>
 <?php if ($this->getCollection()->getSize()): ?>
-<div class="toolbar products" data-mage-init='<?php echo $this->getWidgetOptionsJson(); ?>'>
-    <?php if ($this->isExpanded()): ?>
-    <div class="settings">
-        <?php include($this->getTemplateFile('Magento_Catalog::product/list/toolbar/viewmode.phtml')) ?>
-        <?php include($this->getTemplateFile('Magento_Catalog::product/list/toolbar/sorter.phtml')) ?>
-    </div>
-    <?php endif; ?>
-    <?php echo $this->getPagerHtml() ?>
-    <div class="pager">
+    <div class="toolbar toolbar-products" data-mage-init='<?php echo $this->getWidgetOptionsJson(); ?>'>
+        <?php if ($this->isExpanded()): ?>
+            <?php include($this->getTemplateFile('Magento_Catalog::product/list/toolbar/viewmode.phtml')) ?>
+        <?php endif; ?>
+
         <?php include($this->getTemplateFile('Magento_Catalog::product/list/toolbar/amount.phtml')) ?>
+
+        <?php echo $this->getPagerHtml() ?>
+
         <?php include($this->getTemplateFile('Magento_Catalog::product/list/toolbar/limiter.phtml')) ?>
+
+        <?php if ($this->isExpanded()): ?>
+            <?php include($this->getTemplateFile('Magento_Catalog::product/list/toolbar/sorter.phtml')) ?>
+        <?php endif; ?>
     </div>
-</div>
 <?php endif ?>
diff --git a/app/code/Magento/Catalog/view/frontend/templates/product/listing.phtml b/app/code/Magento/Catalog/view/frontend/templates/product/listing.phtml
index ca2bf99f653831a5be0150a3f09146da2dd37465..8f583b7c97e5d33f69feb156e1fdd07f1cb4cf7d 100644
--- a/app/code/Magento/Catalog/view/frontend/templates/product/listing.phtml
+++ b/app/code/Magento/Catalog/view/frontend/templates/product/listing.phtml
@@ -72,7 +72,7 @@ $imageBlock =  $this->getLayout()->createBlock('Magento\Catalog\Block\Product\Im
                                     . $this->stripTags($_product->getName(), null, true) . '">'
                                     . $_helper->productAttribute($_product, $_product->getName(), 'name')
                                     . '</a></strong>';
-                    $info['price'] = $this->getPriceHtml($_product, true);
+                    $info['price'] = $this->getProductPrice($_product);
                     $info['review'] = $this->getReviewsSummaryHtml($_product, $templateType);
 
                     if ($_product->isSaleable()) {
diff --git a/app/code/Magento/Catalog/view/frontend/templates/product/view/details.phtml b/app/code/Magento/Catalog/view/frontend/templates/product/view/details.phtml
index a7f8a836a7be2ebe169b5bf411b835b0a41902ad..1db4a503d3fd4f90dc4e7270494e9c8f352da851 100644
--- a/app/code/Magento/Catalog/view/frontend/templates/product/view/details.phtml
+++ b/app/code/Magento/Catalog/view/frontend/templates/product/view/details.phtml
@@ -36,6 +36,6 @@
                 <div class="data item title" data-role="collapsible"><a class="data switch" data-toggle="switch" href="#<?php echo $alias; ?>"><?php echo $label; ?></a></div>
                 <div class="data item content" id="<?php echo $alias; ?>" data-role="content"><?php echo $html; ?></div>
             <?php endforeach;?>
-        </dl>
+        </div>
     </div>
 <?php endif; ?>
diff --git a/app/code/Magento/CatalogImportExport/Model/Export/Product.php b/app/code/Magento/CatalogImportExport/Model/Export/Product.php
index 8903427a9ae05673de5c1b4a63729f0271659a56..10f60a27f71ccd1f839a822ac592b2b5eab846be 100644
--- a/app/code/Magento/CatalogImportExport/Model/Export/Product.php
+++ b/app/code/Magento/CatalogImportExport/Model/Export/Product.php
@@ -660,10 +660,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity
                     '_crosssell_sku',
                     '_crosssell_position',
                     '_upsell_sku',
-                    '_upsell_position',
-                    '_associated_sku',
-                    '_associated_default_qty',
-                    '_associated_position'
+                    '_upsell_position'
                 ),
                 array('_tier_price_website', '_tier_price_customer_group', '_tier_price_qty', '_tier_price_price'),
                 array('_group_price_website', '_group_price_customer_group', '_group_price_price'),
diff --git a/app/code/Magento/CatalogImportExport/composer.json b/app/code/Magento/CatalogImportExport/composer.json
index 086a9a961fc6ab8af3e508f597442116a5e7be6f..0425996d87d44f8895a1e89cc35fd172d52b37ad 100644
--- a/app/code/Magento/CatalogImportExport/composer.json
+++ b/app/code/Magento/CatalogImportExport/composer.json
@@ -2,23 +2,21 @@
     "name": "magento/module-catalog-import-export",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/module-import-export": "0.1.0-alpha89",
-        "magento/module-indexer": "0.1.0-alpha89",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-catalog-inventory": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-grouped-product": "0.1.0-alpha89",
-        "magento/module-configurable-product": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/module-import-export": "0.1.0-alpha90",
+        "magento/module-indexer": "0.1.0-alpha90",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-catalog-inventory": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "ext-ctype": "*",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/CatalogImportExport/etc/di.xml b/app/code/Magento/CatalogImportExport/etc/di.xml
index 467acd5938d53a701fd73ba9a3222bb6d7093a71..c4d6e35f5d2d30cb3cc441332f213ec69a4f67ac 100644
--- a/app/code/Magento/CatalogImportExport/etc/di.xml
+++ b/app/code/Magento/CatalogImportExport/etc/di.xml
@@ -31,11 +31,4 @@
         <plugin name="invalidateStockIndexerOnImport" type="\Magento\CatalogImportExport\Model\Indexer\Stock\Plugin\Import" />
         <plugin name="invalidateEavIndexerOnImport" type="\Magento\CatalogImportExport\Model\Indexer\Product\Eav\Plugin\Import" />
     </type>
-    <type name="Magento\CatalogImportExport\Model\Export\RowCustomizer\Composite">
-        <arguments>
-            <argument name="customizers" xsi:type="array">
-                <item name="configurableProduct" xsi:type="string">Magento\CatalogImportExport\Model\Export\RowCustomizer</item>
-            </argument>
-        </arguments>
-    </type>
 </config>
diff --git a/app/code/Magento/CatalogImportExport/etc/export.xml b/app/code/Magento/CatalogImportExport/etc/export.xml
index 9d3fce872ca89691a82342e7cad9f187815f3472..6c1b4d4ccdbaaa4452ef76147c8703a5d4c6e86c 100644
--- a/app/code/Magento/CatalogImportExport/etc/export.xml
+++ b/app/code/Magento/CatalogImportExport/etc/export.xml
@@ -27,7 +27,5 @@
     <entity name="catalog_product" label="Products" model="Magento\CatalogImportExport\Model\Export\Product" entityAttributeFilterType="catalog_product"/>
     <entityType entity="catalog_product" name="simple" model="Magento\CatalogImportExport\Model\Export\Product\Type\Simple" />
     <entityType entity="catalog_product" name="virtual" model="Magento\CatalogImportExport\Model\Export\Product\Type\Simple" />
-    <entityType entity="catalog_product" name="grouped" model="Magento\CatalogImportExport\Model\Export\Product\Type\Grouped" />
-    <entityType entity="catalog_product" name="configurable" model="Magento\CatalogImportExport\Model\Export\Product\Type\Configurable" />
     <fileFormat name="csv" label="CSV" model="Magento\ImportExport\Model\Export\Adapter\Csv" />
 </config>
diff --git a/app/code/Magento/CatalogImportExport/etc/import.xml b/app/code/Magento/CatalogImportExport/etc/import.xml
index 74324b3e3ba453ca3195f2dfdf6210eb41c7464c..9ef92240f459982e013071e56e1463363c767e94 100644
--- a/app/code/Magento/CatalogImportExport/etc/import.xml
+++ b/app/code/Magento/CatalogImportExport/etc/import.xml
@@ -27,8 +27,6 @@
     <entity name="catalog_product" label="Products" model="Magento\CatalogImportExport\Model\Import\Product" behaviorModel="Magento\ImportExport\Model\Source\Import\Behavior\Basic" />
     <entityType entity="catalog_product" name="simple" model="Magento\CatalogImportExport\Model\Import\Product\Type\Simple" />
     <entityType entity="catalog_product" name="virtual" model="Magento\CatalogImportExport\Model\Import\Product\Type\Simple" />
-    <entityType entity="catalog_product" name="grouped" model="Magento\CatalogImportExport\Model\Import\Product\Type\Grouped" />
-    <entityType entity="catalog_product" name="configurable" model="Magento\CatalogImportExport\Model\Import\Product\Type\Configurable" />
     <relatedIndexer entity="catalog_product" name="catalog_product_price" />
     <relatedIndexer entity="catalog_product" name="catalogsearch_fulltext" />
     <relatedIndexer entity="catalog_product" name="catalog_product_flat" />
diff --git a/app/code/Magento/CatalogImportExport/etc/module.xml b/app/code/Magento/CatalogImportExport/etc/module.xml
index f4dfd26b5d984ebbeb5ae3bdb769ba5a11e04ab4..d6c6bf1fa3f5196a95b285b235b0e971d221d5a3 100644
--- a/app/code/Magento/CatalogImportExport/etc/module.xml
+++ b/app/code/Magento/CatalogImportExport/etc/module.xml
@@ -34,8 +34,6 @@
             <module name="Magento_Store"/>
             <module name="Magento_CatalogInventory"/>
             <module name="Magento_Customer"/>
-            <module name="Magento_GroupedProduct"/>
-            <module name="Magento_ConfigurableProduct"/>
         </depends>
     </module>
 </config>
diff --git a/app/code/Magento/CatalogInventory/Service/V1/Data/StockItemDetails.php b/app/code/Magento/CatalogInventory/Service/V1/Data/StockItemDetails.php
index 79c275304cf15d56b5c2a13aed06b6f173056fd2..d6fa3ad65e9edcde989ea3cd69989b0a718496e9 100644
--- a/app/code/Magento/CatalogInventory/Service/V1/Data/StockItemDetails.php
+++ b/app/code/Magento/CatalogInventory/Service/V1/Data/StockItemDetails.php
@@ -63,7 +63,7 @@ class StockItemDetails extends AbstractObject
     /**#@-*/
 
     /**
-     * @return float
+     * @return float|null
      */
     public function getQty()
     {
@@ -71,7 +71,7 @@ class StockItemDetails extends AbstractObject
     }
 
     /**
-     * @return float
+     * @return float|null
      */
     public function getMinQty()
     {
@@ -79,7 +79,7 @@ class StockItemDetails extends AbstractObject
     }
 
     /**
-     * @return bool
+     * @return bool|null
      */
     public function getIsQtyDecimal()
     {
@@ -87,7 +87,7 @@ class StockItemDetails extends AbstractObject
     }
 
     /**
-     * @return bool
+     * @return bool|null
      */
     public function isBackorders()
     {
@@ -95,7 +95,7 @@ class StockItemDetails extends AbstractObject
     }
 
     /**
-     * @return float
+     * @return float|null
      */
     public function getMinSaleQty()
     {
@@ -103,7 +103,7 @@ class StockItemDetails extends AbstractObject
     }
 
     /**
-     * @return float
+     * @return float|null
      */
     public function getMaxSaleQty()
     {
@@ -111,7 +111,7 @@ class StockItemDetails extends AbstractObject
     }
 
     /**
-     * @return bool
+     * @return bool|null
      */
     public function getIsInStock()
     {
@@ -119,7 +119,7 @@ class StockItemDetails extends AbstractObject
     }
 
     /**
-     * @return string
+     * @return string|null
      */
     public function getLowStockDate()
     {
@@ -127,7 +127,7 @@ class StockItemDetails extends AbstractObject
     }
 
     /**
-     * @return float
+     * @return float|null
      */
     public function getNotifyStockQty()
     {
@@ -135,7 +135,7 @@ class StockItemDetails extends AbstractObject
     }
 
     /**
-     * @return bool
+     * @return bool|null
      */
     public function isManageStock()
     {
@@ -143,7 +143,7 @@ class StockItemDetails extends AbstractObject
     }
 
     /**
-     * @return bool
+     * @return bool|null
      */
     public function isStockStatusChangedAuto()
     {
@@ -151,7 +151,7 @@ class StockItemDetails extends AbstractObject
     }
 
     /**
-     * @return float
+     * @return float|null
      */
     public function getQtyIncrements()
     {
@@ -159,7 +159,7 @@ class StockItemDetails extends AbstractObject
     }
 
     /**
-     * @return bool
+     * @return bool|null
      */
     public function isEnableQtyIncrements()
     {
@@ -167,7 +167,7 @@ class StockItemDetails extends AbstractObject
     }
 
     /**
-     * @return bool
+     * @return bool|null
      */
     public function getIsDecimalDivided()
     {
diff --git a/app/code/Magento/CatalogInventory/composer.json b/app/code/Magento/CatalogInventory/composer.json
index 5fef7ba97da4a39cf4f2c75fc1972ed43b3da15b..f9750651c87b15f7d035d63cceb2e36a27957dee 100644
--- a/app/code/Magento/CatalogInventory/composer.json
+++ b/app/code/Magento/CatalogInventory/composer.json
@@ -2,20 +2,20 @@
     "name": "magento/module-catalog-inventory",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-indexer": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-indexer": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/CatalogInventory/etc/adminhtml/acl.xml b/app/code/Magento/CatalogInventory/etc/acl.xml
similarity index 94%
rename from app/code/Magento/CatalogInventory/etc/adminhtml/acl.xml
rename to app/code/Magento/CatalogInventory/etc/acl.xml
index c7ceecc550624727f602e4037ef443fa53e8fe0f..285a510a2a353c429c3f9c937dde865c23defddf 100644
--- a/app/code/Magento/CatalogInventory/etc/adminhtml/acl.xml
+++ b/app/code/Magento/CatalogInventory/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/CatalogInventory/etc/webapi.xml b/app/code/Magento/CatalogInventory/etc/webapi.xml
index de443919ca730e49350c997a39c913a9e12ea34e..25eef2be1b94688a1cb08bf93ef0c6807ab7d357 100644
--- a/app/code/Magento/CatalogInventory/etc/webapi.xml
+++ b/app/code/Magento/CatalogInventory/etc/webapi.xml
@@ -31,7 +31,7 @@
             <resource ref="Magento_CatalogInventory::cataloginventory"/>
         </resources>
     </route>
-    <route url="/V1/stockItem/:productSku" method="POST">
+    <route url="/V1/stockItem/:productSku" method="PUT">
         <service class="Magento\CatalogInventory\Service\V1\StockItemServiceInterface" method="saveStockItemBySku"/>
         <resources>
             <resource ref="Magento_CatalogInventory::cataloginventory"/>
@@ -44,7 +44,7 @@
             <resource ref="Magento_CatalogInventory::cataloginventory"/>
         </resources>
     </route>
-    <route url="/V1/stockItem/lowStock/" method="PUT">
+    <route url="/V1/stockItem/lowStock/" method="GET">
         <service class="Magento\CatalogInventory\Service\V1\StockStatusServiceInterface" method="getLowStockItems"/>
         <resources>
             <resource ref="Magento_CatalogInventory::cataloginventory"/>
diff --git a/app/code/Magento/CatalogRule/composer.json b/app/code/Magento/CatalogRule/composer.json
index 1078ad11fc5f61f6dbc4c7d3dbeb4b44e9d79e8e..6a1e618d3206649ce2cb8e2fd339b44550c81925 100644
--- a/app/code/Magento/CatalogRule/composer.json
+++ b/app/code/Magento/CatalogRule/composer.json
@@ -2,19 +2,19 @@
     "name": "magento/module-catalog-rule",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-rule": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-index": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-rule": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-index": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/CatalogRule/etc/adminhtml/acl.xml b/app/code/Magento/CatalogRule/etc/acl.xml
similarity index 93%
rename from app/code/Magento/CatalogRule/etc/adminhtml/acl.xml
rename to app/code/Magento/CatalogRule/etc/acl.xml
index 49694bd4a88af61dd3162898dfad08787e38377e..a08b52ccbb5ce61f28c36e27a2f9e4341c680ddd 100644
--- a/app/code/Magento/CatalogRule/etc/adminhtml/acl.xml
+++ b/app/code/Magento/CatalogRule/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/CatalogSearch/composer.json b/app/code/Magento/CatalogSearch/composer.json
index 4a8594d5454eb3b46ba4a93058195d02fde023e1..8942d05ba4e43ec81db959a4786aa313d9ab5eb8 100644
--- a/app/code/Magento/CatalogSearch/composer.json
+++ b/app/code/Magento/CatalogSearch/composer.json
@@ -2,21 +2,21 @@
     "name": "magento/module-catalog-search",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-directory": "0.1.0-alpha89",
-        "magento/module-index": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-directory": "0.1.0-alpha90",
+        "magento/module-index": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/CatalogSearch/etc/adminhtml/acl.xml b/app/code/Magento/CatalogSearch/etc/acl.xml
similarity index 93%
rename from app/code/Magento/CatalogSearch/etc/adminhtml/acl.xml
rename to app/code/Magento/CatalogSearch/etc/acl.xml
index 76081cbaba77fa208e8c0526825b07a406ae25e7..9da0b4e2bd8195070c58004ae44e7fb9a6bc8ef1 100644
--- a/app/code/Magento/CatalogSearch/etc/adminhtml/acl.xml
+++ b/app/code/Magento/CatalogSearch/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/CatalogSearch/view/frontend/templates/form.mini.phtml b/app/code/Magento/CatalogSearch/view/frontend/templates/form.mini.phtml
index 9079ef2bcdbcabe4a9722268a000a8a200407590..cdf1ba1eb1848e5aee1ab5f2ec2d28c3d58f6170 100644
--- a/app/code/Magento/CatalogSearch/view/frontend/templates/form.mini.phtml
+++ b/app/code/Magento/CatalogSearch/view/frontend/templates/form.mini.phtml
@@ -27,9 +27,9 @@
 /** @var $helper \Magento\CatalogSearch\Helper\Data */
 $helper = $this->helper('Magento\CatalogSearch\Helper\Data');
 ?>
-<div class="block search">
-    <div class="title"><strong><?php echo __('Search'); ?></strong></div>
-    <div class="content search">
+<div class="block block-search">
+    <div class="block block-title"><strong><?php echo __('Search'); ?></strong></div>
+    <div class="block block-content">
         <form class="form minisearch" id="search_mini_form" action="<?php echo $helper->getResultUrl() ?>" method="get">
             <div class="field search">
                 <label class="label" for="search"><span><?php echo __('Search'); ?></span></label>
@@ -46,7 +46,7 @@ $helper = $this->helper('Magento\CatalogSearch\Helper\Data');
                            placeholder="<?php echo __('Search entire store here...'); ?>"
                            class="input-text"
                            autocomplete="off"/>
-                    <div id="search_autocomplete" class="search autocomplete"></div>
+                    <div id="search_autocomplete" class="search-autocomplete"></div>
                     <div class="nested">
                         <a class="action advanced" href="<?php echo $helper->getAdvancedSearchUrl(); ?>">
                             <?php echo __('Advanced Search'); ?>
diff --git a/app/code/Magento/CatalogUrlRewrite/composer.json b/app/code/Magento/CatalogUrlRewrite/composer.json
index 54b974665bfdecc0f286b03298323d0d03bd66d3..7c65d2df592e38ab326965adfd0c0a1d3bf682d6 100644
--- a/app/code/Magento/CatalogUrlRewrite/composer.json
+++ b/app/code/Magento/CatalogUrlRewrite/composer.json
@@ -2,15 +2,15 @@
     "name": "magento/module-catalog-url-rewrite",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-url-redirect": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89"
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-url-redirect": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Centinel/composer.json b/app/code/Magento/Centinel/composer.json
index 1f4cbfb18b7e553dce0c5436d7735f001812066f..d3387325b8f74a06d03e214d97402f48e3a239e7 100644
--- a/app/code/Magento/Centinel/composer.json
+++ b/app/code/Magento/Centinel/composer.json
@@ -2,17 +2,17 @@
     "name": "magento/module-centinel",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-checkout": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-checkout": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Checkout/Model/Type/Onepage.php b/app/code/Magento/Checkout/Model/Type/Onepage.php
index c28297f672c1b306e596c4c94f34ad1d749ee81e..2f2b214c8cfe1b9e69890ab6f654d08d64fac323 100644
--- a/app/code/Magento/Checkout/Model/Type/Onepage.php
+++ b/app/code/Magento/Checkout/Model/Type/Onepage.php
@@ -36,6 +36,7 @@ use Magento\Customer\Service\V1\CustomerAccountServiceInterface;
 use Magento\Framework\Exception\NoSuchEntityException;
 use Magento\Customer\Service\V1\CustomerAddressServiceInterface;
 use Magento\Customer\Service\V1\CustomerMetadataServiceInterface as CustomerMetadata;
+use Magento\Sales\Model\Order\Email\Sender\OrderSender;
 
 class Onepage
 {
@@ -148,6 +149,11 @@ class Onepage
     /** @var CustomerAccountServiceInterface */
     protected $_customerAccountService;
 
+    /**
+     * @var OrderSender
+     */
+    protected $orderSender;
+
     /**
      * @param \Magento\Framework\Event\ManagerInterface $eventManager
      * @param \Magento\Checkout\Helper\Data $helper
@@ -171,6 +177,7 @@ class Onepage
      * @param \Magento\Framework\Math\Random $mathRandom
      * @param \Magento\Framework\Encryption\EncryptorInterface $encryptor
      * @param CustomerAddressServiceInterface $customerAddressService
+     * @param OrderSender $orderSender
      */
     public function __construct(
         \Magento\Framework\Event\ManagerInterface $eventManager,
@@ -194,7 +201,8 @@ class Onepage
         \Magento\Framework\Math\Random $mathRandom,
         \Magento\Framework\Encryption\EncryptorInterface $encryptor,
         CustomerAddressServiceInterface $customerAddressService,
-        CustomerAccountServiceInterface $accountService
+        CustomerAccountServiceInterface $accountService,
+        OrderSender $orderSender
     ) {
         $this->_eventManager = $eventManager;
         $this->_customerData = $customerData;
@@ -218,6 +226,7 @@ class Onepage
         $this->_encryptor = $encryptor;
         $this->_customerAddressService = $customerAddressService;
         $this->_customerAccountService = $accountService;
+        $this->orderSender = $orderSender;
     }
 
     /**
@@ -943,7 +952,7 @@ class Onepage
              */
             if (!$redirectUrl && $order->getCanSendNewEmailFlag()) {
                 try {
-                    $order->sendNewOrderEmail();
+                    $this->orderSender->send($order);
                 } catch (\Exception $e) {
                     $this->_logger->logException($e);
                 }
diff --git a/app/code/Magento/Checkout/Service/V1/Address/Billing/ReadService.php b/app/code/Magento/Checkout/Service/V1/Address/Billing/ReadService.php
new file mode 100644
index 0000000000000000000000000000000000000000..8c2fa58e98b01c93ee46f934da0d92794eeeb8e6
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Address/Billing/ReadService.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\Checkout\Service\V1\Address\Billing;
+
+use \Magento\Checkout\Service\V1\Address\Converter as AddressConverter;
+
+class ReadService implements ReadServiceInterface
+{
+    /**
+     * @var \Magento\Checkout\Service\V1\QuoteLoader
+     */
+    protected $quoteLoader;
+
+    /**
+     * @var AddressConverter
+     */
+    protected $addressConverter;
+
+    /**
+     * @var \Magento\Store\Model\StoreManagerInterface
+     */
+    protected $storeManager;
+
+    /**
+     * @param \Magento\Checkout\Service\V1\QuoteLoader $quoteLoader
+     * @param AddressConverter $addressConverter
+     * @param \Magento\Store\Model\StoreManagerInterface $storeManager
+     */
+    public function __construct(
+        \Magento\Checkout\Service\V1\QuoteLoader $quoteLoader,
+        AddressConverter $addressConverter,
+        \Magento\Store\Model\StoreManagerInterface $storeManager
+    ) {
+        $this->quoteLoader = $quoteLoader;
+        $this->addressConverter = $addressConverter;
+        $this->storeManager = $storeManager;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAddress($cartId)
+    {
+        $storeId = $this->storeManager->getStore()->getId();
+
+        /** @var  \Magento\Sales\Model\Quote\Address $address */
+        $address = $this->quoteLoader->load($cartId, $storeId)->getBillingAddress();
+        return $this->addressConverter->convertModelToDataObject($address);
+    }
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Address/Billing/ReadServiceInterface.php b/app/code/Magento/Checkout/Service/V1/Address/Billing/ReadServiceInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..690cfd7c30fb3eaca9a93100bf1ca556fa6aae83
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Address/Billing/ReadServiceInterface.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Quote billing address service
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Checkout\Service\V1\Address\Billing;
+
+interface ReadServiceInterface
+{
+    /**
+     * Get billing address of the quote
+     *
+     * @param int $cartId
+     * @return \Magento\Checkout\Service\V1\Data\Cart\Address
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     */
+    public function getAddress($cartId);
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Address/Billing/WriteService.php b/app/code/Magento/Checkout/Service/V1/Address/Billing/WriteService.php
new file mode 100644
index 0000000000000000000000000000000000000000..c94d3dc4b18e05f8c58606f7a973f4b0350b0a0d
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Address/Billing/WriteService.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\Checkout\Service\V1\Address\Billing;
+
+use Magento\Framework\Exception\InputException;
+use Magento\Framework\Logger;
+use \Magento\Checkout\Service\V1\QuoteLoader;
+use \Magento\Sales\Model\Quote\AddressFactory;
+use \Magento\Store\Model\StoreManagerInterface;
+use \Magento\Checkout\Service\V1\Address\Converter;
+use \Magento\Checkout\Service\V1\Address\Validator;
+
+class WriteService implements WriteServiceInterface
+{
+    /**
+     * @var Validator
+     */
+    protected $addressValidator;
+
+    /**
+     * @var Logger
+     */
+    protected $logger;
+
+    /**
+     * @var AddressFactory
+     */
+    protected $quoteAddressFactory;
+
+    /**
+     * @var StoreManagerInterface
+     */
+    protected $storeManager;
+
+    /**
+     * @var Converter
+     */
+    protected $addressConverter;
+
+    /**
+     * @var QuoteLoader
+     */
+    protected $quoteLoader;
+
+    /**
+     * @param QuoteLoader $quoteLoader
+     * @param StoreManagerInterface $storeManager
+     * @param Converter $addressConverter
+     * @param Validator $addressValidator
+     * @param AddressFactory $quoteAddressFactory
+     * @param Logger $logger
+     */
+    public function __construct(
+        QuoteLoader $quoteLoader,
+        StoreManagerInterface $storeManager,
+        Converter $addressConverter,
+        Validator $addressValidator,
+        AddressFactory $quoteAddressFactory,
+        Logger $logger
+    ) {
+        $this->addressValidator = $addressValidator;
+        $this->storeManager = $storeManager;
+        $this->logger = $logger;
+        $this->quoteLoader = $quoteLoader;
+        $this->quoteAddressFactory = $quoteAddressFactory;
+        $this->addressConverter = $addressConverter;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setAddress($cartId, $addressData)
+    {
+        /** @var \Magento\Sales\Model\Quote $quote */
+        $quote = $this->quoteLoader->load($cartId, $this->storeManager->getStore()->getId());
+        /** @var \Magento\Sales\Model\Quote\Address $address */
+        $address = $this->quoteAddressFactory->create();
+        $this->addressValidator->validate($addressData);
+        if ($addressData->getId()) {
+            $address->load($addressData->getId());
+        }
+        $address = $this->addressConverter->convertDataObjectToModel($addressData, $address);
+        $quote->setBillingAddress($address);
+        $quote->setDataChanges(true);
+        try {
+            $quote->save();
+        } catch (\Exception $e) {
+            $this->logger->logException($e);
+            throw new InputException('Unable to save address. Please, check input data.');
+        }
+        return $quote->getBillingAddress()->getId();
+    }
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Address/Billing/WriteServiceInterface.php b/app/code/Magento/Checkout/Service/V1/Address/Billing/WriteServiceInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..406c6860684123344ef3e1e5d8ef3ee51c4eef07
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Address/Billing/WriteServiceInterface.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Quote billing address service
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Checkout\Service\V1\Address\Billing;
+
+interface WriteServiceInterface
+{
+    /**
+     * Assign billing address to cart
+     *
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     * @throws \Magento\Framework\Exception\InputException
+     * @param int $cartId
+     * @param \Magento\Checkout\Service\V1\Data\Cart\Address $addressData
+     * @return int
+     */
+    public function setAddress($cartId, $addressData);
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Address/Converter.php b/app/code/Magento/Checkout/Service/V1/Address/Converter.php
new file mode 100644
index 0000000000000000000000000000000000000000..def300b8fd3bce8927e221c1819a8f4bbad94e4d
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Address/Converter.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\Checkout\Service\V1\Address;
+
+use \Magento\Checkout\Service\V1\Data\Cart\Address;
+use \Magento\Checkout\Service\V1\Data\Cart\AddressBuilder;
+use \Magento\Checkout\Service\V1\Data\Cart\Address\Region;
+use \Magento\Framework\Service\Data\Eav\AttributeValue;
+
+class Converter
+{
+    /**
+     * @var AddressBuilder
+     */
+    protected $addressBuilder;
+
+    /**
+     * @param AddressBuilder $addressBuilder
+     */
+    public function __construct(AddressBuilder $addressBuilder)
+    {
+        $this->addressBuilder = $addressBuilder;
+    }
+
+    /**
+     * @param \Magento\Sales\Model\Quote\Address $address
+     * @return \Magento\Checkout\Service\V1\Data\Cart\Address
+     */
+    public function convertModelToDataObject(\Magento\Sales\Model\Quote\Address $address)
+    {
+        $data = [
+            Address::KEY_COUNTRY_ID => $address->getCountryId(),
+            Address::KEY_ID => $address->getId(),
+            Address::KEY_CUSTOMER_ID => $address->getCustomerId(),
+            Address::KEY_REGION => array(
+                Region::KEY_REGION => $address->getRegion(),
+                Region::KEY_REGION_ID => $address->getRegionId(),
+                Region::KEY_REGION_CODE => $address->getRegionCode()
+            ),
+            Address::KEY_STREET => $address->getStreet(),
+            Address::KEY_COMPANY => $address->getCompany(),
+            Address::KEY_TELEPHONE => $address->getTelephone(),
+            Address::KEY_FAX => $address->getFax(),
+            Address::KEY_POSTCODE => $address->getPostcode(),
+            Address::KEY_CITY => $address->getCity(),
+            Address::KEY_FIRSTNAME => $address->getFirstname(),
+            Address::KEY_LASTNAME => $address->getLastname(),
+            Address::KEY_MIDDLENAME => $address->getMiddlename(),
+            Address::KEY_PREFIX => $address->getPrefix(),
+            Address::KEY_SUFFIX => $address->getSuffix(),
+            Address::KEY_EMAIL => $address->getEmail(),
+            Address::KEY_VAT_ID => $address->getVatId()
+        ];
+
+        foreach ($this->addressBuilder->getCustomAttributesCodes() as $attributeCode) {
+            $method = 'get' . \Magento\Framework\Service\DataObjectConverter::snakeCaseToCamelCase($attributeCode);
+            $data[Address::CUSTOM_ATTRIBUTES_KEY][] =
+                [AttributeValue::ATTRIBUTE_CODE => $attributeCode, AttributeValue::VALUE => $address->$method()];
+        }
+
+        return $this->addressBuilder->populateWithArray($data)->create();
+    }
+
+    /**
+     * Convert address data object to quote address model
+     *
+     * @param \Magento\Checkout\Service\V1\Data\Cart\Address $dataObject
+     * @param \Magento\Sales\Model\Quote\Address $address
+     * @return \Magento\Sales\Model\Quote\Address
+     */
+    public function convertDataObjectToModel($dataObject, $address)
+    {
+        $address->setData($dataObject->__toArray());
+
+        //set custom attributes
+        $customAttributes = $dataObject->getCustomAttributes();
+        /** @var \Magento\Framework\Service\Data\Eav\AttributeValue $attributeData */
+        foreach ($customAttributes as $attributeData) {
+            $address->setData($attributeData->getAttributeCode(), $attributeData->getValue());
+        }
+
+        //set fields with custom logic
+        $address->setStreet($dataObject->getStreet());
+        $address->setRegionId($dataObject->getRegion()->getRegionId());
+        $address->setRegion($dataObject->getRegion()->getRegion());
+
+        return $address;
+    }
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Address/Shipping/ReadService.php b/app/code/Magento/Checkout/Service/V1/Address/Shipping/ReadService.php
new file mode 100644
index 0000000000000000000000000000000000000000..4c3e9289a4806301fb04e3f17e5012545e667d18
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Address/Shipping/ReadService.php
@@ -0,0 +1,81 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Checkout\Service\V1\Address\Shipping;
+
+use \Magento\Checkout\Service\V1\Address\Converter as AddressConverter;
+use \Magento\Framework\Exception\NoSuchEntityException;
+
+class ReadService implements ReadServiceInterface
+{
+    /**
+     * @var \Magento\Checkout\Service\V1\QuoteLoader
+     */
+    protected $quoteLoader;
+
+    /**
+     * @var AddressConverter
+     */
+    protected $addressConverter;
+
+    /**
+     * @var \Magento\Store\Model\StoreManagerInterface
+     */
+    protected $storeManager;
+
+    /**
+     * @param \Magento\Checkout\Service\V1\QuoteLoader $quoteLoader
+     * @param AddressConverter $addressConverter
+     * @param \Magento\Store\Model\StoreManagerInterface $storeManager
+     */
+    public function __construct(
+        \Magento\Checkout\Service\V1\QuoteLoader $quoteLoader,
+        AddressConverter $addressConverter,
+        \Magento\Store\Model\StoreManagerInterface $storeManager
+    ) {
+        $this->quoteLoader = $quoteLoader;
+        $this->addressConverter = $addressConverter;
+        $this->storeManager = $storeManager;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAddress($cartId)
+    {
+        $storeId = $this->storeManager->getStore()->getId();
+
+        /** @var \Magento\Sales\Model\Quote $quote */
+        $quote = $this->quoteLoader->load($cartId, $storeId);
+        if ($quote->isVirtual()) {
+            throw new NoSuchEntityException(
+                'Cart contains virtual product(s) only. Shipping address is not applicable'
+            );
+        }
+
+        /** @var \Magento\Sales\Model\Quote\Address $address */
+        $address = $quote->getShippingAddress();
+        return $this->addressConverter->convertModelToDataObject($address);
+    }
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Address/Shipping/ReadServiceInterface.php b/app/code/Magento/Checkout/Service/V1/Address/Shipping/ReadServiceInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..d657f9c02018c6ad0e450f1d5271ed51209cb511
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Address/Shipping/ReadServiceInterface.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Quote shipping address service
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Checkout\Service\V1\Address\Shipping;
+
+interface ReadServiceInterface
+{
+    /**
+     * Get shipping address of the quote
+     *
+     * @param int $cartId
+     * @return \Magento\Checkout\Service\V1\Data\Cart\Address
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     */
+    public function getAddress($cartId);
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Address/Shipping/WriteService.php b/app/code/Magento/Checkout/Service/V1/Address/Shipping/WriteService.php
new file mode 100644
index 0000000000000000000000000000000000000000..96276b6fd7badfb149a9ffae65701c8dc1ee0446
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Address/Shipping/WriteService.php
@@ -0,0 +1,117 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Checkout\Service\V1\Address\Shipping;
+
+use Magento\Framework\Exception\InputException;
+use Magento\Framework\Exception\NoSuchEntityException;
+use Magento\Framework\Logger;
+
+class WriteService implements WriteServiceInterface
+{
+    /**
+     * @var \Magento\Checkout\Service\V1\QuoteLoader
+     */
+    protected $quoteLoader;
+
+    /**
+     * @var \Magento\Store\Model\StoreManagerInterface
+     */
+    protected $storeManager;
+
+    /**
+     * @var \Magento\Sales\Model\Quote\AddressFactory
+     */
+    protected $quoteAddressFactory;
+
+    /**
+     * @var \Magento\Checkout\Service\V1\Address\Converter
+     */
+    protected $addressConverter;
+
+    /**
+     * @var \Magento\Checkout\Service\V1\Address\Validator
+     */
+    protected $addressValidator;
+
+    /**
+     * @var Logger
+     */
+    protected $logger;
+
+    /**
+     * @param \Magento\Checkout\Service\V1\QuoteLoader $quoteLoader
+     * @param \Magento\Store\Model\StoreManagerInterface $storeManager
+     * @param \Magento\Checkout\Service\V1\Address\Converter $addressConverter
+     * @param \Magento\Checkout\Service\V1\Address\Validator $addressValidator
+     * @param \Magento\Sales\Model\Quote\AddressFactory $quoteAddressFactory
+     * @param Logger $logger
+     */
+    public function __construct(
+        \Magento\Checkout\Service\V1\QuoteLoader $quoteLoader,
+        \Magento\Store\Model\StoreManagerInterface $storeManager,
+        \Magento\Checkout\Service\V1\Address\Converter $addressConverter,
+        \Magento\Checkout\Service\V1\Address\Validator $addressValidator,
+        \Magento\Sales\Model\Quote\AddressFactory $quoteAddressFactory,
+        Logger $logger
+    ) {
+        $this->quoteLoader = $quoteLoader;
+        $this->quoteAddressFactory = $quoteAddressFactory;
+        $this->addressConverter = $addressConverter;
+        $this->addressValidator = $addressValidator;
+        $this->storeManager = $storeManager;
+        $this->logger = $logger;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setAddress($cartId, $addressData)
+    {
+        /** @var \Magento\Sales\Model\Quote $quote */
+        $quote = $this->quoteLoader->load($cartId, $this->storeManager->getStore()->getId());
+        if ($quote->isVirtual()) {
+            throw new NoSuchEntityException(
+                'Cart contains virtual product(s) only. Shipping address is not applicable'
+            );
+        }
+        /** @var \Magento\Sales\Model\Quote\Address $address */
+        $address = $this->quoteAddressFactory->create();
+        $this->addressValidator->validate($addressData);
+        if ($addressData->getId()) {
+            $address->load($addressData->getId());
+        }
+        $address = $this->addressConverter->convertDataObjectToModel($addressData, $address);
+        $address->setSameAsBilling(0);
+        $quote->setShippingAddress($address);
+        $quote->setDataChanges(true);
+        try {
+            $quote->save();
+        } catch (\Exception $e) {
+            $this->logger->logException($e);
+            throw new InputException('Unable to save address. Please, check input data.');
+        }
+        return $quote->getShippingAddress()->getId();
+    }
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Address/Shipping/WriteServiceInterface.php b/app/code/Magento/Checkout/Service/V1/Address/Shipping/WriteServiceInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..caa591b036205f33264fa8fa3c076c483c682a5e
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Address/Shipping/WriteServiceInterface.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Quote shipping address service
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Checkout\Service\V1\Address\Shipping;
+
+interface WriteServiceInterface
+{
+    /**
+     * Assign shipping address to cart
+     *
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     * @throws \Magento\Framework\Exception\InputException
+     * @param int $cartId
+     * @param \Magento\Checkout\Service\V1\Data\Cart\Address $addressData
+     * @return int
+     */
+    public function setAddress($cartId, $addressData);
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Address/Validator.php b/app/code/Magento/Checkout/Service/V1/Address/Validator.php
new file mode 100644
index 0000000000000000000000000000000000000000..6390f90e3b55cef35e410cca8cf2c7ada734268c
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Address/Validator.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\Checkout\Service\V1\Address;
+
+class Validator
+{
+    /**
+     * @var \Magento\Sales\Model\Quote\AddressFactory
+     */
+    protected $quoteAddressFactory;
+
+    /**
+     * @var \Magento\Customer\Model\CustomerFactory
+     */
+    protected $customerFactory;
+
+    /**
+     * @param \Magento\Sales\Model\Quote\AddressFactory $quoteAddressFactory
+     * @param \Magento\Customer\Model\CustomerFactory $customerFactory
+     */
+    public function __construct(
+        \Magento\Sales\Model\Quote\AddressFactory $quoteAddressFactory,
+        \Magento\Customer\Model\CustomerFactory $customerFactory
+    ) {
+        $this->quoteAddressFactory = $quoteAddressFactory;
+        $this->customerFactory = $customerFactory;
+    }
+
+    /**
+     * Validate data object fields
+     *
+     * @param \Magento\Checkout\Service\V1\Data\Cart\Address $addressData
+     * @return bool
+     * @throws \Magento\Framework\Exception\InputException
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     */
+    public function validate($addressData)
+    {
+        //validate customer id
+        if ($addressData->getCustomerId()) {
+            $customer = $this->customerFactory->create();
+            $customer->load($addressData->getCustomerId());
+            if (!$customer->getId()) {
+                throw new \Magento\Framework\Exception\NoSuchEntityException(
+                    'Invalid customer id ' . $addressData->getCustomerId()
+                );
+            }
+        }
+
+        // validate address id
+        if ($addressData->getId()) {
+            $address = $this->quoteAddressFactory->create();
+            $address->load($addressData->getId());
+            if (!$address->getId()) {
+                throw new \Magento\Framework\Exception\NoSuchEntityException(
+                    'Invalid address id ' . $addressData->getId()
+                );
+            }
+
+            // check correspondence between customer id and address id
+            if ($addressData->getCustomerId()) {
+                if ($address->getCustomerId() != $addressData->getCustomerId()) {
+                    throw new \Magento\Framework\Exception\InputException(
+                        'Address with id ' . $addressData->getId() . ' belongs to another customer'
+                    );
+                }
+            }
+        }
+        return true;
+    }
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Cart/ReadService.php b/app/code/Magento/Checkout/Service/V1/Cart/ReadService.php
new file mode 100644
index 0000000000000000000000000000000000000000..70b272700d77a909e8aa471a0a8489e277db3e75
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Cart/ReadService.php
@@ -0,0 +1,278 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Checkout\Service\V1\Cart;
+
+use \Magento\Framework\Service\V1\Data\SearchCriteria;
+use \Magento\Sales\Model\QuoteFactory;
+use \Magento\Sales\Model\Quote;
+use \Magento\Sales\Model\Resource\Quote\Collection as QuoteCollection;
+
+use \Magento\Framework\Exception\NoSuchEntityException;
+use \Magento\Framework\Exception\InputException;
+use \Magento\Framework\Service\V1\Data\Search\FilterGroup;
+use \Magento\Checkout\Service\V1\Data\CartBuilder;
+use \Magento\Checkout\Service\V1\Data\CartSearchResultsBuilder;
+use \Magento\Checkout\Service\V1\Data\Cart\TotalsBuilder;
+use \Magento\Checkout\Service\V1\Data\Cart\CustomerBuilder;
+use \Magento\Checkout\Service\V1\Data\Cart\CurrencyBuilder;
+use \Magento\Checkout\Service\V1\Data\Cart;
+use \Magento\Checkout\Service\V1\Data\Cart\Totals;
+use \Magento\Checkout\Service\V1\Data\Cart\Customer;
+use \Magento\Checkout\Service\V1\Data\Cart\Currency;
+
+class ReadService implements ReadServiceInterface
+{
+    /**
+     * @var QuoteFactory
+     */
+    private $quoteFactory;
+
+    /**
+     * @var CartBuilder
+     */
+    private $cartBuilder;
+
+    /**
+     * @var QuoteCollection
+     */
+    private $quoteCollection;
+
+    /**
+     * @var CartSearchResultsBuilder
+     */
+    private $searchResultsBuilder;
+
+    /**
+     * @var CustomerBuilder
+     */
+    private $customerBuilder;
+
+    /**
+     * @var TotalsBuilder
+     */
+    private $totalsBuilder;
+
+    /**
+     * @var CurrencyBuilder;
+     */
+    private $currencyBuilder;
+
+    /**
+     * @var array
+     */
+    private $validSearchFields = array(
+        'id', 'store_id', 'created_at', 'updated_at', 'converted_at', 'is_active', 'is_virtual',
+        'items_count', 'items_qty', 'checkout_method', 'reserved_order_id', 'orig_order_id', 'base_grand_total',
+        'grand_total', 'base_subtotal', 'subtotal', 'base_subtotal_with_discount', 'subtotal_with_discount',
+        'customer_is_guest', 'customer_id', 'customer_group_id', 'customer_id', 'customer_tax_class_id',
+        'customer_email', 'global_currency_code', 'base_currency_code', 'store_currency_code', 'quote_currency_code',
+        'store_to_base_rate', 'store_to_quote_rate', 'base_to_global_rate', 'base_to_quote_rate',
+    );
+
+    /**
+     * Cart data object - quote field map
+     *
+     * @var array
+     */
+    private $searchFieldMap = array(
+        'id' => 'entity_id',
+    );
+
+    /**
+     * @param QuoteFactory $quoteFactory
+     * @param QuoteCollection $quoteCollection
+     * @param CartBuilder $cartBuilder
+     * @param CartSearchResultsBuilder $searchResultsBuilder
+     * @param TotalsBuilder $totalsBuilder
+     * @param CustomerBuilder $customerBuilder
+     * @param CurrencyBuilder $currencyBuilder
+     */
+    public function __construct(
+        QuoteFactory $quoteFactory,
+        QuoteCollection $quoteCollection,
+        CartBuilder $cartBuilder,
+        CartSearchResultsBuilder $searchResultsBuilder,
+        TotalsBuilder $totalsBuilder,
+        CustomerBuilder $customerBuilder,
+        CurrencyBuilder $currencyBuilder
+    ) {
+        $this->quoteFactory = $quoteFactory;
+        $this->quoteCollection = $quoteCollection;
+        $this->cartBuilder = $cartBuilder;
+        $this->searchResultsBuilder = $searchResultsBuilder;
+        $this->totalsBuilder = $totalsBuilder;
+        $this->customerBuilder = $customerBuilder;
+        $this->currencyBuilder = $currencyBuilder;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getCart($cartId)
+    {
+        $quote = $this->quoteFactory->create()->load($cartId);
+        if ($quote->getId() != $cartId) {
+            throw new NoSuchEntityException('There is no cart with provided ID.');
+        }
+        return $this->createCartDataObject($quote);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getCartList(SearchCriteria $searchCriteria)
+    {
+        $this->searchResultsBuilder->setSearchCriteria($searchCriteria);
+
+        foreach ($searchCriteria->getFilterGroups() as $group) {
+            $this->addFilterGroupToCollection($group, $this->quoteCollection);
+        }
+
+        $this->searchResultsBuilder->setTotalCount($this->quoteCollection->getSize());
+        $sortOrders = $searchCriteria->getSortOrders();
+        if ($sortOrders) {
+            foreach ($sortOrders as $field => $direction) {
+                $this->quoteCollection->addOrder(
+                    $this->getQuoteSearchField($field),
+                    $direction == SearchCriteria::SORT_ASC ? 'ASC' : 'DESC'
+                );
+            }
+        }
+        $this->quoteCollection->setCurPage($searchCriteria->getCurrentPage());
+        $this->quoteCollection->setPageSize($searchCriteria->getPageSize());
+
+        $cartList = [];
+        /** @var Quote $quote */
+        foreach ($this->quoteCollection as $quote) {
+            $cartList[] = $this->createCartDataObject($quote);
+        }
+        $this->searchResultsBuilder->setItems($cartList);
+
+        return $this->searchResultsBuilder->create();
+    }
+
+    /**
+     * Create cart data object based on given quote
+     *
+     * @param Quote $quote
+     * @return Cart
+     */
+    protected function createCartDataObject(Quote $quote)
+    {
+        $this->cartBuilder->populateWithArray(array(
+            Cart::ID => $quote->getId(),
+            Cart::STORE_ID  => $quote->getStoreId(),
+            Cart::CREATED_AT  => $quote->getCreatedAt(),
+            Cart::UPDATED_AT  => $quote->getUpdatedAt(),
+            Cart::CONVERTED_AT => $quote->getConvertedAt(),
+            Cart::IS_ACTIVE => $quote->getIsActive(),
+            Cart::IS_VIRTUAL => $quote->getIsVirtual(),
+            Cart::ITEMS_COUNT => $quote->getItemsCount(),
+            Cart::ITEMS_QUANTITY => $quote->getItemsQty(),
+            Cart::CHECKOUT_METHOD => $quote->getCheckoutMethod(),
+            Cart::RESERVED_ORDER_ID => $quote->getReservedOrderId(),
+            Cart::ORIG_ORDER_ID => $quote->getOrigOrderId(),
+        ));
+
+        $this->totalsBuilder->populateWithArray(array(
+            Totals::BASE_GRAND_TOTAL => $quote->getBaseGrandTotal(),
+            Totals::GRAND_TOTAL => $quote->getGrandTotal(),
+            Totals::BASE_SUBTOTAL => $quote->getBaseSubtotal(),
+            Totals::SUBTOTAL => $quote->getSubtotal(),
+            Totals::BASE_SUBTOTAL_WITH_DISCOUNT => $quote->getBaseSubtotalWithDiscount(),
+            Totals::SUBTOTAL_WITH_DISCOUNT => $quote->getSubtotalWithDiscount(),
+        ));
+
+        $this->customerBuilder->populateWithArray(array(
+            Customer::ID => $quote->getCustomerId(),
+            Customer::EMAIL => $quote->getCustomerEmail(),
+            Customer::GROUP_ID => $quote->getCustomerGroupId(),
+            Customer::TAX_CLASS_ID => $quote->getCustomerTaxClassId(),
+            Customer::PREFIX => $quote->getCustomerPrefix(),
+            Customer::FIRST_NAME => $quote->getCustomerFirstname(),
+            Customer::MIDDLE_NAME => $quote->getCustomerMiddlename(),
+            Customer::LAST_NAME => $quote->getCustomerLastname(),
+            Customer::SUFFIX => $quote->getCustomerSuffix(),
+            Customer::DOB => $quote->getCustomerDob(),
+            Customer::NOTE => $quote->getCustomerNote(),
+            Customer::NOTE_NOTIFY => $quote->getCustomerNoteNotify(),
+            Customer::IS_GUEST => $quote->getCustomerIsGuest(),
+            Customer::GENDER => $quote->getCustomerGender(),
+            Customer::TAXVAT => $quote->getCustomerTaxvat(),
+        ));
+
+        $this->currencyBuilder->populateWithArray(array(
+            Currency::GLOBAL_CURRENCY_CODE => $quote->getGlobalCurrencyCode(),
+            Currency::BASE_CURRENCY_CODE => $quote->getBaseCurrencyCode(),
+            Currency::STORE_CURRENCY_CODE => $quote->getStoreCurrencyCode(),
+            Currency::QUOTE_CURRENCY_CODE => $quote->getQuoteCurrencyCode(),
+            Currency::STORE_TO_BASE_RATE => $quote->getStoreToBaseRate(),
+            Currency::STORE_TO_QUOTE_RATE => $quote->getStoreToQuoteRate(),
+            Currency::BASE_TO_GLOBAL_RATE => $quote->getBaseToGlobalRate(),
+            Currency::BASE_TO_QUOTE_RATE => $quote->getBaseToQuoteRate(),
+        ));
+
+        $this->cartBuilder->setCustomer($this->customerBuilder->create());
+        $this->cartBuilder->setTotals($this->totalsBuilder->create());
+        $this->cartBuilder->setCurrency($this->currencyBuilder->create());
+        return $this->cartBuilder->create();
+    }
+
+    /**
+     * Add FilterGroup to the given quote collection.
+     *
+     * @param FilterGroup $filterGroup
+     * @param QuoteCollection $collection
+     * @return void
+     * @throws InputException
+     */
+    protected function addFilterGroupToCollection(FilterGroup $filterGroup, QuoteCollection $collection)
+    {
+        $fields = [];
+        $conditions = [];
+        foreach ($filterGroup->getFilters() as $filter) {
+            $fields[] = $this->getQuoteSearchField($filter->getField());
+            $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq';
+            $conditions[] = array($condition => $filter->getValue());
+        }
+        if ($fields) {
+            $collection->addFieldToFilter($fields, $conditions);
+        }
+    }
+
+    /**
+     * Retrieve mapped search field
+     *
+     * @param string $field
+     * @return string
+     * @throws InputException
+     */
+    protected function getQuoteSearchField($field)
+    {
+        if (!in_array($field, $this->validSearchFields)) {
+            throw new InputException("Field '{$field}' cannot be used for search.");
+        }
+        return isset($this->searchFieldMap[$field]) ? $this->searchFieldMap[$field] : $field;
+    }
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Cart/ReadServiceInterface.php b/app/code/Magento/Checkout/Service/V1/Cart/ReadServiceInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..6b309e31b1e8a2ce79ce2d6b8c3e7d08660046c8
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Cart/ReadServiceInterface.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\Checkout\Service\V1\Cart;
+
+use \Magento\Framework\Service\V1\Data\SearchCriteria;
+
+interface ReadServiceInterface
+{
+    /**
+     * Retrieve information about cart represented by given ID
+     *
+     * @param int $cartId
+     * @return \Magento\Checkout\Service\V1\Data\Cart
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     */
+    public function getCart($cartId);
+
+    /**
+     * Retrieve list of carts that match given search criteria
+     *
+     * @param \Magento\Framework\Service\V1\Data\SearchCriteria $searchCriteria
+     * @return \Magento\Checkout\Service\V1\Data\CartSearchResults
+     */
+    public function getCartList(SearchCriteria $searchCriteria);
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Cart/WriteService.php b/app/code/Magento/Checkout/Service/V1/Cart/WriteService.php
new file mode 100644
index 0000000000000000000000000000000000000000..9ea16bab045b9e687a585717515c1abcd1f0a23e
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Cart/WriteService.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\Checkout\Service\V1\Cart;
+
+use Magento\Framework\Exception\CouldNotSaveException;
+use \Magento\Framework\Exception\NoSuchEntityException;
+use Magento\Framework\Exception\StateException;
+
+class WriteService implements WriteServiceInterface
+{
+    /**
+     * @var \Magento\Sales\Model\QuoteFactory
+     */
+    protected $quoteFactory;
+
+    /**
+     * @var \Magento\Store\Model\StoreManagerInterface
+     */
+    protected $storeManager;
+
+    /**
+     * @var \Magento\Customer\Model\CustomerRegistry
+     */
+    protected $customerRegistry;
+
+    /**
+     * @param \Magento\Sales\Model\QuoteFactory $quoteFactory
+     * @param \Magento\Store\Model\StoreManagerInterface $storeManager
+     * @param \Magento\Customer\Model\CustomerRegistry $customerRegistry
+     */
+    public function __construct(
+        \Magento\Sales\Model\QuoteFactory $quoteFactory,
+        \Magento\Store\Model\StoreManagerInterface $storeManager,
+        \Magento\Customer\Model\CustomerRegistry $customerRegistry
+    ) {
+        $this->quoteFactory = $quoteFactory;
+        $this->storeManager = $storeManager;
+        $this->customerRegistry = $customerRegistry;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function create()
+    {
+        $storeId = $this->storeManager->getStore()->getId();
+
+        /** @var \Magento\Sales\Model\Quote $quote */
+        $quote = $this->quoteFactory->create();
+        $quote->setStoreId($storeId);
+        try {
+            $quote->save();
+        } catch (\Exception $e) {
+            throw new CouldNotSaveException('Cannot create quote');
+        }
+        return $quote->getId();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function assignCustomer($cartId, $customerId)
+    {
+        $storeId = $this->storeManager->getStore()->getId();
+        $quote = $this->quoteFactory->create()->load($cartId);
+        if ($quote->getId() != $cartId || $quote->getStoreId() != $storeId) {
+            throw new NoSuchEntityException('There is no cart with provided ID.');
+        }
+        $customer = $this->customerRegistry->retrieve($customerId);
+        if (!in_array($storeId, $customer->getSharedStoreIds())) {
+            throw new StateException('Cannot assign customer to the given cart. The cart belongs to different store.');
+        }
+        if ($quote->getCustomerId()) {
+            throw new StateException('Cannot assign customer to the given cart. The cart is not anonymous.');
+        }
+        $currentCustomerQuote = $this->quoteFactory->create()->loadByCustomer($customer);
+        if ($currentCustomerQuote->getId()) {
+            throw new StateException('Cannot assign customer to the given cart. Customer already has active cart.');
+        }
+
+        $quote->setCustomer($customer);
+        $quote->setCustomerIsGuest(0);
+        $quote->save();
+        return true;
+    }
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Cart/WriteServiceInterface.php b/app/code/Magento/Checkout/Service/V1/Cart/WriteServiceInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..6f761b98e0751d024279297e8b278c1f2b8c789e
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Cart/WriteServiceInterface.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\Checkout\Service\V1\Cart;
+
+interface WriteServiceInterface
+{
+    /**
+     * Create empty cart/quote for anonymous customer
+     *
+     * @throws \Magento\Framework\Exception\CouldNotSaveException
+     * @return int cart id
+     */
+    public function create();
+
+    /**
+     * Assign customer to the given shopping cart
+     *
+     * @param int $cartId
+     * @param int $customerId
+     * @return boolean
+     */
+    public function assignCustomer($cartId, $customerId);
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Data/Cart.php b/app/code/Magento/Checkout/Service/V1/Data/Cart.php
new file mode 100644
index 0000000000000000000000000000000000000000..103d8b0ee26c3a7c9afeba3acc50e5892a69e2e3
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Data/Cart.php
@@ -0,0 +1,252 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Checkout\Service\V1\Data;
+
+/**
+ * Cart data object
+ *
+ * @codeCoverageIgnore
+ */
+class Cart extends \Magento\Framework\Service\Data\AbstractObject
+{
+    const ID = 'id';
+
+    const STORE_ID = 'store_id';
+
+    const CREATED_AT = 'created_at';
+
+    const UPDATED_AT = 'updated_at';
+
+    const CONVERTED_AT = 'converted_at';
+
+    const IS_ACTIVE = 'is_active';
+
+    const IS_VIRTUAL = 'is_virtual';
+
+    const ITEMS = 'items';
+
+    const ITEMS_COUNT = 'items_count';
+
+    const ITEMS_QUANTITY = 'items_qty';
+
+    const CUSTOMER = 'customer';
+
+    const CHECKOUT_METHOD = 'checkout_method';
+
+    const SHIPPING_ADDRESS = 'shipping_address';
+
+    const BILLING_ADDRESS = 'shipping_address';
+
+    const TOTALS = 'totals';
+
+    const RESERVED_ORDER_ID = 'reserved_order_id';
+
+    const ORIG_ORDER_ID = 'orig_order_id';
+
+    const CURRENCY = 'currency';
+
+    /**
+     * Cart/Quote id
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->_get(self::ID);
+    }
+
+    /**
+     * Store id
+     *
+     * @return int
+     */
+    public function getStoreId()
+    {
+        return $this->_get(self::STORE_ID);
+    }
+
+    /**
+     * Creation date and time
+     *
+     * @return string
+     */
+    public function getCreatedAt()
+    {
+        return $this->_get(self::CREATED_AT);
+    }
+
+    /**
+     * Last update date and time
+     *
+     * @return string
+     */
+    public function getUpdatedAt()
+    {
+        return $this->_get(self::UPDATED_AT);
+    }
+
+    /**
+     * Get conversion date and time
+     *
+     * @return string|null
+     */
+    public function getConvertedAt()
+    {
+        return $this->_get(self::CONVERTED_AT);
+    }
+
+    /**
+     * Get active status flag
+     *
+     * @return bool|null
+     */
+    public function getIsActive()
+    {
+        $value = $this->_get(self::IS_ACTIVE);
+        if (!is_null($value)) {
+            $value = (bool)$value;
+        }
+
+        return $value;
+    }
+
+    /**
+     * Get virtual flag(cart contains virtual products)
+     *
+     * @return bool|null
+     */
+    public function getIsVirtual()
+    {
+        $value = $this->_get(self::IS_VIRTUAL);
+        if (!is_null($value)) {
+            $value = (bool)$value;
+        }
+
+        return $value;
+    }
+
+    /**
+     * Get cart items
+     *
+     * @return \Magento\Checkout\Service\V1\Data\Cart\Item[]|null
+     */
+    public function getItems()
+    {
+        return $this->_get(self::ITEMS);
+    }
+
+    /**
+     * Amount of different items/products in cart
+     *
+     * @return int|null
+     */
+    public function getItemsCount()
+    {
+        return $this->_get(self::ITEMS_COUNT);
+    }
+
+    /**
+     * Get quantity of all items/products in cart
+     *
+     * @return float|null
+     */
+    public function getItemsQty()
+    {
+        return $this->_get(self::ITEMS_QUANTITY);
+    }
+
+    /**
+     * Get customer data
+     *
+     * @return \Magento\Checkout\Service\V1\Data\Cart\Customer
+     */
+    public function getCustomer()
+    {
+        return $this->_get(self::CUSTOMER);
+    }
+
+    /**
+     * Get checkout method
+     *
+     * @return string|null
+     */
+    public function getCheckoutMethod()
+    {
+        return $this->_get(self::CHECKOUT_METHOD);
+    }
+
+    /**
+     * @return \Magento\Checkout\Service\V1\Data\Cart\Address|null
+     */
+    public function getShippingAddress()
+    {
+        return $this->_get(self::SHIPPING_ADDRESS);
+    }
+
+    /**
+     * @return \Magento\Checkout\Service\V1\Data\Cart\Address|null
+     */
+    public function getBillingAddress()
+    {
+        return $this->_get(self::BILLING_ADDRESS);
+    }
+
+    /**
+     * @return \Magento\Checkout\Service\V1\Data\Cart\Totals|null
+     */
+    public function getTotals()
+    {
+        return $this->_get(self::TOTALS);
+    }
+
+    /**
+     * Get reserved order id
+     *
+     * @return string|null
+     */
+    public function getReservedOrderId()
+    {
+        return $this->_get(self::RESERVED_ORDER_ID);
+    }
+
+    /**
+     * Get original order id
+     *
+     * @return string|null
+     */
+    public function getOrigOrderId()
+    {
+        return $this->_get(self::ORIG_ORDER_ID);
+    }
+
+    /**
+     * Get currency information
+     *
+     * @return \Magento\Checkout\Service\V1\Data\Cart\Currency|null
+     */
+    public function getCurrency()
+    {
+        return $this->_get(self::CURRENCY);
+    }
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Data/Cart/Address.php b/app/code/Magento/Checkout/Service/V1/Data/Cart/Address.php
new file mode 100644
index 0000000000000000000000000000000000000000..0bb4ff7e5e4187aa9fc4a13fb969ac145032b06c
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Data/Cart/Address.php
@@ -0,0 +1,241 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Checkout\Service\V1\Data\Cart;
+
+/**
+ * Quote billing/shipping address data
+ *
+ * @codeCoverageIgnore
+ */
+class Address extends \Magento\Framework\Service\Data\Eav\AbstractObject
+{
+    /**#@+
+     * Constants defined for keys of array, makes typos less likely
+     */
+    const KEY_EMAIL = 'email';
+
+    const KEY_COUNTRY_ID = 'country_id';
+
+    const KEY_ID = 'id';
+
+    const KEY_CUSTOMER_ID = 'customer_id';
+
+    const KEY_REGION = 'region';
+
+    const KEY_STREET = 'street';
+
+    const KEY_COMPANY = 'company';
+
+    const KEY_TELEPHONE = 'telephone';
+
+    const KEY_FAX = 'fax';
+
+    const KEY_POSTCODE = 'postcode';
+
+    const KEY_CITY = 'city';
+
+    const KEY_FIRSTNAME = 'firstname';
+
+    const KEY_LASTNAME = 'lastname';
+
+    const KEY_MIDDLENAME = 'middlename';
+
+    const KEY_PREFIX = 'prefix';
+
+    const KEY_SUFFIX = 'suffix';
+
+    const KEY_VAT_ID = 'vat_id';
+
+    /**#@-*/
+
+    /**
+     * Get id
+     *
+     * @return int|null
+     */
+    public function getId()
+    {
+        return $this->_get(self::KEY_ID);
+    }
+
+    /**
+     * Get region
+     *
+     * @return \Magento\Checkout\Service\V1\Data\Cart\Address\Region|null
+     */
+    public function getRegion()
+    {
+        return $this->_get(self::KEY_REGION);
+    }
+
+    /**
+     * Get country id
+     *
+     * @return string
+     */
+    public function getCountryId()
+    {
+        return $this->_get(self::KEY_COUNTRY_ID);
+    }
+
+    /**
+     * Get street
+     *
+     * @return string[]
+     */
+    public function getStreet()
+    {
+        return $this->_get(self::KEY_STREET);
+    }
+
+    /**
+     * Get company
+     *
+     * @return string|null
+     */
+    public function getCompany()
+    {
+        return $this->_get(self::KEY_COMPANY);
+    }
+
+    /**
+     * Get telephone number
+     *
+     * @return string
+     */
+    public function getTelephone()
+    {
+        return $this->_get(self::KEY_TELEPHONE);
+    }
+
+    /**
+     * Get fax number
+     *
+     * @return string|null
+     */
+    public function getFax()
+    {
+        return $this->_get(self::KEY_FAX);
+    }
+
+    /**
+     * Get postcode
+     *
+     * @return string
+     */
+    public function getPostcode()
+    {
+        return $this->_get(self::KEY_POSTCODE);
+    }
+
+    /**
+     * Get city name
+     *
+     * @return string
+     */
+    public function getCity()
+    {
+        return $this->_get(self::KEY_CITY);
+    }
+
+    /**
+     * Get first name
+     *
+     * @return string
+     */
+    public function getFirstname()
+    {
+        return $this->_get(self::KEY_FIRSTNAME);
+    }
+
+    /**
+     * Get last name
+     *
+     * @return string
+     */
+    public function getLastname()
+    {
+        return $this->_get(self::KEY_LASTNAME);
+    }
+
+    /**
+     * Get middle name
+     *
+     * @return string|null
+     */
+    public function getMiddlename()
+    {
+        return $this->_get(self::KEY_MIDDLENAME);
+    }
+
+    /**
+     * Get prefix
+     *
+     * @return string|null
+     */
+    public function getPrefix()
+    {
+        return $this->_get(self::KEY_PREFIX);
+    }
+
+    /**
+     * Get suffix
+     *
+     * @return string|null
+     */
+    public function getSuffix()
+    {
+        return $this->_get(self::KEY_SUFFIX);
+    }
+
+    /**
+     * Get Vat id
+     *
+     * @return string|null
+     */
+    public function getVatId()
+    {
+        return $this->_get(self::KEY_VAT_ID);
+    }
+
+    /**
+     * Get customer id
+     *
+     * @return string|null
+     */
+    public function getCustomerId()
+    {
+        return $this->_get(self::KEY_CUSTOMER_ID);
+    }
+
+    /**
+     * Get billing/shipping email
+     *
+     * @return string
+     */
+    public function getEmail()
+    {
+        return $this->_get(self::KEY_EMAIL);
+    }
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Data/Cart/Address/Region.php b/app/code/Magento/Checkout/Service/V1/Data/Cart/Address/Region.php
new file mode 100644
index 0000000000000000000000000000000000000000..553e9ef3ba5e9d7bb6e84d5665a4687a6d8f4c15
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Data/Cart/Address/Region.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\Checkout\Service\V1\Data\Cart\Address;
+
+/**
+ * Data Object for Address Region
+ */
+class Region extends \Magento\Framework\Service\Data\AbstractObject
+{
+    /**#@+
+     * Array keys
+     */
+    const KEY_REGION_CODE = 'region_code';
+
+    const KEY_REGION = 'region';
+
+    const KEY_REGION_ID = 'region_id';
+
+    /**#@-*/
+
+    /**
+     * Get region code
+     *
+     * @return string
+     */
+    public function getRegionCode()
+    {
+        return $this->_get(self::KEY_REGION_CODE);
+    }
+
+    /**
+     * Get region
+     *
+     * @return string
+     */
+    public function getRegion()
+    {
+        return $this->_get(self::KEY_REGION);
+    }
+
+    /**
+     * Get region id
+     *
+     * @return int
+     */
+    public function getRegionId()
+    {
+        return $this->_get(self::KEY_REGION_ID);
+    }
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Data/Cart/Address/RegionBuilder.php b/app/code/Magento/Checkout/Service/V1/Data/Cart/Address/RegionBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..b82b502487f5085b3faabfb5d355d15e643b4432
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Data/Cart/Address/RegionBuilder.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\Checkout\Service\V1\Data\Cart\Address;
+
+/**
+ * Builder for the Region Service Data Object
+ *
+ * @method Region create()
+ */
+class RegionBuilder extends \Magento\Framework\Service\Data\AbstractObjectBuilder
+{
+    /**
+     * Set region code
+     *
+     * @param string $regionCode
+     * @return $this
+     */
+    public function setRegionCode($regionCode)
+    {
+        $this->_data[Region::KEY_REGION_CODE] = $regionCode;
+        return $this;
+    }
+
+    /**
+     * Set region
+     *
+     * @param string $regionName
+     * @return $this
+     */
+    public function setRegion($regionName)
+    {
+        $this->_data[Region::KEY_REGION] = $regionName;
+        return $this;
+    }
+
+    /**
+     * Set region id
+     *
+     * @param string $regionId
+     * @return $this
+     */
+    public function setRegionId($regionId)
+    {
+        $this->_data[Region::KEY_REGION_ID] = $regionId;
+        return $this;
+    }
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Data/Cart/AddressBuilder.php b/app/code/Magento/Checkout/Service/V1/Data/Cart/AddressBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..f16445015becc76ac02834e5cb5b80c29351ec1d
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Data/Cart/AddressBuilder.php
@@ -0,0 +1,296 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Checkout\Service\V1\Data\Cart;
+
+use Magento\Framework\Service\Data\Eav\AbstractObjectBuilder;
+use Magento\Framework\Service\Data\Eav\AttributeValueBuilder;
+use \Magento\Checkout\Service\V1\Data\Cart\Address\RegionBuilder;
+use \Magento\Checkout\Service\V1\Data\Cart\Address\Region;
+
+/**
+ * Quote address data object builder
+ *
+ * @codeCoverageIgnore
+  */
+class AddressBuilder extends AbstractObjectBuilder
+{
+    /**
+     * Region builder
+     *
+     * @var \Magento\Checkout\Service\V1\Data\Cart\Address\RegionBuilder
+     */
+    protected $_regionBuilder;
+
+    /**
+     * @var \Magento\Customer\Service\V1\CustomerMetadataServiceInterface
+     */
+    protected $metadataService;
+
+    /**
+     * @param \Magento\Framework\Service\Data\ObjectFactory $objectFactory
+     * @param AttributeValueBuilder $valueBuilder
+     * @param RegionBuilder $regionBuilder
+     * @param \Magento\Customer\Service\V1\CustomerMetadataServiceInterface $metadataService
+     */
+    public function __construct(
+        \Magento\Framework\Service\Data\ObjectFactory $objectFactory,
+        AttributeValueBuilder $valueBuilder,
+        RegionBuilder $regionBuilder,
+        \Magento\Customer\Service\V1\CustomerMetadataServiceInterface $metadataService
+    ) {
+        parent::__construct($objectFactory, $valueBuilder);
+        $this->metadataService = $metadataService;
+        $this->_regionBuilder = $regionBuilder;
+        $this->_data[Address::KEY_REGION] = $regionBuilder->create();
+    }
+
+    /**
+     * Convenience method to return region builder
+     *
+     * @return RegionBuilder
+     */
+    public function getRegionBuilder()
+    {
+        return $this->_regionBuilder;
+    }
+
+    /**
+     * Set id
+     *
+     * @param int $id
+     * @return $this
+     */
+    public function setId($id)
+    {
+        return $this->_set(Address::KEY_ID, $id);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function _setDataValues(array $data)
+    {
+        if (array_key_exists(Address::KEY_REGION, $data)) {
+            if (!is_array($data[Address::KEY_REGION])) {
+                // Region data has been submitted as individual keys of Address object. Let's extract it.
+                $regionData = array();
+                foreach (array(Region::KEY_REGION, Region::KEY_REGION_CODE, Region::KEY_REGION_ID) as $attrCode) {
+                    if (isset($data[$attrCode])) {
+                        $regionData[$attrCode] = $data[$attrCode];
+                    }
+                }
+            } else {
+                $regionData = $data[Address::KEY_REGION];
+            }
+            $data[Address::KEY_REGION] = $this->_regionBuilder->populateWithArray($regionData)->create();
+        }
+        return parent::_setDataValues($data);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getCustomAttributesCodes()
+    {
+        $attributeCodes = array();
+        foreach ($this->metadataService->getCustomAddressAttributeMetadata() as $attribute) {
+            $attributeCodes[] = $attribute->getAttributeCode();
+        }
+        return $attributeCodes;
+    }
+
+    /**
+     * Set region
+     *
+     * @param \Magento\Checkout\Service\V1\Data\Cart\Address\Region $region
+     * @return $this
+     */
+    public function setRegion(\Magento\Checkout\Service\V1\Data\Cart\Address\Region $region)
+    {
+        return $this->_set(Address::KEY_REGION, $region);
+    }
+
+    /**
+     * Set country id
+     *
+     * @param int $countryId
+     * @return $this
+     */
+    public function setCountryId($countryId)
+    {
+        return $this->_set(Address::KEY_COUNTRY_ID, $countryId);
+    }
+
+    /**
+     * Set street
+     *
+     * @param string[] $street
+     * @return $this
+     */
+    public function setStreet($street)
+    {
+        return $this->_set(Address::KEY_STREET, $street);
+    }
+
+    /**
+     * Set company
+     *
+     * @param string $company
+     * @return $this
+     */
+    public function setCompany($company)
+    {
+        return $this->_set(Address::KEY_COMPANY, $company);
+    }
+
+    /**
+     * Set telephone number
+     *
+     * @param string $telephone
+     * @return $this
+     */
+    public function setTelephone($telephone)
+    {
+        return $this->_set(Address::KEY_TELEPHONE, $telephone);
+    }
+
+    /**
+     * Set fax number
+     *
+     * @param string $fax
+     * @return $this
+     */
+    public function setFax($fax)
+    {
+        return $this->_set(Address::KEY_FAX, $fax);
+    }
+
+    /**
+     * Set postcode
+     *
+     * @param string $postcode
+     * @return $this
+     */
+    public function setPostcode($postcode)
+    {
+        return $this->_set(Address::KEY_POSTCODE, $postcode);
+    }
+
+    /**
+     * Set city name
+     *
+     * @param string $city
+     * @return $this
+     */
+    public function setCity($city)
+    {
+        return $this->_set(Address::KEY_CITY, $city);
+    }
+
+    /**
+     * Set first name
+     *
+     * @param string $firstname
+     * @return $this
+     */
+    public function setFirstname($firstname)
+    {
+        return $this->_set(Address::KEY_FIRSTNAME, $firstname);
+    }
+
+    /**
+     * Set last name
+     *
+     * @param string $lastname
+     * @return $this
+     */
+    public function setLastname($lastname)
+    {
+        return $this->_set(Address::KEY_LASTNAME, $lastname);
+    }
+
+    /**
+     * Set middle name
+     *
+     * @param string $middlename
+     * @return $this
+     */
+    public function setMiddlename($middlename)
+    {
+        return $this->_set(Address::KEY_MIDDLENAME, $middlename);
+    }
+
+    /**
+     * Set prefix
+     *
+     * @param string $prefix
+     * @return $this
+     */
+    public function setPrefix($prefix)
+    {
+        return $this->_set(Address::KEY_PREFIX, $prefix);
+    }
+
+    /**
+     * Set suffix
+     *
+     * @param string $suffix
+     * @return $this
+     */
+    public function setSuffix($suffix)
+    {
+        return $this->_set(Address::KEY_SUFFIX, $suffix);
+    }
+
+    /**
+     * Set Vat id
+     *
+     * @param string $vatId
+     * @return $this
+     */
+    public function setVatId($vatId)
+    {
+        return $this->_set(Address::KEY_VAT_ID, $vatId);
+    }
+
+    /**
+     * Set customer id
+     *
+     * @param string $customerId
+     * @return $this
+     */
+    public function setCustomerId($customerId)
+    {
+        return $this->_set(Address::KEY_CUSTOMER_ID, $customerId);
+    }
+
+    /**
+     * @param $value string
+     * @return $this
+     */
+    public function setEmail($value)
+    {
+        return $this->_set(Address::KEY_EMAIL, $value);
+    }
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Data/Cart/Currency.php b/app/code/Magento/Checkout/Service/V1/Data/Cart/Currency.php
new file mode 100644
index 0000000000000000000000000000000000000000..7dd0a3a81b6ea1ccdff5ad480471812aad6f89b1
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Data/Cart/Currency.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\Checkout\Service\V1\Data\Cart;
+
+/**
+ * Currency data for quote
+ *
+ * @codeCoverageIgnore
+ */
+class Currency extends \Magento\Framework\Service\Data\AbstractObject
+{
+    const GLOBAL_CURRENCY_CODE = 'global_currency_code';
+
+    const BASE_CURRENCY_CODE = 'base_currency_code';
+
+    const STORE_CURRENCY_CODE = 'store_currency_code';
+
+    const QUOTE_CURRENCY_CODE = 'quote_currency_code';
+
+    const STORE_TO_BASE_RATE = 'store_to_base_rate';
+
+    const STORE_TO_QUOTE_RATE = 'store_to_quote_rate';
+
+    const BASE_TO_GLOBAL_RATE = 'base_to_global_rate';
+
+    const BASE_TO_QUOTE_RATE = 'base_to_quote_rate';
+
+    /**
+     * Get global currency code
+     *
+     * @return string|null
+     */
+    public function getGlobalCurrencyCode()
+    {
+        return $this->_get(self::GLOBAL_CURRENCY_CODE);
+    }
+
+    /**
+     * Get base currency code
+     *
+     * @return string|null
+     */
+    public function getBaseCurrencyCode()
+    {
+        return $this->_get(self::BASE_CURRENCY_CODE);
+    }
+
+    /**
+     * Get store currency code
+     *
+     * @return string|null
+     */
+    public function getStoreCurrencyCode()
+    {
+        return $this->_get(self::STORE_CURRENCY_CODE);
+    }
+
+    /**
+     * Get quote currency code
+     *
+     * @return string|null
+     */
+    public function getQuoteCurrencyCode()
+    {
+        return $this->_get(self::QUOTE_CURRENCY_CODE);
+    }
+
+    /**
+     * Get store currency to base currency rate
+     *
+     * @return float|null
+     */
+    public function getStoreToBaseRate()
+    {
+        return $this->_get(self::STORE_TO_BASE_RATE);
+    }
+
+    /**
+     * Get store currency to quote currency rate
+     *
+     * @return float|null
+     */
+    public function getStoreToQuoteRate()
+    {
+        return $this->_get(self::STORE_TO_QUOTE_RATE);
+    }
+
+    /**
+     * Get base currency to global currency rate
+     *
+     * @return float|null
+     */
+    public function getBaseToGlobalRate()
+    {
+        return $this->_get(self::BASE_TO_GLOBAL_RATE);
+    }
+
+    /**
+     * Get base currency to quote currency rate
+     *
+     * @return float|null
+     */
+    public function getBaseToQuoteRate()
+    {
+        return $this->_get(self::BASE_TO_QUOTE_RATE);
+    }
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Data/Cart/CurrencyBuilder.php b/app/code/Magento/Checkout/Service/V1/Data/Cart/CurrencyBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..bfb50e3c24eefbb18c72e0305782eb9bfa1855b1
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Data/Cart/CurrencyBuilder.php
@@ -0,0 +1,120 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Checkout\Service\V1\Data\Cart;
+
+/**
+ * Currency data builder for quote
+ *
+ * @codeCoverageIgnore
+ */
+class CurrencyBuilder extends \Magento\Framework\Service\Data\AbstractObjectBuilder
+{
+    /**
+     * Set global currency code
+     *
+     * @param string|null $value
+     * @return $this
+     */
+    public function setGlobalCurrencyCode($value)
+    {
+        return $this->_set(Currency::GLOBAL_CURRENCY_CODE, $value);
+    }
+
+    /**
+     * Set base currency code
+     *
+     * @param string|null $value
+     * @return $this
+     */
+    public function setBaseCurrencyCode($value)
+    {
+        return $this->_set(Currency::BASE_CURRENCY_CODE, $value);
+    }
+
+    /**
+     * Set store currency code
+     *
+     * @param string|null $value
+     * @return $this
+     */
+    public function setStoreCurrencyCode($value)
+    {
+        return $this->_set(Currency::STORE_CURRENCY_CODE, $value);
+    }
+
+    /**
+     * Set quote currency code
+     *
+     * @param string|null $value
+     * @return $this
+     */
+    public function setQuoteCurrencyCode($value)
+    {
+        return $this->_set(Currency::QUOTE_CURRENCY_CODE, $value);
+    }
+
+    /**
+     * Set store currency to base currency rate
+     *
+     * @param float|null $value
+     * @return $this
+     */
+    public function setStoreToBaseRate($value)
+    {
+        return $this->_set(Currency::STORE_TO_BASE_RATE, $value);
+    }
+
+    /**
+     * Set store currency to quote currency rate
+     *
+     * @param float|null $value
+     * @return $this
+     */
+    public function setStoreToQuoteRate($value)
+    {
+        return $this->_set(Currency::STORE_TO_QUOTE_RATE, $value);
+    }
+
+    /**
+     * Set base currency to global currency rate
+     *
+     * @param float|null $value
+     * @return $this
+     */
+    public function setBaseToGlobalRate($value)
+    {
+        return $this->_set(Currency::BASE_TO_GLOBAL_RATE, $value);
+    }
+
+    /**
+     * Set base currency to quote currency rate
+     *
+     * @param float|null $value
+     * @return $this
+     */
+    public function setBaseToQuoteRate($value)
+    {
+        return $this->_set(Currency::BASE_TO_QUOTE_RATE, $value);
+    }
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Data/Cart/Customer.php b/app/code/Magento/Checkout/Service/V1/Data/Cart/Customer.php
new file mode 100644
index 0000000000000000000000000000000000000000..66368c8d9eca7cc788ea0517af0e3e279223781a
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Data/Cart/Customer.php
@@ -0,0 +1,213 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Checkout\Service\V1\Data\Cart;
+
+/**
+ * Customer data for quote
+ *
+ * @codeCoverageIgnore
+ */
+class Customer extends \Magento\Framework\Service\Data\AbstractObject
+{
+    const ID = 'id';
+
+    const TAX_CLASS_ID = 'tax_class_id';
+
+    const GROUP_ID = 'group_id';
+
+    const EMAIL = 'email';
+
+    const PREFIX = 'prefix';
+
+    const FIRST_NAME = 'first_name';
+
+    const MIDDLE_NAME = 'middle_name';
+
+    const LAST_NAME = 'last_name';
+
+    const SUFFIX = 'suffix';
+
+    const DOB = 'dob';
+
+    const NOTE = 'note';
+
+    const NOTE_NOTIFY = 'note_notify';
+
+    const IS_GUEST = 'is_guest';
+
+    const TAXVAT = 'taxvat';
+
+    const GENDER = 'gender';
+
+    /**
+     * Get customer id
+     *
+     * @return int|null
+     */
+    public function getId()
+    {
+        return $this->_get(self::ID);
+    }
+
+    /**
+     * Get customer tax class id
+     *
+     * @return int|null
+     */
+    public function getTaxClassId()
+    {
+        return $this->_get(self::TAX_CLASS_ID);
+    }
+
+    /**
+     * Get customer group id
+     *
+     * @return int|null
+     */
+    public function getGroupId()
+    {
+        return $this->_get(self::GROUP_ID);
+    }
+
+    /**
+     * Get customer email
+     *
+     * @return string|null
+     */
+    public function getEmail()
+    {
+        return $this->_get(self::EMAIL);
+    }
+
+    /**
+     * Get customer name prefix
+     *
+     * @return string|null
+     */
+    public function getPrefix()
+    {
+        return $this->_get(self::PREFIX);
+    }
+
+    /**
+     * Get customer first name
+     *
+     * @return string|null
+     */
+    public function getFirstName()
+    {
+        return $this->_get(self::FIRST_NAME);
+    }
+
+    /**
+     * Get customer middle name
+     *
+     * @return string|null
+     */
+    public function getMiddleName()
+    {
+        return $this->_get(self::MIDDLE_NAME);
+    }
+
+    /**
+     * Get customer last name
+     *
+     * @return string|null
+     */
+    public function getLastName()
+    {
+        return $this->_get(self::LAST_NAME);
+    }
+
+    /**
+     * Get customer name suffix
+     *
+     * @return string|null
+     */
+    public function getSuffix()
+    {
+        return $this->_get(self::SUFFIX);
+    }
+
+    /**
+     * Get customer date of birth
+     *
+     * @return string|null
+     */
+    public function getDob()
+    {
+        return $this->_get(self::DOB);
+    }
+
+    /**
+     * Get note
+     *
+     * @return string|null
+     */
+    public function getNote()
+    {
+        return $this->_get(self::NOTE);
+    }
+
+    /**
+     * Get notification status
+     *
+     * @return string|null
+     */
+    public function getNoteNotify()
+    {
+        return $this->_get(self::NOTE_NOTIFY);
+    }
+
+    /**
+     * Is customer a guest?
+     *
+     * @return bool
+     */
+    public function getIsGuest()
+    {
+        return (bool)$this->_get(self::IS_GUEST);
+    }
+
+
+    /**
+     * Get  taxvat value
+     *
+     * @return string|null
+     */
+    public function getTaxVat()
+    {
+        return $this->_get(self::TAXVAT);
+    }
+
+    /**
+     * Get gender
+     *
+     * @return string|null
+     */
+    public function getGender()
+    {
+        return $this->_get(self::GENDER);
+    }
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Data/Cart/CustomerBuilder.php b/app/code/Magento/Checkout/Service/V1/Data/Cart/CustomerBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..c98a28eccd034bd0f7890d90b123ab28de9b80a4
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Data/Cart/CustomerBuilder.php
@@ -0,0 +1,197 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Checkout\Service\V1\Data\Cart;
+
+/**
+ * Customer data builder for quote
+ *
+ * @codeCoverageIgnore
+ */
+class CustomerBuilder extends \Magento\Framework\Service\Data\AbstractObjectBuilder
+{
+    /**
+     * Set customer id
+     *
+     * @param int|null $value
+     * @return $this
+     */
+    public function setId($value)
+    {
+        return $this->_set(Customer::ID, $value);
+    }
+
+    /**
+     * Set customer tax class id
+     *
+     * @param int|null $value
+     * @return $this
+     */
+    public function setTaxClassId($value)
+    {
+        return $this->_set(Customer::TAX_CLASS_ID, $value);
+    }
+
+    /**
+     * Set customer group id
+     *
+     * @param int|null $value
+     * @return $this
+     */
+    public function setGroupId($value)
+    {
+        return $this->_set(Customer::GROUP_ID, $value);
+    }
+
+    /**
+     * Set customer email
+     *
+     * @param string|null $value
+     * @return $this
+     */
+    public function setEmail($value)
+    {
+        return $this->_set(Customer::EMAIL, $value);
+    }
+
+    /**
+     * Set customer name prefix
+     *
+     * @param string|null $value
+     * @return $this
+     */
+    public function setPrefix($value)
+    {
+        return $this->_set(Customer::PREFIX, $value);
+    }
+
+    /**
+     * Set customer first name
+     *
+     * @param string|null $value
+     * @return $this
+     */
+    public function setFirstName($value)
+    {
+        return $this->_set(Customer::FIRST_NAME, $value);
+    }
+
+    /**
+     * Set customer middle name
+     *
+     * @param string|null $value
+     * @return $this
+     */
+    public function setMiddleName($value)
+    {
+        return $this->_set(Customer::MIDDLE_NAME, $value);
+    }
+
+    /**
+     * Set customer last name
+     *
+     * @param string|null $value
+     * @return $this
+     */
+    public function setLastName($value)
+    {
+        return $this->_set(Customer::LAST_NAME, $value);
+    }
+
+    /**
+     * Set customer name suffix
+     *
+     * @param string|null $value
+     * @return $this
+     */
+    public function setSuffix($value)
+    {
+        return $this->_set(Customer::SUFFIX, $value);
+    }
+
+    /**
+     * Set customer date of birth
+     *
+     * @param string|null $value
+     * @return $this
+     */
+    public function setDob($value)
+    {
+        return $this->_set(Customer::DOB, $value);
+    }
+
+    /**
+     * Set note
+     *
+     * @param string|null $value
+     * @return $this
+     */
+    public function setNote($value)
+    {
+        return $this->_set(Customer::NOTE, $value);
+    }
+
+    /**
+     * Set notification status
+     *
+     * @param string|null $value
+     * @return $this
+     */
+    public function setNoteNotify($value)
+    {
+        return $this->_set(Customer::NOTE_NOTIFY, $value);
+    }
+
+    /**
+     * Is customer a guest?
+     *
+     * @param bool $value
+     * @return $this
+     */
+    public function setIsGuest($value)
+    {
+        return (bool)$this->_set(Customer::IS_GUEST, $value);
+    }
+
+    /**
+     * Get  taxvat value
+     *
+     * @param string $value
+     * @return $this
+     */
+    public function setTaxVat($value)
+    {
+        return $this->_set(Customer::TAXVAT, $value);
+    }
+
+    /**
+     * Get gender
+     *
+     * @param string $value
+     * @return $this
+     */
+    public function setGender($value)
+    {
+        return $this->_set(Customer::GENDER, $value);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Resource/Product/Option/MysqlStub.php b/app/code/Magento/Checkout/Service/V1/Data/Cart/Item.php
similarity index 53%
rename from dev/tests/unit/testsuite/Magento/Catalog/Model/Resource/Product/Option/MysqlStub.php
rename to app/code/Magento/Checkout/Service/V1/Data/Cart/Item.php
index e30bbe2206517542afaa698c9a82d35d2b939ad2..6519220126c13c07004aa1b819137605facbbefa 100644
--- a/dev/tests/unit/testsuite/Magento/Catalog/Model/Resource/Product/Option/MysqlStub.php
+++ b/app/code/Magento/Checkout/Service/V1/Data/Cart/Item.php
@@ -21,34 +21,64 @@
  * @copyright   Copyright (c) 2014 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\Option;
+
+namespace Magento\Checkout\Service\V1\Data\Cart;
 
 /**
- * Extend \Magento\Framework\DB\Adapter\Pdo\Mysql and stub needed methods
+ * @codeCoverageIgnore
  */
-class MysqlStub extends \Magento\Framework\DB\Adapter\Pdo\Mysql
+class Item extends \Magento\Framework\Service\Data\AbstractObject
 {
+    /**#@+
+     * Constants defined for keys of array
+     */
+    const SKU = 'sku';
+
+    const QTY = 'qty';
+
+    const NAME = 'name';
+
+    const PRICE = 'price';
+
+    const TYPE = 'type';
+
     /**
-     * Disable parent constructor
+     * @return string|null
      */
-    public function __construct()
+    public function getSku()
     {
+        return $this->_get(self::SKU);
     }
 
     /**
-     * Stub delete method and add needed asserts
-     *
-     * @param  string $table
-     * @param  array|string $where
      * @return int
      */
-    public function delete($table, $where = '')
+    public function getQty()
     {
-        \PHPUnit_Framework_TestCase::assertEquals('catalog_product_option_type_title', $table);
-        \PHPUnit_Framework_TestCase::assertInternalType('array', $where);
-        \PHPUnit_Framework_TestCase::assertEquals(ValueTest::$valueTitleData['id'], $where['option_type_id = ?']);
-        \PHPUnit_Framework_TestCase::assertEquals(ValueTest::$valueTitleData['store_id'], $where['store_id = ?']);
+        return $this->_get(self::QTY);
+    }
 
-        return 0;
+    /**
+     * @return string|null
+     */
+    public function getName()
+    {
+        return $this->_get(self::NAME);
+    }
+
+    /**
+     * @return float|null
+     */
+    public function getPrice()
+    {
+        return $this->_get(self::PRICE);
+    }
+
+    /**
+     * @return string|null
+     */
+    public function getType()
+    {
+        return $this->_get(self::TYPE);
     }
 }
diff --git a/app/code/Magento/Checkout/Service/V1/Data/Cart/ItemBuilder.php b/app/code/Magento/Checkout/Service/V1/Data/Cart/ItemBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..721c7fe528f6171bab8b68394f51ec2bbf5f8dfa
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Data/Cart/ItemBuilder.php
@@ -0,0 +1,81 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Checkout\Service\V1\Data\Cart;
+
+/**
+ * @codeCoverageIgnore
+ */
+class ItemBuilder extends \Magento\Framework\Service\Data\AbstractObjectBuilder
+{
+    /**
+     * @param string $value
+     * @return $this
+     */
+    public function setSku($value)
+    {
+        $this->_set(Item::SKU, $value);
+        return $this;
+    }
+
+    /**
+     * @param int $value
+     * @return $this
+     */
+    public function setQty($value)
+    {
+        $this->_set(Item::QTY, $value);
+        return $this;
+    }
+
+    /**
+     * @param string $value
+     * @return $this
+     */
+    public function setName($value)
+    {
+        $this->_set(Item::NAME, $value);
+        return $this;
+    }
+
+    /**
+     * @param float $value
+     * @return $this
+     */
+    public function setPrice($value)
+    {
+        $this->_set(Item::PRICE, $value);
+        return $this;
+    }
+
+    /**
+     * @param string $value
+     * @return $this
+     */
+    public function setType($value)
+    {
+        $this->_set(Item::TYPE, $value);
+        return $this;
+    }
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Data/Cart/Totals.php b/app/code/Magento/Checkout/Service/V1/Data/Cart/Totals.php
new file mode 100644
index 0000000000000000000000000000000000000000..4138653216adfb64187dc6f1e510552e29a4687d
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Data/Cart/Totals.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\Checkout\Service\V1\Data\Cart;
+
+/**
+ * Cart Totals
+ *
+ * @codeCoverageIgnore
+ */
+class Totals extends \Magento\Framework\Service\Data\AbstractObject
+{
+    const GRAND_TOTAL = 'grand_total';
+
+    const BASE_GRAND_TOTAL = 'base_grand_total';
+
+    const SUBTOTAL = 'subtotal';
+
+    const BASE_SUBTOTAL = 'base_subtotal';
+
+    const SUBTOTAL_WITH_DISCOUNT = 'subtotal_with_discount';
+
+    const BASE_SUBTOTAL_WITH_DISCOUNT = 'base_subtotal_with_discount';
+
+    /**
+     * Get grand total in quote currency
+     *
+     * @return float|null
+     */
+    public function getGrandTotal()
+    {
+        return $this->_get(self::GRAND_TOTAL);
+    }
+
+    /**
+     * Get grand total in base currency
+     *
+     * @return float|null
+     */
+    public function getBaseGrandTotal()
+    {
+        return $this->_get(self::BASE_GRAND_TOTAL);
+    }
+
+    /**
+     * Get subtotal in quote currency
+     *
+     * @return float|null
+     */
+    public function getSubtotal()
+    {
+        return $this->_get(self::SUBTOTAL);
+    }
+
+    /**
+     * Get subtotal in base currency
+     *
+     * @return float|null
+     */
+    public function getBaseSubtotal()
+    {
+        return $this->_get(self::BASE_SUBTOTAL);
+    }
+
+    /**
+     * Get subtotal in quote currency with applied discount
+     *
+     * @return float|null
+     */
+    public function getSubtotalWithDiscount()
+    {
+        return $this->_get(self::SUBTOTAL_WITH_DISCOUNT);
+    }
+
+    /**
+     * Get subtotal in base currency with applied discount
+     *
+     * @return float|null
+     */
+    public function getBaseSubtotalWithDiscount()
+    {
+        return $this->_get(self::BASE_SUBTOTAL_WITH_DISCOUNT);
+    }
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Data/Cart/TotalsBuilder.php b/app/code/Magento/Checkout/Service/V1/Data/Cart/TotalsBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..bf185a0c095cbf525c7e208b5dcec3df2c67516f
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Data/Cart/TotalsBuilder.php
@@ -0,0 +1,98 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Checkout\Service\V1\Data\Cart;
+
+/**
+ * Cart Totals Builder
+ *
+ * @codeCoverageIgnore
+ */
+class TotalsBuilder extends \Magento\Framework\Service\Data\AbstractObjectBuilder
+{
+    /**
+     * Set grand total in quote currency
+     *
+     * @param float|null $value
+     * @return $this
+     */
+    public function setGrandTotal($value)
+    {
+        return $this->_set(Totals::GRAND_TOTAL, $value);
+    }
+
+    /**
+     * Set grand total in base currency
+     *
+     * @param float|null $value
+     * @return $this
+     */
+    public function setBaseGrandTotal($value)
+    {
+        return $this->_set(Totals::BASE_GRAND_TOTAL, $value);
+    }
+
+    /**
+     * Set subtotal in quote currency
+     *
+     * @param float|null $value
+     * @return $this
+     */
+    public function setSubtotal($value)
+    {
+        return $this->_set(Totals::SUBTOTAL, $value);
+    }
+
+    /**
+     * Set subtotal in base currency
+     *
+     * @param float|null $value
+     * @return $this
+     */
+    public function setBaseSubtotal($value)
+    {
+        return $this->_set(Totals::BASE_SUBTOTAL, $value);
+    }
+
+    /**
+     * Set subtotal in quote currency with applied discount
+     *
+     * @param float|null $value
+     * @return $this
+     */
+    public function setSubtotalWithDiscount($value)
+    {
+        return $this->_set(Totals::SUBTOTAL_WITH_DISCOUNT, $value);
+    }
+
+    /**
+     * Set subtotal in base currency with applied discount
+     *
+     * @param float|null $value
+     * @return $this
+     */
+    public function setBaseSubtotalWithDiscount($value)
+    {
+        return $this->_set(Totals::BASE_SUBTOTAL_WITH_DISCOUNT, $value);
+    }
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Data/CartBuilder.php b/app/code/Magento/Checkout/Service/V1/Data/CartBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..547800779aeed251ab0ed17385711102cba852ba
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Data/CartBuilder.php
@@ -0,0 +1,228 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Checkout\Service\V1\Data;
+
+use \Magento\Checkout\Service\V1\Data\Cart\Currency;
+
+/**
+ * Cart data object builder
+ *
+ * @codeCoverageIgnore
+ */
+class CartBuilder extends \Magento\Framework\Service\Data\AbstractObjectBuilder
+{
+    /**
+     * Cart/quote id
+     *
+     * @param int $value
+     * @return $this
+     */
+    public function setId($value)
+    {
+        return $this->_set(Cart::ID, $value);
+    }
+
+    /**
+     * Store id
+     *
+     * @param int $value
+     * @return $this
+     */
+    public function setStoreId($value)
+    {
+        return $this->_set(Cart::STORE_ID, $value);
+    }
+
+    /**
+     * set creation date and time
+     *
+     * @param string $value
+     * @return $this
+     */
+    public function setCreatedAt($value)
+    {
+        return $this->_set(Cart::CREATED_AT, $value);
+    }
+
+    /**
+     * Set last update date and time
+     *
+     * @param string $value
+     * @return $this
+     */
+    public function setUpdatedAt($value)
+    {
+        return $this->_set(Cart::UPDATED_AT, $value);
+    }
+
+    /**
+     * Set convertion date and time
+     *
+     * @param string $value
+     * @return $this
+     */
+    public function setConvertedAt($value)
+    {
+        return $this->_set(Cart::CONVERTED_AT, $value);
+    }
+
+    /**
+     * Set active status
+     *
+     * @param bool|null $value
+     * @return $this
+     */
+    public function setIsActive($value)
+    {
+        return $this->_set(Cart::IS_ACTIVE, $value);
+    }
+
+    /**
+     * Set virtual flag(if cart contains virtual products)
+     *
+     * @param bool|null $value
+     * @return $this
+     */
+    public function setIsVirtual($value)
+    {
+        return $this->_set(Cart::IS_VIRTUAL, $value);
+    }
+
+    /**
+     * Set cart items
+     *
+     * @param \Magento\Checkout\Service\V1\Data\Cart\Item[] $value
+     * @return $this
+     */
+    public function setItems($value)
+    {
+        return $this->_set(Cart::ITEMS, $value);
+    }
+
+    /**
+     * Set items count(amount of different products)
+     *
+     * @param int $value
+     * @return $this
+     */
+    public function setItemsCount($value)
+    {
+        return $this->_set(Cart::ITEMS_COUNT, $value);
+    }
+
+    /**
+     * Set items quantity(total amount of all products)
+     *
+     * @param float $value
+     * @return $this
+     */
+    public function setItemsQty($value)
+    {
+        return $this->_set(Cart::ITEMS_QUANTITY, $value);
+    }
+
+    /**
+     * Set customer data object
+     *
+     * @param \Magento\Checkout\Service\V1\Data\Cart\Customer $value
+     * @return $this
+     */
+    public function setCustomer($value)
+    {
+        return $this->_set(Cart::CUSTOMER, $value);
+    }
+
+    /**
+     * Set checkout method
+     *
+     * @param string $value
+     * @return $this
+     */
+    public function setCheckoutMethod($value)
+    {
+        return $this->_set(Cart::CHECKOUT_METHOD, $value);
+    }
+
+    /**
+     * Set shipping address data object
+     *
+     * @param \Magento\Checkout\Service\V1\Data\Cart\Address $value
+     * @return $this
+     */
+    public function setShippingAddress($value)
+    {
+        return $this->_set(Cart::SHIPPING_ADDRESS, $value);
+    }
+
+    /**
+     * Set billing address data object
+     *
+     * @param \Magento\Checkout\Service\V1\Data\Cart\Address $value
+     * @return $this
+     */
+    public function setBillingAddress($value)
+    {
+        return $this->_set(Cart::BILLING_ADDRESS, $value);
+    }
+
+    /**
+     * @param \Magento\Checkout\Service\V1\Data\Cart\Totals $value
+     * @return $this
+     */
+    public function setTotals($value)
+    {
+        return $this->_set(Cart::TOTALS, $value);
+    }
+
+    /**
+     * Set reserved order id
+     *
+     * @param string $value
+     * @return $this
+     */
+    public function setReservedOrderId($value)
+    {
+        return $this->_set(Cart::RESERVED_ORDER_ID, $value);
+    }
+
+    /**
+     * Set original order id
+     *
+     * @param string $value
+     * @return $this
+     */
+    public function setOrigOrderId($value)
+    {
+        return $this->_set(Cart::ORIG_ORDER_ID, $value);
+    }
+
+    /**
+     * @param \Magento\Checkout\Service\V1\Data\Cart\Currency|null $value
+     * @return $this
+     */
+    public function setCurrency($value)
+    {
+        return $this->_set(Cart::CURRENCY, $value);
+    }
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Data/CartSearchResults.php b/app/code/Magento/Checkout/Service/V1/Data/CartSearchResults.php
new file mode 100644
index 0000000000000000000000000000000000000000..fdde733b14c30939f0d71e14b1cd55edcca1424f
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Data/CartSearchResults.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\Checkout\Service\V1\Data;
+
+class CartSearchResults extends \Magento\Framework\Service\V1\Data\SearchResults
+{
+    /**
+     * Get items
+     *
+     * @return \Magento\Checkout\Service\V1\Data\Cart[]
+     */
+    public function getItems()
+    {
+        return parent::getItems();
+    }
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Data/CartSearchResultsBuilder.php b/app/code/Magento/Checkout/Service/V1/Data/CartSearchResultsBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..4941eaa7367b58fd82aadf4585fe02703c90ce25
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Data/CartSearchResultsBuilder.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)
+ */
+namespace Magento\Checkout\Service\V1\Data;
+
+use Magento\Framework\Service\Data\ObjectFactory;
+use Magento\Framework\Service\V1\Data\SearchCriteriaBuilder;
+use Magento\Framework\Service\V1\Data\AbstractSearchResultsBuilder;
+
+class CartSearchResultsBuilder extends AbstractSearchResultsBuilder
+{
+    /**
+     * @param ObjectFactory $objectFactory
+     * @param SearchCriteriaBuilder $searchCriteriaBuilder
+     * @param CartBuilder $itemObjectBuilder
+     */
+    public function __construct(
+        ObjectFactory $objectFactory,
+        SearchCriteriaBuilder $searchCriteriaBuilder,
+        CartBuilder $itemObjectBuilder
+    ) {
+        parent::__construct($objectFactory, $searchCriteriaBuilder, $itemObjectBuilder);
+    }
+
+    /**
+     * Set cart list
+     *
+     * @param \Magento\Checkout\Service\V1\Data\Cart[] $items
+     * @return $this
+     */
+    public function setItems($items)
+    {
+        return parent::setItems($items);
+    }
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Item/ReadService.php b/app/code/Magento/Checkout/Service/V1/Item/ReadService.php
new file mode 100644
index 0000000000000000000000000000000000000000..87c100879d737e45f65c6222c47d659dd5f68617
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Item/ReadService.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\Checkout\Service\V1\Item;
+
+use Magento\Framework\Exception\NoSuchEntityException;
+use \Magento\Checkout\Service\V1\Data\Cart\ItemBuilder as ItemBuilder;
+use \Magento\Checkout\Service\V1\Data\Cart\Item as Item;
+
+class ReadService implements ReadServiceInterface
+{
+    /**
+     * @var \Magento\Checkout\Service\V1\QuoteLoader
+     */
+    protected $quoteLoader;
+
+    /**
+     * @var ItemBuilder
+     */
+    protected $itemBuilder;
+
+    /**
+     * @var \Magento\Store\Model\StoreManagerInterface
+     */
+    protected $storeManager;
+
+    /**
+     * @param \Magento\Checkout\Service\V1\QuoteLoader $quoteLoader
+     * @param ItemBuilder $itemBuilder
+     * @param \Magento\Store\Model\StoreManagerInterface $storeManager
+     */
+    public function __construct(
+        \Magento\Checkout\Service\V1\QuoteLoader $quoteLoader,
+        ItemBuilder $itemBuilder,
+        \Magento\Store\Model\StoreManagerInterface $storeManager
+    ) {
+        $this->quoteLoader = $quoteLoader;
+        $this->itemBuilder = $itemBuilder;
+        $this->storeManager = $storeManager;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getList($cartId)
+    {
+        $output = [];
+        $storeId = $this->storeManager->getStore()->getId();
+        /** @var  \Magento\Sales\Model\Quote $quote */
+        $quote = $this->quoteLoader->load($cartId, $storeId);
+
+        /** @var  \Magento\Sales\Model\Quote\Item  $item */
+        foreach ($quote->getAllItems() as $item) {
+            $data = [
+                Item::SKU => $item->getSku(),
+                Item::NAME => $item->getName(),
+                Item::PRICE => $item->getPrice(),
+                Item::QTY => $item->getQty(),
+                Item::TYPE => $item->getProductType()
+            ];
+
+            $output[] = $this->itemBuilder->populateWithArray($data)->create();
+        }
+        return $output;
+    }
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Item/ReadServiceInterface.php b/app/code/Magento/Checkout/Service/V1/Item/ReadServiceInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..2ced087aeeaf4fcb7ae6b3b504c285825523870b
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Item/ReadServiceInterface.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\Checkout\Service\V1\Item;
+
+interface ReadServiceInterface
+{
+    /**
+     * @param int $cartId
+     * @return \Magento\Checkout\Service\V1\Data\Cart\Item[]
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     */
+    public function getList($cartId);
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Item/WriteService.php b/app/code/Magento/Checkout/Service/V1/Item/WriteService.php
new file mode 100644
index 0000000000000000000000000000000000000000..fcc8a13b80c635c178cbafb98e058ff4920347b9
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Item/WriteService.php
@@ -0,0 +1,144 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Checkout\Service\V1\Item;
+
+use Magento\Framework\Exception\NoSuchEntityException;
+use \Magento\Checkout\Service\V1\Data\Cart\ItemBuilder as ItemBuilder;
+use Magento\Framework\Exception\CouldNotSaveException;
+use Magento\Framework\Exception\InputException;
+
+class WriteService implements WriteServiceInterface
+{
+    /**
+     * @var \Magento\Checkout\Service\V1\QuoteLoader
+     */
+    protected $quoteLoader;
+
+    /**
+     * @var ItemBuilder
+     */
+    protected $itemBuilder;
+
+    /**
+     * @var \Magento\Catalog\Service\V1\Product\ProductLoader
+     */
+    protected $productLoader;
+
+    /**
+     * @var \Magento\Store\Model\StoreManagerInterface
+     */
+    protected $storeManager;
+
+    /**
+     * @param \Magento\Checkout\Service\V1\QuoteLoader $quoteLoader
+     * @param ItemBuilder $itemBuilder
+     * @param \Magento\Catalog\Service\V1\Product\ProductLoader $productLoader
+     * @param \Magento\Store\Model\StoreManagerInterface $storeManager
+     */
+    public function __construct(
+        \Magento\Checkout\Service\V1\QuoteLoader $quoteLoader,
+        ItemBuilder $itemBuilder,
+        \Magento\Catalog\Service\V1\Product\ProductLoader $productLoader,
+        \Magento\Store\Model\StoreManagerInterface $storeManager
+    ) {
+        $this->quoteLoader = $quoteLoader;
+        $this->itemBuilder = $itemBuilder;
+        $this->productLoader = $productLoader;
+        $this->storeManager = $storeManager;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function addItem($cartId, \Magento\Checkout\Service\V1\Data\Cart\Item $data)
+    {
+        $qty = $data->getQty();
+        if (!is_numeric($qty) || $qty <= 0) {
+            throw InputException::invalidFieldValue('qty', $qty);
+        }
+        $storeId = $this->storeManager->getStore()->getId();
+        /** @var \Magento\Sales\Model\Quote $quote */
+        $quote = $this->quoteLoader->load($cartId, $storeId);
+
+        $product = $this->productLoader->load($data->getSku());
+
+        try {
+            $quote->addProduct($product, $qty);
+            $quote->collectTotals()->save();
+        } catch (\Exception $e) {
+            throw new CouldNotSaveException('Could not add item to quote');
+        }
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function updateItem($cartId, $itemSku, \Magento\Checkout\Service\V1\Data\Cart\Item $data)
+    {
+        $qty = $data->getQty();
+        if (!is_numeric($qty) || $qty <= 0) {
+            throw InputException::invalidFieldValue('qty', $qty);
+        }
+        $storeId = $this->storeManager->getStore()->getId();
+        /** @var \Magento\Sales\Model\Quote $quote */
+        $quote = $this->quoteLoader->load($cartId, $storeId);
+        $product = $this->productLoader->load($itemSku);
+        $quoteItem = $quote->getItemByProduct($product);
+        if (!$quoteItem) {
+            throw new NoSuchEntityException("Cart $cartId doesn't contain product $itemSku");
+        }
+        $quoteItem->setData('qty', $qty);
+
+        try {
+            $quote->collectTotals()->save();
+        } catch (\Exception $e) {
+            throw new CouldNotSaveException('Could not update quote item');
+        }
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function removeItem($cartId, $itemSku)
+    {
+        $storeId = $this->storeManager->getStore()->getId();
+        /** @var \Magento\Sales\Model\Quote $quote */
+        $quote = $this->quoteLoader->load($cartId, $storeId);
+        $product = $this->productLoader->load($itemSku);
+        $quoteItem = $quote->getItemByProduct($product);
+        if (!$quoteItem) {
+            throw new NoSuchEntityException("Cart $cartId doesn't contain product $itemSku");
+        }
+        try {
+            $quote->removeItem($quoteItem->getId());
+            $quote->collectTotals()->save();
+        } catch (\Exception $e) {
+            throw new CouldNotSaveException('Could not remove item from quote');
+        }
+        return true;
+    }
+}
diff --git a/app/code/Magento/Checkout/Service/V1/Item/WriteServiceInterface.php b/app/code/Magento/Checkout/Service/V1/Item/WriteServiceInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..c733728512a0dc4d393f4485cdad5cbb96471e48
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/Item/WriteServiceInterface.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\Checkout\Service\V1\Item;
+
+interface WriteServiceInterface
+{
+    /**
+     * @param int $cartId
+     * @param \Magento\Checkout\Service\V1\Data\Cart\Item $data
+     * @return bool
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     * @throws \Magento\Framework\Exception\CouldNotSaveException
+     * @throws \Magento\Framework\Exception\InputException
+     */
+    public function addItem($cartId, \Magento\Checkout\Service\V1\Data\Cart\Item $data);
+
+    /**
+     * @param int $cartId
+     * @param string $itemSku
+     * @param \Magento\Checkout\Service\V1\Data\Cart\Item $data
+     * @return bool
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     * @throws \Magento\Framework\Exception\CouldNotSaveException
+     * @throws \Magento\Framework\Exception\InputException
+     */
+    public function updateItem($cartId, $itemSku, \Magento\Checkout\Service\V1\Data\Cart\Item $data);
+
+    /**
+     * @param int $cartId
+     * @param string $itemSku
+     * @return bool
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     * @throws \Magento\Framework\Exception\CouldNotSaveException
+     */
+    public function removeItem($cartId, $itemSku);
+}
diff --git a/app/code/Magento/Checkout/Service/V1/QuoteLoader.php b/app/code/Magento/Checkout/Service/V1/QuoteLoader.php
new file mode 100644
index 0000000000000000000000000000000000000000..7a83786c10539e5ca2baa9b2d0066b228586b7fc
--- /dev/null
+++ b/app/code/Magento/Checkout/Service/V1/QuoteLoader.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\Checkout\Service\V1;
+
+use \Magento\Framework\Exception\NoSuchEntityException;
+
+class QuoteLoader
+{
+    /**
+     * @var \Magento\Sales\Model\QuoteFactory
+     */
+    protected $quoteFactory;
+
+    /**
+     * @param \Magento\Sales\Model\QuoteFactory $quoteFactory
+     */
+    public function __construct(\Magento\Sales\Model\QuoteFactory $quoteFactory)
+    {
+        $this->quoteFactory = $quoteFactory;
+    }
+
+    /**
+     * @param int $cartId
+     * @param int $storeId
+     * @return \Magento\Sales\Model\Quote
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     */
+    public function load($cartId, $storeId)
+    {
+        $quote = $this->quoteFactory->create();
+        $quote->setStoreId($storeId)->load($cartId);
+        if (!$quote->getId()) {
+            throw NoSuchEntityException::singleField('cartId', $cartId);
+        }
+        return $quote;
+    }
+}
diff --git a/app/code/Magento/Checkout/composer.json b/app/code/Magento/Checkout/composer.json
index 024648037a01e6e064f3bc159be8b0cb9caae7eb..8517a00dd58315426a81f2d23b2b2485cab9b9cf 100644
--- a/app/code/Magento/Checkout/composer.json
+++ b/app/code/Magento/Checkout/composer.json
@@ -2,27 +2,27 @@
     "name": "magento/module-checkout",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-catalog-inventory": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-payment": "0.1.0-alpha89",
-        "magento/module-tax": "0.1.0-alpha89",
-        "magento/module-directory": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/module-gift-message": "0.1.0-alpha89",
-        "magento/module-wishlist": "0.1.0-alpha89",
-        "magento/module-weee": "0.1.0-alpha89",
-        "magento/module-page-cache": "0.1.0-alpha89",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-catalog-inventory": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-payment": "0.1.0-alpha90",
+        "magento/module-tax": "0.1.0-alpha90",
+        "magento/module-directory": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/module-gift-message": "0.1.0-alpha90",
+        "magento/module-wishlist": "0.1.0-alpha90",
+        "magento/module-weee": "0.1.0-alpha90",
+        "magento/module-page-cache": "0.1.0-alpha90",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Checkout/etc/di.xml b/app/code/Magento/Checkout/etc/di.xml
index 8f8a86386aa376376dfa3a1b1db298171c1a91e2..619a36b0ec90637105d00b5bff4caa28f959995b 100644
--- a/app/code/Magento/Checkout/etc/di.xml
+++ b/app/code/Magento/Checkout/etc/di.xml
@@ -41,4 +41,12 @@
             <argument name="storage" xsi:type="object">Magento\Checkout\Model\Session\Storage</argument>
         </arguments>
     </type>
+    <preference for="Magento\Checkout\Service\V1\Item\ReadServiceInterface" type="Magento\Checkout\Service\V1\Item\ReadService" />
+    <preference for="\Magento\Checkout\Service\V1\Item\WriteServiceInterface" type="Magento\Checkout\Service\V1\Item\WriteService" />
+    <preference for="\Magento\Checkout\Service\V1\Address\Shipping\ReadServiceInterface" type="Magento\Checkout\Service\V1\Address\Shipping\ReadService" />
+    <preference for="\Magento\Checkout\Service\V1\Address\Shipping\WriteServiceInterface" type="Magento\Checkout\Service\V1\Address\Shipping\WriteService" />
+    <preference for="\Magento\Checkout\Service\V1\Address\Billing\ReadServiceInterface" type="Magento\Checkout\Service\V1\Address\Billing\ReadService" />
+    <preference for="\Magento\Checkout\Service\V1\Address\Billing\WriteServiceInterface" type="Magento\Checkout\Service\V1\Address\Billing\WriteService" />
+    <preference for="Magento\Checkout\Service\V1\Cart\ReadServiceInterface" type="Magento\Checkout\Service\V1\Cart\ReadService" />
+    <preference for="\Magento\Checkout\Service\V1\Cart\WriteServiceInterface" type="Magento\Checkout\Service\V1\Cart\WriteService" />
 </config>
diff --git a/app/code/Magento/Checkout/etc/webapi.xml b/app/code/Magento/Checkout/etc/webapi.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c641c11faab6001266b42ad14daafb55cd5a9b0b
--- /dev/null
+++ b/app/code/Magento/Checkout/etc/webapi.xml
@@ -0,0 +1,100 @@
+<?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)
+ */
+-->
+<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../app/code/Magento/Webapi/etc/webapi.xsd">
+    <route url="/V1/carts/" method="POST">
+        <service class="Magento\Checkout\Service\V1\Cart\WriteServiceInterface" method="create"/>
+        <resources>
+            <resource ref="Magento_Sales::create" />
+        </resources>
+    </route>
+    <route url="/V1/carts/:cartId" method="PUT">
+        <service class="Magento\Checkout\Service\V1\Cart\WriteServiceInterface" method="assignCustomer"/>
+        <resources>
+            <resource ref="Magento_Sales::create" />
+        </resources>
+    </route>
+    <route url="/V1/carts/:cartId/items" method="GET">
+        <service class="Magento\Checkout\Service\V1\Item\ReadServiceInterface" method="getList"/>
+        <resources>
+            <resource ref="Magento_Catalog::products" />
+        </resources>
+    </route>
+    <route url="/V1/carts/:cartId/items" method="POST">
+        <service class="Magento\Checkout\Service\V1\Item\WriteServiceInterface" method="addItem"/>
+        <resources>
+            <resource ref="Magento_Catalog::products" />
+        </resources>
+    </route>
+    <route url="/V1/carts/:cartId/items/:itemSku" method="PUT">
+        <service class="Magento\Checkout\Service\V1\Item\WriteServiceInterface" method="updateItem"/>
+        <resources>
+            <resource ref="Magento_Catalog::products" />
+        </resources>
+    </route>
+    <route url="/V1/carts/:cartId/items/:itemSku" method="DELETE">
+        <service class="Magento\Checkout\Service\V1\Item\WriteServiceInterface" method="removeItem"/>
+        <resources>
+            <resource ref="Magento_Catalog::products" />
+        </resources>
+    </route>
+    <route url="/V1/carts/:cartId" method="GET">
+        <service class="Magento\Checkout\Service\V1\Cart\ReadServiceInterface" method="getCart"/>
+        <resources>
+            <resource ref="Magento_Catalog::products" />
+        </resources>
+    </route>
+    <route url="/V1/carts" method="PUT">
+        <service class="Magento\Checkout\Service\V1\Cart\ReadServiceInterface" method="getCartList"/>
+        <resources>
+            <resource ref="Magento_Catalog::products" />
+        </resources>
+    </route>
+    <route url="/V1/carts/:cartId/shipping-address" method="GET">
+        <service class="Magento\Checkout\Service\V1\Address\Shipping\ReadServiceInterface" method="getAddress"/>
+        <resources>
+            <resource ref="Magento_Sales::sales" />
+        </resources>
+    </route>
+    <route url="/V1/carts/:cartId/shipping-address" method="POST">
+        <service class="Magento\Checkout\Service\V1\Address\Shipping\WriteServiceInterface" method="setAddress"/>
+        <resources>
+            <resource ref="Magento_Sales::sales" />
+        </resources>
+    </route>
+    <route url="/V1/carts/:cartId/billing-address" method="GET">
+        <service class="Magento\Checkout\Service\V1\Address\Billing\ReadServiceInterface" method="getAddress"/>
+        <resources>
+            <resource ref="Magento_Sales::sales" />
+        </resources>
+    </route>
+    <route url="/V1/carts/:cartId/billing-address" method="POST">
+        <service class="Magento\Checkout\Service\V1\Address\Billing\WriteServiceInterface" method="setAddress"/>
+        <resources>
+            <resource ref="Magento_Sales::sales" />
+        </resources>
+    </route>
+</routes>
diff --git a/app/code/Magento/Checkout/view/frontend/templates/cart/minicart.phtml b/app/code/Magento/Checkout/view/frontend/templates/cart/minicart.phtml
index ebd7e0e0920864ae8272ea1f6959a76d1525bd57..8216a39c0f176a4ca9bc73246837d1efc65727d0 100644
--- a/app/code/Magento/Checkout/view/frontend/templates/cart/minicart.phtml
+++ b/app/code/Magento/Checkout/view/frontend/templates/cart/minicart.phtml
@@ -36,7 +36,7 @@
         <span class="counter qty<?php echo ($_cartQty > 0) ? '' : ' empty'; ?>"><?php echo ($_cartQty == 1) ? __('1 item') : __('%1 items',$_cartQty) ?></span>
     </a>
     <?php if ($this->getIsNeedToDisplaySideBar()): ?>
-        <div class="block minicart<?php echo ($_cartQty > 0) ? '' : ' empty'; ?>" <?php if ($this->getIsNeedToDisplaySideBar()): ?> data-mage-init='{"dropdownDialog":{"appendTo":"[data-block=minicart]", "triggerTarget":".showcart", "timeout": "2000", "triggerClass":"active", "parentClass":"active"}}'<?php endif ?>>
+        <div class="block block-minicart<?php echo ($_cartQty > 0) ? '' : ' empty'; ?>" <?php if ($this->getIsNeedToDisplaySideBar()): ?> data-mage-init='{"dropdownDialog":{"appendTo":"[data-block=minicart]", "triggerTarget":".showcart", "timeout": "2000", "triggerClass":"active", "parentClass":"active"}}'<?php endif ?>>
             <div class="title">
                 <strong>
                     <span class="text"><?php echo __('My Cart'); ?></span>
diff --git a/app/code/Magento/Checkout/view/frontend/templates/onepage/billing.phtml b/app/code/Magento/Checkout/view/frontend/templates/onepage/billing.phtml
index bdd25a6c7aa2893d87275f168cb65304f1e57d5f..5691c5ce71dabbb387cc070388384a8956d73f80 100644
--- a/app/code/Magento/Checkout/view/frontend/templates/onepage/billing.phtml
+++ b/app/code/Magento/Checkout/view/frontend/templates/onepage/billing.phtml
@@ -156,7 +156,7 @@
         <?php if ($customerAttributes): ?>
             <?php $customerAttributes->setEntityModelClass('Magento\Customer\Model\Customer')->setFieldIdFormat('billing:%1$s');?>
             <?php $customerAttributes->setFieldNameFormat('billing[%1$s]')->setShowContainer(false);?>
-            <?php echo $customerAttributes->setExcludeFileAttributes(true)->toHtml()?>
+            <?php echo $customerAttributes->toHtml()?>
         <?php endif;?>
         <div class="field password required">
             <label class="label" for="billing:customer_password"><span><?php echo __('Password') ?></span></label>
diff --git a/app/code/Magento/Checkout/view/frontend/templates/onepage/payment.phtml b/app/code/Magento/Checkout/view/frontend/templates/onepage/payment.phtml
index cfc0b4adde23b6992a0c54c66262bde91bc4faa6..d798a79f5b2ab40fcbc801d2a9cd9c10f812700b 100644
--- a/app/code/Magento/Checkout/view/frontend/templates/onepage/payment.phtml
+++ b/app/code/Magento/Checkout/view/frontend/templates/onepage/payment.phtml
@@ -26,7 +26,7 @@
     <?php echo $this->getBlockHtml('formkey') ?>
     <fieldset class="fieldset">
         <?php echo $this->getChildChildHtml('methods_additional') ?>
-        <div id="checkout-payment-method-load"><?php echo $this->getChildHtml('methods') ?></div>
+        <div id="checkout-payment-method-load" class="opc-payment"><?php echo $this->getChildHtml('methods') ?></div>
     </fieldset>
     <?php echo $this->getChildChildHtml('additional') ?>
     <div class="actions-toolbar" id="payment-buttons-container">
diff --git a/app/code/Magento/Checkout/view/frontend/templates/onepage/review/item.phtml b/app/code/Magento/Checkout/view/frontend/templates/onepage/review/item.phtml
index 309a7f7125ac5caf59b4795b313e0cbec8da262d..d303b4da48f53a096b7ca21a485715b55ef1a09f 100644
--- a/app/code/Magento/Checkout/view/frontend/templates/onepage/review/item.phtml
+++ b/app/code/Magento/Checkout/view/frontend/templates/onepage/review/item.phtml
@@ -29,7 +29,7 @@ $_item = $this->getItem();
 $_weeeHelper = $this->helper('Magento\Weee\Helper\Data');
 ?>
 <tr>
-    <td class="col item"><strong class="product name"><?php echo $this->escapeHtml($this->getProductName()) ?></strong>
+    <td class="col item" data-th="<?php echo $this->escapeHtml(__('Product Name'));?>"><strong class="product name"><?php echo $this->escapeHtml($this->getProductName()) ?></strong>
         <?php if ($_options = $this->getOptionList()):?>
         <dl class="review-item-options">
             <?php foreach ($_options as $_option) : ?>
@@ -54,7 +54,7 @@ $_weeeHelper = $this->helper('Magento\Weee\Helper\Data');
         <?php endif;?>
     </td>
     <?php if ($this->helper('Magento\Tax\Helper\Data')->displayCartPriceExclTax() || $this->helper('Magento\Tax\Helper\Data')->displayCartBothPrices()): ?>
-    <td class="col price excl tax">
+    <td class="col price excl tax" data-th="<?php echo $this->escapeHtml(__('Price'));?>">
         <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay(array(1, 4), 'sales') && $_item->getWeeeTaxAppliedAmount()): ?>
             <span class="cart tax total" data-tax-toggle='{"itemTaxId" : "#eunit-item-tax-details<?php echo $_item->getId(); ?>"}'>
         <?php else: ?>
@@ -138,9 +138,9 @@ $_weeeHelper = $this->helper('Magento\Weee\Helper\Data');
         <?php endif; ?>
     </td>
     <?php endif; ?>
-    <td class="col qty"><span class="qty"><?php echo $_item->getQty() ?></span></td>
+    <td class="col qty" data-th="<?php echo $this->escapeHtml(__('Qty'));?>"><span class="qty"><?php echo $_item->getQty() ?></span></td>
     <?php if ($this->helper('Magento\Tax\Helper\Data')->displayCartPriceExclTax() || $this->helper('Magento\Tax\Helper\Data')->displayCartBothPrices()): ?>
-    <td class="col subtotal excl tax">
+    <td class="col subtotal excl tax" data-th="<?php echo $this->escapeHtml(__('Subtotal'));?>">
         <?php if ($this->helper('Magento\Weee\Helper\Data')->typeOfDisplay(array(1, 4), 'sales') && $_item->getWeeeTaxAppliedAmount()): ?>
             <span class="cart tax total" data-tax-toggle='{"itemTaxId" : "#esubtotal-item-tax-details<?php echo $_item->getId(); ?>"}'>
         <?php else: ?>
diff --git a/app/code/Magento/Checkout/view/frontend/web/js/opc-checkout-method.js b/app/code/Magento/Checkout/view/frontend/web/js/opc-checkout-method.js
index 3cbfea4d169924bf96c2edd976d0645468e45587..5b5dfcf568ba1f7264628170326c698e21f0a2c9 100644
--- a/app/code/Magento/Checkout/view/frontend/web/js/opc-checkout-method.js
+++ b/app/code/Magento/Checkout/view/frontend/web/js/opc-checkout-method.js
@@ -44,6 +44,7 @@ define([
                 registerCustomerPasswordSelector: '#co-billing-form .field.password,#co-billing-form .field.confirm',
                 suggestRegistration: false
             },
+            pageMessages: '#maincontent .messages .message',
             sectionSelectorPrefix: 'opc-',
             billingSection: 'billing',
             ajaxLoaderPlaceButton: false,
@@ -174,6 +175,9 @@ define([
                 loginRegister   = $( checkout.loginRegisterSelector )[0],
                 method          = 'register',
                 action          = 'show';
+
+            //Remove page messages
+            $(this.options.pageMessages).remove();
             
             if (json.isGuestCheckoutAllowed) {
                 
@@ -288,5 +292,4 @@ define([
             }
         }
     });
-
 });
diff --git a/app/code/Magento/CheckoutAgreements/composer.json b/app/code/Magento/CheckoutAgreements/composer.json
index e7721e204233a98a39d928690cb9a3cdb3cef4a1..53612c3a15a997813e33bcaaa269bc37569b00f0 100644
--- a/app/code/Magento/CheckoutAgreements/composer.json
+++ b/app/code/Magento/CheckoutAgreements/composer.json
@@ -2,15 +2,15 @@
     "name": "magento/module-checkout-agreements",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-checkout": "0.1.0-alpha89",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-checkout": "0.1.0-alpha90",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/CheckoutAgreements/etc/adminhtml/acl.xml b/app/code/Magento/CheckoutAgreements/etc/acl.xml
similarity index 93%
rename from app/code/Magento/CheckoutAgreements/etc/adminhtml/acl.xml
rename to app/code/Magento/CheckoutAgreements/etc/acl.xml
index b51f0fe9565ca21d3feb1cc7e412891a1a43a4fe..5bedc875cd00189e02530c93fa1c139cdbac5a04 100644
--- a/app/code/Magento/CheckoutAgreements/etc/adminhtml/acl.xml
+++ b/app/code/Magento/CheckoutAgreements/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/Cms/composer.json b/app/code/Magento/Cms/composer.json
index 94f9e1f5d553c3b54cc1f271bfb2a8fb234dcaff..04e668fb805eb59e166610bb0692fa16cb451100 100644
--- a/app/code/Magento/Cms/composer.json
+++ b/app/code/Magento/Cms/composer.json
@@ -2,20 +2,20 @@
     "name": "magento/module-cms",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/module-widget": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-email": "0.1.0-alpha89",
-        "magento/module-install": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/module-widget": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-email": "0.1.0-alpha90",
+        "magento/module-install": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Cms/data/cms_setup/data-upgrade-1.6.0.0.0-1.6.0.0.1.php b/app/code/Magento/Cms/data/cms_setup/data-upgrade-1.6.0.0.0-1.6.0.0.1.php
index e01cc7508ba85bde88e6015d618a352875aa4f94..2ad56df0bea7e1b426cb3edd270b58e6d7cafaed 100644
--- a/app/code/Magento/Cms/data/cms_setup/data-upgrade-1.6.0.0.0-1.6.0.0.1.php
+++ b/app/code/Magento/Cms/data/cms_setup/data-upgrade-1.6.0.0.0-1.6.0.0.1.php
@@ -202,14 +202,6 @@ $pageContent = <<<EOD
             <th>PERSISTENT_SHOPPING_CART</th>
             <td>A link to information about your cart and viewing history if you have asked the site.</td>
         </tr>
-        <tr>
-            <th>POLL</th>
-            <td>The ID of any polls you have recently voted in.</td>
-        </tr>
-        <tr>
-            <th>POLLN</th>
-            <td>Information on what polls you have voted on.</td>
-        </tr>
         <tr>
             <th>RECENTLYCOMPARED</th>
             <td>The items that you have recently compared.            </td>
diff --git a/app/code/Magento/Cms/etc/adminhtml/acl.xml b/app/code/Magento/Cms/etc/acl.xml
similarity index 95%
rename from app/code/Magento/Cms/etc/adminhtml/acl.xml
rename to app/code/Magento/Cms/etc/acl.xml
index 59a0ca89f89be51f362f8ce5ef5ef5eca9742c69..c26880bbbbb3c3a00c2ae23e4b1636ee542c6ff6 100644
--- a/app/code/Magento/Cms/etc/adminhtml/acl.xml
+++ b/app/code/Magento/Cms/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/CmsUrlRewrite/composer.json b/app/code/Magento/CmsUrlRewrite/composer.json
index 8eb91f0ab2bd040010307bc1b454bc44e43bb228..091d2ae7c31be6d130677d19987b1a67a5b4e761 100644
--- a/app/code/Magento/CmsUrlRewrite/composer.json
+++ b/app/code/Magento/CmsUrlRewrite/composer.json
@@ -2,13 +2,13 @@
     "name": "magento/module-cms-url-rewrite",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-url-redirect": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89"
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-url-redirect": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/CatalogImportExport/Model/Export/Product/Type/Configurable.php b/app/code/Magento/ConfigurableImportExport/Model/Export/Product/Type/Configurable.php
similarity index 93%
rename from app/code/Magento/CatalogImportExport/Model/Export/Product/Type/Configurable.php
rename to app/code/Magento/ConfigurableImportExport/Model/Export/Product/Type/Configurable.php
index 290a8019075f8bb410404786897024572039dd28..8aa67371907e25425ada07984e1743924d21d7f0 100644
--- a/app/code/Magento/CatalogImportExport/Model/Export/Product/Type/Configurable.php
+++ b/app/code/Magento/ConfigurableImportExport/Model/Export/Product/Type/Configurable.php
@@ -21,7 +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\CatalogImportExport\Model\Export\Product\Type;
+namespace Magento\ConfigurableImportExport\Model\Export\Product\Type;
 
 class Configurable extends \Magento\CatalogImportExport\Model\Export\Product\Type\AbstractType
 {
diff --git a/app/code/Magento/CatalogImportExport/Model/Export/RowCustomizer.php b/app/code/Magento/ConfigurableImportExport/Model/Export/RowCustomizer.php
similarity index 96%
rename from app/code/Magento/CatalogImportExport/Model/Export/RowCustomizer.php
rename to app/code/Magento/ConfigurableImportExport/Model/Export/RowCustomizer.php
index 97db1a13b3ca669b676840703b7269062218cc39..280d3af873ba64ed0fae0c59d9e151217655bb9a 100644
--- a/app/code/Magento/CatalogImportExport/Model/Export/RowCustomizer.php
+++ b/app/code/Magento/ConfigurableImportExport/Model/Export/RowCustomizer.php
@@ -21,7 +21,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\CatalogImportExport\Model\Export;
+namespace Magento\ConfigurableImportExport\Model\Export;
+
+use \Magento\CatalogImportExport\Model\Export\RowCustomizerInterface;
 
 class RowCustomizer implements RowCustomizerInterface
 {
diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product/Type/Configurable.php b/app/code/Magento/ConfigurableImportExport/Model/Import/Product/Type/Configurable.php
similarity index 99%
rename from app/code/Magento/CatalogImportExport/Model/Import/Product/Type/Configurable.php
rename to app/code/Magento/ConfigurableImportExport/Model/Import/Product/Type/Configurable.php
index 8baafce4c66ea4ca5aa55de65f5b96a348590d09..ba6b3f4ddecc008244b9b8ad2ea204ffc1c1a955 100644
--- a/app/code/Magento/CatalogImportExport/Model/Import/Product/Type/Configurable.php
+++ b/app/code/Magento/ConfigurableImportExport/Model/Import/Product/Type/Configurable.php
@@ -1,7 +1,7 @@
 <?php
 /**
  * Import entity configurable product type model
- * 
+ *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -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\CatalogImportExport\Model\Import\Product\Type;
+namespace Magento\ConfigurableImportExport\Model\Import\Product\Type;
 
 class Configurable extends \Magento\CatalogImportExport\Model\Import\Product\Type\AbstractType
 {
diff --git a/app/code/Magento/ConfigurableImportExport/composer.json b/app/code/Magento/ConfigurableImportExport/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..f00320c5f0e6cc1b4c9f54c6b4b77609a4f44fab
--- /dev/null
+++ b/app/code/Magento/ConfigurableImportExport/composer.json
@@ -0,0 +1,23 @@
+{
+    "name": "magento/module-configurable-import-export",
+    "description": "N/A",
+    "require": {
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-catalog-import-export": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/module-import-export": "0.1.0-alpha90",
+        "magento/module-configurable-product": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90"
+    },
+    "type": "magento2-module",
+    "version": "0.1.0-alpha90",
+    "extra": {
+        "map": [
+            [
+                "*",
+                "Magento/ConfigurableImportExport"
+            ]
+        ]
+    }
+}
diff --git a/app/code/Magento/ConfigurableImportExport/etc/di.xml b/app/code/Magento/ConfigurableImportExport/etc/di.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e708ec578be5b21cb9f87ca96c42773738dd6f6e
--- /dev/null
+++ b/app/code/Magento/ConfigurableImportExport/etc/di.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 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
+    <type name="Magento\CatalogImportExport\Model\Export\RowCustomizer\Composite">
+        <arguments>
+            <argument name="customizers" xsi:type="array">
+                <item name="configurableProduct" xsi:type="string">Magento\ConfigurableImportExport\Model\Export\RowCustomizer</item>
+            </argument>
+        </arguments>
+    </type>
+</config>
diff --git a/app/code/Magento/ConfigurableImportExport/etc/export.xml b/app/code/Magento/ConfigurableImportExport/etc/export.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ff4060a99d80ab474945c4c6c400d12d8e470eb9
--- /dev/null
+++ b/app/code/Magento/ConfigurableImportExport/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 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../ImportExport/etc/export.xsd">
+    <entityType entity="catalog_product" name="configurable" model="Magento\ConfigurableImportExport\Model\Export\Product\Type\Configurable" />
+</config>
diff --git a/app/code/Magento/ConfigurableImportExport/etc/import.xml b/app/code/Magento/ConfigurableImportExport/etc/import.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0ae338bc6fe4dcdf469fd82a7060a3fda2970199
--- /dev/null
+++ b/app/code/Magento/ConfigurableImportExport/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 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../ImportExport/etc/import.xsd">
+    <entityType entity="catalog_product" name="configurable" model="Magento\ConfigurableImportExport\Model\Import\Product\Type\Configurable" />
+</config>
diff --git a/app/code/Magento/Authz/etc/module.xml b/app/code/Magento/ConfigurableImportExport/etc/module.xml
similarity index 76%
rename from app/code/Magento/Authz/etc/module.xml
rename to app/code/Magento/ConfigurableImportExport/etc/module.xml
index 6d155cc637440cc11cc49d37970c72c9f0a39d09..1d64d1dcc52bc2fac1efcb4222dd2b7b61345b93 100644
--- a/app/code/Magento/Authz/etc/module.xml
+++ b/app/code/Magento/ConfigurableImportExport/etc/module.xml
@@ -24,14 +24,13 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
-    <module name="Magento_Authz" schema_version="1.0.0.0" active="true">
-        <sequence>
-            <module name="Magento_User"/>
-        </sequence>
+    <module name="Magento_ConfigurableImportExport" schema_version="1.0.0.0" active="true">
         <depends>
-            <!--TODO: Dependency on Magento_User is temporary and should be eliminated when ACL is made global-->
-            <module name="Magento_User"/>
-            <module name="Magento_Backend"/>
+            <module name="Magento_Catalog"/>
+            <module name="Magento_Eav"/>
+            <module name="Magento_ImportExport"/>
+            <module name="Magento_CatalogImportExport"/>
+            <module name="Magento_ConfigurableProduct"/>
         </depends>
     </module>
 </config>
diff --git a/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php
index 040930fe74861d9a85b8d1f39104c61d16dc710d..9326f2db453f8bb29d8c86a848a6f63f62105744 100644
--- a/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php
+++ b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php
@@ -409,7 +409,7 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
      * @param \Magento\Catalog\Model\Product $product
      * @return \Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute\Collection
      */
-    public function getConfigurableAttributeCollection($product)
+    public function getConfigurableAttributeCollection(\Magento\Catalog\Model\Product $product)
     {
         return $this->_attributeCollectionFactory->create()->setProductFilter($product);
     }
@@ -537,8 +537,9 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
     /**
      * Save configurable product depended data
      *
-     * @param  \Magento\Catalog\Model\Product $product
+     * @param \Magento\Catalog\Model\Product $product
      * @return $this
+     * @throws \InvalidArgumentException
      */
     public function save($product)
     {
@@ -553,21 +554,26 @@ class Configurable extends \Magento\Catalog\Model\Product\Type\AbstractType
                 if (!$product->getIsDuplicate()) {
                     if (!empty($attributeData['id'])) {
                         $configurableAttribute->load($attributeData['id']);
-                    } else {
-                        $configurableAttribute->loadByProductAndAttribute(
-                            $product,
-                            $this->getAttributeById($attributeData['attribute_id'], $product)
+                        $attributeData['attribute_id'] = $configurableAttribute->getAttributeId();
+                    } elseif (!empty($attributeData['attribute_id'])) {
+                        $attribute = $this->_eavConfig->getAttribute(
+                            \Magento\Catalog\Model\Product::ENTITY, $attributeData['attribute_id']
                         );
+                        $attributeData['attribute_id'] = $attribute->getId();
+                        if (!$this->canUseAttribute($attribute)) {
+                            throw new \InvalidArgumentException(
+                                'Provided attribute can not be used with configurable product'
+                            );
+                        }
+                        $configurableAttribute->loadByProductAndAttribute($product, $attribute);
                     }
                 }
                 unset($attributeData['id']);
-                $configurableAttribute->addData(
-                    $attributeData
-                )->setStoreId(
-                    $product->getStoreId()
-                )->setProductId(
-                    $product->getId()
-                )->save();
+                $configurableAttribute
+                    ->addData($attributeData)
+                    ->setStoreId($product->getStoreId())
+                    ->setProductId($product->getId())
+                    ->save();
             }
             /** @var $configurableAttributesCollection \Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute\Collection  */
             $configurableAttributesCollection = $this->_attributeCollectionFactory->create();
diff --git a/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable/Attribute.php b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable/Attribute.php
index dc79a87d08438a0b440c5afd5f44604290da60a9..f00b3751617120444974f80a14e32b2f0bafeff5 100644
--- a/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable/Attribute.php
+++ b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable/Attribute.php
@@ -25,6 +25,8 @@
  */
 namespace Magento\ConfigurableProduct\Model\Product\Type\Configurable;
 
+use Magento\Framework\Model\Context;
+
 /**
  * @method Attribute _getResource()
  * @method Attribute getResource()
diff --git a/app/code/Magento/ConfigurableProduct/Model/Resource/Product/Type/Configurable/Attribute.php b/app/code/Magento/ConfigurableProduct/Model/Resource/Product/Type/Configurable/Attribute.php
index a84a84b5745658acd750655e81cdb6afb429a9f0..b832a6c8c4e08ec151c93db0694bd63a225a7e0e 100644
--- a/app/code/Magento/ConfigurableProduct/Model/Resource/Product/Type/Configurable/Attribute.php
+++ b/app/code/Magento/ConfigurableProduct/Model/Resource/Product/Type/Configurable/Attribute.php
@@ -25,6 +25,8 @@
  */
 namespace Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable;
 
+use Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute as ConfigurableAttribute;
+
 class Attribute extends \Magento\Framework\Model\Resource\Db\AbstractDb
 {
     /**
@@ -349,4 +351,74 @@ class Attribute extends \Magento\Framework\Model\Resource\Db\AbstractDb
         );
         $this->_getWriteAdapter()->query($this->_getReadAdapter()->deleteFromSelect($select, $this->getMainTable()));
     }
+
+    /**
+     * @param \Magento\Framework\Model\AbstractModel $object
+     * @return $this
+     */
+    protected function _afterLoad(\Magento\Framework\Model\AbstractModel $object)
+    {
+        parent::_afterLoad($object);
+        $this->loadLabel($object);
+        $this->loadPrices($object);
+        return $this;
+    }
+
+    /**
+     * Load label for configurable attribute
+     *
+     * @param ConfigurableAttribute $object
+     * @return $this
+     */
+    protected function loadLabel(ConfigurableAttribute $object)
+    {
+        $storeId = (int)$this->_storeManager->getStore()->getId();
+        $connection = $this->_getReadAdapter();
+        $useDefaultCheck = $connection
+            ->getCheckSql('store.use_default IS NULL', 'def.use_default', 'store.use_default');
+        $labelCheck = $connection->getCheckSql('store.value IS NULL', 'def.value', 'store.value');
+        $select = $connection
+            ->select()
+            ->from(array('def' => $this->_labelTable))
+            ->joinLeft(
+                array('store' => $this->_labelTable),
+                $connection->quoteInto(
+                    'store.product_super_attribute_id = def.product_super_attribute_id AND store.store_id = ?',
+                    $storeId
+                ),
+                array('use_default' => $useDefaultCheck, 'label' => $labelCheck)
+            )
+            ->where('def.product_super_attribute_id = ?', $object->getId())
+            ->where('def.store_id = ?', 0);
+
+        $data = $connection->fetchRow($select);
+        $object->setLabel($data['label']);
+        $object->setUseDefault($data['use_default']);
+        return $this;
+    }
+
+    /**
+     * Load prices for configurable attribute
+     *
+     * @param ConfigurableAttribute $object
+     * @return $this
+     */
+    protected function loadPrices(ConfigurableAttribute $object)
+    {
+        $websiteId = $this->_catalogData->isPriceGlobal() ? 0 : (int)$this->_storeManager->getStore()->getWebsiteId();
+        $select = $this->_getReadAdapter()->select()
+            ->from($this->_priceTable)
+            ->where('product_super_attribute_id = ?', $object->getId())
+            ->where('website_id = ?', $websiteId);
+
+        foreach ($select->query() as $row) {
+            $data = [
+                'value_index'   => $row['value_index'],
+                'is_percent'    => $row['is_percent'],
+                'pricing_value' => $row['pricing_value'],
+            ];
+            $object->addPrice($data);
+        }
+        return $this;
+    }
 }
diff --git a/app/code/Magento/ConfigurableProduct/Service/V1/Data/ConfigurableAttribute.php b/app/code/Magento/ConfigurableProduct/Service/V1/Data/Option.php
similarity index 76%
rename from app/code/Magento/ConfigurableProduct/Service/V1/Data/ConfigurableAttribute.php
rename to app/code/Magento/ConfigurableProduct/Service/V1/Data/Option.php
index 99e92729f394e705900da888d17d7aa82561537a..0a723a8b6f2afcda292b50e95d905f5e4692c83e 100644
--- a/app/code/Magento/ConfigurableProduct/Service/V1/Data/ConfigurableAttribute.php
+++ b/app/code/Magento/ConfigurableProduct/Service/V1/Data/Option.php
@@ -23,14 +23,25 @@
  */
 namespace Magento\ConfigurableProduct\Service\V1\Data;
 
-class ConfigurableAttribute extends \Magento\Framework\Service\Data\AbstractObject
+class Option extends \Magento\Framework\Service\Data\AbstractObject
 {
+    /**#@+
+     * Constants defined for keys of array
+     */
     const ID = 'id';
+
     const LABEL = 'label';
+
+    const TYPE = 'type';
+
     const USE_DEFAULT = 'use_default';
+
     const POSITION = 'position';
+
     const VALUES = 'values';
+
     const ATTRIBUTE_ID = 'attribute_id';
+    /**#@-*/
 
     /**
      * @return int|null
@@ -41,7 +52,7 @@ class ConfigurableAttribute extends \Magento\Framework\Service\Data\AbstractObje
     }
 
     /**
-     * @return string
+     * @return string|null
      */
     public function getAttributeId()
     {
@@ -56,6 +67,22 @@ class ConfigurableAttribute extends \Magento\Framework\Service\Data\AbstractObje
         return $this->_get(self::LABEL);
     }
 
+    /**
+     * @return string|null
+     */
+    public function getType()
+    {
+        return $this->_get(self::TYPE);
+    }
+
+    /**
+     * @return int|null
+     */
+    public function getPosition()
+    {
+        return $this->_get(self::POSITION);
+    }
+
     /**
      * @return bool|null
      */
@@ -65,7 +92,7 @@ class ConfigurableAttribute extends \Magento\Framework\Service\Data\AbstractObje
     }
 
     /**
-     * @return \Magento\ConfigurableProduct\Service\V1\Data\ConfigurableAttribute\Value[]
+     * @return \Magento\ConfigurableProduct\Service\V1\Data\Option\Value[]|null
      */
     public function getValues()
     {
diff --git a/app/code/Magento/ConfigurableProduct/Service/V1/Data/ConfigurableAttribute/Value.php b/app/code/Magento/ConfigurableProduct/Service/V1/Data/Option/Value.php
similarity index 82%
rename from app/code/Magento/ConfigurableProduct/Service/V1/Data/ConfigurableAttribute/Value.php
rename to app/code/Magento/ConfigurableProduct/Service/V1/Data/Option/Value.php
index 6b88e10b4ac8b6f335ced46690ecc0e14087c1d8..0ecd1e149249f14f08f983a4cb54857304893e3b 100644
--- a/app/code/Magento/ConfigurableProduct/Service/V1/Data/ConfigurableAttribute/Value.php
+++ b/app/code/Magento/ConfigurableProduct/Service/V1/Data/Option/Value.php
@@ -1,6 +1,4 @@
 <?php
-namespace Magento\ConfigurableProduct\Service\V1\Data\ConfigurableAttribute;
-
 /**
  * Magento
  *
@@ -23,11 +21,14 @@ namespace Magento\ConfigurableProduct\Service\V1\Data\ConfigurableAttribute;
  * @copyright   Copyright (c) 2014 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\Service\V1\Data\Option;
+
 class Value extends \Magento\Framework\Service\Data\AbstractObject
 {
-    const INDEX = 'value_index';
-    const PRICE = 'pricing_value';
-    const PRICE_IS_PERCENT = 'is_percent';
+    const INDEX = 'index';
+    const PRICE = 'price';
+    const IS_PERCENT = 'percent';
 
     /**
      * @return float|null
@@ -40,9 +41,9 @@ class Value extends \Magento\Framework\Service\Data\AbstractObject
     /**
      * @return int|null
      */
-    public function getPriceIsPercent()
+    public function isPercent()
     {
-        return $this->_get(self::PRICE_IS_PERCENT);
+        return $this->_get(self::IS_PERCENT);
     }
 
     /**
diff --git a/app/code/Magento/ConfigurableProduct/Service/V1/Data/ConfigurableAttribute/ValueBuilder.php b/app/code/Magento/ConfigurableProduct/Service/V1/Data/Option/ValueBuilder.php
similarity index 88%
rename from app/code/Magento/ConfigurableProduct/Service/V1/Data/ConfigurableAttribute/ValueBuilder.php
rename to app/code/Magento/ConfigurableProduct/Service/V1/Data/Option/ValueBuilder.php
index 511e1c33b15f7296a58870a5e4e0afc10ab8237f..f113fde85bf72b276abc06bede385d2fd0748180 100644
--- a/app/code/Magento/ConfigurableProduct/Service/V1/Data/ConfigurableAttribute/ValueBuilder.php
+++ b/app/code/Magento/ConfigurableProduct/Service/V1/Data/Option/ValueBuilder.php
@@ -21,7 +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\ConfigurableProduct\Service\V1\Data\ConfigurableAttribute;
+namespace Magento\ConfigurableProduct\Service\V1\Data\Option;
 
 use Magento\Framework\Service\Data\AbstractObjectBuilder;
 
@@ -40,9 +40,9 @@ class ValueBuilder extends AbstractObjectBuilder
      * @param int $value 
      * @return self 
      */
-    public function setPriceIsPercent($value)
+    public function setPercent($value)
     {
-        return $this->_set(Value::PRICE_IS_PERCENT, $value);
+        return $this->_set(Value::IS_PERCENT, $value);
     }
 
     /**
diff --git a/app/code/Magento/ConfigurableProduct/Service/V1/Data/Option/ValueConverter.php b/app/code/Magento/ConfigurableProduct/Service/V1/Data/Option/ValueConverter.php
new file mode 100644
index 0000000000000000000000000000000000000000..202c6f19b1f2c6bfbf716034af7d58de89ad6493
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/Service/V1/Data/Option/ValueConverter.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\ConfigurableProduct\Service\V1\Data\Option;
+
+class ValueConverter
+{
+    /**
+     * @param Value $value
+     * @return array
+     */
+    public function convertArrayFromData(Value $value)
+    {
+        return [
+            'value_index' => $value->getIndex(),
+            'is_percent' => $value->isPercent(),
+            'pricing_value' => $value->getPrice(),
+        ];
+    }
+}
diff --git a/app/code/Magento/ConfigurableProduct/Service/V1/Data/ConfigurableAttributeBuilder.php b/app/code/Magento/ConfigurableProduct/Service/V1/Data/OptionBuilder.php
similarity index 58%
rename from app/code/Magento/ConfigurableProduct/Service/V1/Data/ConfigurableAttributeBuilder.php
rename to app/code/Magento/ConfigurableProduct/Service/V1/Data/OptionBuilder.php
index a50a266156f4f1a7bd39c0ca8b30f1a9c7d107ed..e720f3e8213fa8f3e9f710dd8aad2fda2a0e67c3 100644
--- a/app/code/Magento/ConfigurableProduct/Service/V1/Data/ConfigurableAttributeBuilder.php
+++ b/app/code/Magento/ConfigurableProduct/Service/V1/Data/OptionBuilder.php
@@ -23,50 +23,68 @@
  */
 namespace Magento\ConfigurableProduct\Service\V1\Data;
 
-class ConfigurableAttributeBuilder extends \Magento\Framework\Service\Data\AbstractObjectBuilder
+class OptionBuilder extends \Magento\Framework\Service\Data\AbstractObjectBuilder
 {
     /**
-     * @param int $value 
-     * @return self 
+     * @param int $value
+     * @return $this
      */
     public function setId($value)
     {
-        return $this->_set(ConfigurableAttribute::ID, $value);
+        return $this->_set(Option::ID, $value);
     }
 
     /**
      * @param string $value
-     * @return self 
+     * @return $this
      */
     public function setAttributeId($value)
     {
-        return $this->_set(ConfigurableAttribute::ATTRIBUTE_ID, $value);
+        return $this->_set(Option::ATTRIBUTE_ID, $value);
     }
 
     /**
-     * @param string $value 
-     * @return self 
+     * @param string $value
+     * @return $this
      */
     public function setLabel($value)
     {
-        return $this->_set(ConfigurableAttribute::LABEL, $value);
+        return $this->_set(Option::LABEL, $value);
+    }
+
+    /**
+     * @param int $value
+     * @return $this
+     */
+    public function setPosition($value)
+    {
+        return $this->_set(Option::POSITION, $value);
     }
 
     /**
      * @param bool $value 
      * @return self 
      */
-    public function useDefault($value)
+    public function setType($value)
     {
-        return $this->_set(ConfigurableAttribute::USE_DEFAULT, $value);
+        return $this->_set(Option::TYPE, $value);
     }
 
     /**
-     * @param \Magento\ConfigurableProduct\Service\V1\Data\ConfigurableAttribute\Value[] $value 
-     * @return self 
+     * @param bool $value
+     * @return $this
+     */
+    public function setUseDefault($value)
+    {
+        return $this->_set(Option::USE_DEFAULT, $value);
+    }
+
+    /**
+     * @param \Magento\ConfigurableProduct\Service\V1\Data\Option\Value[] $value
+     * @return $this
      */
     public function setValues($value)
     {
-        return $this->_set(ConfigurableAttribute::VALUES, $value);
+        return $this->_set(Option::VALUES, $value);
     }
 }
diff --git a/app/code/Magento/ConfigurableProduct/Service/V1/Data/OptionConverter.php b/app/code/Magento/ConfigurableProduct/Service/V1/Data/OptionConverter.php
new file mode 100644
index 0000000000000000000000000000000000000000..d50d21f1f612bef7a1426acf4558a4e1a8a9e20e
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/Service/V1/Data/OptionConverter.php
@@ -0,0 +1,152 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Data;
+
+use Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute;
+use Magento\ConfigurableProduct\Model\Product\Type\Configurable\AttributeFactory;
+use Magento\ConfigurableProduct\Service\V1\Data\Option\ValueBuilder;
+use Magento\ConfigurableProduct\Service\V1\Data\Option;
+use Magento\ConfigurableProduct\Service\V1\Data\Option\ValueConverter;
+
+class OptionConverter
+{
+    /**
+     * @var \Magento\ConfigurableProduct\Service\V1\Data\OptionBuilder
+     */
+    protected $optionBuilder;
+
+    /**
+     * @var \Magento\ConfigurableProduct\Service\V1\Data\Option\ValueBuilder
+     */
+    protected $valueBuilder;
+
+    /**
+     * @var \Magento\ConfigurableProduct\Model\Product\Type\Configurable\AttributeFactory
+     */
+    private $attributeFactory;
+
+    /**
+     * @var \Magento\ConfigurableProduct\Service\V1\Data\Option\ValueConverter
+     */
+    private $valueConverter;
+
+    /**
+     * @param OptionBuilder $optionBuilder
+     * @param ValueBuilder $valueBuilder
+     * @param AttributeFactory $attributeFactory
+     * @param ValueConverter $valueConverter
+     */
+    public function __construct(
+        OptionBuilder $optionBuilder,
+        ValueBuilder $valueBuilder,
+        AttributeFactory $attributeFactory,
+        ValueConverter $valueConverter
+    ) {
+        $this->optionBuilder = $optionBuilder;
+        $this->valueBuilder = $valueBuilder;
+        $this->attributeFactory = $attributeFactory;
+        $this->valueConverter = $valueConverter;
+    }
+
+    /**
+     * Convert configurable attribute to option data object
+     *
+     * @param Attribute $configurableAttribute
+     * @return \Magento\ConfigurableProduct\Service\V1\Data\Option
+     */
+    public function convertFromModel(Attribute $configurableAttribute)
+    {
+        $values = [];
+        $prices = $configurableAttribute->getPrices();
+        if (is_array($prices)) {
+            foreach ($prices as $price) {
+                $values[] = $this->valueBuilder
+                    ->setIndex($price['value_index'])
+                    ->setPrice($price['pricing_value'])
+                    ->setPercent($price['is_percent'])
+                    ->create();
+            }
+        }
+
+        $data = [
+            Option::ID => $configurableAttribute->getId(),
+            Option::ATTRIBUTE_ID => $configurableAttribute->getAttributeId(),
+            Option::LABEL => $configurableAttribute->getLabel(),
+            Option::TYPE => $configurableAttribute->getProductAttribute()->getFrontend()->getInputType(),
+            Option::POSITION => $configurableAttribute->getPosition(),
+            Option::USE_DEFAULT => $configurableAttribute->getData('use_default'),
+            Option::VALUES => $values
+        ];
+
+        return $this->optionBuilder->populateWithArray($data)->create();
+    }
+
+    /**
+     * @param Option $option
+     * @return array
+     */
+    public function convertArrayFromData(Option $option)
+    {
+        $values = [];
+        if (is_array($option->getValues())) {
+            foreach ($option->getValues() as $value) {
+                $values[] = $this->valueConverter->convertArrayFromData($value);
+            }
+        }
+        return [
+            'attribute_id' => $option->getAttributeId(),
+            'position' => $option->getPosition(),
+            'use_default' => $option->isUseDefault(),
+            'label' => $option->getLabel(),
+            'values' => $values
+        ];
+    }
+
+    /**
+     * @param Option $option
+     * @param Attribute $configurableAttribute
+     * @return Attribute
+     */
+    public function getModelFromData(Option $option, Attribute $configurableAttribute)
+    {
+        /** @var \Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute $returnConfigurableAttribute */
+        $returnConfigurableAttribute = $this->attributeFactory->create();
+        $returnConfigurableAttribute->setData($configurableAttribute->getData());
+        $returnConfigurableAttribute->addData($option->__toArray());
+        $returnConfigurableAttribute->setId($configurableAttribute->getId());
+        $returnConfigurableAttribute->setAttributeId($configurableAttribute->getAttributeId());
+        $returnConfigurableAttribute->setValues($configurableAttribute->getPrices());
+
+        $values = $option->getValues();
+        if (!is_null($values)) {
+            $prices = [];
+            foreach ($values as $value) {
+                $prices[] = $this->valueConverter->convertArrayFromData($value);
+            }
+            $returnConfigurableAttribute->setValues($prices);
+        }
+
+        return $returnConfigurableAttribute;
+    }
+}
diff --git a/app/code/Magento/ConfigurableProduct/Service/V1/Product/Option/ReadService.php b/app/code/Magento/ConfigurableProduct/Service/V1/Product/Option/ReadService.php
new file mode 100644
index 0000000000000000000000000000000000000000..57b4e17625fe614b81b148fc1415e15ae11abd48
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/Service/V1/Product/Option/ReadService.php
@@ -0,0 +1,144 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Product\Option;
+
+use Magento\Catalog\Model\ProductRepository;
+use Magento\Catalog\Model\System\Config\Source\Inputtype as InputType;
+use Magento\Catalog\Service\V1\Data\Product;
+use Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute\Collection;
+use Magento\ConfigurableProduct\Service\V1\Data\Option;
+use Magento\ConfigurableProduct\Service\V1\Data\OptionConverter;
+use Magento\Framework\Exception\NoSuchEntityException;
+use Magento\Webapi\Exception;
+use Magento\ConfigurableProduct\Model\Product\Type\Configurable as ConfigurableType;
+
+class ReadService implements ReadServiceInterface
+{
+    /**
+     * @var OptionConverter
+     */
+    private $optionConverter;
+    /**
+     * @var ProductRepository
+     */
+    private $productRepository;
+    /**
+     * @var ConfigurableType
+     */
+    private $configurableType;
+    /**
+     * @var InputType
+     */
+    private $inputType;
+
+    /**
+     * @param ProductRepository $productRepository
+     * @param OptionConverter $optionConverter
+     * @param ConfigurableType $configurableType
+     * @param InputType $inputType
+     */
+    public function __construct(
+        ProductRepository $productRepository,
+        OptionConverter $optionConverter,
+        ConfigurableType $configurableType,
+        InputType $inputType
+    ) {
+        $this->productRepository = $productRepository;
+        $this->optionConverter = $optionConverter;
+        $this->configurableType = $configurableType;
+        $this->inputType = $inputType;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function get($productSku, $optionId)
+    {
+        $product = $this->getProduct($productSku);
+        $collection = $this->getConfigurableAttributesCollection($product);
+        $collection->addFieldToFilter($collection->getResource()->getIdFieldName(), $optionId);
+        /** @var \Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute $configurableAttribute */
+        $configurableAttribute = $collection->getFirstItem();
+        if (!$configurableAttribute->getId()) {
+            throw new NoSuchEntityException(sprintf('Requested option doesn\'t exist: %s', $optionId));
+        }
+        return $this->optionConverter->convertFromModel($configurableAttribute);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getList($productSku)
+    {
+        $options = [];
+        $product = $this->getProduct($productSku);
+        foreach ($this->getConfigurableAttributesCollection($product) as $option) {
+            $options[] = $this->optionConverter->convertFromModel($option);
+        }
+        return $options;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function getTypes()
+    {
+        return array_map(
+            function ($inputType) {
+                return $inputType['value'];
+            },
+            $this->inputType->toOptionArray()
+        );
+    }
+
+    /**
+     * Retrieve product instance by sku
+     *
+     * @param string $productSku
+     * @return \Magento\Catalog\Model\Product
+     * @throws \Magento\Webapi\Exception
+     */
+    private function getProduct($productSku)
+    {
+        $product = $this->productRepository->get($productSku);
+        if (ConfigurableType::TYPE_CODE !== $product->getTypeId()) {
+            throw new Exception(
+                sprintf('Only implemented for configurable product: %s', $productSku),
+                Exception::HTTP_FORBIDDEN
+            );
+        }
+        return $product;
+    }
+
+    /**
+     * Retrieve configurable attribute collection through product object
+     *
+     * @param \Magento\Catalog\Model\Product $product
+     * @return Collection
+     */
+    private function getConfigurableAttributesCollection(\Magento\Catalog\Model\Product $product)
+    {
+        return $this->configurableType->getConfigurableAttributeCollection($product);
+    }
+}
diff --git a/app/code/Magento/ConfigurableProduct/Service/V1/Product/Option/ReadServiceInterface.php b/app/code/Magento/ConfigurableProduct/Service/V1/Product/Option/ReadServiceInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..1cfd5c2d8e801692c7d70e9e68d2b44c7910ad52
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/Service/V1/Product/Option/ReadServiceInterface.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\ConfigurableProduct\Service\V1\Product\Option;
+
+interface ReadServiceInterface
+{
+
+    /**
+     * Get option for configurable product
+     *
+     * @param string $productSku
+     * @param int $optionId
+     * @return \Magento\ConfigurableProduct\Service\V1\Data\Option
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     * @throws \Magento\Webapi\Exception
+     */
+    public function get($productSku, $optionId);
+
+    /**
+     * Get all options for configurable product
+     *
+     * @param string $productSku
+     * @return \Magento\ConfigurableProduct\Service\V1\Data\Option[]
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     * @throws \Magento\Webapi\Exception
+     */
+    public function getList($productSku);
+
+    /**
+     * Get all available option types for configurable product
+     *
+     * @return string[]
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     * @throws \Magento\Webapi\Exception
+     */
+    public function getTypes();
+}
diff --git a/app/code/Magento/ConfigurableProduct/Service/V1/Product/Option/WriteService.php b/app/code/Magento/ConfigurableProduct/Service/V1/Product/Option/WriteService.php
new file mode 100644
index 0000000000000000000000000000000000000000..9a5dcbf2446b7367cdeb11104f7c751b1f35e212
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/Service/V1/Product/Option/WriteService.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\ConfigurableProduct\Service\V1\Product\Option;
+
+use Magento\Catalog\Model\ProductRepository;
+use Magento\ConfigurableProduct\Service\V1\Data\Option;
+use Magento\ConfigurableProduct\Service\V1\Data\OptionConverter;
+use Magento\ConfigurableProduct\Model\Product\Type\Configurable\AttributeFactory as ConfigurableAttributeFactory;
+use Magento\ConfigurableProduct\Model\Product\Type\Configurable as ConfigurableType;
+use Magento\Eav\Model\Config as EavConfig;
+use Magento\Catalog\Model\Product;
+use Magento\Catalog\Model\Product\Type as ProductType;
+use Magento\Store\Model\Store;
+use Magento\Store\Model\StoreManagerInterface;
+use Magento\Framework\Exception\InputException;
+use Magento\Framework\Exception\NoSuchEntityException;
+use Magento\Framework\Exception\CouldNotSaveException;
+use Magento\Webapi\Exception;
+
+/**
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
+class WriteService implements WriteServiceInterface
+{
+    /**
+     * @var \Magento\Catalog\Model\ProductRepository
+     */
+    protected $productRepository;
+
+    /**
+     * @var ConfigurableAttributeFactory
+     */
+    protected $configurableAttributeFactory;
+
+    /**
+     * Eav config
+     *
+     * @var EavConfig
+     */
+    protected $eavConfig;
+
+    /**
+     * @var \Magento\ConfigurableProduct\Service\V1\Data\OptionConverter
+     */
+    protected $optionConverter;
+
+    /**
+     * @var StoreManagerInterface
+     */
+    protected $storeManager;
+
+    /**
+     * @var \Magento\ConfigurableProduct\Model\Product\Type\Configurable
+     */
+    private $productType;
+
+    /**
+     * @param ProductRepository $productRepository
+     * @param ConfigurableAttributeFactory $configurableAttributeFactory
+     * @param EavConfig $eavConfig
+     * @param OptionConverter $optionConverter
+     * @param StoreManagerInterface $storeManager
+     * @param ConfigurableType $productType
+     */
+    public function __construct(
+        ProductRepository $productRepository,
+        ConfigurableAttributeFactory $configurableAttributeFactory,
+        EavConfig $eavConfig,
+        OptionConverter $optionConverter,
+        StoreManagerInterface $storeManager,
+        ConfigurableType $productType
+    ) {
+        $this->productRepository = $productRepository;
+        $this->configurableAttributeFactory = $configurableAttributeFactory;
+        $this->eavConfig = $eavConfig;
+        $this->optionConverter = $optionConverter;
+        $this->storeManager = $storeManager;
+        $this->productType = $productType;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function add($productSku, Option $option)
+    {
+        $product = $this->productRepository->get($productSku);
+        $allowedTypes = [ProductType::TYPE_SIMPLE, ProductType::TYPE_VIRTUAL, ConfigurableType::TYPE_CODE];
+        if (!in_array($product->getTypeId(), $allowedTypes)) {
+            throw new \InvalidArgumentException('Incompatible product type');
+        }
+
+        $eavAttribute = $this->eavConfig->getAttribute(Product::ENTITY, $option->getAttributeId());
+
+        /** @var $configurableAttribute \Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute */
+        $configurableAttribute = $this->configurableAttributeFactory->create();
+        $configurableAttribute->loadByProductAndAttribute($product, $eavAttribute);
+        if ($configurableAttribute->getId()) {
+            throw new CouldNotSaveException('Product already has this option');
+        }
+
+        try {
+            $product->setTypeId(ConfigurableType::TYPE_CODE);
+            $product->setConfigurableAttributesData([$this->optionConverter->convertArrayFromData($option)]);
+            $product->setStoreId($this->storeManager->getStore(Store::ADMIN_CODE)->getId());
+            $product->save();
+        } catch (\Exception $e) {
+            throw new CouldNotSaveException('An error occurred while saving option');
+        }
+
+        $configurableAttribute = $this->configurableAttributeFactory->create();
+        $configurableAttribute->loadByProductAndAttribute($product, $eavAttribute);
+        if (!$configurableAttribute->getId()) {
+            throw new CouldNotSaveException('An error occurred while saving option');
+        }
+
+        return $configurableAttribute->getId();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function update($productSku, $optionId, Option $option)
+    {
+        $product = $this->getProduct($productSku);
+
+        $configurableAttribute = $this->configurableAttributeFactory->create();
+        $configurableAttribute->load($optionId);
+        if (!$configurableAttribute->getId() || $configurableAttribute->getProductId() != $product->getId()) {
+            throw new NoSuchEntityException('Option with id "%1" not found', [$optionId]);
+        }
+        $configurableAttribute = $this->optionConverter->getModelFromData($option, $configurableAttribute);
+        try {
+            $configurableAttribute->save();
+        } catch (\Exception $e) {
+            throw new CouldNotSaveException('Could not update option with id "%1"', [$optionId]);
+        }
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function remove($productSku, $optionId)
+    {
+        $product = $this->getProduct($productSku);
+
+        $attributeCollection = $this->productType->getConfigurableAttributeCollection($product);
+        /** @var \Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute $option */
+        $option = $attributeCollection->getItemById($optionId);
+
+        if ($option === null) {
+            throw new NoSuchEntityException('Requested option doesn\'t exist');
+        }
+        $option->delete();
+
+        return true;
+    }
+
+    /**
+     * @param string $productSku
+     * @return \Magento\Catalog\Model\Product
+     * @throws \Magento\Webapi\Exception
+     */
+    private function getProduct($productSku)
+    {
+        $product = $this->productRepository->get($productSku);
+        if (ConfigurableType::TYPE_CODE !== $product->getTypeId()) {
+            throw new Exception(
+                'Product with specified sku: "%1" is not a configurable product',
+                Exception::HTTP_FORBIDDEN,
+                Exception::HTTP_FORBIDDEN,
+                [
+                    $product->getSku()
+                ]
+            );
+        }
+        return $product;
+    }
+}
diff --git a/app/code/Magento/ConfigurableProduct/Service/V1/Product/Option/WriteServiceInterface.php b/app/code/Magento/ConfigurableProduct/Service/V1/Product/Option/WriteServiceInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..4b01d72194bfdc482fe5b4b39876f9fd309b8254
--- /dev/null
+++ b/app/code/Magento/ConfigurableProduct/Service/V1/Product/Option/WriteServiceInterface.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\ConfigurableProduct\Service\V1\Product\Option;
+
+interface WriteServiceInterface
+{
+    /**
+     * Add option to the product
+     *
+     * @param string $productSku
+     * @param \Magento\ConfigurableProduct\Service\V1\Data\Option $option
+     * @return int
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     * @throws \Magento\Framework\Exception\CouldNotSaveException
+     * @throws \InvalidArgumentException
+     */
+    public function add($productSku, \Magento\ConfigurableProduct\Service\V1\Data\Option $option);
+
+    /**
+     * @param string $productSku
+     * @param int $optionId
+     * @param \Magento\ConfigurableProduct\Service\V1\Data\Option $option
+     * @return bool
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     * @throws \Magento\Webapi\Exception
+     */
+    public function update($productSku, $optionId, \Magento\ConfigurableProduct\Service\V1\Data\Option $option);
+
+    /**
+     * Remove option from configurable product
+     *
+     * @param string $productSku
+     * @param int $optionId
+     * @return bool
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     * @throws \Magento\Webapi\Exception
+     */
+    public function remove($productSku, $optionId);
+}
diff --git a/app/code/Magento/ConfigurableProduct/Service/V1/ReadService.php b/app/code/Magento/ConfigurableProduct/Service/V1/ReadService.php
index d79190379d38b2a7a4bd79fa89cd80ac2db69679..6e00dd933b8f69de89065c652abf9fa5ce2bfbb9 100644
--- a/app/code/Magento/ConfigurableProduct/Service/V1/ReadService.php
+++ b/app/code/Magento/ConfigurableProduct/Service/V1/ReadService.php
@@ -63,9 +63,9 @@ class ReadService implements ReadServiceInterface
     /**
      * {@inheritdoc}
      */
-    public function generateVariation(Product $product, $configurableAttributes)
+    public function generateVariation(Product $product, $options)
     {
-        $attributes = $this->getAttributesForMatrix($configurableAttributes);
+        $attributes = $this->getAttributesForMatrix($options);
         $variations = $this->variationMatrix->getVariations($attributes);
         $products = $this->populateProductVariation($product, $variations, $attributes);
         return $products;
@@ -74,18 +74,18 @@ class ReadService implements ReadServiceInterface
     /**
      * Prepare attribute info for variation matrix generation
      *
-     * @param \Magento\ConfigurableProduct\Service\V1\Data\ConfigurableAttribute[] $configurableAttributes
+     * @param \Magento\ConfigurableProduct\Service\V1\Data\Option[] $options
      * @return array
      */
-    private function getAttributesForMatrix($configurableAttributes)
+    private function getAttributesForMatrix($options)
     {
         $attributes = [];
-        foreach ($configurableAttributes as $configurableAttribute) {
-            $configurable = $configurableAttribute->__toArray();
-            $attribute = $this->attributeReadService->info($configurableAttribute->getAttributeId());
+        foreach ($options as $option) {
+            $configurable = $option->__toArray();
+            $attribute = $this->attributeReadService->info($option->getAttributeId());
             $configurable['options'] = $attribute->__toArray()['options'];
             $configurable['attribute_code'] = $attribute->getAttributeCode();
-            $attributes[$configurableAttribute->getAttributeId()] = $configurable;
+            $attributes[$option->getAttributeId()] = $configurable;
         }
         return $attributes;
     }
@@ -113,7 +113,7 @@ class ReadService implements ReadServiceInterface
                 );
                 $priceInfo = $valueInfo['price'];
                 $price += (!empty($priceInfo['is_percent']) ? $product->getPrice() / 100.0 : 1.0)
-                    * $priceInfo['pricing_value'];
+                    * $priceInfo['price'];
             }
             $this->productBuilder->setPrice($price);
             $this->productBuilder->setName($product->getName() . $suffix);
diff --git a/app/code/Magento/ConfigurableProduct/Service/V1/ReadServiceInterface.php b/app/code/Magento/ConfigurableProduct/Service/V1/ReadServiceInterface.php
index 49ac8f1ff90f143624ab5a3baf68a2a170ed60de..7b4bd51b405195b0bfd142ab209bc7bcfd42c349 100644
--- a/app/code/Magento/ConfigurableProduct/Service/V1/ReadServiceInterface.php
+++ b/app/code/Magento/ConfigurableProduct/Service/V1/ReadServiceInterface.php
@@ -29,11 +29,11 @@ interface ReadServiceInterface
      * Generate variation based on same product
      *
      * @param \Magento\Catalog\Service\V1\Data\Product $product
-     * @param \Magento\ConfigurableProduct\Service\V1\Data\ConfigurableAttribute[] $configurableAttributes
+     * @param \Magento\ConfigurableProduct\Service\V1\Data\Option[] $options
      * @return \Magento\Catalog\Service\V1\Data\Product[]
      */
     public function generateVariation(
         \Magento\Catalog\Service\V1\Data\Product $product,
-        $configurableAttributes
+        $options
     );
 }
diff --git a/app/code/Magento/ConfigurableProduct/composer.json b/app/code/Magento/ConfigurableProduct/composer.json
index 27f4fed2b11a94f298b5974b161d3ce8233daecd..7c456e44c9bf28422583c540c79e183279df6656 100644
--- a/app/code/Magento/ConfigurableProduct/composer.json
+++ b/app/code/Magento/ConfigurableProduct/composer.json
@@ -2,26 +2,26 @@
     "name": "magento/module-configurable-product",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-catalog-inventory": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-checkout": "0.1.0-alpha89",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-catalog-rule": "0.1.0-alpha89",
-        "magento/module-directory": "0.1.0-alpha89",
-        "magento/module-weee": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
-        "magento/module-webapi": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-catalog-inventory": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-checkout": "0.1.0-alpha90",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-catalog-rule": "0.1.0-alpha90",
+        "magento/module-directory": "0.1.0-alpha90",
+        "magento/module-weee": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
+        "magento/module-webapi": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/ConfigurableProduct/etc/di.xml b/app/code/Magento/ConfigurableProduct/etc/di.xml
index 472fdd85bdc1eb857a6c76bd10c34545d5588c82..447c8e94c509bfbfff9b018306715d8dedf0e8ed 100644
--- a/app/code/Magento/ConfigurableProduct/etc/di.xml
+++ b/app/code/Magento/ConfigurableProduct/etc/di.xml
@@ -24,9 +24,12 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
+    <preference for="Magento\ConfigurableProduct\Service\V1\Product\Option\WriteServiceInterface" type="Magento\ConfigurableProduct\Service\V1\Product\Option\WriteService" />
     <preference for="Magento\ConfigurableProduct\Service\V1\Product\Link\ReadServiceInterface" type="Magento\ConfigurableProduct\Service\V1\Product\Link\ReadService" />
     <preference for="Magento\ConfigurableProduct\Service\V1\Product\Link\WriteServiceInterface" type="Magento\ConfigurableProduct\Service\V1\Product\Link\WriteService" />
     <preference for="Magento\ConfigurableProduct\Service\V1\ReadServiceInterface" type="Magento\ConfigurableProduct\Service\V1\ReadService" />
+    <preference for="Magento\ConfigurableProduct\Service\V1\Product\Option\ReadServiceInterface" type="Magento\ConfigurableProduct\Service\V1\Product\Option\ReadService" />
+    <preference for="Magento\ConfigurableProduct\Service\V1\Product\Option\Type\ReadServiceInterface" type="Magento\ConfigurableProduct\Service\V1\Product\Option\Type\ReadService" />
     <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>
diff --git a/app/code/Magento/ConfigurableProduct/etc/webapi.xml b/app/code/Magento/ConfigurableProduct/etc/webapi.xml
index fd11c2f6b29fa57723920d2784465e14c0596480..315bcd1423e5f51e06b4d85cc02b222067f92dce 100644
--- a/app/code/Magento/ConfigurableProduct/etc/webapi.xml
+++ b/app/code/Magento/ConfigurableProduct/etc/webapi.xml
@@ -49,4 +49,40 @@
             <resource ref="Magento_Catalog::products" />
         </resources>
     </route>
+    <route url="/V1/configurable-products/:productSku/options/:optionId" method="GET">
+        <service class="Magento\ConfigurableProduct\Service\V1\Product\Option\ReadServiceInterface" method="get"/>
+        <resources>
+            <resource ref="Magento_Catalog::products"/>
+        </resources>
+    </route>
+    <route url="/V1/configurable-products/:productSku/options/all" method="GET">
+        <service class="Magento\ConfigurableProduct\Service\V1\Product\Option\ReadServiceInterface" method="getList"/>
+        <resources>
+            <resource ref="Magento_Catalog::products"/>
+        </resources>
+    </route>
+    <route url="/V1/configurable-products/options/types" method="GET">
+        <service class="Magento\ConfigurableProduct\Service\V1\Product\Option\ReadServiceInterface" method="getTypes" />
+        <resources>
+            <resource ref="Magento_Catalog::products" />
+        </resources>
+    </route>
+    <route url="/V1/configurable-products/:productSku/options" method="POST">
+        <service class="Magento\ConfigurableProduct\Service\V1\Product\Option\WriteServiceInterface" method="add" />
+        <resources>
+            <resource ref="Magento_Catalog::products" />
+        </resources>
+    </route>
+    <route url="/V1/configurable-products/:productSku/options/:optionId" method="PUT">
+        <service class="Magento\ConfigurableProduct\Service\V1\Product\Option\WriteServiceInterface" method="update" />
+        <resources>
+            <resource ref="Magento_Catalog::products" />
+        </resources>
+    </route>
+    <route url="/V1/configurable-products/:productSku/options/:optionId" method="DELETE">
+        <service class="Magento\ConfigurableProduct\Service\V1\Product\Option\WriteServiceInterface" method="remove" />
+        <resources>
+            <resource ref="Magento_Catalog::products" />
+        </resources>
+    </route>
 </routes>
diff --git a/app/code/Magento/Contact/composer.json b/app/code/Magento/Contact/composer.json
index 067e82511f5de133ff1f837c874ad0168c3d290f..acae9e53d5a3228280868721addb709934ce6e24 100644
--- a/app/code/Magento/Contact/composer.json
+++ b/app/code/Magento/Contact/composer.json
@@ -2,16 +2,16 @@
     "name": "magento/module-contact",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-cms": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-cms": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Contact/etc/adminhtml/acl.xml b/app/code/Magento/Contact/etc/acl.xml
similarity index 94%
rename from app/code/Magento/Contact/etc/adminhtml/acl.xml
rename to app/code/Magento/Contact/etc/acl.xml
index d957ae0cd5a164df613a774876e407616865c17b..4a8bd27964d7f4756b27c6423c568d35504c9c5e 100644
--- a/app/code/Magento/Contact/etc/adminhtml/acl.xml
+++ b/app/code/Magento/Contact/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/Core/composer.json b/app/code/Magento/Core/composer.json
index 1cef33c57154dcb4f9aee70a08ac58415b89c9a6..a79885d900b343214c090c181dcb9edfbe411b2f 100644
--- a/app/code/Magento/Core/composer.json
+++ b/app/code/Magento/Core/composer.json
@@ -2,19 +2,19 @@
     "name": "magento/module-core",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-cron": "0.1.0-alpha89",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/module-page-cache": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-cron": "0.1.0-alpha90",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/module-page-cache": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "lib-libxml": "*",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Core/data/core_setup/data-upgrade-1.6.0.4-1.6.0.5.php b/app/code/Magento/Core/data/core_setup/data-upgrade-1.6.0.4-1.6.0.5.php
index 56d23dbff9d8fae065f6ca1a11968dc43316fef1..0e03bc5a2968dce92f79d85308f294377aebf0d2 100644
--- a/app/code/Magento/Core/data/core_setup/data-upgrade-1.6.0.4-1.6.0.5.php
+++ b/app/code/Magento/Core/data/core_setup/data-upgrade-1.6.0.4-1.6.0.5.php
@@ -26,7 +26,7 @@
 $installer = $this;
 $installer->startSetup();
 
-$tableName = $installer->getTable('admin_rule');
+$tableName = $installer->getTable('authorization_rule');
 if ($tableName) {
     $installer->getConnection()->delete($tableName, array('resource_id = ?' => 'admin/system/tools/compiler'));
 }
diff --git a/app/code/Magento/Cron/composer.json b/app/code/Magento/Cron/composer.json
index a46386ee521500672cd26852394bf31cb6fb7dfb..24bb9c00e22f3659c7d7ba57746d204855777ef0 100644
--- a/app/code/Magento/Cron/composer.json
+++ b/app/code/Magento/Cron/composer.json
@@ -2,14 +2,14 @@
     "name": "magento/module-cron",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/CurrencySymbol/composer.json b/app/code/Magento/CurrencySymbol/composer.json
index a47864769f579f33d621b72bcca3a3b407804709..616e2e5509aadfc2472601672770e95cbb2d37dd 100644
--- a/app/code/Magento/CurrencySymbol/composer.json
+++ b/app/code/Magento/CurrencySymbol/composer.json
@@ -2,17 +2,17 @@
     "name": "magento/module-currency-symbol",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-page-cache": "0.1.0-alpha89",
-        "magento/module-directory": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-page-cache": "0.1.0-alpha90",
+        "magento/module-directory": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/CurrencySymbol/etc/adminhtml/acl.xml b/app/code/Magento/CurrencySymbol/etc/acl.xml
similarity index 94%
rename from app/code/Magento/CurrencySymbol/etc/adminhtml/acl.xml
rename to app/code/Magento/CurrencySymbol/etc/acl.xml
index 001ddce966885517db2fbc4e1cf9667e984088e6..5afa8f8b167f171105ec81bccc936c6af3150462 100644
--- a/app/code/Magento/CurrencySymbol/etc/adminhtml/acl.xml
+++ b/app/code/Magento/CurrencySymbol/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/Customer/Model/Authorization/CustomerSessionUserContext.php b/app/code/Magento/Customer/Model/Authorization/CustomerSessionUserContext.php
new file mode 100644
index 0000000000000000000000000000000000000000..4fa7209e97906a26b136d339ce9ff18ad1b834a4
--- /dev/null
+++ b/app/code/Magento/Customer/Model/Authorization/CustomerSessionUserContext.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\Customer\Model\Authorization;
+
+use Magento\Authorization\Model\UserContextInterface;
+use Magento\Customer\Model\Session as CustomerSession;
+
+/**
+ * Session-based customer user context
+ */
+class CustomerSessionUserContext implements UserContextInterface
+{
+    /**
+     * @var CustomerSession
+     */
+    protected $_customerSession;
+
+    /**
+     * Initialize dependencies.
+     *
+     * @param CustomerSession $customerSession
+     */
+    public function __construct(
+        CustomerSession $customerSession
+    ) {
+        $this->_customerSession = $customerSession;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getUserId()
+    {
+        return $this->_customerSession->getId();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getUserType()
+    {
+        return UserContextInterface::USER_TYPE_CUSTOMER;
+    }
+}
diff --git a/app/code/Magento/Customer/Model/Plugin/CustomerAuthorization.php b/app/code/Magento/Customer/Model/Plugin/CustomerAuthorization.php
new file mode 100644
index 0000000000000000000000000000000000000000..d75d2f4d91e6f650569021a2ef23e0903af50c84
--- /dev/null
+++ b/app/code/Magento/Customer/Model/Plugin/CustomerAuthorization.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\Customer\Model\Plugin;
+
+use Magento\Authorization\Model\UserContextInterface;
+use Magento\Integration\Service\V1\AuthorizationServiceInterface as AuthorizationService;
+
+/**
+ * Plugin around \Magento\Framework\Authorization::isAllowed
+ *
+ * Plugin to allow customer users to access resources with self permission
+ */
+class CustomerAuthorization
+{
+    /**
+     * @var UserContextInterface
+     */
+    protected $userContext;
+
+    /**
+     * Inject dependencies.
+     *
+     * @param UserContextInterface $userContext
+     */
+    public function __construct(UserContextInterface $userContext)
+    {
+        $this->userContext = $userContext;
+    }
+
+    /**
+     * Check if resource for which access is needed has self permissions defined in webapi config.
+     *
+     * @param \Magento\Framework\Authorization $subject
+     * @param callable $proceed
+     * @param string $resource
+     * @param string $privilege
+     *
+     * @return bool true If resource permission is self, to allow
+     * customer access without further checks in parent method
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+     */
+    public function aroundIsAllowed(
+        \Magento\Framework\Authorization $subject,
+        \Closure $proceed,
+        $resource,
+        $privilege = null
+    ) {
+        if ($resource == AuthorizationService::PERMISSION_SELF
+            && $this->userContext->getUserId()
+            && $this->userContext->getUserType() === UserContextInterface::USER_TYPE_CUSTOMER
+        ) {
+            return true;
+        } else {
+            return $proceed($resource, $privilege);
+        }
+    }
+}
diff --git a/app/code/Magento/Customer/Model/Resource/Address.php b/app/code/Magento/Customer/Model/Resource/Address.php
index 756b65d6fefea88423be14e71dc9a1831f210011..c86f39abb472b858bbafcee5f1448928d29326e8 100644
--- a/app/code/Magento/Customer/Model/Resource/Address.php
+++ b/app/code/Magento/Customer/Model/Resource/Address.php
@@ -25,6 +25,8 @@
  */
 namespace Magento\Customer\Model\Resource;
 
+use \Magento\Framework\Exception\InputException;
+
 class Address extends \Magento\Eav\Model\Entity\AbstractEntity
 {
     /**
@@ -140,7 +142,12 @@ class Address extends \Magento\Eav\Model\Entity\AbstractEntity
         $validator = $this->_validatorFactory->createValidator('customer_address', 'save');
 
         if (!$validator->isValid($address)) {
-            throw new \Magento\Framework\Validator\ValidatorException($validator->getMessages());
+            throw new \Magento\Framework\Validator\ValidatorException(
+                InputException::DEFAULT_MESSAGE,
+                [],
+                null,
+                $validator->getMessages()
+            );
         }
     }
 
diff --git a/app/code/Magento/Customer/Model/Resource/Customer.php b/app/code/Magento/Customer/Model/Resource/Customer.php
index 663754c47e06fbb5d89be2db34897db6197dd715..b4e646ba88c827b98eda94e7756ed7fc6709c9d8 100644
--- a/app/code/Magento/Customer/Model/Resource/Customer.php
+++ b/app/code/Magento/Customer/Model/Resource/Customer.php
@@ -23,6 +23,8 @@
  */
 namespace Magento\Customer\Model\Resource;
 
+use \Magento\Framework\Exception\InputException;
+
 /**
  * Customer entity resource model
  */
@@ -174,7 +176,12 @@ class Customer extends \Magento\Eav\Model\Entity\AbstractEntity
         $validator = $this->_validatorFactory->createValidator('customer', 'save');
 
         if (!$validator->isValid($customer)) {
-            throw new \Magento\Framework\Validator\ValidatorException($validator->getMessages());
+            throw new \Magento\Framework\Validator\ValidatorException(
+                InputException::DEFAULT_MESSAGE,
+                [],
+                null,
+                $validator->getMessages()
+            );
         }
     }
 
diff --git a/app/code/Magento/Customer/Model/Session.php b/app/code/Magento/Customer/Model/Session.php
index b98cad217d009ac8e7c33cbc39bb90bccd27930b..5b847f192ad4a1062fa3bde6fc86678f8be1673a 100755
--- a/app/code/Magento/Customer/Model/Session.php
+++ b/app/code/Magento/Customer/Model/Session.php
@@ -547,12 +547,11 @@ class Session extends \Magento\Framework\Session\SessionManager
     /**
      * Reset core session hosts after reseting session ID
      *
-     * @param bool $deleteOldSession
      * @return $this
      */
-    public function regenerateId($deleteOldSession = true)
+    public function regenerateId()
     {
-        parent::regenerateId($deleteOldSession);
+        parent::regenerateId();
         $this->_cleanHosts();
         return $this;
     }
diff --git a/app/code/Magento/Customer/Service/V1/CustomerAccountService.php b/app/code/Magento/Customer/Service/V1/CustomerAccountService.php
index be9307eff68ca0fca9c13e94d4c965a70e0c1199..5a14411d22d21702485d3f48d132b19d0dff7542 100644
--- a/app/code/Magento/Customer/Service/V1/CustomerAccountService.php
+++ b/app/code/Magento/Customer/Service/V1/CustomerAccountService.php
@@ -278,10 +278,10 @@ class CustomerAccountService implements CustomerAccountServiceInterface
 
         $this->eventManager->dispatch('customer_login', array('customer' => $customerModel));
 
-        $customerDto = $this->converter->createCustomerFromModel($customerModel);
-        $this->eventManager->dispatch('customer_data_object_login', array('customer' => $customerDto));
+        $customerData = $this->converter->createCustomerFromModel($customerModel);
+        $this->eventManager->dispatch('customer_data_object_login', array('customer' => $customerData));
 
-        return $customerDto;
+        return $customerData;
     }
 
     /**
diff --git a/app/code/Magento/Customer/Service/V1/CustomerMetadataService.php b/app/code/Magento/Customer/Service/V1/CustomerMetadataService.php
index 1551885f9575441dbbd135ff6d4a8aa40c1c65f4..ae79cc3044e330078537f63f5fda8a421900c83c 100644
--- a/app/code/Magento/Customer/Service/V1/CustomerMetadataService.php
+++ b/app/code/Magento/Customer/Service/V1/CustomerMetadataService.php
@@ -226,7 +226,7 @@ class CustomerMetadataService implements CustomerMetadataServiceInterface
         }
         $validationRules = [];
         foreach ($attribute->getValidateRules() as $name => $value) {
-            $validationRules[$name] = $this->_validationRuleBuilder->setName($name)
+            $validationRules[] = $this->_validationRuleBuilder->setName($name)
                 ->setValue($value)
                 ->create();
         }
@@ -243,6 +243,7 @@ class CustomerMetadataService implements CustomerMetadataServiceInterface
             ->setOptions($options)
             ->setFrontendClass($attribute->getFrontend()->getClass())
             ->setFrontendLabel($attribute->getFrontendLabel())
+            ->setBackendType($attribute->getBackendType())
             ->setNote($attribute->getNote())
             ->setIsSystem($attribute->getIsSystem())
             ->setIsUserDefined($attribute->getIsUserDefined())
diff --git a/app/code/Magento/Customer/Service/V1/Data/Eav/AttributeMetadata.php b/app/code/Magento/Customer/Service/V1/Data/Eav/AttributeMetadata.php
index c9ba34c2d77d9cd120ac14f3da603d82568a1bda..4ba3c371fcb15e73580eb4a4343225496844c690 100644
--- a/app/code/Magento/Customer/Service/V1/Data/Eav/AttributeMetadata.php
+++ b/app/code/Magento/Customer/Service/V1/Data/Eav/AttributeMetadata.php
@@ -51,7 +51,7 @@ class AttributeMetadata extends \Magento\Framework\Service\Data\AbstractObject
 
     const DATA_MODEL = 'data_model';
 
-    const IS_USER_DEFINED = 'is_user_defined';
+    const USER_DEFINED = 'user_defined';
 
     const FRONTEND_CLASS = 'frontend_class';
 
@@ -59,7 +59,7 @@ class AttributeMetadata extends \Magento\Framework\Service\Data\AbstractObject
 
     const FRONTEND_LABEL = 'frontend_label';
 
-    const IS_SYSTEM = 'is_system';
+    const SYSTEM = 'system';
 
     const NOTE = 'note';
 
@@ -184,7 +184,7 @@ class AttributeMetadata extends \Magento\Framework\Service\Data\AbstractObject
      */
     public function isUserDefined()
     {
-        return $this->_get(self::IS_USER_DEFINED);
+        return $this->_get(self::USER_DEFINED);
     }
 
     /**
@@ -224,7 +224,7 @@ class AttributeMetadata extends \Magento\Framework\Service\Data\AbstractObject
      */
     public function isSystem()
     {
-        return $this->_get(self::IS_SYSTEM);
+        return $this->_get(self::SYSTEM);
     }
 
     /**
diff --git a/app/code/Magento/Customer/Service/V1/Data/Eav/AttributeMetadataBuilder.php b/app/code/Magento/Customer/Service/V1/Data/Eav/AttributeMetadataBuilder.php
index e45d018fad67e1472c3c6a095dbab85c0343f1a9..ef50ab9a124a1cdf2e076b9ffd8491d71dad5999 100644
--- a/app/code/Magento/Customer/Service/V1/Data/Eav/AttributeMetadataBuilder.php
+++ b/app/code/Magento/Customer/Service/V1/Data/Eav/AttributeMetadataBuilder.php
@@ -188,7 +188,7 @@ class AttributeMetadataBuilder extends \Magento\Framework\Service\Data\AbstractO
      */
     public function setIsUserDefined($isUserDefined)
     {
-        return $this->_set(AttributeMetadata::IS_USER_DEFINED, $isUserDefined);
+        return $this->_set(AttributeMetadata::USER_DEFINED, $isUserDefined);
     }
 
     /**
@@ -221,7 +221,7 @@ class AttributeMetadataBuilder extends \Magento\Framework\Service\Data\AbstractO
      */
     public function setIsSystem($isSystem)
     {
-        return $this->_set(AttributeMetadata::IS_SYSTEM, $isSystem);
+        return $this->_set(AttributeMetadata::SYSTEM, $isSystem);
     }
 
     /**
diff --git a/app/code/Magento/Customer/composer.json b/app/code/Magento/Customer/composer.json
index 020cabb48bc29f3519154a11cfd0fc216a7c0776..883e23e784e9ee2e0369faec341817f65c643a0e 100644
--- a/app/code/Magento/Customer/composer.json
+++ b/app/code/Magento/Customer/composer.json
@@ -2,28 +2,30 @@
     "name": "magento/module-customer",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/module-directory": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-newsletter": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-checkout": "0.1.0-alpha89",
-        "magento/module-wishlist": "0.1.0-alpha89",
-        "magento/module-index": "0.1.0-alpha89",
-        "magento/module-log": "0.1.0-alpha89",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-review": "0.1.0-alpha89",
-        "magento/module-tax": "0.1.0-alpha89",
-        "magento/module-page-cache": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/module-directory": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-newsletter": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-checkout": "0.1.0-alpha90",
+        "magento/module-wishlist": "0.1.0-alpha90",
+        "magento/module-index": "0.1.0-alpha90",
+        "magento/module-log": "0.1.0-alpha90",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-review": "0.1.0-alpha90",
+        "magento/module-tax": "0.1.0-alpha90",
+        "magento/module-page-cache": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
+        "magento/module-authorization": "0.1.0-alpha90",
+        "magento/module-integration": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Customer/etc/adminhtml/acl.xml b/app/code/Magento/Customer/etc/acl.xml
similarity index 95%
rename from app/code/Magento/Customer/etc/adminhtml/acl.xml
rename to app/code/Magento/Customer/etc/acl.xml
index 392c11a8359822096fe8e5250bed380851d6c4d3..0544b9cd0e6145bee3c61b552f46e4178eb642fe 100644
--- a/app/code/Magento/Customer/etc/adminhtml/acl.xml
+++ b/app/code/Magento/Customer/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/Customer/etc/di.xml b/app/code/Magento/Customer/etc/di.xml
index 186380578ca14412a01a0dce55f3ad608f77af21..f84399e87a6a733bdb24cefc127bd63299b7d0ef 100644
--- a/app/code/Magento/Customer/etc/di.xml
+++ b/app/code/Magento/Customer/etc/di.xml
@@ -68,7 +68,7 @@
     <type name="Magento\Customer\Service\V1\Data\Eav\AttributeMetadataBuilder" shared="false" />
     <type name="Magento\Customer\Service\V1\Data\Eav\OptionBuilder" shared="false" />
     <type name="Magento\Customer\Service\V1\Data\RegionBuilder" shared="false" />
-    <type name="Magento\Customer\Service\V1\Data\Response\CreateCustomerAccountResponseBuilder" shared="false" />
+    <!--<type name="Magento\Customer\Service\V1\Data\Response\CreateCustomerAccountResponseBuilder" shared="false" />-->
     <type name="Magento\Customer\Service\V1\Data\SearchResultsBuilder" shared="false" />
     <type name="Magento\Eav\Model\Entity\Setup\PropertyMapper\Composite">
         <arguments>
diff --git a/app/code/Magento/Customer/etc/module.xml b/app/code/Magento/Customer/etc/module.xml
index 91d05a2966cf107b31e14d6c4d22dcce28c0d688..57366ea6e061a25f1def4716e32ca3cca75bb4e4 100644
--- a/app/code/Magento/Customer/etc/module.xml
+++ b/app/code/Magento/Customer/etc/module.xml
@@ -30,6 +30,7 @@
             <module name="Magento_Directory"/>
         </sequence>
         <depends>
+            <module name="Magento_Authorization"/>
             <module name="Magento_Store"/>
             <module name="Magento_Eav"/>
             <module name="Magento_Directory"/>
@@ -46,6 +47,7 @@
             <module name="Magento_Review"/>
             <module name="Magento_Tax"/>
             <module name="Magento_PageCache"/>
+            <module name="Magento_Integration"/>
         </depends>
     </module>
 </config>
diff --git a/app/code/Magento/Customer/etc/webapi.xml b/app/code/Magento/Customer/etc/webapi.xml
index 2d2179ffa7a68ed8ae0b628dbc0e4dcb5c35cc7a..842e90b8f04453da101e35e4c897621ef6a1b21b 100644
--- a/app/code/Magento/Customer/etc/webapi.xml
+++ b/app/code/Magento/Customer/etc/webapi.xml
@@ -161,7 +161,7 @@
             <resource ref="self"/>
         </resources>
         <data>
-            <parameter name="customerId" force="true" source="session" method="getUserId">null</parameter>
+            <parameter name="customerId" force="true">%customer_id%</parameter>
         </data>
     </route>
     <route url="/V1/customerAccounts/:customerId/customer" method="GET">
diff --git a/app/code/Magento/Customer/etc/webapi_rest/di.xml b/app/code/Magento/Customer/etc/webapi_rest/di.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8eb5b6d92bad5930a8c69df36d255cf2cdea565b
--- /dev/null
+++ b/app/code/Magento/Customer/etc/webapi_rest/di.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 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
+     <type name="Magento\Framework\Authorization">
+        <plugin name="customerAuthorization" type="Magento\Customer\Model\Plugin\CustomerAuthorization" />
+    </type>
+    <type name="Magento\Customer\Model\Session">
+        <arguments>
+            <argument name="sessionName" xsi:type="string">frontend</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Authorization\Model\CompositeUserContext">
+        <arguments>
+            <argument name="userContexts" xsi:type="array">
+                <item name="customerSessionUserContext" xsi:type="array">
+                    <item name="type" xsi:type="object">Magento\Customer\Model\Authorization\CustomerSessionUserContext</item>
+                    <item name="sortOrder" xsi:type="string">20</item>
+                </item>
+            </argument>
+        </arguments>
+    </type>
+</config>
diff --git a/app/code/Magento/Authz/etc/adminhtml/di.xml b/app/code/Magento/Customer/etc/webapi_soap/di.xml
similarity index 86%
rename from app/code/Magento/Authz/etc/adminhtml/di.xml
rename to app/code/Magento/Customer/etc/webapi_soap/di.xml
index d4a583c57f7a178984b26b10c37522f64871271d..2b574a8f2377a89077515e46ed75e79491d3a200 100644
--- a/app/code/Magento/Authz/etc/adminhtml/di.xml
+++ b/app/code/Magento/Customer/etc/webapi_soap/di.xml
@@ -24,5 +24,7 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
-    <preference for="Magento\Authz\Model\UserLocatorInterface" type="Magento\Authz\Model\UserLocator\Admin"/>
+     <type name="Magento\Framework\Authorization">
+        <plugin name="customerAuthorization" type="Magento\Customer\Model\Plugin\CustomerAuthorization" />
+    </type>
 </config>
diff --git a/app/code/Magento/Customer/view/frontend/templates/account/customer.phtml b/app/code/Magento/Customer/view/frontend/templates/account/customer.phtml
index d4be822c8c8dd78bebbe1856a90214a3ab4871c2..81f3c80517d47e7f6df14184cbf4a0443c87bd14 100644
--- a/app/code/Magento/Customer/view/frontend/templates/account/customer.phtml
+++ b/app/code/Magento/Customer/view/frontend/templates/account/customer.phtml
@@ -23,13 +23,13 @@
  */
 ?>
 <?php if($this->customerLoggedIn()): ?>
-    <li class="customer welcome">
+    <li class="customer welcome customer-welcome">
         <span class="customer name" data-toggle="dropdown">
             <span><?php echo $this->getCustomerName(); ?></span>
             <button type="button" class="action switch"><span><?php echo __('Change')?></span></button>
         </span>
         <?php if($this->getChildHtml()):?>
-        <div class="customer menu" data-target="dropdown">
+        <div class="customer menu customer-menu" data-target="dropdown">
             <?php echo $this->getChildHtml();?>
         </div>
         <?php endif; ?>
diff --git a/app/code/Magento/Customer/view/frontend/web/address.js b/app/code/Magento/Customer/view/frontend/web/address.js
index 89338ed4a90389de2986a588c00bd60d4965f557..c584a11c567a3d2d8a4359953826cd7845065731 100644
--- a/app/code/Magento/Customer/view/frontend/web/address.js
+++ b/app/code/Magento/Customer/view/frontend/web/address.js
@@ -22,8 +22,13 @@
  */
 /*jshint browser:true, jquery:true*/
 /*global confirm:true*/
-define(["jquery","jquery/ui","mage/translate"], function(jQuery){
+define([
+    "jquery",
+    "jquery/ui",
+    "mage/translate"
+], function($){
     "use strict";
+    
     $.widget('mage.address', {
         /**
          * Options common to all instances of this widget.
diff --git a/app/code/Magento/CustomerImportExport/composer.json b/app/code/Magento/CustomerImportExport/composer.json
index df27250c37b04c1bdb12d08589f392efd1585707..1ac83c3b0366d8a287cb87735703becce0a6c6a3 100644
--- a/app/code/Magento/CustomerImportExport/composer.json
+++ b/app/code/Magento/CustomerImportExport/composer.json
@@ -2,19 +2,19 @@
     "name": "magento/module-customer-import-export",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/module-import-export": "0.1.0-alpha89",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-directory": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/module-import-export": "0.1.0-alpha90",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-directory": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/DesignEditor/composer.json b/app/code/Magento/DesignEditor/composer.json
index d88235ca453bf1b1e2079585b6b5b56d74f2fa48..ac8de66b7a1aa54c9adb47b6fbe6c3970d6b4cc3 100644
--- a/app/code/Magento/DesignEditor/composer.json
+++ b/app/code/Magento/DesignEditor/composer.json
@@ -2,18 +2,18 @@
     "name": "magento/module-design-editor",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/module-url-rewrite": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/module-url-rewrite": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/DesignEditor/etc/adminhtml/acl.xml b/app/code/Magento/DesignEditor/etc/acl.xml
similarity index 93%
rename from app/code/Magento/DesignEditor/etc/adminhtml/acl.xml
rename to app/code/Magento/DesignEditor/etc/acl.xml
index 7b37bc1c5bc5a55b18bb7670602292e2a6cf4edf..8cd96036334c0c2630d702af5b46cbddaeca6c67 100644
--- a/app/code/Magento/DesignEditor/etc/adminhtml/acl.xml
+++ b/app/code/Magento/DesignEditor/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/Dhl/composer.json b/app/code/Magento/Dhl/composer.json
index b915d938c8bc78d897d917e62d5bd11cff111cde..0832f2077dfd8c1decc9740dc3869888d123de3e 100644
--- a/app/code/Magento/Dhl/composer.json
+++ b/app/code/Magento/Dhl/composer.json
@@ -2,22 +2,22 @@
     "name": "magento/module-dhl",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-shipping": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-directory": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-checkout": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-catalog-inventory": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-shipping": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-directory": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-checkout": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-catalog-inventory": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "lib-libxml": "*",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Directory/composer.json b/app/code/Magento/Directory/composer.json
index 1ad64b018d66dcac48931a1eb832b8a1c2aa7b9f..d8fee1dd15c49639d5222bc370f22d44c4d64663 100644
--- a/app/code/Magento/Directory/composer.json
+++ b/app/code/Magento/Directory/composer.json
@@ -2,16 +2,16 @@
     "name": "magento/module-directory",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "lib-libxml": "*",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Directory/view/frontend/templates/currency.phtml b/app/code/Magento/Directory/view/frontend/templates/currency.phtml
index 5e1cfa4988f23fe720c048fe5e21030cc2e55b10..db6065030b180ca20f63429c96569133dd3ecc50 100644
--- a/app/code/Magento/Directory/view/frontend/templates/currency.phtml
+++ b/app/code/Magento/Directory/view/frontend/templates/currency.phtml
@@ -32,18 +32,25 @@
 <?php if ($this->getCurrencyCount() > 1): ?>
 <?php $currencies = $this->getCurrencies(); ?>
 <?php $currentCurrencyCode = $this->getCurrentCurrencyCode(); ?>
-<div class="switcher currency">
-    <strong class="label"><span><?php echo __('Currency') ?></span></strong>
-    <div class="actions dropdown options">
-        <div class="action toggle" id="currency-switcher">
+<?php $id = $this->getIdModifier() ? '-' . $this->getIdModifier() : ''?>
+<div class="switcher currency switcher-currency" id="switcher-currency<?php echo $id?>">
+    <strong class="label switcher-label"><span><?php echo __('Currency') ?></span></strong>
+    <div class="actions dropdown options switcher-options">
+        <div class="action toggle switcher-trigger" id="switcher-currency-trigger<?php echo $id?>">
             <strong class="language-<?php echo $this->escapeHtml($this->getCurrentCurrencyCode()) ?>">
                 <span><?php echo $this->escapeHtml($currentCurrencyCode) ?> - <?php echo @$this->escapeHtml($currencies[$currentCurrencyCode]) ?></span>
             </strong>
         </div>
-        <ul class="dropdown" data-mage-init='{"dropdownDialog":{"appendTo":".switcher.currency > .options", "triggerTarget":"#currency-switcher", "closeOnMouseLeave": false, "triggerClass":"active", "parentClass":"active", "buttons":null}}'>
+        <ul class="dropdown switcher-dropdown" data-mage-init='{"dropdownDialog":{
+            "appendTo":"#switcher-currency<?php echo $id?> > .options",
+            "triggerTarget":"#switcher-currency-trigger<?php echo $id?>",
+            "closeOnMouseLeave": false,
+            "triggerClass":"active",
+            "parentClass":"active",
+            "buttons":null}}'>
             <?php foreach ($currencies as $_code => $_name): ?>
                 <?php if($_code != $currentCurrencyCode): ?>
-                    <li class="currency-<?php echo $_code ?>">
+                    <li class="currency-<?php echo $_code ?> switcher-option">
                         <a href="#" data-post='<?php echo $this->getSwitchCurrencyPostData($_code); ?>'><?php echo $_code ?> - <?php echo $_name ?></a>
                     </li>
                 <?php endif; ?>
diff --git a/app/code/Magento/Downloadable/composer.json b/app/code/Magento/Downloadable/composer.json
index fd70a1987014a515326a35f70bfd0e9580a3a520..dfaa9b07ab477e8d0512d71975ed4a7d436cc751 100644
--- a/app/code/Magento/Downloadable/composer.json
+++ b/app/code/Magento/Downloadable/composer.json
@@ -2,27 +2,27 @@
     "name": "magento/module-downloadable",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-tax": "0.1.0-alpha89",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-checkout": "0.1.0-alpha89",
-        "magento/module-directory": "0.1.0-alpha89",
-        "magento/module-weee": "0.1.0-alpha89",
-        "magento/module-wishlist": "0.1.0-alpha89",
-        "magento/module-gift-message": "0.1.0-alpha89",
-        "magento/module-catalog-inventory": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-tax": "0.1.0-alpha90",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-checkout": "0.1.0-alpha90",
+        "magento/module-directory": "0.1.0-alpha90",
+        "magento/module-weee": "0.1.0-alpha90",
+        "magento/module-wishlist": "0.1.0-alpha90",
+        "magento/module-gift-message": "0.1.0-alpha90",
+        "magento/module-catalog-inventory": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Downloadable/etc/adminhtml/acl.xml b/app/code/Magento/Downloadable/etc/acl.xml
similarity index 94%
rename from app/code/Magento/Downloadable/etc/adminhtml/acl.xml
rename to app/code/Magento/Downloadable/etc/acl.xml
index 5c136bb1549b3e408ca732d49cca33b94f7a1f9d..6cc54d7359e0e67495e89b5e3604042af00dd1c9 100644
--- a/app/code/Magento/Downloadable/etc/adminhtml/acl.xml
+++ b/app/code/Magento/Downloadable/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/Downloadable/view/adminhtml/templates/product/edit/downloadable/samples.phtml b/app/code/Magento/Downloadable/view/adminhtml/templates/product/edit/downloadable/samples.phtml
index 41b453a9236d30fb2f85eab109a39fa1e88fadb4..453013f37556d3f5c78f871a3622a95c03d35068 100644
--- a/app/code/Magento/Downloadable/view/adminhtml/templates/product/edit/downloadable/samples.phtml
+++ b/app/code/Magento/Downloadable/view/adminhtml/templates/product/edit/downloadable/samples.phtml
@@ -251,6 +251,14 @@ sampleUploader = function (id) {
     })(jQuery, id);
 };
 
+if($('add_sample_item')){
+    Event.observe('add_sample_item', 'click', sampleItems.add.bind(sampleItems));
+}
+
+<?php foreach ($this->getSampleData() as $item): ?>
+    sampleItems.add(<?php echo $item->toJson() ?>);
+<?php endforeach; ?>
+
 });
 </script>
 
diff --git a/app/code/Magento/Downloadable/view/frontend/templates/customer/products/list.phtml b/app/code/Magento/Downloadable/view/frontend/templates/customer/products/list.phtml
index 5353cba99ec8a1ebe88c7046b4853bcff6d6337c..62dfb148d2d51ea240db3dd06ae49563835a35a1 100644
--- a/app/code/Magento/Downloadable/view/frontend/templates/customer/products/list.phtml
+++ b/app/code/Magento/Downloadable/view/frontend/templates/customer/products/list.phtml
@@ -29,11 +29,6 @@
 ?>
 <?php $_items = $this->getItems(); ?>
 <?php if(count($_items)): ?>
-    <?php if ($this->getChildHtml('pager')): ?>
-        <div class="toolbar downloadable-products-toolbar top">
-            <?php echo $this->getChildHtml('pager'); ?>
-        </div>
-    <?php endif; ?>
     <div class="table-wrapper downloadable-products">
         <table id="my-downloadable-products-table" class="data table table-downloadable-products">
             <caption class="table caption"><?php echo __('Downloadable Products') ?></caption>
diff --git a/app/code/Magento/Eav/composer.json b/app/code/Magento/Eav/composer.json
index 650b3fa8db6bda86d4f192418aa65958a038a4b7..4ff54743f583848ea453efedece43eea18426034 100644
--- a/app/code/Magento/Eav/composer.json
+++ b/app/code/Magento/Eav/composer.json
@@ -2,16 +2,16 @@
     "name": "magento/module-eav",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Email/composer.json b/app/code/Magento/Email/composer.json
index 3f8c783a0bf510156a44a6ca7992b34a728c6336..1f01b6d4c0d69f186f9b81bb6ff28b239abce3f7 100644
--- a/app/code/Magento/Email/composer.json
+++ b/app/code/Magento/Email/composer.json
@@ -2,17 +2,17 @@
     "name": "magento/module-email",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-cms": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-cms": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Email/etc/adminhtml/acl.xml b/app/code/Magento/Email/etc/acl.xml
similarity index 93%
rename from app/code/Magento/Email/etc/adminhtml/acl.xml
rename to app/code/Magento/Email/etc/acl.xml
index 46699dfcc8feed729ede95e5120084a0edfd24ff..39c597eb28d923ea523b0c5dd8de3b8b5ad3ec79 100644
--- a/app/code/Magento/Email/etc/adminhtml/acl.xml
+++ b/app/code/Magento/Email/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/Fedex/Model/Carrier.php b/app/code/Magento/Fedex/Model/Carrier.php
index 10a02701ac657da41c907c52bc4c4ae965b49f03..1daa81c68b19218e9b315c93d665d79d46a17ebc 100644
--- a/app/code/Magento/Fedex/Model/Carrier.php
+++ b/app/code/Magento/Fedex/Model/Carrier.php
@@ -62,6 +62,22 @@ class Carrier extends AbstractCarrierOnline implements \Magento\Shipping\Model\C
      */
     protected $_code = self::CODE;
 
+    /**
+     * Types of rates, order is important
+     *
+     * @var array
+     */
+    protected $_ratesOrder = [
+        'RATED_ACCOUNT_PACKAGE',
+        'PAYOR_ACCOUNT_PACKAGE',
+        'RATED_ACCOUNT_SHIPMENT',
+        'PAYOR_ACCOUNT_SHIPMENT',
+        'RATED_LIST_PACKAGE',
+        'PAYOR_LIST_PACKAGE',
+        'RATED_LIST_SHIPMENT',
+        'PAYOR_LIST_SHIPMENT'
+    ];
+
     /**
      * Rate request data
      *
@@ -585,8 +601,7 @@ class Carrier extends AbstractCarrierOnline implements \Magento\Shipping\Model\C
                 $rateTypeAmounts[$rateType] = $netAmount;
             }
 
-            // Order is important
-            foreach (array('RATED_ACCOUNT_SHIPMENT', 'RATED_LIST_SHIPMENT', 'RATED_LIST_PACKAGE') as $rateType) {
+            foreach ($this->_ratesOrder as $rateType) {
                 if (!empty($rateTypeAmounts[$rateType])) {
                     $amount = $rateTypeAmounts[$rateType];
                     break;
diff --git a/app/code/Magento/Fedex/composer.json b/app/code/Magento/Fedex/composer.json
index 9c13f7eb7d88a0bfae382f598069b6c43165ab20..462b906d620269ba2b2b4937e7e4af4750dfd2f9 100644
--- a/app/code/Magento/Fedex/composer.json
+++ b/app/code/Magento/Fedex/composer.json
@@ -2,20 +2,20 @@
     "name": "magento/module-fedex",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-shipping": "0.1.0-alpha89",
-        "magento/module-directory": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-catalog-inventory": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-shipping": "0.1.0-alpha90",
+        "magento/module-directory": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-catalog-inventory": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "lib-libxml": "*",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/GiftMessage/composer.json b/app/code/Magento/GiftMessage/composer.json
index d48fce67defd6480e8b01a59f9a42c6b1ac061d4..1b7228317bb77f8fbe03c6139db4833661859372 100644
--- a/app/code/Magento/GiftMessage/composer.json
+++ b/app/code/Magento/GiftMessage/composer.json
@@ -2,21 +2,21 @@
     "name": "magento/module-gift-message",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-multishipping": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-multishipping": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/GoogleAdwords/composer.json b/app/code/Magento/GoogleAdwords/composer.json
index 5fc47874f0d9f039b31ff4e635499a90176b44bf..d6f7e5d6a8e8ca5e3bbef820b48e0533c19d1f47 100644
--- a/app/code/Magento/GoogleAdwords/composer.json
+++ b/app/code/Magento/GoogleAdwords/composer.json
@@ -2,14 +2,14 @@
     "name": "magento/module-google-adwords",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/GoogleAnalytics/composer.json b/app/code/Magento/GoogleAnalytics/composer.json
index 5cb9bc78c2587ecc270899386c768456e190f5f8..4919131005d3a4811278611b71a177ee4290ab00 100644
--- a/app/code/Magento/GoogleAnalytics/composer.json
+++ b/app/code/Magento/GoogleAnalytics/composer.json
@@ -2,14 +2,14 @@
     "name": "magento/module-google-analytics",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/GoogleAnalytics/etc/adminhtml/acl.xml b/app/code/Magento/GoogleAnalytics/etc/acl.xml
similarity index 94%
rename from app/code/Magento/GoogleAnalytics/etc/adminhtml/acl.xml
rename to app/code/Magento/GoogleAnalytics/etc/acl.xml
index 7354a089cf21e6343206d5cc07f04e8ed34900f6..4107ab44caa7e99e8815944fec5fa00080d1a710 100644
--- a/app/code/Magento/GoogleAnalytics/etc/adminhtml/acl.xml
+++ b/app/code/Magento/GoogleAnalytics/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/GoogleOptimizer/composer.json b/app/code/Magento/GoogleOptimizer/composer.json
index 094f6b1f9dcd6c42190f86f0f77829a60f6b3ac9..c4caba7bbb770e306fc3fc4b9f9d1813a1baf343 100644
--- a/app/code/Magento/GoogleOptimizer/composer.json
+++ b/app/code/Magento/GoogleOptimizer/composer.json
@@ -2,17 +2,17 @@
     "name": "magento/module-google-optimizer",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-google-analytics": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-cms": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-google-analytics": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-cms": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Items.php b/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Items.php
index 512f6b69ab884e26b59e854482319ecaa0802973..74e74bb29299df39c0b53bab5958abf03070672f 100644
--- a/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Items.php
+++ b/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Items.php
@@ -23,6 +23,9 @@
  */
 namespace Magento\GoogleShopping\Controller\Adminhtml\Googleshopping;
 
+use \Magento\Framework\Notification\NotifierInterface;
+use \Magento\Backend\App\Action;
+
 /**
  * GoogleShopping Admin Items Controller
  *
@@ -31,6 +34,20 @@ namespace Magento\GoogleShopping\Controller\Adminhtml\Googleshopping;
  */
 class Items extends \Magento\Backend\App\Action
 {
+    /**
+     * @var NotifierInterface
+     */
+    protected $notifier;
+
+    /**
+     * @param \Magento\Backend\App\Action\Context $context
+     * @param NotifierInterface $notifier
+     */
+    public function __construct(Action\Context $context, NotifierInterface $notifier)
+    {
+        parent::__construct($context);
+        $this->notifier = $notifier;
+    }
 
     /**
      * Retrieve synchronization process mutex
diff --git a/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Items/MassAdd.php b/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Items/MassAdd.php
index 0b8245af5f0ca0a28ceaf098517b45bdab118ada..d3030a4e92e14c898085827f8abf8eb28018b37f 100644
--- a/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Items/MassAdd.php
+++ b/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Items/MassAdd.php
@@ -44,7 +44,6 @@ class MassAdd extends \Magento\GoogleShopping\Controller\Adminhtml\Googleshoppin
 
         $storeId = $this->_getStore()->getId();
         $productIds = $this->getRequest()->getParam('product', null);
-        $notifier = $this->_objectManager->create('Magento\AdminNotification\Model\Inbox');
 
         try {
             $flag->lock();
@@ -64,7 +63,7 @@ class MassAdd extends \Magento\GoogleShopping\Controller\Adminhtml\Googleshoppin
             return;
         } catch (\Exception $e) {
             $flag->unlock();
-            $notifier->addMajor(
+            $this->notifier->addMajor(
                 __('An error has occurred while adding products to google shopping account.'),
                 $e->getMessage()
             );
diff --git a/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Items/Refresh.php b/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Items/Refresh.php
index bb294d6af1e3c2f59a1ca6da5a7335453a48e874..2e6514c7b19e5d68c96d94bc0b74929083f1b12f 100644
--- a/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Items/Refresh.php
+++ b/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Items/Refresh.php
@@ -68,9 +68,7 @@ class Refresh extends \Magento\GoogleShopping\Controller\Adminhtml\Googleshoppin
             return;
         } catch (\Exception $e) {
             $flag->unlock();
-            $this->_objectManager->create(
-                'Magento\AdminNotification\Model\Inbox'
-            )->addMajor(
+            $this->notifier->addMajor(
                 __('An error has occurred while deleting products from google shopping account.'),
                 __(
                     'One or more products were not deleted from google shopping account. Refer to the log file for details.'
diff --git a/app/code/Magento/GoogleShopping/Model/MassOperations.php b/app/code/Magento/GoogleShopping/Model/MassOperations.php
index 8cf0e940823cdb74aaf12256e7537804bcc018fb..180aa443eeec639e5638e2fde1c0451a61c2d729 100644
--- a/app/code/Magento/GoogleShopping/Model/MassOperations.php
+++ b/app/code/Magento/GoogleShopping/Model/MassOperations.php
@@ -69,11 +69,11 @@ class MassOperations
     protected $_productFactory;
 
     /**
-     * Inbox factory
+     * Notifier
      *
-     * @var \Magento\AdminNotification\Model\InboxFactory
+     * @var \Magento\Framework\Notification\NotifierInterface
      */
-    protected $_inboxFactory;
+    protected $_notifier;
 
     /**
      * Collection factory
@@ -86,7 +86,7 @@ class MassOperations
      * @param \Magento\GoogleShopping\Model\Resource\Item\CollectionFactory $collectionFactory
      * @param \Magento\GoogleShopping\Model\ItemFactory $itemFactory
      * @param \Magento\Catalog\Model\ProductFactory $productFactory
-     * @param \Magento\AdminNotification\Model\InboxFactory $inboxFactory
+     * @param \Magento\Framework\Notification\NotifierInterface $notifier
      * @param \Magento\Store\Model\StoreManagerInterface $storeManager
      * @param \Magento\Framework\Logger $logger
      * @param \Magento\GoogleShopping\Helper\Data $gleShoppingData
@@ -97,7 +97,7 @@ class MassOperations
         \Magento\GoogleShopping\Model\Resource\Item\CollectionFactory $collectionFactory,
         \Magento\GoogleShopping\Model\ItemFactory $itemFactory,
         \Magento\Catalog\Model\ProductFactory $productFactory,
-        \Magento\AdminNotification\Model\InboxFactory $inboxFactory,
+        \Magento\Framework\Notification\NotifierInterface $notifier,
         \Magento\Store\Model\StoreManagerInterface $storeManager,
         \Magento\Framework\Logger $logger,
         \Magento\GoogleShopping\Helper\Data $gleShoppingData,
@@ -107,7 +107,7 @@ class MassOperations
         $this->_collectionFactory = $collectionFactory;
         $this->_itemFactory = $itemFactory;
         $this->_productFactory = $productFactory;
-        $this->_inboxFactory = $inboxFactory;
+        $this->_notifier = $notifier;
         $this->_storeManager = $storeManager;
         $this->_gleShoppingData = $gleShoppingData;
         $this->_gleShoppingCategory = $gleShoppingCategory;
@@ -211,18 +211,18 @@ class MassOperations
         }
 
         if ($totalAdded > 0) {
-            $this->_getNotifier()->addNotice(
+            $this->_notifier->addNotice(
                 __('Products were added to Google Shopping account.'),
                 __('A total of %1 product(s) have been added to Google Content.', $totalAdded)
             );
         }
 
         if (count($errors)) {
-            $this->_getNotifier()->addMajor(__('Errors happened while adding products to Google Shopping.'), $errors);
+            $this->_notifier->addMajor(__('Errors happened while adding products to Google Shopping.'), $errors);
         }
 
         if ($this->_flag->isExpired()) {
-            $this->_getNotifier()->addMajor(
+            $this->_notifier->addMajor(
                 __('Operation of adding products to Google Shopping expired.'),
                 __('Some products may have not been added to Google Shopping bacause of expiration')
             );
@@ -298,7 +298,7 @@ class MassOperations
             return $this;
         }
 
-        $this->_getNotifier()->addNotice(
+        $this->_notifier->addNotice(
             __('Product synchronization with Google Shopping completed'),
             __(
                 'A total of %1 items(s) have been deleted; a total of %2 items(s) have been updated.',
@@ -308,7 +308,7 @@ class MassOperations
         );
         if ($totalFailed > 0 || count($errors)) {
             array_unshift($errors, __("We cannot update %1 items.", $totalFailed));
-            $this->_getNotifier()->addMajor(
+            $this->_notifier->addMajor(
                 __('Errors happened during synchronization with Google Shopping'),
                 $errors
             );
@@ -359,13 +359,13 @@ class MassOperations
         }
 
         if ($totalDeleted > 0) {
-            $this->_getNotifier()->addNotice(
+            $this->_notifier->addNotice(
                 __('Google Shopping item removal process succeded'),
                 __('Total of %1 items(s) have been removed from Google Shopping.', $totalDeleted)
             );
         }
         if (count($errors)) {
-            $this->_getNotifier()->addMajor(__('Errors happened while deleting items from Google Shopping'), $errors);
+            $this->_notifier->addMajor(__('Errors happened while deleting items from Google Shopping'), $errors);
         }
 
         return $this;
@@ -390,16 +390,6 @@ class MassOperations
         return $itemsCollection;
     }
 
-    /**
-     * Retrieve admin notifier
-     *
-     * @return \Magento\AdminNotification\Model\Inbox
-     */
-    protected function _getNotifier()
-    {
-        return $this->_inboxFactory->create();
-    }
-
     /**
      * Provides general error information
      *
@@ -408,7 +398,7 @@ class MassOperations
     protected function _addGeneralError()
     {
         if (!$this->_hasError) {
-            $this->_getNotifier()->addMajor(__('Google Shopping Error'), $this->_gleShoppingCategory->getMessage());
+            $this->_notifier->addMajor(__('Google Shopping Error'), $this->_gleShoppingCategory->getMessage());
             $this->_hasError = true;
         }
     }
diff --git a/app/code/Magento/GoogleShopping/Model/Observer.php b/app/code/Magento/GoogleShopping/Model/Observer.php
index 83dd68d6432e32c1a7fddc4260e3f7394b060ac1..4eafd2d0704cfeab8f97537bf18ebd00eba6cf92 100644
--- a/app/code/Magento/GoogleShopping/Model/Observer.php
+++ b/app/code/Magento/GoogleShopping/Model/Observer.php
@@ -55,11 +55,11 @@ class Observer
     protected $_operationsFactory;
 
     /**
-     * Inbox factory
+     * Notifier
      *
-     * @var \Magento\AdminNotification\Model\InboxFactory
+     * @var \Magento\Framework\Notification\NotifierInterface
      */
-    protected $_inboxFactory;
+    protected $_notifier;
 
     /**
      * Collection factory
@@ -71,7 +71,7 @@ class Observer
     /**
      * @param \Magento\GoogleShopping\Model\Resource\Item\CollectionFactory $collectionFactory
      * @param \Magento\GoogleShopping\Model\MassOperationsFactory $operationsFactory
-     * @param \Magento\AdminNotification\Model\InboxFactory $inboxFactory
+     * @param \Magento\Framework\Notification\NotifierInterface $notifier
      * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
      * @param \Magento\Framework\Message\ManagerInterface $messageManager
      * @param \Magento\GoogleShopping\Model\Flag $flag
@@ -79,14 +79,14 @@ class Observer
     public function __construct(
         \Magento\GoogleShopping\Model\Resource\Item\CollectionFactory $collectionFactory,
         \Magento\GoogleShopping\Model\MassOperationsFactory $operationsFactory,
-        \Magento\AdminNotification\Model\InboxFactory $inboxFactory,
+        \Magento\Framework\Notification\NotifierInterface $notifier,
         \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
         \Magento\Framework\Message\ManagerInterface $messageManager,
         \Magento\GoogleShopping\Model\Flag $flag
     ) {
         $this->_collectionFactory = $collectionFactory;
         $this->_operationsFactory = $operationsFactory;
-        $this->_inboxFactory = $inboxFactory;
+        $this->_notifier = $notifier;
         $this->_scopeConfig = $scopeConfig;
         $this->messageManager = $messageManager;
         $this->_flag = $flag;
@@ -146,7 +146,12 @@ class Observer
         }
 
         foreach ($items as $item) {
-            if (!$this->_scopeConfig->isSetFlag('google/googleshopping/observed', \Magento\Store\Model\ScopeInterface::SCOPE_STORE, $item->getStoreId())) {
+            $flag = $this->_scopeConfig->isSetFlag(
+                'google/googleshopping/observed',
+                \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
+                $item->getStoreId()
+            );
+            if (!$flag) {
                 $items->removeItemByKey($item->getId());
             }
         }
@@ -164,7 +169,7 @@ class Observer
     {
         $this->_flag->loadSelf();
         if ($this->_flag->isExpired()) {
-            $this->_inboxFactory->create()->addMajor(
+            $this->_notifier->addMajor(
                 __('Google Shopping operation has expired.'),
                 __('One or more google shopping synchronization operations failed because of timeout.')
             );
diff --git a/app/code/Magento/GoogleShopping/composer.json b/app/code/Magento/GoogleShopping/composer.json
index 1714fabb5098ecb52cde41a3f6272efc58678c6c..5fc87f04a43f2b6267dc82bb393b086e81751162 100644
--- a/app/code/Magento/GoogleShopping/composer.json
+++ b/app/code/Magento/GoogleShopping/composer.json
@@ -2,22 +2,21 @@
     "name": "magento/module-google-shopping",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-admin-notification": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-directory": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/module-tax": "0.1.0-alpha89",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-directory": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/module-tax": "0.1.0-alpha90",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/GoogleShopping/etc/adminhtml/acl.xml b/app/code/Magento/GoogleShopping/etc/acl.xml
similarity index 94%
rename from app/code/Magento/GoogleShopping/etc/adminhtml/acl.xml
rename to app/code/Magento/GoogleShopping/etc/acl.xml
index 965d797ebb1af58f3e58ee15977c97d3fbbd6d74..0a8c2e4245cf4376e7e29ab822565a9490808a2c 100644
--- a/app/code/Magento/GoogleShopping/etc/adminhtml/acl.xml
+++ b/app/code/Magento/GoogleShopping/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/GoogleShopping/etc/module.xml b/app/code/Magento/GoogleShopping/etc/module.xml
index e7a52ba4ee9d9cb341176533db76eaff10f58ae9..89c6286283da0ad524c9bf7fafc41fe9c9bd1a51 100644
--- a/app/code/Magento/GoogleShopping/etc/module.xml
+++ b/app/code/Magento/GoogleShopping/etc/module.xml
@@ -30,7 +30,6 @@
         </sequence>
         <depends>
             <module name="Magento_Store"/>
-            <module name="Magento_AdminNotification"/>
             <module name="Magento_Core"/>
             <module name="Magento_Backend"/>
             <module name="Magento_Catalog"/>
diff --git a/app/code/Magento/GroupedImportExport/Model/Export/Product/Type/Grouped.php b/app/code/Magento/GroupedImportExport/Model/Export/Product/Type/Grouped.php
new file mode 100644
index 0000000000000000000000000000000000000000..1f8478909aa5fb5bd2a577a6751a15297ed67fb7
--- /dev/null
+++ b/app/code/Magento/GroupedImportExport/Model/Export/Product/Type/Grouped.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Export entity of grouped 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\GroupedImportExport\Model\Export\Product\Type;
+
+class Grouped extends \Magento\CatalogImportExport\Model\Export\Product\Type\AbstractType
+{
+}
diff --git a/app/code/Magento/GroupedImportExport/Model/Export/RowCustomizer.php b/app/code/Magento/GroupedImportExport/Model/Export/RowCustomizer.php
new file mode 100644
index 0000000000000000000000000000000000000000..1c56df62dc602b5d3f2dd7d00244290712b242a3
--- /dev/null
+++ b/app/code/Magento/GroupedImportExport/Model/Export/RowCustomizer.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\GroupedImportExport\Model\Export;
+
+use \Magento\CatalogImportExport\Model\Export\RowCustomizerInterface;
+
+class RowCustomizer implements RowCustomizerInterface
+{
+    /**
+     * @inheritdoc
+     */
+    public function prepareData($collection, $productIds)
+    {
+        return;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function addHeaderColumns($columns)
+    {
+        $columns = array_merge(
+            $columns,
+            array(
+                '_associated_sku',
+                '_associated_default_qty',
+                '_associated_position'
+            )
+        );
+        return $columns;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function addData($dataRow, $productId)
+    {
+        return $dataRow;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function getAdditionalRowsCount($additionalRowsCount, $productId)
+    {
+        return $additionalRowsCount;
+    }
+}
diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product/Type/Grouped.php b/app/code/Magento/GroupedImportExport/Model/Import/Product/Type/Grouped.php
similarity index 98%
rename from app/code/Magento/CatalogImportExport/Model/Import/Product/Type/Grouped.php
rename to app/code/Magento/GroupedImportExport/Model/Import/Product/Type/Grouped.php
index 7492697f6a77110412f1e68f3b52be19507c2ee6..1323fb73de8b36a93d87cbeb25c68425a7c844fa 100644
--- a/app/code/Magento/CatalogImportExport/Model/Import/Product/Type/Grouped.php
+++ b/app/code/Magento/GroupedImportExport/Model/Import/Product/Type/Grouped.php
@@ -23,9 +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\CatalogImportExport\Model\Import\Product\Type;
+namespace Magento\GroupedImportExport\Model\Import\Product\Type;
 
-class Grouped extends AbstractType
+class Grouped extends \Magento\CatalogImportExport\Model\Import\Product\Type\AbstractType
 {
     /**
      * Column names that holds values with particular meaning.
diff --git a/app/code/Magento/GroupedImportExport/composer.json b/app/code/Magento/GroupedImportExport/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..9ddd9462305e8943bb0078e385fab1b1f9a50c04
--- /dev/null
+++ b/app/code/Magento/GroupedImportExport/composer.json
@@ -0,0 +1,23 @@
+{
+    "name": "magento/module-grouped-import-export",
+    "description": "N/A",
+    "require": {
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-import-export": "0.1.0-alpha90",
+        "magento/module-catalog-import-export": "0.1.0-alpha90",
+        "magento/module-grouped-product": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90"
+    },
+    "type": "magento2-module",
+    "version": "0.1.0-alpha90",
+    "extra": {
+        "map": [
+            [
+                "*",
+                "Magento/GroupedImportExport"
+            ]
+        ]
+    }
+}
diff --git a/app/code/Magento/GroupedImportExport/etc/di.xml b/app/code/Magento/GroupedImportExport/etc/di.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2fee2173b7bb91f6162bb60e34541200693d0d21
--- /dev/null
+++ b/app/code/Magento/GroupedImportExport/etc/di.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 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
+    <type name="Magento\CatalogImportExport\Model\Export\RowCustomizer\Composite">
+        <arguments>
+            <argument name="customizers" xsi:type="array">
+                <item name="gropedProduct" xsi:type="string">Magento\GroupedImportExport\Model\Export\RowCustomizer</item>
+            </argument>
+        </arguments>
+    </type>
+</config>
diff --git a/app/code/Magento/GroupedImportExport/etc/export.xml b/app/code/Magento/GroupedImportExport/etc/export.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c29cda67913dc6f98be49da9187e5a627bd0475e
--- /dev/null
+++ b/app/code/Magento/GroupedImportExport/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 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../ImportExport/etc/export.xsd">
+    <entityType entity="catalog_product" name="grouped" model="Magento\GroupedImportExport\Model\Export\Product\Type\Grouped" />
+</config>
diff --git a/app/code/Magento/GroupedImportExport/etc/import.xml b/app/code/Magento/GroupedImportExport/etc/import.xml
new file mode 100644
index 0000000000000000000000000000000000000000..20251196082f69edd587d1661a43f6dc848472bd
--- /dev/null
+++ b/app/code/Magento/GroupedImportExport/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 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../ImportExport/etc/import.xsd">
+    <entityType entity="catalog_product" name="grouped" model="Magento\GroupedImportExport\Model\Import\Product\Type\Grouped" />
+</config>
diff --git a/app/code/Magento/GroupedImportExport/etc/module.xml b/app/code/Magento/GroupedImportExport/etc/module.xml
new file mode 100644
index 0000000000000000000000000000000000000000..27708b2a0323cfaae797f3512b051e75ed13392d
--- /dev/null
+++ b/app/code/Magento/GroupedImportExport/etc/module.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)
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
+    <module name="Magento_GroupedImportExport" schema_version="1.0.0.0" active="true">
+        <depends>
+            <module name="Magento_Catalog"/>
+            <module name="Magento_ImportExport"/>
+            <module name="Magento_CatalogImportExport"/>
+            <module name="Magento_GroupedProduct"/>
+            <module name="Magento_Eav"/>
+        </depends>
+    </module>
+</config>
diff --git a/app/code/Magento/GroupedProduct/composer.json b/app/code/Magento/GroupedProduct/composer.json
index 65984cf03f57c13813ed444f0007770b5a80ad06..cf8b138e08efeb0a6a915dfab28d4a9a81023a8a 100644
--- a/app/code/Magento/GroupedProduct/composer.json
+++ b/app/code/Magento/GroupedProduct/composer.json
@@ -2,23 +2,23 @@
     "name": "magento/module-grouped-product",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-catalog-inventory": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-tax": "0.1.0-alpha89",
-        "magento/module-checkout": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-catalog-inventory": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-tax": "0.1.0-alpha90",
+        "magento/module-checkout": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/ImportExport/composer.json b/app/code/Magento/ImportExport/composer.json
index 004eb3554d516ca72fb9c7b58aac4bf9984628d0..3b83b03847620c7b0cf558f35cca29d46929cf29 100644
--- a/app/code/Magento/ImportExport/composer.json
+++ b/app/code/Magento/ImportExport/composer.json
@@ -2,18 +2,18 @@
     "name": "magento/module-import-export",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/module-index": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/module-index": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "ext-ctype": "*",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/ImportExport/etc/adminhtml/acl.xml b/app/code/Magento/ImportExport/etc/acl.xml
similarity index 94%
rename from app/code/Magento/ImportExport/etc/adminhtml/acl.xml
rename to app/code/Magento/ImportExport/etc/acl.xml
index 21a4534e03b3c884f50fc4e5d8d5a95c6cd61d12..1ea1488aedc1d817c86017393853171e91d7b85b 100644
--- a/app/code/Magento/ImportExport/etc/adminhtml/acl.xml
+++ b/app/code/Magento/ImportExport/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/Index/Model/System/Message/IndexOutdated.php b/app/code/Magento/Index/Model/System/Message/IndexOutdated.php
index a5a46aa6bd080b89e3e5aae7de69751131db1797..a25fc378e560553e52d6f683ba3acd4ea01c6157 100644
--- a/app/code/Magento/Index/Model/System/Message/IndexOutdated.php
+++ b/app/code/Magento/Index/Model/System/Message/IndexOutdated.php
@@ -17,13 +17,13 @@
  * Do not edit or add to this file if you wish to upgrade Magento to newer
  * versions in the future. If you wish to customize Magento for your
  * needs please refer 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\Index\Model\System\Message;
 
-class IndexOutdated implements \Magento\AdminNotification\Model\System\MessageInterface
+class IndexOutdated implements \Magento\Framework\Notification\MessageInterface
 {
     /**
      * @var \Magento\Index\Model\Indexer
diff --git a/app/code/Magento/Index/composer.json b/app/code/Magento/Index/composer.json
index 4d5201a449caf97fb9b1475c9bc495cff32f1172..fcf3e916598bb4ee95d3f64a5b64b18efedfdd01 100644
--- a/app/code/Magento/Index/composer.json
+++ b/app/code/Magento/Index/composer.json
@@ -2,15 +2,14 @@
     "name": "magento/module-index",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-admin-notification": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Index/etc/adminhtml/acl.xml b/app/code/Magento/Index/etc/acl.xml
similarity index 93%
rename from app/code/Magento/Index/etc/adminhtml/acl.xml
rename to app/code/Magento/Index/etc/acl.xml
index 3c2f0f4925083d4bf9ab6bd4f7fc38c3a0cf91f6..915fc10d066e03b84b15f16860995765f79468dd 100644
--- a/app/code/Magento/Index/etc/adminhtml/acl.xml
+++ b/app/code/Magento/Index/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/Index/etc/adminhtml/di.xml b/app/code/Magento/Index/etc/adminhtml/di.xml
index 8ec4ff4eadd2cd29f555ba7edfb5f0087fd1382c..5805634b012d43b53d4cee7a0e891d1f134ad07c 100644
--- a/app/code/Magento/Index/etc/adminhtml/di.xml
+++ b/app/code/Magento/Index/etc/adminhtml/di.xml
@@ -24,7 +24,7 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
-    <type name="Magento\AdminNotification\Model\System\MessageList">
+    <type name="Magento\Framework\Notification\MessageList">
         <arguments>
             <argument name="messages" xsi:type="array">
                 <item name="indexer" xsi:type="string">Magento\Index\Model\System\Message\IndexOutdated</item>
diff --git a/app/code/Magento/Index/etc/module.xml b/app/code/Magento/Index/etc/module.xml
index 8ff8a9e206d541cadfe4a8b611149e6ed1a912bc..92b3bfd022cbef35ea8a0c70bddf5f74bb758698 100644
--- a/app/code/Magento/Index/etc/module.xml
+++ b/app/code/Magento/Index/etc/module.xml
@@ -32,7 +32,6 @@
         <depends>
             <module name="Magento_Store"/>
             <module name="Magento_Backend"/>
-            <module name="Magento_AdminNotification"/>
         </depends>
     </module>
 </config>
diff --git a/app/code/Magento/Indexer/composer.json b/app/code/Magento/Indexer/composer.json
index 71272f04ac08dbd58bdd1996d770d0eb01f08c4f..4409860e4a068cf1bb03fa0deb002c64a3bc29c4 100644
--- a/app/code/Magento/Indexer/composer.json
+++ b/app/code/Magento/Indexer/composer.json
@@ -2,14 +2,14 @@
     "name": "magento/module-indexer",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-page-cache": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-page-cache": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Indexer/etc/adminhtml/acl.xml b/app/code/Magento/Indexer/etc/acl.xml
similarity index 94%
rename from app/code/Magento/Indexer/etc/adminhtml/acl.xml
rename to app/code/Magento/Indexer/etc/acl.xml
index 43be5a630531efc4009bde220221c052655b2798..ecc2b372817d968f36f7484c3fd57c6f974faa60 100644
--- a/app/code/Magento/Indexer/etc/adminhtml/acl.xml
+++ b/app/code/Magento/Indexer/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/Install/Block/End.php b/app/code/Magento/Install/Block/End.php
index 012870dabd88440456d93dad84923df7e8025b05..75d895086e9882ed95918961d0d9b763b91cab0b 100644
--- a/app/code/Magento/Install/Block/End.php
+++ b/app/code/Magento/Install/Block/End.php
@@ -24,8 +24,6 @@
 
 /**
  * Installation ending block
- *
- * @author      Magento Core Team <core@magentocommerce.com>
  */
 namespace Magento\Install\Block;
 
@@ -37,7 +35,7 @@ class End extends \Magento\Install\Block\AbstractBlock
     protected $_template = 'end.phtml';
 
     /**
-     * @var \Magento\AdminNotification\Model\Survey
+     * @var \Magento\Install\Model\Survey
      */
     protected $_survey;
 
@@ -53,7 +51,7 @@ class End extends \Magento\Install\Block\AbstractBlock
      * @param \Magento\Install\Model\Installer $installer
      * @param \Magento\Install\Model\Wizard $installWizard
      * @param \Magento\Framework\Session\Generic $session
-     * @param \Magento\AdminNotification\Model\Survey $survey
+     * @param \Magento\Install\Model\Survey $survey
      * @param string $cryptKey
      * @param array $data
      */
@@ -62,7 +60,7 @@ class End extends \Magento\Install\Block\AbstractBlock
         \Magento\Install\Model\Installer $installer,
         \Magento\Install\Model\Wizard $installWizard,
         \Magento\Framework\Session\Generic $session,
-        \Magento\AdminNotification\Model\Survey $survey,
+        \Magento\Install\Model\Survey $survey,
         $cryptKey,
         array $data = array()
     ) {
diff --git a/app/code/Magento/AdminNotification/Controller/Adminhtml/Survey.php b/app/code/Magento/Install/Controller/Adminhtml/Survey.php
similarity index 90%
rename from app/code/Magento/AdminNotification/Controller/Adminhtml/Survey.php
rename to app/code/Magento/Install/Controller/Adminhtml/Survey.php
index e7650a90e5a9e681c71765ee356a68528330bf85..5358b053e9d2f3887e205e311a9b7c1431ad0b10 100644
--- a/app/code/Magento/AdminNotification/Controller/Adminhtml/Survey.php
+++ b/app/code/Magento/Install/Controller/Adminhtml/Survey.php
@@ -21,12 +21,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\AdminNotification\Controller\Adminhtml;
+namespace Magento\Install\Controller\Adminhtml;
 
 /**
  * Adminhtml Survey Action
- *
- * @author     Magento Core Team <core@magentocommerce.com>
  */
 class Survey extends \Magento\Backend\App\Action
 {
diff --git a/app/code/Magento/AdminNotification/Controller/Adminhtml/Survey/Index.php b/app/code/Magento/Install/Controller/Adminhtml/Survey/Index.php
similarity index 83%
rename from app/code/Magento/AdminNotification/Controller/Adminhtml/Survey/Index.php
rename to app/code/Magento/Install/Controller/Adminhtml/Survey/Index.php
index 98caa51c392c17738c03ff4ea315a0fe6b6fcc41..69fb6a58c2b683c8cb299057dd130d6e79dd4df7 100644
--- a/app/code/Magento/AdminNotification/Controller/Adminhtml/Survey/Index.php
+++ b/app/code/Magento/Install/Controller/Adminhtml/Survey/Index.php
@@ -22,9 +22,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\AdminNotification\Controller\Adminhtml\Survey;
+namespace Magento\Install\Controller\Adminhtml\Survey;
 
-class Index extends \Magento\AdminNotification\Controller\Adminhtml\Survey
+class Index extends \Magento\Install\Controller\Adminhtml\Survey
 {
     /**
      * Index Action
@@ -34,7 +34,7 @@ class Index extends \Magento\AdminNotification\Controller\Adminhtml\Survey
     public function execute()
     {
         if ($this->getRequest()->getParam('isAjax', false)) {
-            $this->_objectManager->get('Magento\AdminNotification\Model\Survey')->saveSurveyViewed(true);
+            $this->_objectManager->get('Magento\Install\Model\Survey')->saveSurveyViewed(true);
         }
         $this->getResponse()->representJson(\Zend_Json::encode(array('survey_decision_saved' => 1)));
     }
diff --git a/app/code/Magento/Install/Controller/Wizard/End.php b/app/code/Magento/Install/Controller/Wizard/End.php
index dfd9c13d944c2991cf4ca0eeed4ca49793c7aa0c..ce9238c03484c3a1391e9ddd59646b27b3a5d9af 100644
--- a/app/code/Magento/Install/Controller/Wizard/End.php
+++ b/app/code/Magento/Install/Controller/Wizard/End.php
@@ -42,7 +42,7 @@ class End extends \Magento\Install\Controller\Wizard
 
         $this->_getInstaller()->finish();
 
-        $this->_objectManager->get('Magento\AdminNotification\Model\Survey')->saveSurveyViewed(true);
+        $this->_objectManager->get('Magento\Install\Model\Survey')->saveSurveyViewed(true);
 
         $this->_prepareLayout();
         $this->_view->getLayout()->initMessages();
diff --git a/app/code/Magento/AdminNotification/Model/Survey.php b/app/code/Magento/Install/Model/Survey.php
similarity index 94%
rename from app/code/Magento/AdminNotification/Model/Survey.php
rename to app/code/Magento/Install/Model/Survey.php
index 1b061be7a1dca51b6bef9b2ca90bdfd4fa2b3c20..1278e3938f4b25bdd93701ccbddbf0d9c74a657d 100644
--- a/app/code/Magento/AdminNotification/Model/Survey.php
+++ b/app/code/Magento/Install/Model/Survey.php
@@ -24,11 +24,9 @@
 
 
 /**
- * AdminNotification survey model
- *
- * @author     Magento Core Team <core@magentocommerce.com>
+ * Installation survey model
  */
-namespace Magento\AdminNotification\Model;
+namespace Magento\Install\Model;
 
 class Survey
 {
@@ -37,7 +35,7 @@ class Survey
     /**
      * @var string
      */
-    protected $_flagCode = 'admin_notification_survey';
+    protected $_flagCode = 'install_survey';
 
     /**
      * @var \Magento\Framework\Flag
diff --git a/app/code/Magento/AdminNotification/Model/System/Message/Survey.php b/app/code/Magento/Install/Model/System/Message/Survey.php
similarity index 87%
rename from app/code/Magento/AdminNotification/Model/System/Message/Survey.php
rename to app/code/Magento/Install/Model/System/Message/Survey.php
index e2aad4101909c11fa24d83ae40ad6eea231ac365..3d516ed61c2a18309619b116c1e06f4357de8ca7 100644
--- a/app/code/Magento/AdminNotification/Model/System/Message/Survey.php
+++ b/app/code/Magento/Install/Model/System/Message/Survey.php
@@ -21,9 +21,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\AdminNotification\Model\System\Message;
+namespace Magento\Install\Model\System\Message;
 
-class Survey implements \Magento\AdminNotification\Model\System\MessageInterface
+class Survey implements \Magento\Framework\Notification\MessageInterface
 {
     /**
      * @var \Magento\Backend\Model\Auth\Session
@@ -41,7 +41,7 @@ class Survey implements \Magento\AdminNotification\Model\System\MessageInterface
     protected $_urlBuilder;
 
     /**
-     * @var \Magento\AdminNotification\Model\Survey
+     * @var \Magento\Install\Model\Survey
      */
     protected $_survey;
 
@@ -49,13 +49,13 @@ class Survey implements \Magento\AdminNotification\Model\System\MessageInterface
      * @param \Magento\Backend\Model\Auth\Session $authSession
      * @param \Magento\Framework\AuthorizationInterface $authorization
      * @param \Magento\Framework\UrlInterface $urlBuilder
-     * @param \Magento\AdminNotification\Model\Survey $survey
+     * @param \Magento\Install\Model\Survey $survey
      */
     public function __construct(
         \Magento\Backend\Model\Auth\Session $authSession,
         \Magento\Framework\AuthorizationInterface $authorization,
         \Magento\Framework\UrlInterface $urlBuilder,
-        \Magento\AdminNotification\Model\Survey $survey
+        \Magento\Install\Model\Survey $survey
     ) {
         $this->_authorization = $authorization;
         $this->_authSession = $authSession;
@@ -118,7 +118,7 @@ class Survey implements \Magento\AdminNotification\Model\System\MessageInterface
             )
         );
         return __(
-            'We appreciate our merchants\' feedback. Please <a href="#" data-mage-init=%1>take our survey</a> and tell us about features you\'d like to see in Magento.',
+            'We appreciate our merchants\' feedback. Please <a href="#" data-mage-init="%1">take our survey</a> and tell us about features you\'d like to see in Magento.',
             json_encode($params, JSON_FORCE_OBJECT)
         );
     }
@@ -130,6 +130,6 @@ class Survey implements \Magento\AdminNotification\Model\System\MessageInterface
      */
     public function getSeverity()
     {
-        return \Magento\AdminNotification\Model\System\MessageInterface::SEVERITY_MAJOR;
+        return \Magento\Framework\Notification\MessageInterface::SEVERITY_MAJOR;
     }
 }
diff --git a/app/code/Magento/Install/composer.json b/app/code/Magento/Install/composer.json
index fc8c08ee1d03b2d1cf148e7d0a235136d815873a..37ae0241420a80e98dcd5773225ffe4e973633ea 100644
--- a/app/code/Magento/Install/composer.json
+++ b/app/code/Magento/Install/composer.json
@@ -2,18 +2,17 @@
     "name": "magento/module-install",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-admin-notification": "0.1.0-alpha89",
-        "magento/module-directory": "0.1.0-alpha89",
-        "magento/module-user": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-directory": "0.1.0-alpha90",
+        "magento/module-user": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Install/etc/adminhtml/routes.xml b/app/code/Magento/Install/etc/adminhtml/routes.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6561687d7773fb8250d0755ce934e75471934e24
--- /dev/null
+++ b/app/code/Magento/Install/etc/adminhtml/routes.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 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/App/etc/routes.xsd">
+    <router id="admin">
+        <route id="adminhtml">
+            <module name="Magento_Install" before="Magento_Adminhtml" />
+        </route>
+    </router>
+</config>
diff --git a/app/code/Magento/Install/etc/di.xml b/app/code/Magento/Install/etc/di.xml
index 5978523573d55e3f02b33ff4f872f2d8e7168abc..c502e62e5a7adc0a6baa0c47d50c770e7b8e2096 100644
--- a/app/code/Magento/Install/etc/di.xml
+++ b/app/code/Magento/Install/etc/di.xml
@@ -36,6 +36,13 @@
             <argument name="storage" xsi:type="object">Magento\Install\Model\Session\Storage</argument>
         </arguments>
     </virtualType>
+    <type name="Magento\Framework\Notification\MessageList">
+        <arguments>
+            <argument name="messages" xsi:type="array">
+                <item name="survey" xsi:type="string">Magento\Install\Model\System\Message\Survey</item>
+            </argument>
+        </arguments>
+    </type>
     <type name="Magento\Install\Block\Begin">
         <arguments>
             <argument name="eulaFile" xsi:type="string">LICENSE.html</argument>
diff --git a/app/code/Magento/Install/etc/module.xml b/app/code/Magento/Install/etc/module.xml
index bb2fd20c81ddc357636def4c7e56a901e18b5ec4..64f361175393ff1bf39b3874d06710feacc5dc42 100644
--- a/app/code/Magento/Install/etc/module.xml
+++ b/app/code/Magento/Install/etc/module.xml
@@ -31,7 +31,6 @@
         </sequence>
         <depends>
             <module name="Magento_Store"/>
-            <module name="Magento_AdminNotification"/>
             <module name="Magento_Directory"/>
             <module name="Magento_User"/>
             <module name="Magento_Backend"/>
diff --git a/app/code/Magento/Install/view/adminhtml/layout/default.xml b/app/code/Magento/Install/view/adminhtml/layout/default.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4eb246a43bf1f7239fbe75ee18f46daf61842249
--- /dev/null
+++ b/app/code/Magento/Install/view/adminhtml/layout/default.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)
+ */
+-->
+<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../Core/etc/layout_single.xsd">
+    <referenceBlock name="head">
+        <block class="Magento\Theme\Block\Html\Head\Script" name="magento-install-survey-notification-js" after="jquery">
+            <arguments>
+                <argument name="file" xsi:type="string">Magento_Install::survey_notification.js</argument>
+            </arguments>
+        </block>
+    </referenceBlock>
+</layout>
diff --git a/app/code/Magento/Install/view/adminhtml/web/survey_notification.js b/app/code/Magento/Install/view/adminhtml/web/survey_notification.js
new file mode 100644
index 0000000000000000000000000000000000000000..c008c47217a2d7649628c7da25d5c6613f830667
--- /dev/null
+++ b/app/code/Magento/Install/view/adminhtml/web/survey_notification.js
@@ -0,0 +1,41 @@
+/**
+ * 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)
+ */
+/*jshint jquery:true*/
+require(["jquery"], function($){
+    "use strict";
+
+    $(document).ready(function(){
+        $('body').on('surveyYes surveyNo', function(e, data) {
+            if (e.type == 'surveyYes') {
+                var win = window.open(data.surveyUrl, '', 'width=900,height=600,resizable=1,scrollbars=1');
+                win.focus();
+            }
+            $.ajax({
+                url: data.surveyAction,
+                type: 'post',
+                data: {decision: data.decision}
+            });
+        });
+    });
+
+});
diff --git a/app/code/Magento/Integration/Block/Adminhtml/Integration/Tokens.php b/app/code/Magento/Integration/Block/Adminhtml/Integration/Tokens.php
index a18d4416e1e42f8e3538d4d83f6598f81cc904f6..fc65d977e6ad6ad19ef275a2279a3c6523a6d276 100644
--- a/app/code/Magento/Integration/Block/Adminhtml/Integration/Tokens.php
+++ b/app/code/Magento/Integration/Block/Adminhtml/Integration/Tokens.php
@@ -33,16 +33,12 @@ use Magento\Integration\Controller\Adminhtml\Integration as IntegrationControlle
 class Tokens extends \Magento\Backend\Block\Widget\Form\Generic
 {
     /**#@+
-     * Form elements names.
+     * Form element name.
      */
     const DATA_TOKEN = 'token';
-
     const DATA_TOKEN_SECRET = 'token_secret';
-
     const DATA_CONSUMER_KEY = 'consumer_key';
-
     const DATA_CONSUMER_SECRET = 'consumer_secret';
-
     /**#@-*/
 
     /**
diff --git a/app/code/Magento/Integration/Controller/Adminhtml/Integration/TokensExchange.php b/app/code/Magento/Integration/Controller/Adminhtml/Integration/TokensExchange.php
index 6c68fd46dfd4afc244560c62497ef220b37da9ee..978d7394e6bbbdec474277f127de938544b52e4a 100644
--- a/app/code/Magento/Integration/Controller/Adminhtml/Integration/TokensExchange.php
+++ b/app/code/Magento/Integration/Controller/Adminhtml/Integration/TokensExchange.php
@@ -60,7 +60,7 @@ class TokensExchange extends \Magento\Integration\Controller\Adminhtml\Integrati
             $integration = $this->_integrationService->get($integrationId);
             if ($isReauthorize) {
                 /** Remove existing token associated with consumer before issuing a new one. */
-                $this->_oauthService->deleteToken($integration->getConsumerId());
+                $this->_oauthService->deleteIntegrationToken($integration->getConsumerId());
                 $integration->setStatus(IntegrationModel::STATUS_INACTIVE)->save();
             }
             //Integration chooses to use Oauth for token exchange
diff --git a/app/code/Magento/Integration/Model/Integration.php b/app/code/Magento/Integration/Model/Integration.php
index 03df47f4b40323545649b260cc0767e3511faaf9..4daefc25f71bd9bda98a7c8d3b553121164adf0a 100644
--- a/app/code/Magento/Integration/Model/Integration.php
+++ b/app/code/Magento/Integration/Model/Integration.php
@@ -43,6 +43,7 @@ namespace Magento\Integration\Model;
  * @method Integration setCreatedAt(\string $createdAt)
  * @method \string getUpdatedAt()
  * @method Integration setUpdatedAt(\string $createdAt)
+ * @method \Magento\Integration\Model\Resource\Integration getResource()
  */
 class Integration extends \Magento\Framework\Model\AbstractModel
 {
@@ -147,6 +148,19 @@ class Integration extends \Magento\Framework\Model\AbstractModel
         return $this->load($consumerId, self::CONSUMER_ID);
     }
 
+    /**
+     * Load active integration by oAuth consumer ID.
+     *
+     * @param int $consumerId
+     * @return $this
+     */
+    public function loadActiveIntegrationByConsumerId($consumerId)
+    {
+        $integrationData = $this->getResource()->selectActiveIntegrationByConsumerId($consumerId);
+        $this->setData($integrationData ? $integrationData : []);
+        return $this;
+    }
+
     /**
      * Get integration status. Cast to the type of STATUS_* constants in order to make strict comparison valid.
      *
diff --git a/app/code/Magento/Integration/Model/Oauth/Token.php b/app/code/Magento/Integration/Model/Oauth/Token.php
index 67f2a3632d41761bab6d8dd47224dcc9b4a3d0aa..1d692ba2c656965d1165fc5ed360a270f3b583f9 100644
--- a/app/code/Magento/Integration/Model/Oauth/Token.php
+++ b/app/code/Magento/Integration/Model/Oauth/Token.php
@@ -23,6 +23,7 @@
  */
 namespace Magento\Integration\Model\Oauth;
 
+use Magento\Authorization\Model\UserContextInterface;
 use Magento\Framework\Oauth\Helper\Oauth as OauthHelper;
 use Magento\Integration\Model\Resource\Oauth\Token\Collection as TokenCollection;
 use Magento\Framework\Oauth\Exception as OauthException;
@@ -41,6 +42,8 @@ use Magento\Framework\Oauth\Exception as OauthException;
  * @method Token setAdminId() setAdminId(int $adminId)
  * @method int getCustomerId()
  * @method Token setCustomerId() setCustomerId(int $customerId)
+ * @method int getUserType()
+ * @method Token setUserType() setUserType(int $userType)
  * @method string getType()
  * @method Token setType() setType(string $type)
  * @method string getCallbackUrl()
@@ -70,15 +73,6 @@ class Token extends \Magento\Framework\Model\AbstractModel
 
     /**#@- */
 
-    /**#@+
-     * Customer types
-     */
-    const USER_TYPE_ADMIN = 'admin';
-
-    const USER_TYPE_CUSTOMER = 'customer';
-
-    /**#@- */
-
     /**
      * @var OauthHelper
      */
@@ -191,65 +185,52 @@ class Token extends \Magento\Framework\Model\AbstractModel
                     'token' => $this->_oauthHelper->generateToken(),
                     'secret' => $this->_oauthHelper->generateTokenSecret(),
                     'verifier' => $this->_oauthHelper->generateVerifier(),
-                    'callback_url' => OauthHelper::CALLBACK_ESTABLISHED
+                    'callback_url' => OauthHelper::CALLBACK_ESTABLISHED,
+                    'user_type' => UserContextInterface::USER_TYPE_INTEGRATION //As of now only integrations use Oauth
                 )
             );
+            $this->validate();
             $this->save();
         }
         return $this;
     }
 
     /**
-     * Authorize token
+     * Convert token to access type
      *
-     * @param int $userId Authorization user identifier
-     * @param string $userType Authorization user type
      * @return $this
      * @throws OauthException
      */
-    public function authorize($userId, $userType)
+    public function convertToAccess()
     {
-        if (!$this->getId() || !$this->getConsumerId()) {
-            throw new OauthException('Token is not ready to be authorized');
-        }
-        if ($this->getAuthorized()) {
-            throw new OauthException('Token is already authorized');
-        }
-        if (self::USER_TYPE_ADMIN == $userType) {
-            $this->setAdminId($userId);
-        } elseif (self::USER_TYPE_CUSTOMER == $userType) {
-            $this->setCustomerId($userId);
-        } else {
-            throw new OauthException('User type is unknown');
+        if (self::TYPE_REQUEST != $this->getType()) {
+            throw new OauthException('Cannot convert to access token due to token is not request type');
         }
-
-        $this->setVerifier($this->_oauthHelper->generateVerifier());
-        $this->setAuthorized(1);
-        $this->save();
-
-        $this->getResource()->cleanOldAuthorizedTokensExcept($this);
-
-        return $this;
+        return $this->saveAccessToken(UserContextInterface::USER_TYPE_INTEGRATION);
     }
 
     /**
-     * Convert token to access type
+     * Create access token for a admin
      *
+     * @param int $userId
      * @return $this
-     * @throws OauthException
      */
-    public function convertToAccess()
+    public function createAdminToken($userId)
     {
-        if (self::TYPE_REQUEST != $this->getType()) {
-            throw new OauthException('Cannot convert to access token due to token is not request type');
-        }
-
-        $this->setType(self::TYPE_ACCESS);
-        $this->setToken($this->_oauthHelper->generateToken());
-        $this->setSecret($this->_oauthHelper->generateTokenSecret());
-        $this->save();
+        $this->setAdminId($userId);
+        return $this->saveAccessToken(UserContextInterface::USER_TYPE_ADMIN);
+    }
 
-        return $this;
+    /**
+     * Create access token for a customer
+     *
+     * @param int $userId
+     * @return $this
+     */
+    public function createCustomerToken($userId)
+    {
+        $this->setCustomerId($userId);
+        return $this->saveAccessToken(UserContextInterface::USER_TYPE_CUSTOMER, $userId);
     }
 
     /**
@@ -271,28 +252,12 @@ class Token extends \Magento\Framework\Model\AbstractModel
                 'callback_url' => $callbackUrl
             )
         );
+        $this->validate();
         $this->save();
 
         return $this;
     }
 
-    /**
-     * Get OAuth user type
-     *
-     * @return string
-     * @throws OauthException
-     */
-    public function getUserType()
-    {
-        if ($this->getAdminId()) {
-            return self::USER_TYPE_ADMIN;
-        } elseif ($this->getCustomerId()) {
-            return self::USER_TYPE_CUSTOMER;
-        } else {
-            throw new OauthException('User type is unknown');
-        }
-    }
-
     /**
      * Get string representation of token
      *
@@ -312,8 +277,6 @@ class Token extends \Magento\Framework\Model\AbstractModel
      */
     protected function _beforeSave()
     {
-        $this->validate();
-
         if ($this->isObjectNew() && null === $this->getCreatedAt()) {
             $this->setCreatedAt($this->_dateTime->now());
         }
@@ -365,39 +328,78 @@ class Token extends \Magento\Framework\Model\AbstractModel
     }
 
     /**
-     * Get Token Consumer
+     * Return the token's verifier.
      *
-     * @return \Magento\Integration\Model\Oauth\Consumer
+     * @return string
      */
-    public function getConsumer()
+    public function getVerifier()
     {
-        if (!$this->getData('consumer')) {
-            $consumer = $this->_consumerFactory->create()->load($this->getConsumerId());
-            $this->setData('consumer', $consumer);
-        }
+        return $this->getData('verifier');
+    }
 
-        return $this->getData('consumer');
+    /**
+     * Generate and save access token for a given user type
+     *
+     * @param int $userType
+     * @return $this
+     */
+    protected function saveAccessToken($userType)
+    {
+        $this->setUserType($userType);
+        $this->setType(self::TYPE_ACCESS);
+        $this->setToken($this->_oauthHelper->generateToken());
+        $this->setSecret($this->_oauthHelper->generateTokenSecret());
+        return $this->save();
     }
 
     /**
-     * Return the token's verifier.
+     * Get token by consumer and user type
      *
-     * @return string
+     * @param int $consumerId
+     * @param int $userType
+     * @return $this
      */
-    public function getVerifier()
+    public function loadByConsumerIdAndUserType($consumerId, $userType)
     {
-        return $this->getData('verifier');
+        $tokenData = $this->getResource()->selectTokenByConsumerIdAndUserType($consumerId, $userType);
+        $this->setData($tokenData ? $tokenData : []);
+        return $this;
+    }
+
+    /**
+     * Get token by admin id
+     *
+     * @param int $adminId
+     * @return $this
+     */
+    public function loadByAdminId($adminId)
+    {
+        $tokenData = $this->getResource()->selectTokenByAdminId($adminId);
+        $this->setData($tokenData ? $tokenData : []);
+        return $this;
     }
 
     /**
-     * Set the token's verifier.
+     * Get token by admin id
      *
-     * @param string $verifier
+     * @param int $customerId
      * @return $this
      */
-    public function setVerifier($verifier)
+    public function loadByCustomerId($customerId)
     {
-        $this->setData('verifier', $verifier);
+        $tokenData = $this->getResource()->selectTokenByCustomerId($customerId);
+        $this->setData($tokenData ? $tokenData : []);
         return $this;
     }
+
+    /**
+     * Load token data by token.
+     *
+     * @param string $token
+     * @return $this
+     */
+    public function loadByToken($token)
+    {
+        return $this->load($token, 'token');
+    }
 }
diff --git a/app/code/Magento/Integration/Model/Oauth/Token/Provider.php b/app/code/Magento/Integration/Model/Oauth/Token/Provider.php
index 8ca3ff82b52b22d58e90a3411b2e260431390ce1..1ac01035d5027ac4666c81f66dfd47535852d004 100644
--- a/app/code/Magento/Integration/Model/Oauth/Token/Provider.php
+++ b/app/code/Magento/Integration/Model/Oauth/Token/Provider.php
@@ -21,9 +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\Integration\Model\Oauth\Token;
 
+use Magento\Authorization\Model\UserContextInterface;
 use Magento\Framework\Oauth\TokenProviderInterface;
+use Magento\Integration\Model\Oauth\Token;
 
 class Provider implements TokenProviderInterface
 {
@@ -47,22 +50,30 @@ class Provider implements TokenProviderInterface
      */
     protected $_date;
 
+    /**
+     * @var Token
+     */
+    protected $token;
+
     /**
      * @param \Magento\Integration\Model\Oauth\Consumer\Factory $consumerFactory
      * @param \Magento\Integration\Model\Oauth\Token\Factory $tokenFactory
      * @param \Magento\Integration\Helper\Oauth\Data $dataHelper
      * @param \Magento\Framework\Stdlib\DateTime\DateTime $date
+     * @param Token $token
      */
     public function __construct(
         \Magento\Integration\Model\Oauth\Consumer\Factory $consumerFactory,
         \Magento\Integration\Model\Oauth\Token\Factory $tokenFactory,
         \Magento\Integration\Helper\Oauth\Data $dataHelper,
-        \Magento\Framework\Stdlib\DateTime\DateTime $date
+        \Magento\Framework\Stdlib\DateTime\DateTime $date,
+        Token $token
     ) {
         $this->_consumerFactory = $consumerFactory;
         $this->_tokenFactory = $tokenFactory;
         $this->_dataHelper = $dataHelper;
         $this->_date = $date;
+        $this->token = $token;
     }
 
     /**
@@ -86,8 +97,8 @@ class Provider implements TokenProviderInterface
      */
     public function createRequestToken($consumer)
     {
-        $token = $this->getTokenByConsumerId($consumer->getId());
-        if ($token->getType() != \Magento\Integration\Model\Oauth\Token::TYPE_VERIFIER) {
+        $token = $this->getIntegrationTokenByConsumerId($consumer->getId());
+        if ($token->getType() != Token::TYPE_VERIFIER) {
             throw new \Magento\Framework\Oauth\Exception(
                 'Cannot create request token because consumer token is not a verifier token'
             );
@@ -111,7 +122,7 @@ class Provider implements TokenProviderInterface
 
         // The pre-auth token has a value of "request" in the type when it is requested and created initially.
         // In this flow (token flow) the token has to be of type "request" else its marked as reused.
-        if (\Magento\Integration\Model\Oauth\Token::TYPE_REQUEST != $token->getType()) {
+        if (Token::TYPE_REQUEST != $token->getType()) {
             throw new \Magento\Framework\Oauth\Exception(
                 'Token is already being used'
             );
@@ -128,8 +139,8 @@ class Provider implements TokenProviderInterface
     public function getAccessToken($consumer)
     {
         /** TODO: log the request token in dev mode since its not persisted. */
-        $token = $this->getTokenByConsumerId($consumer->getId());
-        if (\Magento\Integration\Model\Oauth\Token::TYPE_REQUEST != $token->getType()) {
+        $token = $this->getIntegrationTokenByConsumerId($consumer->getId());
+        if (Token::TYPE_REQUEST != $token->getType()) {
             throw new \Magento\Framework\Oauth\Exception(
                 'Cannot get access token because consumer token is not a request token'
             );
@@ -150,7 +161,7 @@ class Provider implements TokenProviderInterface
                 'Token is not associated with the specified consumer'
             );
         }
-        if (\Magento\Integration\Model\Oauth\Token::TYPE_ACCESS != $token->getType()) {
+        if (Token::TYPE_ACCESS != $token->getType()) {
             throw new \Magento\Framework\Oauth\Exception(
                 'Token is not an access token'
             );
@@ -173,7 +184,7 @@ class Provider implements TokenProviderInterface
         // Make sure a consumer is associated with the token.
         $this->_getConsumer($token->getConsumerId());
 
-        if (\Magento\Integration\Model\Oauth\Token::TYPE_ACCESS != $token->getType()) {
+        if (Token::TYPE_ACCESS != $token->getType()) {
             throw new \Magento\Framework\Oauth\Exception(
                 'Token is not an access token'
             );
@@ -270,7 +281,7 @@ class Provider implements TokenProviderInterface
      * Load token object and validate it.
      *
      * @param string $token
-     * @return \Magento\Integration\Model\Oauth\Token
+     * @return Token
      * @throws \Magento\Framework\Oauth\Exception
      */
     protected function _getToken($token)
@@ -296,12 +307,12 @@ class Provider implements TokenProviderInterface
      * Load token object given a consumer Id.
      *
      * @param int $consumerId - The Id of the consumer.
-     * @return \Magento\Integration\Model\Oauth\Token
+     * @return Token
      * @throws \Magento\Framework\Oauth\Exception
      */
-    public function getTokenByConsumerId($consumerId)
+    public function getIntegrationTokenByConsumerId($consumerId)
     {
-        $token = $this->_tokenFactory->create()->load($consumerId, 'consumer_id');
+        $token = $this->token->loadByConsumerIdAndUserType($consumerId, UserContextInterface::USER_TYPE_INTEGRATION);
 
         if (!$token->getId()) {
             throw new \Magento\Framework\Oauth\Exception(
@@ -316,7 +327,7 @@ class Provider implements TokenProviderInterface
     /**
      * Check if token belongs to the same consumer.
      *
-     * @param \Magento\Integration\Model\Oauth\Token $token
+     * @param Token $token
      * @param \Magento\Framework\Oauth\ConsumerInterface $consumer
      * @return bool
      */
diff --git a/app/code/Magento/Integration/Model/Resource/Integration.php b/app/code/Magento/Integration/Model/Resource/Integration.php
index 39c9f60bc1a53d9b2252b958a31ef9ec1679a21b..54f3c460daba5e1a544ce1121e61ada94064bc59 100644
--- a/app/code/Magento/Integration/Model/Resource/Integration.php
+++ b/app/code/Magento/Integration/Model/Resource/Integration.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\Integration\Model\Resource;
 
 /**
@@ -37,4 +38,20 @@ class Integration extends \Magento\Framework\Model\Resource\Db\AbstractDb
     {
         $this->_init('integration', 'integration_id');
     }
+
+    /**
+     * Select token for a given customer.
+     *
+     * @param int $consumerId
+     * @return array|boolean - Row data (array) or false if there is no corresponding row
+     */
+    public function selectActiveIntegrationByConsumerId($consumerId)
+    {
+        $adapter = $this->_getReadAdapter();
+        $select = $adapter->select()
+            ->from($this->getMainTable())
+            ->where('consumer_id = ?', $consumerId)
+            ->where('status = ?', \Magento\Integration\Model\Integration::STATUS_ACTIVE);
+        return $adapter->fetchRow($select);
+    }
 }
diff --git a/app/code/Magento/Integration/Model/Resource/Oauth/Token.php b/app/code/Magento/Integration/Model/Resource/Oauth/Token.php
index 522696ae63ec6fa9ddd9e7c9f2331f9aaf8b3854..469f492ac3a9059c5a9d0fabef2b1e2c5db4ace2 100644
--- a/app/code/Magento/Integration/Model/Resource/Oauth/Token.php
+++ b/app/code/Magento/Integration/Model/Resource/Oauth/Token.php
@@ -23,6 +23,8 @@
  */
 namespace Magento\Integration\Model\Resource\Oauth;
 
+use Magento\Authorization\Model\UserContextInterface;
+
 /**
  * OAuth token resource model
  */
@@ -116,15 +118,59 @@ class Token extends \Magento\Framework\Model\Resource\Db\AbstractDb
     public function selectTokenByType($consumerId, $type)
     {
         $adapter = $this->_getReadAdapter();
-        $select = $adapter->select()->from(
-            $this->getMainTable()
-        )->where(
-            'consumer_id = ?',
-            $consumerId
-        )->where(
-            'type = ?',
-            $type
-        );
+        $select = $adapter->select()
+            ->from($this->getMainTable())
+            ->where('consumer_id = ?', $consumerId)
+            ->where('type = ?', $type);
+        return $adapter->fetchRow($select);
+    }
+
+    /**
+     * Select token for a given consumer and user type.
+     *
+     * @param int $consumerId
+     * @param int $userType
+     * @return array|boolean - Row data (array) or false if there is no corresponding row
+     */
+    public function selectTokenByConsumerIdAndUserType($consumerId, $userType)
+    {
+        $adapter = $this->_getReadAdapter();
+        $select = $adapter->select()
+            ->from($this->getMainTable())
+            ->where('consumer_id = ?', (int)$consumerId)
+            ->where('user_type = ?', (int)$userType);
+        return $adapter->fetchRow($select);
+    }
+
+    /**
+     * Select token for a given admin id.
+     *
+     * @param int $adminId
+     * @return array|boolean - Row data (array) or false if there is no corresponding row
+     */
+    public function selectTokenByAdminId($adminId)
+    {
+        $adapter = $this->_getReadAdapter();
+        $select = $adapter->select()
+            ->from($this->getMainTable())
+            ->where('admin_id = ?', $adminId)
+            ->where('user_type = ?', UserContextInterface::USER_TYPE_ADMIN);
+        return $adapter->fetchRow($select);
+    }
+
+    /**
+     * Select token for a given customer.
+     *
+     * @param int $customerId
+     * @return array|boolean - Row data (array) or false if there is no corresponding row
+     */
+    public function selectTokenByCustomerId($customerId)
+    {
+        $adapter = $this->_getReadAdapter();
+        $select = $adapter->select()
+            ->from($this->getMainTable())
+            ->where('customer_id = ?', $customerId)
+            ->where('user_type = ?', UserContextInterface::USER_TYPE_CUSTOMER);
         return $adapter->fetchRow($select);
     }
 }
diff --git a/app/code/Magento/Integration/Service/V1/AuthorizationService.php b/app/code/Magento/Integration/Service/V1/AuthorizationService.php
new file mode 100644
index 0000000000000000000000000000000000000000..bcbcfdff755efad4e1ee0857fcebc9ad823fd5a2
--- /dev/null
+++ b/app/code/Magento/Integration/Service/V1/AuthorizationService.php
@@ -0,0 +1,214 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Integration\Service\V1;
+
+use Magento\Authorization\Model\Resource\Role\CollectionFactory as RoleCollectionFactory;
+use Magento\Authorization\Model\Resource\Rules\CollectionFactory as RulesCollectionFactory;
+use Magento\Authorization\Model\Role;
+use Magento\Authorization\Model\RoleFactory;
+use Magento\Authorization\Model\RulesFactory;
+use Magento\Authorization\Model\UserContextInterface;
+use Magento\Framework\Acl;
+use Magento\Framework\Acl\Builder as AclBuilder;
+use Magento\Framework\Acl\RootResource as RootAclResource;
+use Magento\Framework\Exception\LocalizedException;
+use Magento\Framework\Exception\NoSuchEntityException;
+use Magento\Framework\Logger;
+
+/**
+ * Service for integration permissions management.
+ *
+ * @SuppressWarnings(PHPMD.LongVariable)
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
+class AuthorizationService implements AuthorizationServiceInterface
+{
+    /**
+     * @var AclBuilder
+     */
+    protected $_aclBuilder;
+
+    /**
+     * @var RoleFactory
+     */
+    protected $_roleFactory;
+
+    /**
+     * @var RoleCollectionFactory
+     */
+    protected $_roleCollectionFactory;
+
+    /**
+     * @var RulesFactory
+     */
+    protected $_rulesFactory;
+
+    /**
+     * @var RulesCollectionFactory
+     */
+    protected $_rulesCollectionFactory;
+
+    /**
+     * @var Logger
+     */
+    protected $_logger;
+
+    /**
+     * @var RootAclResource
+     */
+    protected $_rootAclResource;
+
+    /**
+     * Initialize dependencies.
+     *
+     * @param AclBuilder $aclBuilder
+     * @param RoleFactory $roleFactory
+     * @param RoleCollectionFactory $roleCollectionFactory
+     * @param RulesFactory $rulesFactory
+     * @param RulesCollectionFactory $rulesCollectionFactory
+     * @param Logger $logger
+     * @param RootAclResource $rootAclResource
+     */
+    public function __construct(
+        AclBuilder $aclBuilder,
+        RoleFactory $roleFactory,
+        RoleCollectionFactory $roleCollectionFactory,
+        RulesFactory $rulesFactory,
+        RulesCollectionFactory $rulesCollectionFactory,
+        Logger $logger,
+        RootAclResource $rootAclResource
+    ) {
+        $this->_aclBuilder = $aclBuilder;
+        $this->_roleFactory = $roleFactory;
+        $this->_rulesFactory = $rulesFactory;
+        $this->_rulesCollectionFactory = $rulesCollectionFactory;
+        $this->_roleCollectionFactory = $roleCollectionFactory;
+        $this->_logger = $logger;
+        $this->_rootAclResource = $rootAclResource;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function grantPermissions($integrationId, $resources)
+    {
+        try {
+            $role = $this->_getUserRole($integrationId);
+            if (!$role) {
+                $role = $this->_createRole($integrationId);
+            }
+            $this->_associateResourcesWithRole($role, $resources);
+        } catch (\Exception $e) {
+            $this->_logger->logException($e);
+            throw new LocalizedException('Error happened while granting permissions. Check exception log for details.');
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function grantAllPermissions($integrationId)
+    {
+        $this->grantPermissions($integrationId, array($this->_rootAclResource->getId()));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function removePermissions($integrationId)
+    {
+        try {
+            $this->_deleteRole($integrationId);
+        } catch (\Exception $e) {
+            $this->_logger->logException($e);
+            throw new LocalizedException(
+                'Error happened while deleting role and permissions. Check exception log for details.'
+            );
+        }
+    }
+
+    /**
+     * Create new ACL role.
+     *
+     * @param int $integrationId
+     * @return \Magento\Authorization\Model\Role
+     */
+    protected function _createRole($integrationId)
+    {
+        $roleName = UserContextInterface::USER_TYPE_INTEGRATION . $integrationId;
+        $role = $this->_roleFactory->create();
+        $role->setRoleName($roleName)
+            ->setUserType(UserContextInterface::USER_TYPE_INTEGRATION)
+            ->setUserId($integrationId)
+            ->setRoleType(\Magento\Authorization\Model\Acl\Role\User::ROLE_TYPE)
+            ->setParentId(0)
+            ->save();
+        return $role;
+    }
+
+    /**
+     * Remove integration role. This deletes the cascading permissions
+     *
+     * @param int $integrationId
+     * @return \Magento\Authorization\Model\Role
+     */
+    protected function _deleteRole($integrationId)
+    {
+        $roleName = UserContextInterface::USER_TYPE_INTEGRATION . $integrationId;
+        $role = $this->_roleFactory->create()->load($roleName, 'role_name');
+        return $role->delete();
+    }
+
+    /**
+     * Identify authorization role associated with provided integration.
+     *
+     * @param int $integrationId
+     * @return \Magento\Authorization\Model\Role|false Return false in case when no role associated with user was found.
+     */
+    protected function _getUserRole($integrationId)
+    {
+        $roleCollection = $this->_roleCollectionFactory->create();
+        /** @var Role $role */
+        $role = $roleCollection
+            ->setUserFilter($integrationId, UserContextInterface::USER_TYPE_INTEGRATION)
+            ->getFirstItem();
+        return $role->getId() ? $role : false;
+    }
+
+    /**
+     * Associate resources with the specified role. All resources previously assigned to the role will be unassigned.
+     *
+     * @param \Magento\Authorization\Model\Role $role
+     * @param string[] $resources
+     * @return void
+     * @throws \LogicException
+     */
+    protected function _associateResourcesWithRole($role, $resources)
+    {
+        /** @var \Magento\Authorization\Model\Rules $rules */
+        $rules = $this->_rulesFactory->create();
+        $rules->setRoleId($role->getId())->setResources($resources)->saveRel();
+    }
+}
diff --git a/app/code/Magento/Integration/Service/V1/AuthorizationServiceInterface.php b/app/code/Magento/Integration/Service/V1/AuthorizationServiceInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..1b7b04381387df540aba1187c0606f60b0adf98b
--- /dev/null
+++ b/app/code/Magento/Integration/Service/V1/AuthorizationServiceInterface.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\Integration\Service\V1;
+
+use Magento\Framework\Exception\LocalizedException;
+
+/**
+ * Interface for integration permissions management.
+ */
+interface AuthorizationServiceInterface
+{
+    /**#@+
+     * Permission type
+     */
+    const PERMISSION_ANONYMOUS = 'anonymous';
+    const PERMISSION_SELF = 'self';
+    /**#@- */
+
+    /**
+     * Grant permissions to user to access the specified resources.
+     *
+     * @param int $integrationId
+     * @param string[] $resources List of resources which should be available to the specified user.
+     * @return void
+     * @throws LocalizedException
+     */
+    public function grantPermissions($integrationId, $resources);
+
+    /**
+     * Grant permissions to the user to access all resources available in the system.
+     *
+     * @param int $integrationId
+     * @return void
+     * @throws LocalizedException
+     */
+    public function grantAllPermissions($integrationId);
+
+    /**
+     * Remove role and associated permissions for the specified integration.
+     *
+     * @param int $integrationId
+     * @return void
+     * @throws LocalizedException
+     */
+    public function removePermissions($integrationId);
+}
diff --git a/app/code/Magento/Integration/Service/V1/Integration.php b/app/code/Magento/Integration/Service/V1/Integration.php
index 9158e6de05f32bb71e9e37a13dd196bb2cf0536a..015a8b0f1ed025db77cf48dce80737847bc0ebdd 100644
--- a/app/code/Magento/Integration/Service/V1/Integration.php
+++ b/app/code/Magento/Integration/Service/V1/Integration.php
@@ -127,6 +127,15 @@ class Integration implements \Magento\Integration\Service\V1\IntegrationInterfac
         return $integration;
     }
 
+    /**
+     * {@inheritdoc}
+     */
+    public function findActiveIntegrationByConsumerId($consumerId)
+    {
+        $integration = $this->_integrationFactory->create()->loadActiveIntegrationByConsumerId($consumerId);
+        return $integration;
+    }
+
     /**
      * Check if an integration exists by the name
      *
diff --git a/app/code/Magento/Integration/Service/V1/IntegrationInterface.php b/app/code/Magento/Integration/Service/V1/IntegrationInterface.php
index 473d6926dd4e1bacf63f440a24d1bbdac1aefd68..651089a51e57795516f58240022840bde53f3cad 100644
--- a/app/code/Magento/Integration/Service/V1/IntegrationInterface.php
+++ b/app/code/Magento/Integration/Service/V1/IntegrationInterface.php
@@ -64,6 +64,14 @@ interface IntegrationInterface
      */
     public function findByConsumerId($consumerId);
 
+    /**
+     * Get the details of an active Integration by consumer_id.
+     *
+     * @param int $consumerId
+     * @return IntegrationModel
+     */
+    public function findActiveIntegrationByConsumerId($consumerId);
+
     /**
      * Update an Integration.
      *
diff --git a/app/code/Magento/Integration/Service/V1/Oauth.php b/app/code/Magento/Integration/Service/V1/Oauth.php
index 054de2b401356738ef07f24895409bf0745a86f6..0456688ad2172e9e9733027af6339ef1d7d430ef 100644
--- a/app/code/Magento/Integration/Service/V1/Oauth.php
+++ b/app/code/Magento/Integration/Service/V1/Oauth.php
@@ -24,7 +24,7 @@
 namespace Magento\Integration\Service\V1;
 
 use Magento\Integration\Model\Oauth\Token\Provider as TokenProvider;
-use Magento\Integration\Model\Oauth\Token;
+use Magento\Integration\Model\Oauth\Token as OauthTokenModel;
 use Magento\Integration\Model\Oauth\Token\Factory as TokenFactory;
 use Magento\Integration\Helper\Oauth\Data as IntegrationOauthHelper;
 use Magento\Framework\Oauth\Helper\Oauth as OauthHelper;
@@ -138,7 +138,7 @@ class Oauth implements OauthInterface
     {
         try {
             $consumer = $this->_consumerFactory->create()->load($consumerId);
-            $existingToken = $this->_tokenProvider->getTokenByConsumerId($consumer->getId());
+            $existingToken = $this->_tokenProvider->getIntegrationTokenByConsumerId($consumer->getId());
             if ($existingToken && $clearExistingToken) {
                 $existingToken->delete();
                 unset($existingToken);
@@ -162,8 +162,8 @@ class Oauth implements OauthInterface
     {
         try {
             $consumer = $this->_consumerFactory->create()->load($consumerId);
-            $token = $this->_tokenProvider->getTokenByConsumerId($consumer->getId());
-            if ($token->getType() != Token::TYPE_ACCESS) {
+            $token = $this->_tokenProvider->getIntegrationTokenByConsumerId($consumer->getId());
+            if ($token->getType() != OauthTokenModel::TYPE_ACCESS) {
                 return false;
             }
         } catch (\Exception $e) {
@@ -260,11 +260,11 @@ class Oauth implements OauthInterface
     /**
      * {@inheritdoc}
      */
-    public function deleteToken($consumerId)
+    public function deleteIntegrationToken($consumerId)
     {
         try {
             $consumer = $this->_consumerFactory->create()->load($consumerId);
-            $existingToken = $this->_tokenProvider->getTokenByConsumerId($consumer->getId());
+            $existingToken = $this->_tokenProvider->getIntegrationTokenByConsumerId($consumer->getId());
             $existingToken->delete();
             return true;
         } catch (\Exception $e) {
diff --git a/app/code/Magento/Integration/Service/V1/OauthInterface.php b/app/code/Magento/Integration/Service/V1/OauthInterface.php
index 7a1859b1bd4ee263a5c4b4fbb81ddc31ab1d5056..c468a2067ab7a994ffd86af08d35af2bf2b55349 100644
--- a/app/code/Magento/Integration/Service/V1/OauthInterface.php
+++ b/app/code/Magento/Integration/Service/V1/OauthInterface.php
@@ -23,7 +23,7 @@
  */
 namespace Magento\Integration\Service\V1;
 
-use Magento\Integration\Model\Oauth\Token;
+use Magento\Integration\Model\Oauth\Token as OauthTokenModel;
 
 /**
  * Integration oAuth Service Interface
@@ -59,7 +59,7 @@ interface OauthInterface
      * Retrieve access token assigned to the consumer.
      *
      * @param int $consumerId
-     * @return Token|bool Return false if no access token is available.
+     * @return OauthTokenModel|bool Return false if no access token is available.
      */
     public function getAccessToken($consumerId);
 
@@ -108,5 +108,5 @@ interface OauthInterface
      * @param int $consumerId
      * @return bool If token was deleted
      */
-    public function deleteToken($consumerId);
+    public function deleteIntegrationToken($consumerId);
 }
diff --git a/app/code/Magento/Integration/Service/V1/TokenService.php b/app/code/Magento/Integration/Service/V1/TokenService.php
new file mode 100644
index 0000000000000000000000000000000000000000..0b860f33655ad7666794ac0071fbce1c791727b4
--- /dev/null
+++ b/app/code/Magento/Integration/Service/V1/TokenService.php
@@ -0,0 +1,132 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Integration\Service\V1;
+
+use Magento\Customer\Service\V1\CustomerAccountServiceInterface as CustomerAccountService;
+use Magento\Framework\Exception\AuthenticationException;
+use Magento\Framework\Exception\InputException;
+use Magento\Framework\Exception\LocalizedException;
+use Magento\Integration\Model\Oauth\Token\Factory as TokenModelFactory;
+use Magento\User\Model\User as UserModel;
+
+/**
+ * Class to handle token generation for Admins and Customers
+ */
+class TokenService implements TokenServiceInterface
+{
+    /**
+     * Token Model
+     *
+     * @var TokenModelFactory
+     */
+    private $tokenModelFactory;
+
+    /**
+     * User Model
+     *
+     * @var UserModel
+     */
+    private $userModel;
+
+    /**
+     * Customer Account Service
+     *
+     * @var CustomerAccountService
+     */
+    private $customerAccountService;
+
+    /**
+     * Initialize service
+     *
+     * @param TokenModelFactory $tokenModelFactory
+     * @param UserModel $userModel
+     * @param CustomerAccountService $customerAccountService
+     */
+    public function __construct(
+        TokenModelFactory $tokenModelFactory,
+        UserModel $userModel,
+        CustomerAccountService $customerAccountService
+    ) {
+        $this->tokenModelFactory = $tokenModelFactory;
+        $this->userModel = $userModel;
+        $this->customerAccountService = $customerAccountService;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function createAdminAccessToken($username, $password)
+    {
+        $this->validateCredentials($username, $password);
+        try {
+            $this->userModel->login($username, $password);
+            if (!$this->userModel->getId()) {
+                /*
+                 * This message is same as one thrown in \Magento\Backend\Model\Auth to keep the behavior consistent.
+                 * Constant cannot be created in Auth Model since it uses legacy translation that doesn't support it.
+                 * Need to make sure that this is refactored once exception handling is updated in Auth Model.
+                 */
+                throw new AuthenticationException('Please correct the user name or password.');
+            }
+        } catch (\Magento\Backend\Model\Auth\Exception $e) {
+            throw new AuthenticationException($e->getMessage(), [], $e);
+        } catch (\Magento\Framework\Model\Exception $e) {
+            throw new LocalizedException($e->getMessage(), [], $e);
+        }
+        return $this->tokenModelFactory->create()->createAdminToken($this->userModel->getId())->getToken();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function createCustomerAccessToken($username, $password)
+    {
+        $this->validateCredentials($username, $password);
+        $customerDataObject = $this->customerAccountService->authenticate($username, $password);
+        return $this->tokenModelFactory->create()->createCustomerToken($customerDataObject->getId())->getToken();
+    }
+
+    /**
+     * Validate user credentials
+     *
+     * @param string $username
+     * @param string $password
+     * @return void
+     * @throws \Magento\Framework\Exception\InputException
+     */
+    protected function validateCredentials($username, $password)
+    {
+        $exception = new InputException();
+        if (!is_string($username) || strlen($username) == 0) {
+            $exception->addError(InputException::REQUIRED_FIELD, ['fieldName' => 'username']);
+        }
+        if (!is_string($username) || strlen($password) == 0) {
+            $exception->addError(InputException::REQUIRED_FIELD, ['fieldName' => 'password']);
+        }
+        if ($exception->wasErrorAdded()) {
+            throw $exception;
+        }
+    }
+}
diff --git a/app/code/Magento/Integration/Service/V1/TokenServiceInterface.php b/app/code/Magento/Integration/Service/V1/TokenServiceInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..0f374a7a638a7da5071c570e073ffb66a8af981f
--- /dev/null
+++ b/app/code/Magento/Integration/Service/V1/TokenServiceInterface.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\Integration\Service\V1;
+
+use Magento\Framework\Exception\AuthenticationException;
+use Magento\Framework\Exception\InputException;
+use Magento\Framework\Exception\LocalizedException;
+
+/**
+ * Interface providing token generation for Admins and Customers
+ */
+interface TokenServiceInterface
+{
+    /**
+     * Create access token for admin given the admin credentials.
+     *
+     * @param string $username
+     * @param string $password
+     * @return string Token created
+     * @throws InputException For invalid input
+     * @throws AuthenticationException
+     * @throws LocalizedException
+     */
+    public function createAdminAccessToken($username, $password);
+
+    /**
+     * Create access token for admin given the customer credentials.
+     *
+     * @param string $username
+     * @param string $password
+     * @return string Token created
+     * @throws InputException For invalid input
+     * @throws AuthenticationException
+     */
+    public function createCustomerAccessToken($username, $password);
+}
diff --git a/app/code/Magento/Integration/composer.json b/app/code/Magento/Integration/composer.json
index 0125d6d2c462e0f26a3fdfc8e7673f9d6e027d9b..221c3807348cf60518c50868ae177ff0f7e394bc 100644
--- a/app/code/Magento/Integration/composer.json
+++ b/app/code/Magento/Integration/composer.json
@@ -2,17 +2,19 @@
     "name": "magento/module-integration",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/module-user": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
+        "magento/module-authorization": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Integration/etc/di.xml b/app/code/Magento/Integration/etc/di.xml
index 1557064be5b651035c092c87a991a30546a48baf..b1460317df48edde0b4df2515ba732f7650fdec8 100644
--- a/app/code/Magento/Integration/etc/di.xml
+++ b/app/code/Magento/Integration/etc/di.xml
@@ -25,10 +25,12 @@
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
     <preference for="Magento\Integration\Service\V1\IntegrationInterface" type="Magento\Integration\Service\V1\Integration" />
+    <preference for="Magento\Integration\Service\V1\AuthorizationServiceInterface" type="Magento\Integration\Service\V1\AuthorizationService" />
     <preference for="Magento\Integration\Service\V1\OauthInterface" type="Magento\Integration\Service\V1\Oauth" />
     <preference for="Magento\Framework\Oauth\ConsumerInterface" type="Magento\Integration\Model\Oauth\Consumer"/>
     <preference for="Magento\Framework\Oauth\NonceGeneratorInterface" type="Magento\Integration\Model\Oauth\Nonce\Generator"/>
     <preference for="Magento\Framework\Oauth\TokenProviderInterface" type="Magento\Integration\Model\Oauth\Token\Provider"/>
+    <preference for="Magento\Integration\Service\V1\TokenServiceInterface" type="Magento\Integration\Service\V1\TokenService" />
     <type name="Magento\Integration\Model\Oauth\Nonce\Generator">
         <arguments>
             <argument name="date" xsi:type="object">Magento\Framework\Stdlib\DateTime\DateTime\Proxy</argument>
diff --git a/app/code/Magento/Integration/etc/module.xml b/app/code/Magento/Integration/etc/module.xml
index e16c617dce958721411ffb7e1dbc345c566fe29c..eb76e22b29dd2890c6411cdfec44fb19870d10df 100644
--- a/app/code/Magento/Integration/etc/module.xml
+++ b/app/code/Magento/Integration/etc/module.xml
@@ -24,17 +24,20 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
-    <module name="Magento_Integration" schema_version="1.0.0.2" active="true">
+    <module name="Magento_Integration" schema_version="1.0.0.3" active="true">
         <sequence>
             <module name="Magento_Core"/>
             <module name="Magento_Store"/>
+            <module name="Magento_User"/>
         </sequence>
         <depends>
+            <module name="Magento_Authorization"/>
             <module name="Magento_Store"/>
             <module name="Magento_Core"/>
             <module name="Magento_Backend"/>
             <module name="Magento_Customer"/>
             <module name="Magento_Theme"/>
+            <module name="Magento_User"/>
         </depends>
     </module>
 </config>
diff --git a/app/code/Magento/Integration/etc/webapi.xml b/app/code/Magento/Integration/etc/webapi.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2153888cff31988074bcf6d13f0861767df1454a
--- /dev/null
+++ b/app/code/Magento/Integration/etc/webapi.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)
+ */
+-->
+<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../app/code/Magento/Webapi/etc/webapi.xsd">
+    <route url="/V1/integration/admin/token" method="POST">
+        <service class="Magento\Integration\Service\V1\TokenServiceInterface" method="createAdminAccessToken"/>
+        <resources>
+            <resource ref="anonymous"/>
+        </resources>
+    </route>
+    <route url="/V1/integration/customer/token" method="POST">
+        <service class="Magento\Integration\Service\V1\TokenServiceInterface" method="createCustomerAccessToken"/>
+        <resources>
+            <resource ref="anonymous"/>
+        </resources>
+    </route>
+</routes>
diff --git a/app/code/Magento/Integration/sql/integration_setup/upgrade-1.0.0.2-1.0.0.3.php b/app/code/Magento/Integration/sql/integration_setup/upgrade-1.0.0.2-1.0.0.3.php
new file mode 100644
index 0000000000000000000000000000000000000000..f77a5d32b3cad4fa860034d239e147a24c696d76
--- /dev/null
+++ b/app/code/Magento/Integration/sql/integration_setup/upgrade-1.0.0.2-1.0.0.3.php
@@ -0,0 +1,68 @@
+<?php
+/**
+ * Upgrade script for integration table.
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Integration\Model\Resource\Setup */
+$installer = $this;
+
+/* @var $connection \Magento\Framework\DB\Adapter\AdapterInterface */
+$connection = $installer->getConnection();
+
+$oauthTokenTable = $installer->getTable('oauth_token');
+$adminTable = $installer->getTable('admin_user');
+$customerTable = $installer->getTable('customer_entity');
+
+$connection->addColumn(
+    $oauthTokenTable,
+    'user_type',
+    array(
+        'type' => \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
+        'comment' => 'User type'
+    )
+);
+$connection->modifyColumn(
+    $oauthTokenTable,
+    'consumer_id',
+    array(
+        'type' => \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
+        'unsigned' => true,
+        'nullable' => true,
+        'comment' => 'Oauth Consumer ID'
+    )
+);
+$connection->addForeignKey(
+    $installer->getFkName($oauthTokenTable, 'admin_id', $adminTable, 'user_id'),
+    $oauthTokenTable,
+    'admin_id',
+    $adminTable,
+    'user_id'
+);
+$connection->addForeignKey(
+    $installer->getFkName($oauthTokenTable, 'admin_id', $customerTable, 'entity_id'),
+    $oauthTokenTable,
+    'customer_id',
+    $customerTable,
+    'entity_id'
+);
diff --git a/app/code/Magento/LayeredNavigation/composer.json b/app/code/Magento/LayeredNavigation/composer.json
index be9d3df13b41908fa9077af82c6a9d6ce02e3e21..00ec2ff67d6d64a7677b3a4fa924a12d82ad47b5 100644
--- a/app/code/Magento/LayeredNavigation/composer.json
+++ b/app/code/Magento/LayeredNavigation/composer.json
@@ -2,14 +2,14 @@
     "name": "magento/module-layered-navigation",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/LayeredNavigation/view/frontend/layout/page_one_column.xml b/app/code/Magento/LayeredNavigation/view/frontend/layout/page_one_column.xml
index a73bba5fcadaec44c39b94d5b299113f2be0977d..d99697645da7f6d5fd5a859db15a636e9d200a6c 100644
--- a/app/code/Magento/LayeredNavigation/view/frontend/layout/page_one_column.xml
+++ b/app/code/Magento/LayeredNavigation/view/frontend/layout/page_one_column.xml
@@ -24,5 +24,5 @@
  */
 -->
 <layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../Core/etc/layout_single.xsd" label="All One-Column Layout Pages" design_abstraction="page_layout">
-    <move element="catalog.leftnav" destination="category.product.list.additional" before="-" />
+    <move element="catalog.leftnav" destination="content.top" after="-" />
 </layout>
diff --git a/app/code/Magento/LayeredNavigation/view/frontend/templates/layer/state.phtml b/app/code/Magento/LayeredNavigation/view/frontend/templates/layer/state.phtml
index 77cb12ee001ef7006304372608b3303d32e7c819..431a63e830c71d4230f15bb94b9f8913e0764a07 100644
--- a/app/code/Magento/LayeredNavigation/view/frontend/templates/layer/state.phtml
+++ b/app/code/Magento/LayeredNavigation/view/frontend/templates/layer/state.phtml
@@ -31,8 +31,8 @@
 ?>
 <?php $_filters = $this->getActiveFilters() ?>
 <?php if(!empty($_filters)): ?>
-<div class="filter-current" data-count="<?php echo count($_filters); ?>">
-    <strong class="block-subtitle filter-current-subtitle"><?php echo __('Currently Shopping by') ?></strong>
+<div class="filter-current">
+    <strong class="block-subtitle filter-current-subtitle" data-count="<?php echo count($_filters); ?>"><?php echo __('Currently Shopping by') ?></strong>
     <ol class="items">
         <?php foreach ($_filters as $_filter): ?>
             <li class="item">
diff --git a/app/code/Magento/LayeredNavigation/view/frontend/templates/layer/view.phtml b/app/code/Magento/LayeredNavigation/view/frontend/templates/layer/view.phtml
index 6af9a7ed80eb4d4eacddef64039e4ca657caf72c..2fb0ffd37cd0fadc186bf446b48da6966d369a04 100644
--- a/app/code/Magento/LayeredNavigation/view/frontend/templates/layer/view.phtml
+++ b/app/code/Magento/LayeredNavigation/view/frontend/templates/layer/view.phtml
@@ -34,7 +34,6 @@
     <div class="block filter">
         <div class="block-title filter-title">
             <strong><?php echo __('Shop By') ?></strong>
-            <span class="block-triger filter-trigger"><?php echo __('Filter') ?> <span class="qty counter"><?php echo count($this->getLayer()->getState()->getActiveFilters()) ?></span></span>
         </div>
 
         <div class="block-content filter-content">
@@ -45,17 +44,20 @@
                     <a href="<?php echo $this->getClearUrl() ?>" class="action clear filter-clear"><span><?php echo __('Clear All') ?></span></a>
                 </div>
             <?php endif; ?>
-
-            <strong class="block-subtitle filter-subtitle"><?php echo __('Shopping Options') ?></strong>
-
-            <dl class="filter-options" id="narrow-by-list">
-                <?php foreach ($this->getFilters() as $filter): ?>
+            <?php $wrapOptions = false; ?>
+            <?php foreach ($this->getFilters() as $filter): ?>
+                <?php if(!$wrapOptions): ?>
+                    <strong class="block-subtitle filter-subtitle"><?php echo __('Shopping Options') ?></strong>
+                    <dl class="filter-options" id="narrow-by-list">
+                <?php $wrapOptions = true; endif; ?>
                     <?php if ($filter->getItemsCount()): ?>
                         <dt class="filter-options-title"><?php echo $this->escapeHtml(__($filter->getName())) ?></dt>
                         <dd class="filter-options-content"><?php echo $this->getChildBlock('renderer')->render($filter); ?></dd>
                     <?php endif; ?>
-                <?php endforeach; ?>
-            </dl>
+            <?php endforeach; ?>
+            <?php if($wrapOptions): ?>
+                </dl>
+            <?php endif; ?>
         </div>
     </div>
 <?php endif; ?>
diff --git a/app/code/Magento/Log/composer.json b/app/code/Magento/Log/composer.json
index a61e95929ee8885228d1d58535c9999d575aa7a6..5fb3aacf06e9d988f8bf6e789bc32473bb31ffd8 100644
--- a/app/code/Magento/Log/composer.json
+++ b/app/code/Magento/Log/composer.json
@@ -2,18 +2,18 @@
     "name": "magento/module-log",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Multishipping/Model/Checkout/Type/Multishipping.php b/app/code/Magento/Multishipping/Model/Checkout/Type/Multishipping.php
index 8062806648e5eb7868d10ee8de763f891dcc5d79..c5a34e64e590dd78c9dd7fdd0e74740ba8c20304 100644
--- a/app/code/Magento/Multishipping/Model/Checkout/Type/Multishipping.php
+++ b/app/code/Magento/Multishipping/Model/Checkout/Type/Multishipping.php
@@ -24,6 +24,7 @@
 namespace Magento\Multishipping\Model\Checkout\Type;
 
 use Magento\Customer\Service\V1\CustomerAddressServiceInterface;
+use Magento\Sales\Model\Order\Email\Sender\OrderSender;
 
 /**
  * Multishipping checkout model
@@ -103,6 +104,11 @@ class Multishipping extends \Magento\Framework\Object
      */
     protected $_customerAddressService;
 
+    /**
+     * @var OrderSender
+     */
+    protected $orderSender;
+
     /**
      * @param \Magento\Checkout\Model\Session $checkoutSession
      * @param \Magento\Customer\Model\Session $customerSession
@@ -116,6 +122,7 @@ class Multishipping extends \Magento\Framework\Object
      * @param \Magento\Store\Model\StoreManagerInterface $storeManager
      * @param \Magento\Payment\Model\Method\SpecificationInterface $paymentSpecification
      * @param \Magento\Multishipping\Helper\Data $helper
+     * @param OrderSender $orderSender
      * @param array $data
      */
     public function __construct(
@@ -131,6 +138,7 @@ class Multishipping extends \Magento\Framework\Object
         \Magento\Store\Model\StoreManagerInterface $storeManager,
         \Magento\Payment\Model\Method\SpecificationInterface $paymentSpecification,
         \Magento\Multishipping\Helper\Data $helper,
+        OrderSender $orderSender,
         array $data = array()
     ) {
         $this->_eventManager = $eventManager;
@@ -145,6 +153,7 @@ class Multishipping extends \Magento\Framework\Object
         $this->_customerSession = $customerSession;
         $this->_orderFactory = $orderFactory;
         $this->_customerAddressService = $customerAddressService;
+        $this->orderSender = $orderSender;
         parent::__construct($data);
         $this->_init();
     }
@@ -639,7 +648,7 @@ class Multishipping extends \Magento\Framework\Object
                 $order->place();
                 $order->save();
                 if ($order->getCanSendNewEmailFlag()) {
-                    $order->sendNewOrderEmail();
+                    $this->orderSender->send($order);
                 }
                 $orderIds[$order->getId()] = $order->getIncrementId();
             }
diff --git a/app/code/Magento/Multishipping/composer.json b/app/code/Magento/Multishipping/composer.json
index 6dee20220838b2ed0a8473b5d3cd915d49591851..023416f651c932b0d2e49fcf5448f45fda717415 100644
--- a/app/code/Magento/Multishipping/composer.json
+++ b/app/code/Magento/Multishipping/composer.json
@@ -2,21 +2,21 @@
     "name": "magento/module-multishipping",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-checkout": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-payment": "0.1.0-alpha89",
-        "magento/module-tax": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-weee": "0.1.0-alpha89",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-checkout": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-payment": "0.1.0-alpha90",
+        "magento/module-tax": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-weee": "0.1.0-alpha90",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Multishipping/etc/adminhtml/acl.xml b/app/code/Magento/Multishipping/etc/acl.xml
similarity index 94%
rename from app/code/Magento/Multishipping/etc/adminhtml/acl.xml
rename to app/code/Magento/Multishipping/etc/acl.xml
index 82bdbc1398e62d8fc18befb0c91c133aa426e427..b6cad29cbc1531082f2127771c2e904f25a7f7a9 100644
--- a/app/code/Magento/Multishipping/etc/adminhtml/acl.xml
+++ b/app/code/Magento/Multishipping/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/Newsletter/composer.json b/app/code/Magento/Newsletter/composer.json
index 1850aa528a4432e7029dd05719054c64bca9d647..4bc48b94f69940bf124d9aa7aa51e68efdd33121 100644
--- a/app/code/Magento/Newsletter/composer.json
+++ b/app/code/Magento/Newsletter/composer.json
@@ -2,22 +2,22 @@
     "name": "magento/module-newsletter",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-widget": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-cms": "0.1.0-alpha89",
-        "magento/module-email": "0.1.0-alpha89",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/module-cron": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-widget": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-cms": "0.1.0-alpha90",
+        "magento/module-email": "0.1.0-alpha90",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/module-cron": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Newsletter/etc/adminhtml/acl.xml b/app/code/Magento/Newsletter/etc/acl.xml
similarity index 96%
rename from app/code/Magento/Newsletter/etc/adminhtml/acl.xml
rename to app/code/Magento/Newsletter/etc/acl.xml
index c8d22e1fd87db174000f4ca32793d3caf2cf398f..d1eb2f175c35f9100ec81e13e31093a9e65eb524 100644
--- a/app/code/Magento/Newsletter/etc/adminhtml/acl.xml
+++ b/app/code/Magento/Newsletter/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/OfflinePayments/composer.json b/app/code/Magento/OfflinePayments/composer.json
index 93acbbb7a2895fe936b9d36da93ddc0ea797951f..ec0bfcae4b8df45957f0e4021a3b0ad17e2cb2f2 100644
--- a/app/code/Magento/OfflinePayments/composer.json
+++ b/app/code/Magento/OfflinePayments/composer.json
@@ -2,13 +2,13 @@
     "name": "magento/module-offline-payments",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-payment": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-payment": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/OfflineShipping/composer.json b/app/code/Magento/OfflineShipping/composer.json
index 417547b6b4d5a0e39c91e8d755a1919e3f190a06..e35cbbe21966b4e6d3275e5190779e1d144ffe09 100644
--- a/app/code/Magento/OfflineShipping/composer.json
+++ b/app/code/Magento/OfflineShipping/composer.json
@@ -2,20 +2,20 @@
     "name": "magento/module-offline-shipping",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-shipping": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-sales-rule": "0.1.0-alpha89",
-        "magento/module-directory": "0.1.0-alpha89",
-        "magento/module-checkout": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-shipping": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-sales-rule": "0.1.0-alpha90",
+        "magento/module-directory": "0.1.0-alpha90",
+        "magento/module-checkout": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Ogone/Controller/Api.php b/app/code/Magento/Ogone/Controller/Api.php
index 0a3493b972842eeba1e5daffbeb13cf4223b30aa..faff1fdefffbd5505bbf670073e7abff8264b271 100644
--- a/app/code/Magento/Ogone/Controller/Api.php
+++ b/app/code/Magento/Ogone/Controller/Api.php
@@ -25,6 +25,7 @@ namespace Magento\Ogone\Controller;
 
 use Magento\Sales\Model\Order;
 use Magento\Sales\Model\Order\Payment\Transaction as PaymentTransaction;
+use Magento\Sales\Model\Order\Email\Sender\OrderSender;
 
 /**
  * Ogone Api Controller
@@ -48,19 +49,27 @@ class Api extends \Magento\Framework\App\Action\Action
      */
     protected $_transactionFactory;
 
+    /**
+     * @var OrderSender
+     */
+    protected $orderSender;
+
     /**
      * @param \Magento\Framework\App\Action\Context $context
      * @param \Magento\Framework\DB\TransactionFactory $transactionFactory
      * @param \Magento\Sales\Model\OrderFactory $salesOrderFactory
+     * @param OrderSender $orderSender
      */
     public function __construct(
         \Magento\Framework\App\Action\Context $context,
         \Magento\Framework\DB\TransactionFactory $transactionFactory,
-        \Magento\Sales\Model\OrderFactory $salesOrderFactory
+        \Magento\Sales\Model\OrderFactory $salesOrderFactory,
+        OrderSender $orderSender
     ) {
         parent::__construct($context);
         $this->_transactionFactory = $transactionFactory;
         $this->_salesOrderFactory = $salesOrderFactory;
+        $this->orderSender = $orderSender;
     }
 
     /**
@@ -248,7 +257,7 @@ class Api extends \Magento\Framework\App\Action\Action
                     $invoice->getOrder()->setIsInProcess(true);
 
                     $this->_transactionFactory->create()->addObject($invoice)->addObject($invoice->getOrder())->save();
-                    $order->sendNewOrderEmail();
+                    $this->orderSender->send($order);
                 }
             } else {
                 $order->save();
@@ -282,7 +291,7 @@ class Api extends \Magento\Framework\App\Action\Action
             } else {
                 //to send new order email only when state is pending payment
                 if ($order->getState() == \Magento\Sales\Model\Order::STATE_PENDING_PAYMENT) {
-                    $order->sendNewOrderEmail();
+                    $this->orderSender->send($order);
                 }
                 $order->setState(
                     \Magento\Sales\Model\Order::STATE_PROCESSING,
@@ -356,7 +365,7 @@ class Api extends \Magento\Framework\App\Action\Action
                 $order->getPayment()->setLastTransId($params['PAYID']);
                 //to send new order email only when state is pending payment
                 if ($order->getState() == \Magento\Sales\Model\Order::STATE_PENDING_PAYMENT) {
-                    $order->sendNewOrderEmail();
+                    $this->orderSender->send($order);
                     $order->setState(
                         \Magento\Sales\Model\Order::STATE_PROCESSING,
                         \Magento\Ogone\Model\Api::PROCESSING_OGONE_STATUS,
diff --git a/app/code/Magento/Ogone/composer.json b/app/code/Magento/Ogone/composer.json
index 324926c35f230870ca996f1d3c31631ca2b51306..c32adb17524fe1ddec4b7ca49c1aea9f1c536fea 100644
--- a/app/code/Magento/Ogone/composer.json
+++ b/app/code/Magento/Ogone/composer.json
@@ -2,16 +2,16 @@
     "name": "magento/module-ogone",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-payment": "0.1.0-alpha89",
-        "magento/module-checkout": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-payment": "0.1.0-alpha90",
+        "magento/module-checkout": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/PageCache/composer.json b/app/code/Magento/PageCache/composer.json
index c0f7ecc263facd25eba439fb3a2cdd86ff62b11c..1a1968b4da93ff9d0a4b4c5bda73d9a8ce2d844f 100644
--- a/app/code/Magento/PageCache/composer.json
+++ b/app/code/Magento/PageCache/composer.json
@@ -2,14 +2,14 @@
     "name": "magento/module-page-cache",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/PayPalRecurringPayment/Model/Ipn.php b/app/code/Magento/PayPalRecurringPayment/Model/Ipn.php
index d04c57253fb702900dbee3d4b5a928cf49a75361..f8908adecfe66fc1423331a26b3e8d9414548ca5 100644
--- a/app/code/Magento/PayPalRecurringPayment/Model/Ipn.php
+++ b/app/code/Magento/PayPalRecurringPayment/Model/Ipn.php
@@ -25,6 +25,8 @@ namespace Magento\PayPalRecurringPayment\Model;
 
 use Exception;
 
+use Magento\Sales\Model\Order\Email\Sender\OrderSender;
+
 /**
  * PayPal Recurring Instant Payment Notification processor model
  */
@@ -42,11 +44,17 @@ class Ipn extends \Magento\Paypal\Model\AbstractIpn implements \Magento\Paypal\M
      */
     protected $_recurringPaymentFactory;
 
+    /**
+     * @var OrderSender
+     */
+    protected $orderSender;
+
     /**
      * @param \Magento\Paypal\Model\ConfigFactory $configFactory
      * @param \Magento\Framework\Logger\AdapterFactory $logAdapterFactory
      * @param \Magento\Framework\HTTP\Adapter\CurlFactory $curlFactory
      * @param \Magento\RecurringPayment\Model\PaymentFactory $recurringPaymentFactory
+     * @param OrderSender $orderSender
      * @param array $data
      */
     public function __construct(
@@ -54,10 +62,12 @@ class Ipn extends \Magento\Paypal\Model\AbstractIpn implements \Magento\Paypal\M
         \Magento\Framework\Logger\AdapterFactory $logAdapterFactory,
         \Magento\Framework\HTTP\Adapter\CurlFactory $curlFactory,
         \Magento\RecurringPayment\Model\PaymentFactory $recurringPaymentFactory,
+        OrderSender $orderSender,
         array $data = array()
     ) {
         parent::__construct($configFactory, $logAdapterFactory, $curlFactory, $data);
         $this->_recurringPaymentFactory = $recurringPaymentFactory;
+        $this->orderSender = $orderSender;
     }
 
     /**
@@ -171,7 +181,8 @@ class Ipn extends \Magento\Paypal\Model\AbstractIpn implements \Magento\Paypal\M
             $invoice = $payment->getCreatedInvoice();
             if ($invoice) {
                 $message = __('You notified customer about invoice #%1.', $invoice->getIncrementId());
-                $order->sendNewOrderEmail()->addStatusHistoryComment($message)->setIsCustomerNotified(true)->save();
+                $this->orderSender->send($order);
+                $order->addStatusHistoryComment($message)->setIsCustomerNotified(true)->save();
             }
         } catch (\Magento\Framework\Model\Exception $e) {
             $comment = $this->_createIpnComment(__('Note: %1', $e->getMessage()), true);
diff --git a/app/code/Magento/PayPalRecurringPayment/composer.json b/app/code/Magento/PayPalRecurringPayment/composer.json
index 61cff656014e1d12bd9d2b2756267e34f873d6cd..8c2e560ad96412942a7c530556de4f59ff5cac8e 100644
--- a/app/code/Magento/PayPalRecurringPayment/composer.json
+++ b/app/code/Magento/PayPalRecurringPayment/composer.json
@@ -2,17 +2,18 @@
     "name": "magento/module-pay-pal-recurring-payment",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-directory": "0.1.0-alpha89",
-        "magento/module-payment": "0.1.0-alpha89",
-        "magento/module-paypal": "0.1.0-alpha89",
-        "magento/module-recurring-payment": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-directory": "0.1.0-alpha90",
+        "magento/module-payment": "0.1.0-alpha90",
+        "magento/module-paypal": "0.1.0-alpha90",
+        "magento/module-recurring-payment": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/PayPalRecurringPayment/etc/module.xml b/app/code/Magento/PayPalRecurringPayment/etc/module.xml
index 1a7957cf93bbe5bd4343bfcfc386b906afab5874..c0f24a5bf8276dbeed7516315bc29b20831646f9 100644
--- a/app/code/Magento/PayPalRecurringPayment/etc/module.xml
+++ b/app/code/Magento/PayPalRecurringPayment/etc/module.xml
@@ -30,6 +30,7 @@
             <module name="Magento_Directory"/>
             <module name="Magento_Payment"/>
             <module name="Magento_Paypal"/>
+            <module name="Magento_Sales"/>
             <module name="Magento_RecurringPayment"/>
         </depends>
     </module>
diff --git a/app/code/Magento/Payment/composer.json b/app/code/Magento/Payment/composer.json
index 789f80d72d54070c539bd5a15c68ac6b231ff014..fce23ae89598a788afe4b42f7e88c238afce093a 100644
--- a/app/code/Magento/Payment/composer.json
+++ b/app/code/Magento/Payment/composer.json
@@ -2,17 +2,17 @@
     "name": "magento/module-payment",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-centinel": "0.1.0-alpha89",
-        "magento/module-checkout": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-centinel": "0.1.0-alpha90",
+        "magento/module-checkout": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Payment/etc/adminhtml/acl.xml b/app/code/Magento/Payment/etc/acl.xml
similarity index 94%
rename from app/code/Magento/Payment/etc/adminhtml/acl.xml
rename to app/code/Magento/Payment/etc/acl.xml
index c8ad3fd70b76ada846e8c7086d5a535a3c27bc77..30c6482acc4d8b7105f0e4e6f823a7e0f9560064 100644
--- a/app/code/Magento/Payment/etc/adminhtml/acl.xml
+++ b/app/code/Magento/Payment/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/Paypal/Model/Express/Checkout.php b/app/code/Magento/Paypal/Model/Express/Checkout.php
index 83bf85995421fb62f067b75780ce64a84d2b6e38..e1c9bb83bbd1c92bcc7655c845c4099e441312f6 100644
--- a/app/code/Magento/Paypal/Model/Express/Checkout.php
+++ b/app/code/Magento/Paypal/Model/Express/Checkout.php
@@ -27,6 +27,7 @@ use Magento\Customer\Service\V1\CustomerAccountServiceInterface;
 use Magento\Sales\Model\Quote\Address;
 use Magento\Customer\Service\V1\Data\Customer as CustomerDataObject;
 use Magento\Paypal\Model\Config as PaypalConfig;
+use Magento\Sales\Model\Order\Email\Sender\OrderSender;
 
 /**
  * Wrapper that performs Paypal Express and Checkout communication
@@ -280,6 +281,11 @@ class Checkout
      */
     protected $_messageManager;
 
+    /**
+     * @var OrderSender
+     */
+    protected $orderSender;
+
     /**
      * Set config, session and quote instances
      *
@@ -307,6 +313,7 @@ class Checkout
      * @param \Magento\Customer\Service\V1\Data\CustomerDetailsBuilder $customerDetailsBuilder
      * @param \Magento\Framework\Encryption\EncryptorInterface $encryptor
      * @param \Magento\Framework\Message\ManagerInterface $messageManager
+     * @param OrderSender $orderSender
      * @param array $params
      * @throws \Exception
      */
@@ -335,6 +342,7 @@ class Checkout
         \Magento\Customer\Service\V1\Data\CustomerDetailsBuilder $customerDetailsBuilder,
         \Magento\Framework\Encryption\EncryptorInterface $encryptor,
         \Magento\Framework\Message\ManagerInterface $messageManager,
+        OrderSender $orderSender,
         $params = array()
     ) {
         $this->_customerData = $customerData;
@@ -360,6 +368,7 @@ class Checkout
         $this->_customerDetailsBuilder = $customerDetailsBuilder;
         $this->_encryptor = $encryptor;
         $this->_messageManager = $messageManager;
+        $this->orderSender = $orderSender;
         $this->_customerSession = isset($params['session'])
             && $params['session'] instanceof \Magento\Customer\Model\Session ? $params['session'] : $customerSession;
 
@@ -842,7 +851,7 @@ class Checkout
             case \Magento\Sales\Model\Order::STATE_PROCESSING:
             case \Magento\Sales\Model\Order::STATE_COMPLETE:
             case \Magento\Sales\Model\Order::STATE_PAYMENT_REVIEW:
-                $order->sendNewOrderEmail();
+                $this->orderSender->send($order);
                 break;
             default:
                 break;
diff --git a/app/code/Magento/Paypal/Model/Ipn.php b/app/code/Magento/Paypal/Model/Ipn.php
index e871ca462aa007f41425cedc9afba8b6a1c71e16..d0d432d53c67e377eebd053d65a195492b79f120 100644
--- a/app/code/Magento/Paypal/Model/Ipn.php
+++ b/app/code/Magento/Paypal/Model/Ipn.php
@@ -24,6 +24,8 @@
 namespace Magento\Paypal\Model;
 
 use Exception;
+use Magento\Sales\Model\Order\Email\Sender\OrderSender;
+use Magento\Sales\Model\Order\Email\Sender\CreditmemoSender;
 
 /**
  * PayPal Instant Payment Notification processor model
@@ -47,12 +49,24 @@ class Ipn extends \Magento\Paypal\Model\AbstractIpn implements IpnInterface
      */
     protected $_paypalInfo;
 
+    /**
+     * @var OrderSender
+     */
+    protected $orderSender;
+
+    /**
+     * @var CreditmemoSender
+     */
+    protected $creditmemoSender;
+
     /**
      * @param \Magento\Paypal\Model\ConfigFactory $configFactory
      * @param \Magento\Framework\Logger\AdapterFactory $logAdapterFactory
      * @param \Magento\Framework\HTTP\Adapter\CurlFactory $curlFactory
      * @param \Magento\Sales\Model\OrderFactory $orderFactory
      * @param Info $paypalInfo
+     * @param OrderSender $orderSender
+     * @param CreditmemoSender $creditmemoSender
      * @param array $data
      */
     public function __construct(
@@ -61,11 +75,15 @@ class Ipn extends \Magento\Paypal\Model\AbstractIpn implements IpnInterface
         \Magento\Framework\HTTP\Adapter\CurlFactory $curlFactory,
         \Magento\Sales\Model\OrderFactory $orderFactory,
         Info $paypalInfo,
+        OrderSender $orderSender,
+        CreditmemoSender $creditmemoSender,
         array $data = array()
     ) {
         parent::__construct($configFactory, $logAdapterFactory, $curlFactory, $data);
         $this->_orderFactory = $orderFactory;
         $this->_paypalInfo = $paypalInfo;
+        $this->orderSender = $orderSender;
+        $this->creditmemoSender = $creditmemoSender;
     }
 
     /**
@@ -312,7 +330,8 @@ class Ipn extends \Magento\Paypal\Model\AbstractIpn implements IpnInterface
         // notify customer
         $invoice = $payment->getCreatedInvoice();
         if ($invoice && !$this->_order->getEmailSent()) {
-            $this->_order->sendNewOrderEmail()->addStatusHistoryComment(
+            $this->orderSender->send($this->_order);
+            $this->_order->addStatusHistoryComment(
                 __('You notified customer about invoice #%1.', $invoice->getIncrementId())
             )->setIsCustomerNotified(
                 true
@@ -419,7 +438,7 @@ class Ipn extends \Magento\Paypal\Model\AbstractIpn implements IpnInterface
             );
         }
         if (!$this->_order->getEmailSent()) {
-            $this->_order->sendNewOrderEmail();
+            $this->orderSender->send($this->_order);
         }
         $this->_order->save();
     }
@@ -490,7 +509,7 @@ class Ipn extends \Magento\Paypal\Model\AbstractIpn implements IpnInterface
 
         $creditMemo = $payment->getCreatedCreditmemo();
         if ($creditMemo) {
-            $creditMemo->sendEmail();
+            $this->creditmemoSender->send($creditMemo);
             $this->_order->addStatusHistoryComment(
                 __('You notified customer about creditmemo #%1.', $creditMemo->getIncrementId())
             )->setIsCustomerNotified(
diff --git a/app/code/Magento/Paypal/Model/Payflowlink.php b/app/code/Magento/Paypal/Model/Payflowlink.php
index 31b9354b080bbd9bc09c633ff05afc4c32ceea78..370bb739c7be016e753896a99511f07e20bc2e8b 100644
--- a/app/code/Magento/Paypal/Model/Payflowlink.php
+++ b/app/code/Magento/Paypal/Model/Payflowlink.php
@@ -23,6 +23,8 @@
  */
 namespace Magento\Paypal\Model;
 
+use Magento\Sales\Model\Order\Email\Sender\OrderSender;
+
 /**
  * Payflow Link payment gateway model
  */
@@ -144,6 +146,11 @@ class Payflowlink extends \Magento\Paypal\Model\Payflowpro
      */
     protected $_websiteFactory;
 
+    /**
+     * @var OrderSender
+     */
+    protected $orderSender;
+
     /**
      * @param \Magento\Framework\Event\ManagerInterface $eventManager
      * @param \Magento\Payment\Helper\Data $paymentData
@@ -162,6 +169,7 @@ class Payflowlink extends \Magento\Paypal\Model\Payflowpro
      * @param \Magento\Sales\Model\OrderFactory $orderFactory
      * @param \Magento\Framework\App\RequestInterface $requestHttp
      * @param \Magento\Store\Model\WebsiteFactory $websiteFactory
+     * @param OrderSender $orderSender
      * @param array $data
      *
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
@@ -184,6 +192,7 @@ class Payflowlink extends \Magento\Paypal\Model\Payflowpro
         \Magento\Sales\Model\OrderFactory $orderFactory,
         \Magento\Framework\App\RequestInterface $requestHttp,
         \Magento\Store\Model\WebsiteFactory $websiteFactory,
+        OrderSender $orderSender,
         array $data = array()
     ) {
         $this->_requestFactory = $requestFactory;
@@ -191,6 +200,7 @@ class Payflowlink extends \Magento\Paypal\Model\Payflowpro
         $this->_orderFactory = $orderFactory;
         $this->_requestHttp = $requestHttp;
         $this->_websiteFactory = $websiteFactory;
+        $this->orderSender = $orderSender;
         parent::__construct(
             $eventManager,
             $paymentData,
@@ -389,7 +399,7 @@ class Payflowlink extends \Magento\Paypal\Model\Payflowpro
 
         try {
             if ($canSendNewOrderEmail) {
-                $order->sendNewOrderEmail();
+                $this->orderSender->send($order);
             }
             $this->_quoteFactory->create()->load($order->getQuoteId())->setIsActive(false)->save();
         } catch (\Exception $e) {
diff --git a/app/code/Magento/Paypal/composer.json b/app/code/Magento/Paypal/composer.json
index cfc787d36f474ab1b1f6a409c244a0fbe82ca6c6..cd97fcde61a5524f028a36f2dac10effb9cedd96 100644
--- a/app/code/Magento/Paypal/composer.json
+++ b/app/code/Magento/Paypal/composer.json
@@ -2,26 +2,26 @@
     "name": "magento/module-paypal",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-checkout": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-payment": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-tax": "0.1.0-alpha89",
-        "magento/module-directory": "0.1.0-alpha89",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/module-centinel": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-checkout": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-payment": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-tax": "0.1.0-alpha90",
+        "magento/module-directory": "0.1.0-alpha90",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/module-centinel": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "lib-libxml": "*",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Paypal/etc/adminhtml/acl.xml b/app/code/Magento/Paypal/etc/acl.xml
similarity index 96%
rename from app/code/Magento/Paypal/etc/adminhtml/acl.xml
rename to app/code/Magento/Paypal/etc/acl.xml
index d0f32046bc40ad4dd0ca43a21c3845b32cb7576f..3dc6a973cf8f96e17963c2239935ad1bab0998fe 100644
--- a/app/code/Magento/Paypal/etc/adminhtml/acl.xml
+++ b/app/code/Magento/Paypal/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/Paypal/etc/adminhtml/system.xml b/app/code/Magento/Paypal/etc/adminhtml/system.xml
index 6f826847aefca41bae98a7002f28dcb93daab7c8..838e2e42de045059dc3d49d7ff2abcb589b39ad0 100644
--- a/app/code/Magento/Paypal/etc/adminhtml/system.xml
+++ b/app/code/Magento/Paypal/etc/adminhtml/system.xml
@@ -749,7 +749,7 @@
                         You get paid up front, even though customers have more time to pay. A pre-integrated payment button lets customers pay quickly with Bill Me Later&#174;.
                         <a href="https:/www.paypal.com/webapps/mpp/promotional-financing" target="_blank">Learn More</a>]]>
                         </comment>
-                        <config_path>payment/paypal_express_bml/active</config_path>
+                        <config_path>payment/payflow_express_bml/active</config_path>
                         <requires>
                             <field id="enable_express_checkout"/>
                         </requires>
diff --git a/app/code/Magento/Persistent/composer.json b/app/code/Magento/Persistent/composer.json
index 92987b1525fad3af4bfc3902d514f4e94bcaef47..9f15f4a5107fe99bc814d9f423ca183f383981aa 100644
--- a/app/code/Magento/Persistent/composer.json
+++ b/app/code/Magento/Persistent/composer.json
@@ -2,18 +2,18 @@
     "name": "magento/module-persistent",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-checkout": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-cron": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-checkout": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-cron": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Persistent/etc/adminhtml/acl.xml b/app/code/Magento/Persistent/etc/acl.xml
similarity index 94%
rename from app/code/Magento/Persistent/etc/adminhtml/acl.xml
rename to app/code/Magento/Persistent/etc/acl.xml
index 986e38739e4d861668d73545a919fd970e58d7c3..8783b80c14f0c416d57f691d4ce2ba34ae064fec 100644
--- a/app/code/Magento/Persistent/etc/adminhtml/acl.xml
+++ b/app/code/Magento/Persistent/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/ProductAlert/composer.json b/app/code/Magento/ProductAlert/composer.json
index 478a634fc0441fe1771be8b05f887b64407052ff..cae86a3d2c98b677c7d7687499ee23f691481dec 100644
--- a/app/code/Magento/ProductAlert/composer.json
+++ b/app/code/Magento/ProductAlert/composer.json
@@ -2,17 +2,17 @@
     "name": "magento/module-product-alert",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-tax": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-tax": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/RecurringPayment/Controller/RecurringPayment.php b/app/code/Magento/RecurringPayment/Controller/RecurringPayment.php
index f6e988b9c9a2e2bf824cb0375e77aae48dfb1312..27bd0e404d5d7aea21977ad62d9185c0fbdd9e03 100644
--- a/app/code/Magento/RecurringPayment/Controller/RecurringPayment.php
+++ b/app/code/Magento/RecurringPayment/Controller/RecurringPayment.php
@@ -99,10 +99,12 @@ class RecurringPayment extends \Magento\Framework\App\Action\Action
     {
         try {
             $payment = $this->_initPayment();
-            $this->_title->add(__('Recurring Billing Payments'));
-            $this->_title->add(__('Payment #%1', $payment->getReferenceId()));
             $this->_view->loadLayout();
             $this->_view->getLayout()->initMessages();
+
+            $title = __('Recurring Payment #%1', $payment->getReferenceId());
+            $this->_view->getLayout()->getBlock('head')->setTitle($title);
+
             $this->_view->renderLayout();
             return;
         } catch (\Magento\Framework\Model\Exception $e) {
diff --git a/app/code/Magento/RecurringPayment/Model/Plugin/Tabs.php b/app/code/Magento/RecurringPayment/Model/Plugin/Tabs.php
new file mode 100644
index 0000000000000000000000000000000000000000..4c4e54548c6840b81daaff8d9b5c0ce2799f5466
--- /dev/null
+++ b/app/code/Magento/RecurringPayment/Model/Plugin/Tabs.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\RecurringPayment\Model\Plugin;
+
+/**
+ * Plugin for product attribute tabs
+ */
+class Tabs
+{
+    /** @var \Magento\Framework\Module\Manager  */
+    protected $_moduleManager;
+
+    /**
+     * @param \Magento\Framework\Module\Manager $moduleManager
+     */
+    public function __construct(\Magento\Framework\Module\Manager $moduleManager)
+    {
+        $this->_moduleManager = $moduleManager;
+    }
+
+    /**
+     * @param \Magento\Catalog\Block\Adminhtml\Product\Edit\Tabs $subject
+     * @param \Magento\Eav\Model\Resource\Entity\Attribute\Group\Collection $result
+     *
+     * @return \Magento\Eav\Model\Resource\Entity\Attribute\Group\Collection
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+     */
+    public function afterGetGroupCollection(\Magento\Catalog\Block\Adminhtml\Product\Edit\Tabs $subject, $result)
+    {
+        if (!$this->_moduleManager->isOutputEnabled('Magento_RecurringPayment')) {
+            foreach ($result as $key => $group) {
+                if ($group->getAttributeGroupCode() === 'recurring-payment') {
+                    $result->removeItemByKey($key);
+                }
+            }
+        }
+        return $result;
+    }
+}
diff --git a/app/code/Magento/RecurringPayment/composer.json b/app/code/Magento/RecurringPayment/composer.json
index 98a7df3d23c48bee4308a739c26fb17888adb258..1c8a325da56aaa2f840e88ee1f5b583dae6e0849 100644
--- a/app/code/Magento/RecurringPayment/composer.json
+++ b/app/code/Magento/RecurringPayment/composer.json
@@ -2,22 +2,22 @@
     "name": "magento/module-recurring-payment",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-checkout": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/module-payment": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-checkout": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/module-payment": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/RecurringPayment/data/recurringpayment_setup/data-install-1.0.0.0.php b/app/code/Magento/RecurringPayment/data/recurringpayment_setup/data-install-1.0.0.0.php
index 87c94686774a84c79fc7c38d7c70aa86921702e1..a6d44ef5166187c793bbfbce9a1197563647d04f 100644
--- a/app/code/Magento/RecurringPayment/data/recurringpayment_setup/data-install-1.0.0.0.php
+++ b/app/code/Magento/RecurringPayment/data/recurringpayment_setup/data-install-1.0.0.0.php
@@ -35,7 +35,7 @@ $this->addAttributeToGroup($entityTypeId, $attributeSetId, $groupName, 'is_recur
 $this->addAttributeToGroup($entityTypeId, $attributeSetId, $groupName, 'recurring_payment');
 
 $connection = $this->getConnection();
-$adminRuleTable = $this->getTable('admin_rule');
+$adminRuleTable = $this->getTable('authorization_rule');
 $connection->update(
     $adminRuleTable,
     array('resource_id' => 'Magento_RecurringPayment::recurring_payment'),
diff --git a/app/code/Magento/RecurringPayment/etc/adminhtml/acl.xml b/app/code/Magento/RecurringPayment/etc/acl.xml
similarity index 94%
rename from app/code/Magento/RecurringPayment/etc/adminhtml/acl.xml
rename to app/code/Magento/RecurringPayment/etc/acl.xml
index 5a259ef64af4207f4539c1aea14a6820e40cedf3..a83953dd5bc9e527b55cb12b3a36a34a77962d18 100644
--- a/app/code/Magento/RecurringPayment/etc/adminhtml/acl.xml
+++ b/app/code/Magento/RecurringPayment/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/RecurringPayment/etc/di.xml b/app/code/Magento/RecurringPayment/etc/di.xml
index b2f1aba96635cef4466b861d18efd459ad0f2515..447db78390fe0edf63cdeb1ec82c7a92a238b015 100644
--- a/app/code/Magento/RecurringPayment/etc/di.xml
+++ b/app/code/Magento/RecurringPayment/etc/di.xml
@@ -47,5 +47,7 @@
     <type name="Magento\Payment\Model\Checks\ZeroTotal">
         <plugin name="recurringpayment" type="Magento\RecurringPayment\Model\Plugin\ZeroTotal" />
     </type>
-
+    <type name="Magento\Catalog\Block\Adminhtml\Product\Edit\Tabs">
+        <plugin name="recurringpayment_product_tab" type="Magento\RecurringPayment\Model\Plugin\Tabs" />
+    </type>
 </config>
diff --git a/app/code/Magento/RecurringPayment/view/frontend/templates/catalog/product/view/payment/schedule.phtml b/app/code/Magento/RecurringPayment/view/frontend/templates/catalog/product/view/payment/schedule.phtml
index f0472591fd0a58530e90c04e2b2558c36dd0ca6d..5bfe9bb7ba80ba4819e19a937ffd56f034744a17 100644
--- a/app/code/Magento/RecurringPayment/view/frontend/templates/catalog/product/view/payment/schedule.phtml
+++ b/app/code/Magento/RecurringPayment/view/frontend/templates/catalog/product/view/payment/schedule.phtml
@@ -27,11 +27,11 @@
  * @see \Magento\RecurringPayment\Block\Catalog\Product\View\Payment
  */
 ?>
-<dl class="payment product schedule">
+<dl class="items payment-schedule">
 <?php foreach($this->getScheduleInfo() as $term => $definitions): ?>
-    <dt class="title"><?php echo $this->escapeHtml($term); ?></dt>
+    <dt class="item-title"><?php echo $this->escapeHtml($term); ?></dt>
     <?php foreach ($definitions as $definition):?>
-        <dd class="content"><?php echo $this->escapeHtml($definition)?></dd>
+        <dd class="item-content"><?php echo $this->escapeHtml($definition)?></dd>
     <?php endforeach;?>
 <?php endforeach;?>
 </dl>
diff --git a/app/code/Magento/RecurringPayment/view/frontend/templates/recurring/grid.phtml b/app/code/Magento/RecurringPayment/view/frontend/templates/recurring/grid.phtml
index 34a92266f32108e4ed6a9b4acc86c5f173e302cf..6d2199a981f6197ceede332bacc72d8be98d7c45 100644
--- a/app/code/Magento/RecurringPayment/view/frontend/templates/recurring/grid.phtml
+++ b/app/code/Magento/RecurringPayment/view/frontend/templates/recurring/grid.phtml
@@ -32,9 +32,6 @@
 
     <?php $gridElements = $this->getGridElements(); ?>
     <?php if ($gridElements): ?>
-        <?php if ($this->getChildHtml('pager')): ?>
-            <div class="toolbar recurring-payments-toolbar top"><?php echo $this->getChildHtml('pager'); ?></div>
-        <?php endif; ?>
         <div class="table-wrapper recurring-payments">
             <table id="<?php echo $this->getGridHtmlId() ?>" class="data table table-recurring-payments">
                 <caption class="table caption"><?php echo __('Recurring Payments') ?></caption>
diff --git a/app/code/Magento/Reports/composer.json b/app/code/Magento/Reports/composer.json
index 394f1be72ebe8eb80f85a655a39d66f106e35d52..a1ffb43367285a7d648a5e98b75959ae00b095a6 100644
--- a/app/code/Magento/Reports/composer.json
+++ b/app/code/Magento/Reports/composer.json
@@ -2,28 +2,28 @@
     "name": "magento/module-reports",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-cms": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-widget": "0.1.0-alpha89",
-        "magento/module-log": "0.1.0-alpha89",
-        "magento/module-wishlist": "0.1.0-alpha89",
-        "magento/module-review": "0.1.0-alpha89",
-        "magento/module-catalog-inventory": "0.1.0-alpha89",
-        "magento/module-tax": "0.1.0-alpha89",
-        "magento/module-downloadable": "0.1.0-alpha89",
-        "magento/module-sales-rule": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-cms": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-widget": "0.1.0-alpha90",
+        "magento/module-log": "0.1.0-alpha90",
+        "magento/module-wishlist": "0.1.0-alpha90",
+        "magento/module-review": "0.1.0-alpha90",
+        "magento/module-catalog-inventory": "0.1.0-alpha90",
+        "magento/module-tax": "0.1.0-alpha90",
+        "magento/module-downloadable": "0.1.0-alpha90",
+        "magento/module-sales-rule": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Reports/etc/adminhtml/acl.xml b/app/code/Magento/Reports/etc/acl.xml
similarity index 97%
rename from app/code/Magento/Reports/etc/adminhtml/acl.xml
rename to app/code/Magento/Reports/etc/acl.xml
index 45984f2766ebf0d714a3eac00e3a9a90fa3ff127..6c65b81e5eb70f4c7c70ff93860e63902c851516 100644
--- a/app/code/Magento/Reports/etc/adminhtml/acl.xml
+++ b/app/code/Magento/Reports/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/Reports/view/frontend/templates/product/widget/viewed/item.phtml b/app/code/Magento/Reports/view/frontend/templates/product/widget/viewed/item.phtml
index 532168f0ba5b717401dda32dfc71019ea08de9c1..595f87c63e85899592c7791f09365a22a272279b 100644
--- a/app/code/Magento/Reports/view/frontend/templates/product/widget/viewed/item.phtml
+++ b/app/code/Magento/Reports/view/frontend/templates/product/widget/viewed/item.phtml
@@ -45,7 +45,14 @@ $rating = 'short';
                     <?php echo $this->escapeHtml($item->getName()) ?></a>
                 </strong>
 
-                <?php echo $this->getPriceHtml($item, true, '-' . $type) ?>
+                <?php echo $this->getProductPriceHtml(
+                    $item,
+                    \Magento\Catalog\Pricing\Price\FinalPrice::PRICE_CODE,
+                    \Magento\Framework\Pricing\Render::ZONE_ITEM_LIST,
+                    [
+                        'price_id_suffix' => '-' . $type
+                    ]
+                ) ?>
 
                 <?php if ($rating): ?>
                     <?php echo $this->getReviewsSummaryHtml($item, $rating) ?>
diff --git a/app/code/Magento/Reports/view/frontend/templates/widget/compared/column/compared_default_list.phtml b/app/code/Magento/Reports/view/frontend/templates/widget/compared/column/compared_default_list.phtml
index cd799593ddead2af67782090674d2549572228bc..3191111afded1bd75c54657e37657d3b56880932 100644
--- a/app/code/Magento/Reports/view/frontend/templates/widget/compared/column/compared_default_list.phtml
+++ b/app/code/Magento/Reports/view/frontend/templates/widget/compared/column/compared_default_list.phtml
@@ -62,7 +62,14 @@ if ($exist = $this->getRecentlyComparedProducts()) {
                         <?php echo $this->helper('Magento\Catalog\Helper\Output')->productAttribute($_product, $_product->getName(), 'name') ?>
                     </a>
                 </strong>
-                <?php echo $this->getPriceHtml($_product, true, '-widget-compared-'.$suffix) ?>
+                <?php echo $this->getProductPriceHtml(
+                    $_product,
+                    \Magento\Catalog\Pricing\Price\FinalPrice::PRICE_CODE,
+                    \Magento\Framework\Pricing\Render::ZONE_ITEM_LIST,
+                    [
+                        'price_id_suffix' => '-widget-compared-' . $suffix
+                    ]
+                ) ?>
                 <?php if($_product->isSaleable()): ?>
                     <div class="actions">
                         <?php if ($_product->getTypeInstance()->hasRequiredOptions($_product)): ?>
diff --git a/app/code/Magento/Reports/view/frontend/templates/widget/compared/content/compared_grid.phtml b/app/code/Magento/Reports/view/frontend/templates/widget/compared/content/compared_grid.phtml
index 5bda296b6a90285005c64fb9474b8c56b5f270df..cec10c808cdad342c28b5f0e0013912e6252c085 100644
--- a/app/code/Magento/Reports/view/frontend/templates/widget/compared/content/compared_grid.phtml
+++ b/app/code/Magento/Reports/view/frontend/templates/widget/compared/content/compared_grid.phtml
@@ -68,7 +68,14 @@ if ($exist = $this->getRecentlyComparedProducts()) {
                                         <?php echo $this->escapeHtml($_item->getName()) ?>
                                     </a>
                                 </strong>
-                                <?php echo $this->getPriceHtml($_item, true, '-' . $type) ?>
+                                <?php echo $this->getProductPriceHtml(
+                                    $_item,
+                                    \Magento\Catalog\Pricing\Price\FinalPrice::PRICE_CODE,
+                                    \Magento\Framework\Pricing\Render::ZONE_ITEM_LIST,
+                                    [
+                                        'price_id_suffix' => '-' . $type
+                                    ]
+                                ) ?>
                                 <?php if ($rating): ?>
                                     <?php echo $this->getReviewsSummaryHtml($_item, $rating) ?>
                                 <?php endif; ?>
diff --git a/app/code/Magento/Reports/view/frontend/templates/widget/compared/content/compared_list.phtml b/app/code/Magento/Reports/view/frontend/templates/widget/compared/content/compared_list.phtml
index 19c06d1021b19b1dafab71bd7dd2b43982243676..49566e2fb98a8b0c71b4ed7cd89576356401aa5c 100644
--- a/app/code/Magento/Reports/view/frontend/templates/widget/compared/content/compared_list.phtml
+++ b/app/code/Magento/Reports/view/frontend/templates/widget/compared/content/compared_list.phtml
@@ -68,7 +68,14 @@ if ($exist = $this->getRecentlyComparedProducts()) {
                                         <?php echo $this->escapeHtml($_item->getName()) ?>
                                     </a>
                                 </strong>
-                                <?php echo $this->getPriceHtml($_item, true, '-' . $type) ?>
+                                <?php echo $this->getProductPriceHtml(
+                                    $_item,
+                                    \Magento\Catalog\Pricing\Price\FinalPrice::PRICE_CODE,
+                                    \Magento\Framework\Pricing\Render::ZONE_ITEM_LIST,
+                                    [
+                                        'price_id_suffix' => '-' . $type
+                                    ]
+                                ) ?>
                                 <?php if ($rating): ?>
                                     <?php echo $this->getReviewsSummaryHtml($_item, $rating) ?>
                                 <?php endif; ?>
diff --git a/app/code/Magento/Reports/view/frontend/templates/widget/viewed/column/viewed_default_list.phtml b/app/code/Magento/Reports/view/frontend/templates/widget/viewed/column/viewed_default_list.phtml
index ccf3b04bbcf5d4fdef965e1a9b23e74a071220b8..8f9164b5577f6c753def762b4730877e17f575e4 100644
--- a/app/code/Magento/Reports/view/frontend/templates/widget/viewed/column/viewed_default_list.phtml
+++ b/app/code/Magento/Reports/view/frontend/templates/widget/viewed/column/viewed_default_list.phtml
@@ -69,20 +69,27 @@ if ($exist = $this->getRecentlyViewedProducts()) {
                                 <?php echo $this->helper('Magento\Catalog\Helper\Output')->productAttribute($_product, $_product->getName(), 'name') ?>
                             </a>
                         </strong>
-                        <?php echo $this->getPriceHtml($_product, true, '-widget-viewed-'.$suffix) ?>
+                        <?php echo $this->getProductPriceHtml(
+                            $_product,
+                            \Magento\Catalog\Pricing\Price\FinalPrice::PRICE_CODE,
+                            \Magento\Framework\Pricing\Render::ZONE_ITEM_LIST,
+                            [
+                                'price_id_suffix' => '-widget-viewed-' . $suffix
+                            ]
+                        ) ?>
                         <div class="product actions">
                             <?php if($_product->isSaleable()): ?>
                             <div class="primary">
-                                <?php if ($_product->getTypeInstance()->hasRequiredOptions($_item)): ?>
+                                <?php if ($_product->getTypeInstance()->hasRequiredOptions($_product)): ?>
                                     <button class="action tocart"
-                                            data-mage-init='{"redirectUrl": {"url": "<?php echo $this->getAddToCartUrl($_item) ?>"}}'
+                                            data-mage-init='{"redirectUrl": {"url": "<?php echo $this->getAddToCartUrl($_product) ?>"}}'
                                             type="button" title="<?php echo __('Add to Cart') ?>">
                                         <span><?php echo __('Add to Cart') ?></span>
                                     </button>
                                 <?php else: ?>
                                     <?php
                                         $postDataHelper = $this->helper('Magento\Core\Helper\PostData');
-                                        $postData = $postDataHelper->getPostData($this->getAddToCartUrl($_item), ['product' => $_item->getEntityId()]);
+                                        $postData = $postDataHelper->getPostData($this->getAddToCartUrl($_product), ['product' => $_product->getEntityId()]);
                                     ?>
                                     <button type="button" class="action tocart" data-post='<?php echo $postData; ?>'>
                                         <span><?php echo __('Add to Cart') ?></span>
diff --git a/app/code/Magento/Reports/view/frontend/templates/widget/viewed/content/viewed_grid.phtml b/app/code/Magento/Reports/view/frontend/templates/widget/viewed/content/viewed_grid.phtml
index 3ad498289372b3d074c7c80416080923e96169fa..9eb0c4aba76910e722ad681946fb8e479236eac8 100644
--- a/app/code/Magento/Reports/view/frontend/templates/widget/viewed/content/viewed_grid.phtml
+++ b/app/code/Magento/Reports/view/frontend/templates/widget/viewed/content/viewed_grid.phtml
@@ -70,7 +70,14 @@ if ($exist = $this->getRecentlyViewedProducts()) {
                                         <?php echo $this->escapeHtml($_item->getName()) ?>
                                     </a>
                                 </strong>
-                                <?php echo $this->getPriceHtml($_item, true, '-' . $type) ?>
+                                <?php echo $this->getProductPriceHtml(
+                                    $_item,
+                                    \Magento\Catalog\Pricing\Price\FinalPrice::PRICE_CODE,
+                                    \Magento\Framework\Pricing\Render::ZONE_ITEM_LIST,
+                                    [
+                                        'price_id_suffix' => '-' . $type
+                                    ]
+                                ) ?>
                                 <?php if ($rating): ?>
                                     <?php echo $this->getReviewsSummaryHtml($_item, $rating) ?>
                                 <?php endif; ?>
diff --git a/app/code/Magento/Reports/view/frontend/templates/widget/viewed/content/viewed_list.phtml b/app/code/Magento/Reports/view/frontend/templates/widget/viewed/content/viewed_list.phtml
index eeef1f0bbaedd1130599a027a41ff999c9911f46..764f026b57793feef66d4fb1d57575ac28b87c12 100644
--- a/app/code/Magento/Reports/view/frontend/templates/widget/viewed/content/viewed_list.phtml
+++ b/app/code/Magento/Reports/view/frontend/templates/widget/viewed/content/viewed_list.phtml
@@ -71,7 +71,14 @@ if ($exist = $this->getRecentlyViewedProducts()) {
                                         <?php echo $this->escapeHtml($_item->getName()) ?>
                                     </a>
                                 </strong>
-                                <?php echo $this->getPriceHtml($_item, true, '-' . $type) ?>
+                                <?php echo $this->getProductPriceHtml(
+                                    $_item,
+                                    \Magento\Catalog\Pricing\Price\FinalPrice::PRICE_CODE,
+                                    \Magento\Framework\Pricing\Render::ZONE_ITEM_LIST,
+                                    [
+                                        'price_id_suffix' => '-' . $type
+                                    ]
+                                ) ?>
                                 <?php if ($rating): ?>
                                     <?php echo $this->getReviewsSummaryHtml($_item, $rating) ?>
                                 <?php endif; ?>
diff --git a/app/code/Magento/RequireJs/composer.json b/app/code/Magento/RequireJs/composer.json
index dd412e1c2b51b96b64b5aafc37cb4ceb8d656abc..6ff6189d3f8515a3fd279b923d7a77a492c02242 100644
--- a/app/code/Magento/RequireJs/composer.json
+++ b/app/code/Magento/RequireJs/composer.json
@@ -2,13 +2,13 @@
     "name": "magento/module-require-js",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Review/composer.json b/app/code/Magento/Review/composer.json
index e5f26494584d7d189b2afd223925958926aef07b..17d0c66fe78b2c481cab2b316b982f3d04bcebdb 100644
--- a/app/code/Magento/Review/composer.json
+++ b/app/code/Magento/Review/composer.json
@@ -2,21 +2,21 @@
     "name": "magento/module-review",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-tax": "0.1.0-alpha89",
-        "magento/module-newsletter": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-tax": "0.1.0-alpha90",
+        "magento/module-newsletter": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Review/etc/adminhtml/acl.xml b/app/code/Magento/Review/etc/acl.xml
similarity index 94%
rename from app/code/Magento/Review/etc/adminhtml/acl.xml
rename to app/code/Magento/Review/etc/acl.xml
index baab497a5fff3e50225667568163166253ce5d52..7fc601f5f3a10185b60b7e8e3dcef874919815bc 100644
--- a/app/code/Magento/Review/etc/adminhtml/acl.xml
+++ b/app/code/Magento/Review/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/Review/view/frontend/templates/customer/list.phtml b/app/code/Magento/Review/view/frontend/templates/customer/list.phtml
index e7ec66e27540915a03bab7dfe8b0d50f57e7acf6..85c286aa7455c6b4ef0525f0a4ee87262a3b4368 100644
--- a/app/code/Magento/Review/view/frontend/templates/customer/list.phtml
+++ b/app/code/Magento/Review/view/frontend/templates/customer/list.phtml
@@ -23,11 +23,6 @@
  */
 ?>
 <?php if( $this->getCollection() && $this->count()): ?>
-    <?php if ($this->getToolbarHtml()): ?>
-        <div class="toolbar products-reviews-toolbar top">
-            <?php echo $this->getToolbarHtml() ?>
-        </div>
-    <?php endif; ?>
     <div class="table-wrapper reviews">
         <table class="data table table-reviews" id="my-reviews-table">
             <caption class="table caption"><?php echo __('Product Reviews') ?></caption>
diff --git a/app/code/Magento/Rss/composer.json b/app/code/Magento/Rss/composer.json
index a4696099c4e77647351141087dc29f2881cb92ef..dcef739b2ff3402f2cd3be02aeacc507df518753 100644
--- a/app/code/Magento/Rss/composer.json
+++ b/app/code/Magento/Rss/composer.json
@@ -2,23 +2,23 @@
     "name": "magento/module-rss",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-catalog-inventory": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-sales-rule": "0.1.0-alpha89",
-        "magento/module-wishlist": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-review": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-gift-message": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-catalog-inventory": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-sales-rule": "0.1.0-alpha90",
+        "magento/module-wishlist": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-review": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-gift-message": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Rss/etc/adminhtml/acl.xml b/app/code/Magento/Rss/etc/acl.xml
similarity index 94%
rename from app/code/Magento/Rss/etc/adminhtml/acl.xml
rename to app/code/Magento/Rss/etc/acl.xml
index b3a7b17e76adcc722780087ed60117996ff2b5af..2b86dd15ddbb01bcb21903e5562d5f42714ccc9c 100644
--- a/app/code/Magento/Rss/etc/adminhtml/acl.xml
+++ b/app/code/Magento/Rss/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/Rule/composer.json b/app/code/Magento/Rule/composer.json
index 665db8299cecae22e190ec3594a85d266bb721d4..c673316805af15b55a8fe17b31c965a0bebb09df 100644
--- a/app/code/Magento/Rule/composer.json
+++ b/app/code/Magento/Rule/composer.json
@@ -2,17 +2,17 @@
     "name": "magento/module-rule",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "lib-libxml": "*",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/Email.php b/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/Email.php
index f33ac4e591ad5ac7f05652b65a69f53e0d831945..9de7ad34c38157b77ee108e5b69cc534652cd3a9 100644
--- a/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/Email.php
+++ b/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/Email.php
@@ -24,6 +24,8 @@
  */
 namespace Magento\Sales\Controller\Adminhtml\Creditmemo\AbstractCreditmemo;
 
+use Magento\Sales\Model\Order\Email\Sender\CreditmemoSender;
+
 class Email extends \Magento\Backend\App\Action
 {
     /**
@@ -45,7 +47,11 @@ class Email extends \Magento\Backend\App\Action
         if ($creditmemoId) {
             $creditmemo = $this->_objectManager->create('Magento\Sales\Model\Order\Creditmemo')->load($creditmemoId);
             if ($creditmemo) {
-                $creditmemo->sendEmail();
+                /** @var CreditmemoSender $creditmemoSender */
+                $creditmemoSender = $this->_objectManager
+                    ->create('Magento\Sales\Model\Order\Email\Sender\CreditmemoSender');
+                $creditmemoSender->send($creditmemo);
+
                 $historyItem = $this->_objectManager->create(
                     'Magento\Sales\Model\Resource\Order\Status\History\Collection'
                 )->getUnnotifiedForInstance(
diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice/Email.php b/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice/Email.php
index dd60dec7ec33d1ef495ab3134101dc8d23a5a29f..207cbeefdb1afd067abc86dc4efed4ae610e25c8 100644
--- a/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice/Email.php
+++ b/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice/Email.php
@@ -24,6 +24,8 @@
  */
 namespace Magento\Sales\Controller\Adminhtml\Invoice\AbstractInvoice;
 
+use Magento\Sales\Model\Order\Email\Sender\InvoiceSender;
+
 abstract class Email extends \Magento\Backend\App\Action
 {
     /**
@@ -41,25 +43,33 @@ abstract class Email extends \Magento\Backend\App\Action
      */
     public function execute()
     {
-        if ($invoiceId = $this->getRequest()->getParam('invoice_id')) {
-            if ($invoice = $this->_objectManager->create('Magento\Sales\Model\Order\Invoice')->load($invoiceId)) {
-                $invoice->sendEmail();
-                $historyItem = $this->_objectManager->create(
-                    'Magento\Sales\Model\Resource\Order\Status\History\Collection'
-                )->getUnnotifiedForInstance(
-                    $invoice,
-                    \Magento\Sales\Model\Order\Invoice::HISTORY_ENTITY_NAME
-                );
-                if ($historyItem) {
-                    $historyItem->setIsCustomerNotified(1);
-                    $historyItem->save();
-                }
-                $this->messageManager->addSuccess(__('We sent the message.'));
-                $this->_redirect(
-                    'sales/invoice/view',
-                    array('order_id' => $invoice->getOrder()->getId(), 'invoice_id' => $invoiceId)
-                );
-            }
+        $invoiceId = $this->getRequest()->getParam('invoice_id');
+        if (!$invoiceId) {
+            return;
+        }
+        $invoice = $this->_objectManager->create('Magento\Sales\Model\Order\Invoice')->load($invoiceId);
+        if (!$invoice) {
+            return;
+        }
+
+        /** @var InvoiceSender $invoiceSender */
+        $invoiceSender = $this->_objectManager->create('Magento\Sales\Model\Order\Email\Sender\InvoiceSender');
+        $invoiceSender->send($invoice);
+
+        $historyItem = $this->_objectManager->create(
+            'Magento\Sales\Model\Resource\Order\Status\History\Collection'
+        )->getUnnotifiedForInstance(
+            $invoice,
+            \Magento\Sales\Model\Order\Invoice::HISTORY_ENTITY_NAME
+        );
+        if ($historyItem) {
+            $historyItem->setIsCustomerNotified(1);
+            $historyItem->save();
         }
+        $this->messageManager->addSuccess(__('We sent the message.'));
+        $this->_redirect(
+            'sales/invoice/view',
+            array('order_id' => $invoice->getOrder()->getId(), 'invoice_id' => $invoiceId)
+        );
     }
 }
diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/AddComment.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/AddComment.php
index 161e89acf41a6a06ad110f0a099754792fdd283a..ae8584d6809ff7fb916bb6db9aebdd9193d99065 100644
--- a/app/code/Magento/Sales/Controller/Adminhtml/Order/AddComment.php
+++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/AddComment.php
@@ -25,6 +25,7 @@
 namespace Magento\Sales\Controller\Adminhtml\Order;
 
 use \Magento\Backend\App\Action;
+use Magento\Sales\Model\Order\Email\Sender\OrderCommentSender;
 
 class AddComment extends \Magento\Sales\Controller\Adminhtml\Order
 {
@@ -55,7 +56,11 @@ class AddComment extends \Magento\Sales\Controller\Adminhtml\Order
                 $comment = trim(strip_tags($data['comment']));
 
                 $order->save();
-                $order->sendOrderUpdateEmail($notify, $comment);
+                /** @var OrderCommentSender $orderCommentSender */
+                $orderCommentSender = $this->_objectManager
+                    ->create('Magento\Sales\Model\Order\Email\Sender\OrderCommentSender');
+
+                $orderCommentSender->send($order, $notify, $comment);
 
                 $this->_view->loadLayout('empty');
                 $this->_view->renderLayout();
diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/AddComment.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/AddComment.php
index eba5f4c1422cce7d018de42eae51bade211b895f..02c9c6ea161c7ba49b3c46d2ea91e8c5e218244f 100644
--- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/AddComment.php
+++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/AddComment.php
@@ -25,6 +25,7 @@
 namespace Magento\Sales\Controller\Adminhtml\Order\Creditmemo;
 
 use Magento\Backend\App\Action;
+use Magento\Sales\Model\Order\Email\Sender\CreditmemoSender;
 
 class AddComment extends \Magento\Backend\App\Action
 {
@@ -33,15 +34,23 @@ class AddComment extends \Magento\Backend\App\Action
      */
     protected $creditmemoLoader;
 
+    /**
+     * @var CreditmemoSender
+     */
+    protected $creditmemoSender;
+
     /**
      * @param Action\Context $context
      * @param \Magento\Sales\Controller\Adminhtml\Order\CreditmemoLoader $creditmemoLoader
+     * @param CreditmemoSender $creditmemoSender
      */
     public function __construct(
         Action\Context $context,
-        \Magento\Sales\Controller\Adminhtml\Order\CreditmemoLoader $creditmemoLoader
+        \Magento\Sales\Controller\Adminhtml\Order\CreditmemoLoader $creditmemoLoader,
+        CreditmemoSender $creditmemoSender
     ) {
         $this->creditmemoLoader = $creditmemoLoader;
+        $this->creditmemoSender = $creditmemoSender;
         parent::__construct($context);
     }
 
@@ -74,7 +83,8 @@ class AddComment extends \Magento\Backend\App\Action
                 isset($data['is_visible_on_front'])
             );
             $comment->save();
-            $creditmemo->sendUpdateEmail(!empty($data['is_customer_notified']), $data['comment']);
+
+            $this->creditmemoSender->send($creditmemo, !empty($data['is_customer_notified']), $data['comment']);
 
             $this->_view->loadLayout();
             $response = $this->_view->getLayout()->getBlock('creditmemo_comments')->toHtml();
diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/Save.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/Save.php
index bc9d8d695b574a226d5eb801464e816b2e1f6b05..11021c94b9fe00cba9b82e0b6da714469809c7d5 100644
--- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/Save.php
+++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemo/Save.php
@@ -26,6 +26,7 @@ namespace Magento\Sales\Controller\Adminhtml\Order\Creditmemo;
 
 use \Magento\Sales\Model\Order;
 use \Magento\Backend\App\Action;
+use Magento\Sales\Model\Order\Email\Sender\CreditmemoSender;
 
 class Save extends \Magento\Backend\App\Action
 {
@@ -34,15 +35,23 @@ class Save extends \Magento\Backend\App\Action
      */
     protected $creditmemoLoader;
 
+    /**
+     * @var CreditmemoSender
+     */
+    protected $creditmemoSender;
+
     /**
      * @param Action\Context $context
      * @param \Magento\Sales\Controller\Adminhtml\Order\CreditmemoLoader $creditmemoLoader
+     * @param CreditmemoSender $creditmemoSender
      */
     public function __construct(
         Action\Context $context,
-        \Magento\Sales\Controller\Adminhtml\Order\CreditmemoLoader $creditmemoLoader
+        \Magento\Sales\Controller\Adminhtml\Order\CreditmemoLoader $creditmemoLoader,
+        CreditmemoSender $creditmemoSender
     ) {
         $this->creditmemoLoader = $creditmemoLoader;
+        $this->creditmemoSender = $creditmemoSender;
         parent::__construct($context);
     }
 
@@ -115,7 +124,8 @@ class Save extends \Magento\Backend\App\Action
                     $transactionSave->addObject($creditmemo->getInvoice());
                 }
                 $transactionSave->save();
-                $creditmemo->sendEmail(!empty($data['send_email']), $comment);
+                $this->creditmemoSender->send($creditmemo, !empty($data['send_email']), $comment);
+
                 $this->messageManager->addSuccess(__('You created the credit memo.'));
                 $this->_getSession()->getCommentText(true);
                 $this->_redirect('sales/order/view', array('order_id' => $creditmemo->getOrderId()));
diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Email.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Email.php
index d4c23da395d872b5c8611fa0c31b1b019818da84..b5492f4f114daabb2a91d8d372cdb87009cc65bd 100644
--- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Email.php
+++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Email.php
@@ -38,7 +38,12 @@ class Email extends \Magento\Sales\Controller\Adminhtml\Order
         $order = $this->_initOrder();
         if ($order) {
             try {
-                $order->sendNewOrderEmail();
+                /** @var \Magento\Sales\Model\Order\Email\Sender\OrderSender $orderSender */
+                $orderSender = $this->_objectManager->create(
+                    'Magento\Sales\Model\Order\Email\Sender\OrderSender'
+                );
+                $orderSender->send($order);
+
                 $historyItem = $this->_objectManager->create(
                     'Magento\Sales\Model\Resource\Order\Status\History\Collection'
                 )->getUnnotifiedForInstance(
diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/AddComment.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/AddComment.php
index af6483eebe374e1f9cfdeda34756348a64d7662a..1f715e8a264fe46714c99bef422236bcbb111337 100644
--- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/AddComment.php
+++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/AddComment.php
@@ -26,6 +26,8 @@ namespace Magento\Sales\Controller\Adminhtml\Order\Invoice;
 
 use Magento\Backend\App\Action;
 use \Magento\Framework\Model\Exception;
+use \Magento\Sales\Model\Order\Email\Sender\InvoiceCommentSender;
+use \Magento\Sales\Model\Order\Invoice;
 
 class AddComment extends \Magento\Backend\App\Action
 {
@@ -34,15 +36,23 @@ class AddComment extends \Magento\Backend\App\Action
      */
     protected $invoiceLoader;
 
+    /**
+     * @var InvoiceCommentSender
+     */
+    protected $invoiceCommentSender;
+
     /**
      * @param Action\Context $context
      * @param \Magento\Sales\Controller\Adminhtml\Order\InvoiceLoader $invoiceLoader
+     * @param InvoiceCommentSender $invoiceCommentSender
      */
     public function __construct(
         Action\Context $context,
-        \Magento\Sales\Controller\Adminhtml\Order\InvoiceLoader $invoiceLoader
+        \Magento\Sales\Controller\Adminhtml\Order\InvoiceLoader $invoiceLoader,
+        InvoiceCommentSender $invoiceCommentSender
     ) {
         $this->invoiceLoader = $invoiceLoader;
+        $this->invoiceCommentSender = $invoiceCommentSender;
         parent::__construct($context);
     }
 
@@ -68,13 +78,15 @@ class AddComment extends \Magento\Backend\App\Action
                 throw new Exception(__('The Comment Text field cannot be empty.'));
             }
             $this->_title->add(__('Invoices'));
+            /** @var Invoice $invoice */
             $invoice = $this->invoiceLoader->load($this->_request);
             $invoice->addComment(
                 $data['comment'],
                 isset($data['is_customer_notified']),
                 isset($data['is_visible_on_front'])
             );
-            $invoice->sendUpdateEmail(!empty($data['is_customer_notified']), $data['comment']);
+
+            $this->invoiceCommentSender->send($invoice, !empty($data['is_customer_notified']), $data['comment']);
             $invoice->save();
 
             $this->_view->loadLayout();
diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/Save.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/Save.php
index 9b08f15f3e843b88beb039f01b8c14863a2078ea..ac057bc6beaf6358f2ac3ca9f69c997ba056bddc 100644
--- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/Save.php
+++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Invoice/Save.php
@@ -26,6 +26,9 @@ namespace Magento\Sales\Controller\Adminhtml\Order\Invoice;
 
 use \Magento\Framework\Model\Exception;
 use Magento\Backend\App\Action;
+use \Magento\Sales\Model\Order\Email\Sender\InvoiceCommentSender;
+use \Magento\Sales\Model\Order\Email\Sender\ShipmentSender;
+use \Magento\Sales\Model\Order\Invoice;
 
 class Save extends \Magento\Backend\App\Action
 {
@@ -34,15 +37,31 @@ class Save extends \Magento\Backend\App\Action
      */
     protected $invoiceLoader;
 
+    /**
+     * @var InvoiceCommentSender
+     */
+    protected $invoiceCommentSender;
+
+    /**
+     * @var ShipmentSender
+     */
+    protected $shipmentSender;
+
     /**
      * @param Action\Context $context
      * @param \Magento\Sales\Controller\Adminhtml\Order\InvoiceLoader $invoiceLoader
+     * @param InvoiceCommentSender $invoiceCommentSender
+     * @param ShipmentSender $shipmentSender
      */
     public function __construct(
         Action\Context $context,
-        \Magento\Sales\Controller\Adminhtml\Order\InvoiceLoader $invoiceLoader
+        \Magento\Sales\Controller\Adminhtml\Order\InvoiceLoader $invoiceLoader,
+        InvoiceCommentSender $invoiceCommentSender,
+        ShipmentSender $shipmentSender
     ) {
         $this->invoiceLoader = $invoiceLoader;
+        $this->invoiceCommentSender = $invoiceCommentSender;
+        $this->shipmentSender = $shipmentSender;
         parent::__construct($context);
     }
 
@@ -104,6 +123,7 @@ class Save extends \Magento\Backend\App\Action
         }
 
         try {
+            /** @var Invoice $invoice */
             $invoice = $this->invoiceLoader->load($this->_request);
             if ($invoice) {
 
@@ -164,14 +184,14 @@ class Save extends \Magento\Backend\App\Action
                     $comment = $data['comment_text'];
                 }
                 try {
-                    $invoice->sendEmail(!empty($data['send_email']), $comment);
+                    $this->invoiceCommentSender->send($invoice, !empty($data['send_email']), $comment);
                 } catch (\Exception $e) {
                     $this->_objectManager->get('Magento\Framework\Logger')->logException($e);
                     $this->messageManager->addError(__('We can\'t send the invoice email.'));
                 }
                 if ($shipment) {
                     try {
-                        $shipment->sendEmail(!empty($data['send_email']));
+                        $this->shipmentSender->send($shipment, !empty($data['send_email']));
                     } catch (\Exception $e) {
                         $this->_objectManager->get('Magento\Framework\Logger')->logException($e);
                         $this->messageManager->addError(__('We can\'t send the shipment.'));
diff --git a/app/code/Magento/Sales/Helper/Data.php b/app/code/Magento/Sales/Helper/Data.php
index 73c439cfafe54854ef1744b7eba7360930acd6f7..6a9ebc8661eea01f4a212d0d4e6e3f28f7845b6b 100644
--- a/app/code/Magento/Sales/Helper/Data.php
+++ b/app/code/Magento/Sales/Helper/Data.php
@@ -62,7 +62,7 @@ class Data extends \Magento\Core\Helper\Data
     public function canSendNewOrderConfirmationEmail($store = null)
     {
         return $this->_scopeConfig->isSetFlag(
-            \Magento\Sales\Model\Order::XML_PATH_EMAIL_ENABLED,
+            \Magento\Sales\Model\Order\Email\Container\OrderIdentity::XML_PATH_EMAIL_ENABLED,
             \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
             $store
         );
@@ -88,7 +88,7 @@ class Data extends \Magento\Core\Helper\Data
     public function canSendOrderCommentEmail($store = null)
     {
         return $this->_scopeConfig->isSetFlag(
-            \Magento\Sales\Model\Order::XML_PATH_UPDATE_EMAIL_ENABLED,
+            \Magento\Sales\Model\Order\Email\Container\OrderCommentIdentity::XML_PATH_EMAIL_ENABLED,
             \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
             $store
         );
@@ -103,7 +103,7 @@ class Data extends \Magento\Core\Helper\Data
     public function canSendNewShipmentEmail($store = null)
     {
         return $this->_scopeConfig->isSetFlag(
-            \Magento\Sales\Model\Order\Shipment::XML_PATH_EMAIL_ENABLED,
+            \Magento\Sales\Model\Order\Email\Container\ShipmentIdentity::XML_PATH_EMAIL_ENABLED,
             \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
             $store
         );
@@ -118,7 +118,7 @@ class Data extends \Magento\Core\Helper\Data
     public function canSendShipmentCommentEmail($store = null)
     {
         return $this->_scopeConfig->isSetFlag(
-            \Magento\Sales\Model\Order\Shipment::XML_PATH_UPDATE_EMAIL_ENABLED,
+            \Magento\Sales\Model\Order\Email\Container\ShipmentCommentIdentity::XML_PATH_EMAIL_ENABLED,
             \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
             $store
         );
@@ -133,7 +133,7 @@ class Data extends \Magento\Core\Helper\Data
     public function canSendNewInvoiceEmail($store = null)
     {
         return $this->_scopeConfig->isSetFlag(
-            \Magento\Sales\Model\Order\Invoice::XML_PATH_EMAIL_ENABLED,
+            \Magento\Sales\Model\Order\Email\Container\InvoiceIdentity::XML_PATH_EMAIL_ENABLED,
             \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
             $store
         );
@@ -148,7 +148,7 @@ class Data extends \Magento\Core\Helper\Data
     public function canSendInvoiceCommentEmail($store = null)
     {
         return $this->_scopeConfig->isSetFlag(
-            \Magento\Sales\Model\Order\Invoice::XML_PATH_UPDATE_EMAIL_ENABLED,
+            \Magento\Sales\Model\Order\Email\Container\InvoiceCommentIdentity::XML_PATH_EMAIL_ENABLED,
             \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
             $store
         );
@@ -163,7 +163,7 @@ class Data extends \Magento\Core\Helper\Data
     public function canSendNewCreditmemoEmail($store = null)
     {
         return $this->_scopeConfig->isSetFlag(
-            \Magento\Sales\Model\Order\Creditmemo::XML_PATH_EMAIL_ENABLED,
+            \Magento\Sales\Model\Order\Email\Container\CreditmemoIdentity::XML_PATH_EMAIL_ENABLED,
             \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
             $store
         );
@@ -178,7 +178,7 @@ class Data extends \Magento\Core\Helper\Data
     public function canSendCreditmemoCommentEmail($store = null)
     {
         return $this->_scopeConfig->isSetFlag(
-            \Magento\Sales\Model\Order\Creditmemo::XML_PATH_UPDATE_EMAIL_ENABLED,
+            \Magento\Sales\Model\Order\Email\Container\CreditmemoCommentIdentity::XML_PATH_EMAIL_ENABLED,
             \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
             $store
         );
diff --git a/app/code/Magento/Sales/Model/AdminOrder/Create.php b/app/code/Magento/Sales/Model/AdminOrder/Create.php
index 85b0010452368bd9b420d933b9d5c369b9885389..f28db0b90f947e440d538fb2e6d85994df3339b3 100644
--- a/app/code/Magento/Sales/Model/AdminOrder/Create.php
+++ b/app/code/Magento/Sales/Model/AdminOrder/Create.php
@@ -32,6 +32,7 @@ use Magento\Customer\Service\V1\CustomerGroupServiceInterface;
 use Magento\Customer\Service\V1\Data\Customer as CustomerDataObject;
 use Magento\Customer\Model\Metadata\Form as CustomerForm;
 use Magento\Customer\Service\V1\Data\Address as CustomerAddressDataObject;
+use Magento\Sales\Model\Quote\Item;
 
 /**
  * Order create model
@@ -202,6 +203,11 @@ class Create extends \Magento\Framework\Object implements \Magento\Checkout\Mode
      */
     protected $quoteItemUpdater;
 
+    /**
+     * @var \Magento\Framework\Object\Factory
+     */
+    protected $objectFactory;
+
     /**
      * @param \Magento\Framework\ObjectManager $objectManager
      * @param \Magento\Framework\Event\ManagerInterface $eventManager
@@ -222,7 +228,8 @@ class Create extends \Magento\Framework\Object implements \Magento\Checkout\Mode
      * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
      * @param EmailSender $emailSender
      * @param \Magento\CatalogInventory\Service\V1\StockItemService $stockItemService
-     * @param \Magento\Sales\Model\Quote\Item\Updater $quoteItemUpdater
+     * @param Item\Updater $quoteItemUpdater
+     * @param \Magento\Framework\Object\Factory $objectFactory
      * @param array $data
      */
     public function __construct(
@@ -246,6 +253,7 @@ class Create extends \Magento\Framework\Object implements \Magento\Checkout\Mode
         \Magento\Sales\Model\AdminOrder\EmailSender $emailSender,
         \Magento\CatalogInventory\Service\V1\StockItemService $stockItemService,
         \Magento\Sales\Model\Quote\Item\Updater $quoteItemUpdater,
+        \Magento\Framework\Object\Factory $objectFactory,
         array $data = array()
     ) {
         $this->_objectManager = $objectManager;
@@ -268,6 +276,7 @@ class Create extends \Magento\Framework\Object implements \Magento\Checkout\Mode
         $this->emailSender = $emailSender;
         $this->stockItemService = $stockItemService;
         $this->quoteItemUpdater = $quoteItemUpdater;
+        $this->objectFactory = $objectFactory;
         parent::__construct($data);
     }
 
@@ -998,7 +1007,7 @@ class Create extends \Magento\Framework\Object implements \Magento\Checkout\Mode
         try {
             foreach ($items as $itemId => $info) {
                 if (!empty($info['configured'])) {
-                    $item = $this->getQuote()->updateItem($itemId, $this->_objectManager->create($info));
+                    $item = $this->getQuote()->updateItem($itemId, $this->objectFactory->create($info));
                     $info['qty'] = (double)$item->getQty();
                 } else {
                     $item = $this->getQuote()->getItemById($itemId);
@@ -1007,7 +1016,7 @@ class Create extends \Magento\Framework\Object implements \Magento\Checkout\Mode
                     }
                     $info['qty'] = (double)$info['qty'];
                 }
-                $item = $this->quoteItemUpdater->update($item, $info);
+                $this->quoteItemUpdater->update($item, $info);
                 if ($item && !empty($info['action'])) {
                     $this->moveQuoteItem($item, $info['action'], $item->getQty());
                 }
diff --git a/app/code/Magento/Sales/Model/AdminOrder/EmailSender.php b/app/code/Magento/Sales/Model/AdminOrder/EmailSender.php
index 77c549d6f6ca07ca01267b35d54252bacec0742c..2bfc9e5c8550a9316d04f3ebeb28092af66dd3fa 100644
--- a/app/code/Magento/Sales/Model/AdminOrder/EmailSender.php
+++ b/app/code/Magento/Sales/Model/AdminOrder/EmailSender.php
@@ -26,6 +26,7 @@ namespace Magento\Sales\Model\AdminOrder;
 use Magento\Framework\Message\ManagerInterface;
 use Magento\Framework\Logger;
 use Magento\Sales\Model\Order;
+use Magento\Sales\Model\Order\Email\Sender\OrderSender;
 
 /**
  * Class EmailSender
@@ -33,23 +34,30 @@ use Magento\Sales\Model\Order;
 class EmailSender
 {
     /**
-     * @var \Magento\Framework\Message\ManagerInterface
+     * @var ManagerInterface
      */
     protected $messageManager;
 
     /**
-     * @var \Magento\Framework\Logger
+     * @var Logger
      */
     protected $logger;
 
+    /**
+     * @var OrderSender
+     */
+    protected $orderSender;
+
     /**
      * @param ManagerInterface $messageManager
      * @param Logger $logger
+     * @param OrderSender $orderSender
      */
-    public function __construct(ManagerInterface $messageManager, Logger $logger)
+    public function __construct(ManagerInterface $messageManager, Logger $logger, OrderSender $orderSender)
     {
         $this->messageManager = $messageManager;
         $this->logger = $logger;
+        $this->orderSender = $orderSender;
     }
 
     /**
@@ -62,7 +70,7 @@ class EmailSender
     public function send(Order $order)
     {
         try {
-            $order->sendNewOrderEmail();
+            $this->orderSender->send($order);
         } catch (\Magento\Framework\Mail\Exception $exception) {
             $this->logger->logException($exception);
             $this->messageManager->addWarning(
diff --git a/app/code/Magento/Sales/Model/Notifier.php b/app/code/Magento/Sales/Model/Notifier.php
new file mode 100644
index 0000000000000000000000000000000000000000..bbe3ebfa38a01a7a62c12bfda5f8d274136754a8
--- /dev/null
+++ b/app/code/Magento/Sales/Model/Notifier.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\Sales\Model;
+
+use Magento\Sales\Model\Resource\Order\Status\History\CollectionFactory;
+use Magento\Sales\Model\Order\Email\Sender\OrderSender;
+use Magento\Framework\Logger;
+use Magento\Framework\Mail\Exception;
+
+/**
+ * Class Notifier
+ * @package Magento\Sales\Model
+ */
+class Notifier extends \Magento\Framework\Model\AbstractModel
+{
+    /**
+     * @var CollectionFactory
+     */
+    protected $historyCollectionFactory;
+
+    /**
+     * @var \Magento\Framework\Logger
+     */
+    protected $logger;
+
+    /**
+     * @var OrderSender
+     */
+    protected $orderSender;
+
+    /**
+     * @param CollectionFactory $historyCollectionFactory
+     * @param Logger $logger
+     * @param OrderSender $orderSender
+     */
+    public function __construct(
+        CollectionFactory $historyCollectionFactory,
+        Logger $logger,
+        OrderSender $orderSender
+    ) {
+        $this->historyCollectionFactory = $historyCollectionFactory;
+        $this->logger = $logger;
+        $this->orderSender = $orderSender;
+    }
+
+    /**
+     * Notify user
+     *
+     * @param Order $order
+     * @return bool
+     * @throws \Magento\Framework\Mail\Exception
+     */
+    public function notify(\Magento\Sales\Model\Order $order)
+    {
+        try {
+            $this->orderSender->send($order);
+            if (!$order->getEmailSent()) {
+                return false;
+            }
+            $historyItem = $this->historyCollectionFactory->create()->getUnnotifiedForInstance(
+                $order,
+                \Magento\Sales\Model\Order::HISTORY_ENTITY_NAME
+            );
+            if ($historyItem) {
+                $historyItem->setIsCustomerNotified(1);
+                $historyItem->save();
+            }
+        } catch (Exception $e) {
+            $this->logger->logException($e);
+            return false;
+        }
+        return true;
+    }
+}
diff --git a/app/code/Magento/Sales/Model/Order.php b/app/code/Magento/Sales/Model/Order.php
index aa7f6b062367f91b4aa18a988e559ffb38e79760..8a626144a1e512c6f9331ebe9ced20ca7fc78d87 100644
--- a/app/code/Magento/Sales/Model/Order.php
+++ b/app/code/Magento/Sales/Model/Order.php
@@ -315,33 +315,6 @@ class Order extends \Magento\Sales\Model\AbstractModel
 {
     const ENTITY = 'order';
 
-    /**
-     * XML configuration paths
-     */
-    const XML_PATH_EMAIL_TEMPLATE = 'sales_email/order/template';
-
-    const XML_PATH_EMAIL_GUEST_TEMPLATE = 'sales_email/order/guest_template';
-
-    const XML_PATH_EMAIL_IDENTITY = 'sales_email/order/identity';
-
-    const XML_PATH_EMAIL_COPY_TO = 'sales_email/order/copy_to';
-
-    const XML_PATH_EMAIL_COPY_METHOD = 'sales_email/order/copy_method';
-
-    const XML_PATH_EMAIL_ENABLED = 'sales_email/order/enabled';
-
-    const XML_PATH_UPDATE_EMAIL_TEMPLATE = 'sales_email/order_comment/template';
-
-    const XML_PATH_UPDATE_EMAIL_GUEST_TEMPLATE = 'sales_email/order_comment/guest_template';
-
-    const XML_PATH_UPDATE_EMAIL_IDENTITY = 'sales_email/order_comment/identity';
-
-    const XML_PATH_UPDATE_EMAIL_COPY_TO = 'sales_email/order_comment/copy_to';
-
-    const XML_PATH_UPDATE_EMAIL_COPY_METHOD = 'sales_email/order_comment/copy_method';
-
-    const XML_PATH_UPDATE_EMAIL_ENABLED = 'sales_email/order_comment/enabled';
-
     /**
      * Order states
      */
@@ -487,27 +460,6 @@ class Order extends \Magento\Sales\Model\AbstractModel
      */
     protected $_historyEntityName = self::HISTORY_ENTITY_NAME;
 
-    /**
-     * Sales data
-     *
-     * @var \Magento\Sales\Helper\Data
-     */
-    protected $_salesData;
-
-    /**
-     * Payment data
-     *
-     * @var \Magento\Payment\Helper\Data
-     */
-    protected $_paymentData;
-
-    /**
-     * Core store config
-     *
-     * @var \Magento\Framework\App\Config\ScopeConfigInterface
-     */
-    protected $_scopeConfig;
-
     /**
      * @var \Magento\Store\Model\StoreManagerInterface
      */
@@ -523,11 +475,6 @@ class Order extends \Magento\Sales\Model\AbstractModel
      */
     protected $_productFactory;
 
-    /**
-     * @var \Magento\Framework\Mail\Template\TransportBuilder
-     */
-    protected $_transportBuilder;
-
     /**
      * @var \Magento\Sales\Model\Resource\Order\Item\CollectionFactory
      */
@@ -608,13 +555,9 @@ class Order extends \Magento\Sales\Model\AbstractModel
      * @param \Magento\Framework\Registry $registry
      * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
      * @param \Magento\Framework\Stdlib\DateTime $dateTime
-     * @param \Magento\Payment\Helper\Data $paymentData
-     * @param \Magento\Sales\Helper\Data $salesData
-     * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
      * @param \Magento\Store\Model\StoreManagerInterface $storeManager
      * @param Order\Config $orderConfig
      * @param \Magento\Catalog\Model\ProductFactory $productFactory
-     * @param \Magento\Framework\Mail\Template\TransportBuilder $transportBuilder
      * @param Resource\Order\Item\CollectionFactory $orderItemCollectionFactory
      * @param \Magento\Catalog\Model\Product\Visibility $productVisibility
      * @param \Magento\Tax\Model\Calculation $taxCalculation
@@ -639,13 +582,9 @@ class Order extends \Magento\Sales\Model\AbstractModel
         \Magento\Framework\Registry $registry,
         \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
         \Magento\Framework\Stdlib\DateTime $dateTime,
-        \Magento\Payment\Helper\Data $paymentData,
-        \Magento\Sales\Helper\Data $salesData,
-        \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
         \Magento\Store\Model\StoreManagerInterface $storeManager,
         \Magento\Sales\Model\Order\Config $orderConfig,
         \Magento\Catalog\Model\ProductFactory $productFactory,
-        \Magento\Framework\Mail\Template\TransportBuilder $transportBuilder,
         \Magento\Sales\Model\Resource\Order\Item\CollectionFactory $orderItemCollectionFactory,
         \Magento\Catalog\Model\Product\Visibility $productVisibility,
         \Magento\Tax\Model\Calculation $taxCalculation,
@@ -665,13 +604,10 @@ class Order extends \Magento\Sales\Model\AbstractModel
         \Magento\Framework\Data\Collection\Db $resourceCollection = null,
         array $data = array()
     ) {
-        $this->_paymentData = $paymentData;
-        $this->_salesData = $salesData;
-        $this->_scopeConfig = $scopeConfig;
         $this->_storeManager = $storeManager;
         $this->_orderConfig = $orderConfig;
         $this->_productFactory = $productFactory;
-        $this->_transportBuilder = $transportBuilder;
+
         $this->_orderItemCollectionFactory = $orderItemCollectionFactory;
         $this->_productVisibility = $productVisibility;
         $this->_taxCalculation = $taxCalculation;
@@ -1506,232 +1442,6 @@ class Order extends \Magento\Sales\Model\AbstractModel
         }
     }
 
-    /**
-     * Send email with order data
-     *
-     * @return $this
-     */
-    public function sendNewOrderEmail()
-    {
-        $storeId = $this->getStore()->getId();
-
-        if (!$this->_salesData->canSendNewOrderEmail($storeId)) {
-            return $this;
-        }
-
-        // Get the destination email addresses to send copies to
-        $copyTo = $this->_getEmails(self::XML_PATH_EMAIL_COPY_TO);
-        $copyMethod = $this->_scopeConfig->getValue(
-            self::XML_PATH_EMAIL_COPY_METHOD,
-            \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-            $storeId
-        );
-
-        $paymentBlockHtml = $this->_paymentData->getInfoBlockHtml($this->getPayment(), $storeId);
-
-        // Retrieve corresponding email template id and customer name
-        if ($this->getCustomerIsGuest()) {
-            $templateId = $this->_scopeConfig->getValue(
-                self::XML_PATH_EMAIL_GUEST_TEMPLATE,
-                \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                $storeId
-            );
-            $customerName = $this->getBillingAddress()->getName();
-        } else {
-            $templateId = $this->_scopeConfig->getValue(
-                self::XML_PATH_EMAIL_TEMPLATE,
-                \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                $storeId
-            );
-            $customerName = $this->getCustomerName();
-        }
-
-        $this->_transportBuilder->setTemplateIdentifier(
-            $templateId
-        )->setTemplateOptions(
-            array('area' => \Magento\Framework\App\Area::AREA_FRONTEND, 'store' => $storeId)
-        )->setTemplateVars(
-            array(
-                'order' => $this,
-                'billing' => $this->getBillingAddress(),
-                'payment_html' => $paymentBlockHtml,
-                'store' => $this->getStore()
-            )
-        )->setFrom(
-            $this->_scopeConfig->getValue(
-                self::XML_PATH_EMAIL_IDENTITY,
-                \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                $storeId
-            )
-        )->addTo(
-            $this->getCustomerEmail(),
-            $customerName
-        );
-        if ($copyTo && $copyMethod == 'bcc') {
-            // Add bcc to customer email
-            foreach ($copyTo as $email) {
-                $this->_transportBuilder->addBcc($email);
-            }
-        }
-        /** @var \Magento\Framework\Mail\TransportInterface $transport */
-        $transport = $this->_transportBuilder->getTransport();
-        $transport->sendMessage();
-
-        // Email copies are sent as separated emails if their copy method is 'copy'
-        if ($copyTo && $copyMethod == 'copy') {
-            foreach ($copyTo as $email) {
-                $this->_transportBuilder->setTemplateIdentifier(
-                    $templateId
-                )->setTemplateOptions(
-                    array('area' => \Magento\Framework\App\Area::AREA_FRONTEND, 'store' => $storeId)
-                )->setTemplateVars(
-                    array(
-                        'order' => $this,
-                        'billing' => $this->getBillingAddress(),
-                        'payment_html' => $paymentBlockHtml,
-                        'store' => $this->getStore()
-                    )
-                )->setFrom(
-                    $this->_scopeConfig->getValue(
-                        self::XML_PATH_EMAIL_IDENTITY,
-                        \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                        $storeId
-                    )
-                )->addTo(
-                    $email
-                )->getTransport()->sendMessage();
-            }
-        }
-
-        $this->setEmailSent(true);
-        $this->_getResource()->saveAttribute($this, 'email_sent');
-
-        return $this;
-    }
-
-    /**
-     * Send email with order update information
-     *
-     * @param boolean $notifyCustomer
-     * @param string $comment
-     * @return $this
-     */
-    public function sendOrderUpdateEmail($notifyCustomer = true, $comment = '')
-    {
-        $storeId = $this->getStore()->getId();
-
-        if (!$this->_salesData->canSendOrderCommentEmail($storeId)) {
-            return $this;
-        }
-        // Get the destination email addresses to send copies to
-        $copyTo = $this->_getEmails(self::XML_PATH_UPDATE_EMAIL_COPY_TO);
-        $copyMethod = $this->_scopeConfig->getValue(
-            self::XML_PATH_UPDATE_EMAIL_COPY_METHOD,
-            \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-            $storeId
-        );
-        // Check if at least one recipient is found
-        if (!$notifyCustomer && !$copyTo) {
-            return $this;
-        }
-
-        // Retrieve corresponding email template id and customer name
-        if ($this->getCustomerIsGuest()) {
-            $templateId = $this->_scopeConfig->getValue(
-                self::XML_PATH_UPDATE_EMAIL_GUEST_TEMPLATE,
-                \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                $storeId
-            );
-            $customerName = $this->getBillingAddress()->getName();
-        } else {
-            $templateId = $this->_scopeConfig->getValue(
-                self::XML_PATH_UPDATE_EMAIL_TEMPLATE,
-                \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                $storeId
-            );
-            $customerName = $this->getCustomerName();
-        }
-
-        if ($notifyCustomer) {
-            $this->_transportBuilder->setTemplateIdentifier(
-                $templateId
-            )->setTemplateOptions(
-                array('area' => \Magento\Framework\App\Area::AREA_FRONTEND, 'store' => $storeId)
-            )->setTemplateVars(
-                array(
-                    'order' => $this,
-                    'comment' => $comment,
-                    'billing' => $this->getBillingAddress(),
-                    'store' => $this->getStore()
-                )
-            )->setFrom(
-                $this->_scopeConfig->getValue(
-                    self::XML_PATH_UPDATE_EMAIL_IDENTITY,
-                    \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                    $storeId
-                )
-            )->addTo(
-                $this->getCustomerEmail(),
-                $customerName
-            );
-            if ($copyTo && $copyMethod == 'bcc') {
-                // Add bcc to customer email
-                foreach ($copyTo as $email) {
-                    $this->_transportBuilder->addBcc($email);
-                }
-            }
-            /** @var \Magento\Framework\Mail\TransportInterface $transport */
-            $transport = $this->_transportBuilder->getTransport();
-            $transport->sendMessage();
-        }
-
-        // Email copies are sent as separated emails if their copy method is
-        // 'copy' or a customer should not be notified
-        if ($copyTo && ($copyMethod == 'copy' || !$notifyCustomer)) {
-            foreach ($copyTo as $email) {
-                $this->_transportBuilder->setTemplateIdentifier(
-                    $templateId
-                )->setTemplateOptions(
-                    array('area' => \Magento\Framework\App\Area::AREA_FRONTEND, 'store' => $storeId)
-                )->setTemplateVars(
-                    array(
-                        'order' => $this,
-                        'comment' => $comment,
-                        'billing' => $this->getBillingAddress(),
-                        'store' => $this->getStore()
-                    )
-                )->setFrom(
-                    $this->_scopeConfig->getValue(
-                        self::XML_PATH_UPDATE_EMAIL_IDENTITY,
-                        \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                        $storeId
-                    )
-                )->addTo(
-                    $email
-                )->getTransport()->sendMessage();
-            }
-        }
-
-        return $this;
-    }
-
-    /**
-     * @param string $configPath
-     * @return array|false
-     */
-    protected function _getEmails($configPath)
-    {
-        $data = $this->_scopeConfig->getValue(
-            $configPath,
-            \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-            $this->getStoreId()
-        );
-        if (!empty($data)) {
-            return explode(',', $data);
-        }
-        return false;
-    }
-
     /*********************** ADDRESSES ***************************/
 
     /**
@@ -2628,13 +2338,4 @@ class Order extends \Magento\Sales\Model\AbstractModel
     {
         return $this->getState() === self::STATE_CANCELED;
     }
-
-    /**
-     * Protect order delete from not admin scope
-     * @return $this
-     */
-    protected function _beforeDelete()
-    {
-        return parent::_beforeDelete();
-    }
 }
diff --git a/app/code/Magento/Sales/Model/Order/Address/Validator.php b/app/code/Magento/Sales/Model/Order/Address/Validator.php
new file mode 100644
index 0000000000000000000000000000000000000000..13b8b8a5d1161ca659db5fb8aa7ea0b7d88b6d25
--- /dev/null
+++ b/app/code/Magento/Sales/Model/Order/Address/Validator.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\Sales\Model\Order\Address;
+
+use Magento\Sales\Model\Order\Address;
+
+/**
+ * Class Validator
+ */
+class Validator
+{
+    /**
+     * @var array
+     */
+    protected $required = [
+        'parent_id' =>'Parent Order Id',
+        'postcode' => 'Zip code',
+        'lastname' => 'Last name',
+        'street' => 'Street',
+        'city' => 'City',
+        'email' => 'Email',
+        'telephone' => 'Telephone',
+        'country_id' => 'Country',
+        'firstname' => 'First Name',
+        'address_type' => 'Address Type'
+    ];
+
+    /**
+     *
+     * @param \Magento\Sales\Model\Order\Address $address
+     * @return array
+     */
+    public function validate(Address $address)
+    {
+        $warnings = [];
+        foreach ($this->required as $code => $label) {
+            if (!$address->hasData($code)) {
+                $warnings[] = sprintf('%s is a required field', $label);
+            }
+        }
+        if (!filter_var($address->getEmail(), FILTER_VALIDATE_EMAIL)) {
+            $warnings[] = 'Email has a wrong format';
+        }
+        if (!filter_var(in_array($address->getAddressType(), [Address::TYPE_BILLING, Address::TYPE_SHIPPING]))) {
+            $warnings[] = 'Address type doesn\'t match required options';
+        }
+        return $warnings;
+    }
+}
diff --git a/app/code/Magento/Sales/Model/Order/Creditmemo.php b/app/code/Magento/Sales/Model/Order/Creditmemo.php
index efb987cf10c71235d0b2661f6021353c389ff78d..98a0c17d3be363a6274e48a2a44a7a94e8705b6b 100644
--- a/app/code/Magento/Sales/Model/Order/Creditmemo.php
+++ b/app/code/Magento/Sales/Model/Order/Creditmemo.php
@@ -128,30 +128,6 @@ class Creditmemo extends \Magento\Sales\Model\AbstractModel
 
     const STATE_CANCELED = 3;
 
-    const XML_PATH_EMAIL_TEMPLATE = 'sales_email/creditmemo/template';
-
-    const XML_PATH_EMAIL_GUEST_TEMPLATE = 'sales_email/creditmemo/guest_template';
-
-    const XML_PATH_EMAIL_IDENTITY = 'sales_email/creditmemo/identity';
-
-    const XML_PATH_EMAIL_COPY_TO = 'sales_email/creditmemo/copy_to';
-
-    const XML_PATH_EMAIL_COPY_METHOD = 'sales_email/creditmemo/copy_method';
-
-    const XML_PATH_EMAIL_ENABLED = 'sales_email/creditmemo/enabled';
-
-    const XML_PATH_UPDATE_EMAIL_TEMPLATE = 'sales_email/creditmemo_comment/template';
-
-    const XML_PATH_UPDATE_EMAIL_GUEST_TEMPLATE = 'sales_email/creditmemo_comment/guest_template';
-
-    const XML_PATH_UPDATE_EMAIL_IDENTITY = 'sales_email/creditmemo_comment/identity';
-
-    const XML_PATH_UPDATE_EMAIL_COPY_TO = 'sales_email/creditmemo_comment/copy_to';
-
-    const XML_PATH_UPDATE_EMAIL_COPY_METHOD = 'sales_email/creditmemo_comment/copy_method';
-
-    const XML_PATH_UPDATE_EMAIL_ENABLED = 'sales_email/creditmemo_comment/enabled';
-
     const REPORT_DATE_TYPE_ORDER_CREATED = 'order_created';
 
     const REPORT_DATE_TYPE_REFUND_CREATED = 'refund_created';
@@ -198,27 +174,6 @@ class Creditmemo extends \Magento\Sales\Model\AbstractModel
      */
     protected $_eventObject = 'creditmemo';
 
-    /**
-     * Sales data
-     *
-     * @var \Magento\Sales\Helper\Data
-     */
-    protected $_salesData;
-
-    /**
-     * Payment data
-     *
-     * @var \Magento\Payment\Helper\Data
-     */
-    protected $_paymentData;
-
-    /**
-     * Core store config
-     *
-     * @var \Magento\Framework\App\Config\ScopeConfigInterface
-     */
-    protected $_scopeConfig;
-
     /**
      * @var \Magento\Sales\Model\Order\Creditmemo\Config
      */
@@ -254,19 +209,11 @@ class Creditmemo extends \Magento\Sales\Model\AbstractModel
      */
     protected $_commentCollectionFactory;
 
-    /**
-     * @var \Magento\Framework\Mail\Template\TransportBuilder
-     */
-    protected $_transportBuilder;
-
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
      * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
      * @param \Magento\Framework\Stdlib\DateTime $dateTime
-     * @param \Magento\Payment\Helper\Data $paymentData
-     * @param \Magento\Sales\Helper\Data $salesData
-     * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
      * @param Creditmemo\Config $creditmemoConfig
      * @param \Magento\Sales\Model\OrderFactory $orderFactory
      * @param \Magento\Sales\Model\Resource\Order\Creditmemo\Item\CollectionFactory $cmItemCollectionFactory
@@ -274,7 +221,6 @@ class Creditmemo extends \Magento\Sales\Model\AbstractModel
      * @param \Magento\Store\Model\StoreManagerInterface $storeManager
      * @param Creditmemo\CommentFactory $commentFactory
      * @param \Magento\Sales\Model\Resource\Order\Creditmemo\Comment\CollectionFactory $commentCollectionFactory
-     * @param \Magento\Framework\Mail\Template\TransportBuilder $transportBuilder
      * @param \Magento\Framework\Model\Resource\AbstractResource $resource
      * @param \Magento\Framework\Data\Collection\Db $resourceCollection
      * @param array $data
@@ -284,9 +230,6 @@ class Creditmemo extends \Magento\Sales\Model\AbstractModel
         \Magento\Framework\Registry $registry,
         \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
         \Magento\Framework\Stdlib\DateTime $dateTime,
-        \Magento\Payment\Helper\Data $paymentData,
-        \Magento\Sales\Helper\Data $salesData,
-        \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
         \Magento\Sales\Model\Order\Creditmemo\Config $creditmemoConfig,
         \Magento\Sales\Model\OrderFactory $orderFactory,
         \Magento\Sales\Model\Resource\Order\Creditmemo\Item\CollectionFactory $cmItemCollectionFactory,
@@ -294,14 +237,10 @@ class Creditmemo extends \Magento\Sales\Model\AbstractModel
         \Magento\Store\Model\StoreManagerInterface $storeManager,
         \Magento\Sales\Model\Order\Creditmemo\CommentFactory $commentFactory,
         \Magento\Sales\Model\Resource\Order\Creditmemo\Comment\CollectionFactory $commentCollectionFactory,
-        \Magento\Framework\Mail\Template\TransportBuilder $transportBuilder,
         \Magento\Framework\Model\Resource\AbstractResource $resource = null,
         \Magento\Framework\Data\Collection\Db $resourceCollection = null,
         array $data = array()
     ) {
-        $this->_paymentData = $paymentData;
-        $this->_salesData = $salesData;
-        $this->_scopeConfig = $scopeConfig;
         $this->_creditmemoConfig = $creditmemoConfig;
         $this->_orderFactory = $orderFactory;
         $this->_cmItemCollectionFactory = $cmItemCollectionFactory;
@@ -309,7 +248,6 @@ class Creditmemo extends \Magento\Sales\Model\AbstractModel
         $this->_storeManager = $storeManager;
         $this->_commentFactory = $commentFactory;
         $this->_commentCollectionFactory = $commentCollectionFactory;
-        $this->_transportBuilder = $transportBuilder;
         parent::__construct($context, $registry, $localeDate, $dateTime, $resource, $resourceCollection, $data);
     }
 
@@ -864,253 +802,6 @@ class Creditmemo extends \Magento\Sales\Model\AbstractModel
         return $this->_comments;
     }
 
-    /**
-     * Send email with creditmemo data
-     *
-     * @param boolean $notifyCustomer
-     * @param string $comment
-     * @return $this
-     */
-    public function sendEmail($notifyCustomer = true, $comment = '')
-    {
-        $order = $this->getOrder();
-        $storeId = $order->getStore()->getId();
-
-        if (!$this->_salesData->canSendNewCreditmemoEmail($storeId)) {
-            return $this;
-        }
-        // Get the destination email addresses to send copies to
-        $copyTo = $this->_getEmails(self::XML_PATH_EMAIL_COPY_TO);
-        $copyMethod = $this->_scopeConfig->getValue(
-            self::XML_PATH_EMAIL_COPY_METHOD,
-            \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-            $storeId
-        );
-        // Check if at least one recipient is found
-        if (!$notifyCustomer && !$copyTo) {
-            return $this;
-        }
-
-        $paymentBlockHtml = $this->_paymentData->getInfoBlockHtml($order->getPayment(), $storeId);
-
-        // Retrieve corresponding email template id and customer name
-        if ($order->getCustomerIsGuest()) {
-            $templateId = $this->_scopeConfig->getValue(
-                self::XML_PATH_EMAIL_GUEST_TEMPLATE,
-                \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                $storeId
-            );
-            $customerName = $order->getBillingAddress()->getName();
-        } else {
-            $templateId = $this->_scopeConfig->getValue(
-                self::XML_PATH_EMAIL_TEMPLATE,
-                \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                $storeId
-            );
-            $customerName = $order->getCustomerName();
-        }
-
-        if ($notifyCustomer) {
-            $this->_transportBuilder->setTemplateIdentifier(
-                $templateId
-            )->setTemplateOptions(
-                array('area' => \Magento\Framework\App\Area::AREA_FRONTEND, 'store' => $storeId)
-            )->setTemplateVars(
-                array(
-                    'order' => $order,
-                    'invoice' => $this,
-                    'comment' => $comment,
-                    'billing' => $order->getBillingAddress(),
-                    'payment_html' => $paymentBlockHtml,
-                    'store' => $this->getStore()
-                )
-            )->setFrom(
-                $this->_scopeConfig->getValue(
-                    self::XML_PATH_EMAIL_IDENTITY,
-                    \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                    $storeId
-                )
-            )->addTo(
-                $order->getCustomerEmail(),
-                $customerName
-            );
-            if ($copyTo && $copyMethod == 'bcc') {
-                // Add bcc to customer email
-                foreach ($copyTo as $email) {
-                    $this->_transportBuilder->addBcc($email);
-                }
-            }
-            /** @var \Magento\Framework\Mail\TransportInterface $transport */
-            $transport = $this->_transportBuilder->getTransport();
-            $transport->sendMessage();
-        }
-
-        // Email copies are sent as separated emails if their copy method is 'copy' or a customer should not be notified
-        if ($copyTo && ($copyMethod == 'copy' || !$notifyCustomer)) {
-            foreach ($copyTo as $email) {
-                $this->_transportBuilder->setTemplateIdentifier(
-                    $templateId
-                )->setTemplateOptions(
-                    array('area' => \Magento\Framework\App\Area::AREA_FRONTEND, 'store' => $storeId)
-                )->setTemplateVars(
-                    array(
-                        'order' => $order,
-                        'invoice' => $this,
-                        'comment' => $comment,
-                        'billing' => $order->getBillingAddress(),
-                        'payment_html' => $paymentBlockHtml,
-                        'store' => $this->getStore()
-                    )
-                )->setFrom(
-                    $this->_scopeConfig->getValue(
-                        self::XML_PATH_EMAIL_IDENTITY,
-                        \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                        $storeId
-                    )
-                )->addTo(
-                    $email
-                )->getTransport()->sendMessage();
-            }
-        }
-
-        $this->setEmailSent(true);
-        $this->_getResource()->saveAttribute($this, 'email_sent');
-
-        return $this;
-    }
-
-    /**
-     * Send email with creditmemo update information
-     *
-     * @param boolean $notifyCustomer
-     * @param string $comment
-     * @return $this
-     */
-    public function sendUpdateEmail($notifyCustomer = true, $comment = '')
-    {
-        $order = $this->getOrder();
-        $storeId = $order->getStore()->getId();
-
-        if (!$this->_salesData->canSendCreditmemoCommentEmail($storeId)) {
-            return $this;
-        }
-        // Get the destination email addresses to send copies to
-        $copyTo = $this->_getEmails(self::XML_PATH_UPDATE_EMAIL_COPY_TO);
-        $copyMethod = $this->_scopeConfig->getValue(
-            self::XML_PATH_UPDATE_EMAIL_COPY_METHOD,
-            \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-            $storeId
-        );
-        // Check if at least one recipient is found
-        if (!$notifyCustomer && !$copyTo) {
-            return $this;
-        }
-
-        // Retrieve corresponding email template id and customer name
-        if ($order->getCustomerIsGuest()) {
-            $templateId = $this->_scopeConfig->getValue(
-                self::XML_PATH_UPDATE_EMAIL_GUEST_TEMPLATE,
-                \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                $storeId
-            );
-            $customerName = $order->getBillingAddress()->getName();
-        } else {
-            $templateId = $this->_scopeConfig->getValue(
-                self::XML_PATH_UPDATE_EMAIL_TEMPLATE,
-                \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                $storeId
-            );
-            $customerName = $order->getCustomerName();
-        }
-
-        if ($notifyCustomer) {
-            $this->_transportBuilder->setTemplateIdentifier(
-                $templateId
-            )->setTemplateOptions(
-                array('area' => \Magento\Framework\App\Area::AREA_FRONTEND, 'store' => $storeId)
-            )->setTemplateVars(
-                array(
-                    'order' => $order,
-                    'creditmemo' => $this,
-                    'comment' => $comment,
-                    'billing' => $order->getBillingAddress(),
-                    'store' => $this->getStore()
-                )
-            )->setFrom(
-                $this->_scopeConfig->getValue(
-                    self::XML_PATH_UPDATE_EMAIL_IDENTITY,
-                    \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                    $storeId
-                )
-            )->addTo(
-                $order->getCustomerEmail(),
-                $customerName
-            );
-            if ($copyTo && $copyMethod == 'bcc') {
-                // Add bcc to customer email
-                foreach ($copyTo as $email) {
-                    $this->_transportBuilder->addBcc($email);
-                }
-            }
-            /** @var \Magento\Framework\Mail\TransportInterface $transport */
-            $transport = $this->_transportBuilder->getTransport();
-            $transport->sendMessage();
-        }
-
-        // Email copies are sent as separated emails if their copy method is 'copy' or a customer should not be notified
-        if ($copyTo && ($copyMethod == 'copy' || !$notifyCustomer)) {
-            foreach ($copyTo as $email) {
-                $this->_transportBuilder->setTemplateIdentifier(
-                    $templateId
-                )->setTemplateOptions(
-                    array('area' => \Magento\Framework\App\Area::AREA_FRONTEND, 'store' => $storeId)
-                )->setTemplateVars(
-                    array(
-                        'order' => $order,
-                        'creditmemo' => $this,
-                        'comment' => $comment,
-                        'billing' => $order->getBillingAddress(),
-                        'store' => $this->getStore()
-                    )
-                )->setFrom(
-                    $this->_scopeConfig->getValue(
-                        self::XML_PATH_UPDATE_EMAIL_IDENTITY,
-                        \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                        $storeId
-                    )
-                )->addTo(
-                    $email
-                )->getTransport()->sendMessage();
-            }
-        }
-
-        return $this;
-    }
-
-    /**
-     * @param string $configPath
-     * @return array|bool
-     */
-    protected function _getEmails($configPath)
-    {
-        $data = $this->_scopeConfig->getValue(
-            $configPath,
-            \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-            $this->getStoreId()
-        );
-        if (!empty($data)) {
-            return explode(',', $data);
-        }
-        return false;
-    }
-
-    /**
-     * @return \Magento\Framework\Model\AbstractModel
-     */
-    protected function _beforeDelete()
-    {
-        return parent::_beforeDelete();
-    }
 
     /**
      * After save object manipulations
diff --git a/app/code/Magento/Sales/Model/Order/Email/Container/Container.php b/app/code/Magento/Sales/Model/Order/Email/Container/Container.php
new file mode 100644
index 0000000000000000000000000000000000000000..af38cf08fa7915a3024943561269126aa3bc69af
--- /dev/null
+++ b/app/code/Magento/Sales/Model/Order/Email/Container/Container.php
@@ -0,0 +1,152 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Email\Container;
+
+use Magento\Store\Model\StoreManagerInterface;
+use Magento\Store\Model\Store;
+use Magento\Framework\App\Config\ScopeConfigInterface;
+
+abstract class Container implements IdentityInterface
+{
+    /**
+     * @var StoreManagerInterface
+     */
+    protected $storeManager;
+
+    /**
+     * Core store config
+     *
+     * @var ScopeConfigInterface
+     */
+    protected $scopeConfig;
+
+    /**
+     * @var Store
+     */
+    protected $store;
+
+    /**
+     * @var string
+     */
+    protected $customerName;
+
+    /**
+     * @var string
+     */
+    protected $customerEmail;
+
+    /**
+     * @param ScopeConfigInterface $scopeConfig
+     * @param StoreManagerInterface $storeManager
+     */
+    public function __construct(
+        ScopeConfigInterface $scopeConfig,
+        StoreManagerInterface $storeManager
+    ) {
+        $this->scopeConfig = $scopeConfig;
+        $this->storeManager = $storeManager;
+    }
+    /**
+     * Return store configuration value
+     *
+     * @param string $path
+     * @param int $storeId
+     * @return mixed
+     */
+    protected function getConfigValue($path, $storeId)
+    {
+        return $this->scopeConfig->getValue(
+            $path,
+            \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
+            $storeId
+        );
+    }
+
+    /**
+     * Set current store
+     *
+     * @param Store $store
+     * @return void
+     */
+    public function setStore(Store $store)
+    {
+        $this->store = $store;
+    }
+
+    /**
+     * Return store
+     *
+     * @return Store
+     */
+    public function getStore()
+    {
+        //current store
+        if ($this->store instanceof Store) {
+            return $this->store;
+        }
+        return $this->storeManager->getStore();
+    }
+
+    /**
+     * Set customer name
+     *
+     * @param string $name
+     * @return void
+     */
+    public function setCustomerName($name)
+    {
+        $this->customerName = $name;
+    }
+
+    /**
+     * Set customer email
+     *
+     * @param string $email
+     * @return void
+     */
+    public function setCustomerEmail($email)
+    {
+        $this->customerEmail = $email;
+    }
+
+    /**
+     * Return customer name
+     *
+     * @return string
+     */
+    public function getCustomerName()
+    {
+        return $this->customerName;
+    }
+
+    /**
+     * Return customer email
+     *
+     * @return string
+     */
+    public function getCustomerEmail()
+    {
+        return $this->customerEmail;
+    }
+}
diff --git a/app/code/Magento/Sales/Model/Order/Email/Container/CreditmemoCommentIdentity.php b/app/code/Magento/Sales/Model/Order/Email/Container/CreditmemoCommentIdentity.php
new file mode 100644
index 0000000000000000000000000000000000000000..742acef50bb6b203f4fcdc26ce57656a13ed1e52
--- /dev/null
+++ b/app/code/Magento/Sales/Model/Order/Email/Container/CreditmemoCommentIdentity.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\Sales\Model\Order\Email\Container;
+
+class CreditmemoCommentIdentity extends Container implements IdentityInterface
+{
+    const XML_PATH_EMAIL_COPY_METHOD = 'sales_email/creditmemo_comment/copy_method';
+    const XML_PATH_EMAIL_COPY_TO = 'sales_email/creditmemo_comment/copy_to';
+    const XML_PATH_EMAIL_IDENTITY = 'sales_email/creditmemo_comment/identity';
+    const XML_PATH_EMAIL_GUEST_TEMPLATE = 'sales_email/creditmemo_comment/guest_template';
+    const XML_PATH_EMAIL_TEMPLATE = 'sales_email/creditmemo_comment/template';
+    const XML_PATH_EMAIL_ENABLED = 'sales_email/creditmemo_comment/enabled';
+
+    /**
+     * @return bool
+     */
+    public function isEnabled()
+    {
+        return $this->scopeConfig->isSetFlag(
+            self::XML_PATH_EMAIL_ENABLED,
+            \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
+            $this->getStore()->getStoreId()
+        );
+    }
+
+    /**
+     * @return array|bool
+     */
+    public function getEmailCopyTo()
+    {
+        $data = $this->getConfigValue(self::XML_PATH_EMAIL_COPY_TO, $this->getStore()->getStoreId());
+        if (!empty($data)) {
+            return explode(',', $data);
+        }
+        return false;
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getCopyMethod()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_COPY_METHOD, $this->getStore()->getStoreId());
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getGuestTemplateId()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_GUEST_TEMPLATE, $this->getStore()->getStoreId());
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getTemplateId()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_TEMPLATE, $this->getStore()->getStoreId());
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getEmailIdentity()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_IDENTITY, $this->getStore()->getStoreId());
+    }
+}
diff --git a/app/code/Magento/Sales/Model/Order/Email/Container/CreditmemoIdentity.php b/app/code/Magento/Sales/Model/Order/Email/Container/CreditmemoIdentity.php
new file mode 100644
index 0000000000000000000000000000000000000000..b4f72a5662679e0aa738ec0934156835675b11e2
--- /dev/null
+++ b/app/code/Magento/Sales/Model/Order/Email/Container/CreditmemoIdentity.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\Sales\Model\Order\Email\Container;
+
+class CreditmemoIdentity extends Container implements IdentityInterface
+{
+    const XML_PATH_EMAIL_COPY_METHOD = 'sales_email/creditmemo/copy_method';
+    const XML_PATH_EMAIL_COPY_TO = 'sales_email/creditmemo/copy_to';
+    const XML_PATH_EMAIL_IDENTITY = 'sales_email/creditmemo/identity';
+    const XML_PATH_EMAIL_GUEST_TEMPLATE = 'sales_email/creditmemo/guest_template';
+    const XML_PATH_EMAIL_TEMPLATE = 'sales_email/creditmemo/template';
+    const XML_PATH_EMAIL_ENABLED = 'sales_email/creditmemo/enabled';
+
+    /**
+     * @return bool
+     */
+    public function isEnabled()
+    {
+        return $this->scopeConfig->isSetFlag(
+            self::XML_PATH_EMAIL_ENABLED,
+            \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
+            $this->getStore()->getStoreId()
+        );
+    }
+
+    /**
+     * @return array|bool
+     */
+    public function getEmailCopyTo()
+    {
+        $data = $this->getConfigValue(self::XML_PATH_EMAIL_COPY_TO, $this->getStore()->getStoreId());
+        if (!empty($data)) {
+            return explode(',', $data);
+        }
+        return false;
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getCopyMethod()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_COPY_METHOD, $this->getStore()->getStoreId());
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getGuestTemplateId()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_GUEST_TEMPLATE, $this->getStore()->getStoreId());
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getTemplateId()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_TEMPLATE, $this->getStore()->getStoreId());
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getEmailIdentity()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_IDENTITY, $this->getStore()->getStoreId());
+    }
+}
diff --git a/app/code/Magento/Sales/Model/Order/Email/Container/IdentityInterface.php b/app/code/Magento/Sales/Model/Order/Email/Container/IdentityInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..953fc2e4826d2aa8962227d78c5fe3c79a7ac992
--- /dev/null
+++ b/app/code/Magento/Sales/Model/Order/Email/Container/IdentityInterface.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\Sales\Model\Order\Email\Container;
+
+use \Magento\Store\Model\Store;
+
+interface IdentityInterface
+{
+    /**
+     * @return bool
+     */
+    public function isEnabled();
+
+    /**
+     * @return array|bool
+     */
+    public function getEmailCopyTo();
+
+    /**
+     * @return mixed
+     */
+    public function getCopyMethod();
+
+    /**
+     * @return mixed
+     */
+    public function getGuestTemplateId();
+
+    /**
+     * @return mixed
+     */
+    public function getTemplateId();
+
+    /**
+     * @return mixed
+     */
+    public function getEmailIdentity();
+
+    /**
+     * @return string
+     */
+    public function getCustomerEmail();
+
+    /**
+     * @return string
+     */
+    public function getCustomerName();
+
+    /**
+     * @return Store
+     */
+    public function getStore();
+
+    /**
+     * @param Store $store
+     * @return mixed
+     */
+    public function setStore(Store $store);
+
+    /**
+     * @param string $email
+     * @return mixed
+     */
+    public function setCustomerEmail($email);
+
+    /**
+     * @param string $name
+     * @return mixed
+     */
+    public function setCustomerName($name);
+}
diff --git a/app/code/Magento/Sales/Model/Order/Email/Container/InvoiceCommentIdentity.php b/app/code/Magento/Sales/Model/Order/Email/Container/InvoiceCommentIdentity.php
new file mode 100644
index 0000000000000000000000000000000000000000..e78d8980b249dc39b396af1b22acce821406eab4
--- /dev/null
+++ b/app/code/Magento/Sales/Model/Order/Email/Container/InvoiceCommentIdentity.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\Sales\Model\Order\Email\Container;
+
+class InvoiceCommentIdentity extends Container implements IdentityInterface
+{
+    const XML_PATH_EMAIL_COPY_METHOD = 'sales_email/invoice_comment/copy_method';
+    const XML_PATH_EMAIL_COPY_TO = 'sales_email/invoice_comment/copy_to';
+    const XML_PATH_EMAIL_GUEST_TEMPLATE = 'sales_email/invoice_comment/guest_template';
+    const XML_PATH_EMAIL_TEMPLATE = 'sales_email/invoice_comment/template';
+    const XML_PATH_EMAIL_IDENTITY = 'sales_email/invoice_comment/identity';
+    const XML_PATH_EMAIL_ENABLED = 'sales_email/invoice_comment/enabled';
+
+
+    /**
+     * @return bool
+     */
+    public function isEnabled()
+    {
+        return $this->scopeConfig->isSetFlag(
+            self::XML_PATH_EMAIL_ENABLED,
+            \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
+            $this->getStore()->getStoreId()
+        );
+    }
+
+    /**
+     * @return array|bool
+     */
+    public function getEmailCopyTo()
+    {
+        $data = $this->getConfigValue(self::XML_PATH_EMAIL_COPY_TO, $this->getStore()->getStoreId());
+        if (!empty($data)) {
+            return explode(',', $data);
+        }
+        return false;
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getCopyMethod()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_COPY_METHOD, $this->getStore()->getStoreId());
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getGuestTemplateId()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_GUEST_TEMPLATE, $this->getStore()->getStoreId());
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getTemplateId()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_TEMPLATE, $this->getStore()->getStoreId());
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getEmailIdentity()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_IDENTITY, $this->getStore()->getStoreId());
+    }
+}
diff --git a/app/code/Magento/Sales/Model/Order/Email/Container/InvoiceIdentity.php b/app/code/Magento/Sales/Model/Order/Email/Container/InvoiceIdentity.php
new file mode 100644
index 0000000000000000000000000000000000000000..74cdbaf12f23ce019f4972f99e18035d10de6a67
--- /dev/null
+++ b/app/code/Magento/Sales/Model/Order/Email/Container/InvoiceIdentity.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\Sales\Model\Order\Email\Container;
+
+class InvoiceIdentity extends Container implements IdentityInterface
+{
+    const XML_PATH_EMAIL_COPY_METHOD = 'sales_email/invoice/copy_method';
+    const XML_PATH_EMAIL_COPY_TO = 'sales_email/invoice/copy_to';
+    const XML_PATH_EMAIL_IDENTITY = 'sales_email/invoice/identity';
+    const XML_PATH_EMAIL_GUEST_TEMPLATE = 'sales_email/invoice/guest_template';
+    const XML_PATH_EMAIL_TEMPLATE = 'sales_email/invoice/template';
+    const XML_PATH_EMAIL_ENABLED = 'sales_email/invoice/enabled';
+
+    /**
+     * @return bool
+     */
+    public function isEnabled()
+    {
+        return $this->scopeConfig->isSetFlag(
+            self::XML_PATH_EMAIL_ENABLED,
+            \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
+            $this->getStore()->getStoreId()
+        );
+    }
+
+    /**
+     * @return array|bool
+     */
+    public function getEmailCopyTo()
+    {
+        $data = $this->getConfigValue(self::XML_PATH_EMAIL_COPY_TO, $this->getStore()->getStoreId());
+        if (!empty($data)) {
+            return explode(',', $data);
+        }
+        return false;
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getCopyMethod()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_COPY_METHOD, $this->getStore()->getStoreId());
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getGuestTemplateId()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_GUEST_TEMPLATE, $this->getStore()->getStoreId());
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getTemplateId()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_TEMPLATE, $this->getStore()->getStoreId());
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getEmailIdentity()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_IDENTITY, $this->getStore()->getStoreId());
+    }
+}
diff --git a/app/code/Magento/Sales/Model/Order/Email/Container/OrderCommentIdentity.php b/app/code/Magento/Sales/Model/Order/Email/Container/OrderCommentIdentity.php
new file mode 100644
index 0000000000000000000000000000000000000000..d9efb6d9d8ff5bc42261459efe61174c1a9f867f
--- /dev/null
+++ b/app/code/Magento/Sales/Model/Order/Email/Container/OrderCommentIdentity.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\Sales\Model\Order\Email\Container;
+
+class OrderCommentIdentity extends Container implements IdentityInterface
+{
+    const XML_PATH_EMAIL_COPY_METHOD = 'sales_email/order_comment/copy_method';
+    const XML_PATH_EMAIL_COPY_TO = 'sales_email/order_comment/copy_to';
+    const XML_PATH_EMAIL_GUEST_TEMPLATE = 'sales_email/order_comment/guest_template';
+    const XML_PATH_EMAIL_TEMPLATE = 'sales_email/order_comment/template';
+    const XML_PATH_EMAIL_IDENTITY = 'sales_email/order_comment/identity';
+    const XML_PATH_EMAIL_ENABLED = 'sales_email/order_comment/enabled';
+
+    /**
+     * @return bool
+     */
+    public function isEnabled()
+    {
+        return $this->scopeConfig->isSetFlag(
+            self::XML_PATH_EMAIL_ENABLED,
+            \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
+            $this->getStore()->getStoreId()
+        );
+    }
+
+    /**
+     * @return array|bool
+     */
+    public function getEmailCopyTo()
+    {
+        $data = $this->getConfigValue(self::XML_PATH_EMAIL_COPY_TO, $this->getStore()->getStoreId());
+        if (!empty($data)) {
+            return explode(',', $data);
+        }
+        return false;
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getCopyMethod()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_COPY_METHOD, $this->getStore()->getStoreId());
+    }
+
+
+    /**
+     * @return mixed
+     */
+    public function getGuestTemplateId()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_GUEST_TEMPLATE, $this->getStore()->getStoreId());
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getTemplateId()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_TEMPLATE, $this->getStore()->getStoreId());
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getEmailIdentity()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_IDENTITY, $this->getStore()->getStoreId());
+    }
+}
diff --git a/app/code/Magento/Sales/Model/Order/Email/Container/OrderIdentity.php b/app/code/Magento/Sales/Model/Order/Email/Container/OrderIdentity.php
new file mode 100644
index 0000000000000000000000000000000000000000..88f447047f36524c335b5bcfdbd5cfd35a38b30a
--- /dev/null
+++ b/app/code/Magento/Sales/Model/Order/Email/Container/OrderIdentity.php
@@ -0,0 +1,103 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Email\Container;
+
+class OrderIdentity extends Container implements IdentityInterface
+{
+    /**
+     * Configuration paths
+     */
+    const XML_PATH_EMAIL_COPY_METHOD = 'sales_email/order/copy_method';
+    const XML_PATH_EMAIL_COPY_TO = 'sales_email/order/copy_to';
+    const XML_PATH_EMAIL_IDENTITY = 'sales_email/order/identity';
+    const XML_PATH_EMAIL_GUEST_TEMPLATE = 'sales_email/order/guest_template';
+    const XML_PATH_EMAIL_TEMPLATE = 'sales_email/order/template';
+    const XML_PATH_EMAIL_ENABLED = 'sales_email/order/enabled';
+
+    /**
+     * @return bool
+     */
+    public function isEnabled()
+    {
+        return $this->scopeConfig->isSetFlag(
+            self::XML_PATH_EMAIL_ENABLED,
+            \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
+            $this->getStore()->getStoreId()
+        );
+    }
+
+    /**
+     * Return email copy_to list
+     *
+     * @return array|bool
+     */
+    public function getEmailCopyTo()
+    {
+        $data = $this->getConfigValue(self::XML_PATH_EMAIL_COPY_TO, $this->getStore()->getStoreId());
+        if (!empty($data)) {
+            return explode(',', $data);
+        }
+        return false;
+    }
+
+    /**
+     * Return copy method
+     *
+     * @return mixed
+     */
+    public function getCopyMethod()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_COPY_METHOD, $this->getStore()->getStoreId());
+    }
+
+    /**
+     * Return guest template id
+     *
+     * @return mixed
+     */
+    public function getGuestTemplateId()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_GUEST_TEMPLATE, $this->getStore()->getStoreId());
+    }
+
+    /**
+     * Return template id
+     *
+     * @return mixed
+     */
+    public function getTemplateId()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_TEMPLATE, $this->getStore()->getStoreId());
+    }
+
+    /**
+     * Return email identity
+     *
+     * @return mixed
+     */
+    public function getEmailIdentity()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_IDENTITY, $this->getStore()->getStoreId());
+    }
+}
diff --git a/app/code/Magento/Sales/Model/Order/Email/Container/ShipmentCommentIdentity.php b/app/code/Magento/Sales/Model/Order/Email/Container/ShipmentCommentIdentity.php
new file mode 100644
index 0000000000000000000000000000000000000000..8cbec3f6c784990d07a4d7717b87facea9a658ff
--- /dev/null
+++ b/app/code/Magento/Sales/Model/Order/Email/Container/ShipmentCommentIdentity.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\Sales\Model\Order\Email\Container;
+
+class ShipmentCommentIdentity extends Container implements IdentityInterface
+{
+    const XML_PATH_EMAIL_COPY_METHOD = 'sales_email/shipment_comment/copy_method';
+    const XML_PATH_EMAIL_COPY_TO = 'sales_email/shipment_comment/copy_to';
+    const XML_PATH_EMAIL_IDENTITY = 'sales_email/shipment_comment/identity';
+    const XML_PATH_EMAIL_GUEST_TEMPLATE = 'sales_email/shipment_comment/guest_template';
+    const XML_PATH_EMAIL_TEMPLATE = 'sales_email/shipment_comment/template';
+    const XML_PATH_EMAIL_ENABLED = 'sales_email/shipment_comment/enabled';
+
+    /**
+     * @return bool
+     */
+    public function isEnabled()
+    {
+        return $this->scopeConfig->isSetFlag(
+            self::XML_PATH_EMAIL_ENABLED,
+            \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
+            $this->getStore()->getStoreId()
+        );
+    }
+
+    /**
+     * @return array|bool
+     */
+    public function getEmailCopyTo()
+    {
+        $data = $this->getConfigValue(self::XML_PATH_EMAIL_COPY_TO, $this->getStore()->getStoreId());
+        if (!empty($data)) {
+            return explode(',', $data);
+        }
+        return false;
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getCopyMethod()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_COPY_METHOD, $this->getStore()->getStoreId());
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getGuestTemplateId()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_GUEST_TEMPLATE, $this->getStore()->getStoreId());
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getTemplateId()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_TEMPLATE, $this->getStore()->getStoreId());
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getEmailIdentity()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_IDENTITY, $this->getStore()->getStoreId());
+    }
+}
diff --git a/app/code/Magento/Sales/Model/Order/Email/Container/ShipmentIdentity.php b/app/code/Magento/Sales/Model/Order/Email/Container/ShipmentIdentity.php
new file mode 100644
index 0000000000000000000000000000000000000000..768109203d8514bb98add9af5a226a83411cd813
--- /dev/null
+++ b/app/code/Magento/Sales/Model/Order/Email/Container/ShipmentIdentity.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\Sales\Model\Order\Email\Container;
+
+class ShipmentIdentity extends Container implements IdentityInterface
+{
+    /**
+     * Configuration paths
+     */
+    const XML_PATH_EMAIL_COPY_METHOD = 'sales_email/shipment/copy_method';
+    const XML_PATH_EMAIL_COPY_TO = 'sales_email/shipment/copy_to';
+    const XML_PATH_EMAIL_IDENTITY = 'sales_email/shipment/identity';
+    const XML_PATH_EMAIL_GUEST_TEMPLATE = 'sales_email/shipment/guest_template';
+    const XML_PATH_EMAIL_TEMPLATE = 'sales_email/shipment/template';
+    const XML_PATH_EMAIL_ENABLED = 'sales_email/shipment/enabled';
+
+    /**
+     * Is email enabled
+     *
+     * @return bool
+     */
+    public function isEnabled()
+    {
+        return $this->scopeConfig->isSetFlag(
+            self::XML_PATH_EMAIL_ENABLED,
+            \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
+            $this->getStore()->getStoreId()
+        );
+    }
+
+    /**
+     * Return list of copy_to emails
+     *
+     * @return array|bool
+     */
+    public function getEmailCopyTo()
+    {
+        $data = $this->getConfigValue(self::XML_PATH_EMAIL_COPY_TO, $this->getStore()->getStoreId());
+        if (!empty($data)) {
+            return explode(',', $data);
+        }
+        return false;
+    }
+
+    /**
+     * Return email copy method
+     *
+     * @return mixed
+     */
+    public function getCopyMethod()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_COPY_METHOD, $this->getStore()->getStoreId());
+    }
+
+    /**
+     * Return guest template id
+     *
+     * @return mixed
+     */
+    public function getGuestTemplateId()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_GUEST_TEMPLATE, $this->getStore()->getStoreId());
+    }
+
+    /**
+     * Return template id
+     *
+     * @return mixed
+     */
+    public function getTemplateId()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_TEMPLATE, $this->getStore()->getStoreId());
+    }
+
+    /**
+     * Return email identity
+     *
+     * @return mixed
+     */
+    public function getEmailIdentity()
+    {
+        return $this->getConfigValue(self::XML_PATH_EMAIL_IDENTITY, $this->getStore()->getStoreId());
+    }
+}
diff --git a/app/code/Magento/Sales/Model/Order/Email/Container/Template.php b/app/code/Magento/Sales/Model/Order/Email/Container/Template.php
new file mode 100644
index 0000000000000000000000000000000000000000..87ed8416bd0ef43b2c540b8bcdfe2350aea45600
--- /dev/null
+++ b/app/code/Magento/Sales/Model/Order/Email/Container/Template.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\Sales\Model\Order\Email\Container;
+
+class Template
+{
+    /**
+     * @var array
+     */
+    protected $vars;
+
+    /**
+     * @var array
+     */
+    protected $options;
+
+    /**
+     * @var string
+     */
+    protected $templateId;
+
+    /**
+     * @var int
+     */
+    protected $id;
+
+    /**
+     * Set email template variables
+     *
+     * @param array $vars
+     * @return void
+     */
+    public function setTemplateVars(array $vars)
+    {
+        $this->vars = $vars;
+    }
+
+    /**
+     * Set email template options
+     *
+     * @param array $options
+     * @return void
+     */
+    public function setTemplateOptions(array $options)
+    {
+        $this->options = $options;
+    }
+
+    /**
+     * Get email template variables
+     *
+     * @return array
+     */
+    public function getTemplateVars()
+    {
+        return $this->vars;
+    }
+
+    /**
+     * Get email template options
+     *
+     * @return array
+     */
+    public function getTemplateOptions()
+    {
+        return $this->options;
+    }
+
+    /**
+     * Set email template id
+     *
+     * @param int $id
+     * @return void
+     */
+    public function setTemplateId($id)
+    {
+        $this->id = $id;
+    }
+
+    /**
+     * Get email template id
+     *
+     * @return int
+     */
+    public function getTemplateId()
+    {
+        return $this->id;
+    }
+}
diff --git a/app/code/Magento/Sales/Model/Order/Email/NotifySender.php b/app/code/Magento/Sales/Model/Order/Email/NotifySender.php
new file mode 100644
index 0000000000000000000000000000000000000000..ecb7ceaf5020994eddfcd3399be40ec6ba8905b6
--- /dev/null
+++ b/app/code/Magento/Sales/Model/Order/Email/NotifySender.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\Sales\Model\Order\Email;
+
+use Magento\Sales\Model\Order;
+
+abstract class NotifySender extends Sender
+{
+    /**
+     * Send email to customer
+     *
+     * @param Order $order
+     * @param bool $notify
+     * @return bool
+     */
+    protected function checkAndSend(Order $order, $notify = true)
+    {
+        $this->identityContainer->setStore($order->getStore());
+        if (!$this->identityContainer->isEnabled()) {
+            return false;
+        }
+        $this->prepareTemplate($order);
+
+        /** @var SenderBuilder $sender */
+        $sender = $this->getSender();
+
+        if ($notify) {
+            $sender->send();
+        } else {
+            // Email copies are sent as separated emails if their copy method is 'copy' or a customer should not be notified
+            $sender->sendCopyTo();
+        }
+
+        return true;
+    }
+}
diff --git a/app/code/Magento/Sales/Model/Order/Email/Sender.php b/app/code/Magento/Sales/Model/Order/Email/Sender.php
new file mode 100644
index 0000000000000000000000000000000000000000..4e9dcf98689804d3474ce7ed0c2e35385b00d63d
--- /dev/null
+++ b/app/code/Magento/Sales/Model/Order/Email/Sender.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.
+ *
+ * @copyright   Copyright (c) 2014 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\Email;
+
+use Magento\Sales\Model\Order;
+use Magento\Sales\Model\Order\Email\Container\Template;
+use Magento\Sales\Model\Order\Email\Container\IdentityInterface;
+
+abstract class Sender
+{
+    /**
+     * @var \Magento\Sales\Model\Order\Email\SenderBuilderFactory
+     */
+    protected $senderBuilderFactory;
+
+    /**
+     * @var Template
+     */
+    protected $templateContainer;
+
+    /**
+     * @var IdentityInterface
+     */
+    protected $identityContainer;
+
+    /**
+     * @param Template $templateContainer
+     * @param IdentityInterface $identityContainer
+     * @param Order\Email\SenderBuilderFactory $senderBuilderFactory
+     */
+    public function __construct(
+        Template $templateContainer,
+        IdentityInterface $identityContainer,
+        \Magento\Sales\Model\Order\Email\SenderBuilderFactory $senderBuilderFactory
+    ) {
+        $this->templateContainer = $templateContainer;
+        $this->identityContainer = $identityContainer;
+        $this->senderBuilderFactory = $senderBuilderFactory;
+    }
+
+    /**
+     * @param Order $order
+     * @return bool
+     */
+    protected function checkAndSend(Order $order)
+    {
+        $this->identityContainer->setStore($order->getStore());
+        if (!$this->identityContainer->isEnabled()) {
+            return false;
+        }
+        $this->prepareTemplate($order);
+
+        /** @var SenderBuilder $sender */
+        $sender = $this->getSender();
+
+        $sender->send();
+        $sender->sendCopyTo();
+
+        return true;
+    }
+
+    /**
+     * @param Order $order
+     * @return void
+     */
+    protected function prepareTemplate(Order $order)
+    {
+        $this->templateContainer->setTemplateOptions($this->getTemplateOptions());
+
+        if ($order->getCustomerIsGuest()) {
+            $templateId = $this->identityContainer->getGuestTemplateId();
+            $customerName = $order->getBillingAddress()->getName();
+        } else {
+            $templateId = $this->identityContainer->getTemplateId();
+            $customerName = $order->getCustomerName();
+        }
+
+        $this->identityContainer->setCustomerName($customerName);
+        $this->identityContainer->setCustomerEmail($order->getCustomerEmail());
+        $this->templateContainer->setTemplateId($templateId);
+    }
+
+    /**
+     * @return Sender
+     */
+    protected function getSender()
+    {
+        return $this->senderBuilderFactory->create(
+            [
+                'templateContainer' => $this->templateContainer,
+                'identityContainer' => $this->identityContainer
+            ]
+        );
+    }
+
+    /**
+     * @return array
+     */
+    protected function getTemplateOptions()
+    {
+        return [
+            'area' => \Magento\Framework\App\Area::AREA_FRONTEND,
+            'store' => $this->identityContainer->getStore()->getStoreId()
+        ];
+    }
+}
diff --git a/app/code/Magento/Sales/Model/Order/Email/Sender/CreditmemoCommentSender.php b/app/code/Magento/Sales/Model/Order/Email/Sender/CreditmemoCommentSender.php
new file mode 100644
index 0000000000000000000000000000000000000000..87134a908bc8a5c3be7e28c268c574b34e7dc8a4
--- /dev/null
+++ b/app/code/Magento/Sales/Model/Order/Email/Sender/CreditmemoCommentSender.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\Sales\Model\Order\Email\Sender;
+
+use Magento\Sales\Model\Order\Email\NotifySender;
+use Magento\Sales\Model\Order\Creditmemo;
+use Magento\Sales\Model\Order;
+use Magento\Sales\Model\Order\Email\Container\Template;
+use Magento\Sales\Model\Order\Email\Container\CreditmemoCommentIdentity;
+
+class CreditmemoCommentSender extends NotifySender
+{
+    /**
+     * @param Template $templateContainer
+     * @param CreditmemoCommentIdentity $identityContainer
+     * @param Order\Email\SenderBuilderFactory $senderBuilderFactory
+     */
+    public function __construct(
+        Template $templateContainer,
+        CreditmemoCommentIdentity $identityContainer,
+        \Magento\Sales\Model\Order\Email\SenderBuilderFactory $senderBuilderFactory
+    ) {
+        parent::__construct($templateContainer, $identityContainer, $senderBuilderFactory);
+    }
+
+    /**
+     * Send email to customer
+     *
+     * @param Creditmemo $creditmemo
+     * @param bool $notify
+     * @param string $comment
+     * @return bool
+     */
+    public function send(Creditmemo $creditmemo, $notify = true, $comment = '')
+    {
+        $order = $creditmemo->getOrder();
+        $this->templateContainer->setTemplateVars(
+            [
+                'order' => $order,
+                'creditmemo' => $creditmemo,
+                'comment' => $comment,
+                'billing' => $order->getBillingAddress(),
+                'store' => $order->getStore()
+            ]
+        );
+
+        return $this->checkAndSend($order, $notify);
+    }
+}
diff --git a/app/code/Magento/Sales/Model/Order/Email/Sender/CreditmemoSender.php b/app/code/Magento/Sales/Model/Order/Email/Sender/CreditmemoSender.php
new file mode 100644
index 0000000000000000000000000000000000000000..c06aa8b344bcba0211f6b0ecc4cb546e75faab40
--- /dev/null
+++ b/app/code/Magento/Sales/Model/Order/Email/Sender/CreditmemoSender.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\Sales\Model\Order\Email\Sender;
+
+use Magento\Sales\Model\Order\Email\NotifySender;
+use Magento\Sales\Model\Order\Creditmemo;
+use Magento\Sales\Model\Order;
+use Magento\Sales\Model\Resource\Order\Creditmemo as CreditmemoResource;
+use Magento\Payment\Helper\Data as PaymentHelper;
+use Magento\Sales\Model\Order\Email\Container\Template;
+use Magento\Sales\Model\Order\Email\Container\CreditmemoIdentity;
+
+class CreditmemoSender extends NotifySender
+{
+    /**
+     * @var PaymentHelper
+     */
+    protected $paymentHelper;
+
+    /**
+     * @var CreditmemoResource
+     */
+    protected $creditmemoResource;
+
+    /**
+     * @param Template $templateContainer
+     * @param CreditmemoIdentity $identityContainer
+     * @param Order\Email\SenderBuilderFactory $senderBuilderFactory
+     * @param PaymentHelper $paymentHelper
+     * @param CreditmemoResource $creditmemoResource
+     */
+    public function __construct(
+        Template $templateContainer,
+        CreditmemoIdentity $identityContainer,
+        \Magento\Sales\Model\Order\Email\SenderBuilderFactory $senderBuilderFactory,
+        PaymentHelper $paymentHelper,
+        CreditmemoResource $creditmemoResource
+    ) {
+        parent::__construct($templateContainer, $identityContainer, $senderBuilderFactory);
+        $this->paymentHelper = $paymentHelper;
+        $this->creditmemoResource = $creditmemoResource;
+    }
+
+    /**
+     * Send email to customer
+     *
+     * @param Creditmemo $creditmemo
+     * @param bool $notify
+     * @param string $comment
+     * @return bool
+     */
+    public function send(Creditmemo $creditmemo, $notify = true, $comment = '')
+    {
+        $order = $creditmemo->getOrder();
+        $this->templateContainer->setTemplateVars(
+            [
+                'order' => $creditmemo->getOrder(),
+                'invoice' => $creditmemo,
+                'comment' => $comment,
+                'billing' => $order->getBillingAddress(),
+                'payment_html' => $this->getPaymentHtml($order),
+                'store' => $order->getStore()
+            ]
+        );
+
+        $result = $this->checkAndSend($order, $notify);
+        if ($result) {
+            $creditmemo->setEmailSent(true);
+            $this->creditmemoResource->saveAttribute($creditmemo, 'email_sent');
+        }
+        return $result;
+    }
+
+    /**
+     * Return payment info block as html
+     *
+     * @param Order $order
+     * @return string
+     */
+    protected function getPaymentHtml(Order $order)
+    {
+        return $this->paymentHelper->getInfoBlockHtml(
+            $order->getPayment(),
+            $this->identityContainer->getStore()->getStoreId()
+        );
+    }
+}
diff --git a/app/code/Magento/Sales/Model/Order/Email/Sender/InvoiceCommentSender.php b/app/code/Magento/Sales/Model/Order/Email/Sender/InvoiceCommentSender.php
new file mode 100644
index 0000000000000000000000000000000000000000..68b8db220778e32eeb318d4b099a185a1db556b4
--- /dev/null
+++ b/app/code/Magento/Sales/Model/Order/Email/Sender/InvoiceCommentSender.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\Sales\Model\Order\Email\Sender;
+
+use Magento\Sales\Model\Order\Email\NotifySender;
+use Magento\Sales\Model\Order;
+use Magento\Sales\Model\Order\Invoice;
+use Magento\Sales\Model\Order\Email\Container\Template;
+use Magento\Sales\Model\Order\Email\Container\InvoiceCommentIdentity;
+
+class InvoiceCommentSender extends NotifySender
+{
+    /**
+     * @param Template $templateContainer
+     * @param InvoiceCommentIdentity $identityContainer
+     * @param Order\Email\SenderBuilderFactory $senderBuilderFactory
+     */
+    public function __construct(
+        Template $templateContainer,
+        InvoiceCommentIdentity $identityContainer,
+        \Magento\Sales\Model\Order\Email\SenderBuilderFactory $senderBuilderFactory
+    ) {
+        parent::__construct($templateContainer, $identityContainer, $senderBuilderFactory);
+    }
+
+    /**
+     * Send email to customer
+     *
+     * @param Invoice $invoice
+     * @param bool $notify
+     * @param string $comment
+     * @return bool
+     */
+    public function send(Invoice $invoice, $notify = true, $comment = '')
+    {
+        $order = $invoice->getOrder();
+        $this->templateContainer->setTemplateVars(
+            [
+                'order' => $order,
+                'invoice' => $invoice,
+                'comment' => $comment,
+                'billing' => $order->getBillingAddress(),
+                'store' => $order->getStore()
+            ]
+        );
+        return $this->checkAndSend($order, $notify);
+    }
+}
diff --git a/app/code/Magento/Sales/Model/Order/Email/Sender/InvoiceSender.php b/app/code/Magento/Sales/Model/Order/Email/Sender/InvoiceSender.php
new file mode 100644
index 0000000000000000000000000000000000000000..f1591bd0a01e4001c6d941b9da9f1d92722e2c9d
--- /dev/null
+++ b/app/code/Magento/Sales/Model/Order/Email/Sender/InvoiceSender.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\Sales\Model\Order\Email\Sender;
+
+use Magento\Sales\Model\Order\Email\NotifySender;
+use Magento\Sales\Model\Order;
+use Magento\Sales\Model\Order\Invoice;
+use Magento\Sales\Model\Order\Email\Container\Template;
+use Magento\Sales\Model\Order\Email\Container\InvoiceIdentity;
+use Magento\Payment\Helper\Data as PaymentHelper;
+use Magento\Sales\Model\Resource\Order\Invoice as InvoiceResource;
+
+class InvoiceSender extends NotifySender
+{
+    /**
+     * @var PaymentHelper
+     */
+    protected $paymentHelper;
+
+    /**
+     * @var InvoiceResource
+     */
+    protected $invoiceResource;
+
+    /**
+     * @param Template $templateContainer
+     * @param InvoiceIdentity $identityContainer
+     * @param Order\Email\SenderBuilderFactory $senderBuilderFactory
+     * @param PaymentHelper $paymentHelper
+     * @param InvoiceResource $invoiceResource
+     */
+    public function __construct(
+        Template $templateContainer,
+        InvoiceIdentity $identityContainer,
+        \Magento\Sales\Model\Order\Email\SenderBuilderFactory $senderBuilderFactory,
+        PaymentHelper $paymentHelper,
+        InvoiceResource $invoiceResource
+    ) {
+        parent::__construct($templateContainer, $identityContainer, $senderBuilderFactory);
+        $this->paymentHelper = $paymentHelper;
+        $this->invoiceResource = $invoiceResource;
+    }
+
+    /**
+     * Send email to customer
+     *
+     * @param Invoice $invoice
+     * @param bool $notify
+     * @param string $comment
+     * @return bool
+     */
+    public function send(Invoice $invoice, $notify = true, $comment = '')
+    {
+        $order = $invoice->getOrder();
+        $this->templateContainer->setTemplateVars(
+            [
+                'order' => $order,
+                'invoice' => $invoice,
+                'comment' => $comment,
+                'billing' => $order->getBillingAddress(),
+                'payment_html' => $this->getPaymentHtml($order),
+                'store' => $order->getStore()
+            ]
+        );
+        $result = $this->checkAndSend($order, $notify);
+        if ($result) {
+            $invoice->setEmailSent(true);
+            $this->invoiceResource->saveAttribute($invoice, 'email_sent');
+        }
+        return $result;
+    }
+
+    /**
+     * Return payment info block as html
+     *
+     * @param Order $order
+     * @return string
+     */
+    protected function getPaymentHtml(Order $order)
+    {
+        return $this->paymentHelper->getInfoBlockHtml(
+            $order->getPayment(),
+            $this->identityContainer->getStore()->getStoreId()
+        );
+    }
+}
diff --git a/app/code/Magento/Sales/Model/Order/Email/Sender/OrderCommentSender.php b/app/code/Magento/Sales/Model/Order/Email/Sender/OrderCommentSender.php
new file mode 100644
index 0000000000000000000000000000000000000000..652108565973461bfcb94ffcda921c6558ac0757
--- /dev/null
+++ b/app/code/Magento/Sales/Model/Order/Email/Sender/OrderCommentSender.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\Sales\Model\Order\Email\Sender;
+
+use Magento\Sales\Model\Order\Email\NotifySender;
+use Magento\Sales\Model\Order;
+use Magento\Sales\Model\Order\Email\Container\Template;
+use Magento\Sales\Model\Order\Email\Container\OrderCommentIdentity;
+
+class OrderCommentSender extends NotifySender
+{
+    /**
+     * @param Template $templateContainer
+     * @param OrderCommentIdentity $identityContainer
+     * @param Order\Email\SenderBuilderFactory $senderBuilderFactory
+     */
+    public function __construct(
+        Template $templateContainer,
+        OrderCommentIdentity $identityContainer,
+        \Magento\Sales\Model\Order\Email\SenderBuilderFactory $senderBuilderFactory
+    ) {
+        parent::__construct($templateContainer, $identityContainer, $senderBuilderFactory);
+    }
+
+    /**
+     * Send email to customer
+     *
+     * @param Order $order
+     * @param bool $notify
+     * @param string $comment
+     * @return bool
+     */
+    public function send(Order $order, $notify = true, $comment = '')
+    {
+        $this->templateContainer->setTemplateVars(
+            [
+                'order' => $order,
+                'comment' => $comment,
+                'billing' => $order->getBillingAddress(),
+                'store' => $order->getStore()
+            ]
+        );
+        return $this->checkAndSend($order, $notify);
+    }
+}
diff --git a/app/code/Magento/Sales/Model/Order/Email/Sender/OrderSender.php b/app/code/Magento/Sales/Model/Order/Email/Sender/OrderSender.php
new file mode 100644
index 0000000000000000000000000000000000000000..1e413a3a1ddaf499ffd8a2d25ef3ef5b163aec41
--- /dev/null
+++ b/app/code/Magento/Sales/Model/Order/Email/Sender/OrderSender.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\Sales\Model\Order\Email\Sender;
+
+use Magento\Sales\Model\Order\Email\Sender;
+use Magento\Sales\Model\Order;
+use Magento\Sales\Model\Resource\Order as OrderResource;
+use Magento\Payment\Helper\Data as PaymentHelper;
+use Magento\Sales\Model\Order\Email\Container\Template;
+use Magento\Sales\Model\Order\Email\Container\OrderIdentity;
+
+class OrderSender extends Sender
+{
+    /**
+     * @var PaymentHelper
+     */
+    protected $paymentHelper;
+
+    /**
+     * @var OrderResource
+     */
+    protected $orderResource;
+
+    /**
+     * @param Template $templateContainer
+     * @param OrderIdentity $identityContainer
+     * @param Order\Email\SenderBuilderFactory $senderBuilderFactory
+     * @param PaymentHelper $paymentHelper
+     * @param OrderResource $orderResource
+     */
+    public function __construct(
+        Template $templateContainer,
+        OrderIdentity $identityContainer,
+        \Magento\Sales\Model\Order\Email\SenderBuilderFactory $senderBuilderFactory,
+        PaymentHelper $paymentHelper,
+        OrderResource $orderResource
+    ) {
+        parent::__construct($templateContainer, $identityContainer, $senderBuilderFactory);
+        $this->paymentHelper = $paymentHelper;
+        $this->orderResource = $orderResource;
+    }
+
+    /**
+     * Send email to customer
+     *
+     * @param Order $order
+     * @return bool
+     */
+    public function send(Order $order)
+    {
+        $result = $this->checkAndSend($order);
+        if ($result) {
+            $order->setEmailSent(true);
+            $this->orderResource->saveAttribute($order, 'email_sent');
+        }
+        return $result;
+    }
+
+    /**
+     * Prepare email template with variables
+     *
+     * @param Order $order
+     * @return void
+     */
+    protected function prepareTemplate(Order $order)
+    {
+        $this->templateContainer->setTemplateVars(
+            [
+                'order' => $order,
+                'billing' => $order->getBillingAddress(),
+                'payment_html' => $this->getPaymentHtml($order),
+                'store' => $order->getStore()
+            ]
+        );
+        parent::prepareTemplate($order);
+    }
+
+    /**
+     * Get payment info block as html
+     *
+     * @param Order $order
+     * @return string
+     */
+    protected function getPaymentHtml(Order $order)
+    {
+        return $this->paymentHelper->getInfoBlockHtml(
+            $order->getPayment(),
+            $this->identityContainer->getStore()->getStoreId()
+        );
+    }
+}
diff --git a/app/code/Magento/Sales/Model/Order/Email/Sender/ShipmentCommentSender.php b/app/code/Magento/Sales/Model/Order/Email/Sender/ShipmentCommentSender.php
new file mode 100644
index 0000000000000000000000000000000000000000..4409c9eee3ad9bcca3361a9be141c36c772316a6
--- /dev/null
+++ b/app/code/Magento/Sales/Model/Order/Email/Sender/ShipmentCommentSender.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\Sales\Model\Order\Email\Sender;
+
+use Magento\Sales\Model\Order\Email\NotifySender;
+use Magento\Sales\Model\Order;
+use Magento\Sales\Model\Order\Shipment;
+use Magento\Sales\Model\Order\Email\Container\ShipmentCommentIdentity;
+use Magento\Sales\Model\Order\Email\Container\Template;
+
+class ShipmentCommentSender extends NotifySender
+{
+    /**
+     * @param Template $templateContainer
+     * @param ShipmentCommentIdentity $identityContainer
+     * @param Order\Email\SenderBuilderFactory $senderBuilderFactory
+     */
+    public function __construct(
+        Template $templateContainer,
+        ShipmentCommentIdentity $identityContainer,
+        \Magento\Sales\Model\Order\Email\SenderBuilderFactory $senderBuilderFactory
+    ) {
+        parent::__construct($templateContainer, $identityContainer, $senderBuilderFactory);
+    }
+
+    /**
+     * Send email to customer
+     *
+     * @param Shipment $shipment
+     * @param bool $notify
+     * @param string $comment
+     * @return bool
+     */
+    public function send(Shipment $shipment, $notify = true, $comment = '')
+    {
+        $order = $shipment->getOrder();
+        $this->templateContainer->setTemplateVars(
+            [
+                'order' => $order,
+                'shipment' => $shipment,
+                'comment' => $comment,
+                'billing' => $order->getBillingAddress(),
+                'store' => $order->getStore()
+            ]
+        );
+        return $this->checkAndSend($order, $notify);
+    }
+}
diff --git a/app/code/Magento/Sales/Model/Order/Email/Sender/ShipmentSender.php b/app/code/Magento/Sales/Model/Order/Email/Sender/ShipmentSender.php
new file mode 100644
index 0000000000000000000000000000000000000000..1b8380bef9715b47f029d458aadb73f89019bdd5
--- /dev/null
+++ b/app/code/Magento/Sales/Model/Order/Email/Sender/ShipmentSender.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\Sales\Model\Order\Email\Sender;
+
+use Magento\Sales\Model\Order\Email\NotifySender;
+use Magento\Sales\Model\Order;
+use Magento\Sales\Model\Order\Shipment;
+use Magento\Sales\Model\Order\Email\Container\Template;
+use Magento\Sales\Model\Order\Email\Container\ShipmentIdentity;
+use Magento\Payment\Helper\Data as PaymentHelper;
+use Magento\Sales\Model\Resource\Order\Shipment as ShipmentResource;
+
+class ShipmentSender extends NotifySender
+{
+    /**
+     * @var PaymentHelper
+     */
+    protected $paymentHelper;
+
+    /**
+     * @var ShipmentResource
+     */
+    protected $shipmentResource;
+
+    /**
+     * @param Template $templateContainer
+     * @param ShipmentIdentity $identityContainer
+     * @param Order\Email\SenderBuilderFactory $senderBuilderFactory
+     * @param PaymentHelper $paymentHelper
+     * @param ShipmentResource $shipmentResource
+     */
+    public function __construct(
+        Template $templateContainer,
+        ShipmentIdentity $identityContainer,
+        \Magento\Sales\Model\Order\Email\SenderBuilderFactory $senderBuilderFactory,
+        PaymentHelper $paymentHelper,
+        ShipmentResource $shipmentResource
+    ) {
+        parent::__construct($templateContainer, $identityContainer, $senderBuilderFactory);
+        $this->paymentHelper = $paymentHelper;
+        $this->shipmentResource = $shipmentResource;
+    }
+
+    /**
+     * Send email to customer
+     *
+     * @param Shipment $shipment
+     * @param bool $notify
+     * @param string $comment
+     * @return bool
+     */
+    public function send(Shipment $shipment, $notify = true, $comment = '')
+    {
+        $order = $shipment->getOrder();
+        $this->templateContainer->setTemplateVars(
+            [
+                'order' => $order,
+                'shipment' => $shipment,
+                'comment' => $comment,
+                'billing' => $order->getBillingAddress(),
+                'payment_html' => $this->getPaymentHtml($order),
+                'store' => $order->getStore()
+            ]
+        );
+        $result = $this->checkAndSend($order, $notify);
+        if ($result) {
+            $shipment->setEmailSent(true);
+            $this->shipmentResource->saveAttribute($shipment, 'email_sent');
+        }
+        return $result;
+    }
+
+    /**
+     * Get payment info block as html
+     *
+     * @param Order $order
+     * @return string
+     */
+    protected function getPaymentHtml(Order $order)
+    {
+        return $this->paymentHelper->getInfoBlockHtml(
+            $order->getPayment(),
+            $this->identityContainer->getStore()->getStoreId()
+        );
+    }
+}
diff --git a/app/code/Magento/Sales/Model/Order/Email/SenderBuilder.php b/app/code/Magento/Sales/Model/Order/Email/SenderBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..68b02e0d0e53000dd5a0ad02efb0fe54a0bbeb86
--- /dev/null
+++ b/app/code/Magento/Sales/Model/Order/Email/SenderBuilder.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\Sales\Model\Order\Email;
+
+use Magento\Sales\Model\Order;
+use Magento\Framework\Mail\Template\TransportBuilder;
+use Magento\Sales\Model\Order\Email\Container\Template;
+use Magento\Sales\Model\Order\Email\Container\IdentityInterface;
+
+class SenderBuilder
+{
+    /**
+     * @var Template
+     */
+    protected $templateContainer;
+
+    /**
+     * @var IdentityInterface
+     */
+    protected $identityContainer;
+
+    /**
+     * @var TransportBuilder
+     */
+    protected $transportBuilder;
+
+    /**
+     * @param Template $templateContainer
+     * @param IdentityInterface $identityContainer
+     * @param TransportBuilder $transportBuilder
+     */
+    public function __construct(
+        Template $templateContainer,
+        IdentityInterface $identityContainer,
+        TransportBuilder $transportBuilder
+    ) {
+        $this->templateContainer = $templateContainer;
+        $this->identityContainer = $identityContainer;
+        $this->transportBuilder = $transportBuilder;
+    }
+
+    /**
+     * Prepare and send email message
+     *
+     * @return void
+     */
+    public function send()
+    {
+        $this->configureEmailTemplate();
+
+        $this->transportBuilder->addTo(
+            $this->identityContainer->getCustomerEmail(),
+            $this->identityContainer->getCustomerName()
+        );
+
+        $copyTo = $this->identityContainer->getEmailCopyTo();
+
+        if (!empty($copyTo) && $this->identityContainer->getCopyMethod() == 'bcc') {
+            foreach ($copyTo as $email) {
+                $this->transportBuilder->addBcc($email);
+            }
+        }
+
+        $transport = $this->transportBuilder->getTransport();
+        $transport->sendMessage();
+    }
+
+    /**
+     * Prepare and send copy email message
+     *
+     * @return void
+     */
+    public function sendCopyTo()
+    {
+        $copyTo = $this->identityContainer->getEmailCopyTo();
+
+        if (!empty($copyTo) && $this->identityContainer->getCopyMethod() == 'copy') {
+            foreach ($copyTo as $email) {
+                $this->configureEmailTemplate();
+
+                $this->transportBuilder->addTo($email);
+
+                $transport = $this->transportBuilder->getTransport();
+                $transport->sendMessage();
+            }
+        }
+    }
+
+    /**
+     * Configure email template
+     *
+     * @return void
+     */
+    protected function configureEmailTemplate()
+    {
+        $this->transportBuilder->setTemplateIdentifier($this->templateContainer->getTemplateId());
+        $this->transportBuilder->setTemplateOptions($this->templateContainer->getTemplateOptions());
+        $this->transportBuilder->setTemplateVars($this->templateContainer->getTemplateVars());
+        $this->transportBuilder->setFrom($this->identityContainer->getEmailIdentity());
+    }
+}
diff --git a/app/code/Magento/Sales/Model/Order/Invoice.php b/app/code/Magento/Sales/Model/Order/Invoice.php
index 5bdbc6842e50ada163b327a215a6ebc20a62a609..f337c6130413f21848152be5b932817d77fe3503 100644
--- a/app/code/Magento/Sales/Model/Order/Invoice.php
+++ b/app/code/Magento/Sales/Model/Order/Invoice.php
@@ -126,30 +126,6 @@ class Invoice extends \Magento\Sales\Model\AbstractModel
 
     const NOT_CAPTURE = 'not_capture';
 
-    const XML_PATH_EMAIL_TEMPLATE = 'sales_email/invoice/template';
-
-    const XML_PATH_EMAIL_GUEST_TEMPLATE = 'sales_email/invoice/guest_template';
-
-    const XML_PATH_EMAIL_IDENTITY = 'sales_email/invoice/identity';
-
-    const XML_PATH_EMAIL_COPY_TO = 'sales_email/invoice/copy_to';
-
-    const XML_PATH_EMAIL_COPY_METHOD = 'sales_email/invoice/copy_method';
-
-    const XML_PATH_EMAIL_ENABLED = 'sales_email/invoice/enabled';
-
-    const XML_PATH_UPDATE_EMAIL_TEMPLATE = 'sales_email/invoice_comment/template';
-
-    const XML_PATH_UPDATE_EMAIL_GUEST_TEMPLATE = 'sales_email/invoice_comment/guest_template';
-
-    const XML_PATH_UPDATE_EMAIL_IDENTITY = 'sales_email/invoice_comment/identity';
-
-    const XML_PATH_UPDATE_EMAIL_COPY_TO = 'sales_email/invoice_comment/copy_to';
-
-    const XML_PATH_UPDATE_EMAIL_COPY_METHOD = 'sales_email/invoice_comment/copy_method';
-
-    const XML_PATH_UPDATE_EMAIL_ENABLED = 'sales_email/invoice_comment/enabled';
-
     const REPORT_DATE_TYPE_ORDER_CREATED = 'order_created';
 
     const REPORT_DATE_TYPE_INVOICE_CREATED = 'invoice_created';
@@ -208,27 +184,6 @@ class Invoice extends \Magento\Sales\Model\AbstractModel
      */
     protected $_wasPayCalled = false;
 
-    /**
-     * Sales data
-     *
-     * @var \Magento\Sales\Helper\Data
-     */
-    protected $_salesData;
-
-    /**
-     * Payment data
-     *
-     * @var \Magento\Payment\Helper\Data
-     */
-    protected $_paymentData;
-
-    /**
-     * Core store config
-     *
-     * @var \Magento\Framework\App\Config\ScopeConfigInterface
-     */
-    protected $_scopeConfig;
-
     /**
      * @var \Magento\Sales\Model\Order\Invoice\Config
      */
@@ -264,19 +219,11 @@ class Invoice extends \Magento\Sales\Model\AbstractModel
      */
     protected $_commentCollectionFactory;
 
-    /**
-     * @var \Magento\Framework\Mail\Template\TransportBuilder
-     */
-    protected $_transportBuilder;
-
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
      * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
      * @param \Magento\Framework\Stdlib\DateTime $dateTime
-     * @param \Magento\Payment\Helper\Data $paymentData
-     * @param \Magento\Sales\Helper\Data $salesData
-     * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
      * @param Invoice\Config $invoiceConfig
      * @param \Magento\Sales\Model\OrderFactory $orderFactory
      * @param \Magento\Sales\Model\Resource\OrderFactory $orderResourceFactory
@@ -284,7 +231,6 @@ class Invoice extends \Magento\Sales\Model\AbstractModel
      * @param \Magento\Sales\Model\Resource\Order\Invoice\Item\CollectionFactory $invoiceItemCollectionFactory
      * @param Invoice\CommentFactory $invoiceCommentFactory
      * @param \Magento\Sales\Model\Resource\Order\Invoice\Comment\CollectionFactory $commentCollectionFactory
-     * @param \Magento\Framework\Mail\Template\TransportBuilder $transportBuilder
      * @param \Magento\Framework\Model\Resource\AbstractResource $resource
      * @param \Magento\Framework\Data\Collection\Db $resourceCollection
      * @param array $data
@@ -294,9 +240,6 @@ class Invoice extends \Magento\Sales\Model\AbstractModel
         \Magento\Framework\Registry $registry,
         \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
         \Magento\Framework\Stdlib\DateTime $dateTime,
-        \Magento\Payment\Helper\Data $paymentData,
-        \Magento\Sales\Helper\Data $salesData,
-        \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
         \Magento\Sales\Model\Order\Invoice\Config $invoiceConfig,
         \Magento\Sales\Model\OrderFactory $orderFactory,
         \Magento\Sales\Model\Resource\OrderFactory $orderResourceFactory,
@@ -304,14 +247,10 @@ class Invoice extends \Magento\Sales\Model\AbstractModel
         \Magento\Sales\Model\Resource\Order\Invoice\Item\CollectionFactory $invoiceItemCollectionFactory,
         \Magento\Sales\Model\Order\Invoice\CommentFactory $invoiceCommentFactory,
         \Magento\Sales\Model\Resource\Order\Invoice\Comment\CollectionFactory $commentCollectionFactory,
-        \Magento\Framework\Mail\Template\TransportBuilder $transportBuilder,
         \Magento\Framework\Model\Resource\AbstractResource $resource = null,
         \Magento\Framework\Data\Collection\Db $resourceCollection = null,
         array $data = array()
     ) {
-        $this->_paymentData = $paymentData;
-        $this->_salesData = $salesData;
-        $this->_scopeConfig = $scopeConfig;
         $this->_invoiceConfig = $invoiceConfig;
         $this->_orderFactory = $orderFactory;
         $this->_orderResourceFactory = $orderResourceFactory;
@@ -319,7 +258,6 @@ class Invoice extends \Magento\Sales\Model\AbstractModel
         $this->_invoiceItemCollectionFactory = $invoiceItemCollectionFactory;
         $this->_invoiceCommentFactory = $invoiceCommentFactory;
         $this->_commentCollectionFactory = $commentCollectionFactory;
-        $this->_transportBuilder = $transportBuilder;
         parent::__construct($context, $registry, $localeDate, $dateTime, $resource, $resourceCollection, $data);
     }
 
@@ -874,254 +812,6 @@ class Invoice extends \Magento\Sales\Model\AbstractModel
         return $this->_comments;
     }
 
-    /**
-     * Send email with invoice data
-     *
-     * @param bool $notifyCustomer
-     * @param string $comment
-     * @return $this
-     */
-    public function sendEmail($notifyCustomer = true, $comment = '')
-    {
-        $order = $this->getOrder();
-        $storeId = $order->getStore()->getId();
-
-        if (!$this->_salesData->canSendNewInvoiceEmail($storeId)) {
-            return $this;
-        }
-        // Get the destination email addresses to send copies to
-        $copyTo = $this->_getEmails(self::XML_PATH_EMAIL_COPY_TO);
-        $copyMethod = $this->_scopeConfig->getValue(
-            self::XML_PATH_EMAIL_COPY_METHOD,
-            \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-            $storeId
-        );
-        // Check if at least one recipient is found
-        if (!$notifyCustomer && !$copyTo) {
-            return $this;
-        }
-
-        $paymentBlockHtml = $this->_paymentData->getInfoBlockHtml($order->getPayment(), $storeId);
-
-        // Retrieve corresponding email template id and customer name
-        if ($order->getCustomerIsGuest()) {
-            $templateId = $this->_scopeConfig->getValue(
-                self::XML_PATH_EMAIL_GUEST_TEMPLATE,
-                \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                $storeId
-            );
-            $customerName = $order->getBillingAddress()->getName();
-        } else {
-            $templateId = $this->_scopeConfig->getValue(
-                self::XML_PATH_EMAIL_TEMPLATE,
-                \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                $storeId
-            );
-            $customerName = $order->getCustomerName();
-        }
-
-        if ($notifyCustomer) {
-            $this->_transportBuilder->setTemplateIdentifier(
-                $templateId
-            )->setTemplateOptions(
-                array('area' => \Magento\Framework\App\Area::AREA_FRONTEND, 'store' => $storeId)
-            )->setTemplateVars(
-                array(
-                    'order' => $order,
-                    'invoice' => $this,
-                    'comment' => $comment,
-                    'billing' => $order->getBillingAddress(),
-                    'payment_html' => $paymentBlockHtml,
-                    'store' => $this->getStore()
-                )
-            )->setFrom(
-                $this->_scopeConfig->getValue(
-                    self::XML_PATH_EMAIL_IDENTITY,
-                    \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                    $storeId
-                )
-            )->addTo(
-                $order->getCustomerEmail(),
-                $customerName
-            );
-            if ($copyTo && $copyMethod == 'bcc') {
-                // Add bcc to customer email
-                foreach ($copyTo as $email) {
-                    $this->_transportBuilder->addBcc($email);
-                }
-            }
-            /** @var \Magento\Framework\Mail\TransportInterface $transport */
-            $transport = $this->_transportBuilder->getTransport();
-            $transport->sendMessage();
-        }
-
-        // Email copies are sent as separated emails if their copy method is 'copy' or a customer should not be notified
-        if ($copyTo && ($copyMethod == 'copy' || !$notifyCustomer)) {
-            foreach ($copyTo as $email) {
-                $this->_transportBuilder->setTemplateIdentifier(
-                    $templateId
-                )->setTemplateOptions(
-                    array('area' => \Magento\Framework\App\Area::AREA_FRONTEND, 'store' => $storeId)
-                )->setTemplateVars(
-                    array(
-                        'order' => $order,
-                        'invoice' => $this,
-                        'comment' => $comment,
-                        'billing' => $order->getBillingAddress(),
-                        'payment_html' => $paymentBlockHtml,
-                        'store' => $this->getStore()
-                    )
-                )->setFrom(
-                    $this->_scopeConfig->getValue(
-                        self::XML_PATH_EMAIL_IDENTITY,
-                        \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                        $storeId
-                    )
-                )->addTo(
-                    $email
-                )->getTransport()->sendMessage();
-            }
-        }
-
-        $this->setEmailSent(true);
-        $this->_getResource()->saveAttribute($this, 'email_sent');
-
-        return $this;
-    }
-
-    /**
-     * Send email with invoice update information
-     *
-     * @param boolean $notifyCustomer
-     * @param string $comment
-     * @return $this
-     */
-    public function sendUpdateEmail($notifyCustomer = true, $comment = '')
-    {
-        $order = $this->getOrder();
-        $storeId = $order->getStore()->getId();
-
-        if (!$this->_salesData->canSendInvoiceCommentEmail($storeId)) {
-            return $this;
-        }
-        // Get the destination email addresses to send copies to
-        $copyTo = $this->_getEmails(self::XML_PATH_UPDATE_EMAIL_COPY_TO);
-        $copyMethod = $this->_scopeConfig->getValue(
-            self::XML_PATH_UPDATE_EMAIL_COPY_METHOD,
-            \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-            $storeId
-        );
-        // Check if at least one recipient is found
-        if (!$notifyCustomer && !$copyTo) {
-            return $this;
-        }
-
-        // Retrieve corresponding email template id and customer name
-        if ($order->getCustomerIsGuest()) {
-            $templateId = $this->_scopeConfig->getValue(
-                self::XML_PATH_UPDATE_EMAIL_GUEST_TEMPLATE,
-                \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                $storeId
-            );
-            $customerName = $order->getBillingAddress()->getName();
-        } else {
-            $templateId = $this->_scopeConfig->getValue(
-                self::XML_PATH_UPDATE_EMAIL_TEMPLATE,
-                \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                $storeId
-            );
-            $customerName = $order->getCustomerName();
-        }
-
-        if ($notifyCustomer) {
-            $this->_transportBuilder->setTemplateIdentifier(
-                $templateId
-            )->setTemplateOptions(
-                array('area' => \Magento\Framework\App\Area::AREA_FRONTEND, 'store' => $storeId)
-            )->setTemplateVars(
-                array(
-                    'order' => $order,
-                    'invoice' => $this,
-                    'comment' => $comment,
-                    'billing' => $order->getBillingAddress(),
-                    'store' => $this->getStore()
-                )
-            )->setFrom(
-                $this->_scopeConfig->getValue(
-                    self::XML_PATH_UPDATE_EMAIL_IDENTITY,
-                    \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                    $storeId
-                )
-            )->addTo(
-                $order->getCustomerEmail(),
-                $customerName
-            );
-            if ($copyTo && $copyMethod == 'bcc') {
-                // Add bcc to customer email
-                foreach ($copyTo as $email) {
-                    $this->_transportBuilder->addBcc($email);
-                }
-            }
-            /** @var \Magento\Framework\Mail\TransportInterface $transport */
-            $transport = $this->_transportBuilder->getTransport();
-            $transport->sendMessage();
-        }
-
-        // Email copies are sent as separated emails if their copy method is 'copy' or a customer should not be notified
-        if ($copyTo && ($copyMethod == 'copy' || !$notifyCustomer)) {
-            foreach ($copyTo as $email) {
-                $this->_transportBuilder->setTemplateIdentifier(
-                    $templateId
-                )->setTemplateOptions(
-                    array('area' => \Magento\Framework\App\Area::AREA_FRONTEND, 'store' => $storeId)
-                )->setTemplateVars(
-                    array(
-                        'order' => $order,
-                        'invoice' => $this,
-                        'comment' => $comment,
-                        'billing' => $order->getBillingAddress(),
-                        'store' => $this->getStore()
-                    )
-                )->setFrom(
-                    $this->_scopeConfig->getValue(
-                        self::XML_PATH_UPDATE_EMAIL_IDENTITY,
-                        \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                        $storeId
-                    )
-                )->addTo(
-                    $email
-                )->getTransport()->sendMessage();
-            }
-        }
-
-        return $this;
-    }
-
-    /**
-     * @param string $configPath
-     * @return array|bool
-     */
-    protected function _getEmails($configPath)
-    {
-        $data = $this->_scopeConfig->getValue(
-            $configPath,
-            \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-            $this->getStoreId()
-        );
-        if (!empty($data)) {
-            return explode(',', $data);
-        }
-        return false;
-    }
-
-    /**
-     * @return \Magento\Framework\Model\AbstractModel
-     */
-    protected function _beforeDelete()
-    {
-        return parent::_beforeDelete();
-    }
-
     /**
      * Reset invoice object
      *
diff --git a/app/code/Magento/Sales/Model/Order/Shipment.php b/app/code/Magento/Sales/Model/Order/Shipment.php
index eb55571b54c5e72ad2bd3c461f14eec7f448a9fd..a4f64eed4dd78ffcebf4ba1d99ed41e81dd97d76 100644
--- a/app/code/Magento/Sales/Model/Order/Shipment.php
+++ b/app/code/Magento/Sales/Model/Order/Shipment.php
@@ -57,30 +57,6 @@ class Shipment extends \Magento\Sales\Model\AbstractModel
 {
     const STATUS_NEW = 1;
 
-    const XML_PATH_EMAIL_TEMPLATE = 'sales_email/shipment/template';
-
-    const XML_PATH_EMAIL_GUEST_TEMPLATE = 'sales_email/shipment/guest_template';
-
-    const XML_PATH_EMAIL_IDENTITY = 'sales_email/shipment/identity';
-
-    const XML_PATH_EMAIL_COPY_TO = 'sales_email/shipment/copy_to';
-
-    const XML_PATH_EMAIL_COPY_METHOD = 'sales_email/shipment/copy_method';
-
-    const XML_PATH_EMAIL_ENABLED = 'sales_email/shipment/enabled';
-
-    const XML_PATH_UPDATE_EMAIL_TEMPLATE = 'sales_email/shipment_comment/template';
-
-    const XML_PATH_UPDATE_EMAIL_GUEST_TEMPLATE = 'sales_email/shipment_comment/guest_template';
-
-    const XML_PATH_UPDATE_EMAIL_IDENTITY = 'sales_email/shipment_comment/identity';
-
-    const XML_PATH_UPDATE_EMAIL_COPY_TO = 'sales_email/shipment_comment/copy_to';
-
-    const XML_PATH_UPDATE_EMAIL_COPY_METHOD = 'sales_email/shipment_comment/copy_method';
-
-    const XML_PATH_UPDATE_EMAIL_ENABLED = 'sales_email/shipment_comment/enabled';
-
     const REPORT_DATE_TYPE_ORDER_CREATED = 'order_created';
 
     const REPORT_DATE_TYPE_SHIPMENT_CREATED = 'shipment_created';
@@ -135,27 +111,6 @@ class Shipment extends \Magento\Sales\Model\AbstractModel
      */
     protected $_eventObject = 'shipment';
 
-    /**
-     * Sales data
-     *
-     * @var \Magento\Sales\Helper\Data
-     */
-    protected $_salesData;
-
-    /**
-     * Payment data
-     *
-     * @var \Magento\Payment\Helper\Data
-     */
-    protected $_paymentData;
-
-    /**
-     * Core store config
-     *
-     * @var \Magento\Framework\App\Config\ScopeConfigInterface
-     */
-    protected $_scopeConfig;
-
     /**
      * @var \Magento\Sales\Model\OrderFactory
      */
@@ -181,25 +136,16 @@ class Shipment extends \Magento\Sales\Model\AbstractModel
      */
     protected $_commentCollectionFactory;
 
-    /**
-     * @var \Magento\Framework\Mail\Template\TransportBuilder
-     */
-    protected $_transportBuilder;
-
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
      * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
      * @param \Magento\Framework\Stdlib\DateTime $dateTime
-     * @param \Magento\Payment\Helper\Data $paymentData
-     * @param \Magento\Sales\Helper\Data $salesData
-     * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
      * @param \Magento\Sales\Model\OrderFactory $orderFactory
      * @param \Magento\Sales\Model\Resource\Order\Shipment\Item\CollectionFactory $shipmentItemCollectionFactory
      * @param \Magento\Sales\Model\Resource\Order\Shipment\Track\CollectionFactory $trackCollectionFactory
      * @param Shipment\CommentFactory $commentFactory
      * @param \Magento\Sales\Model\Resource\Order\Shipment\Comment\CollectionFactory $commentCollectionFactory
-     * @param \Magento\Framework\Mail\Template\TransportBuilder $transportBuilder
      * @param \Magento\Framework\Model\Resource\AbstractResource $resource
      * @param \Magento\Framework\Data\Collection\Db $resourceCollection
      * @param array $data
@@ -209,28 +155,20 @@ class Shipment extends \Magento\Sales\Model\AbstractModel
         \Magento\Framework\Registry $registry,
         \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
         \Magento\Framework\Stdlib\DateTime $dateTime,
-        \Magento\Payment\Helper\Data $paymentData,
-        \Magento\Sales\Helper\Data $salesData,
-        \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
         \Magento\Sales\Model\OrderFactory $orderFactory,
         \Magento\Sales\Model\Resource\Order\Shipment\Item\CollectionFactory $shipmentItemCollectionFactory,
         \Magento\Sales\Model\Resource\Order\Shipment\Track\CollectionFactory $trackCollectionFactory,
         \Magento\Sales\Model\Order\Shipment\CommentFactory $commentFactory,
         \Magento\Sales\Model\Resource\Order\Shipment\Comment\CollectionFactory $commentCollectionFactory,
-        \Magento\Framework\Mail\Template\TransportBuilder $transportBuilder,
         \Magento\Framework\Model\Resource\AbstractResource $resource = null,
         \Magento\Framework\Data\Collection\Db $resourceCollection = null,
         array $data = array()
     ) {
-        $this->_paymentData = $paymentData;
-        $this->_salesData = $salesData;
-        $this->_scopeConfig = $scopeConfig;
         $this->_orderFactory = $orderFactory;
         $this->_shipmentItemCollectionFactory = $shipmentItemCollectionFactory;
         $this->_trackCollectionFactory = $trackCollectionFactory;
         $this->_commentFactory = $commentFactory;
         $this->_commentCollectionFactory = $commentCollectionFactory;
-        $this->_transportBuilder = $transportBuilder;
         parent::__construct($context, $registry, $localeDate, $dateTime, $resource, $resourceCollection, $data);
     }
 
@@ -536,246 +474,6 @@ class Shipment extends \Magento\Sales\Model\AbstractModel
         return $this->_comments;
     }
 
-    /**
-     * Send email with shipment data
-     *
-     * @param boolean $notifyCustomer
-     * @param string $comment
-     * @return $this
-     */
-    public function sendEmail($notifyCustomer = true, $comment = '')
-    {
-        $order = $this->getOrder();
-        $storeId = $order->getStore()->getId();
-
-        if (!$this->_salesData->canSendNewShipmentEmail($storeId)) {
-            return $this;
-        }
-        // Get the destination email addresses to send copies to
-        $copyTo = $this->_getEmails(self::XML_PATH_EMAIL_COPY_TO);
-        $copyMethod = $this->_scopeConfig->getValue(
-            self::XML_PATH_EMAIL_COPY_METHOD,
-            \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-            $storeId
-        );
-        // Check if at least one recipient is found
-        if (!$notifyCustomer && !$copyTo) {
-            return $this;
-        }
-
-        $paymentBlockHtml = $this->_paymentData->getInfoBlockHtml($order->getPayment(), $storeId);
-
-        // Retrieve corresponding email template id and customer name
-        if ($order->getCustomerIsGuest()) {
-            $templateId = $this->_scopeConfig->getValue(
-                self::XML_PATH_EMAIL_GUEST_TEMPLATE,
-                \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                $storeId
-            );
-            $customerName = $order->getBillingAddress()->getName();
-        } else {
-            $templateId = $this->_scopeConfig->getValue(
-                self::XML_PATH_EMAIL_TEMPLATE,
-                \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                $storeId
-            );
-            $customerName = $order->getCustomerName();
-        }
-
-        if ($notifyCustomer) {
-            $this->_transportBuilder->setTemplateIdentifier(
-                $templateId
-            )->setTemplateOptions(
-                array('area' => \Magento\Framework\App\Area::AREA_FRONTEND, 'store' => $storeId)
-            )->setTemplateVars(
-                array(
-                    'order' => $order,
-                    'shipment' => $this,
-                    'comment' => $comment,
-                    'billing' => $order->getBillingAddress(),
-                    'payment_html' => $paymentBlockHtml,
-                    'store' => $this->getStore()
-                )
-            )->setFrom(
-                $this->_scopeConfig->getValue(
-                    self::XML_PATH_EMAIL_IDENTITY,
-                    \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                    $storeId
-                )
-            )->addTo(
-                $order->getCustomerEmail(),
-                $customerName
-            );
-            if ($copyTo && $copyMethod == 'bcc') {
-                // Add bcc to customer email
-                foreach ($copyTo as $email) {
-                    $this->_transportBuilder->addBcc($email);
-                }
-            }
-            /** @var \Magento\Framework\Mail\TransportInterface $transport */
-            $transport = $this->_transportBuilder->getTransport();
-            $transport->sendMessage();
-        }
-
-        // Email copies are sent as separated emails if their copy method is 'copy' or a customer should not be notified
-        if ($copyTo && ($copyMethod == 'copy' || !$notifyCustomer)) {
-            foreach ($copyTo as $email) {
-                $this->_transportBuilder->setTemplateIdentifier(
-                    $templateId
-                )->setTemplateOptions(
-                    array('area' => \Magento\Framework\App\Area::AREA_FRONTEND, 'store' => $storeId)
-                )->setTemplateVars(
-                    array(
-                        'order' => $order,
-                        'shipment' => $this,
-                        'comment' => $comment,
-                        'billing' => $order->getBillingAddress(),
-                        'payment_html' => $paymentBlockHtml,
-                        'store' => $this->getStore()
-                    )
-                )->setFrom(
-                    $this->_scopeConfig->getValue(
-                        self::XML_PATH_EMAIL_IDENTITY,
-                        \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                        $storeId
-                    )
-                )->addTo(
-                    $email
-                )->getTransport()->sendMessage();
-            }
-        }
-
-        $this->setEmailSent(true);
-        $this->_getResource()->saveAttribute($this, 'email_sent');
-
-        return $this;
-    }
-
-    /**
-     * Send email with shipment update information
-     *
-     * @param boolean $notifyCustomer
-     * @param string $comment
-     * @return $this
-     */
-    public function sendUpdateEmail($notifyCustomer = true, $comment = '')
-    {
-        $order = $this->getOrder();
-        $storeId = $order->getStore()->getId();
-
-        if (!$this->_salesData->canSendShipmentCommentEmail($storeId)) {
-            return $this;
-        }
-        // Get the destination email addresses to send copies to
-        $copyTo = $this->_getEmails(self::XML_PATH_UPDATE_EMAIL_COPY_TO);
-        $copyMethod = $this->_scopeConfig->getValue(
-            self::XML_PATH_UPDATE_EMAIL_COPY_METHOD,
-            \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-            $storeId
-        );
-        // Check if at least one recipient is found
-        if (!$notifyCustomer && !$copyTo) {
-            return $this;
-        }
-
-        // Retrieve corresponding email template id and customer name
-        if ($order->getCustomerIsGuest()) {
-            $templateId = $this->_scopeConfig->getValue(
-                self::XML_PATH_UPDATE_EMAIL_GUEST_TEMPLATE,
-                \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                $storeId
-            );
-            $customerName = $order->getBillingAddress()->getName();
-        } else {
-            $templateId = $this->_scopeConfig->getValue(
-                self::XML_PATH_UPDATE_EMAIL_TEMPLATE,
-                \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                $storeId
-            );
-            $customerName = $order->getCustomerName();
-        }
-
-        if ($notifyCustomer) {
-            $this->_transportBuilder->setTemplateIdentifier(
-                $templateId
-            )->setTemplateOptions(
-                array('area' => \Magento\Framework\App\Area::AREA_FRONTEND, 'store' => $storeId)
-            )->setTemplateVars(
-                array(
-                    'order' => $order,
-                    'shipment' => $this,
-                    'comment' => $comment,
-                    'billing' => $order->getBillingAddress(),
-                    'store' => $this->getStore()
-                )
-            )->setFrom(
-                $this->_scopeConfig->getValue(
-                    self::XML_PATH_UPDATE_EMAIL_IDENTITY,
-                    \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                    $storeId
-                )
-            )->addTo(
-                $order->getCustomerEmail(),
-                $customerName
-            );
-            if ($copyTo && $copyMethod == 'bcc') {
-                // Add bcc to customer email
-                foreach ($copyTo as $email) {
-                    $this->_transportBuilder->addBcc($email);
-                }
-            }
-            /** @var \Magento\Framework\Mail\TransportInterface $transport */
-            $transport = $this->_transportBuilder->getTransport();
-            $transport->sendMessage();
-        }
-
-        // Email copies are sent as separated emails if their copy method is 'copy' or a customer should not be notified
-        if ($copyTo && ($copyMethod == 'copy' || !$notifyCustomer)) {
-            foreach ($copyTo as $email) {
-                $this->_transportBuilder->setTemplateIdentifier(
-                    $templateId
-                )->setTemplateOptions(
-                    array('area' => \Magento\Framework\App\Area::AREA_FRONTEND, 'store' => $storeId)
-                )->setTemplateVars(
-                    array(
-                        'order' => $order,
-                        'shipment' => $this,
-                        'comment' => $comment,
-                        'billing' => $order->getBillingAddress(),
-                        'store' => $this->getStore()
-                    )
-                )->setFrom(
-                    $this->_scopeConfig->getValue(
-                        self::XML_PATH_UPDATE_EMAIL_IDENTITY,
-                        \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-                        $storeId
-                    )
-                )->addTo(
-                    $email
-                )->getTransport()->sendMessage();
-            }
-        }
-
-        return $this;
-    }
-
-    /**
-     * @param string $configPath
-     * @return array|bool
-     */
-    protected function _getEmails($configPath)
-    {
-        $data = $this->_scopeConfig->getValue(
-            $configPath,
-            \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
-            $this->getStoreId()
-        );
-        if (!empty($data)) {
-            return explode(',', $data);
-        }
-        return false;
-    }
-
     /**
      * Before object save
      *
diff --git a/app/code/Magento/Sales/Model/Order/Status/History/Validator.php b/app/code/Magento/Sales/Model/Order/Status/History/Validator.php
new file mode 100644
index 0000000000000000000000000000000000000000..ab9e67851183512eb493d4befbcc5c5e79c8390d
--- /dev/null
+++ b/app/code/Magento/Sales/Model/Order/Status/History/Validator.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\Sales\Model\Order\Status\History;
+
+use Magento\Sales\Model\Order\Status\History;
+
+/**
+ * Class Validator
+ * @package Magento\Sales\Model\Order\Status\History
+ */
+class Validator
+{
+    /**
+     * @var array
+     */
+    protected $requiredFields = ['parent_id' => 'Order Id'];
+
+    /**
+     * @param History $history
+     * @return array
+     */
+    public function validate(History $history)
+    {
+        $warnings = [];
+        foreach ($this->requiredFields as $code => $label) {
+            if (!$history->hasData($code)) {
+                $warnings[] = sprintf('%s is a required field', $label);
+            }
+        }
+        return $warnings;
+    }
+}
diff --git a/app/code/Magento/Sales/Model/Quote/Address.php b/app/code/Magento/Sales/Model/Quote/Address.php
index a638c071f1df1d3c5f2f581c868b09f97bb97872..7759ac6c301cd873537f050df71ca9198ae0629c 100644
--- a/app/code/Magento/Sales/Model/Quote/Address.php
+++ b/app/code/Magento/Sales/Model/Quote/Address.php
@@ -250,6 +250,11 @@ class Address extends \Magento\Customer\Model\Address\AbstractAddress
      */
     protected $_customerAdressService;
 
+    /**
+     * @var Address\Validator
+     */
+    protected $validator;
+
     /**
      * @param \Magento\Framework\Model\Context $context
      * @param \Magento\Framework\Registry $registry
@@ -259,18 +264,19 @@ class Address extends \Magento\Customer\Model\Address\AbstractAddress
      * @param \Magento\Directory\Model\RegionFactory $regionFactory
      * @param \Magento\Directory\Model\CountryFactory $countryFactory
      * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
-     * @param \Magento\Sales\Model\Quote\Address\ItemFactory $addressItemFactory
+     * @param Address\ItemFactory $addressItemFactory
      * @param \Magento\Sales\Model\Resource\Quote\Address\Item\CollectionFactory $itemCollectionFactory
-     * @param \Magento\Sales\Model\Quote\Address\RateFactory $addressRateFactory
-     * @param \Magento\Sales\Model\Quote\Address\RateCollectorInterfaceFactory $rateCollector
+     * @param Address\RateFactory $addressRateFactory
+     * @param Address\RateCollectorInterfaceFactory $rateCollector
      * @param \Magento\Sales\Model\Resource\Quote\Address\Rate\CollectionFactory $rateCollectionFactory
-     * @param \Magento\Sales\Model\Quote\Address\RateRequestFactory $rateRequestFactory
-     * @param \Magento\Sales\Model\Quote\Address\Total\CollectorFactory $totalCollectorFactory
-     * @param \Magento\Sales\Model\Quote\Address\TotalFactory $addressTotalFactory
+     * @param Address\RateRequestFactory $rateRequestFactory
+     * @param Address\Total\CollectorFactory $totalCollectorFactory
+     * @param Address\TotalFactory $addressTotalFactory
      * @param \Magento\Framework\Object\Copy $objectCopyService
-     * @param \Magento\Sales\Model\Quote\Address\CarrierFactoryInterface $carrierFactory
+     * @param Address\CarrierFactoryInterface $carrierFactory
      * @param CustomerAddressBuilder $customerAddressBuilder
      * @param CustomerAddressServiceInterface $customerAddressService
+     * @param Address\Validator $validator
      * @param \Magento\Framework\Model\Resource\AbstractResource $resource
      * @param \Magento\Framework\Data\Collection\Db $resourceCollection
      * @param array $data
@@ -296,6 +302,7 @@ class Address extends \Magento\Customer\Model\Address\AbstractAddress
         \Magento\Sales\Model\Quote\Address\CarrierFactoryInterface $carrierFactory,
         CustomerAddressBuilder $customerAddressBuilder,
         CustomerAddressServiceInterface $customerAddressService,
+        Address\Validator $validator,
         \Magento\Framework\Model\Resource\AbstractResource $resource = null,
         \Magento\Framework\Data\Collection\Db $resourceCollection = null,
         array $data = array()
@@ -313,6 +320,7 @@ class Address extends \Magento\Customer\Model\Address\AbstractAddress
         $this->_carrierFactory = $carrierFactory;
         $this->_customerAddressBuilder = $customerAddressBuilder;
         $this->_customerAdressService = $customerAddressService;
+        $this->validator = $validator;
         parent::__construct(
             $context,
             $registry,
@@ -1390,4 +1398,12 @@ class Address extends \Magento\Customer\Model\Address\AbstractAddress
     {
         return $this->getSubtotal() + $this->getDiscountAmount();
     }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function _getValidationRulesBeforeSave()
+    {
+        return $this->validator;
+    }
 }
diff --git a/app/code/Magento/Sales/Model/Quote/Address/Validator.php b/app/code/Magento/Sales/Model/Quote/Address/Validator.php
new file mode 100644
index 0000000000000000000000000000000000000000..e3e5100dd19ff0d17c74c9aa12780fe545c9725b
--- /dev/null
+++ b/app/code/Magento/Sales/Model/Quote/Address/Validator.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\Sales\Model\Quote\Address;
+
+use Zend_Validate_Exception;
+
+class Validator extends \Magento\Framework\Validator\AbstractValidator
+{
+    /**
+     * @var \Magento\Directory\Model\CountryFactory
+     */
+    protected $countryFactory;
+
+    /**
+     * @param \Magento\Directory\Model\CountryFactory $countryFactory
+     */
+    public function __construct(\Magento\Directory\Model\CountryFactory $countryFactory)
+    {
+        $this->countryFactory = $countryFactory;
+    }
+
+    /**
+     * Returns true if and only if $value meets the validation requirements
+     *
+     * If $value fails validation, then this method returns false, and
+     * getMessages() will return an array of messages that explain why the
+     * validation failed.
+     *
+     * @param  \Magento\Sales\Model\Quote\Address $value
+     * @return boolean
+     * @throws Zend_Validate_Exception If validation of $value is impossible
+     */
+    public function isValid($value)
+    {
+        $messages = array();
+        $email = $value->getEmail();
+        if (!empty($email) && !\Zend_Validate::is($email, 'EmailAddress')) {
+            $messages['invalid_email_format'] = 'Invalid email format';
+        }
+
+        $countryId = $value->getCountryId();
+        if (!empty($countryId)) {
+            $country = $this->countryFactory->create();
+            $country->load($countryId);
+            if (!$country->getId()) {
+                $messages['invalid_country_code'] = 'Invalid country code';
+            }
+        }
+
+        $this->_addMessages($messages);
+
+        return empty($messages);
+    }
+}
diff --git a/app/code/Magento/Sales/Model/Resource/Order/Address.php b/app/code/Magento/Sales/Model/Resource/Order/Address.php
index dd661f198dcb53f4ae6a16abcb8c93723f8ce69a..7bb0070b82c8f430bff20ebcc5dde25696719af1 100644
--- a/app/code/Magento/Sales/Model/Resource/Order/Address.php
+++ b/app/code/Magento/Sales/Model/Resource/Order/Address.php
@@ -40,22 +40,31 @@ class Address extends AbstractOrder
      */
     protected $_salesResourceFactory;
 
+    /**
+     * @var \Magento\Sales\Model\Order\Address\Validator
+     */
+    protected $_validator;
+
     /**
      * @param \Magento\Framework\App\Resource $resource
      * @param \Magento\Framework\Stdlib\DateTime $dateTime
      * @param \Magento\Framework\Event\ManagerInterface $eventManager
      * @param \Magento\Eav\Model\Entity\TypeFactory $eavEntityTypeFactory
      * @param \Magento\Sales\Model\Resource\Factory $salesResourceFactory
+     * @param \Magento\Sales\Model\Order\Address\Validator $validator
      */
     public function __construct(
         \Magento\Framework\App\Resource $resource,
         \Magento\Framework\Stdlib\DateTime $dateTime,
         \Magento\Framework\Event\ManagerInterface $eventManager,
         \Magento\Eav\Model\Entity\TypeFactory $eavEntityTypeFactory,
-        \Magento\Sales\Model\Resource\Factory $salesResourceFactory
+        \Magento\Sales\Model\Resource\Factory $salesResourceFactory,
+        \Magento\Sales\Model\Order\Address\Validator $validator
     ) {
+        $this->_validator = $validator;
         parent::__construct($resource, $dateTime, $eventManager, $eavEntityTypeFactory);
         $this->_salesResourceFactory = $salesResourceFactory;
+
     }
 
     /**
@@ -91,6 +100,25 @@ class Address extends AbstractOrder
         return $attributes;
     }
 
+    /**
+     * Performs validation before save
+     *
+     * @param \Magento\Framework\Model\AbstractModel $object
+     * @return $this
+     * @throws \Magento\Framework\Model\Exception
+     */
+    protected function _beforeSave(\Magento\Framework\Model\AbstractModel $object)
+    {
+        parent::_beforeSave($object);
+        $warnings = $this->_validator->validate($object);
+        if (!empty($warnings)) {
+            throw new \Magento\Framework\Model\Exception(
+                __("Cannot save address") . ":\n" . implode("\n", $warnings)
+            );
+        }
+        return $this;
+    }
+
     /**
      * Update related grid table after object save
      *
diff --git a/app/code/Magento/Sales/Model/Resource/Order/Status/History.php b/app/code/Magento/Sales/Model/Resource/Order/Status/History.php
index 87cc3d2f436e4d26f0c87d12fe336b98a77219b4..ca4f1d4c1e98e2cf25ea3ba1562309de3e0479ae 100644
--- a/app/code/Magento/Sales/Model/Resource/Order/Status/History.php
+++ b/app/code/Magento/Sales/Model/Resource/Order/Status/History.php
@@ -23,6 +23,8 @@
  */
 namespace Magento\Sales\Model\Resource\Order\Status;
 
+use Magento\Sales\Model\Order\Status\History\Validator;
+
 /**
  * Flat sales order status history resource
  *
@@ -30,6 +32,29 @@ namespace Magento\Sales\Model\Resource\Order\Status;
  */
 class History extends \Magento\Sales\Model\Resource\Order\AbstractOrder
 {
+    /**
+     * @var Validator
+     */
+    protected $validator;
+
+    /**
+     * @param \Magento\Framework\App\Resource $resource
+     * @param \Magento\Framework\Stdlib\DateTime $dateTime
+     * @param \Magento\Framework\Event\ManagerInterface $eventManager
+     * @param \Magento\Eav\Model\Entity\TypeFactory $eavEntityTypeFactory
+     * @param Validator $validator
+     */
+    public function __construct(
+        \Magento\Framework\App\Resource $resource,
+        \Magento\Framework\Stdlib\DateTime $dateTime,
+        \Magento\Framework\Event\ManagerInterface $eventManager,
+        \Magento\Eav\Model\Entity\TypeFactory $eavEntityTypeFactory,
+        Validator $validator
+    ) {
+        $this->validator = $validator;
+        parent::__construct($resource, $dateTime, $eventManager, $eavEntityTypeFactory);
+    }
+
     /**
      * Event prefix
      *
@@ -46,4 +71,23 @@ class History extends \Magento\Sales\Model\Resource\Order\AbstractOrder
     {
         $this->_init('sales_flat_order_status_history', 'entity_id');
     }
+
+    /**
+     * Perform actions before object save
+     *
+     * @param \Magento\Framework\Model\AbstractModel $object
+     * @return $this
+     * @throws \Magento\Framework\Model\Exception
+     */
+    protected function _beforeSave(\Magento\Framework\Model\AbstractModel $object)
+    {
+        parent::_beforeSave($object);
+        $warnings = $this->validator->validate($object);
+        if (!empty($warnings)) {
+            throw new \Magento\Framework\Model\Exception(
+                __('Cannot save comment') . ":\n" . implode("\n", $warnings)
+            );
+        }
+        return $this;
+    }
 }
diff --git a/app/code/Magento/Sales/Service/V1/Data/Comment.php b/app/code/Magento/Sales/Service/V1/Data/Comment.php
new file mode 100644
index 0000000000000000000000000000000000000000..bfe5773e92ec14e9b7b09525151bb256d6d7addd
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/Data/Comment.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\Sales\Service\V1\Data;
+
+use Magento\Framework\Service\Data\AbstractObject as DataObject;
+
+/**
+ * Class InvoiceComment
+ */
+class Comment extends DataObject
+{
+    const ENTITY_ID = 'entity_id';
+    const PARENT_ID = 'parent_id';
+    const IS_CUSTOMER_NOTIFIED = 'is_customer_notified';
+    const IS_VISIBLE_ON_FRONT = 'is_visible_on_front';
+    const COMMENT = 'comment';
+    const CREATED_AT = 'created_at';
+
+    /**
+     * Returns comment
+     *
+     * @return string
+     */
+    public function getComment()
+    {
+        return $this->_get(self::COMMENT);
+    }
+
+    /**
+     * Returns created_at
+     *
+     * @return string
+     */
+    public function getCreatedAt()
+    {
+        return $this->_get(self::CREATED_AT);
+    }
+
+    /**
+     * Returns entity_id
+     *
+     * @return int
+     */
+    public function getEntityId()
+    {
+        return $this->_get(self::ENTITY_ID);
+    }
+
+    /**
+     * Returns is_customer_notified
+     *
+     * @return int
+     */
+    public function getIsCustomerNotified()
+    {
+        return $this->_get(self::IS_CUSTOMER_NOTIFIED);
+    }
+
+    /**
+     * Returns is_visible_on_front
+     *
+     * @return int
+     */
+    public function getIsVisibleOnFront()
+    {
+        return $this->_get(self::IS_VISIBLE_ON_FRONT);
+    }
+
+    /**
+     * Returns parent_id
+     *
+     * @return int
+     */
+    public function getParentId()
+    {
+        return $this->_get(self::PARENT_ID);
+    }
+}
diff --git a/app/code/Magento/Sales/Service/V1/Data/Creditmemo.php b/app/code/Magento/Sales/Service/V1/Data/Creditmemo.php
new file mode 100644
index 0000000000000000000000000000000000000000..d43bacf41c2aa95ddcdc7156b43f827d15ff81e4
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/Data/Creditmemo.php
@@ -0,0 +1,753 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Data;
+
+use Magento\Framework\Service\Data\AbstractObject as DataObject;
+
+/**
+ * Class Creditmemo
+ */
+class Creditmemo extends DataObject
+{
+    /**
+     * int
+     */
+    const ENTITY_ID = 'entity_id';
+
+    /**
+     * int
+     */
+    const STORE_ID = 'store_id';
+
+    /**
+     * float
+     */
+    const ADJUSTMENT_POSITIVE = 'adjustment_positive';
+
+    /**
+     * float
+     */
+    const BASE_SHIPPING_TAX_AMOUNT = 'base_shipping_tax_amount';
+
+    /**
+     * float
+     */
+    const STORE_TO_ORDER_RATE = 'store_to_order_rate';
+
+    /**
+     * float
+     */
+    const BASE_DISCOUNT_AMOUNT = 'base_discount_amount';
+
+    /**
+     * float
+     */
+    const BASE_TO_ORDER_RATE = 'base_to_order_rate';
+
+    /**
+     * float
+     */
+    const GRAND_TOTAL = 'grand_total';
+
+    /**
+     * float
+     */
+    const BASE_ADJUSTMENT_NEGATIVE = 'base_adjustment_negative';
+
+    /**
+     * float
+     */
+    const BASE_SUBTOTAL_INCL_TAX = 'base_subtotal_incl_tax';
+
+    /**
+     * float
+     */
+    const SHIPPING_AMOUNT = 'shipping_amount';
+
+    /**
+     * float
+     */
+    const SUBTOTAL_INCL_TAX = 'subtotal_incl_tax';
+
+    /**
+     * float
+     */
+    const ADJUSTMENT_NEGATIVE = 'adjustment_negative';
+
+    /**
+     * float
+     */
+    const BASE_SHIPPING_AMOUNT = 'base_shipping_amount';
+
+    /**
+     * float
+     */
+    const STORE_TO_BASE_RATE = 'store_to_base_rate';
+
+    /**
+     * float
+     */
+    const BASE_TO_GLOBAL_RATE = 'base_to_global_rate';
+
+    /**
+     * float
+     */
+    const BASE_ADJUSTMENT = 'base_adjustment';
+
+    /**
+     * float
+     */
+    const BASE_SUBTOTAL = 'base_subtotal';
+
+    /**
+     * float
+     */
+    const DISCOUNT_AMOUNT = 'discount_amount';
+
+    /**
+     * float
+     */
+    const SUBTOTAL = 'subtotal';
+
+    /**
+     * float
+     */
+    const ADJUSTMENT = 'adjustment';
+
+    /**
+     * float
+     */
+    const BASE_GRAND_TOTAL = 'base_grand_total';
+
+    /**
+     * float
+     */
+    const BASE_ADJUSTMENT_POSITIVE = 'base_adjustment_positive';
+
+    /**
+     * float
+     */
+    const BASE_TAX_AMOUNT = 'base_tax_amount';
+
+    /**
+     * float
+     */
+    const SHIPPING_TAX_AMOUNT = 'shipping_tax_amount';
+
+    /**
+     * float
+     */
+    const TAX_AMOUNT = 'tax_amount';
+
+    /**
+     * int
+     */
+    const ORDER_ID = 'order_id';
+
+    /**
+     * int
+     */
+    const EMAIL_SENT = 'email_sent';
+
+    /**
+     * int
+     */
+    const CREDITMEMO_STATUS = 'creditmemo_status';
+
+    /**
+     * int
+     */
+    const STATE = 'state';
+
+    /**
+     * int
+     */
+    const SHIPPING_ADDRESS_ID = 'shipping_address_id';
+
+    /**
+     * int
+     */
+    const BILLING_ADDRESS_ID = 'billing_address_id';
+
+    /**
+     * int
+     */
+    const INVOICE_ID = 'invoice_id';
+
+    /**
+     * string
+     */
+    const STORE_CURRENCY_CODE = 'store_currency_code';
+
+    /**
+     * string
+     */
+    const ORDER_CURRENCY_CODE = 'order_currency_code';
+
+    /**
+     * string
+     */
+    const BASE_CURRENCY_CODE = 'base_currency_code';
+
+    /**
+     * string
+     */
+    const GLOBAL_CURRENCY_CODE = 'global_currency_code';
+
+    /**
+     * string
+     */
+    const TRANSACTION_ID = 'transaction_id';
+
+    /**
+     * string
+     */
+    const INCREMENT_ID = 'increment_id';
+
+    /**
+     * string
+     */
+    const CREATED_AT = 'created_at';
+
+    /**
+     * string
+     */
+    const UPDATED_AT = 'updated_at';
+
+    /**
+     * float
+     */
+    const HIDDEN_TAX_AMOUNT = 'hidden_tax_amount';
+
+    /**
+     * float
+     */
+    const BASE_HIDDEN_TAX_AMOUNT = 'base_hidden_tax_amount';
+
+    /**
+     * float
+     */
+    const SHIPPING_HIDDEN_TAX_AMOUNT = 'shipping_hidden_tax_amount';
+
+    /**
+     * float
+     */
+    const BASE_SHIPPING_HIDDEN_TAX_AMNT = 'base_shipping_hidden_tax_amnt';
+
+    /**
+     * float
+     */
+    const SHIPPING_INCL_TAX = 'shipping_incl_tax';
+
+    /**
+     * float
+     */
+    const BASE_SHIPPING_INCL_TAX = 'base_shipping_incl_tax';
+
+    /**
+     * string
+     */
+    const DISCOUNT_DESCRIPTION = 'discount_description';
+
+    /**
+     * Returns adjustment
+     *
+     * @return float
+     */
+    public function getAdjustment()
+    {
+        return $this->_get(self::ADJUSTMENT);
+    }
+
+    /**
+     * Returns adjustment_negative
+     *
+     * @return float
+     */
+    public function getAdjustmentNegative()
+    {
+        return $this->_get(self::ADJUSTMENT_NEGATIVE);
+    }
+
+    /**
+     * Returns adjustment_positive
+     *
+     * @return float
+     */
+    public function getAdjustmentPositive()
+    {
+        return $this->_get(self::ADJUSTMENT_POSITIVE);
+    }
+
+    /**
+     * Returns base_adjustment
+     *
+     * @return float
+     */
+    public function getBaseAdjustment()
+    {
+        return $this->_get(self::BASE_ADJUSTMENT);
+    }
+
+    /**
+     * Returns base_adjustment_negative
+     *
+     * @return float
+     */
+    public function getBaseAdjustmentNegative()
+    {
+        return $this->_get(self::BASE_ADJUSTMENT_NEGATIVE);
+    }
+
+    /**
+     * Returns base_adjustment_positive
+     *
+     * @return float
+     */
+    public function getBaseAdjustmentPositive()
+    {
+        return $this->_get(self::BASE_ADJUSTMENT_POSITIVE);
+    }
+
+    /**
+     * Returns base_currency_code
+     *
+     * @return string
+     */
+    public function getBaseCurrencyCode()
+    {
+        return $this->_get(self::BASE_CURRENCY_CODE);
+    }
+
+    /**
+     * Returns base_discount_amount
+     *
+     * @return float
+     */
+    public function getBaseDiscountAmount()
+    {
+        return $this->_get(self::BASE_DISCOUNT_AMOUNT);
+    }
+
+    /**
+     * Returns base_grand_total
+     *
+     * @return float
+     */
+    public function getBaseGrandTotal()
+    {
+        return $this->_get(self::BASE_GRAND_TOTAL);
+    }
+
+    /**
+     * Returns base_hidden_tax_amount
+     *
+     * @return float
+     */
+    public function getBaseHiddenTaxAmount()
+    {
+        return $this->_get(self::BASE_HIDDEN_TAX_AMOUNT);
+    }
+
+    /**
+     * Returns base_shipping_amount
+     *
+     * @return float
+     */
+    public function getBaseShippingAmount()
+    {
+        return $this->_get(self::BASE_SHIPPING_AMOUNT);
+    }
+
+    /**
+     * Returns base_shipping_hidden_tax_amnt
+     *
+     * @return float
+     */
+    public function getBaseShippingHiddenTaxAmnt()
+    {
+        return $this->_get(self::BASE_SHIPPING_HIDDEN_TAX_AMNT);
+    }
+
+    /**
+     * Returns base_shipping_incl_tax
+     *
+     * @return float
+     */
+    public function getBaseShippingInclTax()
+    {
+        return $this->_get(self::BASE_SHIPPING_INCL_TAX);
+    }
+
+    /**
+     * Returns base_shipping_tax_amount
+     *
+     * @return float
+     */
+    public function getBaseShippingTaxAmount()
+    {
+        return $this->_get(self::BASE_SHIPPING_TAX_AMOUNT);
+    }
+
+    /**
+     * Returns base_subtotal
+     *
+     * @return float
+     */
+    public function getBaseSubtotal()
+    {
+        return $this->_get(self::BASE_SUBTOTAL);
+    }
+
+    /**
+     * Returns base_subtotal_incl_tax
+     *
+     * @return float
+     */
+    public function getBaseSubtotalInclTax()
+    {
+        return $this->_get(self::BASE_SUBTOTAL_INCL_TAX);
+    }
+
+    /**
+     * Returns base_tax_amount
+     *
+     * @return float
+     */
+    public function getBaseTaxAmount()
+    {
+        return $this->_get(self::BASE_TAX_AMOUNT);
+    }
+
+    /**
+     * Returns base_to_global_rate
+     *
+     * @return float
+     */
+    public function getBaseToGlobalRate()
+    {
+        return $this->_get(self::BASE_TO_GLOBAL_RATE);
+    }
+
+    /**
+     * Returns base_to_order_rate
+     *
+     * @return float
+     */
+    public function getBaseToOrderRate()
+    {
+        return $this->_get(self::BASE_TO_ORDER_RATE);
+    }
+
+    /**
+     * Returns billing_address_id
+     *
+     * @return int
+     */
+    public function getBillingAddressId()
+    {
+        return $this->_get(self::BILLING_ADDRESS_ID);
+    }
+
+    /**
+     * Returns created_at
+     *
+     * @return string
+     */
+    public function getCreatedAt()
+    {
+        return $this->_get(self::CREATED_AT);
+    }
+
+    /**
+     * Returns creditmemo_status
+     *
+     * @return int
+     */
+    public function getCreditmemoStatus()
+    {
+        return $this->_get(self::CREDITMEMO_STATUS);
+    }
+
+    /**
+     * Returns discount_amount
+     *
+     * @return float
+     */
+    public function getDiscountAmount()
+    {
+        return $this->_get(self::DISCOUNT_AMOUNT);
+    }
+
+    /**
+     * Returns discount_description
+     *
+     * @return string
+     */
+    public function getDiscountDescription()
+    {
+        return $this->_get(self::DISCOUNT_DESCRIPTION);
+    }
+
+    /**
+     * Returns email_sent
+     *
+     * @return int
+     */
+    public function getEmailSent()
+    {
+        return $this->_get(self::EMAIL_SENT);
+    }
+
+    /**
+     * Returns entity_id
+     *
+     * @return int
+     */
+    public function getEntityId()
+    {
+        return $this->_get(self::ENTITY_ID);
+    }
+
+    /**
+     * Returns global_currency_code
+     *
+     * @return string
+     */
+    public function getGlobalCurrencyCode()
+    {
+        return $this->_get(self::GLOBAL_CURRENCY_CODE);
+    }
+
+    /**
+     * Returns grand_total
+     *
+     * @return float
+     */
+    public function getGrandTotal()
+    {
+        return $this->_get(self::GRAND_TOTAL);
+    }
+
+
+    /**
+     * Returns hidden_tax_amount
+     *
+     * @return float
+     */
+    public function getHiddenTaxAmount()
+    {
+        return $this->_get(self::HIDDEN_TAX_AMOUNT);
+    }
+
+    /**
+     * Returns increment_id
+     *
+     * @return string
+     */
+    public function getIncrementId()
+    {
+        return $this->_get(self::INCREMENT_ID);
+    }
+
+    /**
+     * Returns invoice_id
+     *
+     * @return int
+     */
+    public function getInvoiceId()
+    {
+        return $this->_get(self::INVOICE_ID);
+    }
+
+    /**
+     * Returns order_currency_code
+     *
+     * @return string
+     */
+    public function getOrderCurrencyCode()
+    {
+        return $this->_get(self::ORDER_CURRENCY_CODE);
+    }
+
+    /**
+     * Returns order_id
+     *
+     * @return int
+     */
+    public function getOrderId()
+    {
+        return $this->_get(self::ORDER_ID);
+    }
+
+    /**
+     * Returns shipping_address_id
+     *
+     * @return int
+     */
+    public function getShippingAddressId()
+    {
+        return $this->_get(self::SHIPPING_ADDRESS_ID);
+    }
+
+    /**
+     * Returns shipping_amount
+     *
+     * @return float
+     */
+    public function getShippingAmount()
+    {
+        return $this->_get(self::SHIPPING_AMOUNT);
+    }
+
+    /**
+     * Returns shipping_hidden_tax_amount
+     *
+     * @return float
+     */
+    public function getShippingHiddenTaxAmount()
+    {
+        return $this->_get(self::SHIPPING_HIDDEN_TAX_AMOUNT);
+    }
+
+    /**
+     * Returns shipping_incl_tax
+     *
+     * @return float
+     */
+    public function getShippingInclTax()
+    {
+        return $this->_get(self::SHIPPING_INCL_TAX);
+    }
+
+    /**
+     * Returns shipping_tax_amount
+     *
+     * @return float
+     */
+    public function getShippingTaxAmount()
+    {
+        return $this->_get(self::SHIPPING_TAX_AMOUNT);
+    }
+
+    /**
+     * Returns state
+     *
+     * @return int
+     */
+    public function getState()
+    {
+        return $this->_get(self::STATE);
+    }
+
+    /**
+     * Returns store_currency_code
+     *
+     * @return string
+     */
+    public function getStoreCurrencyCode()
+    {
+        return $this->_get(self::STORE_CURRENCY_CODE);
+    }
+
+    /**
+     * Returns store_id
+     *
+     * @return int
+     */
+    public function getStoreId()
+    {
+        return $this->_get(self::STORE_ID);
+    }
+
+    /**
+     * Returns store_to_base_rate
+     *
+     * @return float
+     */
+    public function getStoreToBaseRate()
+    {
+        return $this->_get(self::STORE_TO_BASE_RATE);
+    }
+
+    /**
+     * Returns store_to_order_rate
+     *
+     * @return float
+     */
+    public function getStoreToOrderRate()
+    {
+        return $this->_get(self::STORE_TO_ORDER_RATE);
+    }
+
+    /**
+     * Returns subtotal
+     *
+     * @return float
+     */
+    public function getSubtotal()
+    {
+        return $this->_get(self::SUBTOTAL);
+    }
+
+    /**
+     * Returns subtotal_incl_tax
+     *
+     * @return float
+     */
+    public function getSubtotalInclTax()
+    {
+        return $this->_get(self::SUBTOTAL_INCL_TAX);
+    }
+
+    /**
+     * Returns tax_amount
+     *
+     * @return float
+     */
+    public function getTaxAmount()
+    {
+        return $this->_get(self::TAX_AMOUNT);
+    }
+
+    /**
+     * Returns transaction_id
+     *
+     * @return string
+     */
+    public function getTransactionId()
+    {
+        return $this->_get(self::TRANSACTION_ID);
+    }
+
+    /**
+     * Returns updated_at
+     *
+     * @return string
+     */
+    public function getUpdatedAt()
+    {
+        return $this->_get(self::UPDATED_AT);
+    }
+}
diff --git a/app/code/Magento/Sales/Service/V1/Data/CreditmemoComment.php b/app/code/Magento/Sales/Service/V1/Data/CreditmemoComment.php
new file mode 100644
index 0000000000000000000000000000000000000000..26e097b26e147d4cdcefefe44cf995dae9b35dc3
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/Data/CreditmemoComment.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\Sales\Service\V1\Data;
+
+use Magento\Framework\Service\Data\AbstractObject as DataObject;
+
+/**
+ * Class CreditmemoComment
+ */
+class CreditmemoComment extends DataObject
+{
+    /**
+     * int
+     */
+    const ENTITY_ID = 'entity_id';
+
+    /**
+     * int
+     */
+    const PARENT_ID = 'parent_id';
+
+    /**
+     * int
+     */
+    const IS_CUSTOMER_NOTIFIED = 'is_customer_notified';
+
+    /**
+     * int
+     */
+    const IS_VISIBLE_ON_FRONT = 'is_visible_on_front';
+
+    /**
+     * string
+     */
+    const COMMENT = 'comment';
+
+    /**
+     * string
+     */
+    const CREATED_AT = 'created_at';
+
+    /**
+     * Returns comment
+     *
+     * @return string
+     */
+    public function getComment()
+    {
+        return $this->_get(self::COMMENT);
+    }
+
+    /**
+     * Returns created_at
+     *
+     * @return string
+     */
+    public function getCreatedAt()
+    {
+        return $this->_get(self::CREATED_AT);
+    }
+
+    /**
+     * Returns entity_id
+     *
+     * @return int
+     */
+    public function getEntityId()
+    {
+        return $this->_get(self::ENTITY_ID);
+    }
+
+    /**
+     * Returns is_customer_notified
+     *
+     * @return int
+     */
+    public function getIsCustomerNotified()
+    {
+        return $this->_get(self::IS_CUSTOMER_NOTIFIED);
+    }
+
+    /**
+     * Returns is_visible_on_front
+     *
+     * @return int
+     */
+    public function getIsVisibleOnFront()
+    {
+        return $this->_get(self::IS_VISIBLE_ON_FRONT);
+    }
+
+    /**
+     * Returns parent_id
+     *
+     * @return int
+     */
+    public function getParentId()
+    {
+        return $this->_get(self::PARENT_ID);
+    }
+}
diff --git a/app/code/Magento/Sales/Service/V1/Data/CreditmemoItem.php b/app/code/Magento/Sales/Service/V1/Data/CreditmemoItem.php
new file mode 100644
index 0000000000000000000000000000000000000000..6a4a50a1a79a7aaea219611bb6fff773b318d04c
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/Data/CreditmemoItem.php
@@ -0,0 +1,527 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Data;
+
+use Magento\Framework\Service\Data\AbstractObject as DataObject;
+
+/**
+ * Class CreditmemoItem
+ */
+class CreditmemoItem extends DataObject
+{
+    /**
+     * int
+     */
+    const ENTITY_ID = 'entity_id';
+
+    /**
+     * int
+     */
+    const PARENT_ID = 'parent_id';
+
+    /**
+     * float
+     */
+    const BASE_PRICE = 'base_price';
+
+    /**
+     * float
+     */
+    const TAX_AMOUNT = 'tax_amount';
+
+    /**
+     * float
+     */
+    const BASE_ROW_TOTAL = 'base_row_total';
+
+    /**
+     * float
+     */
+    const DISCOUNT_AMOUNT = 'discount_amount';
+
+    /**
+     * float
+     */
+    const ROW_TOTAL = 'row_total';
+
+    /**
+     * float
+     */
+    const BASE_DISCOUNT_AMOUNT = 'base_discount_amount';
+
+    /**
+     * float
+     */
+    const PRICE_INCL_TAX = 'price_incl_tax';
+
+    /**
+     * float
+     */
+    const BASE_TAX_AMOUNT = 'base_tax_amount';
+
+    /**
+     * float
+     */
+    const BASE_PRICE_INCL_TAX = 'base_price_incl_tax';
+
+    /**
+     * float
+     */
+    const QTY = 'qty';
+
+    /**
+     * float
+     */
+    const BASE_COST = 'base_cost';
+
+    /**
+     * float
+     */
+    const PRICE = 'price';
+
+    /**
+     * float
+     */
+    const BASE_ROW_TOTAL_INCL_TAX = 'base_row_total_incl_tax';
+
+    /**
+     * float
+     */
+    const ROW_TOTAL_INCL_TAX = 'row_total_incl_tax';
+
+    /**
+     * int
+     */
+    const PRODUCT_ID = 'product_id';
+
+    /**
+     * int
+     */
+    const ORDER_ITEM_ID = 'order_item_id';
+
+    /**
+     * string
+     */
+    const ADDITIONAL_DATA = 'additional_data';
+
+    /**
+     * string
+     */
+    const DESCRIPTION = 'description';
+
+    /**
+     * string
+     */
+    const SKU = 'sku';
+
+    /**
+     * string
+     */
+    const NAME = 'name';
+
+    /**
+     * float
+     */
+    const HIDDEN_TAX_AMOUNT = 'hidden_tax_amount';
+
+    /**
+     * float
+     */
+    const BASE_HIDDEN_TAX_AMOUNT = 'base_hidden_tax_amount';
+
+    /**
+     * float
+     */
+    const WEEE_TAX_DISPOSITION = 'weee_tax_disposition';
+
+    /**
+     * float
+     */
+    const WEEE_TAX_ROW_DISPOSITION = 'weee_tax_row_disposition';
+
+    /**
+     * float
+     */
+    const BASE_WEEE_TAX_DISPOSITION = 'base_weee_tax_disposition';
+
+    /**
+     * float
+     */
+    const BASE_WEEE_TAX_ROW_DISPOSITION = 'base_weee_tax_row_disposition';
+
+    /**
+     * string
+     */
+    const WEEE_TAX_APPLIED = 'weee_tax_applied';
+
+    /**
+     * float
+     */
+    const BASE_WEEE_TAX_APPLIED_AMOUNT = 'base_weee_tax_applied_amount';
+
+    /**
+     * float
+     */
+    const BASE_WEEE_TAX_APPLIED_ROW_AMNT = 'base_weee_tax_applied_row_amnt';
+
+    /**
+     * float
+     */
+    const WEEE_TAX_APPLIED_AMOUNT = 'weee_tax_applied_amount';
+
+    /**
+     * float
+     */
+    const WEEE_TAX_APPLIED_ROW_AMOUNT = 'weee_tax_applied_row_amount';
+
+    /**
+     * Returns additional_data
+     *
+     * @return string
+     */
+    public function getAdditionalData()
+    {
+        return $this->_get(self::ADDITIONAL_DATA);
+    }
+
+    /**
+     * Returns base_cost
+     *
+     * @return float
+     */
+    public function getBaseCost()
+    {
+        return $this->_get(self::BASE_COST);
+    }
+
+    /**
+     * Returns base_discount_amount
+     *
+     * @return float
+     */
+    public function getBaseDiscountAmount()
+    {
+        return $this->_get(self::BASE_DISCOUNT_AMOUNT);
+    }
+
+    /**
+     * Returns base_hidden_tax_amount
+     *
+     * @return float
+     */
+    public function getBaseHiddenTaxAmount()
+    {
+        return $this->_get(self::BASE_HIDDEN_TAX_AMOUNT);
+    }
+
+    /**
+     * Returns base_price
+     *
+     * @return float
+     */
+    public function getBasePrice()
+    {
+        return $this->_get(self::BASE_PRICE);
+    }
+
+    /**
+     * Returns base_price_incl_tax
+     *
+     * @return float
+     */
+    public function getBasePriceInclTax()
+    {
+        return $this->_get(self::BASE_PRICE_INCL_TAX);
+    }
+
+    /**
+     * Returns base_row_total
+     *
+     * @return float
+     */
+    public function getBaseRowTotal()
+    {
+        return $this->_get(self::BASE_ROW_TOTAL);
+    }
+
+    /**
+     * Returns base_row_total_incl_tax
+     *
+     * @return float
+     */
+    public function getBaseRowTotalInclTax()
+    {
+        return $this->_get(self::BASE_ROW_TOTAL_INCL_TAX);
+    }
+
+    /**
+     * Returns base_tax_amount
+     *
+     * @return float
+     */
+    public function getBaseTaxAmount()
+    {
+        return $this->_get(self::BASE_TAX_AMOUNT);
+    }
+
+    /**
+     * Returns base_weee_tax_applied_amount
+     *
+     * @return float
+     */
+    public function getBaseWeeeTaxAppliedAmount()
+    {
+        return $this->_get(self::BASE_WEEE_TAX_APPLIED_AMOUNT);
+    }
+
+    /**
+     * Returns base_weee_tax_applied_row_amnt
+     *
+     * @return float
+     */
+    public function getBaseWeeeTaxAppliedRowAmnt()
+    {
+        return $this->_get(self::BASE_WEEE_TAX_APPLIED_ROW_AMNT);
+    }
+
+    /**
+     * Returns base_weee_tax_disposition
+     *
+     * @return float
+     */
+    public function getBaseWeeeTaxDisposition()
+    {
+        return $this->_get(self::BASE_WEEE_TAX_DISPOSITION);
+    }
+
+    /**
+     * Returns base_weee_tax_row_disposition
+     *
+     * @return float
+     */
+    public function getBaseWeeeTaxRowDisposition()
+    {
+        return $this->_get(self::BASE_WEEE_TAX_ROW_DISPOSITION);
+    }
+
+    /**
+     * Returns description
+     *
+     * @return string
+     */
+    public function getDescription()
+    {
+        return $this->_get(self::DESCRIPTION);
+    }
+
+    /**
+     * Returns discount_amount
+     *
+     * @return float
+     */
+    public function getDiscountAmount()
+    {
+        return $this->_get(self::DISCOUNT_AMOUNT);
+    }
+
+    /**
+     * Returns entity_id
+     *
+     * @return int
+     */
+    public function getEntityId()
+    {
+        return $this->_get(self::ENTITY_ID);
+    }
+
+    /**
+     * Returns hidden_tax_amount
+     *
+     * @return float
+     */
+    public function getHiddenTaxAmount()
+    {
+        return $this->_get(self::HIDDEN_TAX_AMOUNT);
+    }
+
+    /**
+     * Returns name
+     *
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->_get(self::NAME);
+    }
+
+    /**
+     * Returns order_item_id
+     *
+     * @return int
+     */
+    public function getOrderItemId()
+    {
+        return $this->_get(self::ORDER_ITEM_ID);
+    }
+
+    /**
+     * Returns parent_id
+     *
+     * @return int
+     */
+    public function getParentId()
+    {
+        return $this->_get(self::PARENT_ID);
+    }
+
+    /**
+     * Returns price
+     *
+     * @return float
+     */
+    public function getPrice()
+    {
+        return $this->_get(self::PRICE);
+    }
+
+    /**
+     * Returns price_incl_tax
+     *
+     * @return float
+     */
+    public function getPriceInclTax()
+    {
+        return $this->_get(self::PRICE_INCL_TAX);
+    }
+
+    /**
+     * Returns product_id
+     *
+     * @return int
+     */
+    public function getProductId()
+    {
+        return $this->_get(self::PRODUCT_ID);
+    }
+
+    /**
+     * Returns qty
+     *
+     * @return float
+     */
+    public function getQty()
+    {
+        return $this->_get(self::QTY);
+    }
+
+    /**
+     * Returns row_total
+     *
+     * @return float
+     */
+    public function getRowTotal()
+    {
+        return $this->_get(self::ROW_TOTAL);
+    }
+
+    /**
+     * Returns row_total_incl_tax
+     *
+     * @return float
+     */
+    public function getRowTotalInclTax()
+    {
+        return $this->_get(self::ROW_TOTAL_INCL_TAX);
+    }
+
+    /**
+     * Returns sku
+     *
+     * @return string
+     */
+    public function getSku()
+    {
+        return $this->_get(self::SKU);
+    }
+
+    /**
+     * Returns tax_amount
+     *
+     * @return float
+     */
+    public function getTaxAmount()
+    {
+        return $this->_get(self::TAX_AMOUNT);
+    }
+
+    /**
+     * Returns weee_tax_applied
+     *
+     * @return string
+     */
+    public function getWeeeTaxApplied()
+    {
+        return $this->_get(self::WEEE_TAX_APPLIED);
+    }
+
+    /**
+     * Returns weee_tax_applied_amount
+     *
+     * @return float
+     */
+    public function getWeeeTaxAppliedAmount()
+    {
+        return $this->_get(self::WEEE_TAX_APPLIED_AMOUNT);
+    }
+
+    /**
+     * Returns weee_tax_applied_row_amount
+     *
+     * @return float
+     */
+    public function getWeeeTaxAppliedRowAmount()
+    {
+        return $this->_get(self::WEEE_TAX_APPLIED_ROW_AMOUNT);
+    }
+
+    /**
+     * Returns weee_tax_disposition
+     *
+     * @return float
+     */
+    public function getWeeeTaxDisposition()
+    {
+        return $this->_get(self::WEEE_TAX_DISPOSITION);
+    }
+
+    /**
+     * Returns weee_tax_row_disposition
+     *
+     * @return float
+     */
+    public function getWeeeTaxRowDisposition()
+    {
+        return $this->_get(self::WEEE_TAX_ROW_DISPOSITION);
+    }
+}
diff --git a/app/code/Magento/Sales/Service/V1/Data/Invoice.php b/app/code/Magento/Sales/Service/V1/Data/Invoice.php
new file mode 100644
index 0000000000000000000000000000000000000000..08ed2599cf09b496091552599eac7493d5aa1645
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/Data/Invoice.php
@@ -0,0 +1,539 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Data;
+
+use Magento\Framework\Service\Data\AbstractObject as DataObject;
+
+/**
+ * Class Invoice
+ */
+class Invoice extends DataObject
+{
+    const ENTITY_ID = 'entity_id';
+    const STORE_ID = 'store_id';
+    const BASE_GRAND_TOTAL = 'base_grand_total';
+    const SHIPPING_TAX_AMOUNT = 'shipping_tax_amount';
+    const TAX_AMOUNT = 'tax_amount';
+    const BASE_TAX_AMOUNT = 'base_tax_amount';
+    const STORE_TO_ORDER_RATE = 'store_to_order_rate';
+    const BASE_SHIPPING_TAX_AMOUNT = 'base_shipping_tax_amount';
+    const BASE_DISCOUNT_AMOUNT = 'base_discount_amount';
+    const BASE_TO_ORDER_RATE = 'base_to_order_rate';
+    const GRAND_TOTAL = 'grand_total';
+    const SHIPPING_AMOUNT = 'shipping_amount';
+    const SUBTOTAL_INCL_TAX = 'subtotal_incl_tax';
+    const BASE_SUBTOTAL_INCL_TAX = 'base_subtotal_incl_tax';
+    const STORE_TO_BASE_RATE = 'store_to_base_rate';
+    const BASE_SHIPPING_AMOUNT = 'base_shipping_amount';
+    const TOTAL_QTY = 'total_qty';
+    const BASE_TO_GLOBAL_RATE = 'base_to_global_rate';
+    const SUBTOTAL = 'subtotal';
+    const BASE_SUBTOTAL = 'base_subtotal';
+    const DISCOUNT_AMOUNT = 'discount_amount';
+    const BILLING_ADDRESS_ID = 'billing_address_id';
+    const IS_USED_FOR_REFUND = 'is_used_for_refund';
+    const ORDER_ID = 'order_id';
+    const EMAIL_SENT = 'email_sent';
+    const CAN_VOID_FLAG = 'can_void_flag';
+    const STATE = 'state';
+    const SHIPPING_ADDRESS_ID = 'shipping_address_id';
+    const STORE_CURRENCY_CODE = 'store_currency_code';
+    const TRANSACTION_ID = 'transaction_id';
+    const ORDER_CURRENCY_CODE = 'order_currency_code';
+    const BASE_CURRENCY_CODE = 'base_currency_code';
+    const GLOBAL_CURRENCY_CODE = 'global_currency_code';
+    const INCREMENT_ID = 'increment_id';
+    const CREATED_AT = 'created_at';
+    const UPDATED_AT = 'updated_at';
+    const HIDDEN_TAX_AMOUNT = 'hidden_tax_amount';
+    const BASE_HIDDEN_TAX_AMOUNT = 'base_hidden_tax_amount';
+    const SHIPPING_HIDDEN_TAX_AMOUNT = 'shipping_hidden_tax_amount';
+    const BASE_SHIPPING_HIDDEN_TAX_AMNT = 'base_shipping_hidden_tax_amnt';
+    const SHIPPING_INCL_TAX = 'shipping_incl_tax';
+    const BASE_SHIPPING_INCL_TAX = 'base_shipping_incl_tax';
+    const BASE_TOTAL_REFUNDED = 'base_total_refunded';
+    const DISCOUNT_DESCRIPTION = 'discount_description';
+    const ITEMS = 'items';
+    const COMMENTS = 'comments';
+
+    /**
+     * Returns base_currency_code
+     *
+     * @return string
+     */
+    public function getBaseCurrencyCode()
+    {
+        return $this->_get(self::BASE_CURRENCY_CODE);
+    }
+
+    /**
+     * Returns base_discount_amount
+     *
+     * @return float
+     */
+    public function getBaseDiscountAmount()
+    {
+        return $this->_get(self::BASE_DISCOUNT_AMOUNT);
+    }
+
+    /**
+     * Returns base_grand_total
+     *
+     * @return float
+     */
+    public function getBaseGrandTotal()
+    {
+        return $this->_get(self::BASE_GRAND_TOTAL);
+    }
+
+    /**
+     * Returns base_hidden_tax_amount
+     *
+     * @return float
+     */
+    public function getBaseHiddenTaxAmount()
+    {
+        return $this->_get(self::BASE_HIDDEN_TAX_AMOUNT);
+    }
+
+    /**
+     * Returns base_shipping_amount
+     *
+     * @return float
+     */
+    public function getBaseShippingAmount()
+    {
+        return $this->_get(self::BASE_SHIPPING_AMOUNT);
+    }
+
+    /**
+     * Returns base_shipping_hidden_tax_amnt
+     *
+     * @return float
+     */
+    public function getBaseShippingHiddenTaxAmnt()
+    {
+        return $this->_get(self::BASE_SHIPPING_HIDDEN_TAX_AMNT);
+    }
+
+    /**
+     * Returns base_shipping_incl_tax
+     *
+     * @return float
+     */
+    public function getBaseShippingInclTax()
+    {
+        return $this->_get(self::BASE_SHIPPING_INCL_TAX);
+    }
+
+    /**
+     * Returns base_shipping_tax_amount
+     *
+     * @return float
+     */
+    public function getBaseShippingTaxAmount()
+    {
+        return $this->_get(self::BASE_SHIPPING_TAX_AMOUNT);
+    }
+
+    /**
+     * Returns base_subtotal
+     *
+     * @return float
+     */
+    public function getBaseSubtotal()
+    {
+        return $this->_get(self::BASE_SUBTOTAL);
+    }
+
+    /**
+     * Returns base_subtotal_incl_tax
+     *
+     * @return float
+     */
+    public function getBaseSubtotalInclTax()
+    {
+        return $this->_get(self::BASE_SUBTOTAL_INCL_TAX);
+    }
+
+    /**
+     * Returns base_tax_amount
+     *
+     * @return float
+     */
+    public function getBaseTaxAmount()
+    {
+        return $this->_get(self::BASE_TAX_AMOUNT);
+    }
+
+    /**
+     * Returns base_total_refunded
+     *
+     * @return float
+     */
+    public function getBaseTotalRefunded()
+    {
+        return $this->_get(self::BASE_TOTAL_REFUNDED);
+    }
+
+    /**
+     * Returns base_to_global_rate
+     *
+     * @return float
+     */
+    public function getBaseToGlobalRate()
+    {
+        return $this->_get(self::BASE_TO_GLOBAL_RATE);
+    }
+
+    /**
+     * Returns base_to_order_rate
+     *
+     * @return float
+     */
+    public function getBaseToOrderRate()
+    {
+        return $this->_get(self::BASE_TO_ORDER_RATE);
+    }
+
+    /**
+     * Returns billing_address_id
+     *
+     * @return int
+     */
+    public function getBillingAddressId()
+    {
+        return $this->_get(self::BILLING_ADDRESS_ID);
+    }
+
+    /**
+     * Returns can_void_flag
+     *
+     * @return int
+     */
+    public function getCanVoidFlag()
+    {
+        return $this->_get(self::CAN_VOID_FLAG);
+    }
+
+    /**
+     * Returns created_at
+     *
+     * @return string
+     */
+    public function getCreatedAt()
+    {
+        return $this->_get(self::CREATED_AT);
+    }
+
+    /**
+     * Returns discount_amount
+     *
+     * @return float
+     */
+    public function getDiscountAmount()
+    {
+        return $this->_get(self::DISCOUNT_AMOUNT);
+    }
+
+    /**
+     * Returns discount_description
+     *
+     * @return string
+     */
+    public function getDiscountDescription()
+    {
+        return $this->_get(self::DISCOUNT_DESCRIPTION);
+    }
+
+    /**
+     * Returns email_sent
+     *
+     * @return int
+     */
+    public function getEmailSent()
+    {
+        return $this->_get(self::EMAIL_SENT);
+    }
+
+    /**
+     * Returns entity_id
+     *
+     * @return int
+     */
+    public function getEntityId()
+    {
+        return $this->_get(self::ENTITY_ID);
+    }
+
+    /**
+     * Returns global_currency_code
+     *
+     * @return string
+     */
+    public function getGlobalCurrencyCode()
+    {
+        return $this->_get(self::GLOBAL_CURRENCY_CODE);
+    }
+
+    /**
+     * Returns grand_total
+     *
+     * @return float
+     */
+    public function getGrandTotal()
+    {
+        return $this->_get(self::GRAND_TOTAL);
+    }
+
+    /**
+     * Returns hidden_tax_amount
+     *
+     * @return float
+     */
+    public function getHiddenTaxAmount()
+    {
+        return $this->_get(self::HIDDEN_TAX_AMOUNT);
+    }
+
+    /**
+     * Returns increment_id
+     *
+     * @return string
+     */
+    public function getIncrementId()
+    {
+        return $this->_get(self::INCREMENT_ID);
+    }
+
+    /**
+     * Returns is_used_for_refund
+     *
+     * @return int
+     */
+    public function getIsUsedForRefund()
+    {
+        return $this->_get(self::IS_USED_FOR_REFUND);
+    }
+
+    /**
+     * Returns order_currency_code
+     *
+     * @return string
+     */
+    public function getOrderCurrencyCode()
+    {
+        return $this->_get(self::ORDER_CURRENCY_CODE);
+    }
+
+    /**
+     * Returns order_id
+     *
+     * @return int
+     */
+    public function getOrderId()
+    {
+        return $this->_get(self::ORDER_ID);
+    }
+
+    /**
+     * Returns shipping_address_id
+     *
+     * @return int
+     */
+    public function getShippingAddressId()
+    {
+        return $this->_get(self::SHIPPING_ADDRESS_ID);
+    }
+
+    /**
+     * Returns shipping_amount
+     *
+     * @return float
+     */
+    public function getShippingAmount()
+    {
+        return $this->_get(self::SHIPPING_AMOUNT);
+    }
+
+    /**
+     * Returns shipping_hidden_tax_amount
+     *
+     * @return float
+     */
+    public function getShippingHiddenTaxAmount()
+    {
+        return $this->_get(self::SHIPPING_HIDDEN_TAX_AMOUNT);
+    }
+
+    /**
+     * Returns shipping_incl_tax
+     *
+     * @return float
+     */
+    public function getShippingInclTax()
+    {
+        return $this->_get(self::SHIPPING_INCL_TAX);
+    }
+
+    /**
+     * Returns shipping_tax_amount
+     *
+     * @return float
+     */
+    public function getShippingTaxAmount()
+    {
+        return $this->_get(self::SHIPPING_TAX_AMOUNT);
+    }
+
+    /**
+     * Returns state
+     *
+     * @return int
+     */
+    public function getState()
+    {
+        return $this->_get(self::STATE);
+    }
+
+    /**
+     * Returns store_currency_code
+     *
+     * @return string
+     */
+    public function getStoreCurrencyCode()
+    {
+        return $this->_get(self::STORE_CURRENCY_CODE);
+    }
+
+    /**
+     * Returns store_id
+     *
+     * @return int
+     */
+    public function getStoreId()
+    {
+        return $this->_get(self::STORE_ID);
+    }
+
+    /**
+     * Returns store_to_base_rate
+     *
+     * @return float
+     */
+    public function getStoreToBaseRate()
+    {
+        return $this->_get(self::STORE_TO_BASE_RATE);
+    }
+
+    /**
+     * Returns store_to_order_rate
+     *
+     * @return float
+     */
+    public function getStoreToOrderRate()
+    {
+        return $this->_get(self::STORE_TO_ORDER_RATE);
+    }
+
+    /**
+     * Returns subtotal
+     *
+     * @return float
+     */
+    public function getSubtotal()
+    {
+        return $this->_get(self::SUBTOTAL);
+    }
+
+    /**
+     * Returns subtotal_incl_tax
+     *
+     * @return float
+     */
+    public function getSubtotalInclTax()
+    {
+        return $this->_get(self::SUBTOTAL_INCL_TAX);
+    }
+
+    /**
+     * Returns tax_amount
+     *
+     * @return float
+     */
+    public function getTaxAmount()
+    {
+        return $this->_get(self::TAX_AMOUNT);
+    }
+
+    /**
+     * Returns total_qty
+     *
+     * @return float
+     */
+    public function getTotalQty()
+    {
+        return $this->_get(self::TOTAL_QTY);
+    }
+
+    /**
+     * Returns transaction_id
+     *
+     * @return string
+     */
+    public function getTransactionId()
+    {
+        return $this->_get(self::TRANSACTION_ID);
+    }
+
+    /**
+     * Returns updated_at
+     *
+     * @return string
+     */
+    public function getUpdatedAt()
+    {
+        return $this->_get(self::UPDATED_AT);
+    }
+
+    /**
+     * Returns invoice items
+     *
+     * @return InvoiceItem[]
+     */
+    public function getItems()
+    {
+        return $this->_get(self::ITEMS);
+    }
+
+    /**
+     * Return invoice comments
+     *
+     * @return Comment[]
+     */
+    public function getComments()
+    {
+        return $this->_get(self::COMMENTS);
+    }
+}
diff --git a/app/code/Magento/Sales/Service/V1/Data/InvoiceItem.php b/app/code/Magento/Sales/Service/V1/Data/InvoiceItem.php
new file mode 100644
index 0000000000000000000000000000000000000000..dd3865fe5b9d31fd97e31a3c2f09fa36a441f82d
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/Data/InvoiceItem.php
@@ -0,0 +1,392 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Data;
+
+use Magento\Framework\Service\Data\AbstractObject as DataObject;
+
+/**
+ * Class InvoiceItem
+ */
+class InvoiceItem extends DataObject
+{
+    /**
+     * int
+     */
+    const ENTITY_ID = 'entity_id';
+
+    /**
+     * int
+     */
+    const PARENT_ID = 'parent_id';
+
+    /**
+     * float
+     */
+    const BASE_PRICE = 'base_price';
+
+    /**
+     * float
+     */
+    const TAX_AMOUNT = 'tax_amount';
+
+    /**
+     * float
+     */
+    const BASE_ROW_TOTAL = 'base_row_total';
+
+    /**
+     * float
+     */
+    const DISCOUNT_AMOUNT = 'discount_amount';
+
+    /**
+     * float
+     */
+    const ROW_TOTAL = 'row_total';
+
+    /**
+     * float
+     */
+    const BASE_DISCOUNT_AMOUNT = 'base_discount_amount';
+
+    /**
+     * float
+     */
+    const PRICE_INCL_TAX = 'price_incl_tax';
+
+    /**
+     * float
+     */
+    const BASE_TAX_AMOUNT = 'base_tax_amount';
+
+    /**
+     * float
+     */
+    const BASE_PRICE_INCL_TAX = 'base_price_incl_tax';
+
+    /**
+     * float
+     */
+    const QTY = 'qty';
+
+    /**
+     * float
+     */
+    const BASE_COST = 'base_cost';
+
+    /**
+     * float
+     */
+    const PRICE = 'price';
+
+    /**
+     * float
+     */
+    const BASE_ROW_TOTAL_INCL_TAX = 'base_row_total_incl_tax';
+
+    /**
+     * float
+     */
+    const ROW_TOTAL_INCL_TAX = 'row_total_incl_tax';
+
+    /**
+     * int
+     */
+    const PRODUCT_ID = 'product_id';
+
+    /**
+     * int
+     */
+    const ORDER_ITEM_ID = 'order_item_id';
+
+    /**
+     * string
+     */
+    const ADDITIONAL_DATA = 'additional_data';
+
+    /**
+     * string
+     */
+    const DESCRIPTION = 'description';
+
+    /**
+     * string
+     */
+    const SKU = 'sku';
+
+    /**
+     * string
+     */
+    const NAME = 'name';
+
+    /**
+     * float
+     */
+    const HIDDEN_TAX_AMOUNT = 'hidden_tax_amount';
+
+    /**
+     * float
+     */
+    const BASE_HIDDEN_TAX_AMOUNT = 'base_hidden_tax_amount';
+
+    /**
+     * Returns additional_data
+     *
+     * @return string
+     */
+    public function getAdditionalData()
+    {
+        return $this->_get(self::ADDITIONAL_DATA);
+    }
+
+    /**
+     * Returns base_cost
+     *
+     * @return float
+     */
+    public function getBaseCost()
+    {
+        return $this->_get(self::BASE_COST);
+    }
+
+    /**
+     * Returns base_discount_amount
+     *
+     * @return float
+     */
+    public function getBaseDiscountAmount()
+    {
+        return $this->_get(self::BASE_DISCOUNT_AMOUNT);
+    }
+
+    /**
+     * Returns base_hidden_tax_amount
+     *
+     * @return float
+     */
+    public function getBaseHiddenTaxAmount()
+    {
+        return $this->_get(self::BASE_HIDDEN_TAX_AMOUNT);
+    }
+
+    /**
+     * Returns base_price
+     *
+     * @return float
+     */
+    public function getBasePrice()
+    {
+        return $this->_get(self::BASE_PRICE);
+    }
+
+    /**
+     * Returns base_price_incl_tax
+     *
+     * @return float
+     */
+    public function getBasePriceInclTax()
+    {
+        return $this->_get(self::BASE_PRICE_INCL_TAX);
+    }
+
+    /**
+     * Returns base_row_total
+     *
+     * @return float
+     */
+    public function getBaseRowTotal()
+    {
+        return $this->_get(self::BASE_ROW_TOTAL);
+    }
+
+    /**
+     * Returns base_row_total_incl_tax
+     *
+     * @return float
+     */
+    public function getBaseRowTotalInclTax()
+    {
+        return $this->_get(self::BASE_ROW_TOTAL_INCL_TAX);
+    }
+
+    /**
+     * Returns base_tax_amount
+     *
+     * @return float
+     */
+    public function getBaseTaxAmount()
+    {
+        return $this->_get(self::BASE_TAX_AMOUNT);
+    }
+
+    /**
+     * Returns description
+     *
+     * @return string
+     */
+    public function getDescription()
+    {
+        return $this->_get(self::DESCRIPTION);
+    }
+
+    /**
+     * Returns discount_amount
+     *
+     * @return float
+     */
+    public function getDiscountAmount()
+    {
+        return $this->_get(self::DISCOUNT_AMOUNT);
+    }
+
+    /**
+     * Returns entity_id
+     *
+     * @return int
+     */
+    public function getEntityId()
+    {
+        return $this->_get(self::ENTITY_ID);
+    }
+
+    /**
+     * Returns hidden_tax_amount
+     *
+     * @return float
+     */
+    public function getHiddenTaxAmount()
+    {
+        return $this->_get(self::HIDDEN_TAX_AMOUNT);
+    }
+
+    /**
+     * Returns name
+     *
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->_get(self::NAME);
+    }
+
+    /**
+     * Returns order_item_id
+     *
+     * @return int
+     */
+    public function getOrderItemId()
+    {
+        return $this->_get(self::ORDER_ITEM_ID);
+    }
+
+    /**
+     * Returns parent_id
+     *
+     * @return int
+     */
+    public function getParentId()
+    {
+        return $this->_get(self::PARENT_ID);
+    }
+
+    /**
+     * Returns price
+     *
+     * @return float
+     */
+    public function getPrice()
+    {
+        return $this->_get(self::PRICE);
+    }
+
+    /**
+     * Returns price_incl_tax
+     *
+     * @return float
+     */
+    public function getPriceInclTax()
+    {
+        return $this->_get(self::PRICE_INCL_TAX);
+    }
+
+    /**
+     * Returns product_id
+     *
+     * @return int
+     */
+    public function getProductId()
+    {
+        return $this->_get(self::PRODUCT_ID);
+    }
+
+    /**
+     * Returns qty
+     *
+     * @return float
+     */
+    public function getQty()
+    {
+        return $this->_get(self::QTY);
+    }
+
+    /**
+     * Returns row_total
+     *
+     * @return float
+     */
+    public function getRowTotal()
+    {
+        return $this->_get(self::ROW_TOTAL);
+    }
+
+    /**
+     * Returns row_total_incl_tax
+     *
+     * @return float
+     */
+    public function getRowTotalInclTax()
+    {
+        return $this->_get(self::ROW_TOTAL_INCL_TAX);
+    }
+
+    /**
+     * Returns sku
+     *
+     * @return string
+     */
+    public function getSku()
+    {
+        return $this->_get(self::SKU);
+    }
+
+    /**
+     * Returns tax_amount
+     *
+     * @return float
+     */
+    public function getTaxAmount()
+    {
+        return $this->_get(self::TAX_AMOUNT);
+    }
+}
diff --git a/app/code/Magento/Sales/Service/V1/Data/Order.php b/app/code/Magento/Sales/Service/V1/Data/Order.php
new file mode 100644
index 0000000000000000000000000000000000000000..7205f8c6618976a0f4b1fd36acc80774793a95fb
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/Data/Order.php
@@ -0,0 +1,1542 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Data;
+
+use Magento\Framework\Service\Data\AbstractObject as DataObject;
+
+/**
+ * Class Order
+ */
+class Order extends DataObject
+{
+    const ENTITY_ID = 'entity_id';
+    const STATE = 'state';
+    const STATUS = 'status';
+    const COUPON_CODE = 'coupon_code';
+    const PROTECT_CODE = 'protect_code';
+    const SHIPPING_DESCRIPTION = 'shipping_description';
+    const IS_VIRTUAL = 'is_virtual';
+    const STORE_ID = 'store_id';
+    const CUSTOMER_ID = 'customer_id';
+    const BASE_DISCOUNT_AMOUNT = 'base_discount_amount';
+    const BASE_DISCOUNT_CANCELED = 'base_discount_canceled';
+    const BASE_DISCOUNT_INVOICED = 'base_discount_invoiced';
+    const BASE_DISCOUNT_REFUNDED = 'base_discount_refunded';
+    const BASE_GRAND_TOTAL = 'base_grand_total';
+    const BASE_SHIPPING_AMOUNT = 'base_shipping_amount';
+    const BASE_SHIPPING_CANCELED = 'base_shipping_canceled';
+    const BASE_SHIPPING_INVOICED = 'base_shipping_invoiced';
+    const BASE_SHIPPING_REFUNDED = 'base_shipping_refunded';
+    const BASE_SHIPPING_TAX_AMOUNT = 'base_shipping_tax_amount';
+    const BASE_SHIPPING_TAX_REFUNDED = 'base_shipping_tax_refunded';
+    const BASE_SUBTOTAL = 'base_subtotal';
+    const BASE_SUBTOTAL_CANCELED = 'base_subtotal_canceled';
+    const BASE_SUBTOTAL_INVOICED = 'base_subtotal_invoiced';
+    const BASE_SUBTOTAL_REFUNDED = 'base_subtotal_refunded';
+    const BASE_TAX_AMOUNT = 'base_tax_amount';
+    const BASE_TAX_CANCELED = 'base_tax_canceled';
+    const BASE_TAX_INVOICED = 'base_tax_invoiced';
+    const BASE_TAX_REFUNDED = 'base_tax_refunded';
+    const BASE_TO_GLOBAL_RATE = 'base_to_global_rate';
+    const BASE_TO_ORDER_RATE = 'base_to_order_rate';
+    const BASE_TOTAL_CANCELED = 'base_total_canceled';
+    const BASE_TOTAL_INVOICED = 'base_total_invoiced';
+    const BASE_TOTAL_INVOICED_COST = 'base_total_invoiced_cost';
+    const BASE_TOTAL_OFFLINE_REFUNDED = 'base_total_offline_refunded';
+    const BASE_TOTAL_ONLINE_REFUNDED = 'base_total_online_refunded';
+    const BASE_TOTAL_PAID = 'base_total_paid';
+    const BASE_TOTAL_QTY_ORDERED = 'base_total_qty_ordered';
+    const BASE_TOTAL_REFUNDED = 'base_total_refunded';
+    const DISCOUNT_AMOUNT = 'discount_amount';
+    const DISCOUNT_CANCELED = 'discount_canceled';
+    const DISCOUNT_INVOICED = 'discount_invoiced';
+    const DISCOUNT_REFUNDED = 'discount_refunded';
+    const GRAND_TOTAL = 'grand_total';
+    const SHIPPING_AMOUNT = 'shipping_amount';
+    const SHIPPING_CANCELED = 'shipping_canceled';
+    const SHIPPING_INVOICED = 'shipping_invoiced';
+    const SHIPPING_REFUNDED = 'shipping_refunded';
+    const SHIPPING_TAX_AMOUNT = 'shipping_tax_amount';
+    const SHIPPING_TAX_REFUNDED = 'shipping_tax_refunded';
+    const STORE_TO_BASE_RATE = 'store_to_base_rate';
+    const STORE_TO_ORDER_RATE = 'store_to_order_rate';
+    const SUBTOTAL = 'subtotal';
+    const SUBTOTAL_CANCELED = 'subtotal_canceled';
+    const SUBTOTAL_INVOICED = 'subtotal_invoiced';
+    const SUBTOTAL_REFUNDED = 'subtotal_refunded';
+    const TAX_AMOUNT = 'tax_amount';
+    const TAX_CANCELED = 'tax_canceled';
+    const TAX_INVOICED = 'tax_invoiced';
+    const TAX_REFUNDED = 'tax_refunded';
+    const TOTAL_CANCELED = 'total_canceled';
+    const TOTAL_INVOICED = 'total_invoiced';
+    const TOTAL_OFFLINE_REFUNDED = 'total_offline_refunded';
+    const TOTAL_ONLINE_REFUNDED = 'total_online_refunded';
+    const TOTAL_PAID = 'total_paid';
+    const TOTAL_QTY_ORDERED = 'total_qty_ordered';
+    const TOTAL_REFUNDED = 'total_refunded';
+    const CAN_SHIP_PARTIALLY = 'can_ship_partially';
+    const CAN_SHIP_PARTIALLY_ITEM = 'can_ship_partially_item';
+    const CUSTOMER_IS_GUEST = 'customer_is_guest';
+    const CUSTOMER_NOTE_NOTIFY = 'customer_note_notify';
+    const BILLING_ADDRESS_ID = 'billing_address_id';
+    const CUSTOMER_GROUP_ID = 'customer_group_id';
+    const EDIT_INCREMENT = 'edit_increment';
+    const EMAIL_SENT = 'email_sent';
+    const FORCED_SHIPMENT_WITH_INVOICE = 'forced_shipment_with_invoice';
+    const PAYMENT_AUTH_EXPIRATION = 'payment_auth_expiration';
+    const QUOTE_ADDRESS_ID = 'quote_address_id';
+    const QUOTE_ID = 'quote_id';
+    const SHIPPING_ADDRESS_ID = 'shipping_address_id';
+    const ADJUSTMENT_NEGATIVE = 'adjustment_negative';
+    const ADJUSTMENT_POSITIVE = 'adjustment_positive';
+    const BASE_ADJUSTMENT_NEGATIVE = 'base_adjustment_negative';
+    const BASE_ADJUSTMENT_POSITIVE = 'base_adjustment_positive';
+    const BASE_SHIPPING_DISCOUNT_AMOUNT = 'base_shipping_discount_amount';
+    const BASE_SUBTOTAL_INCL_TAX = 'base_subtotal_incl_tax';
+    const BASE_TOTAL_DUE = 'base_total_due';
+    const PAYMENT_AUTHORIZATION_AMOUNT = 'payment_authorization_amount';
+    const SHIPPING_DISCOUNT_AMOUNT = 'shipping_discount_amount';
+    const SUBTOTAL_INCL_TAX = 'subtotal_incl_tax';
+    const TOTAL_DUE = 'total_due';
+    const WEIGHT = 'weight';
+    const CUSTOMER_DOB = 'customer_dob';
+    const INCREMENT_ID = 'increment_id';
+    const APPLIED_RULE_IDS = 'applied_rule_ids';
+    const BASE_CURRENCY_CODE = 'base_currency_code';
+    const CUSTOMER_EMAIL = 'customer_email';
+    const CUSTOMER_FIRSTNAME = 'customer_firstname';
+    const CUSTOMER_LASTNAME = 'customer_lastname';
+    const CUSTOMER_MIDDLENAME = 'customer_middlename';
+    const CUSTOMER_PREFIX = 'customer_prefix';
+    const CUSTOMER_SUFFIX = 'customer_suffix';
+    const CUSTOMER_TAXVAT = 'customer_taxvat';
+    const DISCOUNT_DESCRIPTION = 'discount_description';
+    const EXT_CUSTOMER_ID = 'ext_customer_id';
+    const EXT_ORDER_ID = 'ext_order_id';
+    const GLOBAL_CURRENCY_CODE = 'global_currency_code';
+    const HOLD_BEFORE_STATE = 'hold_before_state';
+    const HOLD_BEFORE_STATUS = 'hold_before_status';
+    const ORDER_CURRENCY_CODE = 'order_currency_code';
+    const ORIGINAL_INCREMENT_ID = 'original_increment_id';
+    const RELATION_CHILD_ID = 'relation_child_id';
+    const RELATION_CHILD_REAL_ID = 'relation_child_real_id';
+    const RELATION_PARENT_ID = 'relation_parent_id';
+    const RELATION_PARENT_REAL_ID = 'relation_parent_real_id';
+    const REMOTE_IP = 'remote_ip';
+    const SHIPPING_METHOD = 'shipping_method';
+    const STORE_CURRENCY_CODE = 'store_currency_code';
+    const STORE_NAME = 'store_name';
+    const X_FORWARDED_FOR = 'x_forwarded_for';
+    const CUSTOMER_NOTE = 'customer_note';
+    const CREATED_AT = 'created_at';
+    const UPDATED_AT = 'updated_at';
+    const TOTAL_ITEM_COUNT = 'total_item_count';
+    const CUSTOMER_GENDER = 'customer_gender';
+    const HIDDEN_TAX_AMOUNT = 'hidden_tax_amount';
+    const BASE_HIDDEN_TAX_AMOUNT = 'base_hidden_tax_amount';
+    const SHIPPING_HIDDEN_TAX_AMOUNT = 'shipping_hidden_tax_amount';
+    const BASE_SHIPPING_HIDDEN_TAX_AMNT = 'base_shipping_hidden_tax_amnt';
+    const HIDDEN_TAX_INVOICED = 'hidden_tax_invoiced';
+    const BASE_HIDDEN_TAX_INVOICED = 'base_hidden_tax_invoiced';
+    const HIDDEN_TAX_REFUNDED = 'hidden_tax_refunded';
+    const BASE_HIDDEN_TAX_REFUNDED = 'base_hidden_tax_refunded';
+    const SHIPPING_INCL_TAX = 'shipping_incl_tax';
+    const BASE_SHIPPING_INCL_TAX = 'base_shipping_incl_tax';
+    const ITEMS = 'items';
+    const BILLING_ADDRESS = 'billing_address';
+    const SHIPPING_ADDRESS = 'shipping_address';
+    const PAYMENTS = 'payments';
+    /**
+     * Returns adjustment_negative
+     *
+     * @return float
+     */
+    public function getAdjustmentNegative()
+    {
+        return $this->_get(self::ADJUSTMENT_NEGATIVE);
+    }
+
+    /**
+     * Returns adjustment_positive
+     *
+     * @return float
+     */
+    public function getAdjustmentPositive()
+    {
+        return $this->_get(self::ADJUSTMENT_POSITIVE);
+    }
+
+    /**
+     * Returns applied_rule_ids
+     *
+     * @return string
+     */
+    public function getAppliedRuleIds()
+    {
+        return $this->_get(self::APPLIED_RULE_IDS);
+    }
+
+    /**
+     * Returns base_adjustment_negative
+     *
+     * @return float
+     */
+    public function getBaseAdjustmentNegative()
+    {
+        return $this->_get(self::BASE_ADJUSTMENT_NEGATIVE);
+    }
+
+    /**
+     * Returns base_adjustment_positive
+     *
+     * @return float
+     */
+    public function getBaseAdjustmentPositive()
+    {
+        return $this->_get(self::BASE_ADJUSTMENT_POSITIVE);
+    }
+
+    /**
+     * Returns base_currency_code
+     *
+     * @return string
+     */
+    public function getBaseCurrencyCode()
+    {
+        return $this->_get(self::BASE_CURRENCY_CODE);
+    }
+
+    /**
+     * Returns base_discount_amount
+     *
+     * @return float
+     */
+    public function getBaseDiscountAmount()
+    {
+        return $this->_get(self::BASE_DISCOUNT_AMOUNT);
+    }
+
+    /**
+     * Returns base_discount_canceled
+     *
+     * @return float
+     */
+    public function getBaseDiscountCanceled()
+    {
+        return $this->_get(self::BASE_DISCOUNT_CANCELED);
+    }
+
+    /**
+     * Returns base_discount_invoiced
+     *
+     * @return float
+     */
+    public function getBaseDiscountInvoiced()
+    {
+        return $this->_get(self::BASE_DISCOUNT_INVOICED);
+    }
+
+    /**
+     * Returns base_discount_refunded
+     *
+     * @return float
+     */
+    public function getBaseDiscountRefunded()
+    {
+        return $this->_get(self::BASE_DISCOUNT_REFUNDED);
+    }
+
+    /**
+     * Returns base_grand_total
+     *
+     * @return float
+     */
+    public function getBaseGrandTotal()
+    {
+        return $this->_get(self::BASE_GRAND_TOTAL);
+    }
+
+    /**
+     * Returns base_hidden_tax_amount
+     *
+     * @return float
+     */
+    public function getBaseHiddenTaxAmount()
+    {
+        return $this->_get(self::BASE_HIDDEN_TAX_AMOUNT);
+    }
+
+    /**
+     * Returns base_hidden_tax_invoiced
+     *
+     * @return float
+     */
+    public function getBaseHiddenTaxInvoiced()
+    {
+        return $this->_get(self::BASE_HIDDEN_TAX_INVOICED);
+    }
+
+    /**
+     * Returns base_hidden_tax_refunded
+     *
+     * @return float
+     */
+    public function getBaseHiddenTaxRefunded()
+    {
+        return $this->_get(self::BASE_HIDDEN_TAX_REFUNDED);
+    }
+
+    /**
+     * Returns base_shipping_amount
+     *
+     * @return float
+     */
+    public function getBaseShippingAmount()
+    {
+        return $this->_get(self::BASE_SHIPPING_AMOUNT);
+    }
+
+    /**
+     * Returns base_shipping_canceled
+     *
+     * @return float
+     */
+    public function getBaseShippingCanceled()
+    {
+        return $this->_get(self::BASE_SHIPPING_CANCELED);
+    }
+
+    /**
+     * Returns base_shipping_discount_amount
+     *
+     * @return float
+     */
+    public function getBaseShippingDiscountAmount()
+    {
+        return $this->_get(self::BASE_SHIPPING_DISCOUNT_AMOUNT);
+    }
+
+    /**
+     * Returns base_shipping_hidden_tax_amnt
+     *
+     * @return float
+     */
+    public function getBaseShippingHiddenTaxAmnt()
+    {
+        return $this->_get(self::BASE_SHIPPING_HIDDEN_TAX_AMNT);
+    }
+
+    /**
+     * Returns base_shipping_incl_tax
+     *
+     * @return float
+     */
+    public function getBaseShippingInclTax()
+    {
+        return $this->_get(self::BASE_SHIPPING_INCL_TAX);
+    }
+
+    /**
+     * Returns base_shipping_invoiced
+     *
+     * @return float
+     */
+    public function getBaseShippingInvoiced()
+    {
+        return $this->_get(self::BASE_SHIPPING_INVOICED);
+    }
+
+    /**
+     * Returns base_shipping_refunded
+     *
+     * @return float
+     */
+    public function getBaseShippingRefunded()
+    {
+        return $this->_get(self::BASE_SHIPPING_REFUNDED);
+    }
+
+    /**
+     * Returns base_shipping_tax_amount
+     *
+     * @return float
+     */
+    public function getBaseShippingTaxAmount()
+    {
+        return $this->_get(self::BASE_SHIPPING_TAX_AMOUNT);
+    }
+
+    /**
+     * Returns base_shipping_tax_refunded
+     *
+     * @return float
+     */
+    public function getBaseShippingTaxRefunded()
+    {
+        return $this->_get(self::BASE_SHIPPING_TAX_REFUNDED);
+    }
+
+    /**
+     * Returns base_subtotal
+     *
+     * @return float
+     */
+    public function getBaseSubtotal()
+    {
+        return $this->_get(self::BASE_SUBTOTAL);
+    }
+
+    /**
+     * Returns base_subtotal_canceled
+     *
+     * @return float
+     */
+    public function getBaseSubtotalCanceled()
+    {
+        return $this->_get(self::BASE_SUBTOTAL_CANCELED);
+    }
+
+    /**
+     * Returns base_subtotal_incl_tax
+     *
+     * @return float
+     */
+    public function getBaseSubtotalInclTax()
+    {
+        return $this->_get(self::BASE_SUBTOTAL_INCL_TAX);
+    }
+
+    /**
+     * Returns base_subtotal_invoiced
+     *
+     * @return float
+     */
+    public function getBaseSubtotalInvoiced()
+    {
+        return $this->_get(self::BASE_SUBTOTAL_INVOICED);
+    }
+
+    /**
+     * Returns base_subtotal_refunded
+     *
+     * @return float
+     */
+    public function getBaseSubtotalRefunded()
+    {
+        return $this->_get(self::BASE_SUBTOTAL_REFUNDED);
+    }
+
+    /**
+     * Returns base_tax_amount
+     *
+     * @return float
+     */
+    public function getBaseTaxAmount()
+    {
+        return $this->_get(self::BASE_TAX_AMOUNT);
+    }
+
+    /**
+     * Returns base_tax_canceled
+     *
+     * @return float
+     */
+    public function getBaseTaxCanceled()
+    {
+        return $this->_get(self::BASE_TAX_CANCELED);
+    }
+
+    /**
+     * Returns base_tax_invoiced
+     *
+     * @return float
+     */
+    public function getBaseTaxInvoiced()
+    {
+        return $this->_get(self::BASE_TAX_INVOICED);
+    }
+
+    /**
+     * Returns base_tax_refunded
+     *
+     * @return float
+     */
+    public function getBaseTaxRefunded()
+    {
+        return $this->_get(self::BASE_TAX_REFUNDED);
+    }
+
+    /**
+     * Returns base_total_canceled
+     *
+     * @return float
+     */
+    public function getBaseTotalCanceled()
+    {
+        return $this->_get(self::BASE_TOTAL_CANCELED);
+    }
+
+    /**
+     * Returns base_total_due
+     *
+     * @return float
+     */
+    public function getBaseTotalDue()
+    {
+        return $this->_get(self::BASE_TOTAL_DUE);
+    }
+
+    /**
+     * Returns base_total_invoiced
+     *
+     * @return float
+     */
+    public function getBaseTotalInvoiced()
+    {
+        return $this->_get(self::BASE_TOTAL_INVOICED);
+    }
+
+    /**
+     * Returns base_total_invoiced_cost
+     *
+     * @return float
+     */
+    public function getBaseTotalInvoicedCost()
+    {
+        return $this->_get(self::BASE_TOTAL_INVOICED_COST);
+    }
+
+    /**
+     * Returns base_total_offline_refunded
+     *
+     * @return float
+     */
+    public function getBaseTotalOfflineRefunded()
+    {
+        return $this->_get(self::BASE_TOTAL_OFFLINE_REFUNDED);
+    }
+
+    /**
+     * Returns base_total_online_refunded
+     *
+     * @return float
+     */
+    public function getBaseTotalOnlineRefunded()
+    {
+        return $this->_get(self::BASE_TOTAL_ONLINE_REFUNDED);
+    }
+
+    /**
+     * Returns base_total_paid
+     *
+     * @return float
+     */
+    public function getBaseTotalPaid()
+    {
+        return $this->_get(self::BASE_TOTAL_PAID);
+    }
+
+    /**
+     * Returns base_total_qty_ordered
+     *
+     * @return float
+     */
+    public function getBaseTotalQtyOrdered()
+    {
+        return $this->_get(self::BASE_TOTAL_QTY_ORDERED);
+    }
+
+    /**
+     * Returns base_total_refunded
+     *
+     * @return float
+     */
+    public function getBaseTotalRefunded()
+    {
+        return $this->_get(self::BASE_TOTAL_REFUNDED);
+    }
+
+    /**
+     * Returns base_to_global_rate
+     *
+     * @return float
+     */
+    public function getBaseToGlobalRate()
+    {
+        return $this->_get(self::BASE_TO_GLOBAL_RATE);
+    }
+
+    /**
+     * Returns base_to_order_rate
+     *
+     * @return float
+     */
+    public function getBaseToOrderRate()
+    {
+        return $this->_get(self::BASE_TO_ORDER_RATE);
+    }
+
+    /**
+     * Returns billing_address_id
+     *
+     * @return int
+     */
+    public function getBillingAddressId()
+    {
+        return $this->_get(self::BILLING_ADDRESS_ID);
+    }
+
+    /**
+     * Returns can_ship_partially
+     *
+     * @return int
+     */
+    public function getCanShipPartially()
+    {
+        return $this->_get(self::CAN_SHIP_PARTIALLY);
+    }
+
+    /**
+     * Returns can_ship_partially_item
+     *
+     * @return int
+     */
+    public function getCanShipPartiallyItem()
+    {
+        return $this->_get(self::CAN_SHIP_PARTIALLY_ITEM);
+    }
+
+    /**
+     * Returns coupon_code
+     *
+     * @return string
+     */
+    public function getCouponCode()
+    {
+        return $this->_get(self::COUPON_CODE);
+    }
+
+    /**
+     * Returns created_at
+     *
+     * @return string
+     */
+    public function getCreatedAt()
+    {
+        return $this->_get(self::CREATED_AT);
+    }
+
+    /**
+     * Returns customer_dob
+     *
+     * @return string
+     */
+    public function getCustomerDob()
+    {
+        return $this->_get(self::CUSTOMER_DOB);
+    }
+
+    /**
+     * Returns customer_email
+     *
+     * @return string
+     */
+    public function getCustomerEmail()
+    {
+        return $this->_get(self::CUSTOMER_EMAIL);
+    }
+
+    /**
+     * Returns customer_firstname
+     *
+     * @return string
+     */
+    public function getCustomerFirstname()
+    {
+        return $this->_get(self::CUSTOMER_FIRSTNAME);
+    }
+
+    /**
+     * Returns customer_gender
+     *
+     * @return int
+     */
+    public function getCustomerGender()
+    {
+        return $this->_get(self::CUSTOMER_GENDER);
+    }
+
+    /**
+     * Returns customer_group_id
+     *
+     * @return int
+     */
+    public function getCustomerGroupId()
+    {
+        return $this->_get(self::CUSTOMER_GROUP_ID);
+    }
+
+    /**
+     * Returns customer_id
+     *
+     * @return int
+     */
+    public function getCustomerId()
+    {
+        return $this->_get(self::CUSTOMER_ID);
+    }
+
+    /**
+     * Returns customer_is_guest
+     *
+     * @return int
+     */
+    public function getCustomerIsGuest()
+    {
+        return $this->_get(self::CUSTOMER_IS_GUEST);
+    }
+
+    /**
+     * Returns customer_lastname
+     *
+     * @return string
+     */
+    public function getCustomerLastname()
+    {
+        return $this->_get(self::CUSTOMER_LASTNAME);
+    }
+
+    /**
+     * Returns customer_middlename
+     *
+     * @return string
+     */
+    public function getCustomerMiddlename()
+    {
+        return $this->_get(self::CUSTOMER_MIDDLENAME);
+    }
+
+    /**
+     * Returns customer_note
+     *
+     * @return string
+     */
+    public function getCustomerNote()
+    {
+        return $this->_get(self::CUSTOMER_NOTE);
+    }
+
+    /**
+     * Returns customer_note_notify
+     *
+     * @return int
+     */
+    public function getCustomerNoteNotify()
+    {
+        return $this->_get(self::CUSTOMER_NOTE_NOTIFY);
+    }
+
+    /**
+     * Returns customer_prefix
+     *
+     * @return string
+     */
+    public function getCustomerPrefix()
+    {
+        return $this->_get(self::CUSTOMER_PREFIX);
+    }
+
+    /**
+     * Returns customer_suffix
+     *
+     * @return string
+     */
+    public function getCustomerSuffix()
+    {
+        return $this->_get(self::CUSTOMER_SUFFIX);
+    }
+
+    /**
+     * Returns customer_taxvat
+     *
+     * @return string
+     */
+    public function getCustomerTaxvat()
+    {
+        return $this->_get(self::CUSTOMER_TAXVAT);
+    }
+
+    /**
+     * Returns discount_amount
+     *
+     * @return float
+     */
+    public function getDiscountAmount()
+    {
+        return $this->_get(self::DISCOUNT_AMOUNT);
+    }
+
+    /**
+     * Returns discount_canceled
+     *
+     * @return float
+     */
+    public function getDiscountCanceled()
+    {
+        return $this->_get(self::DISCOUNT_CANCELED);
+    }
+
+    /**
+     * Returns discount_description
+     *
+     * @return string
+     */
+    public function getDiscountDescription()
+    {
+        return $this->_get(self::DISCOUNT_DESCRIPTION);
+    }
+
+    /**
+     * Returns discount_invoiced
+     *
+     * @return float
+     */
+    public function getDiscountInvoiced()
+    {
+        return $this->_get(self::DISCOUNT_INVOICED);
+    }
+
+    /**
+     * Returns discount_refunded
+     *
+     * @return float
+     */
+    public function getDiscountRefunded()
+    {
+        return $this->_get(self::DISCOUNT_REFUNDED);
+    }
+
+    /**
+     * Returns edit_increment
+     *
+     * @return int
+     */
+    public function getEditIncrement()
+    {
+        return $this->_get(self::EDIT_INCREMENT);
+    }
+
+    /**
+     * Returns email_sent
+     *
+     * @return int
+     */
+    public function getEmailSent()
+    {
+        return $this->_get(self::EMAIL_SENT);
+    }
+
+    /**
+     * Returns entity_id
+     *
+     * @return int
+     */
+    public function getEntityId()
+    {
+        return $this->_get(self::ENTITY_ID);
+    }
+
+    /**
+     * Returns ext_customer_id
+     *
+     * @return string
+     */
+    public function getExtCustomerId()
+    {
+        return $this->_get(self::EXT_CUSTOMER_ID);
+    }
+
+    /**
+     * Returns ext_order_id
+     *
+     * @return string
+     */
+    public function getExtOrderId()
+    {
+        return $this->_get(self::EXT_ORDER_ID);
+    }
+
+    /**
+     * Returns forced_shipment_with_invoice
+     *
+     * @return int
+     */
+    public function getForcedShipmentWithInvoice()
+    {
+        return $this->_get(self::FORCED_SHIPMENT_WITH_INVOICE);
+    }
+
+    /**
+     * Returns global_currency_code
+     *
+     * @return string
+     */
+    public function getGlobalCurrencyCode()
+    {
+        return $this->_get(self::GLOBAL_CURRENCY_CODE);
+    }
+
+    /**
+     * Returns grand_total
+     *
+     * @return float
+     */
+    public function getGrandTotal()
+    {
+        return $this->_get(self::GRAND_TOTAL);
+    }
+
+    /**
+     * Returns hidden_tax_amount
+     *
+     * @return float
+     */
+    public function getHiddenTaxAmount()
+    {
+        return $this->_get(self::HIDDEN_TAX_AMOUNT);
+    }
+
+    /**
+     * Returns hidden_tax_invoiced
+     *
+     * @return float
+     */
+    public function getHiddenTaxInvoiced()
+    {
+        return $this->_get(self::HIDDEN_TAX_INVOICED);
+    }
+
+    /**
+     * Returns hidden_tax_refunded
+     *
+     * @return float
+     */
+    public function getHiddenTaxRefunded()
+    {
+        return $this->_get(self::HIDDEN_TAX_REFUNDED);
+    }
+
+    /**
+     * Returns hold_before_state
+     *
+     * @return string
+     */
+    public function getHoldBeforeState()
+    {
+        return $this->_get(self::HOLD_BEFORE_STATE);
+    }
+
+    /**
+     * Returns hold_before_status
+     *
+     * @return string
+     */
+    public function getHoldBeforeStatus()
+    {
+        return $this->_get(self::HOLD_BEFORE_STATUS);
+    }
+
+    /**
+     * Returns increment_id
+     *
+     * @return string
+     */
+    public function getIncrementId()
+    {
+        return $this->_get(self::INCREMENT_ID);
+    }
+
+    /**
+     * Returns is_virtual
+     *
+     * @return int
+     */
+    public function getIsVirtual()
+    {
+        return $this->_get(self::IS_VIRTUAL);
+    }
+
+    /**
+     * Returns order_currency_code
+     *
+     * @return string
+     */
+    public function getOrderCurrencyCode()
+    {
+        return $this->_get(self::ORDER_CURRENCY_CODE);
+    }
+
+    /**
+     * Returns original_increment_id
+     *
+     * @return string
+     */
+    public function getOriginalIncrementId()
+    {
+        return $this->_get(self::ORIGINAL_INCREMENT_ID);
+    }
+
+    /**
+     * Returns payment_authorization_amount
+     *
+     * @return float
+     */
+    public function getPaymentAuthorizationAmount()
+    {
+        return $this->_get(self::PAYMENT_AUTHORIZATION_AMOUNT);
+    }
+
+    /**
+     * Returns payment_auth_expiration
+     *
+     * @return int
+     */
+    public function getPaymentAuthExpiration()
+    {
+        return $this->_get(self::PAYMENT_AUTH_EXPIRATION);
+    }
+
+    /**
+     * Returns protect_code
+     *
+     * @return string
+     */
+    public function getProtectCode()
+    {
+        return $this->_get(self::PROTECT_CODE);
+    }
+
+    /**
+     * Returns quote_address_id
+     *
+     * @return int
+     */
+    public function getQuoteAddressId()
+    {
+        return $this->_get(self::QUOTE_ADDRESS_ID);
+    }
+
+    /**
+     * Returns quote_id
+     *
+     * @return int
+     */
+    public function getQuoteId()
+    {
+        return $this->_get(self::QUOTE_ID);
+    }
+
+    /**
+     * Returns relation_child_id
+     *
+     * @return string
+     */
+    public function getRelationChildId()
+    {
+        return $this->_get(self::RELATION_CHILD_ID);
+    }
+
+    /**
+     * Returns relation_child_real_id
+     *
+     * @return string
+     */
+    public function getRelationChildRealId()
+    {
+        return $this->_get(self::RELATION_CHILD_REAL_ID);
+    }
+
+    /**
+     * Returns relation_parent_id
+     *
+     * @return string
+     */
+    public function getRelationParentId()
+    {
+        return $this->_get(self::RELATION_PARENT_ID);
+    }
+
+    /**
+     * Returns relation_parent_real_id
+     *
+     * @return string
+     */
+    public function getRelationParentRealId()
+    {
+        return $this->_get(self::RELATION_PARENT_REAL_ID);
+    }
+
+    /**
+     * Returns remote_ip
+     *
+     * @return string
+     */
+    public function getRemoteIp()
+    {
+        return $this->_get(self::REMOTE_IP);
+    }
+
+    /**
+     * Returns shipping_address_id
+     *
+     * @return int
+     */
+    public function getShippingAddressId()
+    {
+        return $this->_get(self::SHIPPING_ADDRESS_ID);
+    }
+
+    /**
+     * Returns shipping_amount
+     *
+     * @return float
+     */
+    public function getShippingAmount()
+    {
+        return $this->_get(self::SHIPPING_AMOUNT);
+    }
+
+    /**
+     * Returns shipping_canceled
+     *
+     * @return float
+     */
+    public function getShippingCanceled()
+    {
+        return $this->_get(self::SHIPPING_CANCELED);
+    }
+
+    /**
+     * Returns shipping_description
+     *
+     * @return string
+     */
+    public function getShippingDescription()
+    {
+        return $this->_get(self::SHIPPING_DESCRIPTION);
+    }
+
+    /**
+     * Returns shipping_discount_amount
+     *
+     * @return float
+     */
+    public function getShippingDiscountAmount()
+    {
+        return $this->_get(self::SHIPPING_DISCOUNT_AMOUNT);
+    }
+
+    /**
+     * Returns shipping_hidden_tax_amount
+     *
+     * @return float
+     */
+    public function getShippingHiddenTaxAmount()
+    {
+        return $this->_get(self::SHIPPING_HIDDEN_TAX_AMOUNT);
+    }
+
+    /**
+     * Returns shipping_incl_tax
+     *
+     * @return float
+     */
+    public function getShippingInclTax()
+    {
+        return $this->_get(self::SHIPPING_INCL_TAX);
+    }
+
+    /**
+     * Returns shipping_invoiced
+     *
+     * @return float
+     */
+    public function getShippingInvoiced()
+    {
+        return $this->_get(self::SHIPPING_INVOICED);
+    }
+
+    /**
+     * Returns shipping_method
+     *
+     * @return string
+     */
+    public function getShippingMethod()
+    {
+        return $this->_get(self::SHIPPING_METHOD);
+    }
+
+    /**
+     * Returns shipping_refunded
+     *
+     * @return float
+     */
+    public function getShippingRefunded()
+    {
+        return $this->_get(self::SHIPPING_REFUNDED);
+    }
+
+    /**
+     * Returns shipping_tax_amount
+     *
+     * @return float
+     */
+    public function getShippingTaxAmount()
+    {
+        return $this->_get(self::SHIPPING_TAX_AMOUNT);
+    }
+
+    /**
+     * Returns shipping_tax_refunded
+     *
+     * @return float
+     */
+    public function getShippingTaxRefunded()
+    {
+        return $this->_get(self::SHIPPING_TAX_REFUNDED);
+    }
+
+    /**
+     * Returns state
+     *
+     * @return string
+     */
+    public function getState()
+    {
+        return $this->_get(self::STATE);
+    }
+
+    /**
+     * Returns status
+     *
+     * @return string
+     */
+    public function getStatus()
+    {
+        return $this->_get(self::STATUS);
+    }
+
+    /**
+     * Returns store_currency_code
+     *
+     * @return string
+     */
+    public function getStoreCurrencyCode()
+    {
+        return $this->_get(self::STORE_CURRENCY_CODE);
+    }
+
+    /**
+     * Returns store_id
+     *
+     * @return int
+     */
+    public function getStoreId()
+    {
+        return $this->_get(self::STORE_ID);
+    }
+
+    /**
+     * Returns store_name
+     *
+     * @return string
+     */
+    public function getStoreName()
+    {
+        return $this->_get(self::STORE_NAME);
+    }
+
+    /**
+     * Returns store_to_base_rate
+     *
+     * @return float
+     */
+    public function getStoreToBaseRate()
+    {
+        return $this->_get(self::STORE_TO_BASE_RATE);
+    }
+
+    /**
+     * Returns store_to_order_rate
+     *
+     * @return float
+     */
+    public function getStoreToOrderRate()
+    {
+        return $this->_get(self::STORE_TO_ORDER_RATE);
+    }
+
+    /**
+     * Returns subtotal
+     *
+     * @return float
+     */
+    public function getSubtotal()
+    {
+        return $this->_get(self::SUBTOTAL);
+    }
+
+    /**
+     * Returns subtotal_canceled
+     *
+     * @return float
+     */
+    public function getSubtotalCanceled()
+    {
+        return $this->_get(self::SUBTOTAL_CANCELED);
+    }
+
+    /**
+     * Returns subtotal_incl_tax
+     *
+     * @return float
+     */
+    public function getSubtotalInclTax()
+    {
+        return $this->_get(self::SUBTOTAL_INCL_TAX);
+    }
+
+    /**
+     * Returns subtotal_invoiced
+     *
+     * @return float
+     */
+    public function getSubtotalInvoiced()
+    {
+        return $this->_get(self::SUBTOTAL_INVOICED);
+    }
+
+    /**
+     * Returns subtotal_refunded
+     *
+     * @return float
+     */
+    public function getSubtotalRefunded()
+    {
+        return $this->_get(self::SUBTOTAL_REFUNDED);
+    }
+
+    /**
+     * Returns tax_amount
+     *
+     * @return float
+     */
+    public function getTaxAmount()
+    {
+        return $this->_get(self::TAX_AMOUNT);
+    }
+
+    /**
+     * Returns tax_canceled
+     *
+     * @return float
+     */
+    public function getTaxCanceled()
+    {
+        return $this->_get(self::TAX_CANCELED);
+    }
+
+    /**
+     * Returns tax_invoiced
+     *
+     * @return float
+     */
+    public function getTaxInvoiced()
+    {
+        return $this->_get(self::TAX_INVOICED);
+    }
+
+    /**
+     * Returns tax_refunded
+     *
+     * @return float
+     */
+    public function getTaxRefunded()
+    {
+        return $this->_get(self::TAX_REFUNDED);
+    }
+
+    /**
+     * Returns total_canceled
+     *
+     * @return float
+     */
+    public function getTotalCanceled()
+    {
+        return $this->_get(self::TOTAL_CANCELED);
+    }
+
+    /**
+     * Returns total_due
+     *
+     * @return float
+     */
+    public function getTotalDue()
+    {
+        return $this->_get(self::TOTAL_DUE);
+    }
+
+    /**
+     * Returns total_invoiced
+     *
+     * @return float
+     */
+    public function getTotalInvoiced()
+    {
+        return $this->_get(self::TOTAL_INVOICED);
+    }
+
+    /**
+     * Returns total_item_count
+     *
+     * @return int
+     */
+    public function getTotalItemCount()
+    {
+        return $this->_get(self::TOTAL_ITEM_COUNT);
+    }
+
+    /**
+     * Returns total_offline_refunded
+     *
+     * @return float
+     */
+    public function getTotalOfflineRefunded()
+    {
+        return $this->_get(self::TOTAL_OFFLINE_REFUNDED);
+    }
+
+    /**
+     * Returns total_online_refunded
+     *
+     * @return float
+     */
+    public function getTotalOnlineRefunded()
+    {
+        return $this->_get(self::TOTAL_ONLINE_REFUNDED);
+    }
+
+    /**
+     * Returns total_paid
+     *
+     * @return float
+     */
+    public function getTotalPaid()
+    {
+        return $this->_get(self::TOTAL_PAID);
+    }
+
+    /**
+     * Returns total_qty_ordered
+     *
+     * @return float
+     */
+    public function getTotalQtyOrdered()
+    {
+        return $this->_get(self::TOTAL_QTY_ORDERED);
+    }
+
+    /**
+     * Returns total_refunded
+     *
+     * @return float
+     */
+    public function getTotalRefunded()
+    {
+        return $this->_get(self::TOTAL_REFUNDED);
+    }
+
+    /**
+     * Returns updated_at
+     *
+     * @return string
+     */
+    public function getUpdatedAt()
+    {
+        return $this->_get(self::UPDATED_AT);
+    }
+
+    /**
+     * Returns weight
+     *
+     * @return float
+     */
+    public function getWeight()
+    {
+        return $this->_get(self::WEIGHT);
+    }
+
+    /**
+     * Returns x_forwarded_for
+     *
+     * @return string
+     */
+    public function getXForwardedFor()
+    {
+        return $this->_get(self::X_FORWARDED_FOR);
+    }
+
+    /**
+     * @return \Magento\Sales\Service\V1\Data\OrderItem[]
+     */
+    public function getItems()
+    {
+        return $this->_get(self::ITEMS);
+    }
+
+    /**
+     * @return \Magento\Sales\Service\V1\Data\OrderAddress
+     */
+    public function getBillingAddress()
+    {
+        return $this->_get(self::BILLING_ADDRESS);
+    }
+
+    /**
+     * @return \Magento\Sales\Service\V1\Data\OrderAddress
+     */
+    public function getShippingAddress()
+    {
+        return $this->_get(self::SHIPPING_ADDRESS);
+    }
+
+    /**
+     * @return \Magento\Sales\Service\V1\Data\OrderPayment[]
+     */
+    public function getPayments()
+    {
+        return $this->_get(self::PAYMENTS);
+    }
+}
diff --git a/app/code/Magento/Sales/Service/V1/Data/OrderAddress.php b/app/code/Magento/Sales/Service/V1/Data/OrderAddress.php
new file mode 100644
index 0000000000000000000000000000000000000000..34d413993fd4b08960ee9cc9067aaa8b781c1d36
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/Data/OrderAddress.php
@@ -0,0 +1,422 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Data;
+
+use Magento\Framework\Service\Data\AbstractObject as DataObject;
+
+/**
+ * Class OrderAddress
+ */
+class OrderAddress extends DataObject
+{
+    /**
+     * int
+     */
+    const ENTITY_ID = 'entity_id';
+
+    /**
+     * int
+     */
+    const PARENT_ID = 'parent_id';
+
+    /**
+     * int
+     */
+    const CUSTOMER_ADDRESS_ID = 'customer_address_id';
+
+    /**
+     * int
+     */
+    const QUOTE_ADDRESS_ID = 'quote_address_id';
+
+    /**
+     * int
+     */
+    const REGION_ID = 'region_id';
+
+    /**
+     * int
+     */
+    const CUSTOMER_ID = 'customer_id';
+
+    /**
+     * string
+     */
+    const FAX = 'fax';
+
+    /**
+     * string
+     */
+    const REGION = 'region';
+
+    /**
+     * string
+     */
+    const POSTCODE = 'postcode';
+
+    /**
+     * string
+     */
+    const LASTNAME = 'lastname';
+
+    /**
+     * string
+     */
+    const STREET = 'street';
+
+    /**
+     * string
+     */
+    const CITY = 'city';
+
+    /**
+     * string
+     */
+    const EMAIL = 'email';
+
+    /**
+     * string
+     */
+    const TELEPHONE = 'telephone';
+
+    /**
+     * string
+     */
+    const COUNTRY_ID = 'country_id';
+
+    /**
+     * string
+     */
+    const FIRSTNAME = 'firstname';
+
+    /**
+     * string
+     */
+    const ADDRESS_TYPE = 'address_type';
+
+    /**
+     * string
+     */
+    const PREFIX = 'prefix';
+
+    /**
+     * string
+     */
+    const MIDDLENAME = 'middlename';
+
+    /**
+     * string
+     */
+    const SUFFIX = 'suffix';
+
+    /**
+     * string
+     */
+    const COMPANY = 'company';
+
+    /**
+     * string
+     */
+    const VAT_ID = 'vat_id';
+
+    /**
+     * int
+     */
+    const VAT_IS_VALID = 'vat_is_valid';
+
+    /**
+     * string
+     */
+    const VAT_REQUEST_ID = 'vat_request_id';
+
+    /**
+     * string
+     */
+    const VAT_REQUEST_DATE = 'vat_request_date';
+
+    /**
+     * int
+     */
+    const VAT_REQUEST_SUCCESS = 'vat_request_success';
+
+    /**
+     * Returns address_type
+     *
+     * @return string
+     */
+    public function getAddressType()
+    {
+        return $this->_get(self::ADDRESS_TYPE);
+    }
+
+    /**
+     * Returns city
+     *
+     * @return string
+     */
+    public function getCity()
+    {
+        return $this->_get(self::CITY);
+    }
+
+    /**
+     * Returns company
+     *
+     * @return string
+     */
+    public function getCompany()
+    {
+        return $this->_get(self::COMPANY);
+    }
+
+    /**
+     * Returns country_id
+     *
+     * @return string
+     */
+    public function getCountryId()
+    {
+        return $this->_get(self::COUNTRY_ID);
+    }
+
+    /**
+     * Returns customer_address_id
+     *
+     * @return int
+     */
+    public function getCustomerAddressId()
+    {
+        return $this->_get(self::CUSTOMER_ADDRESS_ID);
+    }
+
+    /**
+     * Returns customer_id
+     *
+     * @return int
+     */
+    public function getCustomerId()
+    {
+        return $this->_get(self::CUSTOMER_ID);
+    }
+
+    /**
+     * Returns email
+     *
+     * @return string
+     */
+    public function getEmail()
+    {
+        return $this->_get(self::EMAIL);
+    }
+
+    /**
+     * Returns entity_id
+     *
+     * @return int
+     */
+    public function getEntityId()
+    {
+        return $this->_get(self::ENTITY_ID);
+    }
+
+    /**
+     * Returns fax
+     *
+     * @return string
+     */
+    public function getFax()
+    {
+        return $this->_get(self::FAX);
+    }
+
+    /**
+     * Returns firstname
+     *
+     * @return string
+     */
+    public function getFirstname()
+    {
+        return $this->_get(self::FIRSTNAME);
+    }
+
+    /**
+     * Returns lastname
+     *
+     * @return string
+     */
+    public function getLastname()
+    {
+        return $this->_get(self::LASTNAME);
+    }
+
+    /**
+     * Returns middlename
+     *
+     * @return string
+     */
+    public function getMiddlename()
+    {
+        return $this->_get(self::MIDDLENAME);
+    }
+
+    /**
+     * Returns parent_id
+     *
+     * @return int
+     */
+    public function getParentId()
+    {
+        return $this->_get(self::PARENT_ID);
+    }
+
+    /**
+     * Returns postcode
+     *
+     * @return string
+     */
+    public function getPostcode()
+    {
+        return $this->_get(self::POSTCODE);
+    }
+
+    /**
+     * Returns prefix
+     *
+     * @return string
+     */
+    public function getPrefix()
+    {
+        return $this->_get(self::PREFIX);
+    }
+
+    /**
+     * Returns quote_address_id
+     *
+     * @return int
+     */
+    public function getQuoteAddressId()
+    {
+        return $this->_get(self::QUOTE_ADDRESS_ID);
+    }
+
+    /**
+     * Returns region
+     *
+     * @return string
+     */
+    public function getRegion()
+    {
+        return $this->_get(self::REGION);
+    }
+
+    /**
+     * Returns region_id
+     *
+     * @return int
+     */
+    public function getRegionId()
+    {
+        return $this->_get(self::REGION_ID);
+    }
+
+    /**
+     * Returns street
+     *
+     * @return string
+     */
+    public function getStreet()
+    {
+        return $this->_get(self::STREET);
+    }
+
+    /**
+     * Returns suffix
+     *
+     * @return string
+     */
+    public function getSuffix()
+    {
+        return $this->_get(self::SUFFIX);
+    }
+
+    /**
+     * Returns telephone
+     *
+     * @return string
+     */
+    public function getTelephone()
+    {
+        return $this->_get(self::TELEPHONE);
+    }
+
+    /**
+     * Returns vat_id
+     *
+     * @return string
+     */
+    public function getVatId()
+    {
+        return $this->_get(self::VAT_ID);
+    }
+
+    /**
+     * Returns vat_is_valid
+     *
+     * @return int
+     */
+    public function getVatIsValid()
+    {
+        return $this->_get(self::VAT_IS_VALID);
+    }
+
+    /**
+     * Returns vat_request_date
+     *
+     * @return string
+     */
+    public function getVatRequestDate()
+    {
+        return $this->_get(self::VAT_REQUEST_DATE);
+    }
+
+    /**
+     * Returns vat_request_id
+     *
+     * @return string
+     */
+    public function getVatRequestId()
+    {
+        return $this->_get(self::VAT_REQUEST_ID);
+    }
+
+    /**
+     * Returns vat_request_success
+     *
+     * @return int
+     */
+    public function getVatRequestSuccess()
+    {
+        return $this->_get(self::VAT_REQUEST_SUCCESS);
+    }
+}
diff --git a/app/code/Magento/Sales/Service/V1/Data/OrderItem.php b/app/code/Magento/Sales/Service/V1/Data/OrderItem.php
new file mode 100644
index 0000000000000000000000000000000000000000..7969c2e17b2c605f75dc297cfb537f60e032c372
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/Data/OrderItem.php
@@ -0,0 +1,1167 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Data;
+
+use Magento\Framework\Service\Data\AbstractObject as DataObject;
+
+/**
+ * Class OrderItem
+ */
+class OrderItem extends DataObject
+{
+    const ITEM_ID = 'item_id';
+    const ORDER_ID = 'order_id';
+    const PARENT_ITEM_ID = 'parent_item_id';
+    const QUOTE_ITEM_ID = 'quote_item_id';
+    const STORE_ID = 'store_id';
+    const CREATED_AT = 'created_at';
+    const UPDATED_AT = 'updated_at';
+    const PRODUCT_ID = 'product_id';
+    const PRODUCT_TYPE = 'product_type';
+    const PRODUCT_OPTIONS = 'product_options';
+    const WEIGHT = 'weight';
+    const IS_VIRTUAL = 'is_virtual';
+    const SKU = 'sku';
+    const NAME = 'name';
+    const DESCRIPTION = 'description';
+    const APPLIED_RULE_IDS = 'applied_rule_ids';
+    const ADDITIONAL_DATA = 'additional_data';
+    const IS_QTY_DECIMAL = 'is_qty_decimal';
+    const NO_DISCOUNT = 'no_discount';
+    const QTY_BACKORDERED = 'qty_backordered';
+    const QTY_CANCELED = 'qty_canceled';
+    const QTY_INVOICED = 'qty_invoiced';
+    const QTY_ORDERED = 'qty_ordered';
+    const QTY_REFUNDED = 'qty_refunded';
+    const QTY_SHIPPED = 'qty_shipped';
+    const BASE_COST = 'base_cost';
+    const PRICE = 'price';
+    const BASE_PRICE = 'base_price';
+    const ORIGINAL_PRICE = 'original_price';
+    const BASE_ORIGINAL_PRICE = 'base_original_price';
+    const TAX_PERCENT = 'tax_percent';
+    const TAX_AMOUNT = 'tax_amount';
+    const BASE_TAX_AMOUNT = 'base_tax_amount';
+    const TAX_INVOICED = 'tax_invoiced';
+    const BASE_TAX_INVOICED = 'base_tax_invoiced';
+    const DISCOUNT_PERCENT = 'discount_percent';
+    const DISCOUNT_AMOUNT = 'discount_amount';
+    const BASE_DISCOUNT_AMOUNT = 'base_discount_amount';
+    const DISCOUNT_INVOICED = 'discount_invoiced';
+    const BASE_DISCOUNT_INVOICED = 'base_discount_invoiced';
+    const AMOUNT_REFUNDED = 'amount_refunded';
+    const BASE_AMOUNT_REFUNDED = 'base_amount_refunded';
+    const ROW_TOTAL = 'row_total';
+    const BASE_ROW_TOTAL = 'base_row_total';
+    const ROW_INVOICED = 'row_invoiced';
+    const BASE_ROW_INVOICED = 'base_row_invoiced';
+    const ROW_WEIGHT = 'row_weight';
+    const BASE_TAX_BEFORE_DISCOUNT = 'base_tax_before_discount';
+    const TAX_BEFORE_DISCOUNT = 'tax_before_discount';
+    const EXT_ORDER_ITEM_ID = 'ext_order_item_id';
+    const LOCKED_DO_INVOICE = 'locked_do_invoice';
+    const LOCKED_DO_SHIP = 'locked_do_ship';
+    const PRICE_INCL_TAX = 'price_incl_tax';
+    const BASE_PRICE_INCL_TAX = 'base_price_incl_tax';
+    const ROW_TOTAL_INCL_TAX = 'row_total_incl_tax';
+    const BASE_ROW_TOTAL_INCL_TAX = 'base_row_total_incl_tax';
+    const HIDDEN_TAX_AMOUNT = 'hidden_tax_amount';
+    const BASE_HIDDEN_TAX_AMOUNT = 'base_hidden_tax_amount';
+    const HIDDEN_TAX_INVOICED = 'hidden_tax_invoiced';
+    const BASE_HIDDEN_TAX_INVOICED = 'base_hidden_tax_invoiced';
+    const HIDDEN_TAX_REFUNDED = 'hidden_tax_refunded';
+    const BASE_HIDDEN_TAX_REFUNDED = 'base_hidden_tax_refunded';
+    const IS_NOMINAL = 'is_nominal';
+    const TAX_CANCELED = 'tax_canceled';
+    const HIDDEN_TAX_CANCELED = 'hidden_tax_canceled';
+    const TAX_REFUNDED = 'tax_refunded';
+    const BASE_TAX_REFUNDED = 'base_tax_refunded';
+    const DISCOUNT_REFUNDED = 'discount_refunded';
+    const BASE_DISCOUNT_REFUNDED = 'base_discount_refunded';
+
+    /**
+     * int
+     */
+    const GW_ID = 'gw_id';
+
+    /**
+     * float
+     */
+    const GW_BASE_PRICE = 'gw_base_price';
+
+    /**
+     * float
+     */
+    const GW_PRICE = 'gw_price';
+
+    /**
+     * float
+     */
+    const GW_BASE_TAX_AMOUNT = 'gw_base_tax_amount';
+
+    /**
+     * float
+     */
+    const GW_TAX_AMOUNT = 'gw_tax_amount';
+
+    /**
+     * float
+     */
+    const GW_BASE_PRICE_INVOICED = 'gw_base_price_invoiced';
+
+    /**
+     * float
+     */
+    const GW_PRICE_INVOICED = 'gw_price_invoiced';
+
+    /**
+     * float
+     */
+    const GW_BASE_TAX_AMOUNT_INVOICED = 'gw_base_tax_amount_invoiced';
+
+    /**
+     * float
+     */
+    const GW_TAX_AMOUNT_INVOICED = 'gw_tax_amount_invoiced';
+
+    /**
+     * float
+     */
+    const GW_BASE_PRICE_REFUNDED = 'gw_base_price_refunded';
+
+    /**
+     * float
+     */
+    const GW_PRICE_REFUNDED = 'gw_price_refunded';
+
+    /**
+     * float
+     */
+    const GW_BASE_TAX_AMOUNT_REFUNDED = 'gw_base_tax_amount_refunded';
+
+    /**
+     * float
+     */
+    const GW_TAX_AMOUNT_REFUNDED = 'gw_tax_amount_refunded';
+
+    /**
+     * int
+     */
+    const FREE_SHIPPING = 'free_shipping';
+
+    /**
+     * float
+     */
+    const QTY_RETURNED = 'qty_returned';
+
+    /**
+     * int
+     */
+    const EVENT_ID = 'event_id';
+
+    /**
+     * float
+     */
+    const BASE_WEEE_TAX_APPLIED_AMOUNT = 'base_weee_tax_applied_amount';
+
+    /**
+     * float
+     */
+    const BASE_WEEE_TAX_APPLIED_ROW_AMNT = 'base_weee_tax_applied_row_amnt';
+
+    /**
+     * float
+     */
+    const WEEE_TAX_APPLIED_AMOUNT = 'weee_tax_applied_amount';
+
+    /**
+     * float
+     */
+    const WEEE_TAX_APPLIED_ROW_AMOUNT = 'weee_tax_applied_row_amount';
+
+    /**
+     * string
+     */
+    const WEEE_TAX_APPLIED = 'weee_tax_applied';
+
+    /**
+     * float
+     */
+    const WEEE_TAX_DISPOSITION = 'weee_tax_disposition';
+
+    /**
+     * float
+     */
+    const WEEE_TAX_ROW_DISPOSITION = 'weee_tax_row_disposition';
+
+    /**
+     * float
+     */
+    const BASE_WEEE_TAX_DISPOSITION = 'base_weee_tax_disposition';
+
+    /**
+     * float
+     */
+    const BASE_WEEE_TAX_ROW_DISPOSITION = 'base_weee_tax_row_disposition';
+
+    /**
+     * Returns additional_data
+     *
+     * @return string
+     */
+    public function getAdditionalData()
+    {
+        return $this->_get(self::ADDITIONAL_DATA);
+    }
+
+    /**
+     * Returns amount_refunded
+     *
+     * @return float
+     */
+    public function getAmountRefunded()
+    {
+        return $this->_get(self::AMOUNT_REFUNDED);
+    }
+
+    /**
+     * Returns applied_rule_ids
+     *
+     * @return string
+     */
+    public function getAppliedRuleIds()
+    {
+        return $this->_get(self::APPLIED_RULE_IDS);
+    }
+
+    /**
+     * Returns base_amount_refunded
+     *
+     * @return float
+     */
+    public function getBaseAmountRefunded()
+    {
+        return $this->_get(self::BASE_AMOUNT_REFUNDED);
+    }
+
+    /**
+     * Returns base_cost
+     *
+     * @return float
+     */
+    public function getBaseCost()
+    {
+        return $this->_get(self::BASE_COST);
+    }
+
+    /**
+     * Returns base_discount_amount
+     *
+     * @return float
+     */
+    public function getBaseDiscountAmount()
+    {
+        return $this->_get(self::BASE_DISCOUNT_AMOUNT);
+    }
+
+    /**
+     * Returns base_discount_invoiced
+     *
+     * @return float
+     */
+    public function getBaseDiscountInvoiced()
+    {
+        return $this->_get(self::BASE_DISCOUNT_INVOICED);
+    }
+
+    /**
+     * Returns base_discount_refunded
+     *
+     * @return float
+     */
+    public function getBaseDiscountRefunded()
+    {
+        return $this->_get(self::BASE_DISCOUNT_REFUNDED);
+    }
+
+    /**
+     * Returns base_hidden_tax_amount
+     *
+     * @return float
+     */
+    public function getBaseHiddenTaxAmount()
+    {
+        return $this->_get(self::BASE_HIDDEN_TAX_AMOUNT);
+    }
+
+    /**
+     * Returns base_hidden_tax_invoiced
+     *
+     * @return float
+     */
+    public function getBaseHiddenTaxInvoiced()
+    {
+        return $this->_get(self::BASE_HIDDEN_TAX_INVOICED);
+    }
+
+    /**
+     * Returns base_hidden_tax_refunded
+     *
+     * @return float
+     */
+    public function getBaseHiddenTaxRefunded()
+    {
+        return $this->_get(self::BASE_HIDDEN_TAX_REFUNDED);
+    }
+
+    /**
+     * Returns base_original_price
+     *
+     * @return float
+     */
+    public function getBaseOriginalPrice()
+    {
+        return $this->_get(self::BASE_ORIGINAL_PRICE);
+    }
+
+    /**
+     * Returns base_price
+     *
+     * @return float
+     */
+    public function getBasePrice()
+    {
+        return $this->_get(self::BASE_PRICE);
+    }
+
+    /**
+     * Returns base_price_incl_tax
+     *
+     * @return float
+     */
+    public function getBasePriceInclTax()
+    {
+        return $this->_get(self::BASE_PRICE_INCL_TAX);
+    }
+
+    /**
+     * Returns base_row_invoiced
+     *
+     * @return float
+     */
+    public function getBaseRowInvoiced()
+    {
+        return $this->_get(self::BASE_ROW_INVOICED);
+    }
+
+    /**
+     * Returns base_row_total
+     *
+     * @return float
+     */
+    public function getBaseRowTotal()
+    {
+        return $this->_get(self::BASE_ROW_TOTAL);
+    }
+
+    /**
+     * Returns base_row_total_incl_tax
+     *
+     * @return float
+     */
+    public function getBaseRowTotalInclTax()
+    {
+        return $this->_get(self::BASE_ROW_TOTAL_INCL_TAX);
+    }
+
+    /**
+     * Returns base_tax_amount
+     *
+     * @return float
+     */
+    public function getBaseTaxAmount()
+    {
+        return $this->_get(self::BASE_TAX_AMOUNT);
+    }
+
+    /**
+     * Returns base_tax_before_discount
+     *
+     * @return float
+     */
+    public function getBaseTaxBeforeDiscount()
+    {
+        return $this->_get(self::BASE_TAX_BEFORE_DISCOUNT);
+    }
+
+    /**
+     * Returns base_tax_invoiced
+     *
+     * @return float
+     */
+    public function getBaseTaxInvoiced()
+    {
+        return $this->_get(self::BASE_TAX_INVOICED);
+    }
+
+    /**
+     * Returns base_tax_refunded
+     *
+     * @return float
+     */
+    public function getBaseTaxRefunded()
+    {
+        return $this->_get(self::BASE_TAX_REFUNDED);
+    }
+
+    /**
+     * Returns base_weee_tax_applied_amount
+     *
+     * @return float
+     */
+    public function getBaseWeeeTaxAppliedAmount()
+    {
+        return $this->_get(self::BASE_WEEE_TAX_APPLIED_AMOUNT);
+    }
+
+    /**
+     * Returns base_weee_tax_applied_row_amnt
+     *
+     * @return float
+     */
+    public function getBaseWeeeTaxAppliedRowAmnt()
+    {
+        return $this->_get(self::BASE_WEEE_TAX_APPLIED_ROW_AMNT);
+    }
+
+    /**
+     * Returns base_weee_tax_disposition
+     *
+     * @return float
+     */
+    public function getBaseWeeeTaxDisposition()
+    {
+        return $this->_get(self::BASE_WEEE_TAX_DISPOSITION);
+    }
+
+    /**
+     * Returns base_weee_tax_row_disposition
+     *
+     * @return float
+     */
+    public function getBaseWeeeTaxRowDisposition()
+    {
+        return $this->_get(self::BASE_WEEE_TAX_ROW_DISPOSITION);
+    }
+
+    /**
+     * Returns created_at
+     *
+     * @return string
+     */
+    public function getCreatedAt()
+    {
+        return $this->_get(self::CREATED_AT);
+    }
+
+    /**
+     * Returns description
+     *
+     * @return string
+     */
+    public function getDescription()
+    {
+        return $this->_get(self::DESCRIPTION);
+    }
+
+    /**
+     * Returns discount_amount
+     *
+     * @return float
+     */
+    public function getDiscountAmount()
+    {
+        return $this->_get(self::DISCOUNT_AMOUNT);
+    }
+
+    /**
+     * Returns discount_invoiced
+     *
+     * @return float
+     */
+    public function getDiscountInvoiced()
+    {
+        return $this->_get(self::DISCOUNT_INVOICED);
+    }
+
+    /**
+     * Returns discount_percent
+     *
+     * @return float
+     */
+    public function getDiscountPercent()
+    {
+        return $this->_get(self::DISCOUNT_PERCENT);
+    }
+
+    /**
+     * Returns discount_refunded
+     *
+     * @return float
+     */
+    public function getDiscountRefunded()
+    {
+        return $this->_get(self::DISCOUNT_REFUNDED);
+    }
+
+    /**
+     * Returns event_id
+     *
+     * @return int
+     */
+    public function getEventId()
+    {
+        return $this->_get(self::EVENT_ID);
+    }
+
+    /**
+     * Returns ext_order_item_id
+     *
+     * @return string
+     */
+    public function getExtOrderItemId()
+    {
+        return $this->_get(self::EXT_ORDER_ITEM_ID);
+    }
+
+    /**
+     * Returns free_shipping
+     *
+     * @return int
+     */
+    public function getFreeShipping()
+    {
+        return $this->_get(self::FREE_SHIPPING);
+    }
+
+    /**
+     * Returns gw_base_price
+     *
+     * @return float
+     */
+    public function getGwBasePrice()
+    {
+        return $this->_get(self::GW_BASE_PRICE);
+    }
+
+    /**
+     * Returns gw_base_price_invoiced
+     *
+     * @return float
+     */
+    public function getGwBasePriceInvoiced()
+    {
+        return $this->_get(self::GW_BASE_PRICE_INVOICED);
+    }
+
+    /**
+     * Returns gw_base_price_refunded
+     *
+     * @return float
+     */
+    public function getGwBasePriceRefunded()
+    {
+        return $this->_get(self::GW_BASE_PRICE_REFUNDED);
+    }
+
+    /**
+     * Returns gw_base_tax_amount
+     *
+     * @return float
+     */
+    public function getGwBaseTaxAmount()
+    {
+        return $this->_get(self::GW_BASE_TAX_AMOUNT);
+    }
+
+    /**
+     * Returns gw_base_tax_amount_invoiced
+     *
+     * @return float
+     */
+    public function getGwBaseTaxAmountInvoiced()
+    {
+        return $this->_get(self::GW_BASE_TAX_AMOUNT_INVOICED);
+    }
+
+    /**
+     * Returns gw_base_tax_amount_refunded
+     *
+     * @return float
+     */
+    public function getGwBaseTaxAmountRefunded()
+    {
+        return $this->_get(self::GW_BASE_TAX_AMOUNT_REFUNDED);
+    }
+
+    /**
+     * Returns gw_id
+     *
+     * @return int
+     */
+    public function getGwId()
+    {
+        return $this->_get(self::GW_ID);
+    }
+
+    /**
+     * Returns gw_price
+     *
+     * @return float
+     */
+    public function getGwPrice()
+    {
+        return $this->_get(self::GW_PRICE);
+    }
+
+    /**
+     * Returns gw_price_invoiced
+     *
+     * @return float
+     */
+    public function getGwPriceInvoiced()
+    {
+        return $this->_get(self::GW_PRICE_INVOICED);
+    }
+
+    /**
+     * Returns gw_price_refunded
+     *
+     * @return float
+     */
+    public function getGwPriceRefunded()
+    {
+        return $this->_get(self::GW_PRICE_REFUNDED);
+    }
+
+    /**
+     * Returns gw_tax_amount
+     *
+     * @return float
+     */
+    public function getGwTaxAmount()
+    {
+        return $this->_get(self::GW_TAX_AMOUNT);
+    }
+
+    /**
+     * Returns gw_tax_amount_invoiced
+     *
+     * @return float
+     */
+    public function getGwTaxAmountInvoiced()
+    {
+        return $this->_get(self::GW_TAX_AMOUNT_INVOICED);
+    }
+
+    /**
+     * Returns gw_tax_amount_refunded
+     *
+     * @return float
+     */
+    public function getGwTaxAmountRefunded()
+    {
+        return $this->_get(self::GW_TAX_AMOUNT_REFUNDED);
+    }
+
+    /**
+     * Returns hidden_tax_amount
+     *
+     * @return float
+     */
+    public function getHiddenTaxAmount()
+    {
+        return $this->_get(self::HIDDEN_TAX_AMOUNT);
+    }
+
+    /**
+     * Returns hidden_tax_canceled
+     *
+     * @return float
+     */
+    public function getHiddenTaxCanceled()
+    {
+        return $this->_get(self::HIDDEN_TAX_CANCELED);
+    }
+
+    /**
+     * Returns hidden_tax_invoiced
+     *
+     * @return float
+     */
+    public function getHiddenTaxInvoiced()
+    {
+        return $this->_get(self::HIDDEN_TAX_INVOICED);
+    }
+
+    /**
+     * Returns hidden_tax_refunded
+     *
+     * @return float
+     */
+    public function getHiddenTaxRefunded()
+    {
+        return $this->_get(self::HIDDEN_TAX_REFUNDED);
+    }
+
+    /**
+     * Returns is_nominal
+     *
+     * @return int
+     */
+    public function getIsNominal()
+    {
+        return $this->_get(self::IS_NOMINAL);
+    }
+
+    /**
+     * Returns is_qty_decimal
+     *
+     * @return int
+     */
+    public function getIsQtyDecimal()
+    {
+        return $this->_get(self::IS_QTY_DECIMAL);
+    }
+
+    /**
+     * Returns is_virtual
+     *
+     * @return int
+     */
+    public function getIsVirtual()
+    {
+        return $this->_get(self::IS_VIRTUAL);
+    }
+
+    /**
+     * Returns item_id
+     *
+     * @return int
+     */
+    public function getItemId()
+    {
+        return $this->_get(self::ITEM_ID);
+    }
+
+    /**
+     * Returns locked_do_invoice
+     *
+     * @return int
+     */
+    public function getLockedDoInvoice()
+    {
+        return $this->_get(self::LOCKED_DO_INVOICE);
+    }
+
+    /**
+     * Returns locked_do_ship
+     *
+     * @return int
+     */
+    public function getLockedDoShip()
+    {
+        return $this->_get(self::LOCKED_DO_SHIP);
+    }
+
+    /**
+     * Returns name
+     *
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->_get(self::NAME);
+    }
+
+    /**
+     * Returns no_discount
+     *
+     * @return int
+     */
+    public function getNoDiscount()
+    {
+        return $this->_get(self::NO_DISCOUNT);
+    }
+
+    /**
+     * Returns order_id
+     *
+     * @return int
+     */
+    public function getOrderId()
+    {
+        return $this->_get(self::ORDER_ID);
+    }
+
+    /**
+     * Returns original_price
+     *
+     * @return float
+     */
+    public function getOriginalPrice()
+    {
+        return $this->_get(self::ORIGINAL_PRICE);
+    }
+
+    /**
+     * Returns parent_item_id
+     *
+     * @return int
+     */
+    public function getParentItemId()
+    {
+        return $this->_get(self::PARENT_ITEM_ID);
+    }
+
+    /**
+     * Returns price
+     *
+     * @return float
+     */
+    public function getPrice()
+    {
+        return $this->_get(self::PRICE);
+    }
+
+    /**
+     * Returns price_incl_tax
+     *
+     * @return float
+     */
+    public function getPriceInclTax()
+    {
+        return $this->_get(self::PRICE_INCL_TAX);
+    }
+
+    /**
+     * Returns product_id
+     *
+     * @return int
+     */
+    public function getProductId()
+    {
+        return $this->_get(self::PRODUCT_ID);
+    }
+
+    /**
+     * Returns product_options
+     *
+     * @return string
+     */
+    public function getProductOptions()
+    {
+        return $this->_get(self::PRODUCT_OPTIONS);
+    }
+
+    /**
+     * Returns product_type
+     *
+     * @return string
+     */
+    public function getProductType()
+    {
+        return $this->_get(self::PRODUCT_TYPE);
+    }
+
+    /**
+     * Returns qty_backordered
+     *
+     * @return float
+     */
+    public function getQtyBackordered()
+    {
+        return $this->_get(self::QTY_BACKORDERED);
+    }
+
+    /**
+     * Returns qty_canceled
+     *
+     * @return float
+     */
+    public function getQtyCanceled()
+    {
+        return $this->_get(self::QTY_CANCELED);
+    }
+
+    /**
+     * Returns qty_invoiced
+     *
+     * @return float
+     */
+    public function getQtyInvoiced()
+    {
+        return $this->_get(self::QTY_INVOICED);
+    }
+
+    /**
+     * Returns qty_ordered
+     *
+     * @return float
+     */
+    public function getQtyOrdered()
+    {
+        return $this->_get(self::QTY_ORDERED);
+    }
+
+    /**
+     * Returns qty_refunded
+     *
+     * @return float
+     */
+    public function getQtyRefunded()
+    {
+        return $this->_get(self::QTY_REFUNDED);
+    }
+
+    /**
+     * Returns qty_returned
+     *
+     * @return float
+     */
+    public function getQtyReturned()
+    {
+        return $this->_get(self::QTY_RETURNED);
+    }
+
+    /**
+     * Returns qty_shipped
+     *
+     * @return float
+     */
+    public function getQtyShipped()
+    {
+        return $this->_get(self::QTY_SHIPPED);
+    }
+
+    /**
+     * Returns quote_item_id
+     *
+     * @return int
+     */
+    public function getQuoteItemId()
+    {
+        return $this->_get(self::QUOTE_ITEM_ID);
+    }
+
+    /**
+     * Returns row_invoiced
+     *
+     * @return float
+     */
+    public function getRowInvoiced()
+    {
+        return $this->_get(self::ROW_INVOICED);
+    }
+
+    /**
+     * Returns row_total
+     *
+     * @return float
+     */
+    public function getRowTotal()
+    {
+        return $this->_get(self::ROW_TOTAL);
+    }
+
+    /**
+     * Returns row_total_incl_tax
+     *
+     * @return float
+     */
+    public function getRowTotalInclTax()
+    {
+        return $this->_get(self::ROW_TOTAL_INCL_TAX);
+    }
+
+    /**
+     * Returns row_weight
+     *
+     * @return float
+     */
+    public function getRowWeight()
+    {
+        return $this->_get(self::ROW_WEIGHT);
+    }
+
+    /**
+     * Returns sku
+     *
+     * @return string
+     */
+    public function getSku()
+    {
+        return $this->_get(self::SKU);
+    }
+
+    /**
+     * Returns store_id
+     *
+     * @return int
+     */
+    public function getStoreId()
+    {
+        return $this->_get(self::STORE_ID);
+    }
+
+    /**
+     * Returns tax_amount
+     *
+     * @return float
+     */
+    public function getTaxAmount()
+    {
+        return $this->_get(self::TAX_AMOUNT);
+    }
+
+    /**
+     * Returns tax_before_discount
+     *
+     * @return float
+     */
+    public function getTaxBeforeDiscount()
+    {
+        return $this->_get(self::TAX_BEFORE_DISCOUNT);
+    }
+
+    /**
+     * Returns tax_canceled
+     *
+     * @return float
+     */
+    public function getTaxCanceled()
+    {
+        return $this->_get(self::TAX_CANCELED);
+    }
+
+    /**
+     * Returns tax_invoiced
+     *
+     * @return float
+     */
+    public function getTaxInvoiced()
+    {
+        return $this->_get(self::TAX_INVOICED);
+    }
+
+    /**
+     * Returns tax_percent
+     *
+     * @return float
+     */
+    public function getTaxPercent()
+    {
+        return $this->_get(self::TAX_PERCENT);
+    }
+
+    /**
+     * Returns tax_refunded
+     *
+     * @return float
+     */
+    public function getTaxRefunded()
+    {
+        return $this->_get(self::TAX_REFUNDED);
+    }
+
+    /**
+     * Returns updated_at
+     *
+     * @return string
+     */
+    public function getUpdatedAt()
+    {
+        return $this->_get(self::UPDATED_AT);
+    }
+
+    /**
+     * Returns weee_tax_applied
+     *
+     * @return string
+     */
+    public function getWeeeTaxApplied()
+    {
+        return $this->_get(self::WEEE_TAX_APPLIED);
+    }
+
+    /**
+     * Returns weee_tax_applied_amount
+     *
+     * @return float
+     */
+    public function getWeeeTaxAppliedAmount()
+    {
+        return $this->_get(self::WEEE_TAX_APPLIED_AMOUNT);
+    }
+
+    /**
+     * Returns weee_tax_applied_row_amount
+     *
+     * @return float
+     */
+    public function getWeeeTaxAppliedRowAmount()
+    {
+        return $this->_get(self::WEEE_TAX_APPLIED_ROW_AMOUNT);
+    }
+
+    /**
+     * Returns weee_tax_disposition
+     *
+     * @return float
+     */
+    public function getWeeeTaxDisposition()
+    {
+        return $this->_get(self::WEEE_TAX_DISPOSITION);
+    }
+
+    /**
+     * Returns weee_tax_row_disposition
+     *
+     * @return float
+     */
+    public function getWeeeTaxRowDisposition()
+    {
+        return $this->_get(self::WEEE_TAX_ROW_DISPOSITION);
+    }
+
+    /**
+     * Returns weight
+     *
+     * @return float
+     */
+    public function getWeight()
+    {
+        return $this->_get(self::WEIGHT);
+    }
+}
diff --git a/app/code/Magento/Sales/Service/V1/Data/OrderMapper.php b/app/code/Magento/Sales/Service/V1/Data/OrderMapper.php
new file mode 100644
index 0000000000000000000000000000000000000000..38a6e49d4f32bb33c06772377f07e26f3af5e475
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/Data/OrderMapper.php
@@ -0,0 +1,144 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Data;
+
+//use Magento\Sales\Model\Order;
+
+/**
+ * Class OrderMapper
+ */
+class OrderMapper
+{
+    /**
+     * @var OrderBuilder
+     */
+    protected $orderBuilder;
+
+    /**
+     * @var OrderItemMapper
+     */
+    protected $orderItemMapper;
+
+    /**
+     * @var OrderPaymentMapper
+     */
+    protected $orderPaymentMapper;
+
+    /**
+     * @var OrderAddressMapper
+     */
+    protected $orderAddressMapper;
+
+    /**
+     * @param OrderBuilder $orderBuilder
+     * @param OrderItemMapper $orderItemMapper
+     * @param OrderPaymentMapper $orderPaymentMapper
+     * @param OrderAddressMapper $orderAddressMapper
+     */
+    public function __construct(
+        OrderBuilder $orderBuilder,
+        OrderItemMapper $orderItemMapper,
+        OrderPaymentMapper $orderPaymentMapper,
+        OrderAddressMapper $orderAddressMapper
+    ) {
+        $this->orderBuilder = $orderBuilder;
+        $this->orderItemMapper = $orderItemMapper;
+        $this->orderPaymentMapper = $orderPaymentMapper;
+        $this->orderAddressMapper = $orderAddressMapper;
+    }
+
+    /**
+     * Returns array of items
+     *
+     * @param \Magento\Sales\Model\Order $object
+     * @return OrderItem[]
+     */
+    protected function getItems(\Magento\Sales\Model\Order $object)
+    {
+        $items = [];
+        foreach ($object->getItemsCollection() as $item) {
+            $items[] = $this->orderItemMapper->extractDto($item);
+        }
+        return $items;
+    }
+
+    /**
+     * Returns array of payments
+     *
+     * @param \Magento\Sales\Model\Order $object
+     * @return OrderPayment[]
+     */
+    protected function getPayments(\Magento\Sales\Model\Order $object)
+    {
+        $payments = [];
+        foreach ($object->getPaymentsCollection() as $payment) {
+            $payments[] = $this->orderPaymentMapper->extractDto($payment);
+        }
+        return $payments;
+    }
+
+    /**
+     * Return billing address
+     *
+     * @param \Magento\Sales\Model\Order $object
+     * @return OrderAddress|null
+     */
+    protected function getBillingAddress(\Magento\Sales\Model\Order $object)
+    {
+        $billingAddress = null;
+        if ($object->getBillingAddress()) {
+            $billingAddress = $this->orderAddressMapper->extractDto($object->getBillingAddress());
+        }
+        return $billingAddress;
+    }
+
+    /**
+     * Returns shipping address
+     *
+     * @param \Magento\Sales\Model\Order $object
+     * @return OrderAddress|null
+     */
+    protected function getShippingAddress(\Magento\Sales\Model\Order $object)
+    {
+        $shippingAddress = null;
+        if ($object->getShippingAddress()) {
+            $shippingAddress = $this->orderAddressMapper->extractDto($object->getShippingAddress());
+        }
+        return $shippingAddress;
+    }
+
+    /**
+     * @param \Magento\Sales\Model\Order $object
+     * @return \Magento\Framework\Service\Data\AbstractObject
+     */
+    public function extractDto(\Magento\Sales\Model\Order $object)
+    {
+        $this->orderBuilder->populateWithArray($object->getData());
+        $this->orderBuilder->setItems($this->getItems($object));
+        $this->orderBuilder->setPayments($this->getPayments($object));
+        $this->orderBuilder->setBillingAddress($this->getBillingAddress($object));
+        $this->orderBuilder->setShippingAddress($this->getShippingAddress($object));
+        return $this->orderBuilder->create();
+    }
+}
diff --git a/app/code/Magento/Sales/Service/V1/Data/OrderPayment.php b/app/code/Magento/Sales/Service/V1/Data/OrderPayment.php
new file mode 100644
index 0000000000000000000000000000000000000000..a076f2ab30e7c1cf321c4599caad956d681bfaba
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/Data/OrderPayment.php
@@ -0,0 +1,842 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Data;
+
+use Magento\Framework\Service\Data\AbstractObject as DataObject;
+
+/**
+ * Class OrderPayment
+ */
+class OrderPayment extends DataObject
+{
+    /**
+     * int
+     */
+    const ENTITY_ID = 'entity_id';
+
+    /**
+     * int
+     */
+    const PARENT_ID = 'parent_id';
+
+    /**
+     * float
+     */
+    const BASE_SHIPPING_CAPTURED = 'base_shipping_captured';
+
+    /**
+     * float
+     */
+    const SHIPPING_CAPTURED = 'shipping_captured';
+
+    /**
+     * float
+     */
+    const AMOUNT_REFUNDED = 'amount_refunded';
+
+    /**
+     * float
+     */
+    const BASE_AMOUNT_PAID = 'base_amount_paid';
+
+    /**
+     * float
+     */
+    const AMOUNT_CANCELED = 'amount_canceled';
+
+    /**
+     * float
+     */
+    const BASE_AMOUNT_AUTHORIZED = 'base_amount_authorized';
+
+    /**
+     * float
+     */
+    const BASE_AMOUNT_PAID_ONLINE = 'base_amount_paid_online';
+
+    /**
+     * float
+     */
+    const BASE_AMOUNT_REFUNDED_ONLINE = 'base_amount_refunded_online';
+
+    /**
+     * float
+     */
+    const BASE_SHIPPING_AMOUNT = 'base_shipping_amount';
+
+    /**
+     * float
+     */
+    const SHIPPING_AMOUNT = 'shipping_amount';
+
+    /**
+     * float
+     */
+    const AMOUNT_PAID = 'amount_paid';
+
+    /**
+     * float
+     */
+    const AMOUNT_AUTHORIZED = 'amount_authorized';
+
+    /**
+     * float
+     */
+    const BASE_AMOUNT_ORDERED = 'base_amount_ordered';
+
+    /**
+     * float
+     */
+    const BASE_SHIPPING_REFUNDED = 'base_shipping_refunded';
+
+    /**
+     * float
+     */
+    const SHIPPING_REFUNDED = 'shipping_refunded';
+
+    /**
+     * float
+     */
+    const BASE_AMOUNT_REFUNDED = 'base_amount_refunded';
+
+    /**
+     * float
+     */
+    const AMOUNT_ORDERED = 'amount_ordered';
+
+    /**
+     * float
+     */
+    const BASE_AMOUNT_CANCELED = 'base_amount_canceled';
+
+    /**
+     * int
+     */
+    const QUOTE_PAYMENT_ID = 'quote_payment_id';
+
+    /**
+     * string
+     */
+    const ADDITIONAL_DATA = 'additional_data';
+
+    /**
+     * string
+     */
+    const CC_EXP_MONTH = 'cc_exp_month';
+
+    /**
+     * string
+     */
+    const CC_SS_START_YEAR = 'cc_ss_start_year';
+
+    /**
+     * string
+     */
+    const ECHECK_BANK_NAME = 'echeck_bank_name';
+
+    /**
+     * string
+     */
+    const METHOD = 'method';
+
+    /**
+     * string
+     */
+    const CC_DEBUG_REQUEST_BODY = 'cc_debug_request_body';
+
+    /**
+     * string
+     */
+    const CC_SECURE_VERIFY = 'cc_secure_verify';
+
+    /**
+     * string
+     */
+    const PROTECTION_ELIGIBILITY = 'protection_eligibility';
+
+    /**
+     * string
+     */
+    const CC_APPROVAL = 'cc_approval';
+
+    /**
+     * string
+     */
+    const CC_LAST4 = 'cc_last4';
+
+    /**
+     * string
+     */
+    const CC_STATUS_DESCRIPTION = 'cc_status_description';
+
+    /**
+     * string
+     */
+    const ECHECK_TYPE = 'echeck_type';
+
+    /**
+     * string
+     */
+    const CC_DEBUG_RESPONSE_SERIALIZED = 'cc_debug_response_serialized';
+
+    /**
+     * string
+     */
+    const CC_SS_START_MONTH = 'cc_ss_start_month';
+
+    /**
+     * string
+     */
+    const ECHECK_ACCOUNT_TYPE = 'echeck_account_type';
+
+    /**
+     * string
+     */
+    const LAST_TRANS_ID = 'last_trans_id';
+
+    /**
+     * string
+     */
+    const CC_CID_STATUS = 'cc_cid_status';
+
+    /**
+     * string
+     */
+    const CC_OWNER = 'cc_owner';
+
+    /**
+     * string
+     */
+    const CC_TYPE = 'cc_type';
+
+    /**
+     * string
+     */
+    const PO_NUMBER = 'po_number';
+
+    /**
+     * string
+     */
+    const CC_EXP_YEAR = 'cc_exp_year';
+
+    /**
+     * string
+     */
+    const CC_STATUS = 'cc_status';
+
+    /**
+     * string
+     */
+    const ECHECK_ROUTING_NUMBER = 'echeck_routing_number';
+
+    /**
+     * string
+     */
+    const ACCOUNT_STATUS = 'account_status';
+
+    /**
+     * string
+     */
+    const ANET_TRANS_METHOD = 'anet_trans_method';
+
+    /**
+     * string
+     */
+    const CC_DEBUG_RESPONSE_BODY = 'cc_debug_response_body';
+
+    /**
+     * string
+     */
+    const CC_SS_ISSUE = 'cc_ss_issue';
+
+    /**
+     * string
+     */
+    const ECHECK_ACCOUNT_NAME = 'echeck_account_name';
+
+    /**
+     * string
+     */
+    const CC_AVS_STATUS = 'cc_avs_status';
+
+    /**
+     * string
+     */
+    const CC_NUMBER_ENC = 'cc_number_enc';
+
+    /**
+     * string
+     */
+    const CC_TRANS_ID = 'cc_trans_id';
+
+    /**
+     * string
+     */
+    const ADDRESS_STATUS = 'address_status';
+
+    /**
+     * string
+     */
+    const ADDITIONAL_INFORMATION = 'additional_information';
+
+    /**
+     * Returns account_status
+     *
+     * @return string
+     */
+    public function getAccountStatus()
+    {
+        return $this->_get(self::ACCOUNT_STATUS);
+    }
+
+    /**
+     * Returns additional_data
+     *
+     * @return string
+     */
+    public function getAdditionalData()
+    {
+        return $this->_get(self::ADDITIONAL_DATA);
+    }
+
+    /**
+     * Returns additional_information
+     *
+     * @return string
+     */
+    public function getAdditionalInformation()
+    {
+        return $this->_get(self::ADDITIONAL_INFORMATION);
+    }
+
+    /**
+     * Returns address_status
+     *
+     * @return string
+     */
+    public function getAddressStatus()
+    {
+        return $this->_get(self::ADDRESS_STATUS);
+    }
+
+    /**
+     * Returns amount_authorized
+     *
+     * @return float
+     */
+    public function getAmountAuthorized()
+    {
+        return $this->_get(self::AMOUNT_AUTHORIZED);
+    }
+
+    /**
+     * Returns amount_canceled
+     *
+     * @return float
+     */
+    public function getAmountCanceled()
+    {
+        return $this->_get(self::AMOUNT_CANCELED);
+    }
+
+    /**
+     * Returns amount_ordered
+     *
+     * @return float
+     */
+    public function getAmountOrdered()
+    {
+        return $this->_get(self::AMOUNT_ORDERED);
+    }
+
+    /**
+     * Returns amount_paid
+     *
+     * @return float
+     */
+    public function getAmountPaid()
+    {
+        return $this->_get(self::AMOUNT_PAID);
+    }
+
+    /**
+     * Returns amount_refunded
+     *
+     * @return float
+     */
+    public function getAmountRefunded()
+    {
+        return $this->_get(self::AMOUNT_REFUNDED);
+    }
+
+    /**
+     * Returns anet_trans_method
+     *
+     * @return string
+     */
+    public function getAnetTransMethod()
+    {
+        return $this->_get(self::ANET_TRANS_METHOD);
+    }
+
+    /**
+     * Returns base_amount_authorized
+     *
+     * @return float
+     */
+    public function getBaseAmountAuthorized()
+    {
+        return $this->_get(self::BASE_AMOUNT_AUTHORIZED);
+    }
+
+    /**
+     * Returns base_amount_canceled
+     *
+     * @return float
+     */
+    public function getBaseAmountCanceled()
+    {
+        return $this->_get(self::BASE_AMOUNT_CANCELED);
+    }
+
+    /**
+     * Returns base_amount_ordered
+     *
+     * @return float
+     */
+    public function getBaseAmountOrdered()
+    {
+        return $this->_get(self::BASE_AMOUNT_ORDERED);
+    }
+
+    /**
+     * Returns base_amount_paid
+     *
+     * @return float
+     */
+    public function getBaseAmountPaid()
+    {
+        return $this->_get(self::BASE_AMOUNT_PAID);
+    }
+
+    /**
+     * Returns base_amount_paid_online
+     *
+     * @return float
+     */
+    public function getBaseAmountPaidOnline()
+    {
+        return $this->_get(self::BASE_AMOUNT_PAID_ONLINE);
+    }
+
+    /**
+     * Returns base_amount_refunded
+     *
+     * @return float
+     */
+    public function getBaseAmountRefunded()
+    {
+        return $this->_get(self::BASE_AMOUNT_REFUNDED);
+    }
+
+    /**
+     * Returns base_amount_refunded_online
+     *
+     * @return float
+     */
+    public function getBaseAmountRefundedOnline()
+    {
+        return $this->_get(self::BASE_AMOUNT_REFUNDED_ONLINE);
+    }
+
+    /**
+     * Returns base_shipping_amount
+     *
+     * @return float
+     */
+    public function getBaseShippingAmount()
+    {
+        return $this->_get(self::BASE_SHIPPING_AMOUNT);
+    }
+
+    /**
+     * Returns base_shipping_captured
+     *
+     * @return float
+     */
+    public function getBaseShippingCaptured()
+    {
+        return $this->_get(self::BASE_SHIPPING_CAPTURED);
+    }
+
+    /**
+     * Returns base_shipping_refunded
+     *
+     * @return float
+     */
+    public function getBaseShippingRefunded()
+    {
+        return $this->_get(self::BASE_SHIPPING_REFUNDED);
+    }
+
+    /**
+     * Returns cc_approval
+     *
+     * @return string
+     */
+    public function getCcApproval()
+    {
+        return $this->_get(self::CC_APPROVAL);
+    }
+
+    /**
+     * Returns cc_avs_status
+     *
+     * @return string
+     */
+    public function getCcAvsStatus()
+    {
+        return $this->_get(self::CC_AVS_STATUS);
+    }
+
+    /**
+     * Returns cc_cid_status
+     *
+     * @return string
+     */
+    public function getCcCidStatus()
+    {
+        return $this->_get(self::CC_CID_STATUS);
+    }
+
+    /**
+     * Returns cc_debug_request_body
+     *
+     * @return string
+     */
+    public function getCcDebugRequestBody()
+    {
+        return $this->_get(self::CC_DEBUG_REQUEST_BODY);
+    }
+
+    /**
+     * Returns cc_debug_response_body
+     *
+     * @return string
+     */
+    public function getCcDebugResponseBody()
+    {
+        return $this->_get(self::CC_DEBUG_RESPONSE_BODY);
+    }
+
+    /**
+     * Returns cc_debug_response_serialized
+     *
+     * @return string
+     */
+    public function getCcDebugResponseSerialized()
+    {
+        return $this->_get(self::CC_DEBUG_RESPONSE_SERIALIZED);
+    }
+
+    /**
+     * Returns cc_exp_month
+     *
+     * @return string
+     */
+    public function getCcExpMonth()
+    {
+        return $this->_get(self::CC_EXP_MONTH);
+    }
+
+    /**
+     * Returns cc_exp_year
+     *
+     * @return string
+     */
+    public function getCcExpYear()
+    {
+        return $this->_get(self::CC_EXP_YEAR);
+    }
+
+    /**
+     * Returns cc_last4
+     *
+     * @return string
+     */
+    public function getCcLast4()
+    {
+        return $this->_get(self::CC_LAST4);
+    }
+
+    /**
+     * Returns cc_number_enc
+     *
+     * @return string
+     */
+    public function getCcNumberEnc()
+    {
+        return $this->_get(self::CC_NUMBER_ENC);
+    }
+
+    /**
+     * Returns cc_owner
+     *
+     * @return string
+     */
+    public function getCcOwner()
+    {
+        return $this->_get(self::CC_OWNER);
+    }
+
+    /**
+     * Returns cc_secure_verify
+     *
+     * @return string
+     */
+    public function getCcSecureVerify()
+    {
+        return $this->_get(self::CC_SECURE_VERIFY);
+    }
+
+    /**
+     * Returns cc_ss_issue
+     *
+     * @return string
+     */
+    public function getCcSsIssue()
+    {
+        return $this->_get(self::CC_SS_ISSUE);
+    }
+
+    /**
+     * Returns cc_ss_start_month
+     *
+     * @return string
+     */
+    public function getCcSsStartMonth()
+    {
+        return $this->_get(self::CC_SS_START_MONTH);
+    }
+
+    /**
+     * Returns cc_ss_start_year
+     *
+     * @return string
+     */
+    public function getCcSsStartYear()
+    {
+        return $this->_get(self::CC_SS_START_YEAR);
+    }
+
+    /**
+     * Returns cc_status
+     *
+     * @return string
+     */
+    public function getCcStatus()
+    {
+        return $this->_get(self::CC_STATUS);
+    }
+
+    /**
+     * Returns cc_status_description
+     *
+     * @return string
+     */
+    public function getCcStatusDescription()
+    {
+        return $this->_get(self::CC_STATUS_DESCRIPTION);
+    }
+
+    /**
+     * Returns cc_trans_id
+     *
+     * @return string
+     */
+    public function getCcTransId()
+    {
+        return $this->_get(self::CC_TRANS_ID);
+    }
+
+    /**
+     * Returns cc_type
+     *
+     * @return string
+     */
+    public function getCcType()
+    {
+        return $this->_get(self::CC_TYPE);
+    }
+
+    /**
+     * Returns echeck_account_name
+     *
+     * @return string
+     */
+    public function getEcheckAccountName()
+    {
+        return $this->_get(self::ECHECK_ACCOUNT_NAME);
+    }
+
+    /**
+     * Returns echeck_account_type
+     *
+     * @return string
+     */
+    public function getEcheckAccountType()
+    {
+        return $this->_get(self::ECHECK_ACCOUNT_TYPE);
+    }
+
+    /**
+     * Returns echeck_bank_name
+     *
+     * @return string
+     */
+    public function getEcheckBankName()
+    {
+        return $this->_get(self::ECHECK_BANK_NAME);
+    }
+
+    /**
+     * Returns echeck_routing_number
+     *
+     * @return string
+     */
+    public function getEcheckRoutingNumber()
+    {
+        return $this->_get(self::ECHECK_ROUTING_NUMBER);
+    }
+
+    /**
+     * Returns echeck_type
+     *
+     * @return string
+     */
+    public function getEcheckType()
+    {
+        return $this->_get(self::ECHECK_TYPE);
+    }
+
+    /**
+     * Returns entity_id
+     *
+     * @return int
+     */
+    public function getEntityId()
+    {
+        return $this->_get(self::ENTITY_ID);
+    }
+
+    /**
+     * Returns last_trans_id
+     *
+     * @return string
+     */
+    public function getLastTransId()
+    {
+        return $this->_get(self::LAST_TRANS_ID);
+    }
+
+    /**
+     * Returns method
+     *
+     * @return string
+     */
+    public function getMethod()
+    {
+        return $this->_get(self::METHOD);
+    }
+
+    /**
+     * Returns parent_id
+     *
+     * @return int
+     */
+    public function getParentId()
+    {
+        return $this->_get(self::PARENT_ID);
+    }
+
+    /**
+     * Returns po_number
+     *
+     * @return string
+     */
+    public function getPoNumber()
+    {
+        return $this->_get(self::PO_NUMBER);
+    }
+
+    /**
+     * Returns protection_eligibility
+     *
+     * @return string
+     */
+    public function getProtectionEligibility()
+    {
+        return $this->_get(self::PROTECTION_ELIGIBILITY);
+    }
+
+    /**
+     * Returns quote_payment_id
+     *
+     * @return int
+     */
+    public function getQuotePaymentId()
+    {
+        return $this->_get(self::QUOTE_PAYMENT_ID);
+    }
+
+    /**
+     * Returns shipping_amount
+     *
+     * @return float
+     */
+    public function getShippingAmount()
+    {
+        return $this->_get(self::SHIPPING_AMOUNT);
+    }
+
+    /**
+     * Returns shipping_captured
+     *
+     * @return float
+     */
+    public function getShippingCaptured()
+    {
+        return $this->_get(self::SHIPPING_CAPTURED);
+    }
+
+    /**
+     * Returns shipping_refunded
+     *
+     * @return float
+     */
+    public function getShippingRefunded()
+    {
+        return $this->_get(self::SHIPPING_REFUNDED);
+    }
+}
diff --git a/app/code/Magento/Sales/Service/V1/Data/OrderStatusHistory.php b/app/code/Magento/Sales/Service/V1/Data/OrderStatusHistory.php
new file mode 100644
index 0000000000000000000000000000000000000000..4e22c6f7bf335a9abe8e96269303fb3058f7891c
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/Data/OrderStatusHistory.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\Sales\Service\V1\Data;
+
+use Magento\Framework\Service\Data\AbstractObject as DataObject;
+
+/**
+ * Class OrderStatusHistory
+ */
+class OrderStatusHistory extends DataObject
+{
+    const ENTITY_ID = 'entity_id';
+    const PARENT_ID = 'parent_id';
+    const IS_CUSTOMER_NOTIFIED = 'is_customer_notified';
+    const IS_VISIBLE_ON_FRONT = 'is_visible_on_front';
+    const COMMENT = 'comment';
+    const STATUS = 'status';
+    const CREATED_AT = 'created_at';
+    const ENTITY_NAME = 'entity_name';
+
+    /**
+     * Returns comment
+     *
+     * @return string
+     */
+    public function getComment()
+    {
+        return $this->_get(self::COMMENT);
+    }
+
+    /**
+     * Returns created_at
+     *
+     * @return string
+     */
+    public function getCreatedAt()
+    {
+        return $this->_get(self::CREATED_AT);
+    }
+
+    /**
+     * Returns entity_id
+     *
+     * @return int
+     */
+    public function getEntityId()
+    {
+        return $this->_get(self::ENTITY_ID);
+    }
+
+    /**
+     * Returns entity_name
+     *
+     * @return string
+     */
+    public function getEntityName()
+    {
+        return $this->_get(self::ENTITY_NAME);
+    }
+
+    /**
+     * Returns is_customer_notified
+     *
+     * @return int
+     */
+    public function getIsCustomerNotified()
+    {
+        return $this->_get(self::IS_CUSTOMER_NOTIFIED);
+    }
+
+    /**
+     * Returns is_visible_on_front
+     *
+     * @return int
+     */
+    public function getIsVisibleOnFront()
+    {
+        return $this->_get(self::IS_VISIBLE_ON_FRONT);
+    }
+
+    /**
+     * Returns parent_id
+     *
+     * @return int
+     */
+    public function getParentId()
+    {
+        return $this->_get(self::PARENT_ID);
+    }
+
+    /**
+     * Returns status
+     *
+     * @return string
+     */
+    public function getStatus()
+    {
+        return $this->_get(self::STATUS);
+    }
+}
diff --git a/app/code/Magento/Sales/Service/V1/Data/Shipment.php b/app/code/Magento/Sales/Service/V1/Data/Shipment.php
new file mode 100644
index 0000000000000000000000000000000000000000..814b6472c937b6275ce747de558ec896b27b655b
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/Data/Shipment.php
@@ -0,0 +1,257 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Data;
+
+use Magento\Framework\Service\Data\AbstractObject as DataObject;
+
+/**
+ * Class Shipment
+ */
+class Shipment extends DataObject
+{
+    /**
+     * int
+     */
+    const ENTITY_ID = 'entity_id';
+
+    /**
+     * int
+     */
+    const STORE_ID = 'store_id';
+
+    /**
+     * float
+     */
+    const TOTAL_WEIGHT = 'total_weight';
+
+    /**
+     * float
+     */
+    const TOTAL_QTY = 'total_qty';
+
+    /**
+     * int
+     */
+    const EMAIL_SENT = 'email_sent';
+
+    /**
+     * int
+     */
+    const ORDER_ID = 'order_id';
+
+    /**
+     * int
+     */
+    const CUSTOMER_ID = 'customer_id';
+
+    /**
+     * int
+     */
+    const SHIPPING_ADDRESS_ID = 'shipping_address_id';
+
+    /**
+     * int
+     */
+    const BILLING_ADDRESS_ID = 'billing_address_id';
+
+    /**
+     * int
+     */
+    const SHIPMENT_STATUS = 'shipment_status';
+
+    /**
+     * string
+     */
+    const INCREMENT_ID = 'increment_id';
+
+    /**
+     * string
+     */
+    const CREATED_AT = 'created_at';
+
+    /**
+     * string
+     */
+    const UPDATED_AT = 'updated_at';
+
+    /**
+     * string
+     */
+    const PACKAGES = 'packages';
+
+    /**
+     * mediumblob
+     */
+    const SHIPPING_LABEL = 'shipping_label';
+
+    /**
+     * Returns billing_address_id
+     *
+     * @return int
+     */
+    public function getBillingAddressId()
+    {
+        return $this->_get(self::BILLING_ADDRESS_ID);
+    }
+
+    /**
+     * Returns created_at
+     *
+     * @return string
+     */
+    public function getCreatedAt()
+    {
+        return $this->_get(self::CREATED_AT);
+    }
+
+    /**
+     * Returns customer_id
+     *
+     * @return int
+     */
+    public function getCustomerId()
+    {
+        return $this->_get(self::CUSTOMER_ID);
+    }
+
+    /**
+     * Returns email_sent
+     *
+     * @return int
+     */
+    public function getEmailSent()
+    {
+        return $this->_get(self::EMAIL_SENT);
+    }
+
+    /**
+     * Returns entity_id
+     *
+     * @return int
+     */
+    public function getEntityId()
+    {
+        return $this->_get(self::ENTITY_ID);
+    }
+
+    /**
+     * Returns increment_id
+     *
+     * @return string
+     */
+    public function getIncrementId()
+    {
+        return $this->_get(self::INCREMENT_ID);
+    }
+
+    /**
+     * Returns order_id
+     *
+     * @return int
+     */
+    public function getOrderId()
+    {
+        return $this->_get(self::ORDER_ID);
+    }
+
+    /**
+     * Returns packages
+     *
+     * @return string
+     */
+    public function getPackages()
+    {
+        return $this->_get(self::PACKAGES);
+    }
+
+    /**
+     * Returns shipment_status
+     *
+     * @return int
+     */
+    public function getShipmentStatus()
+    {
+        return $this->_get(self::SHIPMENT_STATUS);
+    }
+
+    /**
+     * Returns shipping_address_id
+     *
+     * @return int
+     */
+    public function getShippingAddressId()
+    {
+        return $this->_get(self::SHIPPING_ADDRESS_ID);
+    }
+
+    /**
+     * Returns shipping_label
+     *
+     * @return string
+     */
+    public function getShippingLabel()
+    {
+        return $this->_get(self::SHIPPING_LABEL);
+    }
+
+    /**
+     * Returns store_id
+     *
+     * @return int
+     */
+    public function getStoreId()
+    {
+        return $this->_get(self::STORE_ID);
+    }
+
+    /**
+     * Returns total_qty
+     *
+     * @return float
+     */
+    public function getTotalQty()
+    {
+        return $this->_get(self::TOTAL_QTY);
+    }
+
+    /**
+     * Returns total_weight
+     *
+     * @return float
+     */
+    public function getTotalWeight()
+    {
+        return $this->_get(self::TOTAL_WEIGHT);
+    }
+
+    /**
+     * Returns updated_at
+     *
+     * @return string
+     */
+    public function getUpdatedAt()
+    {
+        return $this->_get(self::UPDATED_AT);
+    }
+}
diff --git a/app/code/Magento/Sales/Service/V1/Data/ShipmentItem.php b/app/code/Magento/Sales/Service/V1/Data/ShipmentItem.php
new file mode 100644
index 0000000000000000000000000000000000000000..4c5eb9f556ab8c6d3541304827c94b23e667a394
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/Data/ShipmentItem.php
@@ -0,0 +1,213 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Data;
+
+use Magento\Framework\Service\Data\AbstractObject as DataObject;
+
+/**
+ * Class ShipmentItem
+ */
+class ShipmentItem extends DataObject
+{
+
+    /**
+     * int
+     */
+    const ENTITY_ID = 'entity_id';
+
+    /**
+     * int
+     */
+    const PARENT_ID = 'parent_id';
+
+    /**
+     * float
+     */
+    const ROW_TOTAL = 'row_total';
+
+    /**
+     * float
+     */
+    const PRICE = 'price';
+
+    /**
+     * float
+     */
+    const WEIGHT = 'weight';
+
+    /**
+     * float
+     */
+    const QTY = 'qty';
+
+    /**
+     * int
+     */
+    const PRODUCT_ID = 'product_id';
+
+    /**
+     * int
+     */
+    const ORDER_ITEM_ID = 'order_item_id';
+
+    /**
+     * string
+     */
+    const ADDITIONAL_DATA = 'additional_data';
+
+    /**
+     * string
+     */
+    const DESCRIPTION = 'description';
+
+    /**
+     * string
+     */
+    const NAME = 'name';
+
+    /**
+     * string
+     */
+    const SKU = 'sku';
+
+    /**
+     * Returns additional_data
+     *
+     * @return string
+     */
+    public function getAdditionalData()
+    {
+        return $this->_get(self::ADDITIONAL_DATA);
+    }
+
+    /**
+     * Returns description
+     *
+     * @return string
+     */
+    public function getDescription()
+    {
+        return $this->_get(self::DESCRIPTION);
+    }
+
+    /**
+     * Returns entity_id
+     *
+     * @return int
+     */
+    public function getEntityId()
+    {
+        return $this->_get(self::ENTITY_ID);
+    }
+
+    /**
+     * Returns name
+     *
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->_get(self::NAME);
+    }
+
+    /**
+     * Returns order_item_id
+     *
+     * @return int
+     */
+    public function getOrderItemId()
+    {
+        return $this->_get(self::ORDER_ITEM_ID);
+    }
+
+    /**
+     * Returns parent_id
+     *
+     * @return int
+     */
+    public function getParentId()
+    {
+        return $this->_get(self::PARENT_ID);
+    }
+
+    /**
+     * Returns price
+     *
+     * @return float
+     */
+    public function getPrice()
+    {
+        return $this->_get(self::PRICE);
+    }
+
+    /**
+     * Returns product_id
+     *
+     * @return int
+     */
+    public function getProductId()
+    {
+        return $this->_get(self::PRODUCT_ID);
+    }
+
+    /**
+     * Returns qty
+     *
+     * @return float
+     */
+    public function getQty()
+    {
+        return $this->_get(self::QTY);
+    }
+
+    /**
+     * Returns row_total
+     *
+     * @return float
+     */
+    public function getRowTotal()
+    {
+        return $this->_get(self::ROW_TOTAL);
+    }
+
+    /**
+     * Returns sku
+     *
+     * @return string
+     */
+    public function getSku()
+    {
+        return $this->_get(self::SKU);
+    }
+
+    /**
+     * Returns weight
+     *
+     * @return float
+     */
+    public function getWeight()
+    {
+        return $this->_get(self::WEIGHT);
+    }
+}
diff --git a/app/code/Magento/Sales/Service/V1/Data/ShipmentTrack.php b/app/code/Magento/Sales/Service/V1/Data/ShipmentTrack.php
new file mode 100644
index 0000000000000000000000000000000000000000..5038db1869f8bf56b9a3b49409372e2f33c687e9
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/Data/ShipmentTrack.php
@@ -0,0 +1,198 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Data;
+
+use Magento\Framework\Service\Data\AbstractObject as DataObject;
+
+/**
+ * Class ShipmentTrack
+ */
+class ShipmentTrack extends DataObject
+{
+
+    /**
+     * int
+     */
+    const ENTITY_ID = 'entity_id';
+
+    /**
+     * int
+     */
+    const PARENT_ID = 'parent_id';
+
+    /**
+     * float
+     */
+    const WEIGHT = 'weight';
+
+    /**
+     * float
+     */
+    const QTY = 'qty';
+
+    /**
+     * int
+     */
+    const ORDER_ID = 'order_id';
+
+    /**
+     * string
+     */
+    const TRACK_NUMBER = 'track_number';
+
+    /**
+     * string
+     */
+    const DESCRIPTION = 'description';
+
+    /**
+     * string
+     */
+    const TITLE = 'title';
+
+    /**
+     * string
+     */
+    const CARRIER_CODE = 'carrier_code';
+
+    /**
+     * string
+     */
+    const CREATED_AT = 'created_at';
+
+    /**
+     * string
+     */
+    const UPDATED_AT = 'updated_at';
+
+    /**
+     * Returns carrier_code
+     *
+     * @return string
+     */
+    public function getCarrierCode()
+    {
+        return $this->_get(self::CARRIER_CODE);
+    }
+
+    /**
+     * Returns created_at
+     *
+     * @return string
+     */
+    public function getCreatedAt()
+    {
+        return $this->_get(self::CREATED_AT);
+    }
+
+    /**
+     * Returns description
+     *
+     * @return string
+     */
+    public function getDescription()
+    {
+        return $this->_get(self::DESCRIPTION);
+    }
+
+    /**
+     * Returns entity_id
+     *
+     * @return int
+     */
+    public function getEntityId()
+    {
+        return $this->_get(self::ENTITY_ID);
+    }
+
+    /**
+     * Returns order_id
+     *
+     * @return int
+     */
+    public function getOrderId()
+    {
+        return $this->_get(self::ORDER_ID);
+    }
+
+    /**
+     * Returns parent_id
+     *
+     * @return int
+     */
+    public function getParentId()
+    {
+        return $this->_get(self::PARENT_ID);
+    }
+
+    /**
+     * Returns qty
+     *
+     * @return float
+     */
+    public function getQty()
+    {
+        return $this->_get(self::QTY);
+    }
+
+    /**
+     * Returns title
+     *
+     * @return string
+     */
+    public function getTitle()
+    {
+        return $this->_get(self::TITLE);
+    }
+
+    /**
+     * Returns track_number
+     *
+     * @return string
+     */
+    public function getTrackNumber()
+    {
+        return $this->_get(self::TRACK_NUMBER);
+    }
+
+    /**
+     * Returns updated_at
+     *
+     * @return string
+     */
+    public function getUpdatedAt()
+    {
+        return $this->_get(self::UPDATED_AT);
+    }
+
+    /**
+     * Returns weight
+     *
+     * @return float
+     */
+    public function getWeight()
+    {
+        return $this->_get(self::WEIGHT);
+    }
+}
diff --git a/app/code/Magento/Sales/Service/V1/OrderAddressUpdate.php b/app/code/Magento/Sales/Service/V1/OrderAddressUpdate.php
new file mode 100644
index 0000000000000000000000000000000000000000..0ee239faf420a4326813f2385db6b9946c1185f1
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/OrderAddressUpdate.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\Sales\Service\V1;
+
+use Magento\Sales\Model\Order\AddressConverter;
+use Magento\Sales\Service\V1\Data\OrderAddress;
+
+/**
+ * Class OrderAddressUpdate
+ */
+class OrderAddressUpdate implements OrderAddressUpdateInterface
+{
+    /**
+     * @var AddressConverter
+     */
+    protected $addressConverter;
+
+    /**
+     * @param AddressConverter $addressConverter
+     */
+    public function __construct(
+        AddressConverter $addressConverter
+    ) {
+        $this->addressConverter = $addressConverter;
+    }
+
+    /**
+     * Invoke order address update service
+     *
+     * @param \Magento\Sales\Service\V1\Data\OrderAddress $orderAddress
+     * @return bool
+     */
+    public function invoke(OrderAddress $orderAddress)
+    {
+        $orderAddressModel = $this->addressConverter->getModel($orderAddress);
+        return (bool)$orderAddressModel->save();
+    }
+}
diff --git a/app/code/Magento/Sales/Service/V1/OrderAddressUpdateInterface.php b/app/code/Magento/Sales/Service/V1/OrderAddressUpdateInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..16237cbe85e5a7fb83f19f5e6cd79ba6340e8fb0
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/OrderAddressUpdateInterface.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\Sales\Service\V1;
+
+/**
+ * Interface OrderAddressUpdate
+ * @package Magento\Sales\Service\V1
+ */
+interface OrderAddressUpdateInterface
+{
+    /**
+     * Invoke orderAddressUpdate service
+     *
+     * @param \Magento\Sales\Service\V1\Data\OrderAddress $orderAddress
+     * @return bool
+     * @throws void
+     */
+    public function invoke(\Magento\Sales\Service\V1\Data\OrderAddress $orderAddress);
+}
diff --git a/app/code/Magento/Sales/Service/V1/OrderCancel.php b/app/code/Magento/Sales/Service/V1/OrderCancel.php
new file mode 100644
index 0000000000000000000000000000000000000000..a1fd9a36bd62c9cd9ed2f1a5deb07839f5a3e873
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/OrderCancel.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\Sales\Service\V1;
+
+use Magento\Sales\Model\OrderRepository;
+use Magento\Sales\Service\V1\Data\OrderMapper;
+
+/**
+ * Class OrderCancel
+ */
+class OrderCancel implements OrderCancelInterface
+{
+    /**
+     * @var OrderRepository
+     */
+    protected $orderRepository;
+
+    /**
+     * @param OrderRepository $orderRepository
+     */
+    public function __construct(OrderRepository $orderRepository)
+    {
+        $this->orderRepository = $orderRepository;
+    }
+
+    /**
+     * Invoke getOrder service
+     *
+     * @param int $id
+     * @return bool
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     */
+    public function invoke($id)
+    {
+        return (bool)$this->orderRepository->get($id)->cancel();
+    }
+}
diff --git a/app/code/Magento/Sales/Service/V1/OrderCancelInterface.php b/app/code/Magento/Sales/Service/V1/OrderCancelInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..6fcdae3e1477b024b440c1a9de028514dbb86f3a
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/OrderCancelInterface.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\Sales\Service\V1;
+
+/**
+ * Interface OrderCancelInterface
+ */
+interface OrderCancelInterface
+{
+    /**
+     * Invoke getOrder service
+     *
+     * @param int $id
+     * @return bool
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     */
+    public function invoke($id);
+}
diff --git a/app/code/Magento/Sales/Service/V1/OrderCommentsList.php b/app/code/Magento/Sales/Service/V1/OrderCommentsList.php
new file mode 100644
index 0000000000000000000000000000000000000000..4d202befae69f2923d25b2f0b2c60f65017d4838
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/OrderCommentsList.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\Sales\Service\V1;
+
+use Magento\Sales\Model\Order\Status\HistoryRepository;
+use Magento\Sales\Service\V1\Data\OrderStatusHistoryMapper;
+use Magento\Framework\Service\V1\Data\SearchCriteriaBuilder;
+use Magento\Framework\Service\V1\Data\FilterBuilder;
+use Magento\Sales\Service\V1\Data\OrderStatusHistorySearchResultsBuilder;
+
+/**
+ * Class OrderCommentsList
+ */
+class OrderCommentsList implements OrderCommentsListInterface
+{
+    /**
+     * @var HistoryRepository
+     */
+    protected $historyRepository;
+
+    /**
+     * @var OrderStatusHistoryMapper
+     */
+    protected $historyMapper;
+
+    /**
+     * @var SearchCriteriaBuilder
+     */
+    protected $criteriaBuilder;
+
+    /**
+     * @var FilterBuilder
+     */
+    protected $filterBuilder;
+
+    /**
+     * @var OrderStatusHistorySearchResultsBuilder
+     */
+    protected $searchResultsBuilder;
+
+    /**
+     * @param HistoryRepository $historyRepository
+     * @param OrderStatusHistoryMapper $historyMapper
+     * @param SearchCriteriaBuilder $criteriaBuilder
+     * @param FilterBuilder $filterBuilder
+     * @param OrderStatusHistorySearchResultsBuilder $searchResultsBuilder
+     */
+    public function __construct(
+        HistoryRepository $historyRepository,
+        OrderStatusHistoryMapper $historyMapper,
+        SearchCriteriaBuilder $criteriaBuilder,
+        FilterBuilder $filterBuilder,
+        OrderStatusHistorySearchResultsBuilder $searchResultsBuilder
+    ) {
+        $this->historyRepository = $historyRepository;
+        $this->historyMapper = $historyMapper;
+        $this->criteriaBuilder = $criteriaBuilder;
+        $this->filterBuilder = $filterBuilder;
+        $this->searchResultsBuilder = $searchResultsBuilder;
+    }
+
+    /**
+     * Invoke OrderCommentsList service
+     *
+     * @param int $id
+     * @return \Magento\Sales\Service\V1\Data\OrderStatusHistorySearchResults
+     */
+    public function invoke($id)
+    {
+        $this->criteriaBuilder->addFilter(
+            ['eq' => $this->filterBuilder->setField('parent_id')->setValue($id)->create()]
+        );
+        $criteria = $this->criteriaBuilder->create();
+        $comments = [];
+        foreach ($this->historyRepository->find($criteria) as $comment) {
+            $comments[] = $this->historyMapper->extractDto($comment);
+        }
+        return $this->searchResultsBuilder->setItems($comments)
+            ->setSearchCriteria($criteria)
+            ->setTotalCount(count($comments))
+            ->create();
+    }
+}
diff --git a/app/code/Magento/Sales/Service/V1/OrderCommentsListInterface.php b/app/code/Magento/Sales/Service/V1/OrderCommentsListInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..64de1d900671af2533b70accdacafeb4a990e907
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/OrderCommentsListInterface.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\Sales\Service\V1;
+
+/**
+ * Interface OrderCommentsListInterface
+ */
+interface OrderCommentsListInterface
+{
+    /**
+     * Invoke OrderCommentsList service
+     *
+     * @param int $id
+     * @return \Magento\Sales\Service\V1\Data\OrderStatusHistorySearchResults
+     */
+    public function invoke($id);
+}
diff --git a/app/code/Magento/Sales/Service/V1/OrderGet.php b/app/code/Magento/Sales/Service/V1/OrderGet.php
new file mode 100644
index 0000000000000000000000000000000000000000..0fe552bd9d41aee58d012c74780a5db571a535bb
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/OrderGet.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\Sales\Service\V1;
+
+use Magento\Sales\Model\OrderRepository;
+use Magento\Sales\Service\V1\Data\OrderMapper;
+
+/**
+ * Class OrderGet
+ */
+class OrderGet implements OrderGetInterface
+{
+    /**
+     * @var OrderRepository
+     */
+    protected $orderRepository;
+
+    /**
+     * @var OrderMapper
+     */
+    protected $orderMapper;
+
+    /**
+     * @param OrderRepository $orderRepository
+     * @param OrderMapper $orderMapper
+     */
+    public function __construct(
+        OrderRepository $orderRepository,
+        OrderMapper $orderMapper
+    ) {
+        $this->orderRepository = $orderRepository;
+        $this->orderMapper = $orderMapper;
+    }
+
+    /**
+     * Invoke getOrder service
+     *
+     * @param int $id
+     * @return \Magento\Sales\Service\V1\Data\Order
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     */
+    public function invoke($id)
+    {
+        $order = $this->orderRepository->get($id);
+        return $this->orderMapper->extractDto($order);
+    }
+}
diff --git a/app/code/Magento/Sales/Service/V1/OrderGetInterface.php b/app/code/Magento/Sales/Service/V1/OrderGetInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..edc166d4782f622da1c123c6eae794fa995898bf
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/OrderGetInterface.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\Sales\Service\V1;
+
+/**
+ * Interface OrderGetInterface
+ */
+interface OrderGetInterface
+{
+    /**
+     * Invoke getOrder service
+     *
+     * @param int $id
+     * @return \Magento\Sales\Service\V1\Data\Order
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     */
+    public function invoke($id);
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Resource/Product/Option/ValueStub.php b/app/code/Magento/Sales/Service/V1/OrderGetStatus.php
similarity index 60%
rename from dev/tests/unit/testsuite/Magento/Catalog/Model/Resource/Product/Option/ValueStub.php
rename to app/code/Magento/Sales/Service/V1/OrderGetStatus.php
index 1145c5e71ae0885d33219312ac4f083d910c9636..cc7b678f8ffc8f3b98839e86f303c80f52bccf3b 100644
--- a/dev/tests/unit/testsuite/Magento/Catalog/Model/Resource/Product/Option/ValueStub.php
+++ b/app/code/Magento/Sales/Service/V1/OrderGetStatus.php
@@ -21,36 +21,39 @@
  * @copyright   Copyright (c) 2014 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\Option;
+namespace Magento\Sales\Service\V1;
 
-class ValueStub extends \Magento\Catalog\Model\Resource\Product\Option\Value
+use Magento\Sales\Model\OrderRepository;
+
+/**
+ * Class OrderGetStatus
+ */
+class OrderGetStatus implements OrderGetStatusInterface
 {
     /**
-     * Stub parent constructor
+     * Order repository
+     *
+     * @var OrderRepository
      */
-    public function __construct()
-    {
-        $this->_connections = array('read' => new MysqlStub(), 'write' => new MysqlStub());
-    }
+    protected $orderRepository;
 
     /**
-     * Save option value price data
-     *
-     * @param \Magento\Framework\Model\AbstractModel $object
+     * @param OrderRepository $orderRepository
      */
-    public function saveValueTitles(\Magento\Framework\Model\AbstractModel $object)
+    public function __construct(OrderRepository $orderRepository)
     {
-        $this->_saveValueTitles($object);
+        $this->orderRepository = $orderRepository;
     }
 
     /**
-     * We should stub to not use db
+     * Retrieve order status by id
      *
-     * @param string $tableName
+     * @param int $id
      * @return string
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
      */
-    public function getTable($tableName)
+    public function invoke($id)
     {
-        return $tableName;
+        return $this->orderRepository->get($id)->getStatus();
     }
 }
diff --git a/app/code/Magento/Sales/Service/V1/OrderGetStatusInterface.php b/app/code/Magento/Sales/Service/V1/OrderGetStatusInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..821a64129ae24296e6f97dc8148676091f6a1a0a
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/OrderGetStatusInterface.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\Sales\Service\V1;
+
+/**
+ * Interface OrderGetStatusInterface
+ * @package Magento\Sales\Service\V1
+ */
+interface OrderGetStatusInterface
+{
+    /**
+     * Retrieve order status by id
+     *
+     * @param int $id
+     * @return string
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     */
+    public function invoke($id);
+}
diff --git a/app/code/Magento/Sales/Service/V1/OrderHold.php b/app/code/Magento/Sales/Service/V1/OrderHold.php
new file mode 100644
index 0000000000000000000000000000000000000000..0f3500d71a6e89a3a625fb474468c5d9d8b26491
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/OrderHold.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\Sales\Service\V1;
+
+use Magento\Sales\Model\OrderRepository;
+
+/**
+ * Class OrderHold
+ */
+class OrderHold implements OrderHoldInterface
+{
+    /**
+     * @var OrderRepository
+     */
+    protected $orderRepository;
+
+    /**
+     * @param OrderRepository $orderRepository
+     */
+    public function __construct(OrderRepository $orderRepository)
+    {
+        $this->orderRepository = $orderRepository;
+    }
+
+    /**
+     * Invoke orderHold service
+     *
+     * @param int $id
+     * @return bool
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     */
+    public function invoke($id)
+    {
+        return (bool)$this->orderRepository->get($id)->hold();
+    }
+}
diff --git a/app/code/Magento/Sales/Service/V1/OrderHoldInterface.php b/app/code/Magento/Sales/Service/V1/OrderHoldInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..0ba9ba3733c12b17b2067f72065d542658214437
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/OrderHoldInterface.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\Sales\Service\V1;
+
+/**
+ * Interface OrderHoldInterface
+ */
+interface OrderHoldInterface
+{
+    /**
+     * Invoke orderHold service
+     *
+     * @param int $id
+     * @return bool
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     */
+    public function invoke($id);
+}
diff --git a/app/code/Magento/Sales/Service/V1/OrderList.php b/app/code/Magento/Sales/Service/V1/OrderList.php
new file mode 100644
index 0000000000000000000000000000000000000000..a8afa33b3dfddfb6fa9e7ec7de62d4a1efc20a6d
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/OrderList.php
@@ -0,0 +1,83 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1;
+
+use Magento\Sales\Model\OrderRepository;
+use Magento\Sales\Service\V1\Data\OrderMapper;
+use Magento\Sales\Service\V1\Data\OrderSearchResultsBuilder;
+use Magento\Framework\Service\V1\Data\SearchCriteria;
+
+/**
+ * Class OrderList
+ */
+class OrderList implements OrderListInterface
+{
+    /**
+     * @var OrderRepository
+     */
+    protected $orderRepository;
+
+    /**
+     * @var OrderMapper
+     */
+    protected $orderMapper;
+
+    /**
+     * @var OrderSearchResultsBuilder
+     */
+    protected $searchResultsBuilder;
+
+    /**
+     * @param OrderRepository $orderRepository
+     * @param OrderMapper $orderMapper
+     * @param OrderSearchResultsBuilder $searchResultsBuilder
+     */
+    public function __construct(
+        OrderRepository $orderRepository,
+        OrderMapper $orderMapper,
+        OrderSearchResultsBuilder $searchResultsBuilder
+    ) {
+        $this->orderRepository = $orderRepository;
+        $this->orderMapper = $orderMapper;
+        $this->searchResultsBuilder = $searchResultsBuilder;
+    }
+
+    /**
+     * Invoke OrderList service
+     *
+     * @param SearchCriteria $searchCriteria
+     * @return \Magento\Framework\Service\V1\Data\SearchResults
+     */
+    public function invoke(SearchCriteria $searchCriteria)
+    {
+        $orders = [];
+        foreach ($this->orderRepository->find($searchCriteria) as $order) {
+            $orders[] = $this->orderMapper->extractDto($order);
+        }
+        return $this->searchResultsBuilder->setItems($orders)
+            ->setTotalCount(count($order))
+            ->setSearchCriteria($searchCriteria)
+            ->create();
+    }
+}
diff --git a/app/code/Magento/Sales/Service/V1/OrderListInterface.php b/app/code/Magento/Sales/Service/V1/OrderListInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..508fd35e1f54383ea7c5181e03f3a989e5798dfb
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/OrderListInterface.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\Sales\Service\V1;
+
+use Magento\Framework\Service\V1\Data\SearchCriteria;
+
+/**
+ * Interface OrderListInterface
+ */
+interface OrderListInterface
+{
+    /**
+     * Invoke OrderList service
+     *
+     * @param \Magento\Framework\Service\V1\Data\SearchCriteria $searchCriteria
+     * @return \Magento\Catalog\Service\V1\Data\Product\SearchResults
+     */
+    public function invoke(SearchCriteria $searchCriteria);
+}
diff --git a/app/code/Magento/Webapi/Controller/Login/Anonymous.php b/app/code/Magento/Sales/Service/V1/OrderNotifyUser.php
similarity index 54%
rename from app/code/Magento/Webapi/Controller/Login/Anonymous.php
rename to app/code/Magento/Sales/Service/V1/OrderNotifyUser.php
index 2cbfa8ee2355a514e24456b3f0dc55bcbde3cc74..433a3c359a6529dc8bca3498182e854ba621d4d6 100644
--- a/app/code/Magento/Webapi/Controller/Login/Anonymous.php
+++ b/app/code/Magento/Sales/Service/V1/OrderNotifyUser.php
@@ -1,6 +1,5 @@
 <?php
 /**
- *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -22,41 +21,47 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-namespace Magento\Webapi\Controller\Login;
+namespace Magento\Sales\Service\V1;
 
-use Magento\Authz\Model\UserIdentifier;
+use Magento\Sales\Model\OrderRepository;
 
-class Anonymous extends \Magento\Framework\App\Action\Action
+/**
+ * Class OrderNotifyUser
+ */
+class OrderNotifyUser implements OrderNotifyUserInterface
 {
     /**
-     * @var \Magento\Framework\Session\Generic
+     * @var OrderRepository
      */
-    protected $session;
+    protected $orderRepository;
 
     /**
-     * Initialize Login Service
-     *
-     * @param \Magento\Framework\App\Action\Context $context
-     * @param \Magento\Framework\Session\Generic $session
+     * @var \Magento\Sales\Model\Notifier
+     */
+    protected $notifier;
+
+    /**
+     * @param OrderRepository $orderRepository
+     * @param \Magento\Sales\Model\Notifier $notifier
      */
     public function __construct(
-        \Magento\Framework\App\Action\Context $context,
-        \Magento\Framework\Session\Generic $session
+        OrderRepository $orderRepository,
+        \Magento\Sales\Model\Notifier $notifier
     ) {
-        parent::__construct($context);
-        $this->session = $session;
+        $this->orderRepository = $orderRepository;
+        $this->notifier = $notifier;
     }
 
     /**
-     * Initiate a session for unregistered users. Send back the session id.
+     * Invoke notifyUser service
      *
-     * @return void
+     * @param int $id
+     * @return bool
      */
-    public function execute()
+    public function invoke($id)
     {
-        $this->session->start('frontend');
-        $this->session->setUserId(0);
-        $this->session->setUserType(UserIdentifier::USER_TYPE_GUEST);
-        $this->session->regenerateId(true);
+        /** @var \Magento\Sales\Model\Order $order */
+        $order = $this->orderRepository->get($id);
+        return $this->notifier->notify($order);
     }
 }
diff --git a/app/code/Magento/Sales/Service/V1/OrderNotifyUserInterface.php b/app/code/Magento/Sales/Service/V1/OrderNotifyUserInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..2ed67edf6cc919c7efd35f74e740d486323f320d
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/OrderNotifyUserInterface.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\Sales\Service\V1;
+
+/**
+ * Class OrderNotifyUser
+ */
+interface OrderNotifyUserInterface
+{
+    /**
+     * Invoke notifyUser service
+     *
+     * @param int $id
+     * @return bool
+     */
+    public function invoke($id);
+}
diff --git a/app/code/Magento/Sales/Service/V1/OrderStatusHistoryAdd.php b/app/code/Magento/Sales/Service/V1/OrderStatusHistoryAdd.php
new file mode 100644
index 0000000000000000000000000000000000000000..95188ae734feae1cdb06bd102b026a15e49eaf16
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/OrderStatusHistoryAdd.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\Sales\Service\V1;
+
+use Magento\Sales\Model\OrderRepository;
+use Magento\Sales\Model\Order\Status\HistoryConverter;
+use Magento\Sales\Service\V1\Data\OrderStatusHistory;
+
+/**
+ * Class OrderStatusHistoryAdd
+ * @package Magento\Sales\Service\V1
+ */
+class OrderStatusHistoryAdd implements OrderStatusHistoryAddInterface
+{
+    /**
+     * @var OrderRepository
+     */
+    protected $orderRepository;
+
+    /**
+     * @var HistoryConverter
+     */
+    protected $historyConverter;
+
+    /**
+     * @param OrderRepository $orderRepository
+     * @param HistoryConverter $historyConverter
+     */
+    public function __construct(
+        OrderRepository $orderRepository,
+        HistoryConverter $historyConverter
+    ) {
+        $this->orderRepository = $orderRepository;
+        $this->historyConverter = $historyConverter;
+    }
+
+    /**
+     * Invoke service
+     *
+     * @param int $id
+     * @param \Magento\Sales\Service\V1\Data\OrderStatusHistory $statusHistory
+     * @return bool
+     */
+    public function invoke($id, OrderStatusHistory $statusHistory)
+    {
+        $order = $this->orderRepository->get($id);
+        $order->addStatusHistory($this->historyConverter->getModel($statusHistory));
+        $order->save();
+        return true;
+    }
+}
diff --git a/app/code/Magento/Sales/Service/V1/OrderStatusHistoryAddInterface.php b/app/code/Magento/Sales/Service/V1/OrderStatusHistoryAddInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..d02279df3f8c04acb0ae8dd839f843cef87676b0
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/OrderStatusHistoryAddInterface.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1;
+
+use Magento\Sales\Service\V1\Data\OrderStatusHistory;
+
+/**
+ * Interface OrderCommentsAddInterface
+ * @package Magento\Sales\Service\V1
+ */
+interface OrderStatusHistoryAddInterface
+{
+    /**
+     * Invoke service
+     *
+     * @param int $id
+     * @param \Magento\Sales\Service\V1\Data\OrderStatusHistory $statusHistory
+     * @return bool
+     */
+    public function invoke($id, OrderStatusHistory $statusHistory);
+}
diff --git a/app/code/Magento/Sales/Service/V1/OrderUnHold.php b/app/code/Magento/Sales/Service/V1/OrderUnHold.php
new file mode 100644
index 0000000000000000000000000000000000000000..d25ace683103c87a47206aab587b4fff93e20673
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/OrderUnHold.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\Sales\Service\V1;
+
+use Magento\Sales\Model\OrderRepository;
+
+/**
+ * Class OrderUnHold
+ */
+class OrderUnHold implements OrderUnHoldInterface
+{
+    /**
+     * @var OrderRepository
+     */
+    protected $orderRepository;
+
+    /**
+     * @param OrderRepository $orderRepository
+     */
+    public function __construct(OrderRepository $orderRepository)
+    {
+        $this->orderRepository = $orderRepository;
+    }
+
+    /**
+     * Invoke orderUnHold service
+     *
+     * @param int $id
+     * @return bool
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     */
+    public function invoke($id)
+    {
+        return (bool)$this->orderRepository->get($id)->unhold();
+    }
+}
diff --git a/app/code/Magento/Sales/Service/V1/OrderUnHoldInterface.php b/app/code/Magento/Sales/Service/V1/OrderUnHoldInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..720df5f28b4c7c6295cf4312a9032f1b18c39b3d
--- /dev/null
+++ b/app/code/Magento/Sales/Service/V1/OrderUnHoldInterface.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\Sales\Service\V1;
+
+/**
+ * Interface OrderUnHoldInterface
+ */
+interface OrderUnHoldInterface
+{
+    /**
+     * Invoke orderUnHold service
+     *
+     * @param int $id
+     * @return bool
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     */
+    public function invoke($id);
+}
diff --git a/app/code/Magento/Sales/composer.json b/app/code/Magento/Sales/composer.json
index 6fe30a6d47a5170eb72a6bb46fef97ee94845404..3fc154834cc263454b3ce7b09be0243b21ca9eca 100644
--- a/app/code/Magento/Sales/composer.json
+++ b/app/code/Magento/Sales/composer.json
@@ -2,32 +2,32 @@
     "name": "magento/module-sales",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-payment": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-checkout": "0.1.0-alpha89",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/module-sales-rule": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-widget": "0.1.0-alpha89",
-        "magento/module-directory": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/module-tax": "0.1.0-alpha89",
-        "magento/module-gift-message": "0.1.0-alpha89",
-        "magento/module-reports": "0.1.0-alpha89",
-        "magento/module-weee": "0.1.0-alpha89",
-        "magento/module-rss": "0.1.0-alpha89",
-        "magento/module-catalog-inventory": "0.1.0-alpha89",
-        "magento/module-wishlist": "0.1.0-alpha89",
-        "magento/module-email": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-payment": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-checkout": "0.1.0-alpha90",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/module-sales-rule": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-widget": "0.1.0-alpha90",
+        "magento/module-directory": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/module-tax": "0.1.0-alpha90",
+        "magento/module-gift-message": "0.1.0-alpha90",
+        "magento/module-reports": "0.1.0-alpha90",
+        "magento/module-weee": "0.1.0-alpha90",
+        "magento/module-rss": "0.1.0-alpha90",
+        "magento/module-catalog-inventory": "0.1.0-alpha90",
+        "magento/module-wishlist": "0.1.0-alpha90",
+        "magento/module-email": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Sales/etc/adminhtml/acl.xml b/app/code/Magento/Sales/etc/acl.xml
similarity index 97%
rename from app/code/Magento/Sales/etc/adminhtml/acl.xml
rename to app/code/Magento/Sales/etc/acl.xml
index b92215e664fcf6bfcd8f6dab07d3f13ec54fa3cc..1edf5830afe6df37966c93a3f410f7d88dabc5de 100644
--- a/app/code/Magento/Sales/etc/adminhtml/acl.xml
+++ b/app/code/Magento/Sales/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/Sales/etc/di.xml b/app/code/Magento/Sales/etc/di.xml
index 3dbae800e8d082f86d0febcc6436cb86da03980f..991b5f78ecf1323a7300715a9d7934c27b5e02c7 100644
--- a/app/code/Magento/Sales/etc/di.xml
+++ b/app/code/Magento/Sales/etc/di.xml
@@ -24,7 +24,17 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
-    <type name="Magento\Sales\Model\Resource\Report" shared="false" />
+    <preference for="Magento\Sales\Service\V1\OrderGetInterface" type="Magento\Sales\Service\V1\OrderGet"/>
+    <preference for="Magento\Sales\Service\V1\OrderCancelInterface" type="Magento\Sales\Service\V1\OrderCancel"/>
+    <preference for="Magento\Sales\Service\V1\OrderListInterface" type="Magento\Sales\Service\V1\OrderList"/>
+    <preference for="Magento\Sales\Service\V1\OrderGetStatusInterface" type="Magento\Sales\Service\V1\OrderGetStatus"/>
+    <preference for="Magento\Sales\Service\V1\OrderHoldInterface" type="Magento\Sales\Service\V1\OrderHold"/>
+    <preference for="Magento\Sales\Service\V1\OrderUnHoldInterface" type="Magento\Sales\Service\V1\OrderUnHold"/>
+    <preference for="Magento\Sales\Service\V1\OrderNotifyUserInterface" type="Magento\Sales\Service\V1\OrderNotifyUser"/>
+    <preference for="Magento\Sales\Service\V1\OrderStatusHistoryAddInterface" type="Magento\Sales\Service\V1\OrderStatusHistoryAdd"/>
+    <preference for="Magento\Sales\Service\V1\OrderCommentsListInterface" type="Magento\Sales\Service\V1\OrderCommentsList"/>
+    <preference for="Magento\Sales\Service\V1\OrderAddressUpdateInterface" type="Magento\Sales\Service\V1\OrderAddressUpdate"/>
+    <type name="Magento\Sales\Model\Resource\Report" shared="false"/>
     <type name="Magento\Sales\Model\Order\Pdf\Config\Reader">
         <arguments>
             <argument name="fileName" xsi:type="string">pdf.xml</argument>
diff --git a/app/code/Magento/Sales/etc/webapi.xml b/app/code/Magento/Sales/etc/webapi.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fa435cb99b524656c55d63816fc1e56ecc2cdba1
--- /dev/null
+++ b/app/code/Magento/Sales/etc/webapi.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)
+ */
+-->
+<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="../../../../../app/code/Magento/Webapi/etc/webapi.xsd">
+    <route url="/V1/orders/:id" method="GET">
+        <service class="Magento\Sales\Service\V1\OrderGetInterface" method="invoke"/>
+        <resources>
+            <resource ref="Magento_Sales::sales" />
+        </resources>
+    </route>
+    <route url="/V1/orders/:id/cancellation" method="POST">
+        <service class="Magento\Sales\Service\V1\OrderCancelInterface" method="invoke"/>
+        <resources>
+            <resource ref="Magento_Sales::sales" />
+        </resources>
+    </route>
+    <route url="/V1/orders" method="GET">
+        <service class="Magento\Sales\Service\V1\OrderListInterface" method="invoke"/>
+        <resources>
+            <resource ref="Magento_Sales::sales" />
+        </resources>
+    </route>
+    <route url="/V1/orders/:id/status" method="GET">
+        <service class="Magento\Sales\Service\V1\OrderGetStatusInterface" method="invoke"/>
+        <resources>
+            <resource ref="Magento_Sales::sales" />
+        </resources>
+    </route>
+    <route url="/V1/orders/:id/emails" method="POST">
+        <service class="Magento\Sales\Service\V1\OrderNotifyUserInterface" method="invoke"/>
+        <resources>
+            <resource ref="Magento_Sales::sales" />
+        </resources>
+    </route>
+    <route url="/V1/orders/:id/hold" method="POST">
+        <service class="Magento\Sales\Service\V1\OrderHoldInterface" method="invoke"/>
+        <resources>
+            <resource ref="Magento_Sales::sales" />
+        </resources>
+    </route>
+    <route url="/V1/orders/:id/unhold" method="POST">
+        <service class="Magento\Sales\Service\V1\OrderUnHoldInterface" method="invoke"/>
+        <resources>
+            <resource ref="Magento_Sales::sales" />
+        </resources>
+    </route>
+    <route url="/V1/orders/:id/comment" method="POST">
+        <service class="Magento\Sales\Service\V1\OrderStatusHistoryAddInterface" method="invoke"/>
+        <resources>
+            <resource ref="Magento_Sales::sales" />
+        </resources>
+    </route>
+    <route url="/V1/orders/:id/comments" method="GET">
+        <service class="Magento\Sales\Service\V1\OrderCommentsListInterface" method="invoke"/>
+        <resources>
+            <resource ref="Magento_Sales::sales" />
+        </resources>
+    </route>
+    <route url="/V1/orders/:id" method="PUT">
+        <service class="Magento\Sales\Service\V1\OrderAddressUpdateInterface" method="invoke"/>
+        <resources>
+            <resource ref="Magento_Sales::sales" />
+        </resources>
+    </route>
+</routes>
diff --git a/app/code/Magento/Sales/view/adminhtml/templates/order/create/form.phtml b/app/code/Magento/Sales/view/adminhtml/templates/order/create/form.phtml
index 6682724403385b41f1fdeca364bc737b56b9c21e..cc6aec52007fb9fcc9be0603cae210cc16586257 100644
--- a/app/code/Magento/Sales/view/adminhtml/templates/order/create/form.phtml
+++ b/app/code/Magento/Sales/view/adminhtml/templates/order/create/form.phtml
@@ -21,8 +21,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 \Magento\Sales\Block\Adminhtml\Order\Create\Form $this */
 ?>
-<form id="edit_form" data-order-config="<?php echo $this->getOrderDataJson() ?>" data-load-base-url="<?php echo $this->getLoadBlockUrl() ?>" action="<?php echo $this->getSaveUrl() ?>" method="post" enctype="multipart/form-data">
+<form id="edit_form" data-order-config='<?php echo $this->getOrderDataJson() ?>' data-load-base-url="<?php echo $this->getLoadBlockUrl() ?>" action="<?php echo $this->getSaveUrl() ?>" method="post" enctype="multipart/form-data">
     <?php echo $this->getBlockHtml('formkey')?>
     <div id="order-message">
         <?php echo $this->getChildHtml('message') ?>
diff --git a/app/code/Magento/Sales/view/adminhtml/web/order/create/form.js b/app/code/Magento/Sales/view/adminhtml/web/order/create/form.js
index b833d6459ae78dd662fb36fe5fadff4778788667..9edde1d0be67d50159eb1404a709536a436a4773 100644
--- a/app/code/Magento/Sales/view/adminhtml/web/order/create/form.js
+++ b/app/code/Magento/Sales/view/adminhtml/web/order/create/form.js
@@ -35,7 +35,7 @@ define([
         return;
     }
 
-    config = $el.data('order-config'),
+    config = $el.data('order-config');
     baseUrl = $el.data('load-base-url');
 
     order = new AdminOrder(config);
diff --git a/app/code/Magento/Sales/view/frontend/templates/order/history.phtml b/app/code/Magento/Sales/view/frontend/templates/order/history.phtml
index ef58807040549d84921dc066549c89096f7e4df0..ea69f6635dd6d6fc2e28350a3acfbcb00d9c533d 100644
--- a/app/code/Magento/Sales/view/frontend/templates/order/history.phtml
+++ b/app/code/Magento/Sales/view/frontend/templates/order/history.phtml
@@ -25,9 +25,6 @@
 <?php $_orders = $this->getOrders(); ?>
 <?php echo $this->getChildHtml('info');?>
 <?php if($_orders->getSize()): ?>
-    <?php if ($this->getPagerHtml()): ?>
-        <div class="order-products-toolbar toolbar top"><?php echo $this->getPagerHtml(); ?></div>
-    <?php endif ?>
     <div class="table-wrapper orders-history">
         <table class="data table table-order-items history" id="my-orders-table">
             <caption class="table caption"><?php echo __('Orders') ?></caption>
diff --git a/app/code/Magento/SalesRule/composer.json b/app/code/Magento/SalesRule/composer.json
index 5881306da23dd51f2e5d2afbdf6fcdc4a104b716..5c5e2f7a78711b96a727e05619e51bdaffe1ac55 100644
--- a/app/code/Magento/SalesRule/composer.json
+++ b/app/code/Magento/SalesRule/composer.json
@@ -2,28 +2,28 @@
     "name": "magento/module-sales-rule",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-rule": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-tax": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-directory": "0.1.0-alpha89",
-        "magento/module-shipping": "0.1.0-alpha89",
-        "magento/module-payment": "0.1.0-alpha89",
-        "magento/module-reports": "0.1.0-alpha89",
-        "magento/module-catalog-rule": "0.1.0-alpha89",
-        "magento/module-widget": "0.1.0-alpha89",
-        "magento/module-cron": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-rule": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-tax": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-directory": "0.1.0-alpha90",
+        "magento/module-shipping": "0.1.0-alpha90",
+        "magento/module-payment": "0.1.0-alpha90",
+        "magento/module-reports": "0.1.0-alpha90",
+        "magento/module-catalog-rule": "0.1.0-alpha90",
+        "magento/module-widget": "0.1.0-alpha90",
+        "magento/module-cron": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/SalesRule/etc/adminhtml/acl.xml b/app/code/Magento/SalesRule/etc/acl.xml
similarity index 95%
rename from app/code/Magento/SalesRule/etc/adminhtml/acl.xml
rename to app/code/Magento/SalesRule/etc/acl.xml
index b23b3d35206e56686e45d597069e5bb1996759da..f11abdd737192c9ae6c865550eb00027e3b89add 100644
--- a/app/code/Magento/SalesRule/etc/adminhtml/acl.xml
+++ b/app/code/Magento/SalesRule/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/Sendfriend/composer.json b/app/code/Magento/Sendfriend/composer.json
index ce7c55ff29479c6697b054e2175aadba9fe12757..2f7f51b67ec1f7be1769c55de4ba0d05dcd8d3ad 100644
--- a/app/code/Magento/Sendfriend/composer.json
+++ b/app/code/Magento/Sendfriend/composer.json
@@ -2,17 +2,17 @@
     "name": "magento/module-sendfriend",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/AddComment.php b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/AddComment.php
index d69935e42ce1f3f3dbb8a14ffe0cfa4a696a56ec..6807412a6a51ea9aab1358e8293f9e00683055a5 100644
--- a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/AddComment.php
+++ b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/AddComment.php
@@ -25,6 +25,7 @@
 namespace Magento\Shipping\Controller\Adminhtml\Order\Shipment;
 
 use Magento\Backend\App\Action;
+use \Magento\Sales\Model\Order\Email\Sender\ShipmentSender;
 
 class AddComment extends \Magento\Backend\App\Action
 {
@@ -33,15 +34,23 @@ class AddComment extends \Magento\Backend\App\Action
      */
     protected $shipmentLoader;
 
+    /**
+     * @var ShipmentSender
+     */
+    protected $shipmentSender;
+
     /**
      * @param Action\Context $context
      * @param \Magento\Shipping\Controller\Adminhtml\Order\ShipmentLoader $shipmentLoader
+     * @param ShipmentSender $shipmentSender
      */
     public function __construct(
         Action\Context $context,
-        \Magento\Shipping\Controller\Adminhtml\Order\ShipmentLoader $shipmentLoader
+        \Magento\Shipping\Controller\Adminhtml\Order\ShipmentLoader $shipmentLoader,
+        ShipmentSender $shipmentSender
     ) {
         $this->shipmentLoader = $shipmentLoader;
+        $this->shipmentSender = $shipmentSender;
         parent::__construct($context);
     }
 
@@ -73,7 +82,8 @@ class AddComment extends \Magento\Backend\App\Action
                 isset($data['is_customer_notified']),
                 isset($data['is_visible_on_front'])
             );
-            $shipment->sendUpdateEmail(!empty($data['is_customer_notified']), $data['comment']);
+
+            $this->shipmentSender->send($shipment, !empty($data['is_customer_notified']), $data['comment']);
             $shipment->save();
 
             $this->_view->loadLayout(false);
diff --git a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/Email.php b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/Email.php
index 13365a26921527d4620112fe3673bc2ea73e2adb..62af1f588270dc83b7b6642d710a6c836dbd5e0a 100644
--- a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/Email.php
+++ b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/Email.php
@@ -25,6 +25,7 @@
 namespace Magento\Shipping\Controller\Adminhtml\Order\Shipment;
 
 use \Magento\Backend\App\Action;
+use \Magento\Sales\Model\Order\Email\Sender\ShipmentSender;
 
 class Email extends \Magento\Backend\App\Action
 {
@@ -33,15 +34,23 @@ class Email extends \Magento\Backend\App\Action
      */
     protected $shipmentLoader;
 
+    /**
+     * @var ShipmentSender
+     */
+    protected $shipmentSender;
+
     /**
      * @param Action\Context $context
      * @param \Magento\Shipping\Controller\Adminhtml\Order\ShipmentLoader $shipmentLoader
+     * @param ShipmentSender $shipmentSender
      */
     public function __construct(
         Action\Context $context,
-        \Magento\Shipping\Controller\Adminhtml\Order\ShipmentLoader $shipmentLoader
+        \Magento\Shipping\Controller\Adminhtml\Order\ShipmentLoader $shipmentLoader,
+        ShipmentSender $shipmentSender
     ) {
         $this->shipmentLoader = $shipmentLoader;
+        $this->shipmentSender = $shipmentSender;
         parent::__construct($context);
     }
 
@@ -63,7 +72,9 @@ class Email extends \Magento\Backend\App\Action
         try {
             $shipment = $this->shipmentLoader->load($this->_request);
             if ($shipment) {
-                $shipment->sendEmail(true)->setEmailSent(true)->save();
+                $this->shipmentSender->send($shipment, true);
+                $shipment->save();
+
                 $historyItem = $this->_objectManager->create(
                     'Magento\Sales\Model\Resource\Order\Status\History\Collection'
                 )->getUnnotifiedForInstance(
diff --git a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/Save.php b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/Save.php
index a8e1ef0036758bd5e02f15e007d0a5fb9e9cb64c..8bdd3ed7fca4d0e585d4036ba5cec78c77e505f3 100644
--- a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/Save.php
+++ b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/Save.php
@@ -25,6 +25,7 @@
 namespace Magento\Shipping\Controller\Adminhtml\Order\Shipment;
 
 use \Magento\Backend\App\Action;
+use \Magento\Sales\Model\Order\Email\Sender\ShipmentSender;
 
 class Save extends \Magento\Backend\App\Action
 {
@@ -38,18 +39,26 @@ class Save extends \Magento\Backend\App\Action
      */
     protected $labelGenerator;
 
+    /**
+     * @var ShipmentSender
+     */
+    protected $shipmentSender;
+
     /**
      * @param Action\Context $context
      * @param \Magento\Shipping\Controller\Adminhtml\Order\ShipmentLoader $shipmentLoader
      * @param \Magento\Shipping\Model\Shipping\LabelGenerator $labelGenerator
+     * @param ShipmentSender $shipmentSender
      */
     public function __construct(
         Action\Context $context,
         \Magento\Shipping\Controller\Adminhtml\Order\ShipmentLoader $shipmentLoader,
-        \Magento\Shipping\Model\Shipping\LabelGenerator $labelGenerator
+        \Magento\Shipping\Model\Shipping\LabelGenerator $labelGenerator,
+        ShipmentSender $shipmentSender
     ) {
         $this->shipmentLoader = $shipmentLoader;
         $this->labelGenerator = $labelGenerator;
+        $this->shipmentSender = $shipmentSender;
         parent::__construct($context);
     }
 
@@ -128,7 +137,7 @@ class Save extends \Magento\Backend\App\Action
 
             $this->_saveShipment($shipment);
 
-            $shipment->sendEmail(!empty($data['send_email']), $comment);
+            $this->shipmentSender->send($shipment, !empty($data['send_email']), $comment);
 
             $shipmentCreatedMessage = __('The shipment has been created.');
             $labelCreatedMessage = __('You created the shipping label.');
diff --git a/app/code/Magento/Shipping/composer.json b/app/code/Magento/Shipping/composer.json
index 6e53c76cf9ddb3a7ee943b4a288dee28d21e181a..fc4e89cab74e3c8229bcc688252398ae772d2001 100644
--- a/app/code/Magento/Shipping/composer.json
+++ b/app/code/Magento/Shipping/composer.json
@@ -2,24 +2,24 @@
     "name": "magento/module-shipping",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-directory": "0.1.0-alpha89",
-        "magento/module-contact": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-payment": "0.1.0-alpha89",
-        "magento/module-tax": "0.1.0-alpha89",
-        "magento/module-catalog-inventory": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-directory": "0.1.0-alpha90",
+        "magento/module-contact": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-payment": "0.1.0-alpha90",
+        "magento/module-tax": "0.1.0-alpha90",
+        "magento/module-catalog-inventory": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "ext-gd": "*",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Shipping/etc/adminhtml/acl.xml b/app/code/Magento/Shipping/etc/acl.xml
similarity index 94%
rename from app/code/Magento/Shipping/etc/adminhtml/acl.xml
rename to app/code/Magento/Shipping/etc/acl.xml
index 277cd0ce9f79c3d3aafa17daf2b6149aa13b566c..fd54affe77eae7ad741d97c12fba740dc0232989 100644
--- a/app/code/Magento/Shipping/etc/adminhtml/acl.xml
+++ b/app/code/Magento/Shipping/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/Sitemap/composer.json b/app/code/Magento/Sitemap/composer.json
index 8e78eedc06c55f26882cb0541395da2cece4f4eb..11958116c049bc193031121304199fa48ed4a328 100644
--- a/app/code/Magento/Sitemap/composer.json
+++ b/app/code/Magento/Sitemap/composer.json
@@ -2,18 +2,18 @@
     "name": "magento/module-sitemap",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/module-cms": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/module-cms": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Sitemap/etc/adminhtml/acl.xml b/app/code/Magento/Sitemap/etc/acl.xml
similarity index 95%
rename from app/code/Magento/Sitemap/etc/adminhtml/acl.xml
rename to app/code/Magento/Sitemap/etc/acl.xml
index 5d5c2b7c7c97918b0d690487a37fd3d088954c25..b4684b3649690cb0fc260bf58e314ab5e33293b0 100644
--- a/app/code/Magento/Sitemap/etc/adminhtml/acl.xml
+++ b/app/code/Magento/Sitemap/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/Store/composer.json b/app/code/Magento/Store/composer.json
index aa8356e9d1a78615a62a53d335a355648456273b..47e2308ae586d8f63f9320e6100ec82c2538ed5f 100644
--- a/app/code/Magento/Store/composer.json
+++ b/app/code/Magento/Store/composer.json
@@ -2,15 +2,15 @@
     "name": "magento/module-store",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-directory": "0.1.0-alpha89",
-        "magento/module-index": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-directory": "0.1.0-alpha90",
+        "magento/module-index": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Store/view/frontend/templates/switch/languages.phtml b/app/code/Magento/Store/view/frontend/templates/switch/languages.phtml
index e076840edbc495935319fb65c273f35c9fe5c0f2..19a91b1044d8ba9c6636f72d1696c5106f3e00a1 100644
--- a/app/code/Magento/Store/view/frontend/templates/switch/languages.phtml
+++ b/app/code/Magento/Store/view/frontend/templates/switch/languages.phtml
@@ -29,19 +29,26 @@
 ?>
 
 <?php if(count($this->getStores())>1): ?>
-<div class="switcher language" data-ui-id="language-switcher">
-    <strong class="label"><span><?php echo __('Language') ?></span></strong>
-    <div class="actions dropdown options">
-        <div class="action toggle" id="language-switcher">
+<?php $id = $this->getIdModifier() ? '-' . $this->getIdModifier() : ''?>
+<div class="switcher language switcher-language" data-ui-id="language-switcher" id="switcher-language<?php echo $id?>">
+    <strong class="label switcher-label"><span><?php echo __('Language') ?></span></strong>
+    <div class="actions dropdown options switcher-options">
+        <div class="action toggle switcher-trigger" id="switcher-language-trigger<?php echo $id?>">
             <strong class="view-<?php echo $this->escapeHtml($this->getCurrentStoreCode()) ?>">
                 <span><?php echo $this->escapeHtml($this->getStoreName()) ?></span>
             </strong>
         </div>
-        <ul class="dropdown"
-            data-mage-init='{"dropdownDialog":{"appendTo":".switcher.language > .options", "triggerTarget":"#language-switcher", "closeOnMouseLeave": false, "triggerClass":"active", "parentClass":"active", "buttons":null}}'>
+        <ul class="dropdown switcher-dropdown"
+            data-mage-init='{"dropdownDialog":{
+                "appendTo":"#switcher-language<?php echo $id ?> > .options",
+                "triggerTarget":"#switcher-language-trigger<?php echo $id ?>",
+                "closeOnMouseLeave": false,
+                "triggerClass":"active",
+                "parentClass":"active",
+                "buttons":null}}'>
             <?php foreach ($this->getStores() as $_lang): ?>
                 <?php if($_lang->getId()!=$this->getCurrentStoreId()): ?>
-                    <li class="view-<?php echo $this->escapeHtml($_lang->getCode()); ?>">
+                    <li class="view-<?php echo $this->escapeHtml($_lang->getCode()); ?> switcher-option">
                         <a href="#" data-post='<?php echo $this->getTargetStorePostData($_lang); ?>'>
                             <?php echo $this->escapeHtml($_lang->getName()) ?></a>
                     </li>
diff --git a/app/code/Magento/Tax/Model/System/Message/Notifications.php b/app/code/Magento/Tax/Model/System/Message/Notifications.php
index 8cc3406820f97a4b21855ee18d1f707f61ae09f0..97df9ccd5f838161b29393c02a21dc0218f348ef 100644
--- a/app/code/Magento/Tax/Model/System/Message/Notifications.php
+++ b/app/code/Magento/Tax/Model/System/Message/Notifications.php
@@ -26,7 +26,7 @@ namespace Magento\Tax\Model\System\Message;
 /**
  * Notifications class
  */
-class Notifications implements \Magento\AdminNotification\Model\System\MessageInterface
+class Notifications implements \Magento\Framework\Notification\MessageInterface
 {
     /**
      * Store manager object
@@ -93,7 +93,7 @@ class Notifications implements \Magento\AdminNotification\Model\System\MessageIn
      *      Tax Calculation Method Based On 'Total' or 'Row'
      *      and at least one Price Display Settings has 'Including and Excluding Tax' value
      *
-     * @param null|int|bool|string|Store $store $store
+     * @param null|int|bool|string|\Magento\Store\Model\Store $store $store
      * @return bool
      */
     public function checkDisplaySettings($store = null)
@@ -118,7 +118,7 @@ class Notifications implements \Magento\AdminNotification\Model\System\MessageIn
      *      Before Discount / Excluding Tax
      *      Before Discount / Including Tax
      *
-     * @param null|int|bool|string|Store $store $store
+     * @param null|int|bool|string|\Magento\Store\Model\Store $store $store
      * @return bool
      */
     public function checkDiscountSettings($store = null)
diff --git a/app/code/Magento/Tax/Service/V1/Data/TaxClassSearchResultsBuilder.php b/app/code/Magento/Tax/Service/V1/Data/TaxClassSearchResultsBuilder.php
index cf268bc0cb98b4004c5dc414ee5c685ecffe2d83..95620904354fb44df241808a024c765e2de7afb1 100644
--- a/app/code/Magento/Tax/Service/V1/Data/TaxClassSearchResultsBuilder.php
+++ b/app/code/Magento/Tax/Service/V1/Data/TaxClassSearchResultsBuilder.php
@@ -40,14 +40,14 @@ class TaxClassSearchResultsBuilder extends AbstractSearchResultsBuilder
      *
      * @param ObjectFactory $objectFactory
      * @param SearchCriteriaBuilder $searchCriteriaBuilder
-     * @param TaxClassBuilder $taxClassObjectBuilder
+     * @param TaxClassBuilder $itemObjectBuilder
      */
     public function __construct(
         ObjectFactory $objectFactory,
         SearchCriteriaBuilder $searchCriteriaBuilder,
-        TaxClassBuilder $taxClassObjectBuilder
+        TaxClassBuilder $itemObjectBuilder
     ) {
-        parent::__construct($objectFactory, $searchCriteriaBuilder, $taxClassObjectBuilder);
+        parent::__construct($objectFactory, $searchCriteriaBuilder, $itemObjectBuilder);
     }
 
     /**
diff --git a/app/code/Magento/Tax/Service/V1/Data/TaxRateSearchResultsBuilder.php b/app/code/Magento/Tax/Service/V1/Data/TaxRateSearchResultsBuilder.php
index 4314ccbcef0f529dc548249fa31f6df5acaa15a6..6f595b19e2cca4cc3d591d3459653ed5b385c078 100644
--- a/app/code/Magento/Tax/Service/V1/Data/TaxRateSearchResultsBuilder.php
+++ b/app/code/Magento/Tax/Service/V1/Data/TaxRateSearchResultsBuilder.php
@@ -40,14 +40,14 @@ class TaxRateSearchResultsBuilder extends AbstractSearchResultsBuilder
      *
      * @param ObjectFactory $objectFactory
      * @param SearchCriteriaBuilder $searchCriteriaBuilder
-     * @param TaxRateBuilder $taxRateObjectBuilder
+     * @param TaxRateBuilder $itemObjectBuilder
      */
     public function __construct(
         ObjectFactory $objectFactory,
         SearchCriteriaBuilder $searchCriteriaBuilder,
-        TaxRateBuilder $taxRateObjectBuilder
+        TaxRateBuilder $itemObjectBuilder
     ) {
-        parent::__construct($objectFactory, $searchCriteriaBuilder, $taxRateObjectBuilder);
+        parent::__construct($objectFactory, $searchCriteriaBuilder, $itemObjectBuilder);
     }
 
     /**
diff --git a/app/code/Magento/Tax/Service/V1/TaxRateService.php b/app/code/Magento/Tax/Service/V1/TaxRateService.php
index 2c215d528cf3acf5e48326e2ed08af0ff2a4907d..b2ef9054f71eb7482b7cd9cf971c88a909091b38 100644
--- a/app/code/Magento/Tax/Service/V1/TaxRateService.php
+++ b/app/code/Magento/Tax/Service/V1/TaxRateService.php
@@ -42,6 +42,8 @@ use Magento\Tax\Service\V1\Data\TaxRateBuilder;
  */
 class TaxRateService implements TaxRateServiceInterface
 {
+    const MESSAGE_TAX_RATE_ID_IS_NOT_ALLOWED = 'id is not expected for this request.';
+
     /**
      * Tax rate model and tax rate data object converter
      *
@@ -101,6 +103,9 @@ class TaxRateService implements TaxRateServiceInterface
      */
     public function createTaxRate(TaxRateDataObject $taxRate)
     {
+        if ($taxRate->getId()) {
+            throw new InputException(self::MESSAGE_TAX_RATE_ID_IS_NOT_ALLOWED);
+        }
         $rateModel = $this->saveTaxRate($taxRate);
         return $this->converter->createTaxRateDataObjectFromModel($rateModel);
     }
diff --git a/app/code/Magento/Tax/Service/V1/TaxRuleService.php b/app/code/Magento/Tax/Service/V1/TaxRuleService.php
index 02f2855cb7bc73cd4b2be7ad7bd6128c81c05dd3..468e2c728fbb0be75856786b71f78ec3a506d9c3 100644
--- a/app/code/Magento/Tax/Service/V1/TaxRuleService.php
+++ b/app/code/Magento/Tax/Service/V1/TaxRuleService.php
@@ -25,11 +25,13 @@
 namespace Magento\Tax\Service\V1;
 
 use Magento\Framework\Exception\InputException;
+use Magento\Framework\Exception\NoSuchEntityException;
 use Magento\Framework\Model\Exception as ModelException;
 use Magento\Framework\Service\V1\Data\FilterBuilder;
 use Magento\Framework\Service\V1\Data\Search\FilterGroup;
 use Magento\Framework\Service\V1\Data\SearchCriteria;
 use Magento\Framework\Service\V1\Data\SearchCriteriaBuilder;
+use Magento\Tax\Model\ClassModel as TaxClassModel;
 use Magento\Tax\Model\Calculation\Rule as TaxRuleModel;
 use Magento\Tax\Model\Calculation\RuleFactory as TaxRuleModelFactory;
 use Magento\Tax\Model\Calculation\TaxRuleConverter;
@@ -85,6 +87,10 @@ class TaxRuleService implements TaxRuleServiceInterface
      */
     protected $searchCriteriaBuilder;
 
+    /**
+     * @var TaxClassService
+     */
+    protected $taxClassService;
     /**
      * @param TaxRuleBuilder $taxRuleBuilder
      * @param TaxRuleConverter $converter
@@ -94,6 +100,7 @@ class TaxRuleService implements TaxRuleServiceInterface
      * @param FilterBuilder $filterBuilder
      * @param TaxRateServiceInterface $taxRateService
      * @param SearchCriteriaBuilder $searchCriteriaBuilder
+     * @param TaxClassService $taxClassService
      */
     public function __construct(
         TaxRuleBuilder $taxRuleBuilder,
@@ -103,7 +110,8 @@ class TaxRuleService implements TaxRuleServiceInterface
         TaxRuleModelFactory $taxRuleModelFactory,
         FilterBuilder $filterBuilder,
         TaxRateServiceInterface $taxRateService,
-        SearchCriteriaBuilder $searchCriteriaBuilder
+        SearchCriteriaBuilder $searchCriteriaBuilder,
+        TaxClassService $taxClassService
     ) {
         $this->taxRuleBuilder = $taxRuleBuilder;
         $this->converter = $converter;
@@ -113,6 +121,7 @@ class TaxRuleService implements TaxRuleServiceInterface
         $this->filterBuilder = $filterBuilder;
         $this->taxRateService = $taxRateService;
         $this->searchCriteriaBuilder = $searchCriteriaBuilder;
+        $this->taxClassService = $taxClassService;
     }
 
     /**
@@ -120,6 +129,11 @@ class TaxRuleService implements TaxRuleServiceInterface
      */
     public function createTaxRule(TaxRule $rule)
     {
+        // See if a tax rule with that $rule->getId() is specified. If so, throw an exception.
+        if (!is_null($rule->getId())) {
+            throw new InputException('TaxRule ID should not be specified.');
+        }
+
         $taxRuleModel = $this->saveTaxRule($rule);
         return $this->converter->createTaxRuleDataObjectFromModel($taxRuleModel);
     }
@@ -365,14 +379,59 @@ class TaxRuleService implements TaxRuleServiceInterface
         if (!\Zend_Validate::is(trim($rule->getCode()), 'NotEmpty')) {
             $exception->addError(InputException::REQUIRED_FIELD, ['fieldName' => TaxRule::CODE]);
         }
+
         // customer tax class ids is required
         if (($rule->getCustomerTaxClassIds() === null) || !$rule->getCustomerTaxClassIds()) {
             $exception->addError(InputException::REQUIRED_FIELD, ['fieldName' => TaxRule::CUSTOMER_TAX_CLASS_IDS]);
+        } else { // see if the customer tax class ids exist
+            $customerTaxClassIds = $rule->getCustomerTaxClassIds();
+            foreach ($customerTaxClassIds as $customerTaxClassId) {
+                try {
+                    $taxClass = $this->taxClassService->getTaxClass($customerTaxClassId);
+                    if (is_null($taxClass) || !($taxClass->getClassType() == TaxClassModel::TAX_CLASS_TYPE_CUSTOMER)) {
+                        $exception->addError(
+                            NoSuchEntityException::MESSAGE_SINGLE_FIELD,
+                            [
+                                'fieldName' => TaxRule::CUSTOMER_TAX_CLASS_IDS,
+                                'value'     => $customerTaxClassId,
+                            ]
+                        );
+                    }
+                } catch (NoSuchEntityException $e) {
+                    $exception->addError(
+                        $e->getRawMessage(),
+                        $e->getParameters()
+                    );
+                }
+            }
         }
+
         // product tax class ids is required
         if (($rule->getProductTaxClassIds() === null) || !$rule->getProductTaxClassIds()) {
             $exception->addError(InputException::REQUIRED_FIELD, ['fieldName' => TaxRule::PRODUCT_TAX_CLASS_IDS]);
+        } else { // see if the product tax class ids exist
+            $productTaxClassIds = $rule->getProductTaxClassIds();
+            foreach ($productTaxClassIds as $productTaxClassId) {
+                try {
+                    $taxClass = $this->taxClassService->getTaxClass($productTaxClassId);
+                    if (is_null($taxClass) || !($taxClass->getClassType() == TaxClassModel::TAX_CLASS_TYPE_PRODUCT)) {
+                        $exception->addError(
+                            NoSuchEntityException::MESSAGE_SINGLE_FIELD,
+                            [
+                                'fieldName' => TaxRule::PRODUCT_TAX_CLASS_IDS,
+                                'value'     => $productTaxClassId,
+                            ]
+                        );
+                    }
+                } catch (NoSuchEntityException $e) {
+                    $exception->addError(
+                        $e->getRawMessage(),
+                        $e->getParameters()
+                    );
+                }
+            }
         }
+
         // tax rate ids is required
         if (($rule->getTaxRateIds() === null) || !$rule->getTaxRateIds()) {
             $exception->addError(InputException::REQUIRED_FIELD, ['fieldName' => TaxRule::TAX_RATE_IDS]);
diff --git a/app/code/Magento/Tax/composer.json b/app/code/Magento/Tax/composer.json
index 1e15ed685b8cf3ad271617efde00c8b37078c5f7..c8aeb245caa5075a399754658967c68bc3195b48 100644
--- a/app/code/Magento/Tax/composer.json
+++ b/app/code/Magento/Tax/composer.json
@@ -2,26 +2,25 @@
     "name": "magento/module-tax",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-directory": "0.1.0-alpha89",
-        "magento/module-checkout": "0.1.0-alpha89",
-        "magento/module-shipping": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-reports": "0.1.0-alpha89",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/module-configurable-product": "0.1.0-alpha89",
-        "magento/module-admin-notification": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-directory": "0.1.0-alpha90",
+        "magento/module-checkout": "0.1.0-alpha90",
+        "magento/module-shipping": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-reports": "0.1.0-alpha90",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/module-configurable-product": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Tax/etc/adminhtml/acl.xml b/app/code/Magento/Tax/etc/acl.xml
similarity index 95%
rename from app/code/Magento/Tax/etc/adminhtml/acl.xml
rename to app/code/Magento/Tax/etc/acl.xml
index 2f84eb4523a2ac1b6810db7277c2d1ccb87778b4..73edcc94e7150aa0b80edf6348f57e9b353be908 100644
--- a/app/code/Magento/Tax/etc/adminhtml/acl.xml
+++ b/app/code/Magento/Tax/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/Tax/etc/adminhtml/di.xml b/app/code/Magento/Tax/etc/adminhtml/di.xml
index 16e2bb8fa3cff244161ad90987a93dd1711aa5aa..e9f0c198cfb3d17354839c9e65d0da0677310b83 100644
--- a/app/code/Magento/Tax/etc/adminhtml/di.xml
+++ b/app/code/Magento/Tax/etc/adminhtml/di.xml
@@ -24,11 +24,11 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
-    <type name="Magento\AdminNotification\Model\System\MessageList">
+    <type name="Magento\Framework\Notification\MessageList">
         <arguments>
             <argument name="messages" xsi:type="array">
                 <item name="tax" xsi:type="string">Magento\Tax\Model\System\Message\Notifications</item>
             </argument>
         </arguments>
     </type>
-</config>
\ No newline at end of file
+</config>
diff --git a/app/code/Magento/Tax/etc/module.xml b/app/code/Magento/Tax/etc/module.xml
index 1d69d97aeef6479dc64450cab358d7f6863c37d4..01f07f004fbc84e1a84ac24b91bcaa8799ff0c7e 100644
--- a/app/code/Magento/Tax/etc/module.xml
+++ b/app/code/Magento/Tax/etc/module.xml
@@ -44,7 +44,6 @@
             <module name="Magento_Reports"/>
             <module name="Magento_Theme"/>
             <module name="Magento_ConfigurableProduct"/>
-            <module name="Magento_AdminNotification"/>
         </depends>
     </module>
 </config>
diff --git a/app/code/Magento/Tax/sql/tax_setup/upgrade-1.6.0.4-1.6.0.5.php b/app/code/Magento/Tax/sql/tax_setup/upgrade-1.6.0.4-1.6.0.5.php
index 085c2db5a98a1acc17c27c87a55b8ebb33ca034c..dcaa10f21c2da6005441382d69020a02dace2241 100644
--- a/app/code/Magento/Tax/sql/tax_setup/upgrade-1.6.0.4-1.6.0.5.php
+++ b/app/code/Magento/Tax/sql/tax_setup/upgrade-1.6.0.4-1.6.0.5.php
@@ -26,7 +26,7 @@
 $installer = $this;
 
 $connection = $installer->getConnection();
-$adminRuleTable = $installer->getTable('admin_rule');
+$adminRuleTable = $installer->getTable('authorization_rule');
 $aclRulesDelete = array(
     'Magento_Tax::classes_customer',
     'Magento_Tax::classes_product',
diff --git a/app/code/Magento/Tax/sql/tax_setup/upgrade-1.6.0.5-1.6.0.6.php b/app/code/Magento/Tax/sql/tax_setup/upgrade-1.6.0.5-1.6.0.6.php
index 580eecb848ce1dae4aaea2afe1b32bc409ca85fe..b054b82c416d6b1d44b5fb04d7186d8c63e8f660 100644
--- a/app/code/Magento/Tax/sql/tax_setup/upgrade-1.6.0.5-1.6.0.6.php
+++ b/app/code/Magento/Tax/sql/tax_setup/upgrade-1.6.0.5-1.6.0.6.php
@@ -28,7 +28,7 @@
 $installer = $this;
 
 $connection = $installer->getConnection();
-$adminRuleTable = $installer->getTable('admin_rule');
+$adminRuleTable = $installer->getTable('authorization_rule');
 $aclRulesDelete = array(
     'Magento_Tax::classes_customer',
     'Magento_Tax::classes_product',
diff --git a/app/code/Magento/Theme/composer.json b/app/code/Magento/Theme/composer.json
index 3fbcd123752d4d35ad565b445c7b87f520d4dab9..d67905d325bd8ec862ca5e213f2426bd17789149 100644
--- a/app/code/Magento/Theme/composer.json
+++ b/app/code/Magento/Theme/composer.json
@@ -2,18 +2,18 @@
     "name": "magento/module-theme",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-cms": "0.1.0-alpha89",
-        "magento/module-translation": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-cms": "0.1.0-alpha90",
+        "magento/module-translation": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Theme/etc/adminhtml/acl.xml b/app/code/Magento/Theme/etc/acl.xml
similarity index 93%
rename from app/code/Magento/Theme/etc/adminhtml/acl.xml
rename to app/code/Magento/Theme/etc/acl.xml
index a0c5dab927ed3fa4804f16209244671d99556e8b..9758d483ae358a8f721425dcb58d0cc7b981b7a7 100644
--- a/app/code/Magento/Theme/etc/adminhtml/acl.xml
+++ b/app/code/Magento/Theme/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/Theme/view/frontend/templates/html/block.phtml b/app/code/Magento/Theme/view/frontend/templates/html/block.phtml
index 463f95fc6d76b0cd259e8abde4e06a4173245c71..5f1610dd8c128a5c278005f43b4b39a10c005dab 100644
--- a/app/code/Magento/Theme/view/frontend/templates/html/block.phtml
+++ b/app/code/Magento/Theme/view/frontend/templates/html/block.phtml
@@ -23,8 +23,8 @@
  */
 ?>
 <div class="block <?php echo $this->getBlockCss(); ?>">
-    <div class="title"><strong><?php echo $this->getBlockTitle(); ?></strong></div>
-    <div class="content">
+    <div class="block-title <?php echo $this->getBlockCss(); ?>-title"><strong><?php echo $this->getBlockTitle(); ?></strong></div>
+    <div class="block-content <?php echo $this->getBlockCss(); ?>-content">
         <?php echo $this->getChildHtml(); ?>
     </div>
 </div>
diff --git a/app/code/Magento/Theme/view/frontend/templates/html/collapsible.phtml b/app/code/Magento/Theme/view/frontend/templates/html/collapsible.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..a8feba228392e9cd1e2d24df5ae225dccffceac4
--- /dev/null
+++ b/app/code/Magento/Theme/view/frontend/templates/html/collapsible.phtml
@@ -0,0 +1,33 @@
+<?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)
+ */
+?>
+
+<div class="block <?php echo $this->getBlockCss(); ?>">
+    <div class="title <?php echo $this->getBlockCss();?>-title" data-mage-init='{"toggleAdvanced": {"toggleContainers": "#<?php echo $this->getBlockCss(); ?>", "selectorsToggleClass": "active"}}'>
+        <strong><?php echo $this->getBlockTitle(); ?></strong>
+    </div>
+    <div class="content <?php echo $this->getBlockCss(); ?>-content" id="<?php echo $this->getBlockCss(); ?>">
+        <?php echo $this->getChildHtml(); ?>
+    </div>
+</div>
diff --git a/app/code/Magento/Theme/view/frontend/templates/html/container.phtml b/app/code/Magento/Theme/view/frontend/templates/html/container.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..51ad97036bb160155553badae9832a414da2f988
--- /dev/null
+++ b/app/code/Magento/Theme/view/frontend/templates/html/container.phtml
@@ -0,0 +1,25 @@
+<?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)
+ */
+?>
+<?php echo $this->getChildHtml(); ?>
diff --git a/app/code/Magento/Theme/view/frontend/templates/html/header.phtml b/app/code/Magento/Theme/view/frontend/templates/html/header.phtml
index 3da19c109af6c39f3bc879b4c288419eada2afda..3131cc747d578b00ef08aa51ab1ab462d3698b09 100644
--- a/app/code/Magento/Theme/view/frontend/templates/html/header.phtml
+++ b/app/code/Magento/Theme/view/frontend/templates/html/header.phtml
@@ -28,7 +28,7 @@
 <?php switch($this->getShowPart()):
     case 'logo': ?>
         <?php $storeName = $this->getThemeName() ? $this->getThemeName() : $this->getLogoAlt();?>
-        <span data-action="toggle-nav" class="action toggle nav"><?php echo __('Toggle Nav') ?></span>
+        <span data-action="toggle-nav" class="action nav-toggle"><span><?php echo __('Toggle Nav') ?></span></span>
         <?php if ($this->isHomePage()):?>
         <strong class="logo">
             <img src="<?php echo $this->getLogoSrc() ?>" alt="<?php echo $this->getLogoAlt() ?>" />
diff --git a/app/code/Magento/Theme/view/frontend/templates/html/sections.phtml b/app/code/Magento/Theme/view/frontend/templates/html/sections.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..d4c07237e8d1da50a318c069de5b0f8a4c493bc0
--- /dev/null
+++ b/app/code/Magento/Theme/view/frontend/templates/html/sections.phtml
@@ -0,0 +1,53 @@
+<?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)
+ */
+?>
+<?php
+
+/**
+*  General template for displaying group of blocks devided into sections
+*/
+
+$group = $this->getGroupName();
+$groupCss = $this->getGroupCss();
+$groupBehavior = $this->getGroupBehaviour() ? $this->getGroupBehaviour() : '{"tabs":{"openedState":"active"}}';
+?>
+<?php if ($detailedInfoGroup = $this->getGroupChildNames($group, 'getChildHtml')):?>
+    <div class="sections <?php echo $groupCss ?>">
+        <?php $layout = $this->getLayout(); ?>
+        <div class="section-items <?php echo $groupCss ?>-items" data-mage-init='<?php echo $groupBehavior ?>'>
+            <?php foreach ($detailedInfoGroup as $name):?>
+                <?php
+                    $html = $layout->renderElement($name);
+                    if (!trim($html) && ($this->getUseForce() != true)) continue;
+                    $alias = $layout->getElementAlias($name);
+                    $label = $this->getChildData($alias, 'title');
+                ?>
+                <div class="section-item-title <?php echo $groupCss ?>-item-title" data-role="collapsible">
+                    <a class="<?php echo $groupCss ?>-item-switch" data-toggle="switch" href="#<?php echo $alias; ?>"><?php echo $label; ?></a>
+                </div>
+                <div class="section-item-content <?php echo $groupCss ?>-item-content" id="<?php echo $alias; ?>" data-role="content"><?php echo $html; ?></div>
+            <?php endforeach;?>
+        </div>
+    </div>
+<?php endif; ?>
diff --git a/app/code/Magento/Translation/composer.json b/app/code/Magento/Translation/composer.json
index cffec76d78cb04e35b0e697023b47c167530da94..400b266e4c57e7b2b550bbd082cd3ca1188e2152 100644
--- a/app/code/Magento/Translation/composer.json
+++ b/app/code/Magento/Translation/composer.json
@@ -2,15 +2,15 @@
     "name": "magento/module-translation",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Ups/composer.json b/app/code/Magento/Ups/composer.json
index 36a24ede4300b873f29d2575f7901c692d1233e3..19eded9e99926f83e2e41e47a5a1fb14ade7b07d 100644
--- a/app/code/Magento/Ups/composer.json
+++ b/app/code/Magento/Ups/composer.json
@@ -2,19 +2,19 @@
     "name": "magento/module-ups",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-shipping": "0.1.0-alpha89",
-        "magento/module-directory": "0.1.0-alpha89",
-        "magento/module-catalog-inventory": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-shipping": "0.1.0-alpha90",
+        "magento/module-directory": "0.1.0-alpha90",
+        "magento/module-catalog-inventory": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/UrlRedirect/composer.json b/app/code/Magento/UrlRedirect/composer.json
index 30615273b95c205ff4b451171b6c21972f38c3ce..6a171dcaeebec1d02fe22405c1aa6d33da9ff045 100644
--- a/app/code/Magento/UrlRedirect/composer.json
+++ b/app/code/Magento/UrlRedirect/composer.json
@@ -2,17 +2,17 @@
     "name": "magento/module-url-redirect",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-cms": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-install": "0.1.0-alpha89",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89"
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-cms": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-install": "0.1.0-alpha90",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/UrlRedirect/etc/adminhtml/acl.xml b/app/code/Magento/UrlRedirect/etc/acl.xml
similarity index 93%
rename from app/code/Magento/UrlRedirect/etc/adminhtml/acl.xml
rename to app/code/Magento/UrlRedirect/etc/acl.xml
index 8f2d7946e10928bb4e5fa3d943ad1776f6ad8d7d..ae933a12f82a9a27df41dd7f9fc1d4663fe8656a 100644
--- a/app/code/Magento/UrlRedirect/etc/adminhtml/acl.xml
+++ b/app/code/Magento/UrlRedirect/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/UrlRewrite/composer.json b/app/code/Magento/UrlRewrite/composer.json
index d8eb8310edad6fcf4f47d1d3afde8ba353465965..ddbfb0b15707f214e9220da8e2fe33f07d53cd92 100644
--- a/app/code/Magento/UrlRewrite/composer.json
+++ b/app/code/Magento/UrlRewrite/composer.json
@@ -2,15 +2,15 @@
     "name": "magento/module-url-rewrite",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/User/Block/Role/Grid/User.php b/app/code/Magento/User/Block/Role/Grid/User.php
index d53d4aea438977a84b273e6dcca6fc2cfe92a37e..df1ce7c73e27e743f67a5b40f393aa9cc7ad0139 100644
--- a/app/code/Magento/User/Block/Role/Grid/User.php
+++ b/app/code/Magento/User/Block/Role/Grid/User.php
@@ -40,7 +40,7 @@ class User extends \Magento\Backend\Block\Widget\Grid\Extended
     /**
      * Factory for user role model
      *
-     * @var \Magento\User\Model\RoleFactory
+     * @var \Magento\Authorization\Model\RoleFactory
      */
     protected $_roleFactory;
 
@@ -49,12 +49,18 @@ class User extends \Magento\Backend\Block\Widget\Grid\Extended
      */
     protected $_jsonEncoder;
 
+    /**
+     * @var \Magento\User\Model\Resource\Role\User\CollectionFactory
+     */
+    protected $_userRolesFactory;
+
     /**
      * @param \Magento\Backend\Block\Template\Context $context
      * @param \Magento\Backend\Helper\Data $backendHelper
      * @param \Magento\Framework\Json\EncoderInterface $jsonEncoder
      * @param \Magento\Framework\Registry $coreRegistry
-     * @param \Magento\User\Model\RoleFactory $roleFactory
+     * @param \Magento\Authorization\Model\RoleFactory $roleFactory
+     * @param \Magento\User\Model\Resource\Role\User\CollectionFactory $userRolesFactory
      * @param array $data
      */
     public function __construct(
@@ -62,13 +68,15 @@ class User extends \Magento\Backend\Block\Widget\Grid\Extended
         \Magento\Backend\Helper\Data $backendHelper,
         \Magento\Framework\Json\EncoderInterface $jsonEncoder,
         \Magento\Framework\Registry $coreRegistry,
-        \Magento\User\Model\RoleFactory $roleFactory,
+        \Magento\Authorization\Model\RoleFactory $roleFactory,
+        \Magento\User\Model\Resource\Role\User\CollectionFactory $userRolesFactory,
         array $data = []
     ) {
         parent::__construct($context, $backendHelper, $data);
         $this->_jsonEncoder = $jsonEncoder;
         $this->_coreRegistry = $coreRegistry;
         $this->_roleFactory = $roleFactory;
+        $this->_userRolesFactory = $userRolesFactory;
     }
 
     /**
@@ -116,7 +124,7 @@ class User extends \Magento\Backend\Block\Widget\Grid\Extended
     {
         $roleId = $this->getRequest()->getParam('rid');
         $this->_coreRegistry->register('RID', $roleId);
-        $collection = $this->_roleFactory->create()->getUsersCollection();
+        $collection = $this->_userRolesFactory->create();
         $this->setCollection($collection);
         return parent::_prepareCollection();
     }
diff --git a/app/code/Magento/User/Block/Role/Tab/Edit.php b/app/code/Magento/User/Block/Role/Tab/Edit.php
index 91c37d137b680b44688bff48f81eaaaafe6748f9..f17c16b05b58cec7e0b0c14a7bf8988b717325c7 100644
--- a/app/code/Magento/User/Block/Role/Tab/Edit.php
+++ b/app/code/Magento/User/Block/Role/Tab/Edit.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\User\Block\Role\Tab;
 
 /**
@@ -45,16 +46,16 @@ class Edit extends \Magento\Backend\Block\Widget\Form implements \Magento\Backen
     /**
      * Rules collection factory
      *
-     * @var \Magento\User\Model\Resource\Rules\CollectionFactory
+     * @var \Magento\Authorization\Model\Resource\Rules\CollectionFactory
      */
     protected $_rulesCollectionFactory;
 
     /**
      * Acl builder
      *
-     * @var \Magento\Framework\Acl\Builder
+     * @var \Magento\Authorization\Model\Acl\AclRetriever
      */
-    protected $_aclBuilder;
+    protected $_aclRetriever;
 
     /**
      * Acl resource provider
@@ -69,8 +70,8 @@ class Edit extends \Magento\Backend\Block\Widget\Form implements \Magento\Backen
     /**
      * @param \Magento\Backend\Block\Template\Context $context
      * @param \Magento\Framework\Acl\RootResource $rootResource
-     * @param \Magento\User\Model\Resource\Rules\CollectionFactory $rulesCollectionFactory
-     * @param \Magento\Framework\Acl\Builder $aclBuilder
+     * @param \Magento\Authorization\Model\Resource\Rules\CollectionFactory $rulesCollectionFactory
+     * @param \Magento\Authorization\Model\Acl\AclRetriever $aclRetriever
      * @param \Magento\Framework\Acl\Resource\ProviderInterface $aclResourceProvider
      * @param \Magento\Integration\Helper\Data $integrationData
      * @param array $data
@@ -78,13 +79,13 @@ class Edit extends \Magento\Backend\Block\Widget\Form implements \Magento\Backen
     public function __construct(
         \Magento\Backend\Block\Template\Context $context,
         \Magento\Framework\Acl\RootResource $rootResource,
-        \Magento\User\Model\Resource\Rules\CollectionFactory $rulesCollectionFactory,
-        \Magento\Framework\Acl\Builder $aclBuilder,
+        \Magento\Authorization\Model\Resource\Rules\CollectionFactory $rulesCollectionFactory,
+        \Magento\Authorization\Model\Acl\AclRetriever $aclRetriever,
         \Magento\Framework\Acl\Resource\ProviderInterface $aclResourceProvider,
         \Magento\Integration\Helper\Data $integrationData,
         array $data = array()
     ) {
-        $this->_aclBuilder = $aclBuilder;
+        $this->_aclRetriever = $aclRetriever;
         $this->_rootResource = $rootResource;
         $this->_rulesCollectionFactory = $rulesCollectionFactory;
         $this->_aclResourceProvider = $aclResourceProvider;
@@ -142,20 +143,7 @@ class Edit extends \Magento\Backend\Block\Widget\Form implements \Magento\Backen
         parent::_construct();
 
         $rid = $this->_request->getParam('rid', false);
-
-        $acl = $this->_aclBuilder->getAcl();
-        $rulesSet = $this->_rulesCollectionFactory->create()->getByRoles($rid)->load();
-
-        $selectedResourceIds = array();
-
-        foreach ($rulesSet->getItems() as $item) {
-            $itemResourceId = $item->getResource_id();
-            if ($acl->has($itemResourceId) && $item->getPermission() == 'allow') {
-                $selectedResourceIds[] = $itemResourceId;
-            }
-        }
-
-        $this->setSelectedResources($selectedResourceIds);
+        $this->setSelectedResources($this->_aclRetriever->getAllowedResourcesByRole($rid));
     }
 
     /**
diff --git a/app/code/Magento/User/Block/User/Edit/Tab/Roles.php b/app/code/Magento/User/Block/User/Edit/Tab/Roles.php
index 67a6009f18f216448848637e65b9047b7eec7941..92e784062a366851f8f43976ca9f9e55251bd563 100644
--- a/app/code/Magento/User/Block/User/Edit/Tab/Roles.php
+++ b/app/code/Magento/User/Block/User/Edit/Tab/Roles.php
@@ -35,7 +35,7 @@ class Roles extends \Magento\Backend\Block\Widget\Grid\Extended
     protected $_coreRegistry = null;
 
     /**
-     * @var \Magento\User\Model\Resource\Role\CollectionFactory
+     * @var \Magento\Authorization\Model\Resource\Role\CollectionFactory
      */
     protected $_userRolesFactory;
 
@@ -48,7 +48,7 @@ class Roles extends \Magento\Backend\Block\Widget\Grid\Extended
      * @param \Magento\Backend\Block\Template\Context $context
      * @param \Magento\Backend\Helper\Data $backendHelper
      * @param \Magento\Framework\Json\EncoderInterface $jsonEncoder
-     * @param \Magento\User\Model\Resource\Role\CollectionFactory $userRolesFactory
+     * @param \Magento\Authorization\Model\Resource\Role\CollectionFactory $userRolesFactory
      * @param \Magento\Framework\Registry $coreRegistry
      * @param array $data
      */
@@ -56,7 +56,7 @@ class Roles extends \Magento\Backend\Block\Widget\Grid\Extended
         \Magento\Backend\Block\Template\Context $context,
         \Magento\Backend\Helper\Data $backendHelper,
         \Magento\Framework\Json\EncoderInterface $jsonEncoder,
-        \Magento\User\Model\Resource\Role\CollectionFactory $userRolesFactory,
+        \Magento\Authorization\Model\Resource\Role\CollectionFactory $userRolesFactory,
         \Magento\Framework\Registry $coreRegistry,
         array $data = array()
     ) {
diff --git a/app/code/Magento/User/Controller/Adminhtml/User/Role.php b/app/code/Magento/User/Controller/Adminhtml/User/Role.php
index 43cace8168340f69e66d4ca8b36a7c2c88c94ed9..0818ab8e192664599198e353db560417b923e42d 100644
--- a/app/code/Magento/User/Controller/Adminhtml/User/Role.php
+++ b/app/code/Magento/User/Controller/Adminhtml/User/Role.php
@@ -23,7 +23,7 @@
  */
 namespace Magento\User\Controller\Adminhtml\User;
 
-use Magento\User\Model\Acl\Role\Group as RoleGroup;
+use Magento\Authorization\Model\Acl\Role\Group as RoleGroup;
 
 class Role extends \Magento\Backend\App\AbstractAction
 {
@@ -37,7 +37,7 @@ class Role extends \Magento\Backend\App\AbstractAction
     /**
      * Factory for user role model
      *
-     * @var \Magento\User\Model\RoleFactory
+     * @var \Magento\Authorization\Model\RoleFactory
      */
     protected $_roleFactory;
 
@@ -51,7 +51,7 @@ class Role extends \Magento\Backend\App\AbstractAction
     /**
      * Rules model factory
      *
-     * @var \Magento\User\Model\RulesFactory
+     * @var \Magento\Authorization\Model\RulesFactory
      */
     protected $_rulesFactory;
 
@@ -65,17 +65,17 @@ class Role extends \Magento\Backend\App\AbstractAction
     /**
      * @param \Magento\Backend\App\Action\Context $context
      * @param \Magento\Framework\Registry $coreRegistry
-     * @param \Magento\User\Model\RoleFactory $roleFactory
+     * @param \Magento\Authorization\Model\RoleFactory $roleFactory
      * @param \Magento\User\Model\UserFactory $userFactory
-     * @param \Magento\User\Model\RulesFactory $rulesFactory
+     * @param \Magento\Authorization\Model\RulesFactory $rulesFactory
      * @param \Magento\Backend\Model\Auth\Session $authSession
      */
     public function __construct(
         \Magento\Backend\App\Action\Context $context,
         \Magento\Framework\Registry $coreRegistry,
-        \Magento\User\Model\RoleFactory $roleFactory,
+        \Magento\Authorization\Model\RoleFactory $roleFactory,
         \Magento\User\Model\UserFactory $userFactory,
-        \Magento\User\Model\RulesFactory $rulesFactory,
+        \Magento\Authorization\Model\RulesFactory $rulesFactory,
         \Magento\Backend\Model\Auth\Session $authSession
     ) {
         parent::__construct($context);
@@ -105,7 +105,7 @@ class Role extends \Magento\Backend\App\AbstractAction
      * Initialize role model by passed parameter in request
      *
      * @param string $requestVariable
-     * @return \Magento\User\Model\Role
+     * @return \Magento\Authorization\Model\Role
      */
     protected function _initRole($requestVariable = 'rid')
     {
diff --git a/app/code/Magento/User/Controller/Adminhtml/User/Role/SaveRole.php b/app/code/Magento/User/Controller/Adminhtml/User/Role/SaveRole.php
index ffea14b477ab9400896af2566f2c87bd4b63a5fb..5959b132da9b60d41b0129416b32a951a3bbb5b5 100644
--- a/app/code/Magento/User/Controller/Adminhtml/User/Role/SaveRole.php
+++ b/app/code/Magento/User/Controller/Adminhtml/User/Role/SaveRole.php
@@ -24,7 +24,8 @@
  */
 namespace Magento\User\Controller\Adminhtml\User\Role;
 
-use \Magento\User\Model\Acl\Role\Group as RoleGroup;
+use Magento\Authorization\Model\Acl\Role\Group as RoleGroup;
+use Magento\Authorization\Model\UserContextInterface;
 
 class SaveRole extends \Magento\User\Controller\Adminhtml\User\Role
 {
@@ -98,13 +99,10 @@ class SaveRole extends \Magento\User\Controller\Adminhtml\User\Role
         try {
             $roleName = $this->getRequest()->getParam('rolename', false);
 
-            $role->setName(
-                $roleName
-            )->setPid(
-                $this->getRequest()->getParam('parent_id', false)
-            )->setRoleType(
-                RoleGroup::ROLE_TYPE
-            );
+            $role->setName($roleName)
+                ->setPid($this->getRequest()->getParam('parent_id', false))
+                ->setRoleType(RoleGroup::ROLE_TYPE)
+                ->setUserType(UserContextInterface::USER_TYPE_ADMIN);
             $this->_eventManager->dispatch(
                 'admin_permissions_role_prepare_save',
                 array('object' => $role, 'request' => $this->getRequest())
diff --git a/app/code/Magento/Authz/Model/UserLocator/Admin.php b/app/code/Magento/User/Model/Authorization/AdminSessionUserContext.php
similarity index 83%
rename from app/code/Magento/Authz/Model/UserLocator/Admin.php
rename to app/code/Magento/User/Model/Authorization/AdminSessionUserContext.php
index acdc94d2691ddaa026192879c80d1d958598d83b..98fe4099bc0383940375dc41f73e206b9dc38344 100644
--- a/app/code/Magento/Authz/Model/UserLocator/Admin.php
+++ b/app/code/Magento/User/Model/Authorization/AdminSessionUserContext.php
@@ -21,16 +21,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\Authz\Model\UserLocator;
 
-use Magento\Authz\Model\UserLocatorInterface;
-use Magento\Authz\Model\UserIdentifier;
+namespace Magento\User\Model\Authorization;
+
+use Magento\Authorization\Model\UserContextInterface;
 use Magento\Backend\Model\Auth\Session as AdminSession;
 
 /**
- * Admin user locator.
+ * Session-based admin user context
  */
-class Admin implements UserLocatorInterface
+class AdminSessionUserContext implements UserContextInterface
 {
     /**
      * @var AdminSession
@@ -52,7 +52,7 @@ class Admin implements UserLocatorInterface
      */
     public function getUserId()
     {
-        return $this->_adminSession->hasUser() ? (int)$this->_adminSession->getUser()->getId() : 0;
+        return $this->_adminSession->hasUser() ? (int)$this->_adminSession->getUser()->getId() : null;
     }
 
     /**
@@ -60,6 +60,6 @@ class Admin implements UserLocatorInterface
      */
     public function getUserType()
     {
-        return UserIdentifier::USER_TYPE_ADMIN;
+        return UserContextInterface::USER_TYPE_ADMIN;
     }
 }
diff --git a/app/code/Magento/Authz/Model/UserIdentifier/Factory.php b/app/code/Magento/User/Model/Plugin/AuthorizationRole.php
similarity index 57%
rename from app/code/Magento/Authz/Model/UserIdentifier/Factory.php
rename to app/code/Magento/User/Model/Plugin/AuthorizationRole.php
index 906a7d541799143154690c24c4c23ce61f968412..3dff78a34764174e396ad3992e1c9a82dea96c5e 100644
--- a/app/code/Magento/Authz/Model/UserIdentifier/Factory.php
+++ b/app/code/Magento/User/Model/Plugin/AuthorizationRole.php
@@ -21,43 +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\Authz\Model\UserIdentifier;
 
-use Magento\Framework\ObjectManager;
-use Magento\Authz\Model\UserIdentifier;
+namespace Magento\User\Model\Plugin;
+
+use Magento\Authorization\Model\Role;
 
 /**
- * User identifier factory.
+ * Plugin for authorization role model
  */
-class Factory
+class AuthorizationRole
 {
-    /**
-     * @var \Magento\Framework\ObjectManager
-     */
-    protected $_objectManager;
+    /** @var \Magento\User\Model\Resource\User */
+    protected $userResourceModel;
 
     /**
      * Initialize dependencies
      *
-     * @param ObjectManager $objectManager
+     * @param \Magento\User\Model\Resource\User $userResourceModel
      */
-    public function __construct(ObjectManager $objectManager)
+    public function __construct(\Magento\User\Model\Resource\User $userResourceModel)
     {
-        $this->_objectManager = $objectManager;
+        $this->userResourceModel = $userResourceModel;
     }
 
     /**
-     * Create instance of user identifier.
+     * Update role users ACL.
      *
-     * @param string $userType
-     * @param int $userId
-     * @return UserIdentifier
+     * @param Role $subject
+     * @param Role $result
+     * @return Role
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
-    public function create($userType, $userId = 0)
+    public function afterSave(Role $subject, Role $result)
     {
-        return $this->_objectManager->create(
-            'Magento\Authz\Model\UserIdentifier',
-            array('userType' => $userType, 'userId' => $userId)
-        );
+        $this->userResourceModel->updateRoleUsersAcl($subject);
+        return $result;
     }
 }
diff --git a/app/code/Magento/User/Model/Resource/User.php b/app/code/Magento/User/Model/Resource/User.php
index 07ca74f8ae8fe156ab4c521cfb06a6da69b788b6..407eb9a88763cf15222475bf804b952ee2428e01 100644
--- a/app/code/Magento/User/Model/Resource/User.php
+++ b/app/code/Magento/User/Model/Resource/User.php
@@ -23,8 +23,9 @@
  */
 namespace Magento\User\Model\Resource;
 
-use Magento\User\Model\Acl\Role\Group as RoleGroup;
-use Magento\User\Model\Acl\Role\User as RoleUser;
+use Magento\Authorization\Model\Acl\Role\Group as RoleGroup;
+use Magento\Authorization\Model\Acl\Role\User as RoleUser;
+use Magento\Authorization\Model\UserContextInterface;
 use Magento\User\Model\User as ModelUser;
 
 /**
@@ -40,7 +41,7 @@ class User extends \Magento\Framework\Model\Resource\Db\AbstractDb
     /**
      * Role model
      *
-     * @var \Magento\User\Model\RoleFactory
+     * @var \Magento\Authorization\Model\RoleFactory
      */
     protected $_roleFactory;
 
@@ -49,24 +50,32 @@ class User extends \Magento\Framework\Model\Resource\Db\AbstractDb
      */
     protected $dateTime;
 
+    /**
+     * Users table
+     *
+     * @var string
+     */
+    protected $_usersTable;
+
     /**
      * Construct
      *
      * @param \Magento\Framework\App\Resource $resource
      * @param \Magento\Framework\Acl\CacheInterface $aclCache
-     * @param \Magento\User\Model\RoleFactory $roleFactory
+     * @param \Magento\Authorization\Model\RoleFactory $roleFactory
      * @param \Magento\Framework\Stdlib\DateTime $dateTime
      */
     public function __construct(
         \Magento\Framework\App\Resource $resource,
         \Magento\Framework\Acl\CacheInterface $aclCache,
-        \Magento\User\Model\RoleFactory $roleFactory,
+        \Magento\Authorization\Model\RoleFactory $roleFactory,
         \Magento\Framework\Stdlib\DateTime $dateTime
     ) {
         parent::__construct($resource);
         $this->_aclCache = $aclCache;
         $this->_roleFactory = $roleFactory;
         $this->dateTime = $dateTime;
+        $this->_usersTable = $this->getTable('admin_user');
     }
 
     /**
@@ -149,7 +158,7 @@ class User extends \Magento\Framework\Model\Resource\Db\AbstractDb
             $adapter = $this->_getReadAdapter();
 
             $select = $adapter->select();
-            $select->from($this->getTable('admin_role'))->where('parent_id > :parent_id')->where('user_id = :user_id');
+            $select->from($this->getTable('authorization_role'))->where('parent_id > :parent_id')->where('user_id = :user_id');
 
             $binds = array('parent_id' => 0, 'user_id' => $userId);
 
@@ -200,7 +209,7 @@ class User extends \Magento\Framework\Model\Resource\Db\AbstractDb
     public function _clearUserRoles(ModelUser $user)
     {
         $conditions = array('user_id = ?' => (int)$user->getId());
-        $this->_getWriteAdapter()->delete($this->getTable('admin_role'), $conditions);
+        $this->_getWriteAdapter()->delete($this->getTable('authorization_role'), $conditions);
     }
 
     /**
@@ -213,7 +222,7 @@ class User extends \Magento\Framework\Model\Resource\Db\AbstractDb
     protected function _createUserRole($parentId, ModelUser $user)
     {
         if ($parentId > 0) {
-            /** @var \Magento\User\Model\Role $parentRole */
+            /** @var \Magento\Authorization\Model\Role $parentRole */
             $parentRole = $this->_roleFactory->create()->load($parentId);
         } else {
             $role = new \Magento\Framework\Object();
@@ -228,12 +237,13 @@ class User extends \Magento\Framework\Model\Resource\Db\AbstractDb
                     'sort_order' => 0,
                     'role_type' => RoleUser::ROLE_TYPE,
                     'user_id' => $user->getId(),
+                    'user_type' => UserContextInterface::USER_TYPE_ADMIN,
                     'role_name' => $user->getFirstname()
                 )
             );
 
-            $insertData = $this->_prepareDataForTable($data, $this->getTable('admin_role'));
-            $this->_getWriteAdapter()->insert($this->getTable('admin_role'), $insertData);
+            $insertData = $this->_prepareDataForTable($data, $this->getTable('authorization_role'));
+            $this->_getWriteAdapter()->insert($this->getTable('authorization_role'), $insertData);
             $this->_aclCache->clean();
         }
     }
@@ -270,7 +280,7 @@ class User extends \Magento\Framework\Model\Resource\Db\AbstractDb
             $conditions = array('user_id = ?' => $uid);
 
             $adapter->delete($this->getMainTable(), $conditions);
-            $adapter->delete($this->getTable('admin_role'), $conditions);
+            $adapter->delete($this->getTable('authorization_role'), $conditions);
         } catch (\Magento\Framework\Model\Exception $e) {
             throw $e;
             return false;
@@ -295,7 +305,7 @@ class User extends \Magento\Framework\Model\Resource\Db\AbstractDb
             return array();
         }
 
-        $table = $this->getTable('admin_role');
+        $table = $this->getTable('authorization_role');
         $adapter = $this->_getReadAdapter();
 
         $select = $adapter->select()->from(
@@ -339,7 +349,7 @@ class User extends \Magento\Framework\Model\Resource\Db\AbstractDb
 
         $condition = array('user_id = ?' => (int)$user->getId(), 'parent_id = ?' => (int)$user->getRoleId());
 
-        $dbh->delete($this->getTable('admin_role'), $condition);
+        $dbh->delete($this->getTable('authorization_role'), $condition);
         return $this;
     }
 
@@ -352,7 +362,7 @@ class User extends \Magento\Framework\Model\Resource\Db\AbstractDb
     public function roleUserExists(\Magento\Framework\Model\AbstractModel $user)
     {
         if ($user->getUserId() > 0) {
-            $roleTable = $this->getTable('admin_role');
+            $roleTable = $this->getTable('authorization_role');
 
             $dbh = $this->_getReadAdapter();
 
@@ -454,4 +464,25 @@ class User extends \Magento\Framework\Model\Resource\Db\AbstractDb
 
         return $userIdentity;
     }
+
+    /**
+     * Update role users ACL
+     *
+     * @param \Magento\Authorization\Model\Role $role
+     * @return bool
+     */
+    public function updateRoleUsersAcl(\Magento\Authorization\Model\Role $role)
+    {
+        $write = $this->_getWriteAdapter();
+        $users = $role->getRoleUsers();
+        $rowsCount = 0;
+
+        if (sizeof($users) > 0) {
+            $bind = array('reload_acl_flag' => 1);
+            $where = array('user_id IN(?)' => $users);
+            $rowsCount = $write->update($this->_usersTable, $bind, $where);
+        }
+
+        return $rowsCount > 0;
+    }
 }
diff --git a/app/code/Magento/User/Model/User.php b/app/code/Magento/User/Model/User.php
index af20e023055c4897aba392ccd728c8bef39a529f..3d33fe0582803243c4e3bafe25acb76ca6d4bf98 100644
--- a/app/code/Magento/User/Model/User.php
+++ b/app/code/Magento/User/Model/User.php
@@ -23,6 +23,9 @@
  */
 namespace Magento\User\Model;
 
+use Magento\Backend\Model\Auth\Credential\StorageInterface;
+use Magento\Framework\Model\AbstractModel;
+
 /**
  * Admin user model
  *
@@ -54,7 +57,7 @@ namespace Magento\User\Model;
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  * @SuppressWarnings(PHPMD.LongVariable)
  */
-class User extends \Magento\Framework\Model\AbstractModel implements \Magento\Backend\Model\Auth\Credential\StorageInterface
+class User extends AbstractModel implements StorageInterface
 {
     /**
      * Configuration paths for email templates and identities
@@ -80,7 +83,7 @@ class User extends \Magento\Framework\Model\AbstractModel implements \Magento\Ba
     /**
      * Admin role
      *
-     * @var \Magento\User\Model\Role
+     * @var \Magento\Authorization\Model\Role
      */
     protected $_role;
 
@@ -115,7 +118,7 @@ class User extends \Magento\Framework\Model\AbstractModel implements \Magento\Ba
     /**
      * Role model factory
      *
-     * @var \Magento\User\Model\RoleFactory
+     * @var \Magento\Authorization\Model\RoleFactory
      */
     protected $_roleFactory;
 
@@ -145,7 +148,7 @@ class User extends \Magento\Framework\Model\AbstractModel implements \Magento\Ba
      * @param \Magento\User\Helper\Data $userData
      * @param \Magento\Backend\App\ConfigInterface $config
      * @param \Magento\Framework\Validator\ObjectFactory $validatorObjectFactory
-     * @param \Magento\User\Model\RoleFactory $roleFactory
+     * @param \Magento\Authorization\Model\RoleFactory $roleFactory
      * @param \Magento\Framework\Mail\Template\TransportBuilder $transportBuilder
      * @param \Magento\Framework\Encryption\EncryptorInterface $encryptor
      * @param \Magento\Framework\Stdlib\DateTime $dateTime
@@ -162,7 +165,7 @@ class User extends \Magento\Framework\Model\AbstractModel implements \Magento\Ba
         \Magento\User\Helper\Data $userData,
         \Magento\Backend\App\ConfigInterface $config,
         \Magento\Framework\Validator\ObjectFactory $validatorObjectFactory,
-        \Magento\User\Model\RoleFactory $roleFactory,
+        \Magento\Authorization\Model\RoleFactory $roleFactory,
         \Magento\Framework\Mail\Template\TransportBuilder $transportBuilder,
         \Magento\Framework\Encryption\EncryptorInterface $encryptor,
         \Magento\Framework\Stdlib\DateTime $dateTime,
@@ -225,7 +228,7 @@ class User extends \Magento\Framework\Model\AbstractModel implements \Magento\Ba
         $this->_config = $objectManager->get('Magento\Backend\App\ConfigInterface');
         $this->_registry = $objectManager->get('Magento\Framework\Registry');
         $this->_validatorObject = $objectManager->get('Magento\Framework\Validator\ObjectFactory');
-        $this->_roleFactory = $objectManager->get('Magento\User\Model\RoleFactory');
+        $this->_roleFactory = $objectManager->get('Magento\Authorization\Model\RoleFactory');
         $this->_encryptor = $objectManager->get('Magento\Framework\Encryption\EncryptorInterface');
         $this->_transportBuilder = $objectManager->get('Magento\Framework\Mail\Template\TransportBuilder');
         $this->_storeManager = $objectManager->get('Magento\Store\Model\StoreManagerInterface');
@@ -427,7 +430,7 @@ class User extends \Magento\Framework\Model\AbstractModel implements \Magento\Ba
     /**
      * Get admin role model
      *
-     * @return \Magento\User\Model\Role
+     * @return \Magento\Authorization\Model\Role
      */
     public function getRole()
     {
diff --git a/app/code/Magento/User/composer.json b/app/code/Magento/User/composer.json
index 127bbd4d541303310a603e850781f24e2b0de630..e33b331681524124fe6b24d4dcbac88fb1a79828 100644
--- a/app/code/Magento/User/composer.json
+++ b/app/code/Magento/User/composer.json
@@ -2,48 +2,18 @@
     "name": "magento/module-user",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-cms": "0.1.0-alpha89",
-        "magento/module-newsletter": "0.1.0-alpha89",
-        "magento/module-review": "0.1.0-alpha89",
-        "magento/module-admin-notification": "0.1.0-alpha89",
-        "magento/module-backup": "0.1.0-alpha89",
-        "magento/module-catalog-inventory": "0.1.0-alpha89",
-        "magento/module-catalog-rule": "0.1.0-alpha89",
-        "magento/module-catalog-search": "0.1.0-alpha89",
-        "magento/module-checkout": "0.1.0-alpha89",
-        "magento/module-contact": "0.1.0-alpha89",
-        "magento/module-currency-symbol": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-design-editor": "0.1.0-alpha89",
-        "magento/module-downloadable": "0.1.0-alpha89",
-        "magento/module-google-shopping": "0.1.0-alpha89",
-        "magento/module-import-export": "0.1.0-alpha89",
-        "magento/module-index": "0.1.0-alpha89",
-        "magento/module-integration": "0.1.0-alpha89",
-        "magento/module-payment": "0.1.0-alpha89",
-        "magento/module-paypal": "0.1.0-alpha89",
-        "magento/module-persistent": "0.1.0-alpha89",
-        "magento/module-reports": "0.1.0-alpha89",
-        "magento/module-rss": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-sales-rule": "0.1.0-alpha89",
-        "magento/module-shipping": "0.1.0-alpha89",
-        "magento/module-sitemap": "0.1.0-alpha89",
-        "magento/module-tax": "0.1.0-alpha89",
-        "magento/module-widget": "0.1.0-alpha89",
-        "magento/module-wishlist": "0.1.0-alpha89",
-        "magento/module-email": "0.1.0-alpha89",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-authorization": "0.1.0-alpha90",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-integration": "0.1.0-alpha90",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/User/data/user_setup/data-upgrade-1.6.1.1-1.6.1.2.php b/app/code/Magento/User/data/user_setup/data-upgrade-1.6.1.1-1.6.1.2.php
deleted file mode 100644
index 0028ffe4e5d92f0da0b8a682c69f7e0c97fe1929..0000000000000000000000000000000000000000
--- a/app/code/Magento/User/data/user_setup/data-upgrade-1.6.1.1-1.6.1.2.php
+++ /dev/null
@@ -1,241 +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)
- */
-
-/** @var $installer \Magento\Framework\Module\Setup */
-$installer = $this;
-$installer->startSetup();
-
-$map = array(
-    'admin/system/config/feed' => 'Find_Feed::config_feed',
-    'admin/catalog/feed' => 'Find_Feed::feed',
-    'admin/catalog/feed/import_items' => 'Find_Feed::import_items',
-    'admin/catalog/feed/import_products' => 'Find_Feed::import_products',
-    'admin/system/adminnotification' => 'Magento_AdminNotification::adminnotification',
-    'admin/system/adminnotification/remove' => 'Magento_AdminNotification::adminnotification_remove',
-    'admin/system/adminnotification/mark_as_read' => 'Magento_AdminNotification::mark_as_read',
-    'admin/system/adminnotification/show_list' => 'Magento_AdminNotification::show_list',
-    'admin/system/adminnotification/show_toolbar' => 'Magento_AdminNotification::show_toolbar',
-    'admin' => 'Magento_Adminhtml::admin',
-    'admin/system/config/advanced' => 'Magento_Adminhtml::advanced',
-    'all' => 'Magento_Adminhtml::all',
-    'admin/system/cache' => 'Magento_Adminhtml::cache',
-    'admin/system/config' => 'Magento_Adminhtml::config',
-    'admin/system/config/admin' => 'Magento_Adminhtml::config_admin',
-    'admin/system/config/design' => 'Magento_Adminhtml::config_design',
-    'admin/system/config/general' => 'Magento_Adminhtml::config_general',
-    'admin/system/config/system' => 'Magento_Adminhtml::config_system',
-    'admin/system/convert' => 'Magento_Adminhtml::convert',
-    'admin/system/config/currency' => 'Magento_Adminhtml::currency',
-    'admin/system/extensions/custom' => 'Magento_Adminhtml::custom',
-    'admin/dashboard' => 'Magento_Adminhtml::dashboard',
-    'admin/system/design' => 'Magento_Adminhtml::design',
-    'admin/system/config/dev' => 'Magento_Adminhtml::dev',
-    'admin/system/email_template' => 'Magento_Email::template',
-    'admin/system/extensions' => 'Magento_Adminhtml::extensions',
-    'admin/global_search' => 'Magento_Adminhtml::global_search',
-    'admin/system/convert/gui' => 'Magento_Adminhtml::gui',
-    'admin/system/extensions/local' => 'Magento_Adminhtml::local',
-    'admin/system/myaccount' => 'Magento_Adminhtml::myaccount',
-    'admin/system/convert/profiles' => 'Magento_Adminhtml::profiles',
-    'admin/system/design/schedule' => 'Magento_Adminhtml::schedule',
-    'admin/system/config/sendfriend' => 'Magento_Adminhtml::sendfriend',
-    'admin/system/store' => 'Magento_Adminhtml::store',
-    'admin/system' => 'Magento_Adminhtml::system',
-    'admin/system/tools' => 'Magento_Adminhtml::tools',
-    'admin/system/config/trans_email' => 'Magento_Adminhtml::trans_email',
-    'admin/system/variable' => 'Magento_Adminhtml::variable',
-    'admin/system/config/web' => 'Magento_Adminhtml::web',
-    'admin/system/tools/backup' => 'Magento_Backup::backup',
-    'admin/system/tools/backup/rollback' => 'Magento_Backup::rollback',
-    'admin/catalog/attributes/attributes' => 'Magento_Catalog::attributes_attributes',
-    'admin/catalog' => 'Magento_Catalog::catalog',
-    'admin/catalog/attributes' => 'Magento_Catalog::catalog_attributes',
-    'admin/catalog/categories' => 'Magento_Catalog::categories',
-    'admin/system/config/catalog' => 'Magento_Catalog::config_catalog',
-    'admin/catalog/products' => 'Magento_Catalog::products',
-    'admin/catalog/attributes/sets' => 'Magento_Catalog::sets',
-    'admin/catalog/update_attributes' => 'Magento_Catalog::update_attributes',
-    'admin/catalog/urlrewrite' => 'Magento_Catalog::urlrewrite',
-    'admin/system/config/cataloginventory' => 'Magento_CatalogInventory::cataloginventory',
-    'admin/promo' => 'Magento_CatalogRule::promo',
-    'admin/promo/catalog' => 'Magento_CatalogRule::promo_catalog',
-    'admin/catalog/search' => 'Magento_CatalogSearch::search',
-    'admin/system/config/checkout' => 'Magento_Checkout::checkout',
-    'admin/sales/checkoutagreement' => 'Magento_Checkout::checkoutagreement',
-    'admin/cms/block' => 'Magento_Cms::block',
-    'admin/cms' => 'Magento_Cms::cms',
-    'admin/system/config/cms' => 'Magento_Cms::config_cms',
-    'admin/cms/media_gallery' => 'Magento_Cms::media_gallery',
-    'admin/cms/page' => 'Magento_Cms::page',
-    'admin/cms/page/delete' => 'Magento_Cms::page_delete',
-    'admin/cms/page/save' => 'Magento_Cms::save',
-    'admin/system/config/contact' => 'Magento_Contact::contact',
-    'admin/system/currency/rates' => 'Magento_CurrencySymbol::currency_rates',
-    'admin/system/currency/symbols' => 'Magento_CurrencySymbol::symbols',
-    'admin/system/currency' => 'Magento_CurrencySymbol::system_currency',
-    'admin/system/config/customer' => 'Magento_Customer::config_customer',
-    'admin/customer' => 'Magento_Customer::customer',
-    'admin/customer/group' => 'Magento_Customer::group',
-    'admin/customer/manage' => 'Magento_Customer::manage',
-    'admin/customer/online' => 'Magento_Customer::online',
-    'admin/system/design/editor' => 'Magento_DesignEditor::editor',
-    'admin/system/config/downloadable' => 'Magento_Downloadable::downloadable',
-    'admin/system/config/google' => 'Magento_GoogleAnalytic::google',
-    'admin/catalog/googleshopping' => 'Magento_GoogleShopping::googleshopping',
-    'admin/catalog/googleshopping/items' => 'Magento_GoogleShopping::items',
-    'admin/catalog/googleshopping/types' => 'Magento_GoogleShopping::types',
-    'admin/system/convert/export' => 'Magento_ImportExport::export',
-    'admin/system/convert/import' => 'Magento_ImportExport::import',
-    'admin/system/index' => 'Magento_Index::index',
-    'admin/newsletter' => 'Magento_Newsletter::admin_newsletter',
-    'admin/system/config/newsletter' => 'Magento_Newsletter::newsletter',
-    'admin/newsletter/problem' => 'Magento_Newsletter::problem',
-    'admin/newsletter/queue' => 'Magento_Newsletter::queue',
-    'admin/newsletter/subscriber' => 'Magento_Newsletter::subscriber',
-    'admin/newsletter/template' => 'Magento_Newsletter::template',
-    'admin/system/config/oauth' => 'Magento_Oauth::oauth',
-    'admin/system/config/payment' => 'Magento_Payment::payment',
-    'admin/system/config/payment_services' => 'Magento_Payment::payment_services',
-    'admin/report/salesroot/paypal_settlement_reports/fetch' => 'Magento_Paypal::fetch',
-    'admin/system/config/paypal' => 'Magento_Paypal::paypal',
-    'admin/report/salesroot/paypal_settlement_reports' => 'Magento_Paypal::paypal_settlement_reports',
-    'admin/report/salesroot/paypal_settlement_reports/view' => 'Magento_Paypal::paypal_settlement_reports_view',
-    'admin/system/config/persistent' => 'Magento_Persistent::persistent',
-    'admin/cms/poll' => 'Magento_Poll::poll',
-    'admin/catalog/reviews_ratings/ratings' => 'Magento_Review::ratings',
-    'admin/report/shopcart/abandoned' => 'Magento_Reports::abandoned',
-    'admin/report/customers/accounts' => 'Magento_Reports::accounts',
-    'admin/report/products/bestsellers' => 'Magento_Reports::bestsellers',
-    'admin/report/salesroot/coupons' => 'Magento_Reports::coupons',
-    'admin/report/customers' => 'Magento_Reports::customers',
-    'admin/report/customers/orders' => 'Magento_Reports::customers_orders',
-    'admin/report/products/downloads' => 'Magento_Reports::downloads',
-    'admin/report/salesroot/invoiced' => 'Magento_Reports::invoiced',
-    'admin/report/products/lowstock' => 'Magento_Reports::lowstock',
-    'admin/report/tags/popular' => 'Magento_Reports::popular',
-    'admin/report/shopcart/product' => 'Magento_Reports::product',
-    'admin/report/salesroot/refunded' => 'Magento_Reports::refunded',
-    'admin/report' => 'Magento_Reports::report',
-    'admin/report/products' => 'Magento_Reports::report_products',
-    'admin/report/search' => 'Magento_Reports::report_search',
-    'admin/system/config/reports' => 'Magento_Reports::reports',
-    'admin/report/review' => 'Magento_Reports::review',
-    'admin/report/review/customer' => 'Magento_Reports::review_customer',
-    'admin/report/review/product' => 'Magento_Reports::review_product',
-    'admin/report/salesroot' => 'Magento_Reports::salesroot',
-    'admin/report/salesroot/sales' => 'Magento_Reports::salesroot_sales',
-    'admin/report/salesroot/shipping' => 'Magento_Reports::shipping',
-    'admin/report/shopcart' => 'Magento_Reports::shopcart',
-    'admin/report/products/sold' => 'Magento_Reports::sold',
-    'admin/report/statistics' => 'Magento_Reports::statistics',
-    'admin/report/tags' => 'Magento_Reports::tags',
-    'admin/report/tags/customer' => 'Magento_Reports::tags_customer',
-    'admin/report/tags/product' => 'Magento_Reports::tags_product',
-    'admin/report/salesroot/tax' => 'Magento_Reports::tax',
-    'admin/report/customers/totals' => 'Magento_Reports::totals',
-    'admin/report/products/viewed' => 'Magento_Reports::viewed',
-    'admin/catalog/reviews_ratings/reviews/pending' => 'Magento_Review::pending',
-    'admin/catalog/reviews_ratings/reviews' => 'Magento_Review::reviews',
-    'admin/catalog/reviews_ratings/reviews/all' => 'Magento_Review::reviews_all',
-    'admin/catalog/reviews_ratings' => 'Magento_Review::reviews_ratings',
-    'admin/system/config/rss' => 'Magento_Rss::rss',
-    'admin/sales/order/actions' => 'Magento_Sales::actions',
-    'admin/sales/order/actions/edit' => 'Magento_Sales::actions_edit',
-    'admin/paypal/billing_agreement/actions/manage' => 'Magento_Paypal::actions_manage',
-    'admin/sales/order/actions/view' => 'Magento_Sales::actions_view',
-    'admin/paypal/billing_agreement' => 'Magento_Paypal::billing_agreement',
-    'admin/paypal/billing_agreement/actions' => 'Magento_Paypal::billing_agreement_actions',
-    'admin/paypal/billing_agreement/actions/view' => 'Magento_Paypal::billing_agreement_actions_view',
-    'admin/sales/order/actions/cancel' => 'Magento_Sales::cancel',
-    'admin/sales/order/actions/capture' => 'Magento_Sales::capture',
-    'admin/sales/order/actions/comment' => 'Magento_Sales::comment',
-    'admin/system/config/sales' => 'Magento_Sales::config_sales',
-    'admin/sales/order/actions/create' => 'Magento_Sales::create',
-    'admin/sales/order/actions/creditmemo' => 'Magento_Sales::creditmemo',
-    'admin/sales/order/actions/email' => 'Magento_Sales::email',
-    'admin/sales/order/actions/emails' => 'Magento_Sales::emails',
-    'admin/sales/order/actions/hold' => 'Magento_Sales::hold',
-    'admin/sales/order/actions/invoice' => 'Magento_Sales::invoice',
-    'admin/system/order_statuses' => 'Magento_Sales::order_statuses',
-    'admin/sales/recurringPayment' => 'Magento_Sales::recurring_payment',
-    'admin/sales/order/actions/reorder' => 'Magento_Sales::reorder',
-    'admin/sales/order/actions/review_payment' => 'Magento_Sales::review_payment',
-    'admin/sales' => 'Magento_Sales::sales',
-    'admin/sales/creditmemo' => 'Magento_Sales::sales_creditmemo',
-    'admin/system/config/sales_email' => 'Magento_Sales::sales_email',
-    'admin/sales/invoice' => 'Magento_Sales::sales_invoice',
-    'admin/sales/order' => 'Magento_Sales::sales_order',
-    'admin/system/config/sales_pdf' => 'Magento_Sales::sales_pdf',
-    'admin/sales/order/actions/ship' => 'Magento_Sales::ship',
-    'admin/sales/shipment' => 'Magento_Sales::shipment',
-    'admin/sales/transactions' => 'Magento_Sales::transactions',
-    'admin/sales/transactions/fetch' => 'Magento_Sales::transactions_fetch',
-    'admin/sales/order/actions/unhold' => 'Magento_Sales::unhold',
-    'admin/sales/billing_agreement/actions/use' => 'Magento_Paypal::use',
-    'admin/system/config/promo' => 'Magento_SalesRule::config_promo',
-    'admin/promo/quote' => 'Magento_SalesRule::quote',
-    'admin/system/config/carriers' => 'Magento_Shipping::carriers',
-    'admin/system/config/shipping' => 'Magento_Shipping::config_shipping',
-    'admin/system/config/sitemap' => 'Magento_Sitemap::config_sitemap',
-    'admin/catalog/sitemap' => 'Magento_Sitemap::sitemap',
-    'admin/sales/tax/classes_customer' => 'Magento_Tax::classes_customer',
-    'admin/sales/tax/classes_product' => 'Magento_Tax::classes_product',
-    'admin/system/config/tax' => 'Magento_Tax::config_tax',
-    'admin/sales/tax/import_export' => 'Magento_Tax::import_export',
-    'admin/sales/tax/rules' => 'Magento_Tax::rules',
-    'admin/sales/tax' => 'Magento_Tax::sales_tax',
-    'admin/sales/tax/rates' => 'Magento_Tax::tax_rates',
-    'admin/system/acl' => 'Magento_User::acl',
-    'admin/system/acl/roles' => 'Magento_User::acl_roles',
-    'admin/system/acl/users' => 'Magento_User::acl_users',
-    'admin/cms/widget_instance' => 'Magento_Widget::widget_instance',
-    'admin/system/config/wishlist' => 'Magento_Wishlist::config_wishlist',
-    'admin/xmlconnect/history' => 'Magento_XmlConnect::history',
-    'admin/xmlconnect/mobile' => 'Magento_XmlConnect::mobile',
-    'admin/xmlconnect/templates' => 'Magento_XmlConnect::templates',
-    'admin/xmlconnect' => 'Magento_XmlConnect::xmlconnect',
-    'admin/xmlconnect/queue' => 'Magento_XmlConnect::xmlconnect_queue',
-    'admin/system/config/facebook' => 'Social_Facebook::facebook'
-);
-
-$tableName = $installer->getTable('admin_rule');
-/** @var \Magento\Framework\DB\Adapter\AdapterInterface $connection */
-$connection = $installer->getConnection();
-
-$select = $connection->select();
-$select->from($tableName, array())->columns(array('resource_id' => 'resource_id'))->group('resource_id');
-
-foreach ($connection->fetchCol($select) as $oldKey) {
-    /**
-     * If used ACL key is converted previously or we haven't map for specified ACL resource item
-     * than go to the next item
-     */
-    if (in_array($oldKey, $map) || false == isset($map[$oldKey])) {
-        continue;
-    }
-
-    /** Update rule ACL key from xpath format to identifier format */
-    $connection->update($tableName, array('resource_id' => $map[$oldKey]), array('resource_id = ?' => $oldKey));
-}
-$installer->endSetup();
diff --git a/app/code/Magento/User/etc/adminhtml/acl.xml b/app/code/Magento/User/etc/acl.xml
similarity index 94%
rename from app/code/Magento/User/etc/adminhtml/acl.xml
rename to app/code/Magento/User/etc/acl.xml
index a8858235707b7aab0c3d588ce2b794d4c13bd888..aa309efc89c85de8839c08092057a0e4df4c701b 100644
--- a/app/code/Magento/User/etc/adminhtml/acl.xml
+++ b/app/code/Magento/User/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/User/etc/di.xml b/app/code/Magento/User/etc/di.xml
index f27e20b7c4f8529483a98728f5b8105fec7ec0ef..020e584b91b06e2ec8c97e5bfbdd2c3f5e3c7bdc 100644
--- a/app/code/Magento/User/etc/di.xml
+++ b/app/code/Magento/User/etc/di.xml
@@ -24,13 +24,6 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
-    <type name="Magento\User\Model\Role" shared="false" />
-    <type name="Magento\User\Model\Resource\Rules">
-        <arguments>
-            <argument name="rootResource" xsi:type="object">Magento\Framework\Acl\RootResource\Proxy</argument>
-            <argument name="aclCache" xsi:type="object">Magento\Framework\Acl\Cache\Proxy</argument>
-        </arguments>
-    </type>
     <type name="Magento\User\Model\Resource\User">
         <arguments>
             <argument name="aclCache" xsi:type="object">Magento\Framework\Acl\Cache\Proxy</argument>
@@ -39,14 +32,11 @@
     <type name="Magento\Framework\Module\Updater\SetupFactory">
         <arguments>
             <argument name="resourceTypes" xsi:type="array">
-                <item name="user_setup" xsi:type="string">Magento\User\Model\Resource\Setup</item>
+                <item name="user_setup" xsi:type="string">Magento\Framework\Module\Setup</item>
             </argument>
         </arguments>
     </type>
-    <type name="Magento\Framework\Acl\Builder">
-        <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 name="Magento\Authorization\Model\Role">
+        <plugin name="updateRoleUsersAcl" type="Magento\User\Model\Plugin\AuthorizationRole" sortOrder="20"/>
     </type>
 </config>
diff --git a/app/code/Magento/User/etc/module.xml b/app/code/Magento/User/etc/module.xml
index a20a34499287a2a6cd6d567171ee5520686e26b7..7c4efc0c354bf3a1c04fff3a0bf89f5d46163b33 100644
--- a/app/code/Magento/User/etc/module.xml
+++ b/app/code/Magento/User/etc/module.xml
@@ -29,41 +29,11 @@
             <module name="Magento_Backend"/>
         </sequence>
         <depends>
+            <module name="Magento_Authorization"/>
             <module name="Magento_Store"/>
             <module name="Magento_Backend"/>
             <module name="Magento_Core"/>
-            <module name="Magento_Catalog"/>
-            <module name="Magento_Cms"/>
-            <module name="Magento_Newsletter"/>
-            <module name="Magento_Review"/>
-            <module name="Magento_AdminNotification"/>
-            <module name="Magento_Backup"/>
-            <module name="Magento_CatalogInventory"/>
-            <module name="Magento_CatalogRule"/>
-            <module name="Magento_CatalogSearch"/>
-            <module name="Magento_Checkout"/>
-            <module name="Magento_Contact"/>
-            <module name="Magento_CurrencySymbol"/>
-            <module name="Magento_Customer"/>
-            <module name="Magento_DesignEditor"/>
-            <module name="Magento_Downloadable"/>
-            <module name="Magento_GoogleShopping"/>
-            <module name="Magento_ImportExport"/>
-            <module name="Magento_Index"/>
             <module name="Magento_Integration"/>
-            <module name="Magento_Payment"/>
-            <module name="Magento_Paypal"/>
-            <module name="Magento_Persistent"/>
-            <module name="Magento_Reports"/>
-            <module name="Magento_Rss"/>
-            <module name="Magento_Sales"/>
-            <module name="Magento_SalesRule"/>
-            <module name="Magento_Shipping"/>
-            <module name="Magento_Sitemap"/>
-            <module name="Magento_Tax"/>
-            <module name="Magento_Widget"/>
-            <module name="Magento_Wishlist"/>
-            <module name="Magento_Email"/>
             <module name="Magento_Theme"/>
         </depends>
     </module>
diff --git a/app/code/Magento/User/etc/webapi_rest/di.xml b/app/code/Magento/User/etc/webapi_rest/di.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b305d85f0f0bde0c5f61c5dcbea40b3e1374cfc1
--- /dev/null
+++ b/app/code/Magento/User/etc/webapi_rest/di.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 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
+    <type name="Magento\Authorization\Model\CompositeUserContext">
+        <arguments>
+            <argument name="userContexts" xsi:type="array">
+                <item name="adminSessionUserContext" xsi:type="array">
+                    <item name="type" xsi:type="object">Magento\User\Model\Authorization\AdminSessionUserContext</item>
+                    <item name="sortOrder" xsi:type="string">30</item>
+                </item>
+            </argument>
+        </arguments>
+    </type>
+</config>
diff --git a/app/code/Magento/User/sql/user_setup/install-1.6.0.0.php b/app/code/Magento/User/sql/user_setup/install-1.6.0.0.php
index f62f43a9822a65a69518bb4a96551d8150d10ef0..78272f107d22491d470803d6c7b3e1dc9c7888b8 100644
--- a/app/code/Magento/User/sql/user_setup/install-1.6.0.0.php
+++ b/app/code/Magento/User/sql/user_setup/install-1.6.0.0.php
@@ -57,132 +57,6 @@ if (!$installer->getConnection()->isTableExists($installer->getTable('admin_asse
     $installer->getConnection()->createTable($table);
 }
 
-/**
- * Create table 'admin_role'
- */
-if (!$installer->getConnection()->isTableExists($installer->getTable('admin_role'))) {
-    $table = $installer->getConnection()->newTable(
-        $installer->getTable('admin_role')
-    )->addColumn(
-        'role_id',
-        \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
-        null,
-        array('identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true),
-        'Role ID'
-    )->addColumn(
-        'parent_id',
-        \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
-        null,
-        array('unsigned' => true, 'nullable' => false, 'default' => '0'),
-        'Parent Role ID'
-    )->addColumn(
-        'tree_level',
-        \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
-        null,
-        array('unsigned' => true, 'nullable' => false, 'default' => '0'),
-        'Role Tree Level'
-    )->addColumn(
-        'sort_order',
-        \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
-        null,
-        array('unsigned' => true, 'nullable' => false, 'default' => '0'),
-        'Role Sort Order'
-    )->addColumn(
-        'role_type',
-        \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
-        1,
-        array('nullable' => false, 'default' => '0'),
-        'Role Type'
-    )->addColumn(
-        'user_id',
-        \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
-        null,
-        array('unsigned' => true, 'nullable' => false, 'default' => '0'),
-        'User ID'
-    )->addColumn(
-        'role_name',
-        \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
-        50,
-        array('nullable' => true, 'default' => null),
-        'Role Name'
-    )->addIndex(
-        $installer->getIdxName('admin_role', array('parent_id', 'sort_order')),
-        array('parent_id', 'sort_order')
-    )->addIndex(
-        $installer->getIdxName('admin_role', array('tree_level')),
-        array('tree_level')
-    )->setComment(
-        'Admin Role Table'
-    );
-    $installer->getConnection()->createTable($table);
-}
-/**
- * Create table 'admin_rule'
- */
-if (!$installer->getConnection()->isTableExists($installer->getTable('admin_rule'))) {
-    $table = $installer->getConnection()->newTable(
-        $installer->getTable('admin_rule')
-    )->addColumn(
-        'rule_id',
-        \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
-        null,
-        array('identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true),
-        'Rule ID'
-    )->addColumn(
-        'role_id',
-        \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
-        null,
-        array('unsigned' => true, 'nullable' => false, 'default' => '0'),
-        'Role ID'
-    )->addColumn(
-        'resource_id',
-        \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
-        255,
-        array('nullable' => true, 'default' => null),
-        'Resource ID'
-    )->addColumn(
-        'privileges',
-        \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
-        20,
-        array('nullable' => true),
-        'Privileges'
-    )->addColumn(
-        'assert_id',
-        \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
-        null,
-        array('unsigned' => true, 'nullable' => false, 'default' => '0'),
-        'Assert ID'
-    )->addColumn(
-        'role_type',
-        \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
-        1,
-        array(),
-        'Role Type'
-    )->addColumn(
-        'permission',
-        \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
-        10,
-        array(),
-        'Permission'
-    )->addIndex(
-        $installer->getIdxName('admin_rule', array('resource_id', 'role_id')),
-        array('resource_id', 'role_id')
-    )->addIndex(
-        $installer->getIdxName('admin_rule', array('role_id', 'resource_id')),
-        array('role_id', 'resource_id')
-    )->addForeignKey(
-        $installer->getFkName('admin_rule', 'role_id', 'admin_role', 'role_id'),
-        'role_id',
-        $installer->getTable('admin_role'),
-        'role_id',
-        \Magento\Framework\DB\Ddl\Table::ACTION_CASCADE,
-        \Magento\Framework\DB\Ddl\Table::ACTION_CASCADE
-    )->setComment(
-        'Admin Rule Table'
-    );
-    $installer->getConnection()->createTable($table);
-}
-
 /**
  * Create table 'admin_user'
  */
diff --git a/app/code/Magento/User/sql/user_setup/upgrade-1.6.1.0-1.6.1.1.php b/app/code/Magento/User/sql/user_setup/upgrade-1.6.1.0-1.6.1.1.php
index 6478b31a12b935eca1dc6409927d3d3bbe0bde83..61e9fb37c2795e0c3c3f0bb48a1a4eda7acc4263 100644
--- a/app/code/Magento/User/sql/user_setup/upgrade-1.6.1.0-1.6.1.1.php
+++ b/app/code/Magento/User/sql/user_setup/upgrade-1.6.1.0-1.6.1.1.php
@@ -26,8 +26,6 @@
 $installer = $this;
 $installer->startSetup();
 
-// Add reset password link token column
 $installer->getConnection()->dropTable($installer->getTable('admin_assert'));
-$installer->getConnection()->dropColumn($installer->getTable('admin_rule'), 'assert_id');
 
 $installer->endSetup();
diff --git a/app/code/Magento/User/sql/user_setup/upgrade-1.6.1.2-1.6.1.3.php b/app/code/Magento/User/sql/user_setup/upgrade-1.6.1.2-1.6.1.3.php
deleted file mode 100644
index f25a36f6b6e656c27e98a0bda107bfdc0aef9e04..0000000000000000000000000000000000000000
--- a/app/code/Magento/User/sql/user_setup/upgrade-1.6.1.2-1.6.1.3.php
+++ /dev/null
@@ -1,49 +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)
- */
-/** @var $installer \Magento\Framework\Module\Setup */
-$installer = $this;
-
-$tableName = $installer->getTable('admin_rule');
-/** @var \Magento\Framework\DB\Adapter\AdapterInterface $connection */
-$connection = $installer->getConnection();
-
-$condition = $connection->prepareSqlCondition(
-    'resource_id',
-    array(
-        array('like' => '%xmlconnect%'),
-        array(
-            /**
-             * Include both old and new identifiers, as depending on install or upgrade process there can be
-             * either first or second in the database
-             */
-            'in' => array(
-                'admin/system/convert/gui',
-                'Magento_Adminhtml::gui',
-                'admin/system/convert/profiles',
-                'Magento_Adminhtml::profiles'
-            )
-        )
-    )
-);
-$connection->delete($tableName, $condition);
diff --git a/app/code/Magento/User/view/adminhtml/layout/adminhtml_user_role_grid_block.xml b/app/code/Magento/User/view/adminhtml/layout/adminhtml_user_role_grid_block.xml
index 077c9f1d62f8691638c2a1484520aaead7364af8..636830d28370644460ef8502cb4d4be33705bbf4 100644
--- a/app/code/Magento/User/view/adminhtml/layout/adminhtml_user_role_grid_block.xml
+++ b/app/code/Magento/User/view/adminhtml/layout/adminhtml_user_role_grid_block.xml
@@ -28,7 +28,7 @@
         <block class="Magento\Backend\Block\Widget\Grid" name="adminhtml.role.grid" as="grid">
             <arguments>
                 <argument name="id" xsi:type="string">roleGrid</argument>
-                <argument name="dataSource" xsi:type="object">Magento\User\Model\Resource\Role\Grid\Collection</argument>
+                <argument name="dataSource" xsi:type="object">Magento\Authorization\Model\Resource\Role\Grid\Collection</argument>
                 <argument name="save_parameters_in_session" xsi:type="string">1</argument>
                 <argument name="default_sort" xsi:type="string">role_id</argument>
                 <argument name="default_dir" xsi:type="string">asc</argument>
diff --git a/app/code/Magento/Usps/composer.json b/app/code/Magento/Usps/composer.json
index e384ca64a3868bc0556d01e4309946335ebb56b4..373b6e91de3af510678e109139117a1a1b8c854b 100644
--- a/app/code/Magento/Usps/composer.json
+++ b/app/code/Magento/Usps/composer.json
@@ -2,20 +2,20 @@
     "name": "magento/module-usps",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-shipping": "0.1.0-alpha89",
-        "magento/module-directory": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-catalog-inventory": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-shipping": "0.1.0-alpha90",
+        "magento/module-directory": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-catalog-inventory": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "lib-libxml": "*",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Webapi/Block/Adminhtml/Integration/Edit/Tab/Webapi.php b/app/code/Magento/Webapi/Block/Adminhtml/Integration/Edit/Tab/Webapi.php
index 363a1d2bcda89e2a928b6b58fa33764381260b1f..aabf35eecbac1ee054e0ee721a0cc7ff2a47b5d4 100644
--- a/app/code/Magento/Webapi/Block/Adminhtml/Integration/Edit/Tab/Webapi.php
+++ b/app/code/Magento/Webapi/Block/Adminhtml/Integration/Edit/Tab/Webapi.php
@@ -43,7 +43,7 @@ class Webapi extends \Magento\Backend\Block\Widget\Form\Generic implements
     /**
      * Rules collection factory
      *
-     * @var \Magento\User\Model\Resource\Rules\CollectionFactory
+     * @var \Magento\Authorization\Model\Resource\Rules\CollectionFactory
      */
     protected $_rulesCollectionFactory;
 
@@ -67,7 +67,7 @@ class Webapi extends \Magento\Backend\Block\Widget\Form\Generic implements
      * @param \Magento\Framework\Registry $registry
      * @param \Magento\Framework\Data\FormFactory $formFactory
      * @param \Magento\Framework\Acl\RootResource $rootResource
-     * @param \Magento\User\Model\Resource\Rules\CollectionFactory $rulesCollectionFactory
+     * @param \Magento\Authorization\Model\Resource\Rules\CollectionFactory $rulesCollectionFactory
      * @param \Magento\Framework\Acl\Resource\ProviderInterface $aclResourceProvider
      * @param \Magento\Webapi\Helper\Data $webapiData
      * @param \Magento\Integration\Helper\Data $integrationData
@@ -81,7 +81,7 @@ class Webapi extends \Magento\Backend\Block\Widget\Form\Generic implements
         \Magento\Framework\Registry $registry,
         \Magento\Framework\Data\FormFactory $formFactory,
         \Magento\Framework\Acl\RootResource $rootResource,
-        \Magento\User\Model\Resource\Rules\CollectionFactory $rulesCollectionFactory,
+        \Magento\Authorization\Model\Resource\Rules\CollectionFactory $rulesCollectionFactory,
         \Magento\Framework\Acl\Resource\ProviderInterface $aclResourceProvider,
         \Magento\Webapi\Helper\Data $webapiData,
         \Magento\Integration\Helper\Data $integrationData,
diff --git a/app/code/Magento/Webapi/Controller/Login/Index.php b/app/code/Magento/Webapi/Controller/Login/Index.php
deleted file mode 100644
index feee0d07d5870a5ae93e9538a21b27dcd1ecbbce..0000000000000000000000000000000000000000
--- a/app/code/Magento/Webapi/Controller/Login/Index.php
+++ /dev/null
@@ -1,129 +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\Webapi\Controller\Login;
-
-use Magento\Authz\Model\UserIdentifier;
-use Magento\Customer\Service\V1\CustomerAccountServiceInterface;
-use Magento\Framework\Exception\AuthenticationException;
-use Magento\Webapi\Exception;
-use Magento\Webapi\Exception as HttpException;
-
-class Index extends \Magento\Framework\App\Action\Action
-{
-    /**
-     * @var \Magento\Framework\Session\Generic
-     */
-    protected $session;
-
-    /**
-     * @var CustomerAccountServiceInterface
-     */
-    protected $customerAccountService;
-
-    /**
-     * @var \Magento\Webapi\Controller\Rest\Request\Deserializer\Factory
-     */
-    protected $deserializerFactory;
-
-    /**
-     * Initialize Login Service
-     *
-     * @param \Magento\Framework\App\Action\Context $context
-     * @param \Magento\Framework\Session\Generic $session
-     * @param \Magento\Webapi\Controller\Rest\Request\Deserializer\Factory $deserializerFactory
-     * @param CustomerAccountServiceInterface $customerAccountService
-     */
-    public function __construct(
-        \Magento\Framework\App\Action\Context $context,
-        \Magento\Framework\Session\Generic $session,
-        \Magento\Webapi\Controller\Rest\Request\Deserializer\Factory $deserializerFactory,
-        CustomerAccountServiceInterface $customerAccountService
-    ) {
-        parent::__construct($context);
-        $this->session = $session;
-        $this->deserializerFactory = $deserializerFactory;
-        $this->customerAccountService = $customerAccountService;
-    }
-
-    /**
-     * Login registered users and initiate a session. Send back the session id.
-     *
-     * Expects a POST. ex for JSON  {"username":"user@magento.com", "password":"userpassword"}
-     *
-     * @return void
-     */
-    public function execute()
-    {
-        $contentTypeHeaderValue = $this->getRequest()->getHeader('Content-Type');
-        $contentType = $this->getContentType($contentTypeHeaderValue);
-        $loginData = null;
-        try {
-            $loginData = $this->deserializerFactory
-                ->get($contentType)
-                ->deserialize($this->getRequest()->getRawBody());
-        } catch (Exception $e) {
-            $this->getResponse()->setHttpResponseCode($e->getCode());
-            return;
-        }
-        if (!$loginData || $this->getRequest()->getMethod() !== \Magento\Webapi\Model\Rest\Config::HTTP_METHOD_POST) {
-            $this->getResponse()->setHttpResponseCode(HttpException::HTTP_BAD_REQUEST);
-            return;
-        }
-        $customerData = null;
-        try {
-            $customerData = $this->customerAccountService->authenticate($loginData['username'], $loginData['password']);
-        } catch (AuthenticationException $e) {
-            $this->getResponse()->setHttpResponseCode(HttpException::HTTP_UNAUTHORIZED);
-            return;
-        }
-        $this->session->start('frontend');
-        $this->session->setUserId($customerData->getId());
-        $this->session->setUserType(UserIdentifier::USER_TYPE_CUSTOMER);
-        $this->session->regenerateId(true);
-    }
-
-    /**
-     * Get Content-Type value of request given the $header value.
-     *
-     * TODO: Remove this method if \Magento\Webapi\Controller\Rest\Request can be injected instead of
-     * Magento\Framework\App\Request\Http which is injected by core di.xml
-     *
-     * @param string $headerValue
-     * @return string
-     * @throws \Magento\Webapi\Exception
-     */
-    protected function getContentType($headerValue)
-    {
-        if (!preg_match('~^([a-z\d/\-+.]+)(?:; *charset=(.+))?$~Ui', $headerValue, $matches)) {
-            return null;
-        }
-        // request encoding check if it is specified in header
-        if (isset($matches[2]) && \Magento\Webapi\Controller\Rest\Request::REQUEST_CHARSET != strtolower($matches[2])) {
-            return null;
-        }
-
-        return $matches[1];
-    }
-}
diff --git a/app/code/Magento/Webapi/Controller/Request.php b/app/code/Magento/Webapi/Controller/Request.php
index 033f11f1dc1bc7fbe63dde974ec0663c95efa12f..56e8a01f2c3e6c3c32772ce545e1fbfba987465f 100644
--- a/app/code/Magento/Webapi/Controller/Request.php
+++ b/app/code/Magento/Webapi/Controller/Request.php
@@ -50,25 +50,4 @@ class Request extends \Zend_Controller_Request_Http implements \Magento\Framewor
         /** Remove GET parameters from path */
         $this->_pathInfo = preg_replace('#\?.*#', '', $this->_pathInfo);
     }
-
-    /**
-     * Set consumer ID.
-     *
-     * @param int $consumerId
-     * @return void
-     */
-    public function setConsumerId($consumerId)
-    {
-        $this->_consumerId = $consumerId;
-    }
-
-    /**
-     * Get consumer ID.
-     *
-     * @return int
-     */
-    public function getConsumerId()
-    {
-        return $this->_consumerId;
-    }
 }
diff --git a/app/code/Magento/Webapi/Controller/Rest.php b/app/code/Magento/Webapi/Controller/Rest.php
index 1eee5ed9e7d082ac28abf1a2bfe693f510904e03..72fee8e493148df20b6e07074afb25fc31888f25 100644
--- a/app/code/Magento/Webapi/Controller/Rest.php
+++ b/app/code/Magento/Webapi/Controller/Rest.php
@@ -23,8 +23,8 @@
  */
 namespace Magento\Webapi\Controller;
 
-use Magento\Authz\Model\UserIdentifier;
-use Magento\Authz\Service\AuthorizationV1Interface as AuthorizationService;
+use Magento\Authorization\Model\UserContextInterface;
+use Magento\Framework\AuthorizationInterface;
 use Magento\Framework\Exception\AuthorizationException;
 use Magento\Framework\Service\Data\AbstractObject;
 use Magento\Framework\Service\Data\Eav\AbstractObject as EavAbstractObject;
@@ -33,9 +33,9 @@ use Magento\Webapi\Controller\Rest\Request as RestRequest;
 use Magento\Webapi\Controller\Rest\Response as RestResponse;
 use Magento\Webapi\Controller\Rest\Response\PartialResponseProcessor;
 use Magento\Webapi\Controller\Rest\Router;
+use Magento\Webapi\Controller\Rest\Router\Route;
 use Magento\Webapi\Model\Config\Converter;
 use Magento\Webapi\Model\PathProcessor;
-use Magento\Webapi\Controller\Rest\Router\Route;
 
 /**
  * Front controller for WebAPI REST area.
@@ -68,14 +68,8 @@ class Rest implements \Magento\Framework\App\FrontControllerInterface
     /** @var \Magento\Framework\View\LayoutInterface */
     protected $_layout;
 
-    /** @var \Magento\Framework\Oauth\OauthInterface */
-    protected $_oauthService;
-
-    /** @var  \Magento\Framework\Oauth\Helper\Request */
-    protected $_oauthHelper;
-
-    /** @var AuthorizationService */
-    protected $_authorizationService;
+    /** @var AuthorizationInterface */
+    protected $_authorization;
 
     /** @var ServiceArgsSerializer */
     protected $_serializer;
@@ -101,6 +95,11 @@ class Rest implements \Magento\Framework\App\FrontControllerInterface
      */
     protected $session;
 
+    /**
+     * @var \Magento\Authorization\Model\UserContextInterface
+     */
+    protected $userContext;
+
     /**
      * Initialize dependencies
      *
@@ -110,15 +109,13 @@ class Rest implements \Magento\Framework\App\FrontControllerInterface
      * @param \Magento\Framework\ObjectManager $objectManager
      * @param \Magento\Framework\App\State $appState
      * @param \Magento\Framework\View\LayoutInterface $layout
-     * @param \Magento\Framework\Oauth\OauthInterface $oauthService
-     * @param \Magento\Framework\Oauth\Helper\Request $oauthHelper
-     * @param AuthorizationService $authorizationService
+     * @param AuthorizationInterface $authorization
      * @param ServiceArgsSerializer $serializer
      * @param ErrorProcessor $errorProcessor
      * @param PathProcessor $pathProcessor
      * @param \Magento\Framework\App\AreaList $areaList
      * @param PartialResponseProcessor $partialResponseProcessor
-     * @param \Magento\Framework\Session\Generic $session
+     * @param UserContextInterface $userContext
      *
      * TODO: Consider removal of warning suppression
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
@@ -130,15 +127,13 @@ class Rest implements \Magento\Framework\App\FrontControllerInterface
         \Magento\Framework\ObjectManager $objectManager,
         \Magento\Framework\App\State $appState,
         \Magento\Framework\View\LayoutInterface $layout,
-        \Magento\Framework\Oauth\OauthInterface $oauthService,
-        \Magento\Framework\Oauth\Helper\Request $oauthHelper,
-        AuthorizationService $authorizationService,
+        AuthorizationInterface $authorization,
         ServiceArgsSerializer $serializer,
         ErrorProcessor $errorProcessor,
         PathProcessor $pathProcessor,
         \Magento\Framework\App\AreaList $areaList,
         PartialResponseProcessor $partialResponseProcessor,
-        \Magento\Framework\Session\Generic $session
+        UserContextInterface $userContext
     ) {
         $this->_router = $router;
         $this->_request = $request;
@@ -146,15 +141,13 @@ class Rest implements \Magento\Framework\App\FrontControllerInterface
         $this->_objectManager = $objectManager;
         $this->_appState = $appState;
         $this->_layout = $layout;
-        $this->_oauthService = $oauthService;
-        $this->_oauthHelper = $oauthHelper;
-        $this->_authorizationService = $authorizationService;
+        $this->_authorization = $authorization;
         $this->_serializer = $serializer;
         $this->_errorProcessor = $errorProcessor;
         $this->_pathProcessor = $pathProcessor;
         $this->areaList = $areaList;
         $this->partialResponseProcessor = $partialResponseProcessor;
-        $this->session = $session;
+        $this->userContext = $userContext;
     }
 
     /**
@@ -173,8 +166,8 @@ class Rest implements \Magento\Framework\App\FrontControllerInterface
             if (!$this->_appState->isInstalled()) {
                 throw new \Magento\Webapi\Exception(__('Magento is not yet installed'));
             }
-            $this->_checkPermissions();
-            $route = $this->_getCurrentRoute();
+            $this->checkPermissions();
+            $route = $this->getCurrentRoute();
             if ($route->isSecure() && !$this->_request->isSecure()) {
                 throw new \Magento\Webapi\Exception(__('Operation allowed only in HTTPS'));
             }
@@ -182,12 +175,12 @@ class Rest implements \Magento\Framework\App\FrontControllerInterface
             $inputData = $this->_request->getRequestData();
             $serviceMethodName = $route->getServiceMethod();
             $serviceClassName = $route->getServiceClass();
-            $inputData = $this->_overrideParams($inputData, $route->getParameters());
+            $inputData = $this->overrideParams($inputData, $route->getParameters());
             $inputParams = $this->_serializer->getInputData($serviceClassName, $serviceMethodName, $inputData);
             $service = $this->_objectManager->get($serviceClassName);
             /** @var \Magento\Framework\Service\Data\AbstractObject $outputData */
             $outputData = call_user_func_array([$service, $serviceMethodName], $inputParams);
-            $outputData = $this->_processServiceOutput($outputData);
+            $outputData = $this->processServiceOutput($outputData);
             if ($this->_request->getParam(PartialResponseProcessor::FILTER_PARAMETER) && is_array($outputData)) {
                 $outputData = $this->partialResponseProcessor->filter($outputData);
             }
@@ -211,7 +204,7 @@ class Rest implements \Magento\Framework\App\FrontControllerInterface
      * @param mixed $data
      * @return array|int|string|bool|float Scalar or array of scalars
      */
-    protected function _processServiceOutput($data)
+    protected function processServiceOutput($data)
     {
         if (is_array($data)) {
             $result = [];
@@ -259,13 +252,17 @@ class Rest implements \Magento\Framework\App\FrontControllerInterface
      * @param array $parameters Contains parameters to replace or default
      * @return array Data in same format as $inputData with appropriate parameters added or changed
      */
-    protected function _overrideParams(array $inputData, array $parameters)
+    protected function overrideParams(array $inputData, array $parameters)
     {
         foreach ($parameters as $name => $paramData) {
             if ($paramData[Converter::KEY_FORCE] || !isset($inputData[$name])) {
-                $value = isset($paramData['source']) && $paramData['source'] == 'session'
-                    ? $this->session->{$paramData['method']}()
-                    : $paramData[Converter::KEY_VALUE];
+                if ($paramData[Converter::KEY_VALUE] == '%customer_id%'
+                    && $this->userContext->getUserType() === UserContextInterface::USER_TYPE_CUSTOMER
+                ) {
+                    $value = $this->userContext->getUserId();
+                } else {
+                    $value = $paramData[Converter::KEY_VALUE];
+                }
                 $inputData[$name] = $value;
             }
         }
@@ -277,7 +274,7 @@ class Rest implements \Magento\Framework\App\FrontControllerInterface
      *
      * @return Route
      */
-    protected function _getCurrentRoute()
+    protected function getCurrentRoute()
     {
         if (!$this->_route) {
             $this->_route = $this->_router->match($this->_request);
@@ -288,43 +285,31 @@ class Rest implements \Magento\Framework\App\FrontControllerInterface
     /**
      * Perform authentication and authorization.
      *
-     * Authentication can be based on active customer/guest session or it can be based on OAuth headers.
-     *
      * @throws \Magento\Framework\Exception\AuthorizationException
      * @return void
      */
-    protected function _checkPermissions()
+    protected function checkPermissions()
     {
-        /**
-         * All mobile clients are expected to pass session cookie along with the request which will allow
-         * to start session automatically. User ID and user type are initialized when session is created
-         * during login call.
-         */
-        $userId = $this->session->getUserId();
-        $userType = $this->session->getUserType();
-        $userIdentifier = null;
-        $consumerId = null;
-        if ($userType) {
-            /** @var \Magento\Authz\Model\UserIdentifier $userIdentifier */
-            $userIdentifier = $this->_objectManager->create(
-                'Magento\Authz\Model\UserIdentifier',
-                ['userType' => $userType, 'userId' => $userId]
-            );
-        } else {
-            $oauthRequest = $this->_oauthHelper->prepareRequest($this->_request);
-            $consumerId = $this->_oauthService->validateAccessTokenRequest(
-                $oauthRequest,
-                $this->_oauthHelper->getRequestUrl($this->_request),
-                $this->_request->getMethod()
-            );
-            $this->_request->setConsumerId($consumerId);
-        }
-
-        $route = $this->_getCurrentRoute();
-
-        if (!$this->_authorizationService->isAllowed($route->getAclResources(), $userIdentifier)) {
+        $route = $this->getCurrentRoute();
+        if (!$this->isAllowed($route->getAclResources())) {
             $params = ['resources' => implode(', ', $route->getAclResources())];
             throw new AuthorizationException(AuthorizationException::NOT_AUTHORIZED, $params);
         }
     }
+
+    /**
+     * Check if all ACL resources are allowed to be accessed by current API user.
+     *
+     * @param string[] $aclResources
+     * @return bool
+     */
+    protected function isAllowed($aclResources)
+    {
+        foreach ($aclResources as $resource) {
+            if (!$this->_authorization->isAllowed($resource)) {
+                return false;
+            }
+        }
+        return true;
+    }
 }
diff --git a/app/code/Magento/Webapi/Controller/Soap.php b/app/code/Magento/Webapi/Controller/Soap.php
index 0ec8cb4e5733430a36bd0b6a6cc8e8e19874107e..523e41baa3d6bbbf473ceedc946e80b185aa607f 100644
--- a/app/code/Magento/Webapi/Controller/Soap.php
+++ b/app/code/Magento/Webapi/Controller/Soap.php
@@ -66,11 +66,6 @@ class Soap implements \Magento\Framework\App\FrontControllerInterface
     /** @var \Magento\Framework\View\LayoutInterface */
     protected $_layout;
 
-    /**
-     * @var \Magento\Framework\Oauth\OauthInterface
-     */
-    protected $_oauthService;
-
     /**
      * @var \Magento\Framework\Locale\ResolverInterface
      */
@@ -94,7 +89,6 @@ class Soap implements \Magento\Framework\App\FrontControllerInterface
      * @param ErrorProcessor $errorProcessor
      * @param \Magento\Framework\App\State $appState
      * @param \Magento\Framework\View\LayoutInterface $layout
-     * @param \Magento\Framework\Oauth\OauthInterface $oauthService
      * @param \Magento\Framework\Locale\ResolverInterface $localeResolver
      * @param PathProcessor $pathProcessor
      * @param \Magento\Framework\App\AreaList $areaList
@@ -109,7 +103,6 @@ class Soap implements \Magento\Framework\App\FrontControllerInterface
         ErrorProcessor $errorProcessor,
         \Magento\Framework\App\State $appState,
         \Magento\Framework\View\LayoutInterface $layout,
-        \Magento\Framework\Oauth\OauthInterface $oauthService,
         \Magento\Framework\Locale\ResolverInterface $localeResolver,
         PathProcessor $pathProcessor,
         \Magento\Framework\App\AreaList $areaList
@@ -120,7 +113,6 @@ class Soap implements \Magento\Framework\App\FrontControllerInterface
         $this->_soapServer = $soapServer;
         $this->_errorProcessor = $errorProcessor;
         $this->_appState = $appState;
-        $this->_oauthService = $oauthService;
         $this->_localeResolver = $localeResolver;
         $this->_layout = $layout;
         $this->_pathProcessor = $pathProcessor;
@@ -151,8 +143,6 @@ class Soap implements \Magento\Framework\App\FrontControllerInterface
                 $this->_setResponseContentType(self::CONTENT_TYPE_WSDL_REQUEST);
                 $this->_setResponseBody($responseBody);
             } else {
-                $consumerId = $this->_oauthService->validateAccessToken($this->_getAccessToken());
-                $this->_request->setConsumerId($consumerId);
                 $this->_soapServer->handle();
             }
         } catch (\Exception $e) {
diff --git a/app/code/Magento/Webapi/Controller/Soap/Request/Handler.php b/app/code/Magento/Webapi/Controller/Soap/Request/Handler.php
index 2d35e2a49437ef6e68c7a2270cba2bd667217727..7008052b37b2080d0842aa9112e0a6d2744642d4 100644
--- a/app/code/Magento/Webapi/Controller/Soap/Request/Handler.php
+++ b/app/code/Magento/Webapi/Controller/Soap/Request/Handler.php
@@ -23,7 +23,7 @@
  */
 namespace Magento\Webapi\Controller\Soap\Request;
 
-use Magento\Authz\Service\AuthorizationV1Interface as AuthorizationService;
+use Magento\Framework\AuthorizationInterface;
 use Magento\Framework\Exception\AuthorizationException;
 use Magento\Framework\Service\Data\AbstractObject;
 use Magento\Framework\Service\DataObjectConverter;
@@ -52,8 +52,8 @@ class Handler
     /** @var SoapConfig */
     protected $_apiConfig;
 
-    /** @var AuthorizationService */
-    protected $_authorizationService;
+    /** @var AuthorizationInterface */
+    protected $_authorization;
 
     /** @var DataObjectConverter */
     protected $_dataObjectConverter;
@@ -67,7 +67,7 @@ class Handler
      * @param SoapRequest $request
      * @param \Magento\Framework\ObjectManager $objectManager
      * @param SoapConfig $apiConfig
-     * @param AuthorizationService $authorizationService
+     * @param AuthorizationInterface $authorization
      * @param DataObjectConverter $dataObjectConverter
      * @param ServiceArgsSerializer $serializer
      */
@@ -75,14 +75,14 @@ class Handler
         SoapRequest $request,
         \Magento\Framework\ObjectManager $objectManager,
         SoapConfig $apiConfig,
-        AuthorizationService $authorizationService,
+        AuthorizationInterface $authorization,
         DataObjectConverter $dataObjectConverter,
         ServiceArgsSerializer $serializer
     ) {
         $this->_request = $request;
         $this->_objectManager = $objectManager;
         $this->_apiConfig = $apiConfig;
-        $this->_authorizationService = $authorizationService;
+        $this->_authorization = $authorization;
         $this->_dataObjectConverter = $dataObjectConverter;
         $this->_serializer = $serializer;
     }
@@ -110,8 +110,8 @@ class Handler
         }
 
         $isAllowed = false;
-        foreach ($serviceMethodInfo[SoapConfig::KEY_ACL_RESOURCES] as $resources) {
-            if ($this->_authorizationService->isAllowed($resources)) {
+        foreach ($serviceMethodInfo[SoapConfig::KEY_ACL_RESOURCES] as $resource) {
+            if ($this->_authorization->isAllowed($resource)) {
                 $isAllowed = true;
                 break;
             }
diff --git a/app/code/Magento/Authz/Model/UserLocator/Guest.php b/app/code/Magento/Webapi/Model/Authorization/GuestUserContext.php
similarity index 82%
rename from app/code/Magento/Authz/Model/UserLocator/Guest.php
rename to app/code/Magento/Webapi/Model/Authorization/GuestUserContext.php
index ad93686134c78b178acfee3d2d0ba09b0d1619d9..392a77d7090f84b4117577761f2351f61f1fee18 100644
--- a/app/code/Magento/Authz/Model/UserLocator/Guest.php
+++ b/app/code/Magento/Webapi/Model/Authorization/GuestUserContext.php
@@ -21,15 +21,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\Authz\Model\UserLocator;
 
-use Magento\Authz\Model\UserIdentifier;
-use Magento\Authz\Model\UserLocatorInterface;
+namespace Magento\Webapi\Model\Authorization;
+
+use Magento\Authorization\Model\UserContextInterface;
 
 /**
- * Guest user locator.
+ * Guest user context
  */
-class Guest implements UserLocatorInterface
+class GuestUserContext implements UserContextInterface
 {
     /**
      * {@inheritdoc}
@@ -44,6 +44,6 @@ class Guest implements UserLocatorInterface
      */
     public function getUserType()
     {
-        return UserIdentifier::USER_TYPE_GUEST;
+        return UserContextInterface::USER_TYPE_GUEST;
     }
 }
diff --git a/app/code/Magento/Webapi/Model/Authorization/OauthUserContext.php b/app/code/Magento/Webapi/Model/Authorization/OauthUserContext.php
new file mode 100644
index 0000000000000000000000000000000000000000..b16bc5257a64ecea08dfbf363e192626244fde35
--- /dev/null
+++ b/app/code/Magento/Webapi/Model/Authorization/OauthUserContext.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\Webapi\Model\Authorization;
+
+use Magento\Authorization\Model\UserContextInterface;
+use Magento\Integration\Service\V1\Integration as IntegrationService;
+use Magento\Webapi\Controller\Request;
+use Magento\Framework\Oauth\Helper\Request as OauthRequestHelper;
+use Magento\Framework\Oauth\OauthInterface as OauthService;
+
+/**
+ * A user context determined by OAuth headers in a HTTP request.
+ */
+class OauthUserContext implements UserContextInterface
+{
+    /**
+     * @var Request
+     */
+    protected $request;
+
+    /**
+     * @var IntegrationService
+     */
+    protected $integrationService;
+
+    /**
+     * @var OauthService
+     */
+    protected $oauthService;
+
+    /**
+     * @var  OauthRequestHelper
+     */
+    protected $oauthHelper;
+
+    /**
+     * @var int
+     */
+    protected $integrationId;
+
+    /**
+     * Initialize dependencies.
+     *
+     * @param Request $request
+     * @param IntegrationService $integrationService
+     * @param OauthService $oauthService
+     * @param OauthRequestHelper $oauthHelper
+     */
+    public function __construct(
+        Request $request,
+        IntegrationService $integrationService,
+        OauthService $oauthService,
+        OauthRequestHelper $oauthHelper
+    ) {
+        $this->request = $request;
+        $this->integrationService = $integrationService;
+        $this->oauthService = $oauthService;
+        $this->oauthHelper = $oauthHelper;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getUserId()
+    {
+        if ($this->integrationId) {
+            return $this->integrationId;
+        }
+        $oauthRequest = $this->oauthHelper->prepareRequest($this->request);
+        //If its not a valid Oauth request no further processing is needed
+        if (empty($oauthRequest)) {
+            return null;
+        }
+        $consumerId = $this->oauthService->validateAccessTokenRequest(
+            $oauthRequest,
+            $this->oauthHelper->getRequestUrl($this->request),
+            $this->request->getMethod()
+        );
+        $integration = $this->integrationService->findActiveIntegrationByConsumerId($consumerId);
+        return $this->integrationId = ($integration->getId() ? (int)$integration->getId() : null);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getUserType()
+    {
+        return UserContextInterface::USER_TYPE_INTEGRATION;
+    }
+}
diff --git a/app/code/Magento/Webapi/Model/Authorization/TokenUserContext.php b/app/code/Magento/Webapi/Model/Authorization/TokenUserContext.php
new file mode 100644
index 0000000000000000000000000000000000000000..8d3b60ac1503adf2d1739e7d682a7745b07e199c
--- /dev/null
+++ b/app/code/Magento/Webapi/Model/Authorization/TokenUserContext.php
@@ -0,0 +1,169 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Webapi\Model\Authorization;
+
+use Magento\Authorization\Model\UserContextInterface;
+use Magento\Integration\Model\Oauth\Token;
+use Magento\Integration\Model\Oauth\TokenFactory;
+use Magento\Integration\Service\V1\Integration as IntegrationService;
+use Magento\Webapi\Controller\Request;
+
+/**
+ * A user context determined by tokens in a HTTP request Authorization header.
+ */
+class TokenUserContext implements UserContextInterface
+{
+    /**
+     * @var Request
+     */
+    protected $request;
+
+    /**
+     * @var Token
+     */
+    protected $tokenFactory;
+
+    /**
+     * @var int
+     */
+    protected $userId;
+
+    /**
+     * @var string
+     */
+    protected $userType;
+
+    /**
+     * @var bool
+     */
+    protected $isRequestProcessed;
+
+    /**
+     * @var IntegrationService
+     */
+    protected $integrationService;
+
+    /**
+     * Initialize dependencies.
+     *
+     * @param Request $request
+     * @param TokenFactory $tokenFactory
+     * @param IntegrationService $integrationService
+     */
+    public function __construct(
+        Request $request,
+        TokenFactory $tokenFactory,
+        IntegrationService $integrationService
+    ) {
+        $this->request = $request;
+        $this->tokenFactory = $tokenFactory;
+        $this->integrationService = $integrationService;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getUserId()
+    {
+        $this->processRequest();
+        return $this->userId;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getUserType()
+    {
+        $this->processRequest();
+        return $this->userType;
+    }
+
+    /**
+     * Finds the bearer token and looks up the value.
+     *
+     * @return void
+     */
+    protected function processRequest()
+    {
+        if ($this->isRequestProcessed) {
+            return;
+        }
+
+        $authorizationHeaderValue = $this->request->getHeader('Authorization');
+        if (!$authorizationHeaderValue) {
+            $this->isRequestProcessed = true;
+            return;
+        }
+
+        $headerPieces = explode(" ", $authorizationHeaderValue);
+        if (count($headerPieces) !== 2) {
+            $this->isRequestProcessed = true;
+            return;
+        }
+
+        $tokenType = strtolower($headerPieces[0]);
+        if ($tokenType !== 'bearer') {
+            $this->isRequestProcessed = true;
+            return;
+        }
+
+        $bearerToken = $headerPieces[1];
+        $token = $this->tokenFactory->create()->loadByToken($bearerToken);
+
+        if (!$token->getId()) {
+            $this->isRequestProcessed = true;
+            return;
+        }
+
+        $this->setUserDataViaToken($token);
+        $this->isRequestProcessed = true;
+    }
+
+    /**
+     * @param Token $token
+     * @return void
+     */
+    protected function setUserDataViaToken(Token $token)
+    {
+        $this->userType = $token->getUserType();
+        switch ($this->userType) {
+            case UserContextInterface::USER_TYPE_INTEGRATION:
+                $this->userId = $this->integrationService->findByConsumerId($token->getConsumerId())->getId();
+                $this->userType = UserContextInterface::USER_TYPE_INTEGRATION;
+                break;
+            case UserContextInterface::USER_TYPE_ADMIN:
+                $this->userId = $token->getAdminId();
+                $this->userType = UserContextInterface::USER_TYPE_ADMIN;
+                break;
+            case UserContextInterface::USER_TYPE_CUSTOMER:
+                $this->userId = $token->getCustomerId();
+                $this->userType = UserContextInterface::USER_TYPE_CUSTOMER;
+                break;
+            default:
+                /* this is an unknown user type so reset the cached user type */
+                $this->userType = null;
+        }
+    }
+}
diff --git a/app/code/Magento/Webapi/Model/Authz/UserLocator.php b/app/code/Magento/Webapi/Model/Authz/UserLocator.php
deleted file mode 100644
index ff564b5fde9db729c8b0240ed9a86ed21fd49127..0000000000000000000000000000000000000000
--- a/app/code/Magento/Webapi/Model/Authz/UserLocator.php
+++ /dev/null
@@ -1,71 +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\Webapi\Model\Authz;
-
-use Magento\Authz\Model\UserLocatorInterface;
-use Magento\Authz\Model\UserIdentifier;
-use Magento\Webapi\Controller\Request;
-use Magento\Integration\Model\Integration\Factory as IntegrationFactory;
-
-/**
- * Web API user locator.
- */
-class UserLocator implements UserLocatorInterface
-{
-    /** @var Request */
-    protected $_request;
-
-    /** @var IntegrationFactory */
-    protected $_integrationFactory;
-
-    /**
-     * Initialize dependencies.
-     *
-     * @param Request $request
-     * @param IntegrationFactory $integrationFactory
-     */
-    public function __construct(Request $request, IntegrationFactory $integrationFactory)
-    {
-        $this->_request = $request;
-        $this->_integrationFactory = $integrationFactory;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function getUserId()
-    {
-        $consumerId = $this->_request->getConsumerId();
-        $integration = $this->_integrationFactory->create()->loadByConsumerId($consumerId);
-        return $integration->getId() ? (int)$integration->getId() : 0;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function getUserType()
-    {
-        return UserIdentifier::USER_TYPE_INTEGRATION;
-    }
-}
diff --git a/app/code/Magento/Webapi/Model/Plugin/AuthorizationServiceV1.php b/app/code/Magento/Webapi/Model/Plugin/AuthorizationServiceV1.php
deleted file mode 100644
index 4ec91252cfc915324c90de2f1ef86197dae0f90a..0000000000000000000000000000000000000000
--- a/app/code/Magento/Webapi/Model/Plugin/AuthorizationServiceV1.php
+++ /dev/null
@@ -1,100 +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\Webapi\Model\Plugin;
-
-use Magento\Authz\Model\UserIdentifier;
-use Magento\Integration\Service\V1\Integration as IntegrationService;
-use Magento\Integration\Model\Integration;
-use Magento\Framework\Logger;
-
-/**
- * Wrap isAllowed() method from AuthorizationV1 service to avoid checking roles of deactivated integration.
- */
-class AuthorizationServiceV1
-{
-    /** @var IntegrationService */
-    protected $_integrationService;
-
-    /** @var Logger */
-    protected $_logger;
-
-    /** @var UserIdentifier */
-    protected $_userIdentifier;
-
-    /**
-     * Inject dependencies.
-     *
-     * @param IntegrationService $integrationService
-     * @param Logger             $logger
-     * @param UserIdentifier     $userIdentifier
-     */
-    public function __construct(IntegrationService $integrationService, Logger $logger, UserIdentifier $userIdentifier)
-    {
-        $this->_integrationService = $integrationService;
-        $this->_logger = $logger;
-        $this->_userIdentifier = $userIdentifier;
-    }
-
-    /**
-     * Check whether integration is inactive and don't allow using this integration in this case.
-     *
-     * It's ok that we break invocation chain since we're dealing with ACL here - if something is not allowed at any
-     * point it couldn't be made allowed at some other point.
-     *
-     * @param \Magento\Authz\Service\AuthorizationV1 $subject
-     * @param callable $proceed
-     * @param mixed $resources
-     * @param UserIdentifier $userIdentifier
-     *
-     * @return bool
-     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
-     */
-    public function aroundIsAllowed(
-        \Magento\Authz\Service\AuthorizationV1 $subject,
-        \Closure $proceed,
-        $resources,
-        \Magento\Authz\Model\UserIdentifier $userIdentifier = null
-    ) {
-        /** @var UserIdentifier $userIdentifierObject */
-        $userIdentifierObject = $userIdentifier ?: $this->_userIdentifier;
-
-        if ($userIdentifierObject->getUserType() !== UserIdentifier::USER_TYPE_INTEGRATION) {
-            return $proceed($resources, $userIdentifier);
-        }
-
-        try {
-            $integration = $this->_integrationService->get($userIdentifierObject->getUserId());
-        } catch (\Exception $e) {
-            // Wrong integration ID or DB not reachable or whatever - give up and don't allow just in case
-            $this->_logger->logException($e);
-            return false;
-        }
-
-        if ($integration->getStatus() !== Integration::STATUS_ACTIVE) {
-            return false;
-        }
-
-        return $proceed($resources, $userIdentifier);
-    }
-}
diff --git a/app/code/Magento/Webapi/Model/Plugin/GuestAuthorization.php b/app/code/Magento/Webapi/Model/Plugin/GuestAuthorization.php
new file mode 100644
index 0000000000000000000000000000000000000000..9a317952473eaae2bb6b6c5f5248a348fee5e8f5
--- /dev/null
+++ b/app/code/Magento/Webapi/Model/Plugin/GuestAuthorization.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\Webapi\Model\Plugin;
+
+use Magento\Integration\Service\V1\AuthorizationServiceInterface as AuthorizationService;
+
+/**
+ * Plugin around \Magento\Framework\Authorization::isAllowed
+ *
+ * Plugin to allow guest users to access resources with anonymous permission
+ */
+class GuestAuthorization
+{
+    /**
+     * Check if resource for which access is needed has anonymous permissions defined in webapi config.
+     *
+     * @param \Magento\Framework\Authorization $subject
+     * @param callable $proceed
+     * @param string $resource
+     * @param string $privilege
+     * @return bool true If resource permission is anonymous,
+     * to allow any user access without further checks in parent method
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+     */
+    public function aroundIsAllowed(
+        \Magento\Framework\Authorization $subject,
+        \Closure $proceed,
+        $resource,
+        $privilege = null
+    ) {
+        if ($resource == AuthorizationService::PERMISSION_ANONYMOUS) {
+            return true;
+        } else {
+            return $proceed($resource, $privilege);
+        }
+    }
+}
diff --git a/app/code/Magento/Webapi/Model/Plugin/IntegrationServiceV1.php b/app/code/Magento/Webapi/Model/Plugin/Service/V1/Integration.php
similarity index 67%
rename from app/code/Magento/Webapi/Model/Plugin/IntegrationServiceV1.php
rename to app/code/Magento/Webapi/Model/Plugin/Service/V1/Integration.php
index 45b2de646e8a00dc595ca171fbd61b06370ab247..ffc78385343707dea340488eec613642ffb7e33a 100644
--- a/app/code/Magento/Webapi/Model/Plugin/IntegrationServiceV1.php
+++ b/app/code/Magento/Webapi/Model/Plugin/Service/V1/Integration.php
@@ -21,34 +21,37 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-namespace Magento\Webapi\Model\Plugin;
 
-use Magento\Authz\Model\UserIdentifier;
-use Magento\Authz\Model\UserIdentifier\Factory as UserIdentifierFactory;
+namespace Magento\Webapi\Model\Plugin\Service\V1;
+
+use Magento\Authorization\Model\Acl\AclRetriever;
+use Magento\Authorization\Model\UserContextInterface;
 use Magento\Integration\Model\Integration as IntegrationModel;
-use Magento\Authz\Service\AuthorizationV1Interface as AuthorizationInterface;
+use Magento\Integration\Service\V1\AuthorizationServiceInterface as IntegrationAuthorizationInterface;
 
 /**
  * Plugin for \Magento\Integration\Service\V1\Integration.
  */
-class IntegrationServiceV1
+class Integration
 {
-    /** @var AuthorizationInterface */
-    protected $_authzService;
+    /** @var IntegrationAuthorizationInterface */
+    protected $integrationAuthorizationService;
 
-    /** @var UserIdentifierFactory */
-    protected $_userIdentifierFactory;
+    /** @var  AclRetriever */
+    protected $aclRetriever;
 
     /**
      * Initialize dependencies.
      *
-     * @param AuthorizationInterface $authzService
-     * @param UserIdentifierFactory $userIdentifierFactory
+     * @param IntegrationAuthorizationInterface $integrationAuthorizationService
+     * @param AclRetriever $aclRetriever
      */
-    public function __construct(AuthorizationInterface $authzService, UserIdentifierFactory $userIdentifierFactory)
-    {
-        $this->_authzService = $authzService;
-        $this->_userIdentifierFactory = $userIdentifierFactory;
+    public function __construct(
+        IntegrationAuthorizationInterface $integrationAuthorizationService,
+        AclRetriever $aclRetriever
+    ) {
+        $this->integrationAuthorizationService = $integrationAuthorizationService;
+        $this->aclRetriever  = $aclRetriever;
     }
 
     /**
@@ -105,8 +108,13 @@ class IntegrationServiceV1
     protected function _addAllowedResources(IntegrationModel $integration)
     {
         if ($integration->getId()) {
-            $userIdentifier = $this->_createUserIdentifier($integration->getId());
-            $integration->setData('resource', $this->_authzService->getAllowedResources($userIdentifier));
+            $integration->setData(
+                'resource',
+                $this->aclRetriever->getAllowedResourcesByUser(
+                    UserContextInterface::USER_TYPE_INTEGRATION,
+                    (int)$integration->getId()
+                )
+            );
         }
     }
 
@@ -122,32 +130,17 @@ class IntegrationServiceV1
     protected function _saveApiPermissions(IntegrationModel $integration)
     {
         if ($integration->getId()) {
-            $userIdentifier = $this->_createUserIdentifier($integration->getId());
             if ($integration->getData('all_resources')) {
-                $this->_authzService->grantAllPermissions($userIdentifier);
+                $this->integrationAuthorizationService->grantAllPermissions($integration->getId());
             } else if (is_array($integration->getData('resource'))) {
-                $this->_authzService->grantPermissions($userIdentifier, $integration->getData('resource'));
+                $this->integrationAuthorizationService
+                    ->grantPermissions($integration->getId(), $integration->getData('resource'));
             } else {
-                $this->_authzService->grantPermissions($userIdentifier, array());
+                $this->integrationAuthorizationService->grantPermissions($integration->getId(), array());
             }
         }
     }
 
-    /**
-     * Instantiate new user identifier for an integration.
-     *
-     * @param int $integrationId
-     * @return UserIdentifier
-     */
-    protected function _createUserIdentifier($integrationId)
-    {
-        $userIdentifier = $this->_userIdentifierFactory->create(
-            UserIdentifier::USER_TYPE_INTEGRATION,
-            (int)$integrationId
-        );
-        return $userIdentifier;
-    }
-
     /**
      * Process integration resource permissions after the integration is created
      *
@@ -160,11 +153,8 @@ class IntegrationServiceV1
     public function afterDelete(\Magento\Integration\Service\V1\Integration $subject, array $integrationData)
     {
         //No check needed for integration data since it cannot be empty in the parent invocation - delete
-        $userIdentifier = $this->_userIdentifierFactory->create(
-            UserIdentifier::USER_TYPE_INTEGRATION,
-            (int)$integrationData[IntegrationModel::ID]
-        );
-        $this->_authzService->removePermissions($userIdentifier);
+        $integrationId = (int)$integrationData[IntegrationModel::ID];
+        $this->integrationAuthorizationService->removePermissions($integrationId);
         return $integrationData;
     }
 }
diff --git a/app/code/Magento/Webapi/Model/Plugin/Setup.php b/app/code/Magento/Webapi/Model/Plugin/Setup.php
index aa7ce3381852f37b858f5559d31ad089a49907f8..f5011eae30d3607399f12d85291dfde13b65df02 100644
--- a/app/code/Magento/Webapi/Model/Plugin/Setup.php
+++ b/app/code/Magento/Webapi/Model/Plugin/Setup.php
@@ -23,9 +23,9 @@
  */
 namespace Magento\Webapi\Model\Plugin;
 
-use Magento\Authz\Model\UserIdentifier;
 use Magento\Integration\Model\Integration;
 use Magento\Webapi\Model\IntegrationConfig;
+use Magento\Integration\Service\V1\AuthorizationServiceInterface as IntegrationAuthorizationInterface;
 
 /**
  * Plugin for Magento\Framework\Module\Setup model to manage resource permissions of
@@ -48,37 +48,25 @@ class Setup
     protected $_integrationService;
 
     /**
-     * Authorization service
-     *
-     * @var \Magento\Authz\Service\AuthorizationV1
-     */
-    protected $_authzService;
-
-    /**
-     * Factory to create UserIdentifier
-     *
-     * @var \Magento\Authz\Model\UserIdentifier\Factory
+     * @var IntegrationAuthorizationInterface
      */
-    protected $_userIdentifierFactory;
+    protected $integrationAuthorizationService;
 
     /**
      * Construct Setup plugin instance
      *
      * @param IntegrationConfig $integrationConfig
-     * @param \Magento\Authz\Service\AuthorizationV1 $authzService
+     * @param IntegrationAuthorizationInterface $integrationAuthorizationService
      * @param \Magento\Integration\Service\V1\IntegrationInterface $integrationService
-     * @param \Magento\Authz\Model\UserIdentifier\Factory $userIdentifierFactory
      */
     public function __construct(
         IntegrationConfig $integrationConfig,
-        \Magento\Authz\Service\AuthorizationV1 $authzService,
-        \Magento\Integration\Service\V1\IntegrationInterface $integrationService,
-        \Magento\Authz\Model\UserIdentifier\Factory $userIdentifierFactory
+        IntegrationAuthorizationInterface $integrationAuthorizationService,
+        \Magento\Integration\Service\V1\IntegrationInterface $integrationService
     ) {
         $this->_integrationConfig = $integrationConfig;
-        $this->_authzService = $authzService;
+        $this->integrationAuthorizationService = $integrationAuthorizationService;
         $this->_integrationService = $integrationService;
-        $this->_userIdentifierFactory = $userIdentifierFactory;
     }
 
     /**
@@ -103,11 +91,10 @@ class Setup
             if (isset($integrations[$name])) {
                 $integration = $this->_integrationService->findByName($name);
                 if ($integration->getId()) {
-                    $userIdentifier = $this->_userIdentifierFactory->create(
-                        UserIdentifier::USER_TYPE_INTEGRATION,
-                        $integration->getId()
+                    $this->integrationAuthorizationService->grantPermissions(
+                        $integration->getId(),
+                        $integrations[$name]['resources']
                     );
-                    $this->_authzService->grantPermissions($userIdentifier, $integrations[$name]['resources']);
                 }
             }
         }
diff --git a/app/code/Magento/Webapi/Model/WebapiRoleLocator.php b/app/code/Magento/Webapi/Model/WebapiRoleLocator.php
new file mode 100644
index 0000000000000000000000000000000000000000..7aa122d2a03d95c3a72ef50428a92cffb272dc45
--- /dev/null
+++ b/app/code/Magento/Webapi/Model/WebapiRoleLocator.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\Webapi\Model;
+
+use Magento\Authorization\Model\UserContextInterface;
+use Magento\Framework\Authorization\RoleLocator;
+use Magento\Authorization\Model\Role;
+use Magento\Authorization\Model\Resource\Role\CollectionFactory as RoleCollectionFactory;
+
+class WebapiRoleLocator implements RoleLocator
+{
+    /**
+     * @var UserContextInterface
+     */
+    protected $userContext;
+
+    /**
+     * @var RoleCollectionFactory
+     */
+    protected $roleCollectionFactory;
+
+    /**
+     * Constructs a role locator using the user context.
+     *
+     * @param UserContextInterface $userContext
+     * @param RoleCollectionFactory $roleCollectionFactory
+     */
+    public function __construct(
+        UserContextInterface $userContext,
+        RoleCollectionFactory $roleCollectionFactory
+    ) {
+        $this->userContext = $userContext;
+        $this->roleCollectionFactory = $roleCollectionFactory;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAclRoleId()
+    {
+        $userId = $this->userContext->getUserId();
+        $userType = $this->userContext->getUserType();
+
+        $roleCollection = $this->roleCollectionFactory->create();
+        /** @var Role $role */
+        $role = $roleCollection->setUserFilter($userId, $userType)->getFirstItem();
+
+        if (!$role->getId()) {
+            return null;
+        }
+
+        return $role->getId();
+    }
+}
diff --git a/app/code/Magento/Webapi/composer.json b/app/code/Magento/Webapi/composer.json
index 8d931626342448fc65d503cc894fb4193678c884..266cfd75b83bbf04ed2db0fd1cd650b82f77f107 100644
--- a/app/code/Magento/Webapi/composer.json
+++ b/app/code/Magento/Webapi/composer.json
@@ -2,19 +2,18 @@
     "name": "magento/module-webapi",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-integration": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-user": "0.1.0-alpha89",
-        "magento/module-authz": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-authorization": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-integration": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-user": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Webapi/etc/di.xml b/app/code/Magento/Webapi/etc/di.xml
index d62d987b602dcc453c8ed37c72b949dde0dd5110..6f433e197564dc1128f116919f8eef5cd9691b22 100644
--- a/app/code/Magento/Webapi/etc/di.xml
+++ b/app/code/Magento/Webapi/etc/di.xml
@@ -41,7 +41,7 @@
     <type name="Magento\Framework\Code\Scanner\DirectoryScanner" shared="false" />
     <type name="Magento\Server\Reflection" shared="false" />
     <type name="Magento\Integration\Service\V1\Integration">
-        <plugin name="webapiIntegrationServiceV1" type="Magento\Webapi\Model\Plugin\IntegrationServiceV1"/>
+        <plugin name="webapiIntegrationServiceV1" type="Magento\Webapi\Model\Plugin\Service\V1\Integration"/>
     </type>
     <type name="Magento\Webapi\Controller\Rest\Request\Deserializer\Factory">
         <arguments>
diff --git a/app/code/Magento/Webapi/etc/module.xml b/app/code/Magento/Webapi/etc/module.xml
index 45b9ec4ab398759e6425ede9babefadc2c307ee8..7174a4322d27ca745cdc2828c8839af99af79a57 100644
--- a/app/code/Magento/Webapi/etc/module.xml
+++ b/app/code/Magento/Webapi/etc/module.xml
@@ -33,12 +33,11 @@
         </sequence>
         <depends>
             <module name="Magento_Store"/>
+            <module name="Magento_Authorization"/>
             <module name="Magento_Core"/>
             <module name="Magento_Integration"/>
             <module name="Magento_Backend"/>
-            <module name="Magento_User"/>
-            <module name="Magento_Authz"/>
-            <module name="Magento_Customer"/>
+            <module name="Magento_User" type="soft"/>
         </depends>
     </module>
 </config>
diff --git a/app/code/Magento/Webapi/etc/webapi.xsd b/app/code/Magento/Webapi/etc/webapi.xsd
index 9770ae30c07e264fd65dfa003feaef3352d1efd6..f95c1e4d946910baa2f5ddcc34ca170a9ee66846 100644
--- a/app/code/Magento/Webapi/etc/webapi.xsd
+++ b/app/code/Magento/Webapi/etc/webapi.xsd
@@ -86,8 +86,6 @@
             <xs:extension base="xs:string">
                 <xs:attribute name="name" type="xs:string" use="required"/>
                 <xs:attribute name="force" type="xs:boolean"/>
-                <xs:attribute name="source" type="xs:string"/>
-                <xs:attribute name="method" type="xs:string"/>
             </xs:extension>
         </xs:simpleContent>
     </xs:complexType>
diff --git a/app/code/Magento/Webapi/etc/webapi_rest/di.xml b/app/code/Magento/Webapi/etc/webapi_rest/di.xml
index 82dbff2c61a23ee534c1f155a820b50c5bfd8836..531736c376f9851287aa5310a6db3c6debd2843e 100644
--- a/app/code/Magento/Webapi/etc/webapi_rest/di.xml
+++ b/app/code/Magento/Webapi/etc/webapi_rest/di.xml
@@ -24,12 +24,35 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
-    <preference for="Magento\Authz\Model\UserLocatorInterface" type="Magento\Webapi\Model\Authz\UserLocator"/>
-    <type name="Magento\Webapi\Model\Authz\UserLocator">
+    <preference for="Magento\Authorization\Model\UserContextInterface" type="Magento\Authorization\Model\CompositeUserContext"/>
+    <type name="Magento\Webapi\Model\Authorization\OauthUserContext">
         <arguments>
             <argument name="request" xsi:type="object">Magento\Webapi\Controller\Rest\Request</argument>
         </arguments>
     </type>
+    <type name="Magento\Framework\Session\Generic">
+        <arguments>
+            <argument name="sessionName" xsi:type="string">frontend</argument>
+        </arguments>
+    </type>
+    <type name="Magento\Authorization\Model\CompositeUserContext">
+        <arguments>
+            <argument name="userContexts" xsi:type="array">
+                <item name="tokenUserContext" xsi:type="array">
+                    <item name="type" xsi:type="object">Magento\Webapi\Model\Authorization\TokenUserContext</item>
+                    <item name="sortOrder" xsi:type="string">10</item>
+                </item>
+                <item name="oauthUserContext" xsi:type="array">
+                    <item name="type" xsi:type="object">Magento\Webapi\Model\Authorization\OauthUserContext</item>
+                    <item name="sortOrder" xsi:type="string">40</item>
+                </item>
+                <item name="guestUserContext" xsi:type="array">
+                    <item name="type" xsi:type="object">Magento\Webapi\Model\Authorization\GuestUserContext</item>
+                    <item name="sortOrder" xsi:type="string">100</item>
+                </item>
+            </argument>
+        </arguments>
+    </type>
     <preference for="Magento\Framework\App\FrontControllerInterface" type="Magento\Webapi\Controller\Rest" />
     <preference for="Magento\Framework\Model\ActionValidator\RemoveAction" type="Magento\Framework\Model\ActionValidator\RemoveAction\Allowed" />
     <type name="Magento\Webapi\Controller\Rest\Router\Route" shared="false" />
@@ -65,15 +88,10 @@
             <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\Framework\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" />
-    </type>
-    <type name="Magento\Framework\Session\Generic">
-        <arguments>
-            <argument name="sessionName" xsi:type="string">frontend</argument>
-        </arguments>
+    <preference for="Magento\Framework\Authorization\RoleLocator" type="Magento\Webapi\Model\WebapiRoleLocator" />
+    <type name="Magento\Framework\Authorization">
+        <plugin name="guestAuthorization" type="Magento\Webapi\Model\Plugin\GuestAuthorization" />
     </type>
 </config>
diff --git a/app/code/Magento/Webapi/etc/webapi_soap/di.xml b/app/code/Magento/Webapi/etc/webapi_soap/di.xml
index 1c8ce71112253995987b8cfd862ff999b84083d2..55ab39e818c44197abdd88a6c680f98da2b88b81 100644
--- a/app/code/Magento/Webapi/etc/webapi_soap/di.xml
+++ b/app/code/Magento/Webapi/etc/webapi_soap/di.xml
@@ -24,12 +24,26 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
-    <preference for="Magento\Authz\Model\UserLocatorInterface" type="Magento\Webapi\Model\Authz\UserLocator"/>
-    <type name="Magento\Webapi\Model\Authz\UserLocator">
+    <preference for="Magento\Authorization\Model\UserContextInterface" type="Magento\Authorization\Model\CompositeUserContext"/>
+    <type name="Magento\Webapi\Model\Authorization\OauthUserContext">
         <arguments>
             <argument name="request" xsi:type="object">Magento\Webapi\Controller\Soap\Request</argument>
         </arguments>
     </type>
+    <type name="Magento\Authorization\Model\CompositeUserContext">
+        <arguments>
+            <argument name="userContexts" xsi:type="array">
+                <item name="tokenUserContext" xsi:type="array">
+                    <item name="type" xsi:type="object">Magento\Webapi\Model\Authorization\TokenUserContext</item>
+                    <item name="sortOrder" xsi:type="string">10</item>
+                </item>
+                <item name="guestUserContext" xsi:type="array">
+                    <item name="type" xsi:type="object">Magento\Webapi\Model\Authorization\GuestUserContext</item>
+                    <item name="sortOrder" xsi:type="string">100</item>
+                </item>
+            </argument>
+        </arguments>
+    </type>
     <preference for="Magento\Framework\App\FrontControllerInterface" type="Magento\Webapi\Controller\Soap" />
     <preference for="Magento\Framework\Model\ActionValidator\RemoveAction" type="Magento\Framework\Model\ActionValidator\RemoveAction\Allowed" />
     <type name="Magento\Webapi\Controller\Rest\Router\Route" shared="false" />
@@ -39,12 +53,8 @@
             <argument name="errorProcessor" xsi:type="object">Magento\Webapi\Controller\ErrorProcessor\Proxy</argument>
         </arguments>
     </type>
-    <type name="Magento\Webapi\Controller\Soap\Request\Handler">
-        <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" />
+    <preference for="Magento\Framework\Authorization\RoleLocator" type="Magento\Webapi\Model\WebapiRoleLocator" />
+    <type name="Magento\Framework\Authorization">
+        <plugin name="guestAuthorization" type="Magento\Webapi\Model\Plugin\GuestAuthorization" />
     </type>
 </config>
diff --git a/app/code/Magento/Weee/Block/Sales/Order/Totals.php b/app/code/Magento/Weee/Block/Sales/Order/Totals.php
index 2e8a7794dc2084defef6f10341c57134b9d81067..d9e709ada96e29935c58ee9301cedafb2f01182e 100644
--- a/app/code/Magento/Weee/Block/Sales/Order/Totals.php
+++ b/app/code/Magento/Weee/Block/Sales/Order/Totals.php
@@ -28,19 +28,19 @@ class Totals extends \Magento\Framework\View\Element\Template
     /**
      * @var \Magento\Weee\Helper\Data
      */
-    protected $_weeeData;
+    protected $weeeData;
 
     /**
-     * @param \Magento\Weee\Helper\Data $_weeeData
      * @param \Magento\Framework\View\Element\Template\Context $context
+     * @param \Magento\Weee\Helper\Data $weeeData
      * @param array $data
      */
     public function __construct(
-        \Magento\Weee\Helper\Data $_weeeData,
         \Magento\Framework\View\Element\Template\Context $context,
+        \Magento\Weee\Helper\Data $weeeData,
         array $data = array()
     ) {
-        $this->_weeeData = $_weeeData;
+        $this->weeeData = $weeeData;
         parent::__construct($context, $data);
     }
 
@@ -65,7 +65,7 @@ class Totals extends \Magento\Framework\View\Element\Template
         $items = $this->getSource()->getAllItems();
         $store = $this->getSource()->getStore();
 
-        $weeeTotal = $this->_weeeData->getTotalAmounts($items, $store);
+        $weeeTotal = $this->weeeData->getTotalAmounts($items, $store);
         if ($weeeTotal) {
             // Add our total information to the set of other totals
             $total = new \Magento\Framework\Object(
diff --git a/app/code/Magento/Weee/composer.json b/app/code/Magento/Weee/composer.json
index 29650859b107c172801bf393beab4d7b22030772..df204ed3d472c88f3e5b7476cc9c0ece626b6acd 100644
--- a/app/code/Magento/Weee/composer.json
+++ b/app/code/Magento/Weee/composer.json
@@ -2,22 +2,22 @@
     "name": "magento/module-weee",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-tax": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-directory": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-eav": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-bundle": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-tax": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-directory": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-eav": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-bundle": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Widget/composer.json b/app/code/Magento/Widget/composer.json
index 35416fd879a95303314f1dc257ac484c29d79dc3..2403b38e284a96629c5d08c7ae9168a505649824 100644
--- a/app/code/Magento/Widget/composer.json
+++ b/app/code/Magento/Widget/composer.json
@@ -2,18 +2,18 @@
     "name": "magento/module-widget",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-cms": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-cms": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Widget/etc/adminhtml/acl.xml b/app/code/Magento/Widget/etc/acl.xml
similarity index 93%
rename from app/code/Magento/Widget/etc/adminhtml/acl.xml
rename to app/code/Magento/Widget/etc/acl.xml
index a885eca4694920f0a149eac6b86d7935ff903b8a..bb1a67686a7866dfc27fab1fe808c37a200548fb 100644
--- a/app/code/Magento/Widget/etc/adminhtml/acl.xml
+++ b/app/code/Magento/Widget/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/Wishlist/composer.json b/app/code/Magento/Wishlist/composer.json
index 0316d3b519f33fe4b5336e8e852a3319a357ce35..6dd7470f703fc717c42c8413aab645e29e4d5597 100644
--- a/app/code/Magento/Wishlist/composer.json
+++ b/app/code/Magento/Wishlist/composer.json
@@ -2,26 +2,26 @@
     "name": "magento/module-wishlist",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/module-store": "0.1.0-alpha89",
-        "magento/module-customer": "0.1.0-alpha89",
-        "magento/module-catalog": "0.1.0-alpha89",
-        "magento/module-core": "0.1.0-alpha89",
-        "magento/module-checkout": "0.1.0-alpha89",
-        "magento/module-theme": "0.1.0-alpha89",
-        "magento/module-catalog-inventory": "0.1.0-alpha89",
-        "magento/module-tax": "0.1.0-alpha89",
-        "magento/module-backend": "0.1.0-alpha89",
-        "magento/module-bundle": "0.1.0-alpha89",
-        "magento/module-sales": "0.1.0-alpha89",
-        "magento/module-grouped-product": "0.1.0-alpha89",
-        "magento/module-configurable-product": "0.1.0-alpha89",
-        "magento/module-downloadable": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/module-store": "0.1.0-alpha90",
+        "magento/module-customer": "0.1.0-alpha90",
+        "magento/module-catalog": "0.1.0-alpha90",
+        "magento/module-core": "0.1.0-alpha90",
+        "magento/module-checkout": "0.1.0-alpha90",
+        "magento/module-theme": "0.1.0-alpha90",
+        "magento/module-catalog-inventory": "0.1.0-alpha90",
+        "magento/module-tax": "0.1.0-alpha90",
+        "magento/module-backend": "0.1.0-alpha90",
+        "magento/module-bundle": "0.1.0-alpha90",
+        "magento/module-sales": "0.1.0-alpha90",
+        "magento/module-grouped-product": "0.1.0-alpha90",
+        "magento/module-configurable-product": "0.1.0-alpha90",
+        "magento/module-downloadable": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-module",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/code/Magento/Wishlist/etc/adminhtml/acl.xml b/app/code/Magento/Wishlist/etc/acl.xml
similarity index 94%
rename from app/code/Magento/Wishlist/etc/adminhtml/acl.xml
rename to app/code/Magento/Wishlist/etc/acl.xml
index cec8e12ff1d1156c1edde51e7499c40398e15cf5..f2562e9a376136dbe34fbb17d8f1b403a5159a84 100644
--- a/app/code/Magento/Wishlist/etc/adminhtml/acl.xml
+++ b/app/code/Magento/Wishlist/etc/acl.xml
@@ -23,7 +23,7 @@
  * @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" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Acl/etc/acl.xsd">
     <acl>
         <resources>
             <resource id="Magento_Adminhtml::admin">
diff --git a/app/code/Magento/Wishlist/view/frontend/layout/wishlist_index_configure_type_bundle.xml b/app/code/Magento/Wishlist/view/frontend/layout/wishlist_index_configure_type_bundle.xml
index cdc3975ab1bd4c3ce1d9fcac706189f710994e50..ea3f602e1c656fcfcac7a30513a3633ce96ee91b 100644
--- a/app/code/Magento/Wishlist/view/frontend/layout/wishlist_index_configure_type_bundle.xml
+++ b/app/code/Magento/Wishlist/view/frontend/layout/wishlist_index_configure_type_bundle.xml
@@ -39,7 +39,7 @@
                 </arguments>
             </block>
             <block class="Magento\Catalog\Block\Product\View" name="product.info.addtocart.bundle" as="addtocart" template="product/view/addtocart.phtml"/>
-            <block class="Magento\Catalog\Block\Product\View" name="product.info.addto.bundle" as="addto" template="product/view/addto.phtml"/>
+            <block class="Magento\Wishlist\Block\Item\Configure" name="product.info.addto.bundle" as="addto" template="item/configure/addto.phtml"/>
         </block>
     </referenceBlock>
     <referenceBlock name="product.info.options.wrapper">
diff --git a/app/code/Magento/Wishlist/view/frontend/web/js/add-to-wishlist.js b/app/code/Magento/Wishlist/view/frontend/web/js/add-to-wishlist.js
index 886d693c4557bbbef9194664b8d23b2733422494..6e626c5150e1f46e7f4c5362b27357ed19e29723 100644
--- a/app/code/Magento/Wishlist/view/frontend/web/js/add-to-wishlist.js
+++ b/app/code/Magento/Wishlist/view/frontend/web/js/add-to-wishlist.js
@@ -50,7 +50,10 @@ define([
         },
         _updateWishlistData: function(event) {
             var dataToAdd = {};
-            dataToAdd[$(event.currentTarget).attr('name')] = $(event.currentTarget).val();
+            $(event.handleObj.selector).each(function(index, element){
+                dataToAdd[$(element).attr('name')] = $(element).val();
+            });
+
             $('[data-action="add-to-wishlist"]').each(function(index, element) {
                 var params = $(element).data('post');
                 params.data = $.extend({}, params.data, dataToAdd);
diff --git a/app/design/adminhtml/Magento/backend/Magento_Theme/web/css/source/module.less b/app/design/adminhtml/Magento/backend/Magento_Theme/web/css/source/module.less
index eaaa2648aa3334076423cd23cab589461f84b316..1687c59008817acc81a00a45a8cd4947e812502f 100644
--- a/app/design/adminhtml/Magento/backend/Magento_Theme/web/css/source/module.less
+++ b/app/design/adminhtml/Magento/backend/Magento_Theme/web/css/source/module.less
@@ -477,6 +477,9 @@ button {
         @_dropdown-split-list-min-width: 175px
     );
     vertical-align: middle;
+    .action-toggle:after {
+        height: 13px;
+    }
 }
 
 .page-content {
diff --git a/app/design/adminhtml/Magento/backend/composer.json b/app/design/adminhtml/Magento/backend/composer.json
index 8d5060896f34c3c6711d2b0e4f538092c7a78aff..e6a1b089950a597c4b8cd513a3e9765c28e6633b 100644
--- a/app/design/adminhtml/Magento/backend/composer.json
+++ b/app/design/adminhtml/Magento/backend/composer.json
@@ -2,12 +2,12 @@
     "name": "magento/theme-adminhtml-backend",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-theme",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/design/adminhtml/Magento/backend/theme.xml b/app/design/adminhtml/Magento/backend/theme.xml
index e4b8434d1fedfc85aa782e81fd0e142b46e2f330..fe67f100a603c818e34a63e791562ee93d299723 100644
--- a/app/design/adminhtml/Magento/backend/theme.xml
+++ b/app/design/adminhtml/Magento/backend/theme.xml
@@ -24,5 +24,5 @@
 -->
 <theme xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Config/etc/theme.xsd">
     <title>Magento 2 backend</title>
-    <version>0.1.0-alpha89</version>
+    <version>0.1.0-alpha90</version>
 </theme>
diff --git a/app/design/adminhtml/Magento/backend/web/css/source/theme.less b/app/design/adminhtml/Magento/backend/web/css/source/theme.less
index 107ec550dca4ac20379cb47d7df06787b62764d1..b5b2a03583505c57ebe4ae8a6c9cdbbbb491f5c9 100644
--- a/app/design/adminhtml/Magento/backend/web/css/source/theme.less
+++ b/app/design/adminhtml/Magento/backend/web/css/source/theme.less
@@ -38,13 +38,14 @@
 @page-main-action-color: #645D53;
 
 @dropdown-split-actions-padding: '';
-@dropdown-split-toggle-actions-padding:  0 5px;
+@dropdown-split-toggle-actions-padding: 6px 5px;
+@dropdown-split-toggle-icon-font-line-height: 14px;
 
 // Default = secondary button
-@button-padding: 0 13px;
+@button-padding: 6px 13px;
 @button-font-weight: 500;
 @button-font-size: 13px;
-@button-height: 26px;
+@button-line-height: @button-font-size + 1;
 @button-color: #645D53;
 @button-background: #f2ebde;
 @button-border: 1px solid #ada89e;
@@ -54,8 +55,8 @@
 @button-background-active: @button-background-hover;
 @button-color-active: '';
 @button-border-active: 1px solid #989287;
+
 // Primary button
-@button-primary-height: @button-height;
 @button-primary-background: #007dbd;
 @button-primary-border: 1px solid #0a6c9f;
 @button-primary-color: #fff;
@@ -84,7 +85,6 @@
 //
 //    Grid
 //--------------------------------------
-
 @grid-frame-bg: #fff;
 @grid-controls-border: #989287;
 
diff --git a/app/design/frontend/Magento/blank/Magento_Bundle/web/css/source/module.less b/app/design/frontend/Magento/blank/Magento_Bundle/web/css/source/module.less
index 2e7073e03aeaca530783c764d991343cb01dfda1..9a9d1525db97ecf3cb943e7ef73f908933e67b93 100644
--- a/app/design/frontend/Magento/blank/Magento_Bundle/web/css/source/module.less
+++ b/app/design/frontend/Magento/blank/Magento_Bundle/web/css/source/module.less
@@ -97,7 +97,8 @@
         }
         .product-addto-links {
             > .action {
-                &:extend(.abstract-action-addto all);
+                &:extend(.abstract-action-addto-product all);
+                vertical-align: top;
             }
         }
     }
@@ -109,7 +110,7 @@
 //
 //    Desktop
 //--------------------------------------
-.responsive(@break) when (@break = @break-point-1) {
+.responsive(@break) when (@break = @screen-m) {
     .bundle-options-container {
         .legend.title {
             &:extend(.reset-left-margin all);
diff --git a/app/design/frontend/Magento/blank/Magento_Catalog/layout/catalog_product_view.xml b/app/design/frontend/Magento/blank/Magento_Catalog/layout/catalog_product_view.xml
index de403ef3008141ab7a325e6f9be1174c066e55a0..6f19ae1a64bf336f56639f9af5ef36761bf11a5d 100644
--- a/app/design/frontend/Magento/blank/Magento_Catalog/layout/catalog_product_view.xml
+++ b/app/design/frontend/Magento/blank/Magento_Catalog/layout/catalog_product_view.xml
@@ -26,4 +26,5 @@
 <layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../../app/code/Magento/Core/etc/layout_single.xsd">
     <move element="page.main.title" destination="product.info.main" before="-"/>
+    <move element="product.info.media" destination="content" before="product.info.main" />
 </layout>
diff --git a/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/module.less b/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/module.less
index 8dd6f5343de2204ca1b0e6b31a93fa7694899747..687a2d2ed31ce36e2e272c756bc0ab59be66d399 100644
--- a/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/module.less
+++ b/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/module.less
@@ -24,30 +24,32 @@
 
 @product-grid-items-per-row-layout-default: 2;
 
-@product-grid-items-per-row-layout-1-break-point-0: 3;
-@product-grid-items-per-row-layout-1-break-point-1: 4;
-@product-grid-items-per-row-layout-1-break-point-2: 5;
+@product-grid-items-per-row-layout-1-screen-s: 3;
+@product-grid-items-per-row-layout-1-screen-m: 4;
+@product-grid-items-per-row-layout-1-screen-l: 5;
 
-@product-grid-items-per-row-layout-2-left-break-point-0: 3;
-@product-grid-items-per-row-layout-2-left-break-point-1: 4;
-@product-grid-items-per-row-layout-2-left-break-point-2: '';
+@product-grid-items-per-row-layout-2-left-screen-s: 3;
+@product-grid-items-per-row-layout-2-left-screen-m: 4;
+@product-grid-items-per-row-layout-2-left-screen-l: '';
 
-@product-grid-items-per-row-layout-2-right-break-point-0: 3;
-@product-grid-items-per-row-layout-2-right-break-point-1: 4;
-@product-grid-items-per-row-layout-2-right-break-point-2: '';
+@product-grid-items-per-row-layout-2-right-screen-s: 3;
+@product-grid-items-per-row-layout-2-right-screen-m: 4;
+@product-grid-items-per-row-layout-2-right-screen-l: '';
 
-@product-grid-items-per-row-layout-3-break-point-0: 3;
-@product-grid-items-per-row-layout-3-break-point-1: '';
-@product-grid-items-per-row-layout-3-break-point-2: '';
+@product-grid-items-per-row-layout-3-screen-s: 3;
+@product-grid-items-per-row-layout-3-screen-m: '';
+@product-grid-items-per-row-layout-3-screen-l: '';
 
 @product-grid-items-padding: 0 @indent-base @indent-base;
-@product-grid-items-margin: 0 0 @indent-l-base;
+@product-grid-items-margin: 0 0 @indent-s-base;
 
 @product-name-text-decoration: none;
 @product-name-text-decoration-hover: @link-text-decoration-hover;
 
 @toolbar-mode-icon-font-size: 26px;
 
+@import "toolbar.less";
+
 .product-item-grid(@_layout-class, @_product-items) when not (@_layout-class = false) and not (@_product-items = '') {
     .@{_layout-class} & {
         .css(width, 100% / @_product-items);
@@ -111,30 +113,30 @@
     .product-item-grid(@_layout-class: false, @product-grid-items-per-row-layout-default);
 }
 
-.responsive(@break) when (@break = @break-point-0) {
+.responsive(@break) when (@break = @screen-s) {
     .products.grid .item.product {
-        .product-item-grid(@layout-class-1column, @product-grid-items-per-row-layout-1-break-point-0);
-        .product-item-grid(@layout-class-2columns-left, @product-grid-items-per-row-layout-2-left-break-point-0);
-        .product-item-grid(@layout-class-2columns-right, @product-grid-items-per-row-layout-2-right-break-point-0);
-        .product-item-grid(@layout-class-3columns, @product-grid-items-per-row-layout-3-break-point-0);
+        .product-item-grid(@layout-class-1column, @product-grid-items-per-row-layout-1-screen-s);
+        .product-item-grid(@layout-class-2columns-left, @product-grid-items-per-row-layout-2-left-screen-s);
+        .product-item-grid(@layout-class-2columns-right, @product-grid-items-per-row-layout-2-right-screen-s);
+        .product-item-grid(@layout-class-3columns, @product-grid-items-per-row-layout-3-screen-s);
     }
 }
 
-.responsive(@break) when (@break = @break-point-1) {
+.responsive(@break) when (@break = @screen-m) {
     .products.grid .item.product {
-        .product-item-grid(@layout-class-1column, @product-grid-items-per-row-layout-1-break-point-1);
-        .product-item-grid(@layout-class-2columns-left, @product-grid-items-per-row-layout-2-left-break-point-1);
-        .product-item-grid(@layout-class-2columns-right, @product-grid-items-per-row-layout-2-right-break-point-1);
-        .product-item-grid(@layout-class-3columns, @product-grid-items-per-row-layout-3-break-point-1);
+        .product-item-grid(@layout-class-1column, @product-grid-items-per-row-layout-1-screen-m);
+        .product-item-grid(@layout-class-2columns-left, @product-grid-items-per-row-layout-2-left-screen-m);
+        .product-item-grid(@layout-class-2columns-right, @product-grid-items-per-row-layout-2-right-screen-m);
+        .product-item-grid(@layout-class-3columns, @product-grid-items-per-row-layout-3-screen-m);
     }
 }
 
-.responsive(@break) when (@break = @break-point-2) {
+.responsive(@break) when (@break = @screen-l) {
     .products.grid .item.product {
-        .product-item-grid(@layout-class-1column, @product-grid-items-per-row-layout-1-break-point-2);
-        .product-item-grid(@layout-class-2columns-left, @product-grid-items-per-row-layout-2-left-break-point-2);
-        .product-item-grid(@layout-class-2columns-right, @product-grid-items-per-row-layout-2-right-break-point-2);
-        .product-item-grid(@layout-class-3columns, @product-grid-items-per-row-layout-3-break-point-2);
+        .product-item-grid(@layout-class-1column, @product-grid-items-per-row-layout-1-screen-l);
+        .product-item-grid(@layout-class-2columns-left, @product-grid-items-per-row-layout-2-left-screen-l);
+        .product-item-grid(@layout-class-2columns-right, @product-grid-items-per-row-layout-2-right-screen-l);
+        .product-item-grid(@layout-class-3columns, @product-grid-items-per-row-layout-3-screen-l);
     }
 }
 
@@ -210,150 +212,61 @@
             }
         }
         .action {
-            &.towishlist {
-                .icon-font(
-                    @icon-wishlist-empty,
-                    @_icon-font-size: 29px,
-                    @_icon-font-color: @text-color-muted,
-                    @_icon-font-text-hide: true,
-                    @_icon-font-vertical-align: middle,
-                    @_icon-font-line-height: normal
-                );
+            &.tocompare {
+                &:extend(.abstract-actions-addto-gridlist all);
             }
             &.tocompare {
-                .icon-font(
-                    @icon-compare-empty,
-                    @_icon-font-size: 29px,
-                    @_icon-font-color: @text-color-muted,
-                    @_icon-font-text-hide: true,
-                    @_icon-font-vertical-align: middle,
-                    @_icon-font-line-height: normal
+                .icon-font-symbol(
+                    @icon-compare-empty
                 );
             }
         }
     }
     &.wrapper.list {
         .products.list.items {
-            .item.product {
+            .product-item {
                 display: block;
                 margin-bottom: @indent-l-base;
-            }
-            .product.photo {
-                display: block;
-            }
-            .details {
-                text-align: center;
-            }
-            .name {
-                font-size: @font-size-l;
-                margin-bottom: @indent-base;
+                &-photo {
+                    display: block;
+                }
+                &-details {
+                    text-align: center;
+                }
+                &-name {
+                    font-size: @font-size-l;
+                    margin-bottom: @indent-base;
+                }
+                .actions {
+                    > .actions-primary {
+                        + .actions-secondary {
+                            margin-top: @indent-s-base;
+                        }
+                    }
+                }
             }
         }
     }
     &.wrapper.grid {
         .products.list.items {
-            .item.product {
+            .product-item {
                 display: inline-block;
                 padding: @product-grid-items-padding;
                 margin: @product-grid-items-margin;
             }
-            .img.container {
+            .product-image-container {
                 margin-bottom: @indent-base;
             }
             .actions {
-                > .primary {
+                > .actions-primary {
                     display: inline-block;
+                    + .actions-secondary {
+                        margin-top: @indent-s-base;
+                    }
                 }
             }
         }
     }
-
-    &.toolbar {
-        padding: @indent-s-base;
-        background: @panel-bg;
-        margin-bottom: @indent-xl-base;
-        text-align: center;
-        &:extend(.add-box-sizing all);
-        .settings,
-        .pages,
-        .pager {
-            margin-bottom: @indent-s-base;
-            &:last-child {
-                margin-bottom: 0;
-            }
-        }
-        .modes {
-            display: inline-block;
-            margin-right: @indent-base;
-            margin-bottom: @indent-s-base;
-            .label {
-                .visually-hidden();
-            }
-            .mode {
-                border: 1px solid @border-color-base;
-                font-weight: @font-weight-base;
-                color: @text-color-muted;
-                text-align: center;
-                width: floor(@toolbar-mode-icon-font-size * @line-height-base);
-                .icon-text-hide();
-                &.active {
-                    background: #e5e5e5;
-                    color: #c7c7c7;
-                }
-            }
-            .mode + .mode {
-                margin-left: -4px;
-                border-left: none;
-            }
-            .mode.grid {
-                .icon-font(
-                    @icon-grid,
-                    @_icon-font-size: @toolbar-mode-icon-font-size
-                );
-            }
-            .mode.list {
-                .icon-font(
-                    @icon-list,
-                    @_icon-font-size: @toolbar-mode-icon-font-size
-                );
-            }
-        }
-        .sorter {
-            display: inline-block;
-            select {
-                .form-element-size(@_width: auto);
-            }
-            .action.sort.asc {
-                .icon-font(
-                    @icon-arrow-down,
-                    @_icon-font-size: 27px,
-                    @_icon-font-color: @text-color-muted
-                );
-                .icon-text-hide();
-            }
-            .action.sort.desc {
-                .icon-font(
-                    @icon-arrow-up,
-                    @_icon-font-size: 27px,
-                    @_icon-font-color: @text-color-muted
-                );
-                .icon-text-hide();
-            }
-        }
-        .limiter {
-            display: inline;
-            margin-left: @indent-base;
-            select {
-                .form-element-size(@_width: auto);
-            }
-            .text {
-                display: none;
-            }
-        }
-        .amount {
-            display: inline;
-        }
-    }
 }
 
 //
@@ -443,23 +356,19 @@
     }
 
     .box-tocart {
-        display: table;
         margin: @indent-base 0;
         .field.qty {
-            display: table-cell;
-            vertical-align: bottom;
             padding-right: 0.75 * @indent-base;
         }
         .input-text.qty {
+            @tocart-input-size: @button-l-line-height + 28px;
             .form-element-size(
-                @_width: @button-l-height + 2px,
-                @_height: @button-l-height + 2px
+                @_width: @tocart-input-size + 2px,
+                @_height: @tocart-input-size + 2px
             );
             text-align: center;
         }
         .actions {
-            display: table-cell;
-            vertical-align: bottom;
             text-align: center;
         }
         .action.tocart {
@@ -470,7 +379,8 @@
         margin: @indent-base 0;
     }
     .action.tocompare {
-        &:extend(.abstract-action-addto all);
+        &:extend(.abstract-action-addto-product all);
+        vertical-align: top;
     }
     .product-reviews-summary .reviews-actions {
         .font-size(@font-size-base);
@@ -491,10 +401,47 @@
     display: block;
 }
 
+.ui-dialog-titlebar-close {
+    .button-as-link();
+}
+
+//
+//    Mobile
+//--------------------------------------
+.responsive-smaller(@break) when (@break = @screen-m) {
+    .product-info-main .box-tocart {
+        .actions {
+            .action.tocart {
+                &:extend(.abstract-button-responsive-smaller all);
+            }
+        }
+    }
+}
+
+//
+//    Desktop
+//--------------------------------------
+.responsive(@break) when (@break = @screen-m) {
+    .product-info-main {
+        .box-tocart {
+            display: table;
+            .field.qty {
+                display: table-cell;
+            }
+            .actions {
+                display: table-cell;
+                padding-top: 25px;
+                text-align: center;
+                vertical-align: bottom;
+            }
+        }
+    }
+}
+
 //
 //    Category page layout
 //--------------------------------------
-.responsive(@break) when (@break = @break-point-1) {
+.responsive(@break) when (@break = @screen-m) {
     .product-info-main {
         float: right;
     }
@@ -551,7 +498,7 @@
 //
 //    Desktop
 //--------------------------------------
-.responsive(@break) when (@break = @break-point-1) {
+.responsive(@break) when (@break = @screen-m) {
     .product-add-form {
         &:extend(.revert-field-type-desktop all);
     }
@@ -643,11 +590,11 @@ body.catalog-product-compare-index {
     }
 }
 
-.comparison.wrapper {
+.table-wrapper.comparison {
     clear: both;
 }
 
-.data.comparison {
+.table-comparison {
     table-layout: fixed;
 
     .cell.label.remove,
@@ -695,16 +642,16 @@ body.catalog-product-compare-index {
         border-right: 1px solid #e5e5e5;
     }
 
-    .product.photo {
+    .product-item-photo {
         text-align: center;
         display: block;
         margin: 0 auto 15px;
     }
 
-    .actions,
+    .product-item-actions,
     .price-box,
     .product.rating,
-    .product.name {
+    .product-item-name {
         display: block;
         margin: 15px 0;
     }
@@ -730,6 +677,13 @@ body.catalog-product-compare-index {
             &:extend(.remove-button-for-blocks all);
         }
     }
+    .product-item-actions {
+        > .actions-primary {
+            + .actions-secondary {
+                margin-top: @indent-s-base;
+            }
+        }
+    }
 }
 
 .comparison.headings {
@@ -767,3 +721,12 @@ body.catalog-product-compare-index {
         max-width: 178px;
     }
 }
+
+//
+//    Desktop
+//--------------------------------------
+.responsive(@break) when (@break = @screen-m) {
+    .table-wrapper.comparison {
+        .table-overflow();
+    }
+}
diff --git a/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/toolbar.less b/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/toolbar.less
new file mode 100644
index 0000000000000000000000000000000000000000..fc988c625b7c0aa898fa694e42ac002966bef0f1
--- /dev/null
+++ b/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/toolbar.less
@@ -0,0 +1,161 @@
+// /**
+// //  * 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
+//  * @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)
+//  */
+
+@toolbar-mode-icon-font-size: 24px;
+@toolbar-element-background: @panel-bg;
+@pager-font-weight: @font-weight-bold;
+
+.page-products .columns {
+    position: relative;
+    z-index: 1;
+    padding-top: 38px;
+}
+
+.toolbar {
+    &-amount {
+        display: block;
+        float: left;
+        line-height: @toolbar-mode-icon-font-size+2;
+        padding: 8px 0 0;
+        margin: 0;
+        vertical-align: middle;
+        .products.wrapper ~ .toolbar & {
+            display: none;
+        }
+    }
+    &-products {
+        margin-bottom: @indent-xl-base;
+        text-align: center;
+        padding: 0 @indent-s-base;
+        &:extend(.add-clearfix all);
+        .pages {
+            display: none;
+            .products.wrapper ~ & {
+                display: block;
+            }
+        }
+        .limiter {
+            display: none;
+        }
+    }
+}
+
+.sorter {
+    float: right;
+    padding: 4px 0 0;
+    .products.wrapper ~ .toolbar & {
+        display: none;
+    }
+    &-options {
+        margin: 0 5px 0 7px;
+        width: auto;
+    }
+    &-action {
+        .icon-font(
+            @icon-arrow-down,
+            @_icon-font-size: 24px,
+            @_icon-font-color: @text-color-muted
+        );
+        .icon-text-hide();
+        &.sort-desc:before {
+            content: @icon-arrow-down;
+        }
+    }
+}
+
+.modes {
+    display: none;
+}
+
+.limiter {
+    &-options {
+        width: auto;
+        margin: 0 5px 0 7px;
+    }
+    &-label {
+        font-weight: 400;
+    }
+    .page-products .toolbar & {
+        display: none;
+    }
+}
+
+.responsive(@break) when (@break = @screen-s) {
+    .page-products .columns {
+        position: relative;
+        z-index: 1;
+        padding-top: 0;
+    }
+    .toolbar {
+        .products.wrapper ~ & .pages {
+            float: left;
+        }
+    }
+    .modes {
+        float: left;
+        display: inline-block;
+        margin-right: @indent-base;
+        overflow: hidden;
+        .products.wrapper ~ .toolbar & {
+            display: none;
+        }
+        &-label {
+            .visually-hidden;
+        }
+        &-mode {
+            float: left;
+            border: 1px solid @border-color-base;
+            font-weight: @font-weight-base;
+            color: @text-color-muted;
+            text-align: center;
+            padding: 7px 10px;
+            line-height: 1;
+            border-right: 0;
+            .icon-text-hide();
+            &:not(.active):hover {
+                background: darken(@toolbar-element-background, 7%);
+                color: @text-color-muted;
+            }
+            &:last-child {
+                border-right: 1px solid @border-color-base;
+            }
+            &.active {
+                color: @color-primary-light;
+            }
+            .icon-font(
+                @icon-grid,
+                @_icon-font-size: @toolbar-mode-icon-font-size
+            );
+        }
+    }
+    .mode-list {
+        .icon-font-symbol(@icon-list);
+    }
+    .limiter {
+        float: right;
+        .products.wrapper ~ .toolbar & {
+            display: block;
+        }
+    }
+}
diff --git a/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/widgets.less b/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/widgets.less
index 36f7e1a86cb4ef043204a652f7c9c1be53a066b9..03b747dd2755ab04452bafb915f81f235e088711 100644
--- a/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/widgets.less
+++ b/app/design/frontend/Magento/blank/Magento_Catalog/web/css/source/widgets.less
@@ -50,7 +50,7 @@ div.widget.category.link {
 //
 //    Desktop
 //--------------------------------------
-.responsive(@break) when (@break = @break-point-1) {
+.responsive(@break) when (@break = @screen-m) {
     .block.widget.new {
         .pager {
             text-align: left;
diff --git a/app/design/frontend/Magento/blank/Magento_CatalogSearch/web/css/source/module.less b/app/design/frontend/Magento/blank/Magento_CatalogSearch/web/css/source/module.less
index c524da6c6f3cf70a0db0582b6704e447f79a9e05..1a0ae1bbfaefb76ef562faf97cf690dde0611781 100644
--- a/app/design/frontend/Magento/blank/Magento_CatalogSearch/web/css/source/module.less
+++ b/app/design/frontend/Magento/blank/Magento_CatalogSearch/web/css/source/module.less
@@ -28,9 +28,12 @@
 @autocomplete-item-hover: #e8e8e8;
 @autocomplete-item-amount-color: #999;
 
-.block.search {
-    .title {
-        display: none;
+.block-search {
+    margin-bottom: 0;
+    .block {
+        &-title {
+            display: none;
+        }
     }
     .label {
         .icon-font(
@@ -70,7 +73,7 @@
 
 }
 
-.search.autocomplete {
+.search-autocomplete {
     display: none;
     position: absolute;
     z-index: 3;
@@ -78,6 +81,7 @@
     margin-top: -15px;
     &:extend(.add-box-sizing all);
     ul {
+        .list-reset-styles();
         li {
             &:not(:empty) {
                 background: @autocomplete-background;
@@ -153,8 +157,8 @@
 //
 //    Desktop
 //--------------------------------------
-.responsive(@break) when (@break = @break-point-1) {
-    .block.search {
+.responsive(@break) when (@break = @screen-m) {
+    .block-search {
         position: relative;
         float: right;
         padding-left: 15px;
@@ -166,7 +170,7 @@
         .control {
             border-top: 0;
             margin: 0;
-            padding: 0;
+            padding: 0 0 25px;
         }
         .nested {
             display: block;
@@ -197,9 +201,10 @@
                     color: #333;
                 }
             }
+            padding: 5px 0;
         }
     }
-    .search.autocomplete {
+    .search-autocomplete {
         margin-top: 0;
     }
 }
diff --git a/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/cart.less b/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/cart.less
index a3dbfa007515fcdbb09bddbf0168c35680052e33..3b3d197b82d2faa7912e154620d26cba9e2232c7 100644
--- a/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/cart.less
+++ b/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/cart.less
@@ -198,7 +198,7 @@
         }
         .item {
             &-actions td {
-                padding-bottom: 20px;
+                padding-bottom: 10px;
                 text-align: center;
                 white-space: normal;
             }
@@ -216,13 +216,18 @@
                 }
             }
         }
-        .action {
-            &:extend(button all);
-            .link-as-button();
-            margin-left: 10px;
-            &:first-child {
-                margin-left: 0;
+        .actions {
+            > .action {
+                &:extend(button all);
+                .link-as-button();
+                margin-left: 10px;
+                margin-bottom: 10px;
+                &:first-child {
+                    margin-left: 0;
+                }  
             }
+        }
+        .action {
             &.help.map {
                 &:extend(.abstract-action-button-as-link all);
                 font-weight: @font-weight-base;
@@ -247,12 +252,11 @@
             &-item-name {
                 display: inline-block;
                 font-weight: @font-weight-base;
-                max-width: 130px;
                 overflow: hidden;
                 text-overflow: ellipsis;
             }
         }
-        //  Product options
+        // Product options
         .cart-item-options {
             font-size: @font-size-s;
             margin-top: @indent-s-base;
@@ -273,10 +277,11 @@
                 &.continue {
                     .link-as-button();
                     .button(
-                        @_button-padding: 0 15px 0 5px,
+                        @_button-padding: 7px 15px 7px 0,
                         @_button-icon-use: true,
                         @_button-font-content: @icon-prev,
                         @_button-icon-font-size: 32px,
+                        @_button-icon-font-line-height: 16px,
                         @_button-icon-font-position: before
                     );
                     border-radius: 3px;
@@ -288,7 +293,8 @@
                 &.update {
                     .button-icon(
                         @icon-update,
-                        @_icon-font-size: 32px
+                        @_icon-font-size: 32px,
+                        @_icon-font-line-height: 16px
                     );
                     padding-left: 5px;
                 }
@@ -326,7 +332,7 @@
 //
 //    Mobile
 //--------------------------------------
-.responsive-smaller(@break) when (@break = @break-point-1) {
+.responsive-smaller(@break) when (@break = @screen-m) {
     .cart {
         &.table-wrapper {
             thead {
@@ -371,7 +377,7 @@
 //
 //    Desktop
 //--------------------------------------
-.responsive(@break) when (@break = @break-point-1) {
+.responsive(@break) when (@break = @screen-m) {
     .cart {
         &-container {
             &:extend(.add-clearfix-desktop all);
diff --git a/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/minicart.less b/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/minicart.less
index 8f6e6f75b9370ada32d4d08f553cc78930062eaa..a9dd73a13a235e8d9e32b969d4acf88f0a4bdbd9 100644
--- a/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/minicart.less
+++ b/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/minicart.less
@@ -25,8 +25,7 @@
 //
 //    Minicart
 //--------------------------------------
-
-.block.minicart {
+.block-minicart {
     .subtotal {
         border-top: 1px solid @color-secondary;
         padding-top: 10px;
@@ -49,6 +48,14 @@
         text-align: center;
         font-size: 14px;
     }
+    .empty.text {
+        margin: -10px 0 20px;
+        text-align: center;
+        & + .actions {
+            margin-bottom: 10px;
+            text-align: center;
+        }
+    }
     > .content > .actions {
         margin-top: 10px;
         > .secondary,
@@ -62,7 +69,7 @@
 .minicart-wrapper {
     .dropdown(
         @_toggle-selector: ~".action.showcart",
-        @_options-selector: ~".block.minicart",
+        @_options-selector: ~".block-minicart",
         @_dropdown-toggle-icon-content: @icon-cart,
         @_dropdown-toggle-active-icon-content: @icon-cart,
         @_dropdown-list-item-padding: false,
@@ -75,8 +82,8 @@
         @_icon-font-color-active: @color-primary
     );
     float: right;
-    .block.minicart {
-        right: -15px;
+    .block-minicart {
+        right: -7px;
         width: 320px;
         padding: 15px;
         > .title {
@@ -163,10 +170,9 @@
             display: inline-block;
             height: 26px;
             line-height: 26px;
-            margin: 3px 0 0;
+            margin: 3px 0 0 -5px;
             max-width: 2em;
             min-width: 20px;
-            padding: 0 3px;
             overflow: hidden;
             text-align: center;
             white-space: normal;
@@ -211,13 +217,22 @@
 }
 
 //
-//    Desktop
+//    Mobile
 //--------------------------------------
+.responsive-smaller(@break) when (@break = @screen-xs) {
+    .minicart-wrapper .block-minicart {
+        width: 280px;
+    }
+}
 
-.responsive(@break) when (@break = @break-point-1) {
+//
+//    Desktop
+//--------------------------------------
+.responsive(@break) when (@break = @screen-m) {
     .minicart-wrapper {
-        margin-left: 30px;
-        .block.minicart {
+        margin-left: 10px;
+        .block-minicart {
+            right: -15px;
             width: 380px;
         }
     }
diff --git a/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module.less b/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module.less
index dde2b9b948bdf6a9e6e778e41b83768af104108e..6e6efca1563ef260f01fe97db88303d8d4ee176b 100644
--- a/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module.less
+++ b/app/design/frontend/Magento/blank/Magento_Checkout/web/css/source/module.less
@@ -25,10 +25,11 @@
 @import "cart.less";
 @import "minicart.less";
 
+@desctop-form-field-vertical-indent: 29px;
+
 //
 //    One Page Checkout
 //--------------------------------------
-
 .opc-wrapper {
     &:extend(.add-box-sizing all);
     .css(padding-bottom, @indent-xl-base);
@@ -39,9 +40,16 @@
         &.allow .step-title {
             cursor: pointer;
         }
-        &.active .step-title {
-            color: @color-primary-darker;
-            cursor: default;
+        &.active {
+            .step {
+                &-title {
+                    color: @color-primary-darker;
+                    cursor: default;
+                }
+                &-content {
+                    display: block;
+                }
+            }
         }
     }
     .step {
@@ -59,10 +67,11 @@
             border-bottom: @border-width-base solid @border-color-base;
         }
         &-content {
-            padding: 20px 25px 40px;
+            display: none;
+            padding: 20px 10px;
             position: relative;
             .addresses .control {
-                margin: 20px 0 30px;
+                margin: 20px 0;
             }
             .fieldset {
                 margin-bottom: 0;
@@ -73,6 +82,14 @@
                         text-align: center;
                     }
                 }
+                > .field {
+                    margin: @form-field-vertical-indent 0 0;
+                }
+                &.address {
+                    .field:first-of-type:not(.additional) {
+                        margin: 0;
+                    }
+                }
             }
             .form {
                 .form-hasrequired(bottom);
@@ -82,9 +99,15 @@
                 > .choice {
                     margin-top: @form-field-vertical-indent;
                 }
+                .field:not(:first-child) {
+                    margin: 20px 0 0;
+                }
+                > .field.choice {
+                    margin: @form-field-vertical-indent 0 0;
+                }
             }
             .actions {
-                margin-top: 40px;
+                margin-top: 20px;
             }
         }
     }
@@ -106,21 +129,34 @@
             &:extend(.abstract-shipping-methods-title all);
         }
         .item-content {
-            margin: 0 0 10px 20px;
+            margin: 0 0 20px;
+            .field.choice {
+                margin: 0 0 10px;
+            }
+            .price {
+                font-weight: @font-weight-bold;
+            }
         }
         .price.box {
             margin-left: 20px;
-            .regular .price {
+            .label + .price {
                 font-weight: @font-weight-bold;
             }
         }
     }
 
     .methods-payment {
-        .content {
+        .item-title {
+            font-weight: @font-weight-base;
+        }
+        .item-content {
             margin-bottom: 0;
             .fieldset {
                 padding: 15px 0;
+                .field:first-child,
+                .field.year {
+                    margin-top: 0;
+                }
             }
             .label {
                 font-weight: @font-weight-base;
@@ -128,6 +164,13 @@
         }
     }
 
+    .opc-payment-additional {
+        margin: 0 0 5px;
+        + .opc-payment {
+            margin: 20px 0 0;
+        }
+    }
+
     // Order review
     .data.table {
         &:extend(.product-options-list all);
@@ -197,7 +240,6 @@
 //
 //    Checkout Progress
 //--------------------------------------
-
 .opc-block-progress {
     &:extend(.add-box-sizing all);
     margin-bottom: @indent-l-base;
@@ -255,7 +297,6 @@
 //
 //    Checkout Success
 //--------------------------------------
-
 .checkout-onepage-success {
     .page-title {
         .print {
@@ -270,11 +311,40 @@
     }
 }
 
+
 //
-//    Desktop
+//    Mobile
 //--------------------------------------
-.responsive(@break) when (@break = @break-point-1) {
+.responsive-smaller(@break) when (@break = @screen-m) {
+    .opc-wrapper {
+        .data.table {
+            &:extend(.table-vertical-mobile all);
+            tbody tr {
+                &:first-child,
+                &:last-child {
+                    td {
+                        border: 0;
+                    }
+                }
+                td:last-child {
+                    border-bottom: @border-width-base solid @border-color-base;
+                }
+                .col {
+                    &.qty,
+                    &.price,
+                    &.subtotal {
+                        text-align: left;
+                    }
+                }
+            }
+        }
+    }
+}
 
+//
+//    Desktop
+//--------------------------------------
+.responsive(@break) when (@break = @screen-m) {
     .checkout-onepage-index .column.main {
         &:extend(.add-clearfix-desktop all);
     }
@@ -283,17 +353,30 @@
         .layout-column(2, 2, @layout-column-checkout-main-width);
         &:extend(.add-box-sizing-desktop all);
         .step-content {
+            padding: 20px 18px 40px;
+            .addresses .control {
+                margin-bottom: @desctop-form-field-vertical-indent;
+            }
             .form {
                 &:after {
                     text-align: right;
                 }
-            }
-            .form:not(.login) .actions-toolbar {
-                &:extend(.reset-left-margin-desktop all);
+                &:not(.login) .actions-toolbar {
+                    &:extend(.reset-left-margin-desktop all);
+                }
+                > .field.choice,
+                .fieldset > .field {
+                    margin: @desctop-form-field-vertical-indent 0 0;
+                }
+                .fieldset.address {
+                    .field:first-of-type:not(.additional) {
+                        margin: 0;
+                    }
+                }
             }
             .fieldset.login {
                 &:after {
-                        &:extend(.margin-for-forms-desktop all);
+                    &:extend(.margin-for-forms-desktop all);
                     text-align: left;
                 }
             }
@@ -327,7 +410,6 @@
     .checkout-onepage-success {
         .page-title {
             .print {
-                display: none;
                 display: inline-block;
                 margin-left: 40px;
                 .font-size(14);
diff --git a/app/design/frontend/Magento/blank/Magento_Customer/layout/customer_account.xml b/app/design/frontend/Magento/blank/Magento_Customer/layout/customer_account.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a31dca5a264ced21d5436f0d7613db049fa4965b
--- /dev/null
+++ b/app/design/frontend/Magento/blank/Magento_Customer/layout/customer_account.xml
@@ -0,0 +1,64 @@
+<?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" xsi:noNamespaceSchemaLocation="../../../../../../../app/code/Magento/Core/etc/layout_single.xsd">
+    <update handle="page_two_columns_left"/>
+    <referenceBlock name="root">
+        <action method="addBodyClass">
+            <argument name="class" xsi:type="string">account</argument>
+        </action>
+    </referenceBlock>
+    <referenceContainer name="sidebar.main">
+        <block class="Magento\Framework\View\Element\Template" name="customer_account_navigation_block" template="Magento_Theme::html/collapsible.phtml">
+            <arguments>
+                <argument name="block_title" translate="true" xsi:type="string">Account Dashboard</argument>
+                <argument name="block_css" xsi:type="string">block-account-nav</argument>
+            </arguments>
+            <block class="Magento\Framework\View\Element\Html\Links" name="customer_account_navigation" before="-">
+                <arguments>
+                    <argument name="css_class" xsi:type="string">nav items</argument>
+                </arguments>
+                <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-account-link">
+                    <arguments>
+                        <argument name="label" xsi:type="string">Account Dashboard</argument>
+                        <argument name="path" xsi:type="string">customer/account</argument>
+                    </arguments>
+                </block>
+                <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-account-edit-link">
+                    <arguments>
+                        <argument name="label" xsi:type="string">Account Information</argument>
+                        <argument name="path" xsi:type="string">customer/account/edit</argument>
+                    </arguments>
+                </block>
+                <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-address-link">
+                    <arguments>
+                        <argument name="label" xsi:type="string">Address Book</argument>
+                        <argument name="path" xsi:type="string">customer/address</argument>
+                    </arguments>
+                </block>
+            </block>
+        </block>
+    </referenceContainer>
+</layout>
diff --git a/app/design/frontend/Magento/blank/Magento_Customer/web/css/source/module.less b/app/design/frontend/Magento/blank/Magento_Customer/web/css/source/module.less
index 1455462bd7c7123457b9e4cb7dcea15c6cc510c0..a8d69d856e6d76489d03f4aef4bdb810069d3ca7 100644
--- a/app/design/frontend/Magento/blank/Magento_Customer/web/css/source/module.less
+++ b/app/design/frontend/Magento/blank/Magento_Customer/web/css/source/module.less
@@ -128,15 +128,16 @@
             }
         }
     }
-    .block.account-nav {
+    .sidebar .block-account-nav {
         .css(background, @sidebar-background);
-        padding: 15px 0;
+        margin: 0 0 40px;
+    }
+    .block-account-nav {
         .title {
-            padding: 0 18px;
-            margin-bottom: 25px;
-            strong {
-                .heading(h3);
-            }
+            display: none;
+        }
+        .content {
+            padding: 15px 0;
         }
         .nav.items {
             padding: 0;
@@ -149,8 +150,7 @@
                 a,
                 strong {
                     display: block;
-                    padding: 0 18px 0 15px;
-                    line-height: 30px;
+                    padding: 5px 18px 5px 15px;
                     border-left: 3px solid transparent;
                 }
                 a {
@@ -161,6 +161,7 @@
                     }
                 }
                 &.current {
+                    a,
                     strong {
                         .css(color, @account-nav-current-color);
                         .css(border-color, @account-nav-current-border-color);
@@ -214,21 +215,95 @@
     }
 }
 
-
 .control.captcha-image {
+    .css(margin-top, @indent-s-base);
     .captcha-img {
-        float: left;
-        margin: 0 20px 0 0;
+        vertical-align: middle;
+    }
+}
+
+.widget {
+    img {
+        max-width: 100%;
+    }
+}
+
+//
+//    Mobile
+//--------------------------------------
+.responsive-smaller(@break) when (@break = @screen-m) {
+    .account {
+        .data.table {
+            &:extend(.table-vertical-mobile all);
+            .col.actions {
+                padding-top: 9px;
+                padding-bottom: 15px;
+                &:before {
+                    &:extend(.visually-hidden-mobile all);
+                }
+            }
+        }
+        .toolbar {
+            .toolbar-amount,
+            .limiter,
+            .pages {
+                margin-bottom: 25px;
+            }
+        }
+        .block-account-nav {
+            margin-left: -@layout-width-xs-indent;
+            margin-right: -@layout-width-xs-indent;
+            margin-top: -(@indent-base + 1);
+            .title {
+                .icon-font(
+                    @_icon-font-content: @icon-down,
+                    @_icon-font-size: 30px,
+                    @_icon-font-position: after
+                );
+                border-top: @border-width-base solid @border-color-base;
+                border-bottom: @border-width-base solid @border-color-base;
+                cursor: pointer;
+                display: block;
+                font-weight: @font-weight-semibold;
+                margin-bottom: 0;
+                overflow: hidden;
+                padding: 7px 20px;
+                position: relative;
+                &:after {
+                    position: absolute;
+                    right: 0;
+                    top: -5px;
+                }
+                strong {
+                    margin: 0;
+                }
+                &.active {
+                    .icon-font-symbol(
+                        @_icon-font-content: @icon-prev,
+                        @_icon-font-position: after
+                    );
+                }
+            }
+            .content {
+                display: none;
+                &.active {
+                    display: block;
+                }
+            }
+        }
     }
-    .action.reload {
-        margin: 10px 0 0;
+    .control.captcha-image {
+        .captcha-img {
+            display: block;
+            .css(margin-bottom, @indent-s-base);
+        }
     }
 }
 
 //
 //    Desktop
 //--------------------------------------
-.responsive(@break) when (@break = @break-point-1) {
+.responsive(@break) when (@break = @screen-m) {
     .login.container {
         &:extend(.add-clearfix-desktop all);
         .block {
@@ -336,29 +411,11 @@
     .widget {
         clear: both;
     }
-}
 
-//
-//    Mobile
-//--------------------------------------
-.responsive-smaller(@break) when (@break = @break-point-0) {
-    .account {
-        .data.table {
-            &:extend(.table-vertical-mobile all);
-            .col.actions {
-                padding-top: 9px;
-                padding-bottom: 15px;
-                &:before {
-                    &:extend(.visually-hidden-mobile all);
-                }
-            }
-        }
-        .toolbar {
-            .toolbar-amount,
-            .limiter,
-            .pages {
-                margin-bottom: 25px;
-            }
+    .control.captcha-image {
+        white-space: nowrap;
+        .captcha-img {
+            margin: 0 10px 0 0;
         }
     }
 }
diff --git a/app/design/frontend/Magento/blank/Magento_GiftMessage/web/css/source/module.less b/app/design/frontend/Magento/blank/Magento_GiftMessage/web/css/source/module.less
index 43377499ac7f4a247e9155fe939db5fed832d00c..6878cadc3203cef6d91ef8976ef93860120790f9 100644
--- a/app/design/frontend/Magento/blank/Magento_GiftMessage/web/css/source/module.less
+++ b/app/design/frontend/Magento/blank/Magento_GiftMessage/web/css/source/module.less
@@ -25,12 +25,13 @@
 .opc-wrapper {
     .gift-message {
         > legend {
-            margin-left: 0;
-            padding: 0;
+            .font-size(14);
+            font-weight: @font-weight-bold;
+            margin: 20px 0 0;
         }
         .field.choice {
             font-weight: @font-weight-base;
-            margin: 0 0 20px 20px;
+            margin: 0 0 20px;
             &:before {
                 display: none;
             }
@@ -43,10 +44,11 @@
             background: @sidebar-background;
             display: block;
             margin: 20px 0 0;
-            padding: 20px 20px 20px 10px;
-            .order-title {
-                margin-top: 10px;
-                margin-bottom: 0;
+            padding: 20px;
+            .order-title:not(:first-child),
+            .extra-options-container {
+                font-weight: @font-weight-base;
+                margin: 20px 0 0;
             }
             .order-options {
                 margin: 0 0 20px 20px;
@@ -78,12 +80,9 @@
     }
 }
 
-.responsive(@break) when (@break = @break-point-1) {
+.responsive(@break) when (@break = @screen-m) {
     .opc-wrapper {
         .gift-message {
-            .options-items .order-options {
-                margin-left: 45px;
-            }
             .item {
                 border-bottom: @border-width-base solid @border-color-base;
                 margin-bottom: 20px;
@@ -109,11 +108,5 @@
                 display: block;
             }
         }
-        .extra-options-container {
-            .price.box {
-                font-weight: normal;
-                margin-left: 45px;
-            }
-        }
     }
 }
diff --git a/app/design/frontend/Magento/blank/Magento_Multishipping/web/css/source/module.less b/app/design/frontend/Magento/blank/Magento_Multishipping/web/css/source/module.less
index bbc04cd2f03601f6d9157e82c616b4bc7de78875..4ca592d4e99530c3acaeae36bcfa4aa6e8a0a1f8 100644
--- a/app/design/frontend/Magento/blank/Magento_Multishipping/web/css/source/module.less
+++ b/app/design/frontend/Magento/blank/Magento_Multishipping/web/css/source/module.less
@@ -148,7 +148,7 @@
     }
 }
 
-.responsive(@break) when (@break = @break-point-1) {
+.responsive(@break) when (@break = @screen-m) {
     .multicheckout {
         &.form {
             .title {
diff --git a/app/design/frontend/Magento/blank/Magento_Newsletter/web/css/source/module.less b/app/design/frontend/Magento/blank/Magento_Newsletter/web/css/source/module.less
index 7d6f02d9ec84ab78b63126d8b7a7a5206d24fc82..cd575fd59262667adb6878406dba5bfa93e0c68a 100644
--- a/app/design/frontend/Magento/blank/Magento_Newsletter/web/css/source/module.less
+++ b/app/design/frontend/Magento/blank/Magento_Newsletter/web/css/source/module.less
@@ -77,7 +77,7 @@
 //
 //    Desktop
 //--------------------------------------
-.responsive(@break) when (@break = @break-point-1) {
+.responsive(@break) when (@break = @screen-m) {
     .block.newsletter {
         width: 32%;
         .field {
diff --git a/app/design/frontend/Magento/blank/Magento_Paypal/web/css/source/module.less b/app/design/frontend/Magento/blank/Magento_Paypal/web/css/source/module.less
index a577bbb64431080640b30620df57fd670fd1e200..990abb7f1bf637c02c78574cc7f58b609915f83b 100644
--- a/app/design/frontend/Magento/blank/Magento_Paypal/web/css/source/module.less
+++ b/app/design/frontend/Magento/blank/Magento_Paypal/web/css/source/module.less
@@ -25,7 +25,6 @@
 //
 //    PayPal checkout button
 //--------------------------------------
-
 .paypal {
     &.after:after {
         content: "- " attr(data-label) " -";
@@ -42,6 +41,18 @@
     }
 }
 
+.product-info-main,
+.block-minicart {
+     .paypal img {
+         display: block;
+     }
+}
+.product-info-main {
+    img {
+        margin: 0 auto;
+    }
+}
+
 .form-new-agreement {
     .actions-toolbar {
         &:extend(.reset-left-margin all);
diff --git a/app/design/frontend/Magento/blank/Magento_RecurringPayment/web/css/source/module.less b/app/design/frontend/Magento/blank/Magento_RecurringPayment/web/css/source/module.less
new file mode 100644
index 0000000000000000000000000000000000000000..a82b30a271c4c5ab16deb41b2ce1eb4117a55693
--- /dev/null
+++ b/app/design/frontend/Magento/blank/Magento_RecurringPayment/web/css/source/module.less
@@ -0,0 +1,30 @@
+// /**
+// //  * 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
+//  * @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)
+//  */
+
+.payment-schedule {
+    margin: 20px 0 0;
+    .item-content {
+        margin: 0 0 5px;
+    }
+}
diff --git a/app/design/frontend/Magento/blank/Magento_Review/web/css/source/module.less b/app/design/frontend/Magento/blank/Magento_Review/web/css/source/module.less
index 694752b2b22b64ebb6e7088fe9af6030336a5fb2..a3e06509ccd758cd5eda22127bdd2b112c7036f8 100644
--- a/app/design/frontend/Magento/blank/Magento_Review/web/css/source/module.less
+++ b/app/design/frontend/Magento/blank/Magento_Review/web/css/source/module.less
@@ -22,7 +22,6 @@
 //  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 //  */
 
-
 .rating-summary {
     .mixin-rating-summary();
     .rating-result {
@@ -42,7 +41,7 @@
 }
 
 //
-//    Add reviewblock
+//    Add review block
 //--------------------------------------
 .block {
     &.add.review {
@@ -88,10 +87,11 @@
     }
 }
 
-.customer.review.view {
+.customer-review.view {
+    margin-bottom: @indent-base;
     .review.title,
-    .ratings.summary.items,
-    .product.details {
+    .ratings-summary,
+    .product-details {
         margin-bottom: @indent-base;
     }
 }
@@ -127,7 +127,7 @@
 //
 //    Desktop
 //--------------------------------------
-.responsive(@break) when (@break = @break-point-1) {
+.responsive(@break) when (@break = @screen-m) {
     .product-reviews-summary {
         .products.wrapper.list & {
             margin: 0;
@@ -180,3 +180,160 @@
         }
     }
 }
+
+.review-field-ratings {
+    .nested {
+        display: table;
+    }
+    .review-field-rating {
+        display: table-row;
+        .label,
+        .control {
+            display: table-cell;
+            padding-bottom: @indent-s-base;
+            vertical-align: top;
+        }
+        .label {
+            padding-top: 6px;
+            padding-right: @indent-s-base;
+        }
+        .control {
+            padding-top: 2px;
+        }
+    }
+}
+
+//
+//    Review product page
+//--------------------------------------
+.review {
+    &-toolbar {
+        border-top: 1px solid #c9c9c9;
+        margin: 0 0 @indent-base;
+        text-align: center;
+        &:first-child {
+            display: none;
+        }
+        .pages {
+            display: block;
+            text-align: center;
+            border-bottom: 1px solid #c9c9c9;
+            padding: @indent-base 0;
+        }
+        .limiter {
+            display: none;
+        }
+    }
+    &-add {
+        .block-title {
+            display: none;
+        }
+    }
+    &-form {
+        .action.submit.primary {
+            .button-revert-secondary-color();
+        }
+        .actions-toolbar .actions-primary {
+        }
+    }
+    &-fieldset {}
+    .fieldset &-legend.legend {
+        &:extend(.reset-left-margin all);
+        strong {
+            display: block;
+            margin-left: 0;
+        }
+        margin-bottom: @indent-base;
+    }
+    .fieldset &-field-ratings {
+        > .label {
+        }
+    }
+    &-control-vote label:before,
+    &-control-vote:before {
+    }
+    &-field-rating {
+        .label {
+        }
+        .control {
+            margin-top: @indent-s-base;
+            margin-bottom: 1.2*@indent-xl-base;
+        }
+    }
+    &-list {
+        .block-title strong {
+            .heading(h2);
+        }
+        margin-bottom: @indent-l-base;
+    }
+    &-item {
+        padding: @indent-base 0;
+        border-bottom: 1px solid #c9c9c9;
+        margin: 0;
+        .clearer();
+        &:last-child {
+            border-width: 0;
+        }
+    }
+    &-ratings {
+        display: table;
+        max-width: 100%;
+        margin-bottom: @indent-s-base;
+        &:extend(.abstract-rating-summary all);
+    }
+    &-author {
+        display: inline;
+        .review-details-value {
+        }
+    }
+    &-date {
+        .review-details-label {
+        }
+    }
+    &-title {
+        .heading(h3);
+        margin: 0 0 @indent-base;
+    }
+    &-content {
+        margin-bottom: @indent-base;
+    }
+}
+
+//
+//    Desktop
+//--------------------------------------
+.responsive(@break) when (@break = @screen-s) {
+    .review {
+        &-form {
+            max-width: 500px;
+        }
+
+        @review-ratings-left: 280px;
+        &-ratings {
+            max-width: @review-ratings-left - @indent-xl-base;
+            float: left;
+            margin-bottom: 0;
+        }
+        &-ratings ~ &-content,
+        &-ratings ~ &-details {
+            margin-left: @review-ratings-left;
+        }
+
+        @reviews-indent-desktop: 30px;
+        &-toolbar {
+            margin: 0 0 @reviews-indent-desktop;
+            .pages {
+                padding: @reviews-indent-desktop 0;
+            }
+        }
+        .fieldset &-legend.legend {
+            margin-bottom: @reviews-indent-desktop;
+        }
+        &-item {
+            padding: @reviews-indent-desktop 0;
+        }
+        &-title {
+            margin: 0 0 @reviews-indent-desktop;
+        }
+    }
+}
diff --git a/app/design/frontend/Magento/blank/Magento_Sales/web/css/source/module.less b/app/design/frontend/Magento/blank/Magento_Sales/web/css/source/module.less
index dd693905d1179710eb5ac9c81b8a9d23ad48ddd9..f3ceb882267bdb24dfd085b8705fdec31d85f08f 100644
--- a/app/design/frontend/Magento/blank/Magento_Sales/web/css/source/module.less
+++ b/app/design/frontend/Magento/blank/Magento_Sales/web/css/source/module.less
@@ -172,10 +172,98 @@
     }
 }
 
+//
+//    Mobile
+//--------------------------------------
+.responsive-smaller(@break) when (@break = @screen-s) {
+    .account {
+        .order-details-items {
+            .table-order-items {
+                tbody,
+                tfoot {
+                    > tr > td {
+                        border: none;
+                    }
+                }
+                tbody {
+                    tr {
+                        td:first-child {
+                            padding-top: 15px;
+                        }
+                        td:last-child {
+                            padding-bottom: 15px;
+                        }
+                    }
+                }
+                .col {
+                    &.price,
+                    &.subtotal {
+                        .tax,
+                        .incl.tax + .excl.tax,
+                        .weee {
+                            display: inline-block;
+                        }
+                    }
+                    &.name,
+                    &.sku,
+                    &.qty,
+                    &.price,
+                    &.subtotal {
+                        &:before {
+                            content: attr(data-th) ":";
+                            vertical-align: top;
+                        }
+                    }
+                    &.label {
+                        display: none;
+                    }
+                    .items-qty {
+                        display: inline-block;
+                    }
+                    .item.options {
+                        .font-size(12);
+                        margin: 10px 0 0;
+                    }
+                }
+                .options-label + .item-options,
+                .item-options + .item-options {
+                    &:before {
+                        content: attr(data-th) ":";
+                        display: block;
+                        font-weight: bold;
+                    }
+                    .col {
+                        .font-size(12);
+                        padding: 0;
+                        &:first-child {
+                            padding-top: 3px;
+                        }
+                        &:last-child {
+                            padding-bottom: 20px;
+                        }
+                    }
+                }
+            }
+            .action.print {
+                display: none;
+            }
+        }
+        .toolbar {
+            &:extend(.add-clearfix-desktop all);
+            .pages {
+                float: right;
+            }
+            .limiter {
+                clear: both;
+            }
+        }
+    }
+}
+
 //
 //    Desktop
 //--------------------------------------
-.responsive(@break) when (@break = @break-point-1) {
+.responsive(@break) when (@break = @screen-m) {
     .account {
         .page-title {
             .order-actions-toolbar {
@@ -199,21 +287,3 @@
         }
     }
 }
-
-//
-//    Mobile
-//--------------------------------------
-.responsive-smaller(@break) when (@break = @break-point-0) {
-    .account {
-        .order-details-items {
-            .table-order-items {
-                tbody,
-                tfoot {
-                    > tr > td {
-                        border: none;
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/app/design/frontend/Magento/blank/Magento_Sendfriend/web/css/source/module.less b/app/design/frontend/Magento/blank/Magento_Sendfriend/web/css/source/module.less
index a3d7d817800b92856b5b562893ff6dd48d4025f9..b74bffe38025d42e783edb4f0f37267a55e00b07 100644
--- a/app/design/frontend/Magento/blank/Magento_Sendfriend/web/css/source/module.less
+++ b/app/design/frontend/Magento/blank/Magento_Sendfriend/web/css/source/module.less
@@ -28,6 +28,7 @@
 }
 
 .action.mailto.friend {
+    margin-left: -7px;
     .icon-font(
         @_icon-font-content: @icon-envelope,
         @_icon-font-size: 28px,
@@ -44,7 +45,7 @@
 //
 //    Desktop
 //--------------------------------------
-.responsive(@break) when (@break = @break-point-1) {
+.responsive(@break) when (@break = @screen-m) {
     .form.send.friend {
         &:extend(.add-recipients-desktop all);
     }
diff --git a/app/design/frontend/Magento/blank/Magento_Theme/layout/default.xml b/app/design/frontend/Magento/blank/Magento_Theme/layout/default.xml
index e7f75fe1dac5dfd6e9ca8b3fefb8198f8039ce94..cf89503fff6aa698849f08e0b8e09c8e53d5ac7a 100644
--- a/app/design/frontend/Magento/blank/Magento_Theme/layout/default.xml
+++ b/app/design/frontend/Magento/blank/Magento_Theme/layout/default.xml
@@ -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)
- */
+*/
 -->
 <layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../../../../../../../app/code/Magento/Core/etc/layout_single.xsd">
@@ -30,4 +30,42 @@
     </referenceContainer>
     <move element="header.panel" destination="header.panel.wrapper" />
     <move element="top.links" destination="header.panel" after="-" />
+
+    <move element="catalog.topnav" destination="store.menu" before="-" />
+
+    <referenceContainer name="page_top">
+        <block class="Magento\Framework\View\Element\Template" name="navigation.sections" before="-" template="Magento_Theme::html/sections.phtml">
+            <arguments>
+                <argument name="group_name" xsi:type="string">navigation-sections</argument>
+                <argument name="group_css" xsi:type="string">nav-sections</argument>
+            </arguments>
+            <block class="Magento\Framework\View\Element\Template" name="store.menu" group="navigation-sections" template="Magento_Theme::html/container.phtml">
+                <arguments>
+                    <argument name="title" translate="true" xsi:type="string">Menu</argument>
+                </arguments>
+            </block>
+            <block class="Magento\Framework\View\Element\Text" name="store.links" group="navigation-sections" output="1">
+                <arguments>
+                    <argument name="title" translate="true" xsi:type="string">Account</argument>
+                    <argument name="use_force" xsi:type="boolean">true</argument>
+                    <argument name="text" xsi:type="string"><![CDATA[<!-- Account links -->]]></argument>
+                </arguments>
+            </block>
+            <block class="Magento\Framework\View\Element\Template" name="store.settings" group="navigation-sections" template="Magento_Theme::html/container.phtml">
+                <arguments>
+                    <argument name="title" translate="true" xsi:type="string">Settings</argument>
+                </arguments>
+                <block class="Magento\Store\Block\Switcher" name="store.settings.language" template="switch/languages.phtml">
+                    <arguments>
+                        <argument name="id_modifier" xsi:type="string">nav</argument>
+                    </arguments>
+                </block>
+                <block class="Magento\Directory\Block\Currency" name="store.settings.currency" before="store_language" template="currency.phtml">
+                    <arguments>
+                        <argument name="id_modifier" xsi:type="string">nav</argument>
+                    </arguments>
+                </block>
+            </block>
+        </block>
+    </referenceContainer>
 </layout>
diff --git a/app/design/frontend/Magento/blank/Magento_Theme/web/css/source/module.less b/app/design/frontend/Magento/blank/Magento_Theme/web/css/source/module.less
index f4003fdb502284425fd896fec19d1021b02a500b..2d5cf98ca2776fd08b0d27b760921fd94d9cb0c9 100644
--- a/app/design/frontend/Magento/blank/Magento_Theme/web/css/source/module.less
+++ b/app/design/frontend/Magento/blank/Magento_Theme/web/css/source/module.less
@@ -38,6 +38,9 @@
 
 @header-bg-color: false;
 
+@addto-color: @text-color-muted;
+@addto-hover-color: @color-primary;
+
 body {
     .css(background-color, @page-bg-color);
 }
@@ -196,7 +199,7 @@ body {
 //
 //    Desktop
 //--------------------------------------
-.responsive(@break) when (@break = @break-point-1) {
+.responsive(@break) when (@break = @screen-m) {
     .header {
         &.panel {
             > .header.links {
@@ -254,14 +257,6 @@ body {
         }
     }
 
-    .page-wrapper {
-        position: relative;
-        width: 100%;
-        float: right;
-        margin: 0;
-        .transition(margin .3s ease-out 0);
-    }
-
     .footer {
         &.content {
             .block {
diff --git a/app/design/frontend/Magento/blank/Magento_Wishlist/web/css/source/module.less b/app/design/frontend/Magento/blank/Magento_Wishlist/web/css/source/module.less
index fa04146e02100fe5013acb036d633092d5ac76d5..b8b4b04e3b2298a826e335704ed002f8ecd67eed 100644
--- a/app/design/frontend/Magento/blank/Magento_Wishlist/web/css/source/module.less
+++ b/app/design/frontend/Magento/blank/Magento_Wishlist/web/css/source/module.less
@@ -31,7 +31,19 @@
 .product-info-main,
 .block-bundle-summary {
     .action.towishlist {
-        &:extend(.abstract-action-addto all);
+        &:extend(.abstract-action-addto-product all);
+    }
+}
+
+.products.list.items,
+.table-comparison {
+    .action {
+        &.towishlist {
+            &:extend(.abstract-actions-addto-gridlist all);
+            .icon-font-symbol(
+                @icon-wishlist-empty
+            );
+        }
     }
 }
 
diff --git a/app/design/frontend/Magento/blank/composer.json b/app/design/frontend/Magento/blank/composer.json
index 629ed93f41a2f4ff41c67cca836426fc1c3239ac..5542bb6163aeecdeb0017a820cdd146232f6dfc3 100644
--- a/app/design/frontend/Magento/blank/composer.json
+++ b/app/design/frontend/Magento/blank/composer.json
@@ -2,12 +2,12 @@
     "name": "magento/theme-frontend-blank",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-theme",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/design/frontend/Magento/blank/theme.xml b/app/design/frontend/Magento/blank/theme.xml
index 70c8d683829dade35ac07af0a43f3f182ad5856a..314963981afe0bdfb6a443072bfb95350fcdcf6c 100644
--- a/app/design/frontend/Magento/blank/theme.xml
+++ b/app/design/frontend/Magento/blank/theme.xml
@@ -24,7 +24,7 @@
 -->
 <theme xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Config/etc/theme.xsd">
     <title>Magento Blank</title>
-    <version>0.1.0-alpha89</version>
+    <version>0.1.0-alpha90</version>
     <media>
         <preview_image>media/preview.jpg</preview_image>
     </media>
diff --git a/app/design/frontend/Magento/blank/web/css/source/abstract.less b/app/design/frontend/Magento/blank/web/css/source/abstract.less
index 38fc00f5edd91e08955d7dc15260f224a9fa3c6c..3aebfd5c2dd9eec37a8ae65a7ad39828f7411b4b 100644
--- a/app/design/frontend/Magento/blank/web/css/source/abstract.less
+++ b/app/design/frontend/Magento/blank/web/css/source/abstract.less
@@ -71,16 +71,22 @@
     .button-responsive();
 }
 
-.responsive(@break) when (@break = @break-point-1) {
+.responsive(@break) when (@break = @screen-m) {
     .button-desktop {
         width: auto;
     }
 }
 
+.responsive-smaller(@break) when (@break = @screen-m) {
+    .abstract-button-responsive-smaller {
+        .button-responsive();
+    }
+}
+
 //
 //    Blocks in 2 columns
 //--------------------------------------
-.responsive(@break) when (@break = @break-point-1) {
+.responsive(@break) when (@break = @screen-m) {
     .blocks-2columns {
         width: 48.8%;
         &:nth-child(odd) {
@@ -173,7 +179,7 @@
     margin-left: 0;
 }
 
-.responsive(@break) when (@break = @break-point-1) {
+.responsive(@break) when (@break = @screen-m) {
     .reset-left-margin-desktop {
         margin-left: 0;
     }
@@ -196,7 +202,7 @@
 //
 //    Action with icon remove with text for desktop
 //--------------------------------------
-.responsive(@break) when (@break = @break-point-1) {
+.responsive(@break) when (@break = @screen-m) {
     .action-remove-desktop when not (@form-field-type-inline-label-width = false) and not (@form-field-type-inline-label-width = '') {
         top: 6px;
         margin-left: @form-field-type-inline-label-width + 50%;
@@ -243,7 +249,7 @@
 //
 //    Add Recipient for desktop
 //--------------------------------------
-.responsive(@break) when (@break = @break-point-1) {
+.responsive(@break) when (@break = @screen-m) {
     .add-recipients-desktop {
         .recipients {
             .additional {
@@ -258,7 +264,7 @@
 //
 //    Margin for forms
 //--------------------------------------
-.responsive(@break) when (@break = @break-point-1) {
+.responsive(@break) when (@break = @screen-m) {
     .margin-for-forms-desktop when not (@form-field-type-inline-label-width = false) and not (@form-field-type-inline-label-width = '') {
         margin-left: @form-field-type-inline-label-width;
     }
@@ -271,12 +277,18 @@
     .visually-hidden();
 }
 
-.responsive-smaller(@break) when (@break = @break-point-0) {
+.responsive-smaller(@break) when (@break = @screen-s) {
     .visually-hidden-mobile {
         .visually-hidden();
     } 
 }
 
+.responsive-smaller(@break) when (@break = @screen-m) {
+    .visually-hidden-mobile-m {
+        .visually-hidden();
+    }
+}
+
 //
 //    Clearfix
 //--------------------------------------
@@ -284,13 +296,13 @@
     .clearfix();
 }
 
-.responsive(@break) when (@break = @break-point-1) {
+.responsive(@break) when (@break = @screen-m) {
     .add-clearfix-desktop {
         .clearfix();
     }
 }
 
-.responsive-smaller(@break) when (@break = @break-point-0) {
+.responsive-smaller(@break) when (@break = @screen-s) {
     .add-clearfix-mobile {
         .clearfix();
     }
@@ -303,7 +315,7 @@
     .box-sizing();
 }
 
-.responsive(@break) when (@break = @break-point-1) {
+.responsive(@break) when (@break = @screen-m) {
     .add-box-sizing-desktop {
         .box-sizing();
     }
@@ -312,7 +324,7 @@
 //
 //    Revert field type
 //--------------------------------------
-.responsive(@break) when (@break = @break-point-1) {
+.responsive(@break) when (@break = @screen-m) {
     .revert-field-type-desktop {
         .fieldset {
             > .field,
@@ -359,11 +371,23 @@
 //
 //    Action addto
 //--------------------------------------
-.abstract-action-addto {
+.abstract-action-addto-product {
     &:extend(.action-link-button all);
     .button-s();
 }
 
+.abstract-actions-addto-gridlist {
+    .icon-font(
+        @_icon-font-content: '',
+        @_icon-font-size: 29px,
+        @_icon-font-color: @addto-color,
+        @_icon-font-color-hover: @addto-hover-color,
+        @_icon-font-text-hide: true,
+        @_icon-font-vertical-align: middle,
+        @_icon-font-line-height: 24px
+    );
+}
+
 //
 //    Large button
 //--------------------------------------
@@ -405,7 +429,7 @@
 //
 //    Vertical Table
 //--------------------------------------
-.responsive-smaller(@break) when (@break = @break-point-0) {
+.responsive-smaller(@break) when (@break = @screen-m) {
     .table-vertical-mobile {
         .table-responsive();
         tbody > tr {
diff --git a/app/design/frontend/Magento/blank/web/css/source/actions-toolbar.less b/app/design/frontend/Magento/blank/web/css/source/actions-toolbar.less
index 11bf0c1f1496c688f201b443070141b31905137b..629a3748202866e186eb78193116f4151d1b5b16 100644
--- a/app/design/frontend/Magento/blank/web/css/source/actions-toolbar.less
+++ b/app/design/frontend/Magento/blank/web/css/source/actions-toolbar.less
@@ -43,7 +43,7 @@
 //
 //    Desktop
 //--------------------------------------
-.responsive(@break) when (@break = @break-point-1) {
+.responsive(@break) when (@break = @screen-m) {
     .actions-toolbar {
         .actions-toolbar();
         > .primary,
diff --git a/app/design/frontend/Magento/blank/web/css/source/forms.less b/app/design/frontend/Magento/blank/web/css/source/forms.less
index 9b9f437b208766d3dbb4fee34aed33ebeb89feec..6a0b4f72cda7ad71756bdd5597de386a7131226a 100644
--- a/app/design/frontend/Magento/blank/web/css/source/forms.less
+++ b/app/design/frontend/Magento/blank/web/css/source/forms.less
@@ -60,6 +60,13 @@
                 margin-bottom: 0;
             }
         }
+        &.date {
+            .control > input {
+                margin-right: 10px;
+                min-width: 80px;
+                width: 25%;
+            }
+        }
     }
     fieldset.field {
         border: 0;
@@ -71,8 +78,6 @@ div.mage-error[generated] {
     margin-top: 7px;
 }
 
-// TEMP
-
 .field .tooltip {
     .tooltip(right);
     .tooltip-content {
@@ -82,18 +87,21 @@ div.mage-error[generated] {
 }
 
 input:focus ~ .tooltip .tooltip-content,
-select:focus ~ .tooltip .tooltip-content { display: block; }
+select:focus ~ .tooltip .tooltip-content {
+    display: block;
+}
 
 //
 //    Desktop
 //--------------------------------------
-.responsive(@break) when (@break = @break-point-1) {
+.responsive(@break) when (@break = @screen-m) {
     .fieldset {
         .legend {
             &:extend(.margin-for-forms-desktop all);
         }
         > .field {
             .form-field-type-revert();
+            margin: 0 0 29px;
         }
     }
 }
diff --git a/app/design/frontend/Magento/blank/web/css/source/layout.less b/app/design/frontend/Magento/blank/web/css/source/layout.less
index 8e64a62adb6b014a6218ed49c1e695d8a1e61c7f..18434676bc6a6b4217460eb7b64641c6889b5f66 100644
--- a/app/design/frontend/Magento/blank/web/css/source/layout.less
+++ b/app/design/frontend/Magento/blank/web/css/source/layout.less
@@ -25,7 +25,7 @@
 @layout-column-main-sidebar-offset: 2%;
 @layout-column-additional-sidebar-offset: @layout-column-main-sidebar-offset;
 
-.navigation > ul,
+.navigation,
 .breadcrumbs,
 .page-header .header.panel,
 .header.content,
@@ -38,20 +38,6 @@
     padding-right: @layout-width-xs-indent;
 }
 
-.page-wrapper {
-    position: relative;
-    left: 0;
-    -webkit-transition: all .25s ease-out;
-    -moz-transition: all .25s ease-out;
-    transition: all .25s ease-out;
-}
-
-.page-wrapper.open{
-    left: 86%;
-    -webkit-transition: all .25s ease-on;
-    -moz-transition: all .25s ease-out;
-    transition: all .25s ease-out;
-}
 
 .columns {
     #layout-columns();
@@ -59,7 +45,6 @@
         &:extend(.add-box-sizing all);
         .mix-flex-flex(@_basis: 100%);
         .css(padding-bottom, @indent-xl-base);
-        min-height: 300px;
         .mix-flex-order(1);
     }
     .sidebar-main {
@@ -74,27 +59,12 @@
     }
 }
 
-.page-header {
-    .panel.wrapper {
-        position: absolute;
-        top: 0;
-        left: -86%;
-        background: #f5f5f5;
-        height: 100%;
-        width: 86%;
-        -webkit-box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.5);
-        box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.5);
-        .panel.header {
-            padding: 0;
-        }
-    }
-}
 
 //
 //    Desktop
 //--------------------------------------
-.responsive(@break) when (@break = @break-point-1) {
-    .navigation > ul,
+.responsive(@break) when (@break = @screen-m) {
+    .navigation,
     .breadcrumbs,
     .page-header .header.panel,
     .header.content,
@@ -116,6 +86,7 @@
     .column.main {
         #layout-columns > .main();
         &:extend(.add-box-sizing-desktop all);
+        min-height: 300px;
     }
 
     .sidebar-main {
@@ -145,19 +116,7 @@
         }
     }
 
-    .page-header {
-        .panel.wrapper {
-            position: relative;
-            top: 0;
-            left: 0;
-            background: none;
-            height: auto;
-            width: auto;
-            -webkit-box-shadow: none;
-            box-shadow: none;
-            .panel.header {
-                padding: 10px 20px;
-            }
-        }
+    .panel.header {
+        padding: 10px 20px;
     }
 }
diff --git a/app/design/frontend/Magento/blank/web/css/source/navigation.less b/app/design/frontend/Magento/blank/web/css/source/navigation.less
index 3bbc7113641a9c44bb5a994a9409bc44d187962d..d28a20816ea579d3b351cc337e8184f23d96c666 100644
--- a/app/design/frontend/Magento/blank/web/css/source/navigation.less
+++ b/app/design/frontend/Magento/blank/web/css/source/navigation.less
@@ -22,18 +22,18 @@
 //  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 //  */
 
-html.open {
-    overflow: hidden;
+.panel.header {
+    .links,
+    .switcher {
+        display: none;
+    }
 }
 
-body {
-    .css(background-color, @page-bg-color);
-    &.open {
-        overflow: hidden;
-    }
+.nav-sections {
+    .css(background, @navigation-background);
 }
 
-.action.toggle.nav {
+.nav-toggle {
     .icon-font(
         @icon-menu,
         @_icon-font-size: 28px
@@ -48,180 +48,218 @@ body {
     cursor: pointer;
 }
 
-.navigation {
-    .switcher {
-        display: block;
-        margin: 0;
+//
+//    Mobile
+//--------------------------------------
+@active-nav-indent: 54px;
+.responsive-smaller(@break) when (@break = @screen-m) {
+    .navigation {
         padding: 0;
-        &:first-child {
-            padding-bottom: 0;
+        .parent .level-top {
+            position: relative;
+            .icon-font(
+                @_icon-font-content: @icon-down,
+                @_icon-font-size: 42px,
+                @_icon-font-position: after,
+                @_icon-font-display: block
+            );
+            &:after {
+                position: absolute;
+                right: 7px;
+                top: -8px;
+            }
+            &.ui-state-active {
+                .icon-font-symbol(
+                    @_icon-font-content: @icon-up,
+                    @_icon-font-position: after
+                );
+            }
         }
-        .label {
-            display: block;
-            font-weight: @font-weight-base;
-            .font-size(16);
+    }
+    .nav-sections {
+        overflow: auto;
+        position: fixed;
+        top: 0;
+        height: 100%;
+        left: -80%;
+        left: calc(~"-1 * (100% - @{active-nav-indent})");
+        width: 80%;
+        width: calc(~"100% - @{active-nav-indent}");
+        .css(transition, left .3s, 1);
+
+        .switcher {
+            border-top: 1px solid #D1D1D1;
+            margin: 0;
+            font-size: 1.6rem;
             padding: 8px 20px;
-        }
-        .options {
-            display: block;
-            .action.toggle {
-                cursor: pointer;
+            font-weight: 700;
+            .label {
                 display: block;
-                position: relative;
-                padding: 8px 20px;
-                &:extend(.navigation-icon all);
-                &.active:after {
-                    content: @icon-prev;
-                }
+                margin-bottom: @indent-xs-base;
             }
-            ul.dropdown {
-                display: none;
-                li {
-                    a {
-                        display: block;
-                        color: @navigation-level0-item-color;
-                        padding: 8px 20px;
-                        text-decoration: none;
+            &:last-child {
+                    border-bottom: 1px solid #D1D1D1;
+            }
+            &-trigger {
+                strong {
+                    display: inline-block!important;
+                    position: relative;
+                    .icon-font(
+                        @_icon-font-content: @icon-down,
+                        @_icon-font-size: 42px,
+                        @_icon-font-position: after,
+                        @_icon-font-display: block
+                    );
+                    &:after {
+                        position: absolute;
+                        right: -40px;
+                        top: -18px;
                     }
                 }
-            }
-            .ui-dialog {
-                background: none;
-                box-shadow: none;
-                ul.dropdown {
-                    padding: 0;
+                &.active strong {
+                    .icon-font-symbol(
+                        @_icon-font-content: @icon-up,
+                        @_icon-font-position: after
+                    );
                 }
             }
-            &.active {
-                ul {
-                    display: block;
-                }
+            &-dropdown {
+                .list-reset-styles();
+                padding: @indent-s-base 0;
             }
         }
-    }
-    &.active {
-        > .content {
-            display: block;
-        }
-    }
 
-    .header.links {
-        padding: 10px 20px;
-        li {
-            display: block;
-            margin: 0;
-            a {
+        .header.links {
+            .list-reset-styles();
+            li {
+                border-top: 1px solid #D1D1D1;
+                margin: 0;
+                font-size: 1.6rem;
+                &.greet.welcome {
+                    padding: 8px 20px;
+                    font-weight: 700;
+                }
+                &:last-child {
+                    border-bottom: 1px solid #D1D1D1;
+                }
+            }
+            a, a:hover
+            {
                 display: block;
-                line-height: 35px;
+                padding: 8px 20px;
+                font-weight: 700;
                 .css(color, @navigation-level0-item-color);
-            }
-            &.welcome {
-                line-height: 35px;
+                .css(text-decoration, @navigation-level0-item-text-decoration);
             }
         }
     }
 
-    .nav {
-        .parent {
-            > a {
-                position: relative;
-                &:extend(.navigation-icon all);
-                &.action.back:after {
-                    content: @icon-prev;
-                }
-            }
+    .nav-before-open {
+        height: 100%;
+        width: 100%;
+        .page-wrapper {
+            height:100%;
+            overflow: hidden;
+            position: relative;
+            left: 0;
+            .css(transition, left .3s, 1);
+        }
+        body {
+            overflow: hidden;
+            height: 100%;
+            width: 100%;
+            position: relative;
         }
     }
-}
-
-.navigation-tabs {
-    .data-accordion(
-        @_accordion-control-color: #333,
-        @_accordion-control-color-visited: #333,
-        @_accordion-control-color-hover: #333,
-        @_accordion-control-color-active: #333,
-        @_accordion-control-padding-left: 10px,
-        @_accordion-control-padding-right: 20px,
-        @_accordion-control-height: 45px,
-        @_accordion-control-line-height: 45px,
-        @_accordion-control-bg: #fff,
-        @_accordion-content-border: none,
-        @_accordion-control-border-top: none,
-        @_accordion-control-bg-active: #fff,
-        @_accordion-content-padding: 0,
-        @_accordion-content-bg: transparent,
-        @_accordion-control-margin-bottom: 0,
-        @_accordion-content-margin: 0
-    );
-    .item.title {
-        > .switch {
-            .icon-font(
-                 @_icon-font-content: @icon-down,
-                 @_icon-font-size: 36px
-             );
-            display: block;
+    .nav-open {
+        .page-wrapper {
+            left: 80%;
+            left: calc(~"100% - @{active-nav-indent}");
         }
-        &.active {
-            > .switch:before {
-                content: @icon-up
+        .nav-sections {
+            left: 0;
+            z-index: 99;
+            @_shadow:  0 0 5px 0 rgba(50, 50, 50, 0.75);
+            .css(box-shadow, @_shadow, 1);
+        }
+        .nav-toggle {
+            &:after{
+                display: block;
+                content: "";
+                width: 100%;
+                z-index: 1;
+                position: fixed;
+                height: 100%;
+                top: 0;
+                right:0;
+                background: rgba(0,0,0,0.01);
             }
         }
     }
-    .item.content {
-        .css(border-bottom, @tab-content-border);
-        .nav > .level0:first-child {
-            border-top: none;
+    .nav-sections {
+        &-items {
+            .clearfix();
+            position: relative;
+            z-index: 1;
+        }
+        &-item-title {
+            float: left;
+            width: 33.33%;
+            text-align: center;
+            border: solid darken(@navigation-background,10%);
+            border-width: 0 0 1px 1px;
+            .box-sizing();
+            padding-top: 24px;
+            height: 71px;
+            background: darken(@navigation-background,5%);
+            &.active {
+                background: transparent;
+                border-bottom: 0;
+            }
+        }
+        &-item-content {
+            .box-sizing();
+            .clearfix();
+            float: right;
+            margin-top: 71px;
+            margin-left: -100%;
+            width: 100%;
+            &.active {
+                display: block;
+            }
+            padding: @indent-m-base 0;
         }
     }
+    .main-navigation();
 }
 
-.main-navigation();
-.main-navigation-desktop();
-
 //
 //    Desktop
 //--------------------------------------
-.responsive(@break) when (@break = @break-point-1) {
-    html.open {
-        overflow: inherit;
+.responsive(@break) when (@break = @screen-m) {
+    .nav-toggle {
+        display: none;
     }
-    body {
-        &.open {
-            overflow: inherit;
+    .nav-sections {
+        margin-bottom: @indent-m-base;
+        &-item-title {
+            display: none;
         }
-    }
-    .action.toggle.nav {
-        display: none;  
-    }
-    .navigation {
-        margin-bottom: 30px;
-        padding-left: 20px;
-        padding-right: 20px;
-        > ul > .level0 {
-            > a,
-            .action.back > a {
-                text-transform: uppercase;
-            }
+        &-item-content {
+            display: block!important;
         }
-        .parent.more {
-            .parent {
-                > .submenu {
-                    position: relative;
-                    margin-top: 0;
-                    ul {
-                        margin: 0;
-                        padding-top: 0;
-                        padding-bottom: 0;
-                        border: none;
-                        box-shadow: none;
-                        background: transparent;
-                        &:after,
-                        &:before {
-                            display: none;
-                        }
-                    }
-                }
-            }
+        &-item-content > * {
+            display: none;
+        }
+        &-item-content > .navigation {
+            display: block;
+        }
+    }
+    .main-navigation-desktop();
+    .panel.header {
+        .links,
+        .switcher {
+            display: inline-block;
         }
     }
 }
diff --git a/app/design/frontend/Magento/blank/web/css/source/sections.less b/app/design/frontend/Magento/blank/web/css/source/sections.less
index a30483dfbb9225f6f861660df935980d5796c646..709be6f642508523ca1d32a48fc2be853af3fc9a 100644
--- a/app/design/frontend/Magento/blank/web/css/source/sections.less
+++ b/app/design/frontend/Magento/blank/web/css/source/sections.less
@@ -30,7 +30,7 @@
 //
 //    Desktop
 //--------------------------------------
-.responsive(@break) when (@break = @break-point-1) {
+.responsive(@break) when (@break = @screen-m) {
     .product.data.items {
         .data-tabs(
             @_tab-content-border-top-status: true
@@ -38,12 +38,11 @@
     }
 }
 
-@media only screen
-and (max-width : @break-point-1) {
+@media only screen and (max-width: @screen-m) {
     .product.data.items {
         .data-accordion();
         .data.item {
-        	display: block;
+            display: block;
         }
     }
 }
diff --git a/app/design/frontend/Magento/blank/web/css/source/tables.less b/app/design/frontend/Magento/blank/web/css/source/tables.less
index 91e66d34923274baf1edeff84822d5e1b3fc146e..2f4d38a359f6d6d39efaa93faf5c00eda012d577 100644
--- a/app/design/frontend/Magento/blank/web/css/source/tables.less
+++ b/app/design/frontend/Magento/blank/web/css/source/tables.less
@@ -23,21 +23,27 @@
 //  */
 
 .table-wrapper {
-    .table-overflow();
-    position: relative; // to hide unnecessary horizontal scrollbar in Safari
     > table {
         .table-caption(@_table-caption-hide: true);
     }
     margin-bottom: @indent-base;
 }
 
+//
+//    Mobile
+//--------------------------------------
+.responsive-smaller(@break) when (@break = @screen-m) {
+    .table-wrapper {
+        .table-overflow();
+        position: relative; // to hide unnecessary horizontal scrollbar in Safari
+    }
+}
+
 //
 //    Desktop
 //--------------------------------------
-.responsive(@break) when (@break = @break-point-1) {
+.responsive(@break) when (@break = @screen-m) {
     .table-wrapper {
-        overflow-y: visible;
-        overflow-x: visible;
         > table {
             > thead,
             > tbody,
diff --git a/app/design/frontend/Magento/blank/web/css/source/typography.less b/app/design/frontend/Magento/blank/web/css/source/typography.less
index bd6a35d8c19cff7d3a47377cf6bd5210f337c5c4..6f8d309709cdfe44640915ee8ae468df3612c9b2 100644
--- a/app/design/frontend/Magento/blank/web/css/source/typography.less
+++ b/app/design/frontend/Magento/blank/web/css/source/typography.less
@@ -56,7 +56,7 @@
 //
 //    Desktop
 //--------------------------------------
-.responsive(@break) when (@break = @break-point-1) {
+.responsive(@break) when (@break = @screen-m) {
     h1 {
         font-size: @h1-font-size-desktop;
     }
diff --git a/app/design/frontend/Magento/blank/web/js/navigation-menu.js b/app/design/frontend/Magento/blank/web/js/navigation-menu.js
index 43028888f9959250052974c8b0ca588c111c76c3..764371a9aa7a8a26d01b28e9762db1ac4c1742bb 100644
--- a/app/design/frontend/Magento/blank/web/js/navigation-menu.js
+++ b/app/design/frontend/Magento/blank/web/js/navigation-menu.js
@@ -30,7 +30,6 @@ define([
     "mage/terms"
 ],function($) {
     'use strict';
-
     $.widget('mage.navigationMenu', {
         options: {
             itemsContainer: '> ul',
@@ -314,7 +313,7 @@ define([
             mainContainer: 'body',
             pageWrapper: '.page-wrapper',
             openedMenuClass: 'opened',
-            toggleActionPlaceholder: '.block.search',
+            toggleActionPlaceholder: '.block-search',
             itemWithSubmenu: 'li.parent',
             titleWithSubmenu: 'li.parent > a',
             submenu: 'li.parent > .submenu',
diff --git a/app/design/frontend/Magento/blank/web/js/theme.js b/app/design/frontend/Magento/blank/web/js/theme.js
index 8bd0083909d4963daa76b2ac884957b5519f74a2..ac65a67ce498c846390cbdeb8daa362f9ebd70cb 100644
--- a/app/design/frontend/Magento/blank/web/js/theme.js
+++ b/app/design/frontend/Magento/blank/web/js/theme.js
@@ -27,6 +27,7 @@ define([
     'use strict';
 
     $(function() {
+
         if ($('body').hasClass('checkout-cart-index')) {
             if ($('#co-shipping-method-form .fieldset.rates').length > 0 && $('#co-shipping-method-form .fieldset.rates :checked').length === 0 ) {
                 $("#block-shipping").on("collapsiblecreate" ,function() {
@@ -39,6 +40,8 @@ define([
                 container: '.cart-container'
             });
         }
+
+        $( ".panel.header > .header.links" ).clone().appendTo( "#store\\.links" );
     });
 
 });
diff --git a/app/design/frontend/Magento/plushe/composer.json b/app/design/frontend/Magento/plushe/composer.json
index c4afa8135cecd9d730d247c142d434c3fc46bfd5..1e26263548734e627123d1269318850eee1db2f6 100644
--- a/app/design/frontend/Magento/plushe/composer.json
+++ b/app/design/frontend/Magento/plushe/composer.json
@@ -2,13 +2,13 @@
     "name": "magento/theme-frontend-plushe",
     "description": "N/A",
     "require": {
-        "php": "5.4.*|5.5.*",
-        "magento/theme-frontend-blank": "0.1.0-alpha89",
-        "magento/framework": "0.1.0-alpha89",
+        "php": "~5.4.11|~5.5.0",
+        "magento/theme-frontend-blank": "0.1.0-alpha90",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-theme",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "extra": {
         "map": [
             [
diff --git a/app/design/frontend/Magento/plushe/theme.xml b/app/design/frontend/Magento/plushe/theme.xml
index 9608883c3430dc6aaf6fa53509076f5db27a2045..b97568f87d759bc495abfd4fbba649c293d173f8 100644
--- a/app/design/frontend/Magento/plushe/theme.xml
+++ b/app/design/frontend/Magento/plushe/theme.xml
@@ -24,7 +24,7 @@
 -->
 <theme xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Config/etc/theme.xsd">
     <title>Magento Plushe</title>
-    <version>0.1.0-alpha89</version>
+    <version>0.1.0-alpha90</version>
     <parent>Magento/blank</parent>
     <media>
         <preview_image>media/preview.jpg</preview_image>
diff --git a/app/design/install/Magento/basic/theme.xml b/app/design/install/Magento/basic/theme.xml
index 29222ce975316922eb7b41cb4674b922f4fd690a..78050dd98f95a5105dbffcb5102b7aa943a4dc82 100644
--- a/app/design/install/Magento/basic/theme.xml
+++ b/app/design/install/Magento/basic/theme.xml
@@ -24,5 +24,5 @@
 -->
 <theme xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Config/etc/theme.xsd">
     <title>Magento Basic</title>
-    <version>0.1.0-alpha89</version>
+    <version>0.1.0-alpha90</version>
 </theme>
diff --git a/app/etc/di.xml b/app/etc/di.xml
index ce52a337e5ef3bc1d923bb7f99ad580d9905465b..7ac6f2a8fe909cc578bfc21335c3ac2ae05d999b 100644
--- a/app/etc/di.xml
+++ b/app/etc/di.xml
@@ -45,6 +45,7 @@
         </arguments>
     </type>
     <preference for="Magento\Framework\Locale\ConfigInterface" type="Magento\Framework\Locale\Config" />
+    <preference for="Magento\Framework\Notification\NotifierInterface" type="Magento\Framework\Notification\NotifierPool" />
     <preference for="Magento\Framework\UrlInterface" type="Magento\Framework\Url" />
     <preference for="Magento\Framework\Data\Collection\Db\FetchStrategyInterface" type="Magento\Framework\Data\Collection\Db\FetchStrategy\Query" />
     <preference for="Magento\Framework\Config\ScopeInterface" type="Magento\Framework\Config\Scope" />
@@ -413,4 +414,25 @@
         </arguments>
     </type>
     <type name="Magento\Framework\View\Layout\ScheduledStructure" shared="false" />
+
+
+    <virtualType name="Magento\Framework\Search\Config\Reader\Filesystem" type="Magento\Framework\Config\Reader\Filesystem">
+        <arguments>
+            <argument name="fileName" xsi:type="string">search_request.xml</argument>
+            <argument name="schemaLocator" xsi:type="object">Magento\Framework\Search\Request\Config\SchemaLocator</argument>
+            <argument name="converter" xsi:type="object">Magento\Framework\Search\Request\Config\Converter</argument>
+            <argument name="idAttributes" xsi:type="array">
+                <item name="/requests/request" xsi:type="string">@name</item>
+                <item name="/requests/request/queries/query" xsi:type="string">@name</item>
+                <item name="/requests/request/filters/filter" xsi:type="string">@name</item>
+                <item name="/requests/request/aggregation/bucket" xsi:type="string">@name</item>
+            </argument>
+        </arguments>
+    </virtualType>
+
+    <type name="Magento\Framework\Search\Request\Config">
+        <arguments>
+            <argument name="reader" xsi:type="object">Magento\Framework\Search\Config\Reader\Filesystem</argument>
+        </arguments>
+    </type>
 </config>
diff --git a/app/etc/vendor_path.php b/app/etc/vendor_path.php
new file mode 100644
index 0000000000000000000000000000000000000000..792612edfa4e9ca7d6377630e8dc0e80d50bd6a5
--- /dev/null
+++ b/app/etc/vendor_path.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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)
+ */
+
+/**
+ * Path to Composer vendor directory
+ */
+return 'vendor';
diff --git a/app/i18n/magento/de_de/composer.json b/app/i18n/magento/de_de/composer.json
index 369fff120500cda91586750b605c136c89839aa0..f15bf8e8c62823e36536c9c13099d6114e974acd 100644
--- a/app/i18n/magento/de_de/composer.json
+++ b/app/i18n/magento/de_de/composer.json
@@ -1,9 +1,9 @@
 {
     "name": "magento/language-de_de",
     "description": "German (Germany) language",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "require": {
-        "magento/framework": "0.1.0-alpha89",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-language",
diff --git a/app/i18n/magento/en_us/composer.json b/app/i18n/magento/en_us/composer.json
index 4de155f58c0e9d2f64037f313b7cdfa4d5c7e90b..4353c63040f14387acd6932b0d6f8863676c8c6c 100644
--- a/app/i18n/magento/en_us/composer.json
+++ b/app/i18n/magento/en_us/composer.json
@@ -1,9 +1,9 @@
 {
     "name": "magento/language-en_us",
     "description": "English (United States) language",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "require": {
-        "magento/framework": "0.1.0-alpha89",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-language",
diff --git a/app/i18n/magento/es_es/composer.json b/app/i18n/magento/es_es/composer.json
index bffb5ff0a5693bbde44c37ed28cc3c7220eb77fa..0051cd143cf09d1a9f1813646863772a76c4db99 100644
--- a/app/i18n/magento/es_es/composer.json
+++ b/app/i18n/magento/es_es/composer.json
@@ -1,9 +1,9 @@
 {
     "name": "magento/language-es_es",
     "description": "Spanish (Spain) language",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "require": {
-        "magento/framework": "0.1.0-alpha89",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-language",
diff --git a/app/i18n/magento/fr_fr/composer.json b/app/i18n/magento/fr_fr/composer.json
index 84b0844846783d46f3d8054e060d83a0819123cd..7ec67b4fe3761e156e137d2148733d3a7c4eae96 100644
--- a/app/i18n/magento/fr_fr/composer.json
+++ b/app/i18n/magento/fr_fr/composer.json
@@ -1,9 +1,9 @@
 {
     "name": "magento/language-fr_fr",
     "description": "French (France) language",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "require": {
-        "magento/framework": "0.1.0-alpha89",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-language",
diff --git a/app/i18n/magento/nl_nl/composer.json b/app/i18n/magento/nl_nl/composer.json
index e7cf886210a4e0e4f32954c03f45992ba4e9ba87..3b2dc8f8dace12cc4787169d61e411e7f705c3e9 100644
--- a/app/i18n/magento/nl_nl/composer.json
+++ b/app/i18n/magento/nl_nl/composer.json
@@ -1,9 +1,9 @@
 {
     "name": "magento/language-nl_nl",
     "description": "Dutch (Netherlands) language",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "require": {
-        "magento/framework": "0.1.0-alpha89",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-language",
diff --git a/app/i18n/magento/pt_br/composer.json b/app/i18n/magento/pt_br/composer.json
index 9c92457ab85b6566553c8481b827954dbd697fb6..fd9d2f8b4fc2999249d4e180291a85e0b9dd748b 100644
--- a/app/i18n/magento/pt_br/composer.json
+++ b/app/i18n/magento/pt_br/composer.json
@@ -1,9 +1,9 @@
 {
     "name": "magento/language-pt_br",
     "description": "Portuguese (Brazil) language",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "require": {
-        "magento/framework": "0.1.0-alpha89",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-language",
diff --git a/app/i18n/magento/zh_cn/composer.json b/app/i18n/magento/zh_cn/composer.json
index 493ff18be0ae8a7e42014aedb8f513f42f7463bb..c92f93e623498ff6ffb45cf61de9870f53ea04cd 100644
--- a/app/i18n/magento/zh_cn/composer.json
+++ b/app/i18n/magento/zh_cn/composer.json
@@ -1,9 +1,9 @@
 {
     "name": "magento/language-zh_cn",
     "description": "Chinese (China) language",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "require": {
-        "magento/framework": "0.1.0-alpha89",
+        "magento/framework": "0.1.0-alpha90",
         "magento/magento-composer-installer": "*"
     },
     "type": "magento2-language",
diff --git a/composer.json b/composer.json
index 2efe02a4907e9d15f60ad7573bc3426556d999d3..f1577e2f35705ea76bebcbc21d11e4d129b9ced0 100644
--- a/composer.json
+++ b/composer.json
@@ -1,14 +1,181 @@
 {
-    "name": "magento/community-edition",
-    "description": "eCommerce Platform for Growth (Community Edition)",
-    "license": ["OSL-3.0", "AFL-3.0"],
+    "name": "magento/project-community-edition",
+    "description": "Magento project (Community Edition)",
+    "type": "project",
+    "version": "0.1.0-alpha90",
     "require": {
-        "php": ">=5.4.0"
+        "php": "~5.4.11|~5.5.0"
     },
-    "autoload": {
-        "psr-0": {
-            "": ["app/code", "lib/internal"]
+    "require-dev": {
+        "phpunit/phpunit": "4.1.*"
+    },
+    "replace": {
+        "magento/module-admin-notification": "self.version",
+        "magento/module-authorization": "self.version",
+        "magento/module-authorizenet": "self.version",
+        "magento/module-backend": "self.version",
+        "magento/module-backup": "self.version",
+        "magento/module-bundle": "self.version",
+        "magento/module-captcha": "self.version",
+        "magento/module-catalog": "self.version",
+        "magento/module-catalog-import-export": "self.version",
+        "magento/module-catalog-inventory": "self.version",
+        "magento/module-catalog-rule": "self.version",
+        "magento/module-catalog-search": "self.version",
+        "magento/module-catalog-url-rewrite": "self.version",
+        "magento/module-centinel": "self.version",
+        "magento/module-checkout": "self.version",
+        "magento/module-checkout-agreements": "self.version",
+        "magento/module-cms": "self.version",
+        "magento/module-cms-url-rewrite": "self.version",
+        "magento/module-configurable-import-export": "self.version",
+        "magento/module-configurable-product": "self.version",
+        "magento/module-contact": "self.version",
+        "magento/module-core": "self.version",
+        "magento/module-cron": "self.version",
+        "magento/module-currency-symbol": "self.version",
+        "magento/module-customer": "self.version",
+        "magento/module-customer-import-export": "self.version",
+        "magento/module-design-editor": "self.version",
+        "magento/module-dhl": "self.version",
+        "magento/module-directory": "self.version",
+        "magento/module-downloadable": "self.version",
+        "magento/module-eav": "self.version",
+        "magento/module-email": "self.version",
+        "magento/module-fedex": "self.version",
+        "magento/module-gift-message": "self.version",
+        "magento/module-google-adwords": "self.version",
+        "magento/module-google-analytics": "self.version",
+        "magento/module-google-optimizer": "self.version",
+        "magento/module-google-shopping": "self.version",
+        "magento/module-grouped-import-export": "self.version",
+        "magento/module-grouped-product": "self.version",
+        "magento/module-import-export": "self.version",
+        "magento/module-index": "self.version",
+        "magento/module-indexer": "self.version",
+        "magento/module-install": "self.version",
+        "magento/module-integration": "self.version",
+        "magento/module-layered-navigation": "self.version",
+        "magento/module-log": "self.version",
+        "magento/module-multishipping": "self.version",
+        "magento/module-newsletter": "self.version",
+        "magento/module-offline-payments": "self.version",
+        "magento/module-offline-shipping": "self.version",
+        "magento/module-ogone": "self.version",
+        "magento/module-page-cache": "self.version",
+        "magento/module-pay-pal-recurring-payment": "self.version",
+        "magento/module-payment": "self.version",
+        "magento/module-paypal": "self.version",
+        "magento/module-persistent": "self.version",
+        "magento/module-product-alert": "self.version",
+        "magento/module-recurring-payment": "self.version",
+        "magento/module-reports": "self.version",
+        "magento/module-require-js": "self.version",
+        "magento/module-review": "self.version",
+        "magento/module-rss": "self.version",
+        "magento/module-rule": "self.version",
+        "magento/module-sales": "self.version",
+        "magento/module-sales-rule": "self.version",
+        "magento/module-sendfriend": "self.version",
+        "magento/module-shipping": "self.version",
+        "magento/module-sitemap": "self.version",
+        "magento/module-store": "self.version",
+        "magento/module-tax": "self.version",
+        "magento/module-theme": "self.version",
+        "magento/module-translation": "self.version",
+        "magento/module-ups": "self.version",
+        "magento/module-url-redirect": "self.version",
+        "magento/module-url-rewrite": "self.version",
+        "magento/module-user": "self.version",
+        "magento/module-usps": "self.version",
+        "magento/module-webapi": "self.version",
+        "magento/module-weee": "self.version",
+        "magento/module-widget": "self.version",
+        "magento/module-wishlist": "self.version",
+        "magento/theme-adminhtml-backend": "self.version",
+        "magento/theme-frontend-blank": "self.version",
+        "magento/theme-frontend-plushe": "self.version",
+        "magento/language-de_de": "self.version",
+        "magento/language-en_us": "self.version",
+        "magento/language-es_es": "self.version",
+        "magento/language-fr_fr": "self.version",
+        "magento/language-nl_nl": "self.version",
+        "magento/language-pt_br": "self.version",
+        "magento/language-zh_cn": "self.version",
+        "magento/framework": "self.version",
+        "zendframework/zend-eventmanager": "2.0.3",
+        "zendframework/zend-stdlib": "2.0.3",
+        "zendframework/zend-di": "2.0.3",
+        "zendframework/zend-escaper": "2.0.3",
+        "zendframework/zend-i18n": "2.0.3",
+        "zendframework/zend-server": "2.0.3",
+        "zendframework/zend-soap": "2.0.3",
+        "zendframework/zend-uri": "2.0.3",
+        "zendframework/zend-validator": "2.0.3",
+        "zendframework/zend-servicemanager": "2.0.3",
+        "zendframework/zend-code": "2.0.3",
+        "zendframework/zendframework1": "1.12.0",
+        "oyejorge/less.php": "1.7.0",
+        "symfony/yaml": "2.3.x-dev",
+        "trentrichardson/jquery-timepicker-addon": "1.4.3",
+        "components/handlebars.js": "1.3.0",
+        "colinmollenhour/cache-backend-redis": "dev-master#193d377b7fb2e88595578b282fa01a62d1185abc",
+        "colinmollenhour/credis": "dev-master#f07bbfd4117294f462f0fb19c49221d350bf396f",
+        "linkorb/jsmin-php": "1.1.2",
+        "pear/mail_mime-decode": "1.48",
+        "phpseclib/phpseclib": "0.2.1",
+        "components/jquery": "1.11.0",
+        "blueimp/jquery-file-upload": "5.6.14",
+        "components/jqueryui": "1.10.4",
+        "twbs/bootstrap": "3.1.0",
+        "tinymce/tinymce": "3.4.7"
+    },
+    "extra": {
+        "component_paths": {
+            "zendframework/zend-eventmanager": "lib/internal/Zend/EventManager",
+            "zendframework/zend-stdlib": "lib/internal/Zend/Stdlib",
+            "zendframework/zend-di": "lib/internal/Zend/Di",
+            "zendframework/zend-escaper": "lib/internal/Zend/Escaper",
+            "zendframework/zend-i18n": "lib/internal/Zend/I18n",
+            "zendframework/zend-server": "lib/internal/Zend/Server",
+            "zendframework/zend-soap": "lib/internal/Zend/Soap",
+            "zendframework/zend-uri": "lib/internal/Zend/Uri",
+            "zendframework/zend-validator": "lib/internal/Zend/Validator",
+            "zendframework/zend-code": "lib/internal/Zend/Code",
+            "zendframework/zendframework1": [
+                "lib/internal/Zend",
+                "app/code/Zend"
+            ],
+            "oyejorge/less.php": "lib/internal/Less",
+            "symfony/yaml": "lib/internal/Symfony/Component/Yaml",
+            "trentrichardson/jquery-timepicker-addon": "lib/web/jquery/jquery-ui-timepicker-addon.js",
+            "components/handlebars.js": "lib/web/jquery/handlebars",
+            "colinmollenhour/cache-backend-redis": "lib/internal/Cm/Cache/Backend/Redis.php",
+            "colinmollenhour/credis": "lib/internal/Credis",
+            "linkorb/jsmin-php": "lib/internal/JSMin",
+            "pear/mail_mime-decode": "lib/internal/PEAR/Mail",
+            "phpseclib/phpseclib": "lib/internal/phpseclib",
+            "components/jquery": [
+                "lib/web/jquery/jquery.js",
+                "lib/web/jquery/jquery.min.js",
+                "lib/web/jquery/jquery-migrate.js",
+                "lib/web/jquery/jquery-migrate.min.js"
+            ],
+            "blueimp/jquery-file-upload": "lib/web/jquery/fileUploader",
+            "components/jqueryui": [
+                "lib/web/jquery/jquery-ui.js",
+                "lib/web/jquery/jquery-ui.min.js"
+            ],
+            "twbs/bootstrap": [
+                "lib/web/jquery/jquery.tabs.js",
+                "lib/web/jquery/jquery.popups.js",
+                "lib/web/jquery/bootstrap-carousel"
+            ],
+            "tinymce/tinymce": "lib/web/tiny_mce"
         }
     },
-    "minimum-stability": "dev"
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ]
 }
diff --git a/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/Grid.php b/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/Grid.php
index 0a4f03536e7a10c020a04bda6e54cb4e61518423..9df2043bbad95c04abbc5a680d3efbd676b6b3f6 100644
--- a/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/Grid.php
+++ b/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/Grid.php
@@ -263,7 +263,7 @@ abstract class Grid extends Block
      * Perform selected massaction over checked items
      *
      * @param array $items
-     * @param array|string $action
+     * @param array|string $action [array -> key = value from first select; value => value from subselect]
      * @param bool $acceptAlert [optional]
      * @param string $massActionSelection [optional]
      * @return void
diff --git a/dev/tests/functional/tests/app/Magento/Bundle/Test/Page/Product/CatalogProductView.php b/dev/tests/functional/tests/app/Magento/Bundle/Test/Page/Product/CatalogProductView.php
index 455f7dbe322c662f4b8eb42bf89ceab2751e069a..bf983be138617176fb903a9dab2f0ccb0ba80daf 100644
--- a/dev/tests/functional/tests/app/Magento/Bundle/Test/Page/Product/CatalogProductView.php
+++ b/dev/tests/functional/tests/app/Magento/Bundle/Test/Page/Product/CatalogProductView.php
@@ -34,25 +34,16 @@ class CatalogProductView extends ParentCatalogProductView
 {
     const MCA = 'bundle/catalog/product/view';
 
-    /**
-     * Custom constructor
-     *
-     * @return void
-     */
-    protected function _init()
-    {
-        $this->_blocks['bundleViewBlock'] = [
+    protected $_blocks = [
+        'bundleViewBlock' => [
             'name' => 'bundleViewBlock',
             'class' => 'Magento\Bundle\Test\Block\Catalog\Product\View',
             'locator' => '.bundle-options-container',
             'strategy' => 'css selector',
-        ];
-        parent::_init();
-    }
+        ],
+    ];
 
     /**
-     * Bundle block on frontend
-     *
      * @return \Magento\Bundle\Test\Block\Catalog\Product\View
      */
     public function getBundleViewBlock()
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/View.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/View.php
index 4c91657e1a66da780b990d10bc73967a6cdbf086..7c077faa5f15d2f7bfb207668f47b83fe8290020 100755
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/View.php
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/View.php
@@ -40,6 +40,13 @@ use Magento\Catalog\Test\Fixture\ConfigurableProduct;
  */
 class View extends Block
 {
+    /**
+     * XPath selector for tab
+     *
+     * @var string
+     */
+    protected $tabSelector = './/div[@data-role="collapsible" and a[contains(text(),"%s")]]';
+
     /**
      * Custom options CSS selector
      *
@@ -166,6 +173,13 @@ class View extends Block
      */
     protected $clickAddToCompare = '.action.tocompare';
 
+    /**
+     * "Add to Wishlist" button
+     *
+     * @var string
+     */
+    protected $addToWishlist = '[data-action="add-to-wishlist"]';
+
     /**
      * Get bundle options block
      *
@@ -344,7 +358,7 @@ class View extends Block
      */
     public function getProductOptions()
     {
-        $options = array();
+        $options = [];
         for ($i = 2; $i <= 3; $i++) {
             $options[] = $this->_rootElement->find(".super-attribute-select option:nth-child({$i})")->getText();
         }
@@ -495,4 +509,25 @@ class View extends Block
     {
         $this->_rootElement->find($this->clickAddToCompare, Locator::SELECTOR_CSS)->click();
     }
+
+    /**
+     * Click "Add to Wishlist" button
+     *
+     * @return void
+     */
+    public function addToWishlist()
+    {
+        $this->_rootElement->find($this->addToWishlist, Locator::SELECTOR_CSS)->click();
+    }
+
+    /**
+     * Select tab on the product page
+     *
+     * @param string $name
+     * @return void
+     */
+    public function selectTab($name)
+    {
+        $this->_rootElement->find(sprintf($this->tabSelector, $name), Locator::SELECTOR_XPATH)->click();
+    }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductCompareItemsLinkIsAbsent.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductCompareItemsLinkIsAbsent.php
index 6cdcee88fe27aacfdd06334b2befbc57e3f50309..e3cdeb7c79032942819111f077f1e13261c04fb4 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductCompareItemsLinkIsAbsent.php
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductCompareItemsLinkIsAbsent.php
@@ -48,7 +48,7 @@ class AssertProductCompareItemsLinkIsAbsent extends AbstractConstraint
     public function processAssert(CmsIndex $cmsIndex)
     {
         \PHPUnit_Framework_Assert::assertFalse(
-            $cmsIndex->getLinksBlock()->getQtyInCompareList(),
+            $cmsIndex->getLinksBlock()->isLinkVisible("Compare Products"),
             'The link "Compare Products..." is visible at the top of page.'
         );
     }
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Fixture/CatalogProductSimple/TaxClass.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Fixture/CatalogProductSimple/TaxClass.php
index 1783fb091d4e5aec4a66b820d4da528331b65173..d29a96ea5b9135836779cbc451e27140e626102a 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Fixture/CatalogProductSimple/TaxClass.php
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Fixture/CatalogProductSimple/TaxClass.php
@@ -24,8 +24,12 @@
 
 namespace Magento\Catalog\Test\Fixture\CatalogProductSimple;
 
+use Mtf\System\Config;
 use Mtf\Fixture\FixtureFactory;
 use Mtf\Fixture\FixtureInterface;
+use Mtf\Util\Protocol\CurlInterface;
+use Mtf\Util\Protocol\CurlTransport;
+use Mtf\Util\Protocol\CurlTransport\BackendDecorator;
 
 /**
  * Class TaxClass
@@ -36,12 +40,19 @@ use Mtf\Fixture\FixtureInterface;
  */
 class TaxClass implements FixtureInterface
 {
+    /**
+     * Tax class id
+     *
+     * @var int
+     */
+    protected $taxClassId;
+
     /**
      * Tax class name
      *
      * @var string
      */
-    protected $data;
+    protected $data = 'None';
 
     /**
      * Tax class fixture
@@ -51,6 +62,8 @@ class TaxClass implements FixtureInterface
     protected $taxClass;
 
     /**
+     * Constructor
+     *
      * @param FixtureFactory $fixtureFactory
      * @param array $params
      * @param array $data
@@ -58,19 +71,48 @@ class TaxClass implements FixtureInterface
     public function __construct(FixtureFactory $fixtureFactory, array $params, array $data = [])
     {
         $this->params = $params;
-        /** @var \Magento\Tax\Test\Fixture\TaxClass $taxClass */
-        if (isset($data['dataSet']) && $data['dataSet'] !== '-') {
-            $taxClass = $fixtureFactory->createByCode('taxClass', ['dataSet' => $data['dataSet']]);
-            $this->taxClass = $taxClass;
-            $this->data = $taxClass->getClassName();
+        if (isset($data['dataSet'])) {
+            $this->taxClass = $fixtureFactory->createByCode('taxClass', ['dataSet' => $data['dataSet']]);
+            $this->data = $this->taxClass->getClassName();
+            if (!$this->taxClass->hasData('id')) {
+                $this->taxClass->persist();
+            }
         }
         if (isset($data['tax_product_class'])
             && $data['tax_product_class'] instanceof \Magento\Tax\Test\Fixture\TaxClass
         ) {
-            $taxClass = $data['tax_product_class'];
-            $this->taxClass = $taxClass;
-            $this->data = $taxClass->getClassName();
+            $this->taxClass = $data['tax_product_class'];
+            $this->data = $this->taxClass->getClassName();
+        }
+        if ($this->taxClass->hasData('id')) {
+            $this->taxClassId = $this->taxClass->getId();
+        } else {
+            $this->setTaxClassId($this->data);
+        }
+    }
+
+    /**
+     * Set tax class id
+     *
+     * @param string $taxClassName
+     * @return void
+     * @throws \Exception
+     */
+    protected function setTaxClassId($taxClassName)
+    {
+        $url = $_ENV['app_backend_url'] . 'tax/rule/new/';
+        $curl = new BackendDecorator(new CurlTransport(), new Config);
+        $curl->addOption(CURLOPT_HEADER, 1);
+        $curl->write(CurlInterface::POST, $url, '1.0', [], []);
+        $response = $curl->read();
+        $curl->close();
+
+        preg_match('~<option value="(\d+)".*>' . $taxClassName . '</option>~', $response, $matches);
+        if (!isset($matches[1]) || empty($matches[1])) {
+            throw new \Exception('Product tax class id ' . $taxClassName . ' undefined!');
         }
+
+        $this->taxClassId = (int)$matches[1];
     }
 
     /**
@@ -87,7 +129,7 @@ class TaxClass implements FixtureInterface
      * Return prepared data set
      *
      * @param string|null $key
-     * @return mixed
+     * @return string
      *
      * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
@@ -99,7 +141,7 @@ class TaxClass implements FixtureInterface
     /**
      * Return data set configuration settings
      *
-     * @return string
+     * @return array
      */
     public function getDataConfig()
     {
@@ -115,4 +157,14 @@ class TaxClass implements FixtureInterface
     {
         return $this->taxClass;
     }
+
+    /**
+     * Return tax class id
+     *
+     * @return int
+     */
+    public function getTaxClassId()
+    {
+        return (int)$this->taxClassId;
+    }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Handler/CatalogAttributeSet/Curl.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Handler/CatalogAttributeSet/Curl.php
index 86fa3f55a7f0cfc94c1f510e5a981dc5fffd18c0..04448e7c104afcf450eceda8a1dbf3737863028f 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Handler/CatalogAttributeSet/Curl.php
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Handler/CatalogAttributeSet/Curl.php
@@ -50,7 +50,7 @@ class Curl extends AbstractCurl implements CatalogAttributeSetInterface
      *
      * @var string
      */
-    protected $attributes = '#buildCategoryTree\(this.root,.*?(\[.*\}\]\}\])\);#s';
+    protected $attributes = '/buildCategoryTree\(this.root, ([^;]+\}\])\);/s';
 
     /**
      * Regex for finding attribute set name
@@ -176,12 +176,15 @@ class Curl extends AbstractCurl implements CatalogAttributeSetInterface
             $dataAttribute['groups'][$key][] = $parentAttributes['id'];
             $dataAttribute['groups'][$key][] = $parentAttributes['text'];
             $dataAttribute['groups'][$key][] = $key + 1;
-            foreach ($parentAttributes['children'] as $attribute) {
-                $dataAttribute['attributes'][$index][] = $attribute['id'];
-                $dataAttribute['attributes'][$index][] = $parentAttributes['id'];
-                $dataAttribute['attributes'][$index][] = $index;
-                $dataAttribute['attributes'][$index][] = $attribute['entity_id'];
-                $index++;
+
+            if (isset($parentAttributes['children'])) {
+                foreach ($parentAttributes['children'] as $attribute) {
+                    $dataAttribute['attributes'][$index][] = $attribute['id'];
+                    $dataAttribute['attributes'][$index][] = $parentAttributes['id'];
+                    $dataAttribute['attributes'][$index][] = $index;
+                    $dataAttribute['attributes'][$index][] = $attribute['entity_id'];
+                    $index++;
+                }
             }
         }
         $dataAttribute['not_attributes'] = [];
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Handler/CatalogProductSimple/Curl.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Handler/CatalogProductSimple/Curl.php
index c9de97be2d19a83bfccf00425f21519ffa537251..94226e34082b0c65a39bedb1c4f568d8f474cc2b 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Handler/CatalogProductSimple/Curl.php
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Handler/CatalogProductSimple/Curl.php
@@ -129,6 +129,7 @@ class Curl extends AbstractCurl implements CatalogProductSimpleInterface
         $config = $fixture->getDataConfig();
         $prefix = isset($config['input_prefix']) ? $config['input_prefix'] : null;
         $data = $this->prepareData($fixture, $prefix);
+
         return ['id' => $this->createProduct($data, $config)];
     }
 
@@ -147,14 +148,12 @@ class Curl extends AbstractCurl implements CatalogProductSimpleInterface
         $fields = $this->replaceMappingData($fixture->getData());
         // Getting Tax class id
         if ($fixture->hasData('tax_class_id')) {
-            $fields['tax_class_id'] = $fixture->getDataFieldConfig('tax_class_id')['source']->getTaxClass()->getId();
+            $fields['tax_class_id'] = $fixture->getDataFieldConfig('tax_class_id')['source']->getTaxClassId();
         }
 
         if (!empty($fields['category_ids'])) {
             $categoryIds = [];
-            /** @var InjectableFixture $fixture */
             foreach ($fixture->getDataFieldConfig('category_ids')['source']->getCategories() as $category) {
-                /** @var CatalogCategory $category */
                 $categoryIds[] = $category->getId();
             }
             $fields['category_ids'] = $categoryIds;
@@ -278,7 +277,7 @@ class Curl extends AbstractCurl implements CatalogProductSimpleInterface
         $url = $this->getUrl($config);
         $curl = new BackendDecorator(new CurlTransport(), new Config);
         $curl->addOption(CURLOPT_HEADER, 1);
-        $curl->write(CurlInterface::POST, $url, '1.0', array(), $data);
+        $curl->write(CurlInterface::POST, $url, '1.0', [], $data);
         $response = $curl->read();
         $curl->close();
 
@@ -298,7 +297,7 @@ class Curl extends AbstractCurl implements CatalogProductSimpleInterface
      */
     protected function getUrl(array $config)
     {
-        $requestParams = isset($config['create_url_params']) ? $config['create_url_params'] : array();
+        $requestParams = isset($config['create_url_params']) ? $config['create_url_params'] : [];
         $params = '';
         foreach ($requestParams as $key => $value) {
             $params .= $key . '/' . $value . '/';
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/CatalogProductSimple.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/CatalogProductSimple.php
index 8062fd7ff4b169640fa1d16b12f472c32d9ef777..6d2d48f49501bd3abe32bc2924c8dd0af3ce1e89 100755
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/CatalogProductSimple.php
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/CatalogProductSimple.php
@@ -66,6 +66,7 @@ class CatalogProductSimple extends AbstractRepository
                 'qty' => 666.0000,
                 'is_in_stock' => 'In Stock',
             ],
+            'weight' => 1,
             'attribute_set_id' => ['dataSet' => 'default'],
             'price' => ['value' => 100, 'preset' => '-'],
             'website_ids' => ['Main Website'],
@@ -79,6 +80,7 @@ class CatalogProductSimple extends AbstractRepository
                 'qty' => 666.0000,
                 'is_in_stock' => 'In Stock',
             ],
+            'weight' => 1,
             'attribute_set_id' => ['dataSet' => 'default'],
             'price' => ['value' => 40, 'preset' => '-'],
             'mtf_dataset_name' => '40_dollar_product',
@@ -94,6 +96,7 @@ class CatalogProductSimple extends AbstractRepository
                 'qty' => 666.0000,
                 'is_in_stock' => 'In Stock',
             ],
+            'weight' => 1,
             'price' => ['value' => 100, 'preset' => 'MAGETWO-23036'],
             'category_ids' => ['presets' => 'default'],
             'mtf_dataset_name' => 'simple_with_category',
@@ -107,6 +110,7 @@ class CatalogProductSimple extends AbstractRepository
                 'qty' => 666.0000,
                 'is_in_stock' => 'In Stock',
             ],
+            'weight' => 1,
             'attribute_set_id' => ['dataSet' => 'default'],
             'price' => ['value' => 100, 'preset' => ''],
             'category_ids' => ['presets' => 'default_subcategory'],
@@ -213,6 +217,7 @@ class CatalogProductSimple extends AbstractRepository
                 'qty' => 25.0000,
                 'is_in_stock' => 'In Stock',
             ],
+            'weight' => 1,
             'price' => ['value' => 100, 'preset' => '-'],
             'website_ids' => ['Main Website'],
         ];
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Category/CreateCategoryEntityTest/test.csv b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Category/CreateCategoryEntityTest/test.csv
index d98cdd09e2a00a85ad248b4b02459464ab949c14..6252e2454054cb0c40d640a3aa9bcd27449976cf 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Category/CreateCategoryEntityTest/test.csv
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Category/CreateCategoryEntityTest/test.csv
@@ -1,6 +1,6 @@
 "addCategory";"category/data/parent_id/dataSet";"category/data/name";"category/data/url_key";"category/data/is_active";"category/data/description";"category/data/meta_title";"category/data/include_in_menu";"category/data/display_mode";"category/data/landing_page";"category/data/is_anchor";"category/data/available_product_listing_config";"category/data/available_sort_by/sort_0";"category/data/available_sort_by/sort_1";"category/data/available_sort_by/sort_2";"category/data/default_product_listing_config";"category/data/default_sort_by";"category/data/use_config_price_range";"category/data/layered_navigation_price_step";"category/data/category_products_data/preset";"category/data/category_products/dataSet";"constraint"
 "addRootCategory";"1";"RootCategory%isolation%";"RootCategory%isolation%";"Yes";"RootCategory Required ";"-";"-";"-";"-";"-";"No";"Position";"Name";"Price";"-";"-";"-";"-";"-";"-";"assertCategorySaveMessage, assertCategoryForm"
-"addRootCategory";"1";"RootCategory%isolation%";"RootCategory%isolation%";"Yes";"RootCategory All Fields ";"RootCategory Page Title";"Yes";"Static block and products";"Footer Links";"Yes";"No";"Position";"Name";"Price";"No";"Name";"No";"50";"-";"-";"assertCategorySaveMessage, assertCategoryForm"
+"addRootCategory";"1";"RootCategory%isolation%";"RootCategory%isolation%";"Yes";"RootCategory All Fields ";"RootCategory Page Title";"Yes";"Static block and products";"Catalog Events Lister";"Yes";"No";"Position";"Name";"Price";"No";"Name";"No";"50";"-";"-";"assertCategorySaveMessage, assertCategoryForm"
 "addSubcategory";"default_category";"Subcategory%isolation%";"Subcategory%isolation%";"Yes";"Subcategory Required";"-";"-";"-";"-";"-";"Yes";"-";"-";"-";"-";"-";"-";"-";"-";"-";"assertCategorySaveMessage, assertCategoryForm, assertCategoryPage"
 "addSubcategory";"default_category";"Subcategory%isolation%";"Subcategory%isolation%";"Yes";"Subcategory For Anchor Subcategory";"-";"Yes";"-";"-";"No";"Yes";"-";"-";"-";"Yes";"-";"Yes";"-";"default";"catalogProductSimple::default,catalogProductSimple::default";"assertCategorySaveMessage, assertCategoryForm, assertCategoryPage, assertCategoryForAssignedProducts"
 "addSubcategory";"default_category";"Subcategory%isolation%";"Subcategory%isolation%";"Yes";"Anchor Subcategory All Fields";"Subcategory Page Title";"Yes";"Products only";"Catalog Events Lister";"Yes";"No";"Position";"Name";"Price";"No";"Price";"No";"50";"default";"catalogProductSimple::default,catalogProductSimple::default";"assertCategorySaveMessage, assertCategoryForm, assertCategoryPage, assertCategoryForAssignedProducts"
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateProductAttributeEntityTest.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateProductAttributeEntityTest.php
index 9d26a069dc1288bb23ea4df46fdc4348432d65d7..5608bd54009a22a93272ce0df156dacfaf94cf6c 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateProductAttributeEntityTest.php
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateProductAttributeEntityTest.php
@@ -53,7 +53,7 @@ class CreateProductAttributeEntityTest extends Injectable
      * @param CatalogProductAttributeIndex $attributeIndex
      * @param CatalogProductAttributeNew $attributeNew
      * @param CatalogAttributeSet $productTemplate
-     * @return void
+     * @return array
      */
     public function testCreateProductAttribute(
         CatalogProductAttribute $productAttribute,
@@ -69,5 +69,6 @@ class CreateProductAttributeEntityTest extends Injectable
         $attributeIndex->getPageActionsBlock()->addNew();
         $attributeNew->getAttributeForm()->fill($productAttribute);
         $attributeNew->getPageActions()->save();
+        return ['attribute' => $productAttribute];
     }
 }
diff --git a/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Constraint/AssertAdvancedSearchProductsResult.php b/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Constraint/AssertAdvancedSearchProductsResult.php
index 2f7301cef9c6f8815d14d73712519efca3a31f96..d5659735afbb84e8fbeef6f8270e86f52e772e86 100644
--- a/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Constraint/AssertAdvancedSearchProductsResult.php
+++ b/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Constraint/AssertAdvancedSearchProductsResult.php
@@ -133,9 +133,6 @@ class AssertAdvancedSearchProductsResult extends AbstractConstraint
         $searchData = $searchBlock->getSearchSummaryItems();
         $productData = $this->prepareFixtureData($productSearch);
         foreach ($productData as $key => $data) {
-            if ($key === 'tax_class' && $data === ['All']) {
-                continue;
-            }
             if (!isset($searchData[$key])) {
                 $errors[] = '- "' . $key . '" not found on the page';
             } elseif ($searchData[$key] !== $data) {
diff --git a/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/TestCase/AdvancedSearchEntityTest/testSearch.csv b/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/TestCase/AdvancedSearchEntityTest/testSearch.csv
index 20c355cc0c3c0032efbdaba0a2c706a8e28d53c4..c48e64424e4d622de0f0bd6df6074cb5b341d719 100644
--- a/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/TestCase/AdvancedSearchEntityTest/testSearch.csv
+++ b/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/TestCase/AdvancedSearchEntityTest/testSearch.csv
@@ -1,14 +1,13 @@
-"products/simple_1";"products/simple_2";"productSearch/data/name";"productSearch/data/sku";"productSearch/data/description";"productSearch/data/short_description";"productSearch/data/price/value/price_from";"productSearch/data/price/value/price_to";"productSearch/data/tax_class_id/dataSet";"constraint"
-"Yes";"-";"abc_dfj";"abc_dfj";"adc_Full";"abc_short";49;500;"Taxable Goods";"assertAdvancedSearchProductsResult"
-"Yes";"-";"abc";"-";"-";"-";"-";"-";"all";"assertAdvancedSearchProductsResult"
-"-";"Yes";"adc_123";"-";"-";"-";"-";"-";"all";"assertAdvancedSearchProductsResult"
-"Yes";"-";"-";"abc";"-";"-";"-";"-";"all";"assertAdvancedSearchProductsResult"
-"Yes";"-";"-";"abc_dfj";"-";"-";"-";"-";"all";"assertAdvancedSearchProductsResult"
-"Yes";"-";"-";"abc";"full";"-";"-";"-";"all";"assertAdvancedSearchProductsResult"
-"-";"Yes";"-";"-";"dfj_full";"-";"-";"-";"all";"assertAdvancedSearchProductsResult"
-"Yes";"-";"-";"-";"-";"short";"-";"-";"all";"assertAdvancedSearchProductsResult"
-"-";"-";"-";"-";"-";"dfj_short";"-";"-";"all";"assertAdvancedSearchProductsResult"
-"Yes";"Yes";"-";"-";"-";"-";"-";"-";"all";"assertAdvancedSearchProductsResult"
-"Yes";"-";"-";"-";"-";"-";50;50;"all";"assertAdvancedSearchProductsResult"
-"Yes";"Yes";"-";"-";"-";"-";"-";100;"all";"assertAdvancedSearchProductsResult"
-"Yes";"-";"abc_dfj";"abc_dfj";"adc_Full";"abc_short";49;50;"Taxable Goods";"assertAdvancedSearchProductsResult"
+"products/simple_1";"products/simple_2";"productSearch/data/name";"productSearch/data/sku";"productSearch/data/description";"productSearch/data/short_description";"productSearch/data/price/value/price_from";"productSearch/data/price/value/price_to";"constraint"
+"Yes";"-";"abc_dfj";"abc_dfj";"adc_Full";"abc_short";49;500;"assertAdvancedSearchProductsResult"
+"Yes";"-";"abc";"-";"-";"-";"-";"-";"assertAdvancedSearchProductsResult"
+"-";"Yes";"adc_123";"-";"-";"-";"-";"-";"assertAdvancedSearchProductsResult"
+"Yes";"-";"-";"abc";"-";"-";"-";"-";"assertAdvancedSearchProductsResult"
+"Yes";"-";"-";"abc_dfj";"-";"-";"-";"-";"assertAdvancedSearchProductsResult"
+"Yes";"-";"-";"abc";"full";"-";"-";"-";"assertAdvancedSearchProductsResult"
+"-";"Yes";"-";"-";"dfj_full";"-";"-";"-";"assertAdvancedSearchProductsResult"
+"Yes";"-";"-";"-";"-";"short";"-";"-";"assertAdvancedSearchProductsResult"
+"-";"-";"-";"-";"-";"dfj_short";"-";"-";"assertAdvancedSearchProductsResult"
+"Yes";"-";"-";"-";"-";"-";50;50;"assertAdvancedSearchProductsResult"
+"Yes";"Yes";"-";"-";"-";"-";"-";100;"assertAdvancedSearchProductsResult"
+"Yes";"-";"abc_dfj";"abc_dfj";"adc_Full";"abc_short";49;50;"assertAdvancedSearchProductsResult"
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Cart.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Cart.php
index fc3b9146b1c8d16c1a5b329cceacf0f61fb1b249..fdf1e8c4aa5159fcd9936af03f05cd0a5a0a2167 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Cart.php
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Cart.php
@@ -86,7 +86,7 @@ class Cart extends Block
      *
      * @var string
      */
-    protected $productQty = './/input[@type="number" and @title="Qty"]';
+    protected $productQty = '//input[@type="number" and @title="Qty"]';
 
     /**
      * Cart item selector
@@ -167,7 +167,7 @@ class Cart extends Block
      */
     public function getCartItemOptionsNameByProductName($productName)
     {
-        $selector = '//tr[string(td/div/strong/a)="' . $productName . '"]//dl[@class="cart item options"]//dt';
+        $selector = '//tr[string(td/div/strong/a)="' . $productName . '"]//dl[@class="cart-item-options"]//dt';
 
         $optionsBlock = $this->_rootElement->find($selector, Locator::SELECTOR_XPATH);
         if (!$optionsBlock->isVisible()) {
@@ -184,7 +184,7 @@ class Cart extends Block
      */
     public function getCartItemOptionsValueByProductName($productName)
     {
-        $selector = '//tr[string(td/div/strong/a)="' . $productName . '"]//dl[@class="cart item options"]//dd';
+        $selector = '//tr[string(td/div/strong/a)="' . $productName . '"]//dl[@class="cart-item-options"]//dd';
 
         $optionsBlock = $this->_rootElement->find($selector, Locator::SELECTOR_XPATH);
         if (!$optionsBlock->isVisible()) {
diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/Page/CheckoutCart.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/Page/CheckoutCart.php
index 4629a1b8ef582f36ad6effa30404fb7909b0b214..d7a4d90841c6bfd15b19087bbd7092a6e09ced4c 100644
--- a/dev/tests/functional/tests/app/Magento/Checkout/Test/Page/CheckoutCart.php
+++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/Page/CheckoutCart.php
@@ -31,9 +31,6 @@ use Mtf\Page\FrontendPage;
  */
 class CheckoutCart extends FrontendPage
 {
-    /**
-     * URL for checkout cart page
-     */
     const MCA = 'checkout/cart';
 
     protected $_blocks = [
diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/Handler/CmsPage/Curl.php b/dev/tests/functional/tests/app/Magento/Cms/Test/Handler/CmsPage/Curl.php
index 670f92cb6f60341a9c06b6c44daf74d555d5ecbf..d3721660c4f859c2383501621d7283223aef66d5 100644
--- a/dev/tests/functional/tests/app/Magento/Cms/Test/Handler/CmsPage/Curl.php
+++ b/dev/tests/functional/tests/app/Magento/Cms/Test/Handler/CmsPage/Curl.php
@@ -67,7 +67,7 @@ class Curl extends Conditions implements CmsPageInterface
      *
      * @var string
      */
-    protected $url = 'admin/cms_page/save/active_tab/main_section/';
+    protected $url = 'admin/cms_page/save/back/edit/active_tab/content_section/';
 
     /**
      * Post request for creating a cms page
diff --git a/dev/tests/functional/tests/app/Magento/Core/Test/Block/Adminhtml/System/Variable/FormPageActions.php b/dev/tests/functional/tests/app/Magento/Core/Test/Block/Adminhtml/System/Variable/FormPageActions.php
index 9386d490f9c66b1918d6848e81b80aa04cff8646..781ae0cb15425391b2d346bdf227a9dcf83d70b0 100644
--- a/dev/tests/functional/tests/app/Magento/Core/Test/Block/Adminhtml/System/Variable/FormPageActions.php
+++ b/dev/tests/functional/tests/app/Magento/Core/Test/Block/Adminhtml/System/Variable/FormPageActions.php
@@ -45,7 +45,7 @@ class FormPageActions extends AbstractFormPageActions
      *
      * @var string
      */
-    protected $storeViewButton = '.store-switcher [data-toggle="dropdown"]';
+    protected $storeViewButton = '[data-ui-id="language-switcher"] .toggle';
 
     /**
      * Store View locator
@@ -59,14 +59,19 @@ class FormPageActions extends AbstractFormPageActions
      *
      * @param string $storeName
      * @throws \Exception
-     * @return void
+     * @return void|bool
      */
     public function selectStoreView($storeName)
     {
-        $this->_rootElement->find($this->storeViewButton)->click();
+        $languageSwitcher = $this->_rootElement->find($this->storeViewButton);
+        if (!$languageSwitcher->isVisible()) {
+            return false;
+        }
+        $languageSwitcher->click();
         $selector = sprintf($this->storeView, $storeName);
-        if ($this->_rootElement->find($selector, Locator::SELECTOR_XPATH)->isVisible()) {
-            $this->_rootElement->find($selector, Locator::SELECTOR_XPATH)->click();
+        $storeView = $this->_rootElement->find($selector, Locator::SELECTOR_XPATH);
+        if ($storeView->isVisible()) {
+            $storeView->click();
         } else {
             throw new \Exception('Store View with name \'' . $storeName . '\' is not visible!');
         }
diff --git a/dev/tests/functional/tests/app/Magento/Core/Test/TestCase/UpdateCustomVariableEntityTest.php b/dev/tests/functional/tests/app/Magento/Core/Test/TestCase/UpdateCustomVariableEntityTest.php
index 1dc357b9fa9fd8d869f1325ea6e723c985b5ea8d..1bc24e83d56a0a1ebf53f790515142c9b6f8d3b1 100644
--- a/dev/tests/functional/tests/app/Magento/Core/Test/TestCase/UpdateCustomVariableEntityTest.php
+++ b/dev/tests/functional/tests/app/Magento/Core/Test/TestCase/UpdateCustomVariableEntityTest.php
@@ -32,7 +32,7 @@ use Magento\Core\Test\Page\Adminhtml\SystemVariableNew;
 use Magento\Core\Test\Page\Adminhtml\SystemVariableIndex;
 
 /**
- * Test Creation for CreateCustomVariableEntity
+ * Test Creation for UpdateCustomVariableEntityTest
  *
  * Test Flow:
  * Preconditions:
@@ -51,7 +51,7 @@ use Magento\Core\Test\Page\Adminhtml\SystemVariableIndex;
  * 9. Perform all assertions.
  *
  * @group Variables_(PS)
- * @ZephyrId MAGETWO-26241
+ * @ZephyrId MAGETWO-26104
  */
 class UpdateCustomVariableEntityTest extends Injectable
 {
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Block/Account/Dashboard/Address.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Block/Account/Dashboard/Address.php
index 4ee0087a624343b6356b589f4a71439e863b4f39..864e8d79a454e995a5fde01aff3f2bd8530cd97d 100644
--- a/dev/tests/functional/tests/app/Magento/Customer/Test/Block/Account/Dashboard/Address.php
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Block/Account/Dashboard/Address.php
@@ -44,14 +44,14 @@ class Address extends Block
      *
      * @var string
      */
-    protected $shippingAddressBlock = '.shipping address';
+    protected $shippingAddressBlock = '.box-address-shipping';
 
     /**
      * Billing address block selector
      *
      * @var string
      */
-    protected $billingAddressBlock = '.billing address';
+    protected $billingAddressBlock = '.box-address-billing';
 
     /**
      * Edit Default Billing Address
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Block/Account/Dashboard/Info.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Block/Account/Dashboard/Info.php
index 8a9b81871bc3148b0cbc7162d1b7ee64fbd1e7f1..d02eb863ec260e7def84713323cffd2622c52a96 100644
--- a/dev/tests/functional/tests/app/Magento/Customer/Test/Block/Account/Dashboard/Info.php
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Block/Account/Dashboard/Info.php
@@ -37,7 +37,7 @@ class Info extends Block
      *
      * @var string
      */
-    protected $contactInfoEditLink = '.dashboard.info .information a.edit';
+    protected $contactInfoEditLink = '.block-dashboard-info .box-information .action.edit';
 
     /**
      * Click on Contact Information Edit Link
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerDefaultAddresses.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerDefaultAddresses.php
index 5efcb572fd49744c23d31fe20a701acc36156dd2..15d0c013f2a10fcbdfa7f8b0e94c2120a40e6b40 100644
--- a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerDefaultAddresses.php
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerDefaultAddresses.php
@@ -49,6 +49,7 @@ class AssertCustomerDefaultAddresses extends AbstractConstraint
      */
     public function processAssert(CustomerAccountIndex $customerAccountIndex, AddressInjectable $address)
     {
+        $customerAccountIndex->getAccountMenuBlock()->openMenuItem('Account Dashboard');
         $defaultBillingAddress = explode(
             "\n",
             $customerAccountIndex->getDashboardAddress()->getDefaultBillingAddressText()
@@ -89,11 +90,9 @@ class AssertCustomerDefaultAddresses extends AbstractConstraint
     protected function verifyForm(array $pattern, array $address)
     {
         $errorMessages = [];
-        foreach ($pattern as $key => $value) {
-            if ($value !== $address[$key]) {
-                $errorMessages[] = "Data in fields is not equal."
-                    . "\nExpected: " . $value
-                    . "\nActual: " . $pattern[$key];
+        foreach ($pattern as $value) {
+            if (!in_array($value, $address)) {
+                $errorMessages[] = "Data '$value' in fields is not found.";
             }
         }
         return $errorMessages;
@@ -109,7 +108,7 @@ class AssertCustomerDefaultAddresses extends AbstractConstraint
     {
         $pattern = [];
         $regionId = $address->getRegionId();
-        $region = $regionId ? $regionId: $address->getRegion();
+        $region = $regionId ? $regionId : $address->getRegion();
 
         $pattern[] = $address->getFirstname() . " " . $address->getLastname();
         $pattern[] = $address->getCompany();
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerGroupOnCustomerForm.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerGroupOnCustomerForm.php
index 2a61edc9c015f0f8f8e1523cc1e5532f2f6a11bf..ebbdda84003880d128fb84c61e989fb7a09c96a2 100644
--- a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerGroupOnCustomerForm.php
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerGroupOnCustomerForm.php
@@ -63,7 +63,7 @@ class AssertCustomerGroupOnCustomerForm extends AbstractConstraint
             'customerInjectable',
             [
                 'dataSet' => 'defaultBackend',
-                'data' => ['group_id' => $customerGroup->getCustomerGroupCode()]
+                'data' => ['group_id' => ['customerGroup' => $customerGroup]]
             ]
         );
         $filter = ['email' => $customer->getEmail()];
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerMassDeleteInGrid.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerMassDeleteInGrid.php
new file mode 100644
index 0000000000000000000000000000000000000000..72e03178fd17b23e42d988f869cdf5fc41a20534
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerMassDeleteInGrid.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\Customer\Test\Constraint;
+
+use Magento\Customer\Test\Fixture\CustomerInjectable;
+use Magento\Customer\Test\Page\Adminhtml\CustomerIndex;
+use Mtf\Constraint\AbstractConstraint;
+
+/**
+ * Class AssertCustomerMassDeleteInGrid
+ * Check that mass deleted customers availability in Customer Grid
+ */
+class AssertCustomerMassDeleteInGrid extends AbstractConstraint
+{
+    /**
+     * Constraint severeness
+     *
+     * @var string
+     */
+    protected $severeness = 'low';
+
+    /**
+     * Assert that customers which haven't been deleted are present in customer grid
+     *
+     * @param CustomerIndex $pageCustomerIndex
+     * @param AssertCustomerInGrid $assertCustomerInGrid
+     * @param int $customersQtyToDelete
+     * @param CustomerInjectable[] $customers
+     * @return void
+     */
+    public function processAssert(
+        CustomerIndex $pageCustomerIndex,
+        AssertCustomerInGrid $assertCustomerInGrid,
+        $customersQtyToDelete,
+        $customers
+    ) {
+        $customers = array_slice($customers, $customersQtyToDelete);
+        foreach ($customers as $customer) {
+            $assertCustomerInGrid->processAssert($customer, $pageCustomerIndex);
+        }
+    }
+
+    /**
+     * Text success exist Customer in grid
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'Customers are present in Customer grid.';
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerMassDeleteNotInGrid.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerMassDeleteNotInGrid.php
new file mode 100644
index 0000000000000000000000000000000000000000..d38d19d905c5b132d731d916aa90472aa5ff053b
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerMassDeleteNotInGrid.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\Customer\Test\Constraint;
+
+use Magento\Customer\Test\Fixture\CustomerInjectable;
+use Magento\Customer\Test\Page\Adminhtml\CustomerIndex;
+use Mtf\Constraint\AbstractConstraint;
+
+/**
+ * Class AssertCustomerMassDeleteNotInGrid
+ * Check that mass deleted customers are not in customer's grid
+ */
+class AssertCustomerMassDeleteNotInGrid extends AbstractConstraint
+{
+    /**
+     * Constraint severeness
+     *
+     * @var string
+     */
+    protected $severeness = 'low';
+
+    /**
+     * Asserts that mass deleted customers are not in customer's grid
+     *
+     * @param CustomerIndex $customerIndexPage
+     * @param AssertCustomerNotInGrid $assertCustomerNotInGrid
+     * @param int $customersQtyToDelete
+     * @param CustomerInjectable[] $customers
+     * @return void
+     */
+    public function processAssert(
+        CustomerIndex $customerIndexPage,
+        AssertCustomerNotInGrid $assertCustomerNotInGrid,
+        $customersQtyToDelete,
+        $customers
+    ) {
+        for ($i = 0; $i < $customersQtyToDelete; $i++) {
+            $assertCustomerNotInGrid->processAssert($customers[$i], $customerIndexPage);
+        }
+    }
+
+    /**
+     * Success message if Customer not in grid
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'Deleted customers are absent in Customer grid.';
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerMassDeleteSuccessMessage.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerMassDeleteSuccessMessage.php
new file mode 100644
index 0000000000000000000000000000000000000000..846a9749be7ab131ca02f41c77c89b7841a51e5b
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerMassDeleteSuccessMessage.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\Customer\Test\Constraint;
+
+use Magento\Customer\Test\Page\Adminhtml\CustomerIndex;
+use Mtf\Constraint\AbstractConstraint;
+
+/**
+ * Class AssertCustomerMassDeleteSuccessMessage
+ * Check that message "A total of "x" record(s) were deleted." is present
+ */
+class AssertCustomerMassDeleteSuccessMessage extends AbstractConstraint
+{
+    /**
+     * Message that appears after deletion via mass actions
+     */
+    const SUCCESS_DELETE_MESSAGE = 'A total of %d record(s) were deleted.';
+
+    /**
+     * Constraint severeness
+     *
+     * @var string
+     */
+    protected $severeness = 'low';
+
+    /**
+     * Assert that message "A total of "x" record(s) were deleted."
+     *
+     * @param $customersQtyToDelete
+     * @param CustomerIndex $customerIndexPage
+     * @return void
+     */
+    public function processAssert($customersQtyToDelete, CustomerIndex $customerIndexPage)
+    {
+        \PHPUnit_Framework_Assert::assertEquals(
+            sprintf(self::SUCCESS_DELETE_MESSAGE, $customersQtyToDelete),
+            $customerIndexPage->getMessagesBlock()->getSuccessMessages(),
+            'Wrong delete message is displayed.'
+        );
+    }
+
+    /**
+     * Returns a string representation of the object
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'Mass delete customer message is displayed.';
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerNotInGrid.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerNotInGrid.php
index e1cfd78cab5c3622ef6ec67f7f8923afe1cd0013..4e6f1a9174758aeb04d21a8431196b4cdf7f7767 100644
--- a/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerNotInGrid.php
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Constraint/AssertCustomerNotInGrid.php
@@ -30,6 +30,7 @@ use Magento\Customer\Test\Page\Adminhtml\CustomerIndex;
 
 /**
  * Class AssertCustomerNotInGrid
+ * Check that customer is not in customer's grid
  */
 class AssertCustomerNotInGrid extends AbstractConstraint
 {
@@ -43,20 +44,18 @@ class AssertCustomerNotInGrid extends AbstractConstraint
     /**
      * Asserts that customer is not in customer's grid
      *
-     * @param CustomerInjectable $initialCustomer
-     * @param CustomerIndex $pageCustomerIndex
+     * @param CustomerInjectable $customer
+     * @param CustomerIndex $customerIndexPage
      * @return void
      */
-    public function processAssert(CustomerInjectable $customer, CustomerIndex $customerIndexPage)
-    {
-        $filter = [
-            'email' => $customer->getEmail()
-        ];
-
+    public function processAssert(
+        CustomerInjectable $customer,
+        CustomerIndex $customerIndexPage
+    ) {
         $customerIndexPage->open();
         \PHPUnit_Framework_Assert::assertFalse(
-            $customerIndexPage->getCustomerGridBlock()->isRowVisible($filter),
-            "Customer with email {$filter['email']} is present in Customer grid."
+            $customerIndexPage->getCustomerGridBlock()->isRowVisible(['email' => $customer->getEmail()]),
+            'Customer with email ' . $customer->getEmail() . 'is present in Customer grid.'
         );
     }
 
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Fixture/AddressInjectable.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Fixture/AddressInjectable.php
index 32fe5165259910e63f69de7fa7d4eb3677d244d0..93821cb08bd4ca58fa6f120e9eaef2108139bd37 100644
--- a/dev/tests/functional/tests/app/Magento/Customer/Test/Fixture/AddressInjectable.php
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Fixture/AddressInjectable.php
@@ -120,6 +120,14 @@ class AddressInjectable extends InjectableFixture
         'input' => 'text',
     ];
 
+    protected $email = [
+        'attribute_code' => 'email',
+        'backend_type' => 'varchar',
+        'is_required' => '1',
+        'default_value' => '',
+        'input' => 'text',
+    ];
+
     protected $middlename = [
         'attribute_code' => 'middlename',
         'backend_type' => 'varchar',
@@ -239,6 +247,11 @@ class AddressInjectable extends InjectableFixture
         return $this->getData('default_billing');
     }
 
+    public function getEmail()
+    {
+        return $this->getData('email');
+    }
+
     public function getCompany()
     {
         return $this->getData('company');
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Fixture/CustomerInjectable.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Fixture/CustomerInjectable.php
index 910c8760105de9b140cd46c560e98c94a772e40b..c0fc89dc738134b8687d95d831cbc59796a4a594 100644
--- a/dev/tests/functional/tests/app/Magento/Customer/Test/Fixture/CustomerInjectable.php
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Fixture/CustomerInjectable.php
@@ -52,6 +52,12 @@ class CustomerInjectable extends InjectableFixture
         'password_confirmation' => '123123q',
     ];
 
+    protected $address = [
+        'attribute_code' => 'address',
+        'backend_type' => 'virtual',
+        'source' => 'Magento\Customer\Test\Fixture\CustomerInjectable\Address'
+    ];
+
     protected $confirmation = [
         'attribute_code' => 'confirmation',
         'backend_type' => 'varchar',
@@ -151,6 +157,7 @@ class CustomerInjectable extends InjectableFixture
         'default_value' => '',
         'input' => 'select',
         'group' => 'account_information',
+        'source' => 'Magento\Customer\Test\Fixture\CustomerInjectable\GroupId'
     ];
 
     protected $lastname = [
@@ -266,6 +273,11 @@ class CustomerInjectable extends InjectableFixture
         'group' => null,
     ];
 
+    public function getAddress()
+    {
+        return $this->getData('address');
+    }
+
     public function getConfirmation()
     {
         return $this->getData('confirmation');
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Fixture/CustomerInjectable.xml b/dev/tests/functional/tests/app/Magento/Customer/Test/Fixture/CustomerInjectable.xml
index 5953126c4a8ca0e01b6180a17e4fdbd23df11135..57baf42a5bc88201592c508bbef5eb3a3bc4e53d 100644
--- a/dev/tests/functional/tests/app/Magento/Customer/Test/Fixture/CustomerInjectable.xml
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Fixture/CustomerInjectable.xml
@@ -30,6 +30,11 @@
     <collection>Magento\Customer\Model\Resource\Customer\Collection</collection>
     <identifier>email</identifier>
     <fields>
+        <address>
+            <attribute_code>address</attribute_code>
+            <backend_type>virtual</backend_type>
+            <source>Magento\Customer\Test\Fixture\CustomerInjectable\Address</source>
+        </address>
         <confirmation>
             <attribute_code>confirmation</attribute_code>
             <backend_type>varchar</backend_type>
@@ -118,6 +123,7 @@
             <default_value></default_value>
             <input>select</input>
             <group>account_information</group>
+            <source>Magento\Customer\Test\Fixture\CustomerInjectable\GroupId</source>
         </group_id>
         <lastname>
             <attribute_code>lastname</attribute_code>
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Fixture/CustomerInjectable/Address.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Fixture/CustomerInjectable/Address.php
new file mode 100644
index 0000000000000000000000000000000000000000..652cdaeff056e426ca8a0942301890c78cd6b63a
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Fixture/CustomerInjectable/Address.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\Customer\Test\Fixture\CustomerInjectable;
+
+use Mtf\Fixture\FixtureFactory;
+use Mtf\Fixture\FixtureInterface;
+use Magento\Customer\Test\Fixture\AddressInjectable;
+
+/**
+ * Class Address
+ * Addresses source for customer fixture
+ */
+class Address implements FixtureInterface
+{
+    /**
+     * Source data
+     *
+     * @var array
+     */
+    protected $data = [];
+
+    /**
+     * Source parameters
+     *
+     * @var array
+     */
+    protected $params;
+
+    /**
+     * Customer addresses fixture
+     *
+     * @var array
+     */
+    protected $addressesFixture;
+
+    /**
+     * Source constructor
+     *
+     * @param FixtureFactory $fixtureFactory
+     * @param array $params
+     * @param array $data
+     */
+    public function __construct(FixtureFactory $fixtureFactory, array $params, array $data = [])
+    {
+        $this->params = $params;
+
+        if (isset($data['presets'])) {
+            $data['presets'] = explode(',', $data['presets']);
+            foreach ($data['presets'] as $value) {
+                /** @var AddressInjectable $fixture */
+                $addresses = $fixtureFactory->createByCode('addressInjectable', ['dataSet' => $value]);
+                $this->data[] = $addresses->getData();
+                $this->addressesFixture[] = $addresses;
+            }
+        } elseif (empty($data['presets']) && !empty($data['addresses'])) {
+            foreach ($data['addresses'] as $addresses) {
+                /** @var AddressInjectable $addresses */
+                $this->data[] = $addresses->getData();
+                $this->addressesFixture[] = $addresses;
+            }
+        }
+    }
+
+    /**
+     * Persists prepared data into application
+     *
+     * @return void
+     */
+    public function persist()
+    {
+        //
+    }
+
+    /**
+     * Return prepared data set
+     *
+     * @param int|null $key [optional]
+     * @return array
+     */
+    public function getData($key = null)
+    {
+        return isset($this->data[$key]) ? $this->data[$key] : $this->data;
+    }
+
+    /**
+     * Return data set configuration settings
+     *
+     * @return array
+     */
+    public function getDataConfig()
+    {
+        return $this->params;
+    }
+
+    /**
+     * Getting addresses fixture
+     *
+     * @return array
+     */
+    public function getAddresses()
+    {
+        return $this->addressesFixture;
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Fixture/CustomerInjectable/GroupId.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Fixture/CustomerInjectable/GroupId.php
new file mode 100644
index 0000000000000000000000000000000000000000..695bd9998150425d11fafb55fd044bf8a250b144
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Fixture/CustomerInjectable/GroupId.php
@@ -0,0 +1,124 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Test\Fixture\CustomerInjectable;
+
+use Mtf\Fixture\FixtureFactory;
+use Mtf\Fixture\FixtureInterface;
+use Magento\Customer\Test\Fixture\CustomerGroupInjectable;
+
+/**
+ * Class GroupId
+ * Addresses source for customer fixture
+ */
+class GroupId implements FixtureInterface
+{
+    /**
+     * Source data
+     *
+     * @var array
+     */
+    protected $data = [];
+
+    /**
+     * Source parameters
+     *
+     * @var array
+     */
+    protected $params;
+
+    /**
+     * Customer Group fixture
+     *
+     * @var array
+     */
+    protected $customerGroupFixture;
+
+    /**
+     * Source constructor
+     *
+     * @param FixtureFactory $fixtureFactory
+     * @param array $params
+     * @param array $data
+     */
+    public function __construct(FixtureFactory $fixtureFactory, array $params, array $data = [])
+    {
+        $this->params = $params;
+        if (isset($data['dataSet'])) {
+            /** @var CustomerGroupInjectable $customerGroup */
+            $customerGroup = $fixtureFactory->createByCode('customerGroupInjectable', ['dataSet' => $data['dataSet']]);
+            if (!$customerGroup->hasData('customer_group_id')) {
+                $customerGroup->persist();
+            }
+            $this->data = $customerGroup->getCustomerGroupCode();
+            $this->customerGroupFixture = $customerGroup;
+        }
+        if (isset($data['customerGroup']) && $data['customerGroup'] instanceof CustomerGroupInjectable) {
+            $this->data = $data['customerGroup']->getCustomerGroupCode();
+            $this->customerGroupFixture = $data['customerGroup'];
+        }
+    }
+
+    /**
+     * Persists prepared data into application
+     *
+     * @return void
+     */
+    public function persist()
+    {
+        //
+    }
+
+    /**
+     * Return prepared data set
+     *
+     * @param int|null $key [optional]
+     * @return array
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+     */
+    public function getData($key = null)
+    {
+        return $this->data;
+    }
+
+    /**
+     * Return data set configuration settings
+     *
+     * @return array
+     */
+    public function getDataConfig()
+    {
+        return $this->params;
+    }
+
+    /**
+     * Getting customerGroup fixture
+     *
+     * @return array
+     */
+    public function getAddresses()
+    {
+        return $this->customerGroupFixture;
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/CustomerInjectable/Curl.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/CustomerInjectable/Curl.php
index ee6b0900557ddca3eb32491395fc1185359f7b8d..eae09259a1c8fe2d1b1f70a38e0142c4d630f377 100644
--- a/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/CustomerInjectable/Curl.php
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/CustomerInjectable/Curl.php
@@ -25,12 +25,12 @@
 namespace Magento\Customer\Test\Handler\CustomerInjectable;
 
 use Mtf\System\Config;
-use Mtf\Handler\Curl as AbstractCurl;
+use Mtf\Fixture\FixtureInterface;
 use Mtf\Util\Protocol\CurlInterface;
 use Mtf\Util\Protocol\CurlTransport;
 use Mtf\Util\Protocol\CurlTransport\BackendDecorator;
-use Mtf\Fixture\FixtureInterface;
 use Magento\Customer\Test\Fixture\CustomerInjectable;
+use Mtf\Handler\Curl as AbstractCurl;
 
 /**
  * Class Curl
@@ -38,6 +38,47 @@ use Magento\Customer\Test\Fixture\CustomerInjectable;
  */
 class Curl extends AbstractCurl implements CustomerInjectableInterface
 {
+    /**
+     * Default customer group
+     */
+    const GENERAL_GROUP = 'General';
+
+    /**
+     * Mapping values for data
+     *
+     * @var array
+     */
+    protected $mappingData = [
+        'group_id' => [
+            self::GENERAL_GROUP => 1,
+            'Wholesale' => 2,
+            'Retailer' => 3
+        ],
+        'country_id' => [
+            'United States' => 'US'
+        ],
+        'region_id' => [
+            'California' => 12
+        ]
+    ];
+
+    /**
+     * Curl mapping data
+     *
+     * @var array
+     */
+    protected $curlMapping = [
+        'account' => [
+            'group_id',
+            'firstname',
+            'lastname',
+            'email',
+            'dob',
+            'taxvat',
+            'gender'
+        ]
+    ];
+
     /**
      * Post request for creating customer in frontend
      *
@@ -47,19 +88,34 @@ class Curl extends AbstractCurl implements CustomerInjectableInterface
      */
     public function persist(FixtureInterface $customer = null)
     {
+        $address = [];
+        $result = [];
         /** @var CustomerInjectable $customer */
         $url = $_ENV['app_frontend_url'] . 'customer/account/createpost/?nocookie=true';
         $data = $customer->getData();
-        $curl = new CurlTransport();
 
-        $curl->write(CurlInterface::POST, $url, '1.0', array(), $data);
+        if ($customer->hasData('address')) {
+            $address = $customer->getAddress();
+            unset($data['address']);
+        }
+
+        $curl = new CurlTransport();
+        $curl->write(CurlInterface::POST, $url, '1.0', [], $data);
         $response = $curl->read();
         $curl->close();
         if (!strpos($response, 'data-ui-id="global-messages-message-success"')) {
             throw new \Exception("Customer entity creating  by curl handler was not successful! Response: $response");
         }
 
-        return ['id' => $this->getCustomerId($customer->getEmail())];
+        $result['id'] = $this->getCustomerId($customer->getEmail());
+        $data['customer_id'] = $result['id'];
+
+        if (!empty($address)) {
+            $data['address'] = $address;
+            $this->addAddress($data);
+        }
+
+        return $result;
     }
 
     /**
@@ -70,8 +126,7 @@ class Curl extends AbstractCurl implements CustomerInjectableInterface
      */
     protected function getCustomerId($email)
     {
-        $filter = ['email' => $email];
-        $url = $_ENV['app_backend_url'] . 'customer/index/grid/filter/' . $this->encodeFilter($filter);
+        $url = $_ENV['app_backend_url'] . 'customer/index/grid/filter/' . $this->encodeFilter(['email' => $email]);
         $curl = new BackendDecorator(new CurlTransport(), new Config());
 
         $curl->write(CurlInterface::GET, $url, '1.0');
@@ -82,6 +137,75 @@ class Curl extends AbstractCurl implements CustomerInjectableInterface
         return empty($match[1]) ? null : $match[1];
     }
 
+    /**
+     * Add addresses in to customer account
+     *
+     * @param array $data
+     * @return void
+     * @throws \Exception
+     */
+    protected function addAddress(array $data)
+    {
+        $curlData = [];
+        $url = $_ENV['app_backend_url'] . 'customer/index/save';
+        foreach ($data as $key => $value) {
+            foreach ($this->curlMapping as $prefix => $prefixValues) {
+                if (in_array($key, $prefixValues)) {
+                    $curlData[$prefix][$key] = $value;
+                    unset($data[$key]);
+                }
+            }
+        }
+        unset($data['password'], $data['password_confirmation']);
+        $curlData['account']['group_id'] = isset($curlData['account']['group_id'])
+            ? $curlData['account']['group_id']
+            : self::GENERAL_GROUP;
+
+        $curlData = $this->replaceMappingData(array_merge($curlData, $data));
+        $curlData = $this->prepareAddressData($curlData);
+
+        $curl = new BackendDecorator(new CurlTransport(), new Config);
+        $curl->write(CurlInterface::POST, $url, '1.0', [], $curlData);
+        $response = $curl->read();
+        $curl->close();
+
+        if (!strpos($response, 'data-ui-id="messages-message-success"')) {
+            throw new \Exception('Failed to assign an address to the customer!');
+        }
+    }
+
+    /**
+     * Preparing address data for curl
+     *
+     * @param array $curlData
+     * @return array
+     */
+    protected function prepareAddressData(array $curlData)
+    {
+        foreach (array_keys($curlData['address']) as $key) {
+            $curlData['address'][$key]['_deleted'] = '';
+            $curlData['address'][$key]['region'] = '';
+            if (!is_array($curlData['address'][$key]['street'])) {
+                $street = $curlData['address'][$key]['street'];
+                $curlData['address'][$key]['street'] = [];
+                $curlData['address'][$key]['street'][] = $street;
+            }
+            $newKey = '_item' . ($key + 1);
+            if ($curlData['address'][$key]['default_billing'] === 'Yes') {
+                unset($curlData['address'][$key]['default_billing']);
+                $curlData['account']['default_billing'] = $newKey;
+            }
+            if ($curlData['address'][$key]['default_shipping'] === 'Yes') {
+                unset($curlData['address'][$key]['default_shipping']);
+                $curlData['account']['default_shipping'] = $newKey;
+            }
+            $curlData['address'][$newKey] = $curlData['address'][$key];
+            unset($curlData['address'][$key]);
+        }
+
+        return $curlData;
+    }
+
     /**
      * Encoded filter parameters
      *
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/AddressInjectable.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/AddressInjectable.php
index e4c8cf15c191dd88619b3d8c7802070faf76d32c..a65c8d741a450485952c12e85b7a7c244bf59131 100644
--- a/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/AddressInjectable.php
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/AddressInjectable.php
@@ -33,13 +33,58 @@ use Mtf\Repository\AbstractRepository;
 class AddressInjectable extends AbstractRepository
 {
     /**
-     * @param array $defaultConfig
-     * @param array $defaultData
+     * @param array $defaultConfig [optional]
+     * @param array $defaultData [optional]
      *
      * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
     public function __construct(array $defaultConfig = [], array $defaultData = [])
     {
+        $this->_data['US_address'] = [
+            'firstname' => 'John',
+            'lastname' => 'Doe',
+            'email' => 'John.Doe%isolation%@example.com',
+            'company' => 'Magento %isolation%',
+            'street' => '6161 West Centinela Avenue',
+            'city' => 'Culver City',
+            'region_id' => 'California',
+            'postcode' => '90230',
+            'country_id' => 'United States',
+            'telephone' => '555-55-555-55',
+            'default_billing' => 'Yes',
+            'default_shipping' => 'Yes'
+        ];
+
+        $this->_data['US_address_default_billing'] = [
+            'firstname' => 'John',
+            'lastname' => 'Doe',
+            'email' => 'John.Doe%isolation%@example.com',
+            'company' => 'Magento %isolation%',
+            'street' => '6161 West Centinela Avenue',
+            'city' => 'Culver City',
+            'region_id' => 'California',
+            'postcode' => '90230',
+            'country_id' => 'United States',
+            'telephone' => '555-55-555-55',
+            'default_billing' => 'Yes',
+            'default_shipping' => 'No'
+        ];
+
+        $this->_data['US_address_default_shipping'] = [
+            'firstname' => 'John',
+            'lastname' => 'Doe',
+            'email' => 'John.Doe%isolation%@example.com',
+            'company' => 'Magento %isolation%',
+            'street' => '6161 West Centinela Avenue',
+            'city' => 'Culver City',
+            'region_id' => 'California',
+            'postcode' => '90230',
+            'country_id' => 'United States',
+            'telephone' => '555-55-555-55',
+            'default_billing' => 'Yes',
+            'default_shipping' => 'No'
+        ];
+
         $this->_data['default_US_address'] = [
             'company' => 'Magento %isolation%',
             'street' => '6161 West Centinela Avenue',
@@ -51,5 +96,17 @@ class AddressInjectable extends AbstractRepository
             'default_billing' => 'Yes',
             'default_shipping' => 'Yes',
         ];
+
+        $this->_data['US_address_without_email'] = [
+            'firstname' => 'John',
+            'lastname' => 'Doe',
+            'company' => 'Magento %isolation%',
+            'street' => '6161 West Centinela Avenue',
+            'city' => 'Culver City',
+            'region_id' => 'California',
+            'postcode' => '90230',
+            'country_id' => 'United States',
+            'telephone' => '555-55-555-55',
+        ];
     }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/CustomerInjectable.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/CustomerInjectable.php
index 44d0c2fc12a82b57f57d352b0f1a5f1819afa0b7..0d395afad9282476dcd719ae56872bae4b72929f 100644
--- a/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/CustomerInjectable.php
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/CustomerInjectable.php
@@ -43,6 +43,7 @@ class CustomerInjectable extends AbstractRepository
         $this->_data['default'] = [
             'firstname' => 'John',
             'lastname' => 'Doe',
+            'group_id' => ['dataSet' => 'General'],
             'email' => 'JohnDoe_%isolation%@example.com',
             'password' => '123123q',
             'password_confirmation' => '123123q',
@@ -56,13 +57,13 @@ class CustomerInjectable extends AbstractRepository
             'password_confirmation' => '123123q',
             'dob' => '01/01/1990',
             'gender' => 'Male',
-            'group_id' => 'General',
+            'group_id' => ['dataSet' => 'General'],
         ];
 
         $this->_data['johndoe_retailer'] = [
             'firstname' => 'John',
             'lastname' => 'Doe',
-            'group_id' => 'Retailer',
+            'group_id' => ['dataSet' => 'Retailer'],
             'email' => 'JohnDoe_%isolation%@example.com',
             'password' => '123123q',
             'password_confirmation' => '123123q',
@@ -86,5 +87,15 @@ class CustomerInjectable extends AbstractRepository
             'lastname' => 'Doe',
             'email' => 'JohnDoe_%isolation%@example.com',
         ];
+
+        $this->_data['johndoe_with_addresses'] = [
+            'firstname' => 'John',
+            'lastname' => 'Doe',
+            'group_id' => ['dataSet' => 'General'],
+            'email' => 'JohnDoe_%isolation%@example.com',
+            'password' => '123123q',
+            'password_confirmation' => '123123q',
+            'address' => ['presets' => 'US_address']
+        ];
     }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/CreateCustomerBackendEntityTest/testCreateCustomerBackendEntity.csv b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/CreateCustomerBackendEntityTest/testCreateCustomerBackendEntity.csv
index 8dceb84f7e2053be6e4ddec7543d729c87c2d749..47b35a7511a615f8810f922c99bd89bd59a39832 100644
--- a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/CreateCustomerBackendEntityTest/testCreateCustomerBackendEntity.csv
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/CreateCustomerBackendEntityTest/testCreateCustomerBackendEntity.csv
@@ -1,4 +1,4 @@
-"customer/data/website_id";"customer/data/group_id";"customer/data/prefix";"customer/data/firstname";"customer/data/middlename";"customer/data/lastname";"customer/data/suffix";"customer/data/email";"customer/data/dob";"customer/data/taxvat";"customer/data/gender";"address/data/firstname";"address/data/lastname";"address/data/street";"address/data/city";"address/data/country_id";"address/data/region_id";"address/data/postcode";"address/data/telephone";"constraint"
+"customer/data/website_id";"customer/data/group_id/dataSet";"customer/data/prefix";"customer/data/firstname";"customer/data/middlename";"customer/data/lastname";"customer/data/suffix";"customer/data/email";"customer/data/dob";"customer/data/taxvat";"customer/data/gender";"address/data/firstname";"address/data/lastname";"address/data/street";"address/data/city";"address/data/country_id";"address/data/region_id";"address/data/postcode";"address/data/telephone";"constraint"
 "Main Website";"General";"-";"John%isolation%";"-";"Doe%isolation%";"-";"JohnDoe%isolation%@example.com";"-";"-";"-";"-";"-";"-";"-";"-";"-";"-";"-";"assertCustomerSuccessSaveMessage, assertCustomerInGrid, assertCustomerForm"
 "Admin";"Wholesale";"M";"John%isolation%";"Jack";"Doe%isolation%";"S";"JohnDoe%isolation%@example.com";"3/16/2004";"-";"Male";"-";"-";"-";"-";"-";"-";"-";"-";"assertCustomerSuccessSaveMessage, assertCustomerInGrid, assertCustomerForm"
 "Main Website";"General";"-";"John%isolation%";"-";"Doe%isolation%";"-";"JohnDoe%isolation%@example.com";"-";"-";"-";"Joe";"Doe";"1 Main Street";"Culver City";"United States";"California";"90230";"3109450345";"assertCustomerSuccessSaveMessage, assertCustomerInGrid, assertCustomerForm"
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/CreateCustomerGroupEntityTest/testCreateCustomerGroup.csv b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/CreateCustomerGroupEntityTest/testCreateCustomerGroup.csv
index 4fba0855cf1f813528171e402d21c271048a402f..215d04ed45753874fd78d6a57a1f7e8280b8da9c 100644
--- a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/CreateCustomerGroupEntityTest/testCreateCustomerGroup.csv
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/CreateCustomerGroupEntityTest/testCreateCustomerGroup.csv
@@ -1,4 +1,4 @@
 "customerGroup/data/tax_class_id/dataSet";"customerGroup/data/customer_group_code";"constraint"
 "Retail Customer";"GroupName%isolation%";"assertCustomerGroupSuccessSaveMessage, assertCustomerGroupInGrid, assertCustomerGroupOnCustomerForm"
-"Retail Customer";"General ";"assertCustomerGroupAlreadyExists, assertCustomerGroupNotInGrid"
+"Retail Customer";"General";"assertCustomerGroupAlreadyExists"
 "customer_tax_class";"GroupName%isolation%";"assertCustomerGroupSuccessSaveMessage, assertCustomerGroupInGrid, assertCustomerGroupOnCustomerForm"
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/DeleteCustomerBackendEntityTest.php b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/DeleteCustomerBackendEntityTest.php
index 02b14d07ae771f5cd1099143e15a1162fe3bef87..dde5bfc5dfd44d1cfdcd152e89bf7428fd009a3f 100644
--- a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/DeleteCustomerBackendEntityTest.php
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/DeleteCustomerBackendEntityTest.php
@@ -25,9 +25,9 @@
 namespace Magento\Customer\Test\TestCase;
 
 use Mtf\TestCase\Injectable;
+use Magento\Customer\Test\Fixture\CustomerInjectable;
 use Magento\Customer\Test\Page\Adminhtml\CustomerIndex;
 use Magento\Customer\Test\Page\Adminhtml\CustomerIndexEdit;
-use Magento\Customer\Test\Fixture\CustomerInjectable;
 
 /**
  * Test creation for DeleteCustomerBackendEntity
@@ -65,10 +65,8 @@ class DeleteCustomerBackendEntityTest extends Injectable
      * @param CustomerIndexEdit $customerIndexEditPage
      * @return void
      */
-    public function __inject(
-        CustomerIndex $customerIndexPage,
-        CustomerIndexEdit $customerIndexEditPage
-    ) {
+    public function __inject(CustomerIndex $customerIndexPage, CustomerIndexEdit $customerIndexEditPage)
+    {
         $this->customerIndexPage = $customerIndexPage;
         $this->customerIndexEditPage = $customerIndexEditPage;
     }
@@ -76,7 +74,7 @@ class DeleteCustomerBackendEntityTest extends Injectable
     /**
      * Runs Delete Customer Backend Entity test
      *
-     * @param CustomerInjectable $initialCustomer
+     * @param CustomerInjectable $customer
      * @return void
      */
     public function testDeleteCustomerBackendEntity(CustomerInjectable $customer)
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/MassDeleteCustomerBackendEntityTest.php b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/MassDeleteCustomerBackendEntityTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..e081b8a094f986856c5fe2b8db6435e7e9318a0e
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/MassDeleteCustomerBackendEntityTest.php
@@ -0,0 +1,131 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Test\TestCase;
+
+use Mtf\TestCase\Injectable;
+use Mtf\Fixture\FixtureFactory;
+use Magento\Customer\Test\Fixture\CustomerInjectable;
+use Magento\Customer\Test\Page\Adminhtml\CustomerIndex;
+use Magento\Customer\Test\Page\Adminhtml\CustomerIndexEdit;
+
+/**
+ * Test creation for MassDeleteCustomerBackendEntityTest
+ *
+ * Test Flow:
+ * Preconditions:
+ * 1. Create X customers
+ *
+ * Steps:
+ * 1. Open backend
+ * 2. Go to  Customers - All Customers
+ * 3. Select N customers from preconditions
+ * 4. Select in dropdown "Delete"
+ * 5. Click Submit button
+ * 6. Perform all assertions according to dataset
+ *
+ * @group Customers_(CS)
+ * @ZephyrId MAGETWO-26848
+ */
+class MassDeleteCustomerBackendEntityTest extends Injectable
+{
+    /**
+     * Customer Index page
+     *
+     * @var CustomerIndex
+     */
+    protected $customerIndexPage;
+
+    /**
+     * Customer Index Edit page
+     *
+     * @var CustomerIndexEdit
+     */
+    protected $customerIndexEditPage;
+
+    /**
+     * Factory for fixture
+     *
+     * @var FixtureFactory
+     */
+    protected $fixtureFactory;
+
+    /**
+     * Preparing pages for test
+     *
+     * @param FixtureFactory $fixtureFactory
+     * @param CustomerIndex $customerIndexPage
+     * @param CustomerIndexEdit $customerIndexEditPage
+     * @return void
+     */
+    public function __inject(
+        FixtureFactory $fixtureFactory,
+        CustomerIndex $customerIndexPage,
+        CustomerIndexEdit $customerIndexEditPage
+    ) {
+        $this->fixtureFactory = $fixtureFactory;
+        $this->customerIndexPage = $customerIndexPage;
+        $this->customerIndexEditPage = $customerIndexEditPage;
+    }
+
+    /**
+     * Runs Delete Customer Backend Entity test
+     *
+     * @param int $customersQty
+     * @param int $customersQtyToDelete
+     * @return array
+     */
+    public function test($customersQty, $customersQtyToDelete)
+    {
+        // Preconditions:
+        $customers = $this->createCustomers($customersQty);
+        $deleteCustomers = [];
+        for ($i = 0; $i < $customersQtyToDelete; $i++) {
+            $deleteCustomers[] = ['email' => $customers[$i]->getEmail()];
+        }
+        // Steps:
+        $this->customerIndexPage->open();
+        $this->customerIndexPage->getCustomerGridBlock()->massaction($deleteCustomers, 'Delete', true);
+
+        return ['customers' => $customers];
+    }
+
+    /**
+     * Create Customers
+     *
+     * @param int $customersQty
+     * @return CustomerInjectable[]
+     */
+    protected function createCustomers($customersQty)
+    {
+        $customers = [];
+        for ($i = 0; $i < $customersQty; $i++) {
+            $customer = $this->fixtureFactory->createByCode('customerInjectable', ['dataSet' => 'default']);
+            $customer->persist();
+            $customers[] = $customer;
+        }
+
+        return $customers;
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/MassDeleteCustomerBackendEntityTest/test.csv b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/MassDeleteCustomerBackendEntityTest/test.csv
new file mode 100644
index 0000000000000000000000000000000000000000..143904b28dfa09aeb91713bb7c99f6663479516c
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/MassDeleteCustomerBackendEntityTest/test.csv
@@ -0,0 +1,2 @@
+"customer/dataSet";"customersQty";"customersQtyToDelete";"constraint"
+"default";"3";"2";"assertCustomerMassDeleteSuccessMessage, assertCustomerMassDeleteNotInGrid, assertCustomerMassDeleteInGrid"
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/UpdateCustomerBackendEntityTest/testUpdateCustomerBackendEntity.csv b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/UpdateCustomerBackendEntityTest/testUpdateCustomerBackendEntity.csv
index 6fd1ba7c220b3035aed886c8071f3e0eecae13a5..156e27d5ca943e73d113335fca07c9c32672baec 100644
--- a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/UpdateCustomerBackendEntityTest/testUpdateCustomerBackendEntity.csv
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/UpdateCustomerBackendEntityTest/testUpdateCustomerBackendEntity.csv
@@ -1,4 +1,4 @@
-"initialCustomer/dataSet";"customer/data/group_id";"customer/data/prefix";"customer/data/firstname";"customer/data/middlename";"customer/data/lastname";"customer/data/suffix";"customer/data/email";"customer/data/dob";"customer/data/taxvat";"customer/data/gender";"address/data/prefix";"address/data/firstname";"address/data/middlename";"address/data/lastname";"address/data/suffix";"address/data/company";"address/data/street";"address/data/city";"address/data/country_id";"address/data/region_id";"address/data/region";"address/data/postcode";"address/data/telephone";"address/data/fax";"address/data/vat_id";"constraint"
+"initialCustomer/dataSet";"customer/data/group_id/dataSet";"customer/data/prefix";"customer/data/firstname";"customer/data/middlename";"customer/data/lastname";"customer/data/suffix";"customer/data/email";"customer/data/dob";"customer/data/taxvat";"customer/data/gender";"address/data/prefix";"address/data/firstname";"address/data/middlename";"address/data/lastname";"address/data/suffix";"address/data/company";"address/data/street";"address/data/city";"address/data/country_id";"address/data/region_id";"address/data/region";"address/data/postcode";"address/data/telephone";"address/data/fax";"address/data/vat_id";"constraint"
 "default";"Wholesale";"%isolation%Prefix_";"John_%isolation%";"Middle Name %isolation%";"Doe%isolation%";"_Suffix%isolation%";"JohnDoe%isolation%@example.com";1/8/1986;123456789001;"Male";"-";"-";"-";"-";"-";"-";"-";"-";"-";"-";"-";"-";"-";"-";"-";"assertCustomerSuccessSaveMessage, assertCustomerForm, assertCustomerInGrid"
 "default";"-";"-";"-";"-";"-";"-";"-";"-";"-";"-";"Prefix%isolation%_";"Doe%isolation%";"Middle Name %isolation%";"Doe%isolation%";"_Suffix%isolation%";"Company%isolation%";"3962 Horner Street";"Dothan";"United States";"Alabama";"-";36303;"334-200-4060";"555-666-777-8910";"U1234567890";"assertCustomerSuccessSaveMessage, assertCustomerForm, assertCustomerInGrid"
 "default";"Retailer";"%isolation%Prefix_";"Jane_%isolation%";"Jane Middle Name %isolation%";"Doe%isolation%";"_JaneSuffix%isolation%";"Jane%isolation%@example.com";1/12/2000;987654321;"Female";"Prefix%isolation%_";"Doe%isolation%";"Middle Name %isolation%";"Doe%isolation%";"_Suffix%isolation%";"Company%isolation%";"39 Northgate Street";"BICKTON";"United Kingdom";"-";"PINMINNOCH";"KA26 1PF ";"999-777-111-2345";"-";987654321;"assertCustomerSuccessSaveMessage, assertCustomerForm, assertCustomerInGrid"
diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/etc/global/constraint.xml b/dev/tests/functional/tests/app/Magento/Customer/Test/etc/global/constraint.xml
index a235bf6c8a7a2a22061b407ddb4393c5c1e4f66e..c82ef107d76d97fb11bbdedadd98532c6395e135 100644
--- a/dev/tests/functional/tests/app/Magento/Customer/Test/etc/global/constraint.xml
+++ b/dev/tests/functional/tests/app/Magento/Customer/Test/etc/global/constraint.xml
@@ -121,4 +121,16 @@
             <address class="Magento\Customer\Test\Fixture\AddressInjectable" />
         </require>
     </assertCustomerDefaultAddresses>
+    <assertCustomerMassDeleteSuccessMessage module="Magento_Customer">
+        <severeness>low</severeness>
+        <require />
+    </assertCustomerMassDeleteSuccessMessage>
+    <assertCustomerMassDeleteNotInGrid module="Magento_Customer">
+        <severeness>low</severeness>
+        <require />
+    </assertCustomerMassDeleteNotInGrid>
+    <assertCustomerMassDeleteInGrid module="Magento_Customer">
+        <severeness>low</severeness>
+        <require />
+    </assertCustomerMassDeleteInGrid>
 </constraint>
diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/Block/Product/View.php b/dev/tests/functional/tests/app/Magento/Review/Test/Block/Product/View.php
index 768536202e63b6cea4f6afe9834b060e77a0d90c..f1d585dfc898735c8119906994f660fbdb86dbb8 100755
--- a/dev/tests/functional/tests/app/Magento/Review/Test/Block/Product/View.php
+++ b/dev/tests/functional/tests/app/Magento/Review/Test/Block/Product/View.php
@@ -29,8 +29,8 @@ use Mtf\Block\Block;
 use Mtf\Client\Element;
 
 /**
+ * Class View
  * Reviews frontend block
- *
  */
 class View extends Block
 {
@@ -41,69 +41,39 @@ class View extends Block
      */
     protected $itemSelector = '.review-items .review-item';
 
-    /**
-     * Nickname selector
-     *
-     * @var string
-     */
-    protected $nicknameSelector = '.review-author .review-details-value';
-
-    /**
-     * Title selector
-     *
-     * @var string
-     */
-    protected $titleSelector = '.review-title';
-
-    /**
-     * Detail selector
-     *
-     * @var string
-     */
-    protected $detailSelector = '.review-content';
-
     /**
      * Selectors mapping
      *
      * @var array
      */
-    protected $selectorsMapping;
+    protected $selectorsMapping = [
+        'nickname' => '.review-author .review-details-value',
+        'title' => '.review-title',
+        'detail' => '.review-content',
+    ];
 
     /**
-     * {@inheritdoc}
-     */
-    protected function _init()
-    {
-        parent::_init();
-        $this->selectorsMapping = array(
-            'nickname' => $this->nicknameSelector,
-            'title' => $this->titleSelector,
-            'detail' => $this->detailSelector,
-        );
-    }
-
-    /**
-     * Get first review item
+     * Is visible review item
      *
-     * @return Element
+     * @return bool
      */
-    public function getFirstReview()
+    public function isVisibleReviewItem()
     {
-        return $this->_rootElement->find($this->itemSelector);
+        return $this->_rootElement->find($this->itemSelector)->isVisible();
     }
 
     /**
-     * Get selector field for review on product view page
+     * Get field value for review on product view page
      *
      * @param string $field
-     * @return string
-     * @throws \Exception
+     * @return string|null
      */
-    public function getFieldSelector($field)
+    public function getFieldValue($field)
     {
-        if (!isset($this->selectorsMapping[$field])) {
-            throw new \Exception(sprintf('Selector of field "%s" is not defined', $field));
+        if (isset($this->selectorsMapping[$field])) {
+            return $this->_rootElement->find($this->selectorsMapping[$field])->getText();
         }
-        return $this->selectorsMapping[$field];
+
+        return null;
     }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewNotOnProductPage.php b/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewNotOnProductPage.php
new file mode 100644
index 0000000000000000000000000000000000000000..87d9939feb6e2d587a7200831fab0a1e218f76bb
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewNotOnProductPage.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\Review\Test\Constraint;
+
+use Mtf\Constraint\AbstractConstraint;
+use Magento\Review\Test\Fixture\ReviewInjectable;
+use Magento\Catalog\Test\Fixture\CatalogProductSimple;
+use Magento\Catalog\Test\Page\Product\CatalogProductView;
+
+/**
+ * Class AssertProductReviewNotOnProductPage
+ * Assert that product review Not available on product page
+ */
+class AssertProductReviewNotOnProductPage extends AbstractConstraint
+{
+    /**
+     * Constraint severeness
+     *
+     * @var string
+     */
+    protected $severeness = 'middle';
+
+    /**
+     * Assert that product review Not available on product page
+     *
+     * @param CatalogProductView $catalogProductView
+     * @param ReviewInjectable $reviewInitial
+     * @return void
+     */
+    public function processAssert(CatalogProductView $catalogProductView, ReviewInjectable $reviewInitial)
+    {
+        /** @var CatalogProductSimple $product */
+        $product = $reviewInitial->getDataFieldConfig('entity_id')['source']->getEntity();
+        $catalogProductView->init($product);
+        $catalogProductView->open();
+
+        $reviewBlock = $catalogProductView->getCustomerReviewBlock();
+        $catalogProductView->getViewBlock()->selectTab('Reviews');
+        \PHPUnit_Framework_Assert::assertFalse(
+            $reviewBlock->isVisibleReviewItem(),
+            'Error, product review is displayed.'
+        );
+    }
+
+    /**
+     * Returns a string representation of the object
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'Review is not available on the product page.';
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewOnProductPage.php b/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewOnProductPage.php
new file mode 100644
index 0000000000000000000000000000000000000000..18d14df9a0a777c20cb186c3bca44bc8e5f3e312
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewOnProductPage.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\Review\Test\Constraint;
+
+use Mtf\Constraint\AbstractConstraint;
+use Magento\Review\Test\Fixture\ReviewInjectable;
+use Magento\Catalog\Test\Fixture\CatalogProductSimple;
+use Magento\Catalog\Test\Page\Product\CatalogProductView;
+
+/**
+ * Class AssertProductReviewOnProductPage
+ * Assert that product review available on product page
+ */
+class AssertProductReviewOnProductPage extends AbstractConstraint
+{
+    /**
+     * Constraint severeness
+     *
+     * @var string
+     */
+    protected $severeness = 'middle';
+
+    /**
+     * Assert that product review available on product page
+     *
+     * @param CatalogProductView $catalogProductView
+     * @param ReviewInjectable $review
+     * @param ReviewInjectable $reviewInitial
+     * @return void
+     */
+    public function processAssert(
+        CatalogProductView $catalogProductView,
+        ReviewInjectable $review,
+        ReviewInjectable $reviewInitial
+    ) {
+        $errors = [];
+        /** @var CatalogProductSimple $product */
+        $product = $reviewInitial->getDataFieldConfig('entity_id')['source']->getEntity();
+        $catalogProductView->init($product);
+        $catalogProductView->open();
+
+        $reviewBlock = $catalogProductView->getCustomerReviewBlock();
+        $catalogProductView->getViewBlock()->selectTab('Reviews');
+        foreach ($review->getData() as $name => $value) {
+            $reviewValue = $reviewBlock->getFieldValue($name);
+            if (($reviewValue !== null) && (0 !== strcasecmp($value, trim($reviewValue)))) {
+                $errors[] = '- field "' . $name . '" is not equals submitted one, error value "' . $value . '"';
+            }
+        }
+
+        \PHPUnit_Framework_Assert::assertEmpty(
+            $errors,
+            'The Review contains the following errors:' . PHP_EOL . implode(PHP_EOL, $errors)
+        );
+    }
+
+    /**
+     * Returns a string representation of the object
+     *
+     * @return string
+     */
+    public function toString()
+    {
+        return 'Product review is displayed correct.';
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/Handler/ReviewInjectable/Curl.php b/dev/tests/functional/tests/app/Magento/Review/Test/Handler/ReviewInjectable/Curl.php
index 7d5081e94cdb3fc7a4940d85059edd2657b81317..e032a7355a18b645316db56fd8cf85cd200eefa4 100755
--- a/dev/tests/functional/tests/app/Magento/Review/Test/Handler/ReviewInjectable/Curl.php
+++ b/dev/tests/functional/tests/app/Magento/Review/Test/Handler/ReviewInjectable/Curl.php
@@ -24,15 +24,15 @@
 
 namespace Magento\Review\Test\Handler\ReviewInjectable;
 
-use Magento\Backend\Test\Handler\Extractor;
-use Magento\Review\Test\Fixture\ReviewInjectable;
-use Magento\Review\Test\Fixture\Rating;
+use Mtf\System\Config;
 use Mtf\Fixture\FixtureInterface;
-use Mtf\Handler\Curl as AbstractCurl;
 use Mtf\Util\Protocol\CurlInterface;
-use Mtf\Util\Protocol\CurlTransport\BackendDecorator;
 use Mtf\Util\Protocol\CurlTransport;
-use Mtf\System\Config;
+use Magento\Review\Test\Fixture\Rating;
+use Magento\Backend\Test\Handler\Extractor;
+use Magento\Review\Test\Fixture\ReviewInjectable;
+use Mtf\Util\Protocol\CurlTransport\BackendDecorator;
+use Mtf\Handler\Curl as AbstractCurl;
 
 /**
  * Class Curl
@@ -51,7 +51,7 @@ class Curl extends AbstractCurl implements ReviewInjectableInterface
             'Pending' => 2,
             'Not Approved' => 3
         ],
-        'stores' => [
+        'select_stores' => [
             'Main Website/Main Website Store/Default Store View' => 1
         ]
     ];
@@ -93,23 +93,33 @@ class Curl extends AbstractCurl implements ReviewInjectableInterface
         $data = $review->getData();
 
         /* Prepare ratings */
-        $sourceRatings = $review->getDataFieldConfig('ratings')['source'];
-        $ratings = [];
-        foreach ($data['ratings'] as $rating) {
-            $ratings[$rating['title']] = $rating['rating'];
+        if ($review->hasData('ratings')) {
+            $sourceRatings = $review->getDataFieldConfig('ratings')['source'];
+            $ratings = [];
+            foreach ($data['ratings'] as $rating) {
+                $ratings[$rating['title']] = $rating['rating'];
+            }
+            $data['ratings'] = [];
+            foreach ($sourceRatings->getRatings() as $ratingFixture) {
+                /** @var Rating $ratingFixture */
+                $ratingCode = $ratingFixture->getRatingCode();
+                if (isset($ratings[$ratingCode])) {
+                    $ratingOptions = $ratingFixture->getOptions();
+                    $vote = $ratings[$ratingCode];
+                    $data['ratings'][$ratingFixture->getRatingId()] = $ratingOptions[$vote];
+                }
+            }
         }
-        $data['ratings'] = [];
-        foreach ($sourceRatings->getRatings() as $ratingFixture) {
-            /** @var Rating $ratingFixture */
-            $ratingCode = $ratingFixture->getRatingCode();
-            if (isset($ratings[$ratingCode])) {
-                $ratingOptions = $ratingFixture->getOptions();
-                $vote = $ratings[$ratingCode];
-                $data['ratings'][$ratingFixture->getRatingId()] = $ratingOptions[$vote];
+
+        if ($review->hasData('select_stores')) {
+            foreach (array_keys($data['select_stores']) as $key) {
+                if (isset($this->mappingData['select_stores'][$data['select_stores'][$key]])) {
+                    $data['select_stores'][$key] = $this->mappingData['select_stores'][$data['select_stores'][$key]];
+                }
             }
         }
 
-        /* prepare product id */
+        /* Prepare product id */
         $data['product_id'] = $data['entity_id'];
         unset($data['entity_id']);
 
@@ -128,6 +138,6 @@ class Curl extends AbstractCurl implements ReviewInjectableInterface
         $extractor = new Extractor($url, $regex);
         $match = $extractor->getData();
 
-        return empty($match[1]) ? null : $match[1];
+        return empty($match[1]) ? null : (int)$match[1];
     }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/Repository/ReviewInjectable.php b/dev/tests/functional/tests/app/Magento/Review/Test/Repository/ReviewInjectable.php
index 82aa09b530f193caab625ffbc17ba4a4fc7e98c4..84963f8cfd5dee37487dd3a048d650849e4b75dd 100755
--- a/dev/tests/functional/tests/app/Magento/Review/Test/Repository/ReviewInjectable.php
+++ b/dev/tests/functional/tests/app/Magento/Review/Test/Repository/ReviewInjectable.php
@@ -33,7 +33,8 @@ use Mtf\Repository\AbstractRepository;
 class ReviewInjectable extends AbstractRepository
 {
     /**
-     * @constructor
+     * Constructor
+     *
      * @param array $defaultConfig
      * @param array $defaultData
      *
@@ -55,5 +56,14 @@ class ReviewInjectable extends AbstractRepository
             ],
             'entity_id' => ['dataSet' => 'catalogProductSimple::default']
         ];
+
+        $this->_data['frontend_review'] = [
+            'status_id' => 'Pending',
+            'select_stores' => ['Main Website/Main Website Store/Default Store View'],
+            'nickname' => 'nickname_%isolation%',
+            'title' => 'title_%isolation%',
+            'detail' => 'review_detail_%isolation%',
+            'entity_id' => ['dataSet' => 'catalogProductSimple::default']
+        ];
     }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/TestCase/ModerateProductReviewEntityTest.php b/dev/tests/functional/tests/app/Magento/Review/Test/TestCase/ModerateProductReviewEntityTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..59a11b666bf3749e67cd4b395ebab560f80d6cdd
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Review/Test/TestCase/ModerateProductReviewEntityTest.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\Review\Test\TestCase;
+
+use Mtf\TestCase\Injectable;
+use Magento\Review\Test\Fixture\ReviewInjectable;
+use Magento\Review\Test\Page\Adminhtml\ReviewEdit;
+use Magento\Review\Test\Page\Adminhtml\ReviewIndex;
+
+/**
+ * Test Creation for Moderate ProductReview Entity
+ *
+ * Test Flow:
+ *
+ * Preconditions:
+ * 1. Create product
+ * 2. Create product review
+ *
+ * Steps:
+ * 1. Login to backend
+ * 2. Open Marketing -> Reviews
+ * 3. Search and open review created in precondition
+ * 4. Fill data according to dataset
+ * 5. Save
+ * 6. Perform all assertions
+ *
+ * @group Reviews_and_Ratings_(MX)
+ * @ZephyrId MAGETWO-26768
+ */
+class ModerateProductReviewEntityTest extends Injectable
+{
+    /**
+     * Backend review grid page
+     *
+     * @var ReviewIndex
+     */
+    protected $reviewIndex;
+
+    /**
+     * Backend review edit page
+     *
+     * @var ReviewEdit
+     */
+    protected $reviewEdit;
+
+    /**
+     * Injection pages
+     *
+     * @param ReviewIndex $reviewIndex
+     * @param ReviewEdit $reviewEdit
+     * @return void
+     */
+    public function __inject(ReviewIndex $reviewIndex, ReviewEdit $reviewEdit)
+    {
+        $this->reviewIndex = $reviewIndex;
+        $this->reviewEdit = $reviewEdit;
+    }
+
+    /**
+     * Run moderate product review test
+     *
+     * @param ReviewInjectable $reviewInitial
+     * @param ReviewInjectable $review
+     * @return void
+     */
+    public function test(ReviewInjectable $reviewInitial, ReviewInjectable $review)
+    {
+        // Precondition
+        $reviewInitial->persist();
+
+        // Steps
+        $this->reviewIndex->open();
+        $this->reviewIndex->getReviewGrid()->searchAndOpen(['review_id' => $reviewInitial->getReviewId()]);
+        $this->reviewEdit->getReviewForm()->fill($review);
+        $this->reviewEdit->getPageActions()->save();
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/TestCase/ModerateProductReviewEntityTest/test.csv b/dev/tests/functional/tests/app/Magento/Review/Test/TestCase/ModerateProductReviewEntityTest/test.csv
new file mode 100644
index 0000000000000000000000000000000000000000..e908dfcc980c72364a9a8bc4bfec2bca1284d06a
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Review/Test/TestCase/ModerateProductReviewEntityTest/test.csv
@@ -0,0 +1,3 @@
+"reviewInitial/dataSet";"review/data/status_id";"review/data/nickname";"review/data/title";"review/data/detail";"constraint"
+"frontend_review";"Approved";"Nick%isolation%";"Title %isolation%";"Details %isolation%";"assertProductReviewBackendSuccessSaveMessage, assertProductReviewInGrid, assertProductReviewOnProductPage"
+"frontend_review";"Not Approved";"Nick%isolation%";"Title %isolation%";"Details %isolation%";"assertProductReviewBackendSuccessSaveMessage, assertProductReviewInGrid, assertProductReviewNotOnProductPage"
diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/TestCase/ReviewTest.php b/dev/tests/functional/tests/app/Magento/Review/Test/TestCase/ReviewTest.php
index 732a83d475dab0fa04931515c551a8e1a76e59c9..8468b20d4effe5360af9e5f2d465db37f1074f24 100755
--- a/dev/tests/functional/tests/app/Magento/Review/Test/TestCase/ReviewTest.php
+++ b/dev/tests/functional/tests/app/Magento/Review/Test/TestCase/ReviewTest.php
@@ -25,15 +25,14 @@
 namespace Magento\Review\Test\TestCase;
 
 use Mtf\Block\Form;
-use Magento\Review\Test\Block\Product\View\Summary;
-use Magento\Review\Test\Block\Product\View;
-use Magento\Review\Test\Fixture\Review;
 use Mtf\Factory\Factory;
 use Mtf\TestCase\Functional;
+use Magento\Review\Test\Fixture\Review;
+use Magento\Review\Test\Block\Product\View;
+use Magento\Review\Test\Block\Product\View\Summary;
 
 /**
  * Product reviews functionality
- *
  */
 class ReviewTest extends Functional
 {
@@ -68,7 +67,7 @@ class ReviewTest extends Functional
         $productPage->open();
         $this->verifyNoReviewOnPage($reviewsSummaryBlock);
         $reviewsSummaryBlock->getAddReviewLink()->click();
-        $this->assertFalse($reviewsBlock->getFirstReview()->isVisible(), 'No reviews below the form required');
+        $this->assertFalse($reviewsBlock->isVisibleReviewItem(), 'No reviews below the form required');
 
         $reviewForm->fill($reviewFixture);
         $reviewForm->submit();
@@ -82,7 +81,7 @@ class ReviewTest extends Functional
 
         Factory::getApp()->magentoBackendLoginUser();
         $backendReviewIndex->open();
-        $reviewGrid->searchAndOpen(array('title' => $reviewFixture->getTitle()));
+        $reviewGrid->searchAndOpen(['title' => $reviewFixture->getTitle()]);
         $this->assertEquals('Guest', $reviewBackendForm->getPostedBy(), 'Review is not posted by Guest');
         $this->assertEquals('Pending', $reviewBackendForm->getStatus(), 'Review is not in Pending status');
         $this->assertTrue(
@@ -114,7 +113,7 @@ class ReviewTest extends Functional
         $reviewsBlock = $productPage->getCustomerReviewBlock();
         $reviewsSummaryBlock->getViewReviewLink()->click();
         $this->assertContains(
-            sprintf('You\'re reviewing:%s', $productFixture->getName()),
+            sprintf("You're reviewing:\n%s", $productFixture->getName()),
             $reviewForm->getLegend()->getText()
         );
         $this->verifyReview($reviewsBlock, $reviewFixture);
@@ -154,12 +153,10 @@ class ReviewTest extends Functional
      */
     protected function verifyReview(View $reviewBlock, Review $fixture)
     {
-        $reviewItem = $reviewBlock->getFirstReview();
         foreach ($fixture->getData('fields') as $field => $data) {
-            $element = $reviewItem->find($reviewBlock->getFieldSelector($field));
             $this->assertEquals(
                 strtolower($data['value']),
-                strtolower(trim($element->getText())),
+                strtolower(trim($reviewBlock->getFieldValue($field))),
                 sprintf('Field "%s" is not equals submitted one.', $field)
             );
         }
diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/etc/global/constraint.xml b/dev/tests/functional/tests/app/Magento/Review/Test/etc/global/constraint.xml
index 24f5b1b58bf4ba79f81dc44e1e57b164603e2df8..c9779ddbf30f23836a6043d1bcb75e395f185ceb 100755
--- a/dev/tests/functional/tests/app/Magento/Review/Test/etc/global/constraint.xml
+++ b/dev/tests/functional/tests/app/Magento/Review/Test/etc/global/constraint.xml
@@ -72,4 +72,10 @@
     <assertProductReviewBackendSuccessSaveMessage module="Magento_Review">
         <severeness>middle</severeness>
     </assertProductReviewBackendSuccessSaveMessage>
+    <assertProductReviewNotOnProductPage module="Magento_Review">
+        <severeness>middle</severeness>
+    </assertProductReviewNotOnProductPage>
+    <assertProductReviewOnProductPage module="Magento_Review">
+        <severeness>middle</severeness>
+    </assertProductReviewOnProductPage>
 </constraint>
\ No newline at end of file
diff --git a/dev/tests/functional/tests/app/Magento/Store/Test/Block/Switcher.php b/dev/tests/functional/tests/app/Magento/Store/Test/Block/Switcher.php
index 8e891f8a7b4aed1dfb79d7a12783277a0e21929c..ac873714ba652e34e9832f5410ca49cbaba2e1a5 100644
--- a/dev/tests/functional/tests/app/Magento/Store/Test/Block/Switcher.php
+++ b/dev/tests/functional/tests/app/Magento/Store/Test/Block/Switcher.php
@@ -35,7 +35,7 @@ class Switcher extends Block
      *
      * @var string
      */
-    protected $dropDownButton = '#language-switcher';
+    protected $dropDownButton = '#switcher-language-trigger';
 
     /**
      * Select store
diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/Block/Adminhtml/Rule/Edit/Form.php b/dev/tests/functional/tests/app/Magento/Tax/Test/Block/Adminhtml/Rule/Edit/Form.php
index 15416a4c8fc783a341805c9b9ade64dc853a3a44..52a41776a1f2463caf0eda8183b82cd616d19797 100644
--- a/dev/tests/functional/tests/app/Magento/Tax/Test/Block/Adminhtml/Rule/Edit/Form.php
+++ b/dev/tests/functional/tests/app/Magento/Tax/Test/Block/Adminhtml/Rule/Edit/Form.php
@@ -58,7 +58,7 @@ class Form extends FormInterface
      *
      * @var string
      */
-    protected $taxRateBlock = '[class*=tax_rate]';
+    protected $taxRateBlock = '[class*="tax_rate"]';
 
     /**
      * Tax rate form
@@ -89,11 +89,11 @@ class Form extends FormInterface
     protected $optionMaskElement = './/*[contains(@class, "mselect-list-item")]//label/span[text()="%s"]';
 
     /**
-     * Css selector for Add New button
+     * XPath selector for "Add New Tax Rate" button
      *
      * @var string
      */
-    protected $addNewButton = '.mselect-button-add';
+    protected $addNewButton = './/*[contains(@class,"mselect-button-add")]';
 
     /**
      * Css selector for Add New tax class input
@@ -181,10 +181,10 @@ class Form extends FormInterface
             if (!$option->isVisible()) {
                 $taxRate = $taxRatesFixture[$key];
 
-                /** @var \Magento\Tax\Test\Fixture\TaxRate $taxRate */
-                $taxRateBlock->find($this->addNewButton)->click();
+                $this->clickAddNewButton($taxRateBlock);
                 $taxRateForm->fill($taxRate);
                 $taxRateForm->saveTaxRate();
+                /** @var \Magento\Tax\Test\Fixture\TaxRate $taxRate */
                 $code = $taxRate->getCode();
                 $this->waitUntilOptionIsVisible($taxRateBlock, $code);
             }
@@ -203,7 +203,7 @@ class Form extends FormInterface
         foreach ($taxClasses as $taxClass) {
             $option = $element->find(sprintf($this->optionMaskElement, $taxClass), Locator::SELECTOR_XPATH);
             if (!$option->isVisible()) {
-                $element->find($this->addNewButton)->click();
+                $element->find($this->addNewButton, Locator::SELECTOR_XPATH)->click();
                 $element->find($this->addNewInput)->setValue($taxClass);
                 $element->find($this->saveButton)->click();
                 $this->waitUntilOptionIsVisible($element, $taxClass);
@@ -252,4 +252,21 @@ class Form extends FormInterface
         $taxRates = $this->_rootElement->find($this->taxRateBlock, Locator::SELECTOR_CSS, 'multiselectlist');
         return $taxRates->getAllValues();
     }
+
+    /**
+     * Click 'Add New Tax Rate' button
+     *
+     * @param Element $taxRateBlock
+     * @return void
+     */
+    protected function clickAddNewButton(Element $taxRateBlock)
+    {
+        $addNewButton = $this->addNewButton;
+        $taxRateBlock->waitUntil(
+            function () use ($taxRateBlock, $addNewButton) {
+                return $taxRateBlock->find($addNewButton, Locator::SELECTOR_XPATH)->isVisible() ? true : null;
+            }
+        );
+        $taxRateBlock->find($this->addNewButton, Locator::SELECTOR_XPATH)->click();
+    }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/Block/Adminhtml/Rule/Edit/Form.xml b/dev/tests/functional/tests/app/Magento/Tax/Test/Block/Adminhtml/Rule/Edit/Form.xml
index d0df4db97b61a059c619a1cbcb658b9660724fce..822b87fb11061d28af97daeb5985ed6c74ac12b1 100644
--- a/dev/tests/functional/tests/app/Magento/Tax/Test/Block/Adminhtml/Rule/Edit/Form.xml
+++ b/dev/tests/functional/tests/app/Magento/Tax/Test/Block/Adminhtml/Rule/Edit/Form.xml
@@ -29,15 +29,15 @@
         <priority />
         <position />
         <tax_rate>
-            <selector>[class*=tax_rate]</selector>
+            <selector>[class*="tax_rate"]</selector>
             <input>multiselectlist</input>
         </tax_rate>
         <tax_customer_class>
-            <selector>[class*=tax_customer_class]</selector>
+            <selector>[class*="tax_customer_class"]</selector>
             <input>multiselectlist</input>
         </tax_customer_class>
         <tax_product_class>
-            <selector>[class*=tax_product_class]</selector>
+            <selector>[class*="tax_product_class"]</selector>
             <input>multiselectlist</input>
         </tax_product_class>
     </fields>
diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRateForm.php b/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRateForm.php
index 6dddfefda141936280ba25b6956b878dd35d8dbf..854afeb3c163f41c362747ab92150d7b785f69cc 100644
--- a/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRateForm.php
+++ b/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRateForm.php
@@ -88,7 +88,6 @@ class AssertTaxRateForm extends AbstractConstraint
         } else {
             unset($data['zip_from'], $data['zip_to']);
         }
-        $data['rate'] = number_format($data['rate'], 4);
 
         return $data;
     }
diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRuleIsApplied.php b/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRuleIsApplied.php
index f319901e8019caaa227dc7728c031e2384067351..47c9e56bbf219e56aa931ee41f440b32ff2ace6e 100644
--- a/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRuleIsApplied.php
+++ b/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRuleIsApplied.php
@@ -60,6 +60,7 @@ class AssertTaxRuleIsApplied extends AssertTaxRuleApplying
                     . "\nActual: " . $actualTax;
             }
         }
+
         if ($expectedGrandTotal !== $actualGrandTotal) {
             $errorMessages[] = 'Grand Total is not correct.'
                 . "\nExpected: " . $expectedGrandTotal
diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/UpdateTaxRateEntityTest/testUpdateTaxRate.csv b/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/UpdateTaxRateEntityTest/testUpdateTaxRate.csv
index a2d457148db738336649ed85fd5c6ee4a9e9133a..d744bbd95bb5653abc36aafbe722dd468f400037 100644
--- a/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/UpdateTaxRateEntityTest/testUpdateTaxRate.csv
+++ b/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/UpdateTaxRateEntityTest/testUpdateTaxRate.csv
@@ -4,4 +4,4 @@
 "default";"TaxIdentifier%isolation%";"No";"-";"-";"*";"United Kingdom";"*";"777";"assertTaxRateIsInCorrectRange"
 "withZipRange";"TaxIdentifier%isolation%";"No";"-";"-";"180";"Canada";"*";"25";"assertTaxRateSuccessSaveMessage, assertTaxRateInGrid, assertTaxRateForm"
 "withZipRange";"TaxIdentifier%isolation%";"Yes";"0";"7800935";"-";"United Kingdom";"*";"0";"assertTaxRateIsInCorrectRange"
-"withZipRange";"TaxIdentifier%isolation%";"No";"-";"-";"*";"France";"Val-d'Oise";"0.1";"assertTaxRateSuccessSaveMessage, assertTaxRateInGrid, assertTaxRateForm"
\ No newline at end of file
+"withZipRange";"TaxIdentifier%isolation%";"No";"-";"-";"*";"France";"Val-d'Oise";"0.1";"assertTaxRateSuccessSaveMessage, assertTaxRateInGrid, assertTaxRateForm"
diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/UpdateTaxRuleEntityTest.php b/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/UpdateTaxRuleEntityTest.php
index d35d8a55467cb985aebcf6078c585036435a9c91..9fd41f76460309850d7768cc2048e3d6b180e788 100644
--- a/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/UpdateTaxRuleEntityTest.php
+++ b/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/UpdateTaxRuleEntityTest.php
@@ -24,12 +24,12 @@
 
 namespace Magento\Tax\Test\TestCase;
 
-use Magento\Customer\Test\Fixture\AddressInjectable;
 use Mtf\TestCase\Injectable;
 use Mtf\Fixture\FixtureFactory;
 use Magento\Tax\Test\Fixture\TaxRule;
 use Magento\Tax\Test\Page\Adminhtml\TaxRuleNew;
 use Magento\Tax\Test\Page\Adminhtml\TaxRuleIndex;
+use Magento\Customer\Test\Fixture\AddressInjectable;
 
 /**
  * Test Creation for Update TaxRuleEntity
@@ -74,7 +74,7 @@ class UpdateTaxRuleEntityTest extends Injectable
      */
     public function __prepare(FixtureFactory $fixtureFactory)
     {
-        $customer = $fixtureFactory->createByCode('customerInjectable', ['dataSet' => 'default']);
+        $customer = $fixtureFactory->createByCode('customerInjectable', ['dataSet' => 'johndoe_retailer']);
         $customer->persist();
 
         return ['customer' => $customer];
@@ -87,10 +87,8 @@ class UpdateTaxRuleEntityTest extends Injectable
      * @param TaxRuleNew $taxRuleNewPage
      * @return void
      */
-    public function __inject(
-        TaxRuleIndex $taxRuleIndexPage,
-        TaxRuleNew $taxRuleNewPage
-    ) {
+    public function __inject(TaxRuleIndex $taxRuleIndexPage, TaxRuleNew $taxRuleNewPage)
+    {
         $this->taxRuleIndexPage = $taxRuleIndexPage;
         $this->taxRuleNewPage = $taxRuleNewPage;
     }
@@ -116,11 +114,8 @@ class UpdateTaxRuleEntityTest extends Injectable
         $initialTaxRule->persist();
 
         // Steps
-        $filters = [
-            'code' => $initialTaxRule->getCode(),
-        ];
         $this->taxRuleIndexPage->open();
-        $this->taxRuleIndexPage->getTaxRuleGrid()->searchAndOpen($filters);
+        $this->taxRuleIndexPage->getTaxRuleGrid()->searchAndOpen(['code' => $initialTaxRule->getCode()]);
         $this->taxRuleNewPage->getTaxRuleForm()->fill($taxRule);
         $this->taxRuleNewPage->getFormPageActions()->save();
     }
diff --git a/dev/tests/functional/tests/app/Magento/Theme/Test/Block/Links.php b/dev/tests/functional/tests/app/Magento/Theme/Test/Block/Links.php
index 5217cc42de342803687febfe69a7533920a9fa26..2b4a18baeea4a05b99e2292484054f5fbe0e7967 100644
--- a/dev/tests/functional/tests/app/Magento/Theme/Test/Block/Links.php
+++ b/dev/tests/functional/tests/app/Magento/Theme/Test/Block/Links.php
@@ -77,17 +77,14 @@ class Links extends Block
     /**
      * Get the number of products added to compare list
      *
-     * @return string|bool
+     * @return string
      */
     public function getQtyInCompareList()
     {
+        $this->waitForElementVisible($this->qtyCompareProducts);
         $compareProductLink = $this->_rootElement->find($this->qtyCompareProducts);
-        if ($compareProductLink->isVisible()) {
-            preg_match_all('/^\d+/', $compareProductLink->getText(), $matches);
-            return $matches[0][0];
-        } else {
-            return false;
-        }
+        preg_match_all('/^\d+/', $compareProductLink->getText(), $matches);
+        return $matches[0][0];
     }
 
     /**
diff --git a/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Handler/UrlRewrite/Curl.php b/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Handler/UrlRewrite/Curl.php
index 53b1b18ae578b92766e9452976341c92102609a5..f33ecd7dae843cfda533291db780b7baaace1b55 100644
--- a/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Handler/UrlRewrite/Curl.php
+++ b/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Handler/UrlRewrite/Curl.php
@@ -43,7 +43,10 @@ class Curl extends AbstractCurl implements UrlRewriteInterface
      * @var array
      */
     protected $mappingData = [
-        'store_id' => ['Default Store View' => 1],
+        'store_id' => [
+            'Default Store View' => 1,
+            'Main Website/Main Website Store/Default Store View' => 1,
+        ],
         'options' => [
             'Temporary (302)' => 'R',
             'Permanent (301)' => 'RP',
diff --git a/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Repository/UrlRewrite.php b/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Repository/UrlRewrite.php
index 949d11d90aae6a254abc0223cabcd76a721cd6b8..44d17464bcb2272a38a3e1c5055c604870f6c5c7 100644
--- a/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Repository/UrlRewrite.php
+++ b/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Repository/UrlRewrite.php
@@ -48,6 +48,12 @@ class UrlRewrite extends AbstractRepository
             'id_path' =>  ["test%isolation%"]
         ];
 
+        $this->_data['default_without_target'] = [
+            'request_path' => 'test-test-test%isolation%.html',
+            'options' => 'Temporary (302)',
+            'store_id' => 'Main Website/Main Website Store/Default Store View',
+        ];
+
         $this->_data['custom_rewrite_wishlist'] = [
             'store_id' => 'Main Website/Main Website Store/Default Store View',
             'request_path' => 'wishlist/%isolation%',
diff --git a/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/TestCase/CreateCustomUrlRewriteEntityTest.php b/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/TestCase/CreateCustomUrlRewriteEntityTest.php
index 9816b32dac117daf359b3bffda480d04e36c6186..ca87d5cc21bac71c58687504fb773905996752f2 100644
--- a/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/TestCase/CreateCustomUrlRewriteEntityTest.php
+++ b/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/TestCase/CreateCustomUrlRewriteEntityTest.php
@@ -49,7 +49,7 @@ use Magento\UrlRewrite\Test\Page\Adminhtml\UrlrewriteIndex;
  * 7. Perform all assertions
  *
  * @group URL_Rewrites_(PS)
- * @ZephyrId MTA-334
+ * @ZephyrId MAGETWO-25474
  */
 class CreateCustomUrlRewriteEntityTest extends Injectable
 {
diff --git a/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/TestCase/DeleteProductUrlRewriteEntityTest/testDeleteProductUrlRewrite.csv b/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/TestCase/DeleteProductUrlRewriteEntityTest/testDeleteProductUrlRewrite.csv
index 102c7b7f215b9acef0ecf7afa19d2e719cc50da2..4a6a2d8366631290e03102baa8d63edd69502964 100644
--- a/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/TestCase/DeleteProductUrlRewriteEntityTest/testDeleteProductUrlRewrite.csv
+++ b/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/TestCase/DeleteProductUrlRewriteEntityTest/testDeleteProductUrlRewrite.csv
@@ -1,2 +1,2 @@
 "productRedirect/dataSet";"productRedirect/data/id_path/entity";"constraint"
-"default";"product/%catalogProductSimple::100_dollar_product%";"assertUrlRewriteDeletedMessage, assertUrlRewriteNotInGrid, assertPageByUrlRewriteIsNotFound"
+"default_without_target";"product/%catalogProductSimple::100_dollar_product%";"assertUrlRewriteDeletedMessage, assertUrlRewriteNotInGrid, assertPageByUrlRewriteIsNotFound"
diff --git a/dev/tests/functional/tests/app/Magento/User/Test/Fixture/AdminUserRole.xml b/dev/tests/functional/tests/app/Magento/User/Test/Fixture/AdminUserRole.xml
index 62ec17b4b56b3ae0370b981cd170f23fd9c02b06..4884968e5baf93cc23055c8fa68d940fef5b0562 100644
--- a/dev/tests/functional/tests/app/Magento/User/Test/Fixture/AdminUserRole.xml
+++ b/dev/tests/functional/tests/app/Magento/User/Test/Fixture/AdminUserRole.xml
@@ -26,7 +26,7 @@
 <fixture class="Magento\User\Test\Fixture\AdminUserRole">
     <module>Magento_User</module>
     <type>flat</type>
-    <entity_type>admin_role</entity_type>
+    <entity_type>authorization_role</entity_type>
     <collection>Magento\User\Model\Resource\Role\User\Collection</collection>
     <fields>
         <role_id>
diff --git a/dev/tests/functional/tests/app/Magento/User/Test/TestCase/CreateAdminUserEntityTest.php b/dev/tests/functional/tests/app/Magento/User/Test/TestCase/CreateAdminUserEntityTest.php
index 239ee6aebd5a01cacc109945f52fbc8fa110e020..74f2144d179e8bd205bf0dead0c26bcba2d751e4 100644
--- a/dev/tests/functional/tests/app/Magento/User/Test/TestCase/CreateAdminUserEntityTest.php
+++ b/dev/tests/functional/tests/app/Magento/User/Test/TestCase/CreateAdminUserEntityTest.php
@@ -42,7 +42,7 @@ use Mtf\TestCase\Injectable;
  * 6. Perform assertions
  *
  * @group ACL_(MX)
- * @ZephyrId MAGETWO-21338
+ * @ZephyrId MAGETWO-23413
  */
 class CreateAdminUserEntityTest extends Injectable
 {
diff --git a/dev/tests/functional/tests/app/Magento/User/Test/etc/global/fixture.xml b/dev/tests/functional/tests/app/Magento/User/Test/etc/global/fixture.xml
index b5ee11b7bb10def0bb6fd3a38fa8c38a730ca163..ccd925cbfe1d67f3764ef8a78190e693b329b2ca 100644
--- a/dev/tests/functional/tests/app/Magento/User/Test/etc/global/fixture.xml
+++ b/dev/tests/functional/tests/app/Magento/User/Test/etc/global/fixture.xml
@@ -31,7 +31,7 @@
     </user>
     <adminUserRole module="Magento_User">
         <type>flat</type>
-        <entity_type>admin_role</entity_type>
+        <entity_type>authorization_role</entity_type>
         <collection>Magento\User\Model\Resource\Role\User\Collection</collection>
         <fields>
             <resource_access>
diff --git a/dev/tests/functional/tests/app/Magento/Wishlist/Test/Page/WishlistIndex.php b/dev/tests/functional/tests/app/Magento/Wishlist/Test/Page/WishlistIndex.php
new file mode 100644
index 0000000000000000000000000000000000000000..cc9b3901e748f52f9a772942956ddda3b86c84dd
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Wishlist/Test/Page/WishlistIndex.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\Wishlist\Test\Page;
+
+use Mtf\Page\FrontendPage;
+
+/**
+ * Class WishlistIndex
+ */
+class WishlistIndex extends FrontendPage
+{
+    const MCA = 'wishlist/index/index';
+
+    protected $_blocks = [
+        'messagesBlock' => [
+            'name' => 'messagesBlock',
+            'class' => 'Magento\Core\Test\Block\Messages',
+            'locator' => '.messages',
+            'strategy' => 'css selector',
+        ],
+    ];
+
+    /**
+     * @return \Magento\Core\Test\Block\Messages
+     */
+    public function getMessagesBlock()
+    {
+        return $this->getBlockInstance('messagesBlock');
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Wishlist/Test/Page/WishlistIndex.xml b/dev/tests/functional/tests/app/Magento/Wishlist/Test/Page/WishlistIndex.xml
new file mode 100644
index 0000000000000000000000000000000000000000..78e32fd83754367529017dfe9073ac608dde2ce0
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Wishlist/Test/Page/WishlistIndex.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)
+ */
+-->
+<page mca="wishlist/index/index" >
+    <block>
+        <name>messagesBlock</name>
+        <class>Magento\Core\Test\Block\Messages</class>
+        <locator>.messages</locator>
+        <strategy>css selector</strategy>
+    </block>
+</page>
diff --git a/dev/tests/functional/tests/app/Magento/Wishlist/Test/etc/global/page.xml b/dev/tests/functional/tests/app/Magento/Wishlist/Test/etc/global/page.xml
new file mode 100644
index 0000000000000000000000000000000000000000..afc4c9a81166aceb4b65b1edb93586907e9eb033
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Wishlist/Test/etc/global/page.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)
+ */
+-->
+<page>
+    <wishlistIndex>
+        <mca>wishlist/index/index</mca>
+        <class>Magento\Wishlist\Test\Page\WishlistIndex</class>
+    </wishlistIndex>
+</page>
diff --git a/dev/tests/integration/framework/Magento/TestFramework/Application.php b/dev/tests/integration/framework/Magento/TestFramework/Application.php
index a0d14965a78e149e07e5291a6ebd2d066dcb2ab6..4a4e97a721fe728b6fa9a788fead160ce889a170 100644
--- a/dev/tests/integration/framework/Magento/TestFramework/Application.php
+++ b/dev/tests/integration/framework/Magento/TestFramework/Application.php
@@ -23,6 +23,7 @@
  */
 namespace Magento\TestFramework;
 
+use Magento\Authorization\Model\UserContextInterface;
 use Magento\Framework\App\Filesystem;
 use Magento\Framework\App\Filesystem\DirectoryList;
 
@@ -468,18 +469,21 @@ class Application
         );
         $user->save();
 
-        /** @var $roleAdmin \Magento\User\Model\Role */
-        $roleAdmin = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\User\Model\Role');
+        /** @var $roleAdmin \Magento\Authorization\Model\Role */
+        $roleAdmin = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create('Magento\Authorization\Model\Role');
         $roleAdmin->load($adminRoleName, 'role_name');
 
-        /** @var $roleUser \Magento\User\Model\Role */
-        $roleUser = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\User\Model\Role');
+        /** @var $roleUser \Magento\Authorization\Model\Role */
+        $roleUser = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create('Magento\Authorization\Model\Role');
         $roleUser->setData(
             array(
                 'parent_id' => $roleAdmin->getId(),
                 'tree_level' => $roleAdmin->getTreeLevel() + 1,
-                'role_type' => \Magento\User\Model\Acl\Role\User::ROLE_TYPE,
+                'role_type' => \Magento\Authorization\Model\Acl\Role\User::ROLE_TYPE,
                 'user_id' => $user->getId(),
+                'user_type' => UserContextInterface::USER_TYPE_ADMIN,
                 'role_name' => $user->getFirstname()
             )
         );
diff --git a/dev/tests/integration/testsuite/Magento/AdminNotification/_files/notifications.php b/dev/tests/integration/testsuite/Magento/AdminNotification/_files/notifications.php
index b7e653c3b3f867e79d520da19bb34861173a9d9b..1abce9deabab8292fc95f3ef5e5c837c39d2871c 100644
--- a/dev/tests/integration/testsuite/Magento/AdminNotification/_files/notifications.php
+++ b/dev/tests/integration/testsuite/Magento/AdminNotification/_files/notifications.php
@@ -17,38 +17,40 @@
  * Do not edit or add to this file if you wish to upgrade Magento to newer
  * versions in the future. If you wish to customize Magento for your
  * needs please refer 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)
  */
 $om = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
 $mesasge = $om->create('Magento\AdminNotification\Model\Inbox');
 $mesasge->setSeverity(
-    \Magento\AdminNotification\Model\Inbox::SEVERITY_CRITICAL
+    \Magento\Framework\Notification\MessageInterface::SEVERITY_CRITICAL
 )->setTitle(
     'Unread Critical 1'
 )->save();
 
 $mesasge = $om->create('Magento\AdminNotification\Model\Inbox');
-$mesasge->setSeverity(\Magento\AdminNotification\Model\Inbox::SEVERITY_MAJOR)->setTitle('Unread Major 1')->save();
+$mesasge->setSeverity(\Magento\Framework\Notification\MessageInterface::SEVERITY_MAJOR)
+    ->setTitle('Unread Major 1')
+    ->save();
 
 $mesasge = $om->create('Magento\AdminNotification\Model\Inbox');
 $mesasge->setSeverity(
-    \Magento\AdminNotification\Model\Inbox::SEVERITY_CRITICAL
+    \Magento\Framework\Notification\MessageInterface::SEVERITY_CRITICAL
 )->setTitle(
     'Unread Critical 2'
 )->save();
 
 $mesasge = $om->create('Magento\AdminNotification\Model\Inbox');
 $mesasge->setSeverity(
-    \Magento\AdminNotification\Model\Inbox::SEVERITY_CRITICAL
+    \Magento\Framework\Notification\MessageInterface::SEVERITY_CRITICAL
 )->setTitle(
     'Unread Critical 3'
 )->save();
 
 $mesasge = $om->create('Magento\AdminNotification\Model\Inbox');
 $mesasge->setSeverity(
-    \Magento\AdminNotification\Model\Inbox::SEVERITY_CRITICAL
+    \Magento\Framework\Notification\MessageInterface::SEVERITY_CRITICAL
 )->setTitle(
     'Read Critical 1'
 )->setIsRead(
@@ -56,11 +58,13 @@ $mesasge->setSeverity(
 )->save();
 
 $mesasge = $om->create('Magento\AdminNotification\Model\Inbox');
-$mesasge->setSeverity(\Magento\AdminNotification\Model\Inbox::SEVERITY_MAJOR)->setTitle('Unread Major 2')->save();
+$mesasge->setSeverity(\Magento\Framework\Notification\MessageInterface::SEVERITY_MAJOR)
+    ->setTitle('Unread Major 2')
+    ->save();
 
 $mesasge = $om->create('Magento\AdminNotification\Model\Inbox');
 $mesasge->setSeverity(
-    \Magento\AdminNotification\Model\Inbox::SEVERITY_CRITICAL
+    \Magento\Framework\Notification\MessageInterface::SEVERITY_CRITICAL
 )->setTitle(
     'Removed Critical 1'
 )->setIsRemove(
diff --git a/dev/tests/integration/testsuite/Magento/User/Model/Resource/Role/CollectionTest.php b/dev/tests/integration/testsuite/Magento/Authorization/Model/Resource/Role/CollectionTest.php
similarity index 86%
rename from dev/tests/integration/testsuite/Magento/User/Model/Resource/Role/CollectionTest.php
rename to dev/tests/integration/testsuite/Magento/Authorization/Model/Resource/Role/CollectionTest.php
index b31e87ba0115d90b374b0e4347cea0236b94df13..4bafcd86fa6801bb10fd7cbf5a4f0e183123e7e5 100644
--- a/dev/tests/integration/testsuite/Magento/User/Model/Resource/Role/CollectionTest.php
+++ b/dev/tests/integration/testsuite/Magento/Authorization/Model/Resource/Role/CollectionTest.php
@@ -21,7 +21,8 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-namespace Magento\User\Model\Resource\Role;
+namespace Magento\Authorization\Model\Resource\Role;
+use Magento\Authorization\Model\UserContextInterface;
 
 /**
  * Role collection test
@@ -30,14 +31,14 @@ namespace Magento\User\Model\Resource\Role;
 class CollectionTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \Magento\User\Model\Resource\Role\Collection
+     * @var \Magento\Authorization\Model\Resource\Role\Collection
      */
     protected $_collection;
 
     protected function setUp()
     {
         $this->_collection = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
-            'Magento\User\Model\Resource\Role\Collection'
+            'Magento\Authorization\Model\Resource\Role\Collection'
         );
     }
 
@@ -45,7 +46,7 @@ class CollectionTest extends \PHPUnit_Framework_TestCase
     {
         $user = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\User\Model\User');
         $user->loadByUsername(\Magento\TestFramework\Bootstrap::ADMIN_NAME);
-        $this->_collection->setUserFilter($user->getId(), \Magento\Authz\Model\UserIdentifier::USER_TYPE_ADMIN);
+        $this->_collection->setUserFilter($user->getId(), UserContextInterface::USER_TYPE_ADMIN);
 
         $selectQueryStr = $this->_collection->getSelect()->__toString();
 
diff --git a/dev/tests/integration/testsuite/Magento/User/Model/Resource/Role/Grid/CollectionTest.php b/dev/tests/integration/testsuite/Magento/Authorization/Model/Resource/Role/Grid/CollectionTest.php
similarity index 85%
rename from dev/tests/integration/testsuite/Magento/User/Model/Resource/Role/Grid/CollectionTest.php
rename to dev/tests/integration/testsuite/Magento/Authorization/Model/Resource/Role/Grid/CollectionTest.php
index 59e0c12527f50adb35b14ac6f236580341b49ba4..9c6b5ebb8e4992f3551652b4ecd4a9b07844b5ab 100644
--- a/dev/tests/integration/testsuite/Magento/User/Model/Resource/Role/Grid/CollectionTest.php
+++ b/dev/tests/integration/testsuite/Magento/Authorization/Model/Resource/Role/Grid/CollectionTest.php
@@ -21,7 +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\User\Model\Resource\Role\Grid;
+namespace Magento\Authorization\Model\Resource\Role\Grid;
 
 /**
  * @magentoAppArea adminhtml
@@ -29,14 +29,14 @@ namespace Magento\User\Model\Resource\Role\Grid;
 class CollectionTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \Magento\User\Model\Resource\Role\Grid\Collection
+     * @var \Magento\Authorization\Model\Resource\Role\Grid\Collection
      */
     private $_collection;
 
     protected function setUp()
     {
         $this->_collection = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
-            'Magento\User\Model\Resource\Role\Grid\Collection'
+            'Magento\Authorization\Model\Resource\Role\Grid\Collection'
         );
     }
 
@@ -44,7 +44,7 @@ class CollectionTest extends \PHPUnit_Framework_TestCase
     {
         $expectedResult = array(
             array(
-                'role_type' => \Magento\User\Model\Acl\Role\Group::ROLE_TYPE,
+                'role_type' => \Magento\Authorization\Model\Acl\Role\Group::ROLE_TYPE,
                 'role_name' => \Magento\TestFramework\Bootstrap::ADMIN_ROLE_NAME
             )
         );
diff --git a/dev/tests/integration/testsuite/Magento/User/Model/Resource/RoleTest.php b/dev/tests/integration/testsuite/Magento/Authorization/Model/Resource/RoleTest.php
similarity index 90%
rename from dev/tests/integration/testsuite/Magento/User/Model/Resource/RoleTest.php
rename to dev/tests/integration/testsuite/Magento/Authorization/Model/Resource/RoleTest.php
index 282b2738fdb92a6088c8fa72a59f42103eddeb5f..c009c73d301848e874e438a9b010f43ab50e7a76 100644
--- a/dev/tests/integration/testsuite/Magento/User/Model/Resource/RoleTest.php
+++ b/dev/tests/integration/testsuite/Magento/Authorization/Model/Resource/RoleTest.php
@@ -21,7 +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\User\Model\Resource;
+namespace Magento\Authorization\Model\Resource;
 
 /**
  * Role resource test
@@ -32,9 +32,9 @@ class RoleTest extends \PHPUnit_Framework_TestCase
 {
     public function testGetRoleUsers()
     {
-        $role = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\User\Model\Role');
+        $role = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\Authorization\Model\Role');
         $roleResource = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
-            'Magento\User\Model\Resource\Role'
+            'Magento\Authorization\Model\Resource\Role'
         );
 
         $this->assertEmpty($roleResource->getRoleUsers($role));
diff --git a/dev/tests/integration/testsuite/Magento/User/Model/Resource/Rules/CollectionTest.php b/dev/tests/integration/testsuite/Magento/Authorization/Model/Resource/Rules/CollectionTest.php
similarity index 91%
rename from dev/tests/integration/testsuite/Magento/User/Model/Resource/Rules/CollectionTest.php
rename to dev/tests/integration/testsuite/Magento/Authorization/Model/Resource/Rules/CollectionTest.php
index c61adc28cc997bbbdacaff364b190f617943192c..cf29649328646d47ed13ebbc57c0cd90451066a7 100644
--- a/dev/tests/integration/testsuite/Magento/User/Model/Resource/Rules/CollectionTest.php
+++ b/dev/tests/integration/testsuite/Magento/Authorization/Model/Resource/Rules/CollectionTest.php
@@ -21,7 +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\User\Model\Resource\Rules;
+namespace Magento\Authorization\Model\Resource\Rules;
 
 /**
  * @magentoAppArea adminhtml
@@ -29,14 +29,14 @@ namespace Magento\User\Model\Resource\Rules;
 class CollectionTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \Magento\User\Model\Resource\Rules\Collection
+     * @var \Magento\Authorization\Model\Resource\Rules\Collection
      */
     protected $_collection;
 
     protected function setUp()
     {
         $this->_collection = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
-            'Magento\User\Model\Resource\Rules\Collection'
+            'Magento\Authorization\Model\Resource\Rules\Collection'
         );
     }
 
diff --git a/dev/tests/integration/testsuite/Magento/User/Model/RoleTest.php b/dev/tests/integration/testsuite/Magento/Authorization/Model/RoleTest.php
similarity index 80%
rename from dev/tests/integration/testsuite/Magento/User/Model/RoleTest.php
rename to dev/tests/integration/testsuite/Magento/Authorization/Model/RoleTest.php
index f8e6bbd0daa06a4ff92aa69b4165b119124f0335..29e53656ade96d0bb8cd07bd096de8d4954f7006 100644
--- a/dev/tests/integration/testsuite/Magento/User/Model/RoleTest.php
+++ b/dev/tests/integration/testsuite/Magento/Authorization/Model/RoleTest.php
@@ -21,7 +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\User\Model;
+namespace Magento\Authorization\Model;
 
 /**
  * @magentoAppArea adminhtml
@@ -29,21 +29,14 @@ namespace Magento\User\Model;
 class RoleTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \Magento\User\Model\Role
+     * @var \Magento\Authorization\Model\Role
      */
     protected $_model = null;
 
     protected function setUp()
     {
-        $this->_model = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\User\Model\Role');
-    }
-
-    public function testGetUsersCollection()
-    {
-        $this->assertInstanceOf(
-            'Magento\User\Model\Resource\Role\User\Collection',
-            $this->_model->getUsersCollection()
-        );
+        $this->_model = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create('Magento\Authorization\Model\Role');
     }
 
     public function testGetRoleUsers()
diff --git a/dev/tests/integration/testsuite/Magento/User/Model/RulesTest.php b/dev/tests/integration/testsuite/Magento/Authorization/Model/RulesTest.php
similarity index 94%
rename from dev/tests/integration/testsuite/Magento/User/Model/RulesTest.php
rename to dev/tests/integration/testsuite/Magento/Authorization/Model/RulesTest.php
index fd6271449ae7b8fd0fc89f02a6d13d0c103b4ece..758127827fc2814d22e8f59ed466c97ff075ca10 100644
--- a/dev/tests/integration/testsuite/Magento/User/Model/RulesTest.php
+++ b/dev/tests/integration/testsuite/Magento/Authorization/Model/RulesTest.php
@@ -21,7 +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\User\Model;
+namespace Magento\Authorization\Model;
 
 /**
  * @magentoAppArea adminhtml
@@ -29,14 +29,14 @@ namespace Magento\User\Model;
 class RulesTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \Magento\User\Model\Rules
+     * @var \Magento\Authorization\Model\Rules
      */
     protected $_model;
 
     protected function setUp()
     {
         $this->_model = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
-            'Magento\User\Model\Rules'
+            'Magento\Authorization\Model\Rules'
         );
     }
 
@@ -67,7 +67,7 @@ class RulesTest extends \PHPUnit_Framework_TestCase
     }
 
     /**
-     * @covers \Magento\User\Model\Rules::saveRel
+     * @covers \Magento\Authorization\Model\Rules::saveRel
      * @magentoDbIsolation enabled
      */
     public function testSetAllowForAllResources()
diff --git a/dev/tests/integration/testsuite/Magento/Authz/Service/AuthorizationV1Test.php b/dev/tests/integration/testsuite/Magento/Authz/Service/AuthorizationV1Test.php
deleted file mode 100644
index 5b8bad590ed330ae96c4300a91d25fced755ad12..0000000000000000000000000000000000000000
--- a/dev/tests/integration/testsuite/Magento/Authz/Service/AuthorizationV1Test.php
+++ /dev/null
@@ -1,236 +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\Authz\Service;
-
-use Magento\Authz\Service\AuthorizationV1Test\UserLocatorStub;
-use Magento\Authz\Model\UserIdentifier;
-
-/**
- * Authorization service test.
- */
-class AuthorizationV1Test extends \PHPUnit_Framework_TestCase
-{
-    /** @var AuthorizationV1 */
-    protected $_service;
-
-    protected function setUp()
-    {
-        parent::setUp();
-        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
-        $loggerMock = $this->getMockBuilder('Magento\\Framework\\Logger')->disableOriginalConstructor()->getMock();
-        $loggerMock->expects($this->any())->method('logException')->will($this->returnSelf());
-        $this->_service = $objectManager->create(
-            'Magento\\Authz\\Service\\AuthorizationV1',
-            array(
-                'userIdentifier' => $this->_createUserIdentifier(UserIdentifier::USER_TYPE_INTEGRATION),
-                'logger' => $loggerMock
-            )
-        );
-    }
-
-    /**
-     * @param string $userType
-     * @param string[] $resources
-     * @magentoDbIsolation enabled
-     * @dataProvider basicAuthFlowProvider
-     */
-    public function testBasicAuthFlow($userType, $resources)
-    {
-        $userIdentifier = $this->_createUserIdentifier($userType);
-
-        /** Preconditions check */
-        $this->_ensurePermissionsAreNotGranted($userIdentifier, $resources);
-
-        $this->_service->grantPermissions($userIdentifier, $resources);
-
-        /** Validate that access to the specified resources is granted */
-        $this->_ensurePermissionsAreGranted($userIdentifier, $resources);
-    }
-
-    public function basicAuthFlowProvider()
-    {
-        return array(
-            'integration' => array(
-                'userType' => UserIdentifier::USER_TYPE_INTEGRATION,
-                'resources' => array('Magento_Sales::create', 'Magento_Cms::page', 'Magento_Adminhtml::dashboard')
-            )
-        );
-    }
-
-    /**
-     * @param string $userType
-     * @param string[] $initialResources
-     * @param string[] $newResources
-     * @magentoDbIsolation enabled
-     * @dataProvider changePermissionsProvider
-     */
-    public function testChangePermissions($userType, $initialResources, $newResources)
-    {
-        $userIdentifier = $this->_createUserIdentifier($userType);
-
-        $this->_service->grantPermissions($userIdentifier, $initialResources);
-        /** Preconditions check */
-        $this->_ensurePermissionsAreGranted($userIdentifier, $initialResources);
-        $this->_ensurePermissionsAreNotGranted($userIdentifier, $newResources);
-
-        $this->_service->grantPermissions($userIdentifier, $newResources);
-
-        /** Check the results of permissions change */
-        $this->_ensurePermissionsAreGranted($userIdentifier, $newResources);
-        $this->_ensurePermissionsAreNotGranted($userIdentifier, $initialResources);
-    }
-
-    public function changePermissionsProvider()
-    {
-        return array(
-            'integration' => array(
-                'userType' => UserIdentifier::USER_TYPE_INTEGRATION,
-                'initialResources' => array('Magento_Cms::page', 'Magento_Adminhtml::dashboard'),
-                'newResources' => array('Magento_Sales::cancel', 'Magento_Cms::page_delete')
-            ),
-            'integration clear permissions' => array(
-                'userType' => UserIdentifier::USER_TYPE_INTEGRATION,
-                'initialResources' => array('Magento_Sales::capture', 'Magento_Cms::page_delete'),
-                'newResources' => array()
-            )
-        );
-    }
-
-    /**
-     * @magentoDbIsolation enabled
-     */
-    public function testIsAllowedArrayOfResources()
-    {
-        $userIdentifier = $this->_createUserIdentifier(UserIdentifier::USER_TYPE_INTEGRATION);
-        $resources = array('Magento_Cms::page', 'Magento_Adminhtml::dashboard');
-        $this->_service->grantPermissions($userIdentifier, $resources);
-        /** Preconditions check */
-        $this->_ensurePermissionsAreGranted($userIdentifier, $resources);
-
-        /** Ensure that permissions check to multiple resources at once works as expected */
-        $this->assertTrue(
-            $this->_service->isAllowed($resources, $userIdentifier),
-            'Access to multiple resources is expected to be granted, but is prohibited.'
-        );
-        $this->assertFalse(
-            $this->_service->isAllowed(array_merge($resources, array('invalid_resource')), $userIdentifier),
-            'Access is expected to be denied when at least one of the resources is unavailable.'
-        );
-    }
-
-    /**
-     * @magentoDbIsolation enabled
-     */
-    public function testGetAllowedResources()
-    {
-        $userIdentifierA = $this->_createUserIdentifier(UserIdentifier::USER_TYPE_INTEGRATION);
-        $resourcesA = array('Magento_Adminhtml::dashboard', 'Magento_Cms::page');
-        $this->_service->grantPermissions($userIdentifierA, $resourcesA);
-
-        $userIdentifierB = $this->_createUserIdentifier(UserIdentifier::USER_TYPE_INTEGRATION);
-        $resourcesB = array('Magento_Cms::block', 'Magento_Sales::cancel');
-        $this->_service->grantPermissions($userIdentifierB, $resourcesB);
-
-        /** Preconditions check */
-        $this->_ensurePermissionsAreGranted($userIdentifierA, $resourcesA);
-        $this->_ensurePermissionsAreGranted($userIdentifierB, $resourcesB);
-
-        $this->assertEquals(
-            $resourcesA,
-            $this->_service->getAllowedResources($userIdentifierA),
-            "The list of resources allowed to the user is invalid."
-        );
-
-        $this->assertEquals(
-            $resourcesB,
-            $this->_service->getAllowedResources($userIdentifierB),
-            "The list of resources allowed to the user is invalid."
-        );
-    }
-
-    /**
-     * @expectedException \Magento\Framework\Exception\AuthorizationException
-     * @expectedMessage The role associated with the specified user cannot be found.
-     */
-    public function testGetAllowedResourcesRoleNotFound()
-    {
-        $userIdentifier = $this->_createUserIdentifier(UserIdentifier::USER_TYPE_INTEGRATION);
-        $this->_service->getAllowedResources($userIdentifier);
-    }
-
-    /**
-     * @magentoDbIsolation enabled
-     */
-    public function testGrantAllPermissions()
-    {
-        $userIdentifier = $this->_createUserIdentifier(UserIdentifier::USER_TYPE_INTEGRATION);
-        $this->_service->grantAllPermissions($userIdentifier);
-        $this->_ensurePermissionsAreGranted($userIdentifier, array('Magento_Adminhtml::all'));
-    }
-
-    /**
-     * Create new User identifier
-     *
-     * @param string $userType
-     * @return UserIdentifier
-     */
-    protected function _createUserIdentifier($userType)
-    {
-        $userId = $userType == UserIdentifier::USER_TYPE_GUEST ? 0 : rand(1, 1000);
-        $userLocatorStub = new UserLocatorStub();
-        return new UserIdentifier($userLocatorStub, $userType, $userId);
-    }
-
-    /**
-     * Check if user has access to the specified resources.
-     *
-     * @param UserIdentifier $userIdentifier
-     * @param string[] $resources
-     */
-    protected function _ensurePermissionsAreGranted($userIdentifier, $resources)
-    {
-        foreach ($resources as $resource) {
-            $this->assertTrue(
-                $this->_service->isAllowed($resource, $userIdentifier),
-                "Access to resource '{$resource}' is prohibited while it is expected to be granted."
-            );
-        }
-    }
-
-    /**
-     * Check if access to the specified resources is prohibited to the user.
-     *
-     * @param UserIdentifier $userIdentifier
-     * @param string[] $resources
-     */
-    protected function _ensurePermissionsAreNotGranted($userIdentifier, $resources)
-    {
-        foreach ($resources as $resource) {
-            $this->assertFalse(
-                $this->_service->isAllowed($resource, $userIdentifier),
-                "Access to resource '{$resource}' is expected to be prohibited."
-            );
-        }
-    }
-}
diff --git a/dev/tests/integration/testsuite/Magento/Bundle/_files/product.php b/dev/tests/integration/testsuite/Magento/Bundle/_files/product.php
index 79c74e8898bcad54bebf73124a979e861dc97211..2c0ef102cac085fce4631371d844ab59c8c0213c 100644
--- a/dev/tests/integration/testsuite/Magento/Bundle/_files/product.php
+++ b/dev/tests/integration/testsuite/Magento/Bundle/_files/product.php
@@ -48,10 +48,17 @@ $product->setTypeId(
 )->setStatus(
     \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED
 )->setStockData(
-    array('use_config_manage_stock' => 1, 'qty' => 100, 'is_qty_decimal' => 0, 'is_in_stock' => 1)
+    ['use_config_manage_stock' => 1, 'qty' => 100, 'is_qty_decimal' => 0, 'is_in_stock' => 1]
 )->setBundleOptionsData(
-    array(array('title' => 'Bundle Product Items', 'type' => 'select', 'required' => 1, 'delete' => ''))
+    [
+        [
+            'title' => 'Bundle Product Items',
+            'default_title' => 'Bundle Product Items',
+            'type' => 'select', 'required' => 1,
+            'delete' => ''
+        ]
+    ]
 )->setBundleSelectionsData(
-    array(array(array('product_id' => 1, 'selection_qty' => 1, 'selection_can_change_qty' => 1, 'delete' => '')))
+    [[['product_id' => 1, 'selection_qty' => 1, 'selection_can_change_qty' => 1, 'delete' => '']]]
     // fixture product
 )->save();
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Resource/Product/Link/Product/CollectionTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Resource/Product/Link/Product/CollectionTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..c1fa064c728c7c1e1c80884e3daa4e83f0f4bd6d
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Resource/Product/Link/Product/CollectionTest.php
@@ -0,0 +1,78 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Link\Product;
+
+class CollectionTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Catalog\Model\Resource\Product\Collection
+     */
+    protected $collection;
+
+    /**
+     * Sets up the fixture, for example, opens a network connection.
+     * This method is called before a test is executed.
+     */
+    protected function setUp()
+    {
+        $this->collection = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+            'Magento\Catalog\Model\Resource\Product\Link\Product\Collection'
+        );
+    }
+
+    /**
+     * @magentoDataFixture Magento/Catalog/_files/products_crosssell.php
+     */
+    public function testAddLinkAttributeToFilterWithResults()
+    {
+        $om = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $link = $om->get('\Magento\Catalog\Model\Product\Link')->useCrossSellLinks();
+        $this->collection->setLinkModel($link);
+        $this->collection->addLinkAttributeToFilter('position', array('from' => 0, 'to' => 2));
+        $product = $om->get('Magento\Catalog\Model\Product')->load(2);
+        $this->collection->setProduct($product);
+        $this->collection->load();
+        $this->assertCount(1, $this->collection->getItems());
+        foreach ($this->collection as $item) {
+            $this->assertGreaterThan(0, $item->getPosition());
+            $this->assertLessThan(2, $item->getPosition());
+        }
+
+    }
+
+    /**
+     * @magentoDataFixture Magento/Catalog/_files/products_crosssell.php
+     */
+    public function testAddLinkAttributeToFilterNoResults()
+    {
+        $om = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $link = $om->get('\Magento\Catalog\Model\Product\Link')->useCrossSellLinks();
+        $this->collection->setLinkModel($link);
+        $this->collection->addLinkAttributeToFilter('position', array('from' => 2, 'to' => 3));
+        $product = $om->get('Magento\Catalog\Model\Product')->load(2);
+        $this->collection->setProduct($product);
+        $this->collection->load();
+        $this->assertCount(0, $this->collection->getItems());
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Resource/Product/OptionTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Resource/Product/OptionTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..73a93e14abb9c5d10c976ed53f711bbed35cd067
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Resource/Product/OptionTest.php
@@ -0,0 +1,214 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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;
+
+class OptionTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Catalog\Model\Resource\Product
+     */
+    protected $productResource;
+
+    /**
+     * @var \Magento\Framework\Registry
+     */
+    protected $registry;
+
+    protected function setUp()
+    {
+        /** @var \Magento\Catalog\Model\Resource\Product $productResource */
+        $this->productResource = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
+            'Magento\Catalog\Model\Resource\Product'
+        );
+    }
+
+
+    /**
+     * Data provider for testSaveTitle
+     *
+     * @return array
+     */
+    public function saveTitleDataProvider()
+    {
+        return [
+            [
+                [
+                    [
+                        'is_delete' => NULL,
+                        'previous_type' => 'drop_down',
+                        'previous_group' => 'select',
+                        'sort_order' => '0',
+                        'title' => 'custom option view',
+                        'type' => 'drop_down',
+                        'is_require' => '1',
+                        'values' => [
+                            [
+                                'sort_order' => '0',
+                                'option_type_id' => '-1',
+                                'is_delete' => NULL,
+                                'title' => '1 custom option title second view',
+                                'price' => '10.00',
+                                'price_type' => 'fixed',
+                                'sku' => NULL,
+                            ],
+                        ],
+                    ],
+                ],
+                2,
+                false,
+            ],
+            [
+                [
+                    [
+                        'is_delete' => NULL,
+                        'previous_type' => 'drop_down',
+                        'previous_group' => 'select',
+                        'sort_order' => '0',
+                        'title' => 'custom option view',
+                        'type' => 'drop_down',
+                        'is_require' => '1',
+                        'values' => [
+                            [
+                                'sort_order' => '0',
+                                'option_type_id' => '-1',
+                                'is_delete' => NULL,
+                                'title' => '2 custom option title',
+                                'price' => '10.00',
+                                'price_type' => 'fixed',
+                                'sku' => NULL,
+                            ],
+                        ],
+                    ],
+                ],
+                \Magento\Store\Model\Store::DEFAULT_STORE_ID,
+                true,
+            ],
+        ];
+    }
+
+    /**
+     * @magentoDbIsolation enabled
+     * @magentoDataFixture Magento/Store/_files/second_store.php
+     * @magentoDataFixture Magento/Catalog/_files/product_without_options.php
+     * @dataProvider saveTitleDataProvider
+     */
+    public function testSaveTitle($options, $storeId, $result)
+    {
+        $productId = 1;
+        $store = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\Store\Model\Store');
+        $store->load('fixture_second_store');
+
+        $title = $options[0]['values'][0]['title'];
+        $product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+            '\Magento\Catalog\Model\Product'
+        );
+        $product->load($productId);
+        $product->setStoreIds(array($storeId));
+        $product->setProductOptions($options);
+        $product->setCanSaveCustomOptions(true);
+        $product->save();
+
+        $typeTitle = $this->productResource->getTable('catalog_product_option_type_title');
+        $typeValue = $this->productResource->getTable('catalog_product_option_type_value');
+        $typeOption = $this->productResource->getTable('catalog_product_option');
+
+        $select = $this->productResource->getReadConnection()->select()->from(
+            ['t' => $typeTitle],
+            ['title']
+        )->join(
+            ['ov' => $typeValue],
+            't.option_type_id = ov.option_type_id'
+        )->join(
+            ['o' => $typeOption],
+            'ov.option_id = o.option_id'
+        )->where(
+            'o.product_id = ?',
+            $productId
+        )->where(
+            't.store_id = ?',
+            $storeId
+        )->where(
+            't.title = ?',
+            $title
+        );
+
+        $testResult = $this->productResource->getReadConnection()->fetchOne($select);
+        $this->assertEquals($result, (bool)$testResult);
+    }
+
+    /**
+     * @magentoDbIsolation enabled
+     * @magentoDataFixture Magento/Store/_files/second_store.php
+     * @magentoDataFixture Magento/Catalog/_files/product_without_options.php
+     * @dataProvider saveTitleDataProvider
+     */
+    public function testSavePrice($options, $storeId, $result)
+    {
+        $productId = 1;
+        $store = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\Store\Model\Store');
+        $store->load('fixture_second_store');
+
+        $price = $options[0]['values'][0]['price'];
+        $priceType = $options[0]['values'][0]['price_type'];
+        $product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+            '\Magento\Catalog\Model\Product'
+        );
+        $product->load($productId);
+        $product->setStoreIds(array($storeId));
+        $product->setProductOptions($options);
+        $product->setCanSaveCustomOptions(true);
+        $product->save();
+
+        $typePrice = $this->productResource->getTable('catalog_product_option_type_price');
+        $typeValue = $this->productResource->getTable('catalog_product_option_type_value');
+        $typeOption = $this->productResource->getTable('catalog_product_option');
+
+        $select = $this->productResource->getReadConnection()->select()->from(
+            ['p' => $typePrice],
+            ['price', 'price_type']
+        )->join(
+            ['ov' => $typeValue],
+            'p.option_type_id = ov.option_type_id'
+        )->join(
+            ['o' => $typeOption],
+            'ov.option_id = o.option_id'
+        )->where(
+            'o.product_id = ?',
+            $productId
+        )->where(
+            'p.store_id = ?',
+            $storeId
+        )->where(
+            'p.price = ?',
+            $price
+        )->where(
+            'p.price_type = ?',
+            $priceType
+        );
+
+        $testResult = $this->productResource->getReadConnection()->fetchOne($select);
+        $this->assertEquals($result, (bool)$testResult);
+    }
+
+}
diff --git a/dev/tests/integration/testsuite/Magento/Checkout/Model/Type/OnepageTest.php b/dev/tests/integration/testsuite/Magento/Checkout/Model/Type/OnepageTest.php
index 02c95f874ab454cca261ab95931427642640a7fa..7b3cc4b2839396397949af83f57890c19bcbda8c 100644
--- a/dev/tests/integration/testsuite/Magento/Checkout/Model/Type/OnepageTest.php
+++ b/dev/tests/integration/testsuite/Magento/Checkout/Model/Type/OnepageTest.php
@@ -401,8 +401,7 @@ class OnepageTest extends \PHPUnit_Framework_TestCase
         /** Execute SUT */
         $result = $this->_model->saveBilling($customerData, $customerAddressId);
         $validationErrors = array(
-            '"First Name" is a required value.',
-            '"First Name" length must be equal or greater than 1 characters.'
+            '"First Name" is a required value.'
         );
         $this->assertEquals(
             array('error' => 1, 'message' => $validationErrors),
diff --git a/dev/tests/integration/testsuite/Magento/Checkout/_files/quote_with_address.php b/dev/tests/integration/testsuite/Magento/Checkout/_files/quote_with_address.php
index 4ac5510041dc4ebedb84d63e33ee71fd663218f8..77a38ad0058625136bb180cd83355ace2941482e 100644
--- a/dev/tests/integration/testsuite/Magento/Checkout/_files/quote_with_address.php
+++ b/dev/tests/integration/testsuite/Magento/Checkout/_files/quote_with_address.php
@@ -34,7 +34,7 @@ $quoteShippingAddress = \Magento\TestFramework\Helper\Bootstrap::getObjectManage
 $addressService = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
     'Magento\Customer\Service\V1\CustomerAddressServiceInterface'
 );
-$quoteShippingAddress->importCustomerAddressData($addressService->getAddressById(1));
+$quoteShippingAddress->importCustomerAddressData($addressService->getAddress(1));
 
 /** @var \Magento\Sales\Model\Quote $quote */
 $quote = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\Sales\Model\Quote');
@@ -54,6 +54,10 @@ $quote->setStoreId(
     $customer->getMode()
 )->setPasswordHash(
     $customer->encryptPassword($customer->getPassword())
+)->setReservedOrderId(
+    'test_order_1'
+)->setEmail(
+    'aaa@aaa.com'
 )->addProduct(
     $product->load($product->getId()),
     2
diff --git a/dev/tests/integration/testsuite/Magento/Checkout/_files/quote_with_address_saved_rollback.php b/dev/tests/integration/testsuite/Magento/Checkout/_files/quote_with_address_saved_rollback.php
new file mode 100644
index 0000000000000000000000000000000000000000..2752260a727d731b2c6a68d4691a417ed4c35d41
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Checkout/_files/quote_with_address_saved_rollback.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Rollback for quote_with_address_saved.php fixture.
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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 $objectManager \Magento\TestFramework\ObjectManager */
+$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+$quote = $objectManager->create('\Magento\Sales\Model\Quote');
+$quote->load('test_order_1', 'reserved_order_id')->delete();
diff --git a/dev/tests/integration/testsuite/Magento/Checkout/_files/quote_with_virtual_product_and_address.php b/dev/tests/integration/testsuite/Magento/Checkout/_files/quote_with_virtual_product_and_address.php
new file mode 100644
index 0000000000000000000000000000000000000000..78d04202118f9671439b17f63adb5d9408971578
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Checkout/_files/quote_with_virtual_product_and_address.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)
+ */
+require __DIR__ . '/../../Customer/_files/customer.php';
+require __DIR__ . '/../../Customer/_files/customer_address.php';
+require __DIR__ . '/../../../Magento/Catalog/_files/product_virtual.php';
+
+/** @var \Magento\Sales\Model\Quote\Address $quoteShippingAddress */
+$quoteShippingAddress = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+    'Magento\Sales\Model\Quote\Address'
+);
+/** @var \Magento\Customer\Service\V1\CustomerAddressServiceInterface $addressService */
+$addressService = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+    'Magento\Customer\Service\V1\CustomerAddressServiceInterface'
+);
+$quoteShippingAddress->importCustomerAddressData($addressService->getAddress(1));
+
+/** @var \Magento\Sales\Model\Quote $quote */
+$quote = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\Sales\Model\Quote');
+$quote->setStoreId(
+        1
+    )->setIsActive(
+        false
+    )->setIsMultiShipping(
+        false
+    )->assignCustomerWithAddressChange(
+        $customer
+    )->setShippingAddress(
+        $quoteShippingAddress
+    )->setBillingAddress(
+        $quoteShippingAddress
+    )->setCheckoutMethod(
+        $customer->getMode()
+    )->setPasswordHash(
+        $customer->encryptPassword($customer->getPassword())
+    )->setReservedOrderId(
+        'test_order_with_virtual_product'
+    )->setEmail(
+        'store@example.com'
+    )->addProduct(
+        $product->load($product->getId()),
+        1
+    );
+
+$quote->collectTotals()->save();
diff --git a/dev/tests/integration/testsuite/Magento/Checkout/_files/quote_with_virtual_product_and_address_rollback.php b/dev/tests/integration/testsuite/Magento/Checkout/_files/quote_with_virtual_product_and_address_rollback.php
new file mode 100644
index 0000000000000000000000000000000000000000..caae33683a12c1f345c701c706e4fc09bf7ef147
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Checkout/_files/quote_with_virtual_product_and_address_rollback.php
@@ -0,0 +1,29 @@
+<?php
+/**
+ * Rollback for quote_with_virtual_product_and_address.php fixture.
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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 $objectManager \Magento\TestFramework\ObjectManager */
+$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+$quote = $objectManager->create('\Magento\Sales\Model\Quote');
+$quote->load('test_order_with_virtual_product', 'reserved_order_id')->delete();
diff --git a/dev/tests/integration/testsuite/Magento/Customer/Controller/Adminhtml/IndexTest.php b/dev/tests/integration/testsuite/Magento/Customer/Controller/Adminhtml/IndexTest.php
index e60870091808513287380c23cbe661aca2c5cf06..324101bbcbf3d4d6653fc1a2960366988bcf829f 100755
--- a/dev/tests/integration/testsuite/Magento/Customer/Controller/Adminhtml/IndexTest.php
+++ b/dev/tests/integration/testsuite/Magento/Customer/Controller/Adminhtml/IndexTest.php
@@ -1023,11 +1023,8 @@ class IndexTest extends \Magento\Backend\Utility\Controller
         $this->assertContains('{"error":1,"html_message":', $body);
         $this->assertContains('Please correct this email address: \"*\".', $body);
         $this->assertContains('\"First Name\" is a required value.', $body);
-        $this->assertContains('\"First Name\" length must be equal or greater than 1 characters', $body);
         $this->assertContains('\"Last Name\" is a required value.', $body);
-        $this->assertContains('\"Last Name\" length must be equal or greater than 1 characters', $body);
         $this->assertContains('\"Telephone\" is a required value.', $body);
-        $this->assertContains('\"Telephone\" length must be equal or greater than 1 characters', $body);
         $this->assertContains('\"Country\" is a required value.', $body);
     }
 
diff --git a/dev/tests/integration/testsuite/Magento/Customer/_files/customer_non_default_website_id_rollback.php b/dev/tests/integration/testsuite/Magento/Customer/_files/customer_non_default_website_id_rollback.php
new file mode 100644
index 0000000000000000000000000000000000000000..8ba99e672e1330668e629fe994b640afbb88c876
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Customer/_files/customer_non_default_website_id_rollback.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)
+ */
+include __DIR__ . '/customer_rollback.php';
+
+/** @var \Magento\Framework\Registry $registry */
+$registry = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\Framework\Registry');
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', true);
+
+/** @var $website Magento\Store\Model\Website */
+$website = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\Store\Model\Website');
+$website->load('newwebsite', 'code');
+if ($website->getId()) {
+    $website->delete();
+}
+
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', false);
diff --git a/app/code/Magento/User/data/user_setup/data-upgrade-1.6.1.4-1.6.1.5.php b/dev/tests/integration/testsuite/Magento/Customer/_files/customer_rollback.php
similarity index 62%
rename from app/code/Magento/User/data/user_setup/data-upgrade-1.6.1.4-1.6.1.5.php
rename to dev/tests/integration/testsuite/Magento/Customer/_files/customer_rollback.php
index 19c515ace7689a5aac4532db14d36643a40bfb6b..78ce1428d83f012f3e5de04bc5387b213f896e21 100644
--- a/app/code/Magento/User/data/user_setup/data-upgrade-1.6.1.4-1.6.1.5.php
+++ b/dev/tests/integration/testsuite/Magento/Customer/_files/customer_rollback.php
@@ -22,16 +22,17 @@
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
-/** @var $installer \Magento\Framework\Module\Setup */
-$installer = $this;
-$installer->startSetup();
+/** @var \Magento\Framework\Registry $registry */
+$registry = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\Framework\Registry');
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', true);
 
-$tableName = $installer->getTable('admin_rule');
-
-if ($tableName) {
-    /** @var \Magento\Framework\DB\Adapter\AdapterInterface $connection */
-    $connection = $installer->getConnection();
-    $connection->delete($tableName, array('resource_id = ?' => 'Magento_Oauth::oauth'));
+/** @var $customer \Magento\Customer\Model\Customer*/
+$customer = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\Customer\Model\Customer');
+$customer->load(1);
+if ($customer->getId()) {
+    $customer->delete();
 }
 
-$installer->endSetup();
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', false);
diff --git a/dev/tests/integration/testsuite/Magento/Downloadable/_files/order_with_downloadable_product.php b/dev/tests/integration/testsuite/Magento/Downloadable/_files/order_with_downloadable_product.php
index 0c9dcb70629e9340076fe17a608aeeefcf8c0aa6..9a582e4f76afb0742b5ac80646a073309a08640f 100644
--- a/dev/tests/integration/testsuite/Magento/Downloadable/_files/order_with_downloadable_product.php
+++ b/dev/tests/integration/testsuite/Magento/Downloadable/_files/order_with_downloadable_product.php
@@ -55,7 +55,8 @@ $orderItem->setProductId(
 );
 
 $order = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\Sales\Model\Order');
-$order->addItem(
+$order->setCustomerEmail('mail@to.co')
+    ->addItem(
     $orderItem
 )->setIncrementId(
     '100000001'
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Code/_expected/SourceClassWithNamespaceInterceptor.php b/dev/tests/integration/testsuite/Magento/Framework/Code/_expected/SourceClassWithNamespaceInterceptor.php
index b02a75c925be0b87642b462daf9395b7e453aa9e..b649edb4a6deb23da5a7cd3cec2324a647555572 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/Code/_expected/SourceClassWithNamespaceInterceptor.php
+++ b/dev/tests/integration/testsuite/Magento/Framework/Code/_expected/SourceClassWithNamespaceInterceptor.php
@@ -70,7 +70,7 @@ class Interceptor extends \Magento\Framework\Code\GeneratorTest\SourceClassWithN
     public function __sleep()
     {
         if (method_exists(get_parent_class($this), '__sleep')) {
-            return parent::__sleep();
+            return array_diff(parent::__sleep(), array('pluginLocator', 'pluginList', 'chain', 'subjectType'));
         } else {
             return array_keys(get_class_vars(get_parent_class($this)));
         }
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Search/Request/Config/ConverterTest.php b/dev/tests/integration/testsuite/Magento/Framework/Search/Request/Config/ConverterTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..d4f1d81359729c8dd7c532ad6dfe121cad0cdd4e
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Framework/Search/Request/Config/ConverterTest.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\Framework\Search\Request\Config;
+
+class ConverterTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var  Converter */
+    protected $object;
+
+    protected function setUp()
+    {
+        $this->object = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create('Magento\Framework\Search\Request\Config\Converter');
+    }
+
+    public function testConvert()
+    {
+        $document = new \DOMDocument();
+        $document->load(__DIR__ . '../../../_files/search_request.xml');
+        $result = $this->object->convert($document);
+        $expected = include __DIR__ . '/../../_files/search_request_config.php';
+        $this->assertEquals($expected, $result);
+    }
+}
\ No newline at end of file
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Search/Request/MapperTest.php b/dev/tests/integration/testsuite/Magento/Framework/Search/Request/MapperTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..6a0e2c08cfb4d0b6742e89f1e432d6b945c8aaa9
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Framework/Search/Request/MapperTest.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\Framework\Search\Request;
+
+class MapperTest extends \PHPUnit_Framework_TestCase
+{
+    public function testGet()
+    {
+        $config = include __DIR__ . '/../_files/search_request_config.php';
+        $request = reset($config);
+        $mapper = $this->object = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create(
+                '\Magento\Framework\Search\Request\Mapper',
+                [
+                    'queries' => $request['queries'],
+                    'filters' => $request['filters'],
+                ]
+            );
+        $this->assertInstanceOf(
+            '\Magento\Framework\Search\Request\QueryInterface',
+            $mapper->get('suggested_search_container')
+        );
+    }
+}
\ No newline at end of file
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Search/_files/search_request.xml b/dev/tests/integration/testsuite/Magento/Framework/Search/_files/search_request.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e98914a49b9a567414425dc2fd2da731a4bf2653
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Framework/Search/_files/search_request.xml
@@ -0,0 +1,58 @@
+<?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)
+ */
+-->
+<requests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <request query="suggested_search_container" index="product">
+        <queries>
+            <query xsi:type="boolQuery" name="suggested_search_container" boost="2">
+                <queryReference clause="must" ref="fulltext_search_query" />
+                <queryReference clause="should" ref="fulltext_search_query2" />
+            </query>
+
+            <query xsi:type="filteredQuery" name="fulltext_search_query1">
+                <queryReference ref="fulltext_search_query" />
+            </query>
+
+            <query xsi:type="matchQuery" name="fulltext_search_query" boost="5">
+                <match field="title" value="$request.title" boost="2" />
+                <match field="description" value="%request.description%" />
+            </query>
+
+            <query xsi:type="filteredQuery" name="fulltext_search_query2">
+                <filterReference ref="promoted" />
+            </query>
+        </queries>
+        <filters>
+            <filter xsi:type="boolFilter" name="promoted">
+                <filterReference clause="must" ref="price_name" />
+                <filterReference clause="should" ref="price_name1" />
+            </filter>
+            <filter xsi:type="rangeFilter" field="promoted_boost" name="price_name" from="10" to="100" />
+            <filter xsi:type="termFilter" name="price_name1" field="price_name" value="$name" />
+        </filters>
+        <from>10</from>
+        <size>10</size>
+    </request>
+</requests>
\ No newline at end of file
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Search/_files/search_request_config.php b/dev/tests/integration/testsuite/Magento/Framework/Search/_files/search_request_config.php
new file mode 100644
index 0000000000000000000000000000000000000000..c63f48f3df757ed90ea6336c4fd6b34c5b3ad38b
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Framework/Search/_files/search_request_config.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)
+ */
+return [
+    "suggested_search_container" => [
+        "queries" => [
+            "suggested_search_container" => [
+                "name" => "suggested_search_container",
+                "boost" => "2",
+                "queryReference" => [
+                    [
+                        "clause" => "must",
+                        "ref" => "fulltext_search_query"
+                    ],
+                    [
+                        "clause" => "should",
+                        "ref" => "fulltext_search_query2"
+                    ]
+                ],
+                "type" => "boolQuery"
+            ],
+            "fulltext_search_query1" => [
+                "name" => "fulltext_search_query1",
+                "queryReference" => [
+                    [
+                        "ref" => "fulltext_search_query"
+                    ]
+                ],
+                "type" => "filteredQuery"
+            ],
+            "fulltext_search_query" => [
+                "name" => "fulltext_search_query",
+                "boost" => "5",
+                "match" => [
+                    [
+                        "field" => "title",
+                        "value" => "\$request.title",
+                        "boost" => "2"
+                    ],
+                    [
+                        "field" => "description",
+                        "value" => "%request.description%"
+                    ]
+                ],
+                "type" => "matchQuery"
+            ],
+            "fulltext_search_query2" => [
+                "name" => "fulltext_search_query2",
+                "filterReference" => [
+                    [
+                        "ref" => "promoted"
+                    ]
+                ],
+                "type" => "filteredQuery"
+            ]
+        ],
+        "filters" => [
+            "promoted" => [
+                "name" => "promoted",
+                "filterReference" => [
+                    [
+                        "clause" => "must",
+                        "ref" => "price_name"
+                    ],
+                    [
+                        "clause" => "should",
+                        "ref" => "price_name1"
+                    ]
+                ],
+                "type" => "boolFilter"
+            ],
+            "price_name" => [
+                "field" => "promoted_boost",
+                "name" => "price_name",
+                "from" => "10",
+                "to" => "100",
+                "type" => "rangeFilter"
+            ],
+            "price_name1" => [
+                "name" => "price_name1",
+                "field" => "price_name",
+                "value" => "\$name",
+                "type" => "termFilter"
+            ]
+        ],
+        "from" => "10",
+        "size" => "10",
+        "query" => "suggested_search_container",
+        "index" => "product"
+    ]
+];
\ No newline at end of file
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Session/SessionManagerTest.php b/dev/tests/integration/testsuite/Magento/Framework/Session/SessionManagerTest.php
index 448451aba61e76d4b9b9d58995feb040d2594b74..562b23072a92fc524216da4c9227fa5b81f26ac0 100644
--- a/dev/tests/integration/testsuite/Magento/Framework/Session/SessionManagerTest.php
+++ b/dev/tests/integration/testsuite/Magento/Framework/Session/SessionManagerTest.php
@@ -37,6 +37,8 @@ class SessionManagerTest extends \PHPUnit_Framework_TestCase
 
     protected function setUp()
     {
+        ini_set('session.use_only_cookies', '0');
+
         $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
 
         /** @var \Magento\Framework\Session\SidResolverInterface $sidResolver */
@@ -56,6 +58,13 @@ class SessionManagerTest extends \PHPUnit_Framework_TestCase
         );
     }
 
+    public function testSessionUseOnlyCookies()
+    {
+        $expectedValue = '1';
+        $sessionUseOnlyCookies = ini_get('session.use_only_cookies');
+        $this->assertSame($expectedValue, $sessionUseOnlyCookies);
+    }
+
     public function testGetData()
     {
         $this->_model->setData(array('test_key' => 'test_value'));
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Stdlib/Cookie/CookieScopeTest.php b/dev/tests/integration/testsuite/Magento/Framework/Stdlib/Cookie/CookieScopeTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..aa72cde5eece8526c0fcfe35c5f88416ba2155de
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Framework/Stdlib/Cookie/CookieScopeTest.php
@@ -0,0 +1,232 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\Stdlib\Cookie;
+
+use Magento\Framework\ObjectManager;
+use Magento\TestFramework\Helper\Bootstrap;
+
+/**
+ * Test CookieScope
+ *
+ */
+class CookieScopeTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var ObjectManager
+     */
+    private $objectManager;
+
+    public function setUp()
+    {
+        $this->objectManager = Bootstrap::getObjectManager();
+
+    }
+
+    public function testGetSensitiveCookieMetadataEmpty()
+    {
+        $cookieScope = $this->createCookieScope();
+
+        $this->assertEmpty($cookieScope->getSensitiveCookieMetadata()->__toArray());
+    }
+
+    public function testGetPublicCookieMetadataEmpty()
+    {
+        $cookieScope = $this->createCookieScope();
+
+        $this->assertEmpty($cookieScope->getPublicCookieMetadata()->__toArray());
+    }
+
+    public function testGetSensitiveCookieMetadataDefaults()
+    {
+        $defaultValues = [
+            SensitiveCookieMetadata::KEY_PATH => 'default path',
+            SensitiveCookieMetadata::KEY_DOMAIN => 'default domain',
+        ];
+        $sensitive = $this->createSensitiveMetadata($defaultValues);
+        $cookieScope = $this->createCookieScope(
+            [
+                'sensitiveCookieMetadata' => $sensitive,
+                'publicCookieMetadata' => null,
+                'cookieMetadata' => null
+            ]
+        );
+        $this->assertEquals($defaultValues, $cookieScope->getSensitiveCookieMetadata()->__toArray());
+    }
+
+    public function testGetPublicCookieMetadataDefaults()
+    {
+        $defaultValues = [
+            PublicCookieMetadata::KEY_PATH => 'default path',
+            PublicCookieMetadata::KEY_DOMAIN => 'default domain',
+            PublicCookieMetadata::KEY_DURATION => 'default duration',
+            PublicCookieMetadata::KEY_HTTP_ONLY => 'default http',
+            PublicCookieMetadata::KEY_SECURE => 'default secure',
+        ];
+        $public = $this->createPublicMetadata($defaultValues);
+        $cookieScope = $this->createCookieScope(
+            [
+                'publicCookieMetadata' => $public,
+            ]
+        );
+
+        $this->assertEquals($defaultValues, $cookieScope->getPublicCookieMetadata()->__toArray());
+    }
+
+    public function testGetCookieMetadataDefaults()
+    {
+        $defaultValues = [
+            CookieMetadata::KEY_PATH => 'default path',
+            CookieMetadata::KEY_DOMAIN => 'default domain',
+        ];
+        $cookieMetadata = $this->createCookieMetadata($defaultValues);
+        $cookieScope = $this->createCookieScope(
+            [
+                'deleteCookieMetadata' => $cookieMetadata
+            ]
+        );
+        $this->assertEquals($defaultValues, $cookieScope->getCookieMetadata()->__toArray());
+    }
+
+    public function testGetSensitiveCookieMetadataOverrides()
+    {
+        $defaultValues = [
+            SensitiveCookieMetadata::KEY_PATH => 'default path',
+            SensitiveCookieMetadata::KEY_DOMAIN => 'default domain',
+        ];
+        $overrideValues = [
+            SensitiveCookieMetadata::KEY_PATH => 'override path',
+            SensitiveCookieMetadata::KEY_DOMAIN => 'override domain',
+        ];
+        $sensitive = $this->createSensitiveMetadata($defaultValues);
+        $cookieScope = $this->createCookieScope(
+            [
+                'sensitiveCookieMetadata' => $sensitive,
+            ]
+        );
+        $override = $this->createSensitiveMetadata($overrideValues);
+        $this->assertEquals($overrideValues, $cookieScope->getSensitiveCookieMetadata($override)->__toArray());
+    }
+
+    public function testGetPublicCookieMetadataOverrides()
+    {
+        $defaultValues = [
+            PublicCookieMetadata::KEY_PATH => 'default path',
+            PublicCookieMetadata::KEY_DOMAIN => 'default domain',
+            PublicCookieMetadata::KEY_DURATION => 'default duration',
+            PublicCookieMetadata::KEY_HTTP_ONLY => 'default http',
+            PublicCookieMetadata::KEY_SECURE => 'default secure',
+        ];
+        $overrideValues = [
+            PublicCookieMetadata::KEY_PATH => 'override path',
+            PublicCookieMetadata::KEY_DOMAIN => 'override domain',
+            PublicCookieMetadata::KEY_DURATION => 'override duration',
+            PublicCookieMetadata::KEY_HTTP_ONLY => 'override http',
+            PublicCookieMetadata::KEY_SECURE => 'override secure',
+        ];
+        $public = $this->createPublicMetadata($defaultValues);
+        $cookieScope = $this->createCookieScope(
+            [
+                'publicCookieMetadata' => $public,
+            ]
+        );
+        $override = $this->createPublicMetadata($overrideValues);
+
+        $this->assertEquals($overrideValues, $cookieScope->getPublicCookieMetadata($override)->__toArray());
+    }
+
+    public function testGetCookieMetadataOverrides()
+    {
+        $defaultValues = [
+            CookieMetadata::KEY_PATH => 'default path',
+            CookieMetadata::KEY_DOMAIN => 'default domain',
+        ];
+        $overrideValues = [
+            CookieMetadata::KEY_PATH => 'override path',
+            CookieMetadata::KEY_DOMAIN => 'override domain',
+        ];
+        $deleteCookieMetadata = $this->createCookieMetadata($defaultValues);
+        $cookieScope = $this->createCookieScope(
+            [
+                'deleteCookieMetadata' => $deleteCookieMetadata
+            ]
+        );
+        $override = $this->createCookieMetadata($overrideValues);
+        $this->assertEquals($overrideValues, $cookieScope->getCookieMetadata($override)->__toArray());
+    }
+
+    /**
+     * Creates a CookieScope object with the given parameters.
+     *
+     * @param array $params
+     * @return CookieScope
+     */
+    protected function createCookieScope($params = [])
+    {
+        return $this->objectManager->create('Magento\Framework\Stdlib\Cookie\CookieScope', $params);
+    }
+
+    /**
+     * Creates a SensitiveCookieMetadata object with provided metadata values.
+     *
+     * @param array $metadata
+     * @return SensitiveCookieMetadata
+     */
+    protected function createSensitiveMetadata($metadata = [])
+    {
+        return $this->objectManager->create(
+            'Magento\Framework\Stdlib\Cookie\SensitiveCookieMetadata',
+            ['metadata' => $metadata]
+        );
+    }
+
+    /**
+     * Creates a PublicCookieMetadata object with provided metadata values.
+     *
+     * @param array $metadata
+     * @return PublicCookieMetadata
+     */
+    protected function createPublicMetadata($metadata = [])
+    {
+        return $this->objectManager->create(
+            'Magento\Framework\Stdlib\Cookie\PublicCookieMetadata',
+            ['metadata' => $metadata]
+        );
+    }
+
+    /**
+     * Creates a CookieMetadata object with provided metadata values.
+     *
+     * @param array $metadata
+     * @return CookieMetadata
+     */
+    protected function createCookieMetadata($metadata = [])
+    {
+        return $this->objectManager->create(
+            'Magento\Framework\Stdlib\Cookie\CookieMetadata',
+            ['metadata' => $metadata]
+        );
+    }
+
+}
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Stdlib/Cookie/PhpCookieManagerTest.php b/dev/tests/integration/testsuite/Magento/Framework/Stdlib/Cookie/PhpCookieManagerTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..703796cb68a8f86bd7d9669c572c31cf8fd08c7b
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Framework/Stdlib/Cookie/PhpCookieManagerTest.php
@@ -0,0 +1,98 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\Stdlib\Cookie;
+
+use Magento\TestFramework\Helper\Bootstrap;
+
+/**
+ * Test PhpCookieManager
+ *
+ */
+class PhpCookieManagerTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * Object Manager
+     *
+     * @var \Magento\Framework\ObjectManager
+     */
+    private $objectManager;
+
+    /**
+     * Cookie Manager
+     *
+     * @var \Magento\Framework\Stdlib\Cookie\PhpCookieManager
+     */
+    protected $cookieManager;
+
+    protected function setUp()
+    {
+        $this->objectManager = Bootstrap::getObjectManager();
+        $this->cookieManager = $this->objectManager->create('Magento\Framework\Stdlib\Cookie\PhpCookieManager');
+    }
+
+    public function testGetCookie()
+    {
+        $cookieName = 'cookie name';
+        $cookieValue = 'cookie value';
+        $defaultCookieValue = 'default';
+        $_COOKIE[$cookieName] = $cookieValue;
+        $this->assertEquals(
+            $defaultCookieValue,
+            $this->cookieManager->getCookie('unknown cookieName', $defaultCookieValue)
+        );
+        $this->assertEquals($cookieValue, $this->cookieManager->getCookie($cookieName, $defaultCookieValue));
+        $this->assertEquals($defaultCookieValue, $this->cookieManager->getCookie(null, $defaultCookieValue));
+        $this->assertNull($this->cookieManager->getCookie(null));
+    }
+
+    /**
+     * It is not possible to write integration tests for CookieManager::setSensitiveCookie().
+     * PHPUnit the following error when calling the function:
+     *
+     * PHPUnit_Framework_Error_Warning : Cannot modify header information - headers already sent
+     */
+    public function testSetSensitiveCookie()
+    {
+    }
+
+    /**
+     * It is not possible to write integration tests for CookieManager::setSensitiveCookie().
+     * PHPUnit the following error when calling the function:
+     *
+     * PHPUnit_Framework_Error_Warning : Cannot modify header information - headers already sent
+     */
+    public function testSetPublicCookie()
+    {
+    }
+
+    /**
+     * It is not possible to write integration tests for CookieManager::deleteCookie().
+     * PHPUnit the following error when calling the function:
+     *
+     * PHPUnit_Framework_Error_Warning : Cannot modify header information - headers already sent
+     */
+    public function testDeleteCookie()
+    {
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Install/Model/InstallerTest.php b/dev/tests/integration/testsuite/Magento/Install/Model/InstallerTest.php
index e06738689f4c8fd72e96900fbb9a8a92c3948d51..854aff32a1691ab4ca1e5fa7c5cec42d49cb8e4e 100644
--- a/dev/tests/integration/testsuite/Magento/Install/Model/InstallerTest.php
+++ b/dev/tests/integration/testsuite/Magento/Install/Model/InstallerTest.php
@@ -123,7 +123,7 @@ class InstallerTest extends \PHPUnit_Framework_TestCase
             $user->getPassword(),
             'Original password should not be stored/loaded as is for security reasons.'
         );
-        $this->assertInstanceOf('Magento\User\Model\Role', $user->getRole());
+        $this->assertInstanceOf('Magento\Authorization\Model\Role', $user->getRole());
         $this->assertEquals(1, $user->getRole()->getId(), 'User has to have admin privileges.');
     }
 
diff --git a/dev/tests/integration/testsuite/Magento/Integration/Controller/Adminhtml/IntegrationTest.php b/dev/tests/integration/testsuite/Magento/Integration/Controller/Adminhtml/IntegrationTest.php
index a9b1342e2ebaf66fdccd7029a0f0fdc4f4bcbea1..07a25b9692ffcf192273250d3ecb512533132424 100644
--- a/dev/tests/integration/testsuite/Magento/Integration/Controller/Adminhtml/IntegrationTest.php
+++ b/dev/tests/integration/testsuite/Magento/Integration/Controller/Adminhtml/IntegrationTest.php
@@ -130,14 +130,8 @@ class IntegrationTest extends \Magento\Backend\Utility\Controller
         $this->_integration = $factory->create()->setName(md5(rand()))->save();
 
         /** Grant permissions to integrations */
-        /** @var \Magento\Authz\Model\UserIdentifier\Factory $userIdentifierFactory */
-        $userIdentifierFactory = $objectManager->create('Magento\Authz\Model\UserIdentifier\Factory');
-        /** @var \Magento\Authz\Service\AuthorizationV1 $authzService */
-        $userIdentifier = $userIdentifierFactory->create(
-            \Magento\Authz\Model\UserIdentifier::USER_TYPE_INTEGRATION,
-            $this->_integration->getId()
-        );
-        $authzService = $objectManager->create('Magento\Authz\Service\AuthorizationV1');
-        $authzService->grantAllPermissions($userIdentifier);
+        /** @var \Magento\Integration\Service\V1\AuthorizationService $authorizationService */
+        $authorizationService = $objectManager->create('Magento\Integration\Service\V1\AuthorizationService');
+        $authorizationService->grantAllPermissions($this->_integration->getId());
     }
 }
diff --git a/dev/tests/integration/testsuite/Magento/Integration/Service/V1/AuthorizationServiceTest.php b/dev/tests/integration/testsuite/Magento/Integration/Service/V1/AuthorizationServiceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..682fd0df059ee20ecae2f28dad5b2f3a98958a3f
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Integration/Service/V1/AuthorizationServiceTest.php
@@ -0,0 +1,173 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Integration\Service\V1;
+
+use Magento\Authorization\Model\UserContextInterface;
+
+/**
+ * Integration authorization service test.
+ */
+class AuthorizationServiceTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var AuthorizationService */
+    protected $_service;
+
+    /** @var \Magento\Framework\Authorization */
+    protected $libAuthorization;
+
+    /** @var \Magento\Authorization\Model\UserContextInterface|\PHPUnit_Framework_MockObject_MockObject */
+    protected $userContextMock;
+
+    protected function setUp()
+    {
+        parent::setUp();
+        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $loggerMock = $this->getMockBuilder('Magento\\Framework\\Logger')->disableOriginalConstructor()->getMock();
+        $loggerMock->expects($this->any())->method('logException')->will($this->returnSelf());
+        $this->_service = $objectManager->create(
+            'Magento\Integration\Service\V1\AuthorizationService',
+            array(
+                'logger' => $loggerMock
+            )
+        );
+
+        $this->userContextMock = $this->getMockForAbstractClass('Magento\Authorization\Model\UserContextInterface');
+        $this->userContextMock
+            ->expects($this->any())
+            ->method('getUserType')
+            ->will($this->returnValue(UserContextInterface::USER_TYPE_INTEGRATION));
+        $roleLocator = $objectManager->create(
+            'Magento\Webapi\Model\WebapiRoleLocator',
+            ['userContext' => $this->userContextMock]
+        );
+        $this->libAuthorization = $objectManager->create(
+            'Magento\Framework\Authorization',
+            ['roleLocator' => $roleLocator]
+        );
+    }
+
+    /**
+     * @magentoDbIsolation enabled
+     */
+    public function testGrantPermissions()
+    {
+        $integrationId = rand(1, 1000);
+        $resources = array('Magento_Sales::create', 'Magento_Cms::page', 'Magento_Adminhtml::dashboard');
+        /** Preconditions check */
+        $this->_ensurePermissionsAreNotGranted($integrationId, $resources);
+
+        $this->_service->grantPermissions($integrationId, $resources);
+
+        /** Validate that access to the specified resources is granted */
+        $this->_ensurePermissionsAreGranted($integrationId, $resources);
+    }
+
+    /**
+     * @param int $integrationId
+     * @param string[] $initialResources
+     * @param string[] $newResources
+     * @magentoDbIsolation enabled
+     * @dataProvider changePermissionsProvider
+     */
+    public function testChangePermissions($integrationId, $initialResources, $newResources)
+    {
+        $this->_service->grantPermissions($integrationId, $initialResources);
+        /** Preconditions check */
+        $this->_ensurePermissionsAreGranted($integrationId, $initialResources);
+        $this->_ensurePermissionsAreNotGranted($integrationId, $newResources);
+
+        $this->_service->grantPermissions($integrationId, $newResources);
+
+        /** Check the results of permissions change */
+        $this->_ensurePermissionsAreGranted($integrationId, $newResources);
+        $this->_ensurePermissionsAreNotGranted($integrationId, $initialResources);
+    }
+
+    public function changePermissionsProvider()
+    {
+        return array(
+            'integration' => array(
+                'integrationId' => rand(1, 1000),
+                'initialResources' => array('Magento_Cms::page', 'Magento_Adminhtml::dashboard'),
+                'newResources' => array('Magento_Sales::cancel', 'Magento_Cms::page_delete')
+            ),
+            'integration clear permissions' => array(
+                'integrationId' => rand(1, 1000),
+                'initialResources' => array('Magento_Sales::capture', 'Magento_Cms::page_delete'),
+                'newResources' => array()
+            )
+        );
+    }
+
+    /**
+     * @magentoDbIsolation enabled
+     */
+    public function testGrantAllPermissions()
+    {
+        $integrationId = rand(1, 1000);
+        $this->_service->grantAllPermissions($integrationId);
+        $this->_ensurePermissionsAreGranted($integrationId, array('Magento_Adminhtml::all'));
+    }
+
+    /**
+     * Check if user has access to the specified resources.
+     *
+     * @param int $integrationId
+     * @param string[] $resources
+     */
+    protected function _ensurePermissionsAreGranted($integrationId, $resources)
+    {
+        $this->userContextMock
+            ->expects($this->any())
+            ->method('getUserId')
+            ->will($this->returnValue($integrationId));
+        foreach ($resources as $resource) {
+            $this->assertTrue(
+                $this->libAuthorization->isAllowed($resource),
+                "Access to resource '{$resource}' is prohibited while it is expected to be granted."
+            );
+        }
+    }
+
+    /**
+     * Check if access to the specified resources is prohibited to the user.
+     *
+     * @param int $integrationId
+     * @param string[] $resources
+     */
+    protected function _ensurePermissionsAreNotGranted($integrationId, $resources)
+    {
+        $this->userContextMock
+            ->expects($this->any())
+            ->method('getUserId')
+            ->will($this->returnValue($integrationId));
+        foreach ($resources as $resource) {
+            $this->assertFalse(
+                $this->libAuthorization->isAllowed($resource),
+                "Access to resource '{$resource}' is expected to be prohibited."
+            );
+        }
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Integration/Service/V1/TokenServiceTest.php b/dev/tests/integration/testsuite/Magento/Integration/Service/V1/TokenServiceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..d92a18de977ecbab6be87d89f7daf141667a9d22
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Integration/Service/V1/TokenServiceTest.php
@@ -0,0 +1,176 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Integration\Service\V1;
+
+use Magento\Customer\Service\V1\CustomerAccountService;
+use Magento\Framework\Exception\InputException;
+use Magento\Integration\Model\Oauth\Token as TokenModel;
+use Magento\TestFramework\Helper\Bootstrap;
+use Magento\User\Model\User as UserModel;
+
+/**
+ * Test class for \Magento\Integration\Service\V1\TokenService.
+ */
+class TokenServiceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var TokenServiceInterface
+     */
+    private $tokenService;
+
+    /**
+     * @var CustomerAccountService
+     */
+    private $customerAccountService;
+
+    /**
+     * @var TokenModel
+     */
+    private $tokenModel;
+
+    /**
+     * @var UserModel
+     */
+    private $userModel;
+
+    /**
+     * Setup TokenService
+     */
+    public function setUp()
+    {
+        $this->tokenService = Bootstrap::getObjectManager()->get('Magento\Integration\Service\V1\TokenService');
+        $this->customerAccountService = Bootstrap::getObjectManager()->get(
+            'Magento\Customer\Service\V1\CustomerAccountService'
+        );
+        $this->tokenModel = Bootstrap::getObjectManager()->get('Magento\Integration\Model\Oauth\Token');
+        $this->userModel = Bootstrap::getObjectManager()->get('Magento\User\Model\User');
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     */
+    public function testCreateCustomerAccessToken()
+    {
+        $customerUserName = 'customer@example.com';
+        $password = 'password';
+        $accessToken = $this->tokenService->createCustomerAccessToken($customerUserName, $password);
+        $customerData = $this->customerAccountService->authenticate($customerUserName, $password);
+        /** @var $token TokenModel */
+        $token = $this->tokenModel->loadByCustomerId($customerData->getId())->getToken();
+        $this->assertEquals($accessToken, $token);
+    }
+
+    /**
+     * @dataProvider validationDataProvider
+     */
+    public function testCreateCustomerAccessTokenEmptyOrNullCredentials($username, $password)
+    {
+        try {
+            $this->tokenService->createCustomerAccessToken($username, $password);
+        } catch (InputException $e) {
+            $this->assertInputExceptionMessages($e);
+        }
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\InvalidEmailOrPasswordException
+     * @expectedExceptionMessage Invalid login or password.
+     */
+    public function testCreateCustomerAccessTokenInvalidCustomer()
+    {
+        $customerUserName = 'invalid';
+        $password = 'invalid';
+        $this->tokenService->createCustomerAccessToken($customerUserName, $password);
+    }
+
+    /**
+     * @magentoDataFixture Magento/User/_files/user_with_role.php
+     */
+    public function testCreateAdminAccessToken()
+    {
+        $adminUserNameFromFixture = 'adminUser';
+        $accessToken = $this->tokenService->createAdminAccessToken(
+            $adminUserNameFromFixture,
+            \Magento\TestFramework\Bootstrap::ADMIN_PASSWORD
+        );
+        $adminUserId = $this->userModel->loadByUsername($adminUserNameFromFixture)->getId();
+        /** @var $token TokenModel */
+        $token = $this->tokenModel
+            ->loadByAdminId($adminUserId)
+            ->getToken();
+        $this->assertEquals($accessToken, $token);
+    }
+
+    /**
+     * @dataProvider validationDataProvider
+     */
+    public function testCreateAdminAccessTokenEmptyOrNullCredentials($username, $password)
+    {
+        try {
+            $this->tokenService->createAdminAccessToken($username, $password);
+        } catch (InputException $e) {
+            $this->assertInputExceptionMessages($e);
+        }
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\AuthenticationException
+     * @expectedExceptionMessage Please correct the user name or password.
+     */
+    public function testCreateAdminAccessTokenInvalidCustomer()
+    {
+        $adminUserName = 'invalid';
+        $password = 'invalid';
+        $this->tokenService->createAdminAccessToken($adminUserName, $password);
+    }
+
+    /**
+     * Provider to test input validation
+     *
+     * @return array
+     */
+    public function validationDataProvider()
+    {
+        return [
+            'Check for empty credentials' => ['', ''],
+            'Check for null credentials' => [null, null]
+        ];
+    }
+
+    /**
+     * Assert for presence of Input exception messages
+     *
+     * @param InputException $e
+     */
+    private function assertInputExceptionMessages($e)
+    {
+        $this->assertEquals(InputException::DEFAULT_MESSAGE, $e->getMessage());
+        $errors = $e->getErrors();
+        $this->assertCount(2, $errors);
+        $this->assertEquals('username is a required field.', $errors[0]->getLogMessage());
+        $this->assertEquals('password is a required field.', $errors[1]->getLogMessage());
+    }
+}
+ 
diff --git a/dev/tests/integration/testsuite/Magento/PayPalRecurringPayment/_files/recurring_payment.php b/dev/tests/integration/testsuite/Magento/PayPalRecurringPayment/_files/recurring_payment.php
index 74611d6163e38a25266ac061e51fe13659daf2d5..a9a1c37943705ac1a1926e7b5b1f1d96158301d0 100644
--- a/dev/tests/integration/testsuite/Magento/PayPalRecurringPayment/_files/recurring_payment.php
+++ b/dev/tests/integration/testsuite/Magento/PayPalRecurringPayment/_files/recurring_payment.php
@@ -46,7 +46,28 @@ $recurringPayment->addData(
         'currency_code' => 'USD',
         'order_info' => array('base_currency_code' => 'USD'),
         'order_item_info' => serialize('item info'),
-        'billing_address_info' => serialize('billing address info')
+        'billing_address_info' => serialize([
+            'postcode' => '12345',
+            'lastname' => 'Co',
+            'street' => 'Street',
+            'city' => 'City',
+            'customer_email' => 'co@co.co',
+            'telephone' => 'Telephone',
+            'country_id' => 'Country',
+            'firstname' => 'Co',
+            'address_type' => 'billing'
+        ]),
+        'shipping_address_info' => serialize([
+            'postcode' => '12345',
+            'lastname' => 'Co',
+            'street' => 'Street',
+            'city' => 'City',
+            'customer_email' => 'co@co.co',
+            'telephone' => 'Telephone',
+            'country_id' => 'Country',
+            'firstname' => 'Co',
+            'address_type' => 'shipping'
+])
     )
 );
 $recurringPayment->save();
diff --git a/dev/tests/integration/testsuite/Magento/Paypal/Controller/ExpressTest.php b/dev/tests/integration/testsuite/Magento/Paypal/Controller/ExpressTest.php
index 69a1f852b54aa1152662155fd1d1203d08b6c83e..62bf4b9360be4306a0cfc8424f6e103d37a5b2b7 100644
--- a/dev/tests/integration/testsuite/Magento/Paypal/Controller/ExpressTest.php
+++ b/dev/tests/integration/testsuite/Magento/Paypal/Controller/ExpressTest.php
@@ -84,7 +84,8 @@ class ExpressTest extends \Magento\TestFramework\TestCase\AbstractController
      *
      * Note that test does not verify communication during remote calls to PayPal.
      *
-     * @magentoDataFixture Magento/Sales/_files/quote_with_customer.php
+     * @magentoDataFixture Magento/Sales/_files/quote.php
+     * @magentoDataFixture Magento/Customer/_files/customer.php
      */
     public function testStartActionCustomerToQuote()
     {
diff --git a/dev/tests/integration/testsuite/Magento/Paypal/Controller/PayflowTest.php b/dev/tests/integration/testsuite/Magento/Paypal/Controller/PayflowTest.php
index 3d9fe3b04eb0d065c40b7bc0fbe6b5c53c0f9e02..6466e784c4357bb6846ad7bebe81a7d55497c61f 100644
--- a/dev/tests/integration/testsuite/Magento/Paypal/Controller/PayflowTest.php
+++ b/dev/tests/integration/testsuite/Magento/Paypal/Controller/PayflowTest.php
@@ -89,7 +89,7 @@ class PayflowTest extends \Magento\TestFramework\TestCase\AbstractController
     }
 
     /**
-     * @magentoDataFixture Magento/Paypal/_files/quote_payment_payflow.php
+     * @magentoDataFixture Magento/Sales/_files/order.php
      * @magentoConfigFixture current_store payment/paypal_payflow/active 1
      * @magentoConfigFixture current_store paypal/general/business_account merchant_2012050718_biz@example.com
      */
@@ -104,7 +104,6 @@ class PayflowTest extends \Magento\TestFramework\TestCase\AbstractController
         $session->setQuoteId($quote->getId());
         $session->setPaypalStandardQuoteId($quote->getId())->setLastRealOrderId('100000001');
         $this->dispatch('paypal/payflow/cancelpayment');
-
         $order->load('100000001', 'increment_id');
         $this->assertEquals('canceled', $order->getState());
         $this->assertEquals($session->getQuote()->getGrandTotal(), $quote->getGrandTotal());
diff --git a/dev/tests/integration/testsuite/Magento/Paypal/Controller/PayflowadvancedTest.php b/dev/tests/integration/testsuite/Magento/Paypal/Controller/PayflowadvancedTest.php
index 0788d288fca206da11f81811246d5350466afab7..0dd54ddc6ed317690ba3c80729ceb8663ac64f68 100644
--- a/dev/tests/integration/testsuite/Magento/Paypal/Controller/PayflowadvancedTest.php
+++ b/dev/tests/integration/testsuite/Magento/Paypal/Controller/PayflowadvancedTest.php
@@ -81,7 +81,7 @@ class PayflowadvancedTest extends \Magento\TestFramework\TestCase\AbstractContro
     }
 
     /**
-     * @magentoDataFixture Magento/Paypal/_files/quote_payment_payflow.php
+     * @magentoDataFixture Magento/Sales/_files/order.php
      * @magentoConfigFixture current_store payment/paypal_payflow/active 1
      * @magentoConfigFixture current_store paypal/general/business_account merchant_2012050718_biz@example.com
      */
diff --git a/dev/tests/integration/testsuite/Magento/Paypal/_files/order_express.php b/dev/tests/integration/testsuite/Magento/Paypal/_files/order_express.php
index 9dffb9c2ce457066fc795750cb0b9f21d57489da..5778d5058b49f4d9ce87c85d48f12693c1ba978c 100644
--- a/dev/tests/integration/testsuite/Magento/Paypal/_files/order_express.php
+++ b/dev/tests/integration/testsuite/Magento/Paypal/_files/order_express.php
@@ -28,7 +28,6 @@ $billingAddress = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->c
     array('data' => $addressData)
 );
 $billingAddress->setAddressType('billing');
-
 $shippingAddress = clone $billingAddress;
 $shippingAddress->setId(null)->setAddressType('shipping');
 
@@ -36,7 +35,9 @@ $payment = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('
 $payment->setMethod(\Magento\Paypal\Model\Config::METHOD_WPP_EXPRESS);
 
 $order = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\Sales\Model\Order');
-$order->setIncrementId(
+$order
+    ->setCustomerEmail('co@co.co')
+    ->setIncrementId(
     '100000001'
 )->setSubtotal(
     100
diff --git a/dev/tests/integration/testsuite/Magento/Paypal/_files/order_payflowpro.php b/dev/tests/integration/testsuite/Magento/Paypal/_files/order_payflowpro.php
index 5f584aa79bb34bbd96f42f4ac1260f9bfaf7cf55..f89ce3ec978890ff3044e88c56e9df88d1d8a891 100644
--- a/dev/tests/integration/testsuite/Magento/Paypal/_files/order_payflowpro.php
+++ b/dev/tests/integration/testsuite/Magento/Paypal/_files/order_payflowpro.php
@@ -36,7 +36,8 @@ $payment = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('
 $payment->setMethod(\Magento\Paypal\Model\Config::METHOD_PAYFLOWPRO);
 
 $order = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\Sales\Model\Order');
-$order->setIncrementId(
+$order->setCustomerEmail('co@co.co')
+    ->setIncrementId(
     '100000001'
 )->setSubtotal(
     100
diff --git a/dev/tests/integration/testsuite/Magento/Paypal/_files/order_standard.php b/dev/tests/integration/testsuite/Magento/Paypal/_files/order_standard.php
index b3a0c73277ac42c71fbcf9197ad32e7681287a45..8f92493d4cc14598257658c073bf96df2616ba62 100644
--- a/dev/tests/integration/testsuite/Magento/Paypal/_files/order_standard.php
+++ b/dev/tests/integration/testsuite/Magento/Paypal/_files/order_standard.php
@@ -36,7 +36,9 @@ $payment = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('
 $payment->setMethod(\Magento\Paypal\Model\Config::METHOD_WPS);
 
 $order = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\Sales\Model\Order');
-$order->setIncrementId(
+$order
+    ->setCustomerEmail('co@co.co')
+    ->setIncrementId(
     '100000001'
 )->setSubtotal(
     100
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 ac990dde5f78a72bca5c02e3365417bd9f46c685..50f11548e50c2dd6eb9e9f1be1da4ae9955eed62 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
@@ -109,6 +109,8 @@ $quote->getShippingAddress()->setCollectShippingRates(true);
 $quote->getPayment()->setMethod(\Magento\Paypal\Model\Config::METHOD_WPS);
 $quote->collectTotals()->save();
 
+$quote->setCustomerEmail('admin@example.com');
+
 /** @var $service \Magento\Sales\Model\Service\Quote */
 $service = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
     ->create('Magento\Sales\Model\Service\Quote', array('quote' => $quote));
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 852f4ce78d9922862f3e4c688ef4c178ca22982c..b8a57762a80a3b4b58bb23bbe73f3564fbb7adb9 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
@@ -117,6 +117,7 @@ $quote->getShippingAddress()->setCollectShippingRates(true);
 $quote->collectTotals()->save();
 
 $quote->getPayment()->setMethod(\Magento\Paypal\Model\Config::METHOD_WPS);
+$quote->setCustomerEmail('admin@example.com');
 
 /** @var $service \Magento\Sales\Model\Service\Quote */
 $service = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
diff --git a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/AuthorizationMock.php b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/AuthorizationMock.php
new file mode 100644
index 0000000000000000000000000000000000000000..56d567498f44d6cd130f4e230e214e3a2a3aff80
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/AuthorizationMock.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\Sales\Controller\Adminhtml\Order;
+
+class AuthorizationMock extends \Magento\Framework\Authorization
+{
+    /**
+     * Check current user permission on resource and privilege
+     *
+     * @param   string $resource
+     * @param   string $privilege
+     * @return  boolean
+     */
+    public function isAllowed($resource, $privilege = null)
+    {
+        return $resource == 'Magento_Sales::create' ? false : parent::isAllowed($resource, $privilege);
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/CreateTest.php b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/CreateTest.php
index d18c0c11578f9d6dfc697bab8f2e932ce2c2d75d..ddb3f5860b01a872d9e7f07c19df5e25cdf09aa1 100644
--- a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/CreateTest.php
+++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/CreateTest.php
@@ -209,18 +209,3 @@ class CreateTest extends \Magento\Backend\Utility\Controller
         $this->assertEquals('403', $this->getResponse()->getHttpResponseCode());
     }
 }
-
-class AuthorizationMock extends \Magento\Framework\Authorization
-{
-    /**
-     * Check current user permission on resource and privilege
-     *
-     * @param   string $resource
-     * @param   string $privilege
-     * @return  boolean
-     */
-    public function isAllowed($resource, $privilege = null)
-    {
-        return $resource == 'Magento_Sales::create' ? false : parent::isAllowed($resource, $privilege);
-    }
-}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/Model/Order/AddressTest.php b/dev/tests/integration/testsuite/Magento/Sales/Model/Order/AddressTest.php
index c7ba7db89b6d3f13b2da5cf60e3947c202ec4e1a..95bde3844a75b8dac387318e76ba745c465fffa3 100644
--- a/dev/tests/integration/testsuite/Magento/Sales/Model/Order/AddressTest.php
+++ b/dev/tests/integration/testsuite/Magento/Sales/Model/Order/AddressTest.php
@@ -50,9 +50,11 @@ class AddressTest extends \PHPUnit_Framework_TestCase
         );
         $order->loadByIncrementId('100000001');
         $this->_model->setOrder($order);
-        $this->_model->setCustomerAddressData($customerAddressService->getAddress(1));
+        $this->_model->setData($customerAddressService->getAddress(1)->__toArray());
+        $this->_model->setEmail('co@co.co');
+        $this->_model->setAddressType('billing');
+        $this->_model->setRegionId(1);
         $this->_model->save();
         $this->assertEquals($order->getId(), $this->_model->getParentId());
-        $this->assertEquals($this->_model->getCustomerAddressId(), 1);
     }
 }
diff --git a/dev/tests/integration/testsuite/Magento/Sales/Model/Order/CreditmemoTest.php b/dev/tests/integration/testsuite/Magento/Sales/Model/Order/Email/Sender/CreditmemoSenderTest.php
similarity index 72%
rename from dev/tests/integration/testsuite/Magento/Sales/Model/Order/CreditmemoTest.php
rename to dev/tests/integration/testsuite/Magento/Sales/Model/Order/Email/Sender/CreditmemoSenderTest.php
index a8c1f5a041f930c1eb25d2b6195b69be4d630489..36179a42b36f8fed5256c83dd0c7b757fe20d98a 100644
--- a/dev/tests/integration/testsuite/Magento/Sales/Model/Order/CreditmemoTest.php
+++ b/dev/tests/integration/testsuite/Magento/Sales/Model/Order/Email/Sender/CreditmemoSenderTest.php
@@ -21,38 +21,45 @@
  * @copyright   Copyright (c) 2014 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;
+namespace Magento\Sales\Model\Order\Email\Sender;
 
-class CreditmemoTest extends \PHPUnit_Framework_TestCase
+use Magento\TestFramework\Helper\Bootstrap;
+
+class CreditmemoSenderTest extends \PHPUnit_Framework_TestCase
 {
     /**
      * @magentoDataFixture Magento/Sales/_files/order.php
      */
-    public function testSendEmail()
+    public function testSend()
     {
-        \Magento\TestFramework\Helper\Bootstrap::getInstance()
+        Bootstrap::getInstance()
             ->loadArea(\Magento\Framework\App\Area::AREA_FRONTEND);
-        $order = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+        $order = Bootstrap::getObjectManager()
             ->create('Magento\Sales\Model\Order');
         $order->loadByIncrementId('100000001');
         $order->setCustomerEmail('customer@example.com');
 
-        $creditmemo = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+        $creditmemo = Bootstrap::getObjectManager()->create(
             'Magento\Sales\Model\Order\Creditmemo'
         );
         $creditmemo->setOrder($order);
 
         $payment = $order->getPayment();
-        $paymentInfoBlock = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
+        $paymentInfoBlock = Bootstrap::getObjectManager()->get(
             'Magento\Payment\Helper\Data'
         )->getInfoBlock(
-            $payment
-        );
+                $payment
+            );
         $paymentInfoBlock->setArea('invalid-area');
         $payment->setBlockMock($paymentInfoBlock);
 
         $this->assertEmpty($creditmemo->getEmailSent());
-        $creditmemo->sendEmail(true);
+
+        $creditmemoSender = Bootstrap::getObjectManager()
+            ->create('Magento\Sales\Model\Order\Email\Sender\CreditmemoSender');
+        $result = $creditmemoSender->send($creditmemo, true);
+
+        $this->assertTrue($result);
         $this->assertNotEmpty($creditmemo->getEmailSent());
         $this->assertEquals('frontend', $paymentInfoBlock->getArea());
     }
diff --git a/dev/tests/integration/testsuite/Magento/Sales/Model/Order/InvoiceTest.php b/dev/tests/integration/testsuite/Magento/Sales/Model/Order/Email/Sender/InvoiceSenderTest.php
similarity index 82%
rename from dev/tests/integration/testsuite/Magento/Sales/Model/Order/InvoiceTest.php
rename to dev/tests/integration/testsuite/Magento/Sales/Model/Order/Email/Sender/InvoiceSenderTest.php
index d24dbfb2061e0362ff14bf69f1fea7041b0add11..098dc8cea27f87eb6f742451ca959d155816b526 100644
--- a/dev/tests/integration/testsuite/Magento/Sales/Model/Order/InvoiceTest.php
+++ b/dev/tests/integration/testsuite/Magento/Sales/Model/Order/Email/Sender/InvoiceSenderTest.php
@@ -21,14 +21,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\Sales\Model\Order;
+namespace Magento\Sales\Model\Order\Email\Sender;
 
-class InvoiceTest extends \PHPUnit_Framework_TestCase
+class InvoiceSenderTest extends \PHPUnit_Framework_TestCase
 {
     /**
      * @magentoDataFixture Magento/Sales/_files/order.php
      */
-    public function testSendEmail()
+    public function testSend()
     {
         \Magento\TestFramework\Helper\Bootstrap::getInstance()
             ->loadArea(\Magento\Framework\App\Area::AREA_FRONTEND);
@@ -51,8 +51,15 @@ class InvoiceTest extends \PHPUnit_Framework_TestCase
         $paymentInfoBlock->setArea('invalid-area');
         $payment->setBlockMock($paymentInfoBlock);
 
+        /** @var InvoiceSender $invoiceSender */
+        $invoiceSender = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create('Magento\Sales\Model\Order\Email\Sender\InvoiceSender');
+
+
         $this->assertEmpty($invoice->getEmailSent());
-        $invoice->sendEmail(true);
+        $result = $invoiceSender->send($invoice, true);
+
+        $this->assertTrue($result);
         $this->assertNotEmpty($invoice->getEmailSent());
         $this->assertEquals('frontend', $paymentInfoBlock->getArea());
     }
diff --git a/dev/tests/integration/testsuite/Magento/Sales/Model/Order/OrderTest.php b/dev/tests/integration/testsuite/Magento/Sales/Model/Order/Email/Sender/OrderSenderTest.php
similarity index 82%
rename from dev/tests/integration/testsuite/Magento/Sales/Model/Order/OrderTest.php
rename to dev/tests/integration/testsuite/Magento/Sales/Model/Order/Email/Sender/OrderSenderTest.php
index fd79f19b008a42d296b95f4bb9dd847456a1c3b0..9d42a96fcd1d95474aa8c7d441f5a93964aed72d 100644
--- a/dev/tests/integration/testsuite/Magento/Sales/Model/Order/OrderTest.php
+++ b/dev/tests/integration/testsuite/Magento/Sales/Model/Order/Email/Sender/OrderSenderTest.php
@@ -21,9 +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\Sales\Model\Order;
+namespace Magento\Sales\Model\Order\Email\Sender;
 
-class OrderTest extends \PHPUnit_Framework_TestCase
+use Magento\TestFramework\Helper\Bootstrap;
+
+class OrderSenderTest extends \PHPUnit_Framework_TestCase
 {
     /**
      * @magentoDataFixture Magento/Sales/_files/order.php
@@ -41,13 +43,19 @@ class OrderTest extends \PHPUnit_Framework_TestCase
         $paymentInfoBlock = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
             'Magento\Payment\Helper\Data'
         )->getInfoBlock(
-            $payment
-        );
+                $payment
+            );
         $paymentInfoBlock->setArea('invalid-area');
         $payment->setBlockMock($paymentInfoBlock);
 
         $this->assertEmpty($order->getEmailSent());
-        $order->sendNewOrderEmail();
+
+        $orderSender = Bootstrap::getObjectManager()
+            ->create('Magento\Sales\Model\Order\Email\Sender\OrderSender');
+        $result = $orderSender->send($order);
+
+        $this->assertTrue($result);
+
         $this->assertNotEmpty($order->getEmailSent());
         $this->assertEquals('frontend', $paymentInfoBlock->getArea());
     }
diff --git a/dev/tests/integration/testsuite/Magento/Sales/Model/Order/Email/Sender/ShipmentSenderTest.php b/dev/tests/integration/testsuite/Magento/Sales/Model/Order/Email/Sender/ShipmentSenderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..a2866de33df5f9b734771fabaf52aaf58f48e006
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/Model/Order/Email/Sender/ShipmentSenderTest.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\Sales\Model\Order\Email\Sender;
+
+class ShipmentSenderTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @magentoDataFixture Magento/Sales/_files/order.php
+     */
+    public function testSend()
+    {
+        \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\Framework\App\State')
+            ->setAreaCode('frontend');
+        $order = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\Sales\Model\Order');
+        $order->loadByIncrementId('100000001');
+        $order->setCustomerEmail('customer@example.com');
+
+        $shipment = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
+            'Magento\Sales\Model\Order\Shipment'
+        );
+        $shipment->setOrder($order);
+
+        $payment = $order->getPayment();
+        $paymentInfoBlock = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
+            'Magento\Payment\Helper\Data'
+        )->getInfoBlock(
+            $payment
+        );
+        $payment->setBlockMock($paymentInfoBlock);
+
+        $this->assertEmpty($shipment->getEmailSent());
+
+        $orderSender = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create('Magento\Sales\Model\Order\Email\Sender\ShipmentSender');
+        $result = $orderSender->send($shipment, true);
+
+        $this->assertTrue($result);
+
+        $this->assertNotEmpty($shipment->getEmailSent());
+        $this->assertEquals('frontend', $paymentInfoBlock->getArea());
+    }
+
+    /**
+     * Check the correctness and stability of set/get packages of shipment
+     *
+     * @magentoDataFixture Magento/Sales/_files/order.php
+     */
+    public function testPackages()
+    {
+        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $objectManager->get('Magento\Framework\App\State')->setAreaCode('frontend');
+        $order = $objectManager->create('Magento\Sales\Model\Order');
+        $order->loadByIncrementId('100000001');
+        $order->setCustomerEmail('customer@example.com');
+
+        $payment = $order->getPayment();
+        $paymentInfoBlock = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
+            'Magento\Payment\Helper\Data'
+        )->getInfoBlock(
+            $payment
+        );
+        $payment->setBlockMock($paymentInfoBlock);
+
+        /** @var \Magento\Sales\Model\Order\Shipment $shipment */
+        $shipment = $objectManager->create('Magento\Sales\Model\Order\Shipment');
+        $shipment->setOrder($order);
+
+        $packages = array(array('1'), array('2'));
+
+        $shipment->addItem($objectManager->create('Magento\Sales\Model\Order\Shipment\Item'));
+        $shipment->setPackages($packages);
+        $this->assertEquals($packages, $shipment->getPackages());
+        $shipment->save();
+        $shipment->save();
+        $shipment->load($shipment->getId());
+        $this->assertEquals($packages, $shipment->getPackages());
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Sales/Model/Order/ShipmentTest.php b/dev/tests/integration/testsuite/Magento/Sales/Model/Order/ShipmentTest.php
index e4b2dab6f474c149537bdfdee1ec3c2ac7691109..50b3ca08b23810fb6362d66b62515b2ad1a742a5 100644
--- a/dev/tests/integration/testsuite/Magento/Sales/Model/Order/ShipmentTest.php
+++ b/dev/tests/integration/testsuite/Magento/Sales/Model/Order/ShipmentTest.php
@@ -25,36 +25,6 @@ namespace Magento\Sales\Model\Order;
 
 class ShipmentTest extends \PHPUnit_Framework_TestCase
 {
-    /**
-     * @magentoDataFixture Magento/Sales/_files/order.php
-     */
-    public function testSendEmail()
-    {
-        \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\Framework\App\State')
-            ->setAreaCode('frontend');
-        $order = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\Sales\Model\Order');
-        $order->loadByIncrementId('100000001');
-        $order->setCustomerEmail('customer@example.com');
-
-        $shipment = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
-            'Magento\Sales\Model\Order\Shipment'
-        );
-        $shipment->setOrder($order);
-
-        $payment = $order->getPayment();
-        $paymentInfoBlock = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
-            'Magento\Payment\Helper\Data'
-        )->getInfoBlock(
-            $payment
-        );
-        $payment->setBlockMock($paymentInfoBlock);
-
-        $this->assertEmpty($shipment->getEmailSent());
-        $shipment->sendEmail(true);
-        $this->assertNotEmpty($shipment->getEmailSent());
-        $this->assertEquals('frontend', $paymentInfoBlock->getArea());
-    }
-
     /**
      * Check the correctness and stability of set/get packages of shipment
      *
diff --git a/dev/tests/integration/testsuite/Magento/Sales/Model/Service/QuoteTest.php b/dev/tests/integration/testsuite/Magento/Sales/Model/Service/QuoteTest.php
index b6dc3f5470988d493c35e8721a7bb44793bb717c..3e417f80252e972a28052ca96aec0068cd11e65e 100755
--- a/dev/tests/integration/testsuite/Magento/Sales/Model/Service/QuoteTest.php
+++ b/dev/tests/integration/testsuite/Magento/Sales/Model/Service/QuoteTest.php
@@ -168,6 +168,7 @@ class QuoteTest extends \PHPUnit_Framework_TestCase
     private function _prepareQuote($customerIsGuest)
     {
         $quoteFixture = $this->_prepareQuoteFixture($customerIsGuest);
+        $quoteFixture->setCustomerEmail('admin@example.com');
         $this->_serviceQuote = Bootstrap::getObjectManager()->create(
             'Magento\Sales\Model\Service\Quote',
             array('quote' => $quoteFixture)
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 8b346afc80c030a4d43d770b5de20415092585a3..4d8d86ba287ab5d6e28809a44f601d3c1cde2917 100644
--- a/dev/tests/integration/testsuite/Magento/Sales/_files/order_info.php
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/order_info.php
@@ -84,6 +84,8 @@ $quote->getShippingAddress()->collectShippingRates();
 $quote->collectTotals();
 $quote->save();
 
+
+$quote->setCustomerEmail('admin@example.com');
 /** @var $service \Magento\Sales\Model\Service\Quote */
 $service = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
     'Magento\Sales\Model\Service\Quote',
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/order_paid_with_payflowpro.php b/dev/tests/integration/testsuite/Magento/Sales/_files/order_paid_with_payflowpro.php
index 21023ba2dd5085b6cc93f577dbaed3f9945285c2..c7f27e00b37340448a9d7799603521791fe64baf 100644
--- a/dev/tests/integration/testsuite/Magento/Sales/_files/order_paid_with_payflowpro.php
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/order_paid_with_payflowpro.php
@@ -43,6 +43,8 @@ $order->setIncrementId(
     100
 )->setBaseSubtotal(
     100
+)->setCustomerEmail(
+    'admin@example.com'
 )->setCustomerIsGuest(
     true
 )->setBillingAddress(
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/quote.php b/dev/tests/integration/testsuite/Magento/Sales/_files/quote.php
index 39514050b9c4a2404c4d90d9e09f1d5516cb58a3..5a66eb4642d036acca3f5eb38da689a9b219b02a 100644
--- a/dev/tests/integration/testsuite/Magento/Sales/_files/quote.php
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/quote.php
@@ -80,4 +80,5 @@ $quote->setCustomerIsGuest(
 );
 $quote->getPayment()->setMethod('checkmo');
 $quote->setIsMultiShipping('1');
+$quote->collectTotals();
 $quote->save();
diff --git a/app/code/Magento/User/data/user_setup/data-upgrade-1.6.1.3-1.6.1.4.php b/dev/tests/integration/testsuite/Magento/Sales/_files/quote_rollback.php
similarity index 53%
rename from app/code/Magento/User/data/user_setup/data-upgrade-1.6.1.3-1.6.1.4.php
rename to dev/tests/integration/testsuite/Magento/Sales/_files/quote_rollback.php
index 3cd477712e4b06d363c1e6fa3261f44b712ec52a..dec032812998e0c7a4a6dcdf65edf6338ecac419 100644
--- a/app/code/Magento/User/data/user_setup/data-upgrade-1.6.1.3-1.6.1.4.php
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/quote_rollback.php
@@ -22,24 +22,24 @@
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
-/** @var $installer \Magento\Framework\Module\Setup */
-$installer = $this;
-$installer->startSetup();
+/** @var \Magento\Framework\Registry $registry */
+$registry = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\Framework\Registry');
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', true);
 
-$tableName = $installer->getTable('admin_rule');
+/** @var $quote \Magento\Sales\Model\Quote */
+$quote = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\Sales\Model\Quote');
+$quote->load('test01', 'reserved_order_id');
+if ($quote->getId()) {
+    $quote->delete();
+}
 
-if ($tableName) {
-    /** @var \Magento\Framework\DB\Adapter\AdapterInterface $connection */
-    $connection = $installer->getConnection();
-    $remove = array(
-        'Magento_Catalog::catalog_attributes',
-        'Magento_Cms::cms',
-        'Magento_Newsletter::admin_newsletter',
-        'Magento_Review::pending',
-        'Magento_Review::reviews',
-        'Magento_Review::reviews_ratings'
-    );
-    $connection->delete($tableName, array('resource_id IN (?)' => $remove));
+/** @var $product \Magento\Catalog\Model\Product */
+$product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\Catalog\Model\Product');
+$product->load(1);
+if ($product->getId()) {
+    $product->delete();
 }
 
-$installer->endSetup();
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', false);
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/quote_with_customer.php b/dev/tests/integration/testsuite/Magento/Sales/_files/quote_with_customer.php
index d9c7c9be93df382628c76b0579b3f2323d62c241..f7cb66452fe434d81397bcd5474b4e3c5ce15c1f 100644
--- a/dev/tests/integration/testsuite/Magento/Sales/_files/quote_with_customer.php
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/quote_with_customer.php
@@ -25,5 +25,10 @@
 include __DIR__ . '/quote.php';
 include __DIR__ . '/../../../Magento/Customer/_files/customer.php';
 
-$customerIdFromFixture = 1;
-$quote->setCustomerId($customerIdFromFixture)->setCustomerIsGuest(false)->save();
+/** @var $quote \Magento\Sales\Model\Quote */
+$quote = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\Sales\Model\Quote');
+$quote->load('test01', 'reserved_order_id');
+/** @var $customer \Magento\Customer\Model\Customer */
+$customer = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\Customer\Model\Customer');
+$customer->load(1);
+$quote->setCustomer($customer)->setCustomerIsGuest(false)->save();
diff --git a/dev/tests/integration/testsuite/Magento/Sales/_files/quote_with_customer_rollback.php b/dev/tests/integration/testsuite/Magento/Sales/_files/quote_with_customer_rollback.php
new file mode 100644
index 0000000000000000000000000000000000000000..fe6c6f3de4f583f8b6e5f5624edbfb2071c80b0b
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Sales/_files/quote_with_customer_rollback.php
@@ -0,0 +1,25 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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)
+ */
+include __DIR__ . '/quote_rollback.php';
+include __DIR__ . '/../../../Magento/Customer/_files/customer_rollback.php';
diff --git a/app/code/Magento/User/sql/user_setup/upgrade-1.6.1.4-1.6.1.5.php b/dev/tests/integration/testsuite/Magento/Store/_files/second_store.php
similarity index 53%
rename from app/code/Magento/User/sql/user_setup/upgrade-1.6.1.4-1.6.1.5.php
rename to dev/tests/integration/testsuite/Magento/Store/_files/second_store.php
index 93b517fc1e93c98e89eaa061e36c5c4280f7b5e5..bbba87052bfb7d2e55e152b7d5b1f5fb1910729d 100644
--- a/app/code/Magento/User/sql/user_setup/upgrade-1.6.1.4-1.6.1.5.php
+++ b/dev/tests/integration/testsuite/Magento/Store/_files/second_store.php
@@ -22,20 +22,29 @@
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
-/* @var $installer \Magento\Framework\Module\Setup */
-$installer = $this;
-
-$installer->startSetup();
-$connection = $installer->getConnection();
-$connection->addColumn(
-    $installer->getTable('admin_role'),
-    'user_type',
-    array(
-        'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
-        'length' => 16,
-        'nullable' => true,
-        'comment' => 'User type'
-    )
+$store = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\Store\Model\Store');
+$websiteId = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
+    'Magento\Store\Model\StoreManagerInterface'
+)->getWebsite()->getId();
+$groupId = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
+    'Magento\Store\Model\StoreManagerInterface'
+)->getWebsite()->getDefaultGroupId();
+$store->setCode(
+    'fixture_second_store'
+)->setWebsiteId(
+    $websiteId
+)->setGroupId(
+    $groupId
+)->setName(
+    'Fixture Store'
+)->setSortOrder(
+    10
+)->setIsActive(
+    1
 );
-$connection->dropColumn($installer->getTable('admin_rule'), 'role_type');
-$installer->endSetup();
+$store->save();
+
+/* Refresh stores memory cache */
+\Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
+    'Magento\Store\Model\StoreManagerInterface'
+)->reinitStores();
diff --git a/dev/tests/integration/testsuite/Magento/Store/_files/second_store_rollback.php b/dev/tests/integration/testsuite/Magento/Store/_files/second_store_rollback.php
new file mode 100644
index 0000000000000000000000000000000000000000..e17e1df9e27d8ec1f92e3c666f7e7acbec4a9518
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Store/_files/second_store_rollback.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)
+ */
+/** @var \Magento\Framework\Registry $registry */
+$registry = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\Framework\Registry');
+
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', true);
+
+/** @var Magento\Store\Model\Store $store */
+$store = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\Store\Model\Store');
+$store->load('fixture_second_store');
+
+if ($store->getId()) {
+    $store->delete();
+}
+
+$registry->unregister('isSecureArea');
+$registry->register('isSecureArea', false);
diff --git a/dev/tests/integration/testsuite/Magento/Tax/Service/V1/TaxRateServiceTest.php b/dev/tests/integration/testsuite/Magento/Tax/Service/V1/TaxRateServiceTest.php
index 0331c269cfb163d2631afa28f0c823d36c768a93..4584a87934006e8a607f57c209a15fdf03a2f560 100644
--- a/dev/tests/integration/testsuite/Magento/Tax/Service/V1/TaxRateServiceTest.php
+++ b/dev/tests/integration/testsuite/Magento/Tax/Service/V1/TaxRateServiceTest.php
@@ -150,6 +150,25 @@ class TaxRateServiceTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals($taxData['titles'][0]['value'], $titles[0]->getValue());
     }
 
+    /**
+     * @expectedException \Magento\Framework\Exception\InputException
+     * @expectedExceptionMessage id is not expected for this request.
+     * @magentoDbIsolation enabled
+     */
+    public function testCreateTaxRateWithId()
+    {
+        $invalidTaxData = [
+            'id' => 2,
+            'country_id' => 'US',
+            'region_id' => '8',
+            'percentage_rate' => '8.25',
+            'code' => 'US-CA-*-Rate' . rand(),
+            'zip_range' => ['from' => 78765, 'to' => 78780]
+        ];
+        $taxRate = $this->taxRateBuilder->populateWithArray($invalidTaxData)->create();
+        $this->taxRateService->createTaxRate($taxRate);
+    }
+
     /**
      * @expectedException \Magento\Framework\Exception\InputException
      * @expectedExceptionMessage Code already exists.
diff --git a/dev/tests/integration/testsuite/Magento/Tax/Service/V1/TaxRuleServiceTest.php b/dev/tests/integration/testsuite/Magento/Tax/Service/V1/TaxRuleServiceTest.php
index b3455a2a334e94c2bc236a203e3f60f299e6b1c0..5b6b780af82b1ff45661da12ef37cce827027b03 100644
--- a/dev/tests/integration/testsuite/Magento/Tax/Service/V1/TaxRuleServiceTest.php
+++ b/dev/tests/integration/testsuite/Magento/Tax/Service/V1/TaxRuleServiceTest.php
@@ -24,6 +24,7 @@
 
 namespace Magento\Tax\Service\V1;
 
+use Magento\Backend\Block\Widget\Grid\Column\Renderer\Input;
 use Magento\Framework\Exception\NoSuchEntityException;
 use Magento\Framework\Exception\InputException;
 use Magento\Tax\Service\V1\Data\TaxRule;
@@ -134,7 +135,69 @@ class TaxRuleServiceTest extends \PHPUnit_Framework_TestCase
     /**
      * @magentoDbIsolation enabled
      */
-    public function testCreateTaxRuleInvalid()
+    public function testCreateTaxRuleSpecifyingId()
+    {
+        $taxRuleDataObject = $this->taxRuleBuilder
+            ->setId(123)
+            ->setCode('code')
+            ->setCustomerTaxClassIds([3])
+            ->setProductTaxClassIds([2])
+            ->setTaxRateIds([2])
+            ->setPriority(0)
+            ->setSortOrder(1)
+            ->create();
+
+        try {
+            $this->taxRuleService->createTaxRule($taxRuleDataObject);
+            $this->fail('Did not throw expected InputException');
+        } catch (InputException $e) {
+            $this->assertEquals('TaxRule ID should not be specified.', $e->getMessage());
+        }
+    }
+
+    /**
+     * @magentoDbIsolation enabled
+     */
+    public function testCreateTaxRuleInvalidTaxClassIds()
+    {
+        $taxRuleData = [
+            TaxRule::CODE => 'code',
+            // These TaxClassIds exist, but '2' is should be a productTaxClassId and
+            // '3' should be a customerTaxClassId. See MAGETWO-25683.
+            TaxRule::CUSTOMER_TAX_CLASS_IDS => [2],
+            TaxRule::PRODUCT_TAX_CLASS_IDS => [3],
+            TaxRule::TAX_RATE_IDS => [1],
+            TaxRule::PRIORITY => 0,
+            TaxRule::SORT_ORDER => 0,
+        ];
+        // Tax rule data object created
+        $taxRule = $this->taxRuleBuilder->populateWithArray($taxRuleData)->create();
+
+        try {
+            //Tax rule service call
+            $this->taxRuleService->createTaxRule($taxRule);
+            $this->fail('Did not throw expected InputException');
+        } catch (InputException $e) {
+            $expectedCustomerTaxClassIdParams = [
+                'fieldName' => $taxRule::CUSTOMER_TAX_CLASS_IDS,
+                'value'     => 2,
+            ];
+            $expectedProductTaxClassIdParams = [
+                'fieldName' => $taxRule::PRODUCT_TAX_CLASS_IDS,
+                'value'    => 3,
+            ];
+
+            $actualErrors = $e->getErrors();
+            $this->assertEquals(2, count($actualErrors));
+            $this->assertEquals($expectedCustomerTaxClassIdParams, $actualErrors[0]->getParameters());
+            $this->assertEquals($expectedProductTaxClassIdParams, $actualErrors[1]->getParameters());
+        }
+    }
+
+    /**
+     * @magentoDbIsolation enabled
+     */
+    public function testCreateTaxRuleInvalidSortOrder()
     {
         $taxRuleData = [
             TaxRule::CODE => 'code',
diff --git a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/AclConfigFilesTest.php b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/AclConfigFilesTest.php
index 3ce2d348603fe17ce9ed5fc4024e0dba32d39c17..1f01da3d28a0d88057bcb44ee753b422ee628b16 100644
--- a/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/AclConfigFilesTest.php
+++ b/dev/tests/integration/testsuite/Magento/Test/Integrity/Modular/AclConfigFilesTest.php
@@ -74,7 +74,7 @@ class AclConfigFilesTest extends \PHPUnit_Framework_TestCase
                 'Magento\Framework\App\Filesystem'
             )->getPath(
                 \Magento\Framework\App\Filesystem::APP_DIR
-            ) . '/*/*/*/etc/adminhtml/acl.xml'
+            ) . '/*/*/*/etc/acl.xml'
         );
         $dataProviderResult = array();
         foreach ($fileList as $file) {
diff --git a/dev/tests/integration/testsuite/Magento/User/Block/Role/Tab/EditTest.php b/dev/tests/integration/testsuite/Magento/User/Block/Role/Tab/EditTest.php
index 77381b9a7a15d847571d7896eaec43ef4a4cd891..96891e32e736cb24846e5c86419a1e096408c550 100644
--- a/dev/tests/integration/testsuite/Magento/User/Block/Role/Tab/EditTest.php
+++ b/dev/tests/integration/testsuite/Magento/User/Block/Role/Tab/EditTest.php
@@ -35,7 +35,8 @@ class EditTest extends \PHPUnit_Framework_TestCase
 
     protected function setUp()
     {
-        $roleAdmin = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\User\Model\Role');
+        $roleAdmin = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create('Magento\Authorization\Model\Role');
         $roleAdmin->load(\Magento\TestFramework\Bootstrap::ADMIN_ROLE_NAME, 'role_name');
         \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
             'Magento\Framework\App\RequestInterface'
diff --git a/dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/User/RoleTest.php b/dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/User/RoleTest.php
index 98eec13199931a7fbbf566ea047d76391f163fbe..f6f57d4d4baffdacfa3c9d4124c0d5f2abdd43f7 100644
--- a/dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/User/RoleTest.php
+++ b/dev/tests/integration/testsuite/Magento/User/Controller/Adminhtml/User/RoleTest.php
@@ -32,7 +32,8 @@ class RoleTest extends \Magento\Backend\Utility\Controller
 {
     public function testEditRoleAction()
     {
-        $roleAdmin = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\User\Model\Role');
+        $roleAdmin = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->create('Magento\Authorization\Model\Role');
         $roleAdmin->load(\Magento\TestFramework\Bootstrap::ADMIN_ROLE_NAME, 'role_name');
 
         $this->getRequest()->setParam('rid', $roleAdmin->getId());
diff --git a/dev/tests/integration/testsuite/Magento/User/Model/UserTest.php b/dev/tests/integration/testsuite/Magento/User/Model/UserTest.php
index c0a11f7ee0a9b6c6fd79389fa2d2724de5382eed..dc4c4edde26d0ddfd2edd2656cf6f094aa1336c1 100644
--- a/dev/tests/integration/testsuite/Magento/User/Model/UserTest.php
+++ b/dev/tests/integration/testsuite/Magento/User/Model/UserTest.php
@@ -39,7 +39,7 @@ class UserTest extends \PHPUnit_Framework_TestCase
     protected $_dateTime;
 
     /**
-     * @var \Magento\User\Model\Role
+     * @var \Magento\Authorization\Model\Role
      */
     protected static $_newRole;
 
@@ -112,7 +112,7 @@ class UserTest extends \PHPUnit_Framework_TestCase
     public static function roleDataFixture()
     {
         self::$_newRole = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
-            'Magento\User\Model\Role'
+            'Magento\Authorization\Model\Role'
         );
         self::$_newRole->setName('admin_role')->setRoleType('G')->setPid('1');
         self::$_newRole->save();
@@ -152,7 +152,7 @@ class UserTest extends \PHPUnit_Framework_TestCase
     {
         $this->_model->loadByUsername(\Magento\TestFramework\Bootstrap::ADMIN_NAME);
         $role = $this->_model->getRole();
-        $this->assertInstanceOf('Magento\User\Model\Role', $role);
+        $this->assertInstanceOf('Magento\Authorization\Model\Role', $role);
         $this->assertEquals(1, $role->getId());
         $this->_model->setRoleId(self::$_newRole->getId())->save();
         $role = $this->_model->getRole();
diff --git a/dev/tests/integration/testsuite/Magento/User/_files/user_with_role.php b/dev/tests/integration/testsuite/Magento/User/_files/user_with_role.php
new file mode 100644
index 0000000000000000000000000000000000000000..f8304bfed7d09662d6fd036053c9c6f8eea6d728
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/User/_files/user_with_role.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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)
+ */
+
+/**
+ * Create an admin user with an assigned role
+ */
+
+/** @var $model \Magento\User\Model\User */
+$model = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\User\Model\User');
+$model->setFirstname("John")
+    ->setLastname("Doe")
+    ->setUsername('adminUser')
+    ->setPassword(\Magento\TestFramework\Bootstrap::ADMIN_PASSWORD)
+    ->setEmail('adminUser@example.com')
+    ->setRoleType('G')
+    ->setResourceId('Magento_Adminhtml::all')
+    ->setPrivileges("")
+    ->setAssertId(0)
+    ->setRoleId(1)
+    ->setPermission('allow');
+$model->save();
diff --git a/dev/tests/static/framework/Magento/TestFramework/Inspection/WordsFinder.php b/dev/tests/static/framework/Magento/TestFramework/Inspection/WordsFinder.php
index eb91500f56137a90d5aea40b442fce3377048ed7..822fcf1e7c814cb00ec82fcfad5641fd89f2d256 100644
--- a/dev/tests/static/framework/Magento/TestFramework/Inspection/WordsFinder.php
+++ b/dev/tests/static/framework/Magento/TestFramework/Inspection/WordsFinder.php
@@ -67,7 +67,7 @@ class WordsFinder
         if (!is_dir($baseDir)) {
             throw new \Magento\TestFramework\Inspection\Exception("Base directory {$baseDir} does not exist");
         }
-        $this->_baseDir = realpath($baseDir);
+        $this->_baseDir = str_replace('\\', '/', realpath($baseDir));
 
         // Load config files
         if (!is_array($configFiles)) {
@@ -81,7 +81,7 @@ class WordsFinder
         $basePath = $this->_baseDir . '/';
         $basePathLen = strlen($basePath);
         foreach ($configFiles as $configFile) {
-            $configFile = realpath($configFile);
+            $configFile = str_replace('\\', '/', realpath($configFile));
             if (strncmp($basePath, $configFile, $basePathLen) === 0) {
                 // File is inside base dir
                 $this->_whitelist[$this->_getRelPath($configFile)] = array();
diff --git a/dev/tests/static/framework/Magento/TestFramework/Utility/Classes.php b/dev/tests/static/framework/Magento/TestFramework/Utility/Classes.php
index c8523dae7469fe852b5c84513ebb9d7561a2707a..5aabe6c1bab6cec865c71585c1422252d9fcee88 100644
--- a/dev/tests/static/framework/Magento/TestFramework/Utility/Classes.php
+++ b/dev/tests/static/framework/Magento/TestFramework/Utility/Classes.php
@@ -292,7 +292,7 @@ class Classes
      */
     public static function isAutogenerated($className)
     {
-        if (preg_match('/.*\\\\[a-zA-Z0-9]{1,}(Factory|Proxy)$/', $className)) {
+        if (preg_match('/.*\\\\[a-zA-Z0-9]{1,}(Factory|Proxy|SearchResults)$/', $className)) {
             return true;
         }
 
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 2173e3ef6eab5229cb6686d3d408bfde9302cc9a..6ed35e3e3b99b30840f4b714e0bb16cf968f44f2 100644
--- a/dev/tests/static/testsuite/Magento/Test/Integrity/Di/CompilerTest.php
+++ b/dev/tests/static/testsuite/Magento/Test/Integrity/Di/CompilerTest.php
@@ -230,6 +230,7 @@ class CompilerTest extends \PHPUnit_Framework_TestCase
             $filePath = preg_replace($patterns, $replacements, $file);
             $className = substr($filePath, 0, -4);
             if (class_exists($className)) {
+                $file = str_replace('\\', DIRECTORY_SEPARATOR, $file);
                 $classes[$file] = $className;
             }
         }
@@ -339,8 +340,20 @@ class CompilerTest extends \PHPUnit_Framework_TestCase
             $autoloader,
             $generatorIo,
             array(
+                \Magento\Framework\Service\Code\Generator\SearchResultsBuilder::ENTITY_TYPE
+                    => 'Magento\Framework\Service\Code\Generator\SearchResultsBuilder',
                 \Magento\Framework\ObjectManager\Code\Generator\Factory::ENTITY_TYPE
-                => 'Magento\Framework\ObjectManager\Code\Generator\Factory'
+                    => 'Magento\Framework\ObjectManager\Code\Generator\Factory',
+                \Magento\Framework\ObjectManager\Code\Generator\Repository::ENTITY_TYPE
+                    => 'Magento\Framework\ObjectManager\Code\Generator\Repository',
+                \Magento\Framework\ObjectManager\Code\Generator\Converter::ENTITY_TYPE
+                    => 'Magento\Framework\ObjectManager\Code\Generator\Converter',
+                \Magento\Framework\Service\Code\Generator\Mapper::ENTITY_TYPE
+                    => 'Magento\Framework\Service\Code\Generator\Mapper',
+                \Magento\Framework\Service\Code\Generator\Builder::ENTITY_TYPE
+                    => 'Magento\Framework\Service\Code\Generator\Builder',
+                \Magento\Framework\Service\Code\Generator\SearchResults::ENTITY_TYPE
+                    => 'Magento\Framework\Service\Code\Generator\SearchResults'
             )
         );
         $autoloader = new \Magento\Framework\Code\Generator\Autoloader($generator);
diff --git a/dev/tests/static/testsuite/Magento/Test/Integrity/Magento/Framework/Search/ConfigTest.php b/dev/tests/static/testsuite/Magento/Test/Integrity/Magento/Framework/Search/ConfigTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..df0577ac49d5d6c7594594ff5620fb01dd1a5ca6
--- /dev/null
+++ b/dev/tests/static/testsuite/Magento/Test/Integrity/Magento/Framework/Search/ConfigTest.php
@@ -0,0 +1,148 @@
+<?php
+/**
+ * Test search_request.xsd and xml files.
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Integrity\Magento\Framework\Search;
+
+class ConfigTest extends \Magento\TestFramework\Integrity\AbstractConfig
+{
+    /**
+     * Returns the name of the XSD file to be used to validate the XML
+     *
+     * @return string
+     */
+    protected function _getXsd()
+    {
+        return '/lib/internal/Magento/Framework/Search/etc/search_request_merged.xsd';
+    }
+
+    /**
+     * Returns the name of the XSD file to be used to validate partial XML
+     *
+     * @return string
+     */
+    protected function _getFileXsd()
+    {
+        return '/lib/internal/Magento/Framework/Search/etc/search_request.xsd';
+    }
+
+    /**
+     * The location of a single valid complete xml file
+     *
+     * @return string
+     */
+    protected function _getKnownValidXml()
+    {
+        return __DIR__ . '/_files/valid.xml';
+    }
+
+    /**
+     * The location of a single known invalid complete xml file
+     *
+     * @return string
+     */
+    protected function _getKnownInvalidXml()
+    {
+        return __DIR__ . '/_files/invalid.xml';
+    }
+
+    /**
+     * The location of a single known valid partial xml file
+     *
+     * @return string
+     */
+    protected function _getKnownValidPartialXml()
+    {
+        return __DIR__ . '/_files/valid_partial.xml';
+    }
+
+    /**
+     * @param null $expectedErrors
+     */
+    public function testSchemaUsingInvalidXml($expectedErrors = null)
+    {
+        $expectedErrors = array_filter(
+            explode(
+                "\n",
+                "
+Element 'from': This element is not expected. Expected is ( filters ).
+No match found for key-sequence ['sugegsted_search_container'] of keyref 'requestQueryReference'.
+Element 'queryReference': No match found for key-sequence ['fulltext_search_query4'] of keyref 'queryReference'.
+"
+            )
+        );
+        parent::testSchemaUsingInvalidXml($expectedErrors);
+    }
+
+    /**
+     * @param null $expectedErrors
+     */
+    public function testFileSchemaUsingInvalidXml($expectedErrors = null)
+    {
+        $expectedErrors = array_filter(
+            explode(
+                "\n",
+                "
+Element 'queryReference': The attribute 'ref' is required but missing.
+Element 'filterReference': The attribute 'ref' is required but missing.
+Element 'filter': The attribute 'field' is required but missing.
+Element 'filter': The attribute 'value' is required but missing.
+Element 'filterReference': The attribute 'clause' is required but missing.
+Element 'filterReference': The attribute 'ref' is required but missing.
+Element 'bucket': Missing child element(s). Expected is ( metrics ).
+Element 'metric', attribute 'type': [facet 'enumeration'] " .
+                "The value 'sumasdasd' is not an element of the set {'sum', 'count', 'min', 'max'}.
+Element 'metric', attribute 'type': 'sumasdasd' is not a valid value of the local atomic type.
+Element 'bucket': Missing child element(s). Expected is ( ranges ).
+Element 'request': Missing child element(s). Expected is ( from )."
+            )
+        );
+        parent::testFileSchemaUsingInvalidXml($expectedErrors);
+    }
+
+    /**
+     * Returns the name of the xml files to validate
+     *
+     * @return string
+     */
+    protected function _getXmlName()
+    {
+        return 'search_request.xml';
+    }
+
+    /**
+     * The location of a single known invalid partial xml file
+     *
+     * @return string
+     */
+    protected function _getKnownInvalidPartialXml()
+    {
+        return __DIR__ . '/_files/invalid_partial.xml';
+    }
+
+    public function testSchemaUsingValidXml()
+    {
+        parent::testSchemaUsingValidXml();
+    }
+}
diff --git a/dev/tests/static/testsuite/Magento/Test/Integrity/Magento/Framework/Search/_files/invalid.xml b/dev/tests/static/testsuite/Magento/Test/Integrity/Magento/Framework/Search/_files/invalid.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b11a17478f932afa4715a6c92e81dab91c395d63
--- /dev/null
+++ b/dev/tests/static/testsuite/Magento/Test/Integrity/Magento/Framework/Search/_files/invalid.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)
+ */
+-->
+<requests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <request query="sugegsted_search_container" index="product">
+        <queries>
+            <query xsi:type="boolQuery" name="suggested_search_container_dd" boost="2">
+                <queryReference clause="not" ref="fulltext_search_query4" />
+            </query>
+        </queries>
+        <from>10</from>
+        <size>10</size>
+    </request>
+</requests>
diff --git a/dev/tests/static/testsuite/Magento/Test/Integrity/Magento/Framework/Search/_files/invalid_partial.xml b/dev/tests/static/testsuite/Magento/Test/Integrity/Magento/Framework/Search/_files/invalid_partial.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6dffe42beca90623f602df71648a9f6031dc75eb
--- /dev/null
+++ b/dev/tests/static/testsuite/Magento/Test/Integrity/Magento/Framework/Search/_files/invalid_partial.xml
@@ -0,0 +1,72 @@
+<?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)
+ */
+-->
+<requests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <request query="sugested_search_container" index="product">
+        <queries>
+            <query xsi:type="boolQuery" name="sugested_search_container" boost="2">
+                <queryReference clause="not" ref="fulltext_search_query" />
+            </query>
+
+            <query xsi:type="boolQuery" name="suggested_search_container_dd" boost="2">
+                <queryReference clause="not" ref="fulltext_search_query" />
+            </query>
+
+            <query xsi:type="matchQuery" name="fulltext_search_query" boost="5">
+                <match field="title" value="%request.title%" boost="2" />
+                <match field="description" value="%request.description%" />
+            </query>
+
+            <query xsi:type="filteredQuery" name="promoted_documents_boost">
+                <queryReference />
+            </query>
+
+            <query xsi:type="filteredQuery" name="promoted_documents_boost2">
+                <filterReference  />
+            </query>
+        </queries>
+        <filters>
+            <filter xsi:type="termFilter" name="promoted_documents_boost"  />
+            <filter xsi:type="rangeFilter" field="promoted" name="price_name" from="10" to="100" />
+            <filter xsi:type="boolFilter" name="price_name1">
+                <filterReference clause="must" ref="price_name" />
+                <filterReference />
+                <filterReference clause="must" ref="price_name" />
+            </filter>
+            <filter xsi:type="termFilter" name="promoted_boost" field="promoted" value="1" />
+            <filter xsi:type="rangeFilter" field="promoted" name="price" from="10" to="100" />
+        </filters>
+        <aggregation>
+             <bucket xsi:type="termBucket" name="category_bucket" field="category">
+
+             </bucket>
+             <bucket xsi:type="rangeBucket" name="price_bucket" field="price">
+                <metrics>
+                    <metric type="sumasdasd" />
+                </metrics>
+             </bucket>
+        </aggregation>
+    </request>
+</requests>
diff --git a/dev/tests/static/testsuite/Magento/Test/Integrity/Magento/Framework/Search/_files/valid.xml b/dev/tests/static/testsuite/Magento/Test/Integrity/Magento/Framework/Search/_files/valid.xml
new file mode 100644
index 0000000000000000000000000000000000000000..090a3c76b9a160ac52566f5bc8daf3a2a3ceb889
--- /dev/null
+++ b/dev/tests/static/testsuite/Magento/Test/Integrity/Magento/Framework/Search/_files/valid.xml
@@ -0,0 +1,116 @@
+<?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)
+ */
+-->
+<requests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <request query="sugegsted_search_container_1" index="product_1">
+        <queries>
+            <query xsi:type="boolQuery" name="sugegsted_search_container_1" boost="2">
+                <queryReference clause="must" ref="fulltext_search_query" />
+                <queryReference clause="should" ref="promoted_documents_boost" />
+                <queryReference clause="not" ref="query_reference" />
+            </query>
+
+            <query xsi:type="matchQuery" name="fulltext_search_query" boost="5">
+                <match field="title" value="%request.title%" boost="2" />
+                <match field="description" value="%request.description%" />
+            </query>
+
+            <query xsi:type="filteredQuery" name="promoted_documents_boost">
+                <queryReference ref="fulltext_search_query" />
+            </query>
+
+            <query xsi:type="filteredQuery" name="query_reference">
+                <filterReference ref="price" />
+            </query>
+        </queries>
+        <filters>
+            <filter xsi:type="termFilter" name="promoted_documents_boost" field="promoted" value="1" />
+            <filter xsi:type="rangeFilter" field="promoted" name="price_name" from="10" to="100" />
+            <filter xsi:type="boolFilter" name="price_name_bool">
+                <filterReference clause="must" ref="promoted_boost" />
+                <filterReference clause="should" ref="promoted_documents_boost" />
+                <filterReference clause="not" ref="price_name" />
+            </filter>
+            <filter xsi:type="termFilter" name="promoted_boost" field="promoted" value="1" />
+            <filter xsi:type="rangeFilter" field="promoted" name="price" from="10" to="100" />
+        </filters>
+        <aggregation>
+             <bucket xsi:type="termBucket" name="category_bucket" field="category">
+                <metrics>
+                    <metric type="sum" />
+                    <metric type="count" />
+                    <metric type="min" />
+                    <metric type="max" />
+                </metrics>
+             </bucket>
+             <bucket xsi:type="rangeBucket" name="price_bucket" field="price">
+                <metrics>
+                    <metric type="sum" />
+                    <metric type="count" />
+                    <metric type="min" />
+                    <metric type="max" />
+                </metrics>
+                 <ranges>
+                    <range from="" to="50" />
+                    <range from="50" to="100" />
+                    <range from="100" to="" />
+                </ranges>
+             </bucket>
+        </aggregation>
+        <from>10</from>
+        <size>10</size>
+    </request>
+    <request query="sugegsted_search_container_2" index="product_2">
+        <queries>
+            <query xsi:type="boolQuery" name="sugegsted_search_container_2" boost="2">
+                <queryReference clause="not" ref="fulltext_search_query_c_2" />
+            </query>
+            <query xsi:type="matchQuery" name="fulltext_search_query_c_2" boost="5">
+                <match field="title" value="%request.title%" boost="2" />
+                <match field="description" value="%request.description%" />
+            </query>
+        </queries>
+        <filters>
+            <filter xsi:type="rangeFilter" field="promoted" name="price_filter" from="10" to="100" />
+        </filters>
+        <aggregation>
+            <bucket xsi:type="termBucket" name="category_bucket" field="category">
+                <metrics>
+                    <metric type="sum" />
+                </metrics>
+            </bucket>
+            <bucket xsi:type="rangeBucket" name="price_bucket" field="price">
+                <metrics>
+                    <metric type="sum" />
+                </metrics>
+                <ranges>
+                    <range from="" to="50" />
+                </ranges>
+            </bucket>
+        </aggregation>
+        <from>0</from>
+        <size>10</size>
+    </request>
+</requests>
\ No newline at end of file
diff --git a/dev/tests/static/testsuite/Magento/Test/Integrity/Magento/Framework/Search/_files/valid_partial.xml b/dev/tests/static/testsuite/Magento/Test/Integrity/Magento/Framework/Search/_files/valid_partial.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1f5530a779c156a1cb46c75a8d2c273097e528fc
--- /dev/null
+++ b/dev/tests/static/testsuite/Magento/Test/Integrity/Magento/Framework/Search/_files/valid_partial.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)
+ */
+-->
+<requests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <request query="sugested_search_container_1" index="product_1">
+        <queries>
+            <query xsi:type="boolQuery" name="sugested_search_container" boost="2">
+                <queryReference clause="must" ref="fulltext_search_query" />
+                <queryReference clause="should" ref="suggested_search_container_dd" />
+            </query>
+
+            <query xsi:type="boolQuery" name="suggested_search_container_dd" boost="2">
+                <queryReference clause="not" ref="fulltext_search_query" />
+            </query>
+
+            <query xsi:type="matchQuery" name="fulltext_search_query" boost="5">
+                <match field="title" value="%request.title%" boost="2" />
+                <match field="description" value="%request.description%" />
+            </query>
+
+            <query xsi:type="filteredQuery" name="promoted_documents_boost">
+                <queryReference ref="fulltext_search_query" />
+            </query>
+
+            <query xsi:type="filteredQuery" name="promoted_documents_boost2">
+                <filterReference ref="promoted_documents_filter" />
+            </query>
+        </queries>
+        <filters>
+            <filter xsi:type="termFilter" name="promoted_documents_filter" field="promoted" value="1" />
+            <filter xsi:type="rangeFilter" field="promoted" name="price_name" from="10" to="100" />
+            <filter xsi:type="boolFilter" name="price_name1">
+                <filterReference clause="must" ref="promoted_boost" />
+                <filterReference clause="must" ref="price" />
+                <filterReference clause="must" ref="promoted_documents_filter" />
+            </filter>
+            <filter xsi:type="termFilter" name="promoted_boost" field="promoted" value="1" />
+            <filter xsi:type="rangeFilter" field="promoted" name="price" from="10" to="100" />
+        </filters>
+        <aggregation>
+            <bucket xsi:type="termBucket" name="category_bucket" field="category">
+                <metrics>
+                    <metric type="sum" />
+                    <metric type="count" />
+                    <metric type="min" />
+                    <metric type="max" />
+                </metrics>
+            </bucket>
+            <bucket xsi:type="rangeBucket" name="price_bucket" field="price">
+                <metrics>
+                    <metric type="sum" />
+                    <metric type="count" />
+                    <metric type="min" />
+                    <metric type="max" />
+                </metrics>
+                <ranges>
+                    <range from="" to="50" />
+                    <range from="50" to="100" />
+                    <range from="100" to="" />
+                </ranges>
+            </bucket>
+        </aggregation>
+        <from>10</from>
+        <size>10</size>
+    </request>
+</requests>
\ No newline at end of file
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 01d38633d5cf7598fe1addf01295c07e11529c25..7f88901174cdef92812ae3abd4d8ffb58e09a8ef 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
@@ -12,6 +12,7 @@ dev/tests/unit/testsuite/Magento/Framework/Code/_files/app/code/Magento/SomeModu
 dev/tests/unit/testsuite/Magento/Framework/Code/_files/app/code/Magento/SomeModule/Model/Six/Test.php
 dev/tests/unit/testsuite/Magento/Framework/ObjectManager/Config/Reader/_files/ConfigDomMock.php
 dev/tests/unit/testsuite/Magento/Framework/ObjectManager/Code/Generator/_files/Sample.php
+dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/_files/Sample.php
 dev/tools/Magento/Tools/I18n/Zend/Exception.php
 dev/tools/Magento/Tools/I18n/Zend/Console/Getopt/Exception.php
 dev/tools/Magento/Tools/I18n/Zend/Console/Getopt.php
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 54ed037558e8f7aefab84c00fbefe9e381ea70d8..2c1e544dcbec5791ae1736cdb20eb17bb10de94e 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
@@ -23,8 +23,8 @@
  */
 return array(
     'admin_assert' => 'Magento_Adminhtml',
-    'admin_role' => 'Magento_Adminhtml',
-    'admin_rule' => 'Magento_Adminhtml',
+    'authorization_role' => 'Magento_Authorization',
+    'authorization_rule' => 'Magento_Authorization',
     'admin_user' => 'Magento_Adminhtml',
     'adminnotification_inbox' => 'Magento_AdminNotification',
     'catalog_category_entity_datetime' => 'Magento_Catalog',
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 9bc2ac19e07cc7642e0f7a3ca2dc9316d6d764ce..9cae16d7795d61eee251d8d4180b9685120f82c2 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
@@ -31,9 +31,9 @@ return array(
     array('Mage_Admin_Model_Acl_Role'),
     array('Mage_Admin_Model_Acl_Resource', 'Magento\Framework\Acl\Resource'),
     array('Mage_Admin_Model_Acl_Role_Registry', 'Magento\Framework\Acl\Role\Registry'),
-    array('Mage_Admin_Model_Acl_Role_Generic', 'Magento\User\Model\Acl\Role\Generic'),
-    array('Mage_Admin_Model_Acl_Role_Group', 'Magento\User\Model\Acl\Role\Group'),
-    array('Mage_Admin_Model_Acl_Role_User', 'Magento\User\Model\Acl\Role\User'),
+    array('Mage_Admin_Model_Acl_Role_Generic', 'Magento\Authorization\Model\Acl\Role\Generic'),
+    array('Mage_Admin_Model_Acl_Role_Group', 'Magento\Authorization\Model\Acl\Role\Group'),
+    array('Mage_Admin_Model_Acl_Role_User', 'Magento\Authorization\Model\Acl\Role\User'),
     array('Mage_Admin_Model_Resource_Acl', 'Magento\User\Model\Resource\Acl'),
     array('Mage_Admin_Model_Observer'),
     array('Mage_Admin_Model_Session', 'Magento\Backend\Model\Auth\Session'),
@@ -43,17 +43,20 @@ return array(
     array('Mage_Admin_Model_Config'),
     array('Mage_Admin_Model_Resource_User', 'Magento\User\Model\Resource\User'),
     array('Mage_Admin_Model_Resource_User_Collection', 'Magento\User\Model\Resource\User\Collection'),
-    array('Mage_Admin_Model_Role', 'Magento\User\Model\Role'),
-    array('Mage_Admin_Model_Roles', 'Magento\User\Model\Roles'),
-    array('Mage_Admin_Model_Rules', 'Magento\User\Model\Rules'),
-    array('Mage_Admin_Model_Resource_Role', 'Magento\User\Model\Resource\Role'),
+    array('Mage_Admin_Model_Role', 'Magento\Authorization\Model\Role'),
+    array('Mage_Admin_Model_Roles', 'Magento\Authorization\Model\Roles'),
+    array('Mage_Admin_Model_Rules', 'Magento\Authorization\Model\Rules'),
+    array('Mage_Admin_Model_Resource_Role', 'Magento\Authorization\Model\Resource\Role'),
     array('Mage_Admin_Model_Resource_Roles', 'Magento\User\Model\Resource\Roles'),
-    array('Mage_Admin_Model_Resource_Rules', 'Magento\User\Model\Resource\Rules'),
-    array('Mage_Admin_Model_Resource_Role_Collection', 'Magento\User\Model\Resource\Role\Collection'),
+    array('Mage_Admin_Model_Resource_Rules', 'Magento\Authorization\Model\Resource\Rules'),
+    array('Mage_Admin_Model_Resource_Role_Collection', 'Magento\Authorization\Model\Resource\Role\Collection'),
     array('Mage_Admin_Model_Resource_Roles_Collection', 'Magento\User\Model\Resource\Roles\Collection'),
     array('Mage_Admin_Model_Resource_Roles_User_Collection', 'Magento\User\Model\Resource\Roles\User\Collection'),
-    array('Mage_Admin_Model_Resource_Rules_Collection', 'Magento\User\Model\Resource\Rules\Collection'),
-    array('Mage_Admin_Model_Resource_Permissions_Collection', 'Magento\User\Model\Resource\Permissions\Collection'),
+    array('Mage_Admin_Model_Resource_Rules_Collection', 'Magento\Authorization\Model\Resource\Rules\Collection'),
+    array(
+        'Mage_Admin_Model_Resource_Permissions_Collection',
+        'Magento\Authorization\Model\Resource\Permissions\Collection'
+    ),
     array('Mage_Adminhtml_Block_Abstract', 'Magento\Backend\Block\AbstractBlock'),
     array('Mage_Adminhtml_Block_Backup_Grid'),
     array('Mage_Adminhtml_Block_Cache_Grid'),
@@ -599,7 +602,8 @@ return array(
     array('Mage_Adminhtml_Model_System_Config_Source_Store', 'Magento\Backend\Model\Config\Source\Store'),
     array('Mage_Adminhtml_Model_System_Config_Source_Website', 'Magento\Backend\Model\Config\Source\Website'),
     array('Mage_Adminhtml_Model_System_Config_Source_Yesno', 'Magento\Backend\Model\Config\Source\Yesno'),
-    array('Mage_Adminhtml_Model_System_Config_Source_Yesnocustom',
+    array(
+        'Mage_Adminhtml_Model_System_Config_Source_Yesnocustom',
         'Magento\Backend\Model\Config\Source\Yesnocustom'
     ),
     array('Mage_Adminhtml_Model_System_Store', 'Magento\Store\Model\System\Store'),
@@ -696,7 +700,8 @@ return array(
         'Magento\ConfigurableProduct\Block\Product\View\Type\Configurable'
     ),
     array(
-        'Magento\Catalog\Block\Layer\Filter\AbstractFilter', 'Magento\LayeredNavigation\Block\Navigation\FilterRenderer'
+        'Magento\Catalog\Block\Layer\Filter\AbstractFilter',
+        'Magento\LayeredNavigation\Block\Navigation\FilterRenderer'
     ),
     array('Magento\Catalog\Block\Layer\Filter\Attribute', 'Magento\LayeredNavigation\Block\Navigation\FilterRenderer'),
     array('Magento\Catalog\Block\Layer\Filter\Category', 'Magento\LayeredNavigation\Block\Navigation\FilterRenderer'),
@@ -721,10 +726,12 @@ return array(
         'Magento\LayeredNavigation\Block\Navigation\FilterRenderer'
     ),
     array(
-        'Magento\Search\Block\Catalog\Layer\Filter\Decimal', 'Magento\LayeredNavigation\Block\Navigation\FilterRenderer'
+        'Magento\Search\Block\Catalog\Layer\Filter\Decimal',
+        'Magento\LayeredNavigation\Block\Navigation\FilterRenderer'
     ),
     array(
-        'Magento\Search\Block\Catalog\Layer\Filter\Price', 'Magento\LayeredNavigation\Block\Navigation\FilterRenderer'
+        'Magento\Search\Block\Catalog\Layer\Filter\Price',
+        'Magento\LayeredNavigation\Block\Navigation\FilterRenderer'
     ),
     array(
         'Magento\Search\Block\Catalogsearch\Layer\Filter\Attribute',
@@ -1427,12 +1434,15 @@ return array(
     ),
     array('Magento\Core\Model\Design\FileResolution\StrategyPool'),
     array('Magento\Framework\View\Design\FileResolution\StrategyPool'),
-    array('Magento\Core\Model\Layout\File','Magento\Framework\View\File'),
-    array('Magento\Core\Model\Layout\File\Factory','Magento\Framework\View\File\Factory'),
-    array('Magento\Core\Model\Layout\File\FileList\Factory','Magento\Framework\View\File\FileList\Factory'),
-    array('Magento\Core\Model\Layout\File\ListFile','Magento\Framework\View\File\FileList'),
-    array('Magento\Core\Model\Layout\File\Source\Aggregated','Magento\Framework\View\Layout\File\Collector\Aggregated'),
-    array('Magento\Core\Model\Layout\File\Source\Base','Magento\Framework\View\Layout\File\Source\Base'),
+    array('Magento\Core\Model\Layout\File', 'Magento\Framework\View\File'),
+    array('Magento\Core\Model\Layout\File\Factory', 'Magento\Framework\View\File\Factory'),
+    array('Magento\Core\Model\Layout\File\FileList\Factory', 'Magento\Framework\View\File\FileList\Factory'),
+    array('Magento\Core\Model\Layout\File\ListFile', 'Magento\Framework\View\File\FileList'),
+    array(
+        'Magento\Core\Model\Layout\File\Source\Aggregated',
+        'Magento\Framework\View\Layout\File\Collector\Aggregated'
+    ),
+    array('Magento\Core\Model\Layout\File\Source\Base', 'Magento\Framework\View\Layout\File\Source\Base'),
     array(
         'Magento\Core\Model\Layout\File\Source\Decorator\ModuleDependency',
         'Magento\Framework\View\File\Collector\Decorator\ModuleDependency'
@@ -2338,9 +2348,9 @@ return array(
     ['Magento\BaseScopeInterface', 'Magento\Framework\App\ScopeInterface'],
     ['Magento\BaseScopeResolverInterface', 'Magento\Framework\App\ScopeResolverInterface'],
     ['Magento\Framework\Locale\ScopeConfigInterface'],
-    ['Magento\Core\Model\Module\Output\Config','Magento\Framework\Module\Output\Config'],
-    ['Magento\Core\Model\Resource\Setup\Context','Magento\Framework\Module\Setup\Context'],
-    ['Magento\Core\Model\Resource\Setup\Migration','Magento\Framework\Module\Setup\Migration'],
+    ['Magento\Core\Model\Module\Output\Config', 'Magento\Framework\Module\Output\Config'],
+    ['Magento\Core\Model\Resource\Setup\Context', 'Magento\Framework\Module\Setup\Context'],
+    ['Magento\Core\Model\Resource\Setup\Migration', 'Magento\Framework\Module\Setup\Migration'],
     ['Magento\Core\Model\Resource\Setup\Generic'],
     ['Magento\Newsletter\Model\Resource\Setup'],
     ['Magento\SalesRule\Model\Resource\Setup'],
@@ -2441,8 +2451,6 @@ return array(
     ['Magento\AclFactory', 'Magento\Framework\AclFactory'],
     ['Magento\AppInterface', 'Magento\Framework\AppInterface'],
     ['Magento\Archive', 'Magento\Framework\Archive'],
-    ['Magento\Authorization', 'Magento\Framework\Authorization'],
-    ['Magento\AuthorizationInterface', 'Magento\Framework\AuthorizationInterface'],
     ['Magento\Event', 'Magento\Framework\Event'],
     ['Magento\EventFactory', 'Magento\Framework\EventFactory'],
     ['Magento\Exception', 'Magento\Framework\Exception'],
@@ -2573,7 +2581,10 @@ return array(
     ['Magento\Framework\View\Url', 'Magento\Framework\View\Asset\Repository'],
     ['Magento\Less\File\Source\Base', 'Magento\Framework\View\File\Collector\Base'],
     ['Magento\Less\File\Source\Theme', 'Magento\Framework\View\File\Collector\ThemeModular'],
-    ['Magento\Framework\View\Layout\File\FileList\CollateInterface', 'Magento\Framework\View\File\FileList\CollateInterface'],
+    [
+        'Magento\Framework\View\Layout\File\FileList\CollateInterface',
+        'Magento\Framework\View\File\FileList\CollateInterface'
+    ],
     ['Magento\Framework\View\Layout\File\FileList\Collator', 'Magento\Framework\View\File\FileList\Collator'],
     ['Magento\Framework\View\Layout\File\FileList\Factory', 'Magento\Framework\View\File\FileList\Factory'],
     [
@@ -2699,4 +2710,26 @@ return array(
     ['Magento\Catalog\Helper\Product\Price'],
     ['Magento\Tax\Model\Config\Source\TaxClass\Product', 'Magento\Tax\Model\TaxClass\Source\Product'],
     ['Magento\Tax\Model\Config\Source\TaxClass\Customer', 'Magento\Tax\Model\TaxClass\Source\Customer'],
+    ['Magento\AdminNotification\Model\System\MessageInterface', 'Magento\Framework\Notification\MessageInterface'],
+    ['Magento\AdminNotification\Model\System\MessageList', 'Magento\Framework\Notification\MessageList'],
+    [
+        'Magento\CatalogImportExport\Model\Import\Product\Type\Configurable',
+        'Magento\ConfigurableImportExport\Model\Import\Product\Type\Configurable'
+    ],
+    [
+        'Magento\CatalogImportExport\Model\Export\Product\Type\Configurable',
+        'Magento\ConfigurableImportExport\Model\Export\Product\Type\Configurable'
+    ],
+    [
+        'Magento\CatalogImportExport\Model\Export\RowCustomizer',
+        'Magento\ConfigurableImportExport\Model\Export\RowCustomizer'
+    ],
+    [
+        'Magento\CatalogImportExport\Model\Export\Product\Type\Grouped',
+        'Magento\GroupedImportExport\Model\Export\Product\Type\Grouped'
+    ],
+    [
+        'Magento\CatalogImportExport\Model\Import\Product\Type\Grouped',
+        'Magento\GroupedImportExport\Model\Import\Product\Type\Grouped'
+    ],
 );
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 837c22f270a322164ce8cf33d6c463b8fd715649..46a5a6a397ba9bbadcfee04ab9862291ac22044b 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
@@ -1802,5 +1802,17 @@ return array(
     ['prepareCatalogProductIndexSelect', 'Magento\CatalogInventory\Model\Observer'],
     ['prepareCatalogProductIndexSelect', 'Magento\CatalogInventory\Model\Resource\Stock\Status'],
     ['prepareCatalogProductIndexSelect', 'Magento\CatalogInventory\Model\Stock\Status'],
-    ['getDeleteUrl','\Magento\Checkout\Block\Cart\Item\Renderer'],
+    ['getPriceHtml', '\Magento\Catalog\Block\Product\AbstractProduct', '\Magento\Catalog\Block\Product\AbstractProduct::getProductPriceHtml'],
+    ['getDeleteUrl', '\Magento\Checkout\Block\Cart\Item\Renderer'],
+    ['sendNewOrderEmail', 'Magento\Sales\Model\Order'],
+    ['_getEmails', 'Magento\Sales\Model\Order'],
+    ['_getEmails', 'Magento\Sales\Model\Order\Creditmemo'],
+    ['sendUpdateEmail', 'Magento\Sales\Model\Order\Creditmemo'],
+    ['sendEmail', 'Magento\Sales\Model\Order\Creditmemo'],
+    ['sendEmail', 'Magento\Sales\Model\Order\Invoice'],
+    ['sendUpdateEmail', 'Magento\Sales\Model\Order\Invoice'],
+    ['_getEmails', 'Magento\Sales\Model\Order\Invoice'],
+    ['sendEmail', 'Magento\Sales\Model\Order\Shipment'],
+    ['sendUpdateEmail', 'Magento\Sales\Model\Order\Shipment'],
+    ['_getEmails', 'Magento\Sales\Model\Order\Shipment'],
 );
diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_namespaces.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_namespaces.php
index a5d35beee4a006da414e024315133477416e99d7..cc3cf20cf0f1e83a8356b0f6dad1263447ca6327 100644
--- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_namespaces.php
+++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_namespaces.php
@@ -37,7 +37,6 @@ return [
     ['Magento\Acl', 'Magento\Framework\Acl'],
     ['Magento\Archive', 'Magento\Framework\Archive'],
     ['Magento\Session', 'Magento\Framework\Session'],
-    ['Magento\Authorization', 'Magento\Framework\Authorization'],
     ['Magento\Cache', 'Magento\Framework\Cache'],
     ['Magento\ObjectManager', 'Magento\Framework\ObjectManager'],
     ['Magento\Exception', 'Magento\Framework\Exception'],
diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_paths.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_paths.php
index 453ffd8bc7c4508a3216cdffb36da40bef4ab9d2..9b23819278f48e0a8028d63cb45333468ff79f17 100644
--- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_paths.php
+++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_paths.php
@@ -71,11 +71,6 @@ return [
     ],
     ['/dev/tests/unit/testsuite/Magento/Session', '/dev/tests/unit/testsuite/Magento/Framework/Session'],
     ['/lib/Magento/Authorization', '/lib/Magento/Framework/Authorization'],
-    [
-        '/dev/tests/integration/testsuite/Magento/Authorization',
-        '/dev/tests/integration/testsuite/Magento/Framework/Authorization'
-    ],
-    ['/dev/tests/unit/testsuite/Magento/Authorization', '/dev/tests/unit/testsuite/Magento/Framework/Authorization'],
     ['/lib/Magento/Cache', '/lib/Magento/Framework/Cache'],
     ['/dev/tests/integration/testsuite/Magento/Cache', '/dev/tests/integration/testsuite/Magento/Framework/Cache'],
     ['/dev/tests/unit/testsuite/Magento/Cache', '/dev/tests/unit/testsuite/Magento/Framework/Cache'],
diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/words_ce.xml b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/words_ce.xml
index 201c697328587895c65baf019c3ab622689bea82..1abee450ecfb7536e56cff90f3b07166aa543f4c 100644
--- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/words_ce.xml
+++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/words_ce.xml
@@ -51,7 +51,7 @@
             <path>CHANGELOG.md</path>
         </item>
         <item>
-            <path>CHANGELOG_CE.md</path>
+            <path>dev/build/publication/extra_files/ce/CHANGELOG.md</path>
         </item>
         <item>
             <path>app/code/Magento/User/data/user_setup/data-upgrade-1.6.1.1-1.6.1.2.php</path>
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 ef94888aee5b7e61cd3e347ba90e74d78a00e7a8..9db36d76f0a3b6a2ac6ac4e980ec01642d70f040 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
@@ -31,8 +31,6 @@ dev/tests/static/testsuite/Magento/Test/Php/Exemplar/CodeMessTest/phpmd/input
 dev/tests/static/testsuite/Magento/Test/Php/Exemplar/CodeStyleTest/phpcs/input
 dev/tests/static/testsuite/Magento/Test/Php/Exemplar/CodeStyleTest/phpcs/expected
 dev/tests/static/testsuite/Magento/Test/Legacy/_files
-dev/tests/unit/testsuite/Magento/Catalog/Model/Resource/Product/Option/MysqlStub.php
-dev/tests/unit/testsuite/Magento/Catalog/Model/Resource/Product/Option/ValueTest.php
 dev/tests/unit/testsuite/Magento/Core/Model/Resource/Db/AbstractTest.php
 dev/tests/unit/testsuite/Magento/Framework/Session/ConfigTest.php
 dev/tests/unit/testsuite/Magento/Framework/View/TemplateEngine/_files
diff --git a/dev/tests/static/testsuite/Magento/Test/Php/_files/phpcpd/blacklist/common.txt b/dev/tests/static/testsuite/Magento/Test/Php/_files/phpcpd/blacklist/common.txt
index 139b4d8797a2ed9e2738e0fbade3ab5fc7232684..5838cc49d923a273dc07d3771961aaa3e148be76 100644
--- a/dev/tests/static/testsuite/Magento/Test/Php/_files/phpcpd/blacklist/common.txt
+++ b/dev/tests/static/testsuite/Magento/Test/Php/_files/phpcpd/blacklist/common.txt
@@ -43,6 +43,7 @@ Magento/CatalogImportExport/Model/Export
 Magento/CatalogImportExport/Model/Import
 Magento/CatalogRule/Block/Adminhtml/Promo/Catalog/Edit/Tab
 Magento/Checkout/Block/Onepage
+Magento/Checkout/Service/V1/Data/Cart
 Magento/Cms/Block/Adminhtml/Page/Edit
 Magento/Core/Model/Design/Backend
 Magento/Core/Model/Layout/File/Source/Override
@@ -122,4 +123,5 @@ Magento/Dhl/Model
 Magento/Shipping/Model
 Magento/Catalog/Service/V1/Category
 Magento/UrlRedirect/Model
-setup
\ No newline at end of file
+setup
+Magento/Sales/Service/V1/Data
\ No newline at end of file
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 63ed5b003a15bf6696db75fb448d89c7c40d94d4..7edeaf58e05f432d4a421ca232b2221f9870b14b 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
@@ -35,6 +35,7 @@ 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/ConfigurableImportExport
 app/code/Magento/ConfigurableProduct
 app/code/Magento/Core/data
 app/code/Magento/Core/Model/Design.php
@@ -67,6 +68,7 @@ app/code/Magento/Eav/Model/Cache/Type.php
 app/code/Magento/GiftMessage/Model/Plugin
 app/code/Magento/GoogleShopping/Block/SiteVerification.php
 app/code/Magento/GoogleShopping/Model/AttributeFactory.php
+app/code/Magento/GroupedImportExport
 app/code/Magento/GroupedProduct/Service
 app/code/Magento/Eav/Model/Entity/Attribute/Config
 app/code/Magento/Eav/Model/Entity/Attribute/Config.php
@@ -141,4 +143,5 @@ lib/internal/Magento/Framework/Url/SecurityInfoInterface.php
 lib/internal/Magento/Framework/View
 lib/internal/Magento/Framework/App/AbstractShell.php
 lib/internal/Magento/Framework/Locale/Validator.php
+lib/internal/Magento/Framework/Notification
 lib/internal/Magento/Framework/App/Config
diff --git a/dev/tests/unit/framework/Magento/TestFramework/Helper/ObjectManager.php b/dev/tests/unit/framework/Magento/TestFramework/Helper/ObjectManager.php
index 5a2ff33df0f2e597add3c6b5aaccd48aabc5272f..4998f10e590a0c3a380996e139b84cdea2f7c6b3 100644
--- a/dev/tests/unit/framework/Magento/TestFramework/Helper/ObjectManager.php
+++ b/dev/tests/unit/framework/Magento/TestFramework/Helper/ObjectManager.php
@@ -236,7 +236,7 @@ class ObjectManager
             $argClassName = null;
             $defaultValue = null;
 
-            if (isset($arguments[$parameterName])) {
+            if (array_key_exists($parameterName, $arguments)) {
                 $constructArguments[$parameterName] = $arguments[$parameterName];
                 continue;
             }
diff --git a/dev/tests/unit/testsuite/Magento/AdminNotification/Model/System/Message/BaseurlTest.php b/dev/tests/unit/testsuite/Magento/AdminNotification/Model/System/Message/BaseurlTest.php
index 81a55c740fa98aed4faab28c3edd500b454952f5..4caf84c382a9cf5339f79b5f4dc618ad7611a760 100644
--- a/dev/tests/unit/testsuite/Magento/AdminNotification/Model/System/Message/BaseurlTest.php
+++ b/dev/tests/unit/testsuite/Magento/AdminNotification/Model/System/Message/BaseurlTest.php
@@ -119,7 +119,7 @@ class BaseurlTest extends \PHPUnit_Framework_TestCase
     public function testGetSeverity()
     {
         $this->assertEquals(
-            \Magento\AdminNotification\Model\System\MessageInterface::SEVERITY_CRITICAL,
+            \Magento\Framework\Notification\MessageInterface::SEVERITY_CRITICAL,
             $this->_model->getSeverity(),
             'Invalid message severity type'
         );
diff --git a/dev/tests/unit/testsuite/Magento/AdminNotification/Model/System/Message/Media/Synchronization/ErrorTest.php b/dev/tests/unit/testsuite/Magento/AdminNotification/Model/System/Message/Media/Synchronization/ErrorTest.php
index 161e105aaf2572e2228cdecf1cca910156b76d38..d06b97451adfe2a209b3c7e9a0b3bcbb5eca66d6 100644
--- a/dev/tests/unit/testsuite/Magento/AdminNotification/Model/System/Message/Media/Synchronization/ErrorTest.php
+++ b/dev/tests/unit/testsuite/Magento/AdminNotification/Model/System/Message/Media/Synchronization/ErrorTest.php
@@ -104,7 +104,7 @@ class ErrorTest extends \PHPUnit_Framework_TestCase
 
     public function testGetSeverity()
     {
-        $severity = \Magento\AdminNotification\Model\System\MessageInterface::SEVERITY_MAJOR;
+        $severity = \Magento\Framework\Notification\MessageInterface::SEVERITY_MAJOR;
         $this->assertEquals($severity, $this->_model->getSeverity());
     }
 }
diff --git a/dev/tests/unit/testsuite/Magento/AdminNotification/Model/System/Message/Media/Synchronization/SuccessTest.php b/dev/tests/unit/testsuite/Magento/AdminNotification/Model/System/Message/Media/Synchronization/SuccessTest.php
index 610e9e5acd3128b4fec99262e0297f9d005e6554..e685559a543a50365d4674808989cc9c6eae7d7c 100644
--- a/dev/tests/unit/testsuite/Magento/AdminNotification/Model/System/Message/Media/Synchronization/SuccessTest.php
+++ b/dev/tests/unit/testsuite/Magento/AdminNotification/Model/System/Message/Media/Synchronization/SuccessTest.php
@@ -113,7 +113,7 @@ class SuccessTest extends \PHPUnit_Framework_TestCase
 
     public function testGetSeverity()
     {
-        $severity = \Magento\AdminNotification\Model\System\MessageInterface::SEVERITY_MAJOR;
+        $severity = \Magento\Framework\Notification\MessageInterface::SEVERITY_MAJOR;
         $this->assertEquals($severity, $this->_model->getSeverity());
     }
 }
diff --git a/dev/tests/unit/testsuite/Magento/Authorization/Model/Acl/AclRetrieverTest.php b/dev/tests/unit/testsuite/Magento/Authorization/Model/Acl/AclRetrieverTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..a23208ca123b85cc7f3d09b1ab795f19267fd3ae
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Authorization/Model/Acl/AclRetrieverTest.php
@@ -0,0 +1,191 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Authorization\Model\Acl;
+
+use Magento\Authorization\Model\UserContextInterface;
+use Magento\Authorization\Model\Role;
+use Magento\Authorization\Model\Resource\Role\Collection as RoleCollection;
+use Magento\Authorization\Model\Resource\Role\CollectionFactory as RoleCollectionFactory;
+use Magento\Authorization\Model\Resource\Rules\Collection as RulesCollection;
+use Magento\Authorization\Model\Resource\Rules\CollectionFactory as RulesCollectionFactory;
+
+class AclRetrieverTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var AclRetriever
+     */
+    protected $aclRetriever;
+
+    /** @var \PHPUnit_Framework_MockObject_MockObject|Role $roleMock */
+    protected $roleMock;
+
+    protected function setup()
+    {
+        $this->aclRetriever = $this->createAclRetriever();
+    }
+
+    public function testGetAllowedResourcesByUserTypeGuest()
+    {
+        $expectedResources = ['anonymous'];
+        $allowedResources = $this->aclRetriever->getAllowedResourcesByUser(UserContextInterface::USER_TYPE_GUEST, null);
+        $this->assertEquals(
+            $expectedResources,
+            $allowedResources,
+            'Allowed resources for guests should be \'anonymous\'.'
+        );
+    }
+
+    public function testGetAllowedResourcesByUserTypeCustomer()
+    {
+        $expectedResources = ['self'];
+        $allowedResources = $this->aclRetriever->getAllowedResourcesByUser(
+            UserContextInterface::USER_TYPE_CUSTOMER,
+            null
+        );
+        $this->assertEquals(
+            $expectedResources,
+            $allowedResources,
+            'Allowed resources for customers should be \'self\'.'
+        );
+
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\AuthorizationException
+     * @expectedExceptionMessage The role associated with the specified user cannot be found.
+     */
+    public function testGetAllowedResourcesByUserRoleNotFound()
+    {
+        $this->roleMock->expects($this->once())->method('getId')->will($this->returnValue(null));
+        $this->aclRetriever->getAllowedResourcesByUser(UserContextInterface::USER_TYPE_INTEGRATION, null);
+    }
+
+    public function testGetAllowedResourcesByUser()
+    {
+        $this->roleMock->expects($this->any())->method('getId')->will($this->returnValue(1));
+        $expectedResources = ['Magento_Adminhtml::dashboard', 'Magento_Cms::page'];
+        $this->assertEquals(
+            $expectedResources,
+            $this->aclRetriever->getAllowedResourcesByUser(UserContextInterface::USER_TYPE_INTEGRATION, 1)
+        );
+    }
+
+    protected function createAclRetriever()
+    {
+        $this->roleMock = $this->getMock(
+            'Magento\Authorization\Model\Role',
+            array('getId', '__wakeup'),
+            array(),
+            '',
+            false
+        );
+
+        /** @var \PHPUnit_Framework_MockObject_MockObject|RoleCollection $roleCollectionMock */
+        $roleCollectionMock = $this->getMock(
+            'Magento\Authorization\Model\Resource\Role\Collection',
+            array('setUserFilter', 'getFirstItem'),
+            array(),
+            '',
+            false
+        );
+        $roleCollectionMock->expects($this->any())->method('setUserFilter')->will($this->returnSelf());
+        $roleCollectionMock->expects($this->any())->method('getFirstItem')->will($this->returnValue($this->roleMock));
+
+        /** @var \PHPUnit_Framework_MockObject_MockObject|RoleCollectionFactory $roleCollectionFactoryMock */
+        $roleCollectionFactoryMock = $this->getMock(
+            'Magento\Authorization\Model\Resource\Role\CollectionFactory',
+            array('create'),
+            array(),
+            '',
+            false
+        );
+        $roleCollectionFactoryMock->expects($this->any())->method('create')->will(
+            $this->returnValue($roleCollectionMock)
+        );
+
+        /** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Authorization\Model\Rules $rulesMock1 */
+        $rulesMock1 = $this->getMock(
+            'Magento\Authorization\Model\Rules',
+            array('getResourceId', '__wakeup'),
+            array(),
+            '',
+            false
+        );
+        $rulesMock1->expects($this->any())->method('getResourceId')->will(
+            $this->returnValue('Magento_Adminhtml::dashboard')
+        );
+        /** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Authorization\Model\Rules $rulesMock1 */
+        $rulesMock2 = $this->getMock(
+            'Magento\Authorization\Model\Rules',
+            array('getResourceId', '__wakeup'),
+            array(),
+            '',
+            false
+        );
+        $rulesMock2->expects($this->any())->method('getResourceId')->will($this->returnValue('Magento_Cms::page'));
+
+        /** @var \PHPUnit_Framework_MockObject_MockObject|RulesCollection $rulesCollectionMock */
+        $rulesCollectionMock = $this->getMock(
+            'Magento\Authorization\Model\Resource\Rules\Collection',
+            array('getByRoles', 'load', 'getItems'),
+            array(),
+            '',
+            false
+        );
+        $rulesCollectionMock->expects($this->any())->method('getByRoles')->will($this->returnSelf());
+        $rulesCollectionMock->expects($this->any())->method('load')->will($this->returnSelf());
+        $rulesCollectionMock->expects($this->any())->method('getItems')->will(
+            $this->returnValue([$rulesMock1, $rulesMock2])
+        );
+
+        /** @var \PHPUnit_Framework_MockObject_MockObject|RulesCollectionFactory $rulesCollectionFactoryMock */
+        $rulesCollectionFactoryMock = $this->getMock(
+            'Magento\Authorization\Model\Resource\Rules\CollectionFactory',
+            array('create'),
+            array(),
+            '',
+            false
+        );
+        $rulesCollectionFactoryMock->expects($this->any())->method('create')->will(
+            $this->returnValue($rulesCollectionMock)
+        );
+
+        /** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Acl $aclMock */
+        $aclMock = $this->getMock('Magento\Framework\Acl', array('has', 'isAllowed'), array(), '', false);
+        $aclMock->expects($this->any())->method('has')->will($this->returnValue(true));
+        $aclMock->expects($this->any())->method('isAllowed')->will($this->returnValue(true));
+
+        /** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Acl\Builder $aclBuilderMock */
+        $aclBuilderMock = $this->getMock('Magento\Framework\Acl\Builder', array('getAcl'), array(), '', false);
+        $aclBuilderMock->expects($this->any())->method('getAcl')->will($this->returnValue($aclMock));
+
+        return new AclRetriever(
+            $aclBuilderMock,
+            $roleCollectionFactoryMock,
+            $rulesCollectionFactoryMock,
+            $this->getMock('Magento\Framework\Logger', array(), array(), '', false)
+        );
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/User/Model/Acl/Loader/RoleTest.php b/dev/tests/unit/testsuite/Magento/Authorization/Model/Acl/Loader/RoleTest.php
similarity index 92%
rename from dev/tests/unit/testsuite/Magento/User/Model/Acl/Loader/RoleTest.php
rename to dev/tests/unit/testsuite/Magento/Authorization/Model/Acl/Loader/RoleTest.php
index 0edc5b235babd7ae5f3cfbf9b1caac299266c6d3..dc86153dd9feb2ab4724ace616594ae2590fb194 100644
--- a/dev/tests/unit/testsuite/Magento/User/Model/Acl/Loader/RoleTest.php
+++ b/dev/tests/unit/testsuite/Magento/Authorization/Model/Acl/Loader/RoleTest.php
@@ -21,12 +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\User\Model\Acl\Loader;
+namespace Magento\Authorization\Model\Acl\Loader;
 
 class RoleTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \Magento\User\Model\Acl\Loader\Role
+     * @var \Magento\Authorization\Model\Acl\Loader\Role
      */
     protected $_model;
 
@@ -54,14 +54,14 @@ class RoleTest extends \PHPUnit_Framework_TestCase
     {
         $this->_resourceMock = $this->getMock('Magento\Framework\App\Resource', array(), array(), '', false, false);
         $this->_groupFactoryMock = $this->getMock(
-            'Magento\User\Model\Acl\Role\GroupFactory',
+            'Magento\Authorization\Model\Acl\Role\GroupFactory',
             array('create'),
             array(),
             '',
             false
         );
         $this->_roleFactoryMock = $this->getMock(
-            'Magento\User\Model\Acl\Role\UserFactory',
+            'Magento\Authorization\Model\Acl\Role\UserFactory',
             array('create'),
             array(),
             '',
@@ -73,7 +73,7 @@ class RoleTest extends \PHPUnit_Framework_TestCase
         )->method(
             'getTableName'
         )->with(
-            $this->equalTo('admin_role')
+            $this->equalTo('authorization_role')
         )->will(
             $this->returnArgument(1)
         );
@@ -93,7 +93,7 @@ class RoleTest extends \PHPUnit_Framework_TestCase
             $this->returnValue($this->_adapterMock)
         );
 
-        $this->_model = new \Magento\User\Model\Acl\Loader\Role(
+        $this->_model = new \Magento\Authorization\Model\Acl\Loader\Role(
             $this->_groupFactoryMock,
             $this->_roleFactoryMock,
             $this->_resourceMock
diff --git a/dev/tests/unit/testsuite/Magento/User/Model/Acl/Loader/RuleTest.php b/dev/tests/unit/testsuite/Magento/Authorization/Model/Acl/Loader/RuleTest.php
similarity index 92%
rename from dev/tests/unit/testsuite/Magento/User/Model/Acl/Loader/RuleTest.php
rename to dev/tests/unit/testsuite/Magento/Authorization/Model/Acl/Loader/RuleTest.php
index e592d04d4ce18e2d258bebc7c05720c5d7adb01c..46f6bdbbb42d77128ee1ee77b82dfa5d25679017 100644
--- a/dev/tests/unit/testsuite/Magento/User/Model/Acl/Loader/RuleTest.php
+++ b/dev/tests/unit/testsuite/Magento/Authorization/Model/Acl/Loader/RuleTest.php
@@ -21,12 +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\User\Model\Acl\Loader;
+namespace Magento\Authorization\Model\Acl\Loader;
 
 class RuleTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \Magento\User\Model\Acl\Loader\Rule
+     * @var \Magento\Authorization\Model\Acl\Loader\Rule
      */
     protected $_model;
 
@@ -44,7 +44,10 @@ class RuleTest extends \PHPUnit_Framework_TestCase
     {
         $this->_resourceMock = $this->getMock('Magento\Framework\App\Resource', array(), array(), '', false, false);
         $this->_rootResourceMock = new \Magento\Framework\Acl\RootResource('Magento_Adminhtml::all');
-        $this->_model = new \Magento\User\Model\Acl\Loader\Rule($this->_rootResourceMock, $this->_resourceMock);
+        $this->_model = new \Magento\Authorization\Model\Acl\Loader\Rule(
+            $this->_rootResourceMock,
+            $this->_resourceMock
+        );
     }
 
     public function testPopulateAcl()
diff --git a/dev/tests/unit/testsuite/Magento/Authorization/Model/CompositeUserContextTest.php b/dev/tests/unit/testsuite/Magento/Authorization/Model/CompositeUserContextTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..2033b7d3282aa22949a2180c45f78e03772350a5
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Authorization/Model/CompositeUserContextTest.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\Authorization\Model;
+
+class CompositeUserContextTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var CompositeUserContext
+     */
+    protected $_model;
+
+    protected function setUp()
+    {
+        $this->_model = new CompositeUserContext();
+    }
+
+    public function testConstructor()
+    {
+        $userContextMock = $this->createUserContextMock();
+        $contexts = [
+            [
+                'sortOrder' => 10,
+                'type' => $userContextMock
+            ]
+        ];
+        $model = new CompositeUserContext($contexts);
+        $this->verifyUserContextIsAdded($model, $userContextMock);
+    }
+
+    public function testGetUserId()
+    {
+        $expectedUserId = 1;
+        $expectedUserType = 'Customer';
+        $userContextMock = $this->getMockBuilder('Magento\Authorization\Model\CompositeUserContext')
+            ->disableOriginalConstructor()->setMethods(['getUserId', 'getUserType'])->getMock();
+        $userContextMock->expects($this->any())->method('getUserId')->will($this->returnValue($expectedUserId));
+        $userContextMock->expects($this->any())->method('getUserType')->will($this->returnValue($expectedUserType));
+        $contexts = [
+            [
+                'sortOrder' => 10,
+                'type' => $userContextMock
+            ]
+        ];
+        $this->_model = new CompositeUserContext($contexts);
+        $actualUserId = $this->_model->getUserId();
+        $this->assertEquals($expectedUserId, $actualUserId, 'User ID is defined incorrectly.');
+    }
+
+    public function testGetUserType()
+    {
+        $expectedUserId = 1;
+        $expectedUserType = 'Customer';
+        $userContextMock = $this->getMockBuilder('Magento\Authorization\Model\CompositeUserContext')
+            ->disableOriginalConstructor()->setMethods(['getUserId', 'getUserType'])->getMock();
+        $userContextMock->expects($this->any())->method('getUserId')->will($this->returnValue($expectedUserId));
+        $userContextMock->expects($this->any())->method('getUserType')->will($this->returnValue($expectedUserType));
+        $contexts = [
+            [
+                'sortOrder' => 10,
+                'type' => $userContextMock
+            ]
+        ];
+        $this->_model = new CompositeUserContext($contexts);
+        $actualUserType = $this->_model->getUserType();
+        $this->assertEquals($expectedUserType, $actualUserType, 'User Type is defined incorrectly.');
+    }
+
+    public function testUserContextCaching()
+    {
+        $expectedUserId = 1;
+        $expectedUserType = 'Customer';
+        $userContextMock = $this->getMockBuilder('Magento\Authorization\Model\CompositeUserContext')
+            ->disableOriginalConstructor()->setMethods(['getUserId', 'getUserType'])->getMock();
+        $userContextMock->expects($this->exactly(3))->method('getUserType')
+            ->will($this->returnValue($expectedUserType));
+        $userContextMock->expects($this->exactly(3))->method('getUserId')
+            ->will($this->returnValue($expectedUserId));
+        $contexts = [
+            [
+                'sortOrder' => 10,
+                'type' => $userContextMock
+            ]
+        ];
+        $this->_model = new CompositeUserContext($contexts);
+        $this->_model->getUserId();
+        $this->_model->getUserId();
+        $this->_model->getUserType();
+        $this->_model->getUserType();
+    }
+
+    public function testEmptyUserContext()
+    {
+        $expectedUserId = null;
+        $userContextMock = $this->getMockBuilder('Magento\Authorization\Model\CompositeUserContext')
+            ->disableOriginalConstructor()->setMethods(['getUserId'])->getMock();
+        $userContextMock->expects($this->any())->method('getUserId')
+            ->will($this->returnValue($expectedUserId));
+        $contexts = [
+            [
+                'sortOrder' => 10,
+                'type' => $userContextMock
+            ]
+        ];
+        $this->_model = new CompositeUserContext($contexts);
+        $actualUserId = $this->_model->getUserId();
+        $this->assertEquals($expectedUserId, $actualUserId, 'User ID is defined incorrectly.');
+    }
+
+    public function testUserContextOrder()
+    {
+        $expectedUserId = null;
+        $userContextMock1 = $this->getMockBuilder('Magento\Authorization\Model\CompositeUserContext')
+            ->disableOriginalConstructor()->setMethods(['getUserType'])->getMock();
+        $userContextMock1->expects($this->once())->method('getUserType')->will($this->returnValue(null));
+
+        $userContextMock2 = $this->getMockBuilder('Magento\Authorization\Model\CompositeUserContext')
+            ->disableOriginalConstructor()->setMethods(['getUserType'])->getMock();
+        $userContextMock2->expects($this->once())->method('getUserType')->will($this->returnValue(null));
+
+        $expectedUserType = 'Customer';
+        $expectedUserId = 1234;
+        $userContextMock3 = $this->getMockBuilder('Magento\Authorization\Model\CompositeUserContext')
+            ->disableOriginalConstructor()->setMethods(['getUserType', 'getUserId'])->getMock();
+        $userContextMock3->expects($this->once())->method('getUserType')->will($this->returnValue($expectedUserType));
+        $userContextMock3->expects($this->exactly(2))->method('getUserId')->will($this->returnValue($expectedUserId));
+
+        $contexts = [
+            [
+                'sortOrder' => 20,
+                'type' => $userContextMock1
+            ],
+            [
+                'sortOrder' => 30,
+                'type' => $userContextMock3,
+            ],
+            [
+                'sortOrder' => 10,
+                'type' => $userContextMock2
+            ],
+        ];
+        $this->_model = new CompositeUserContext($contexts);
+        $actualUserId = $this->_model->getUserId();
+        $this->assertEquals($expectedUserId, $actualUserId, 'User ID is defined incorrectly.');
+    }
+
+    /**
+     * @param int|null $userId
+     * @param string|null $userType
+     * @return \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected function createUserContextMock($userId = null, $userType = null)
+    {
+        $useContextMock = $this->getMockBuilder('Magento\Authorization\Model\CompositeUserContext')
+            ->disableOriginalConstructor()->setMethods(['getUserId', 'getUserType'])->getMock();
+        if (!is_null($userId) && !is_null($userType)) {
+            $useContextMock->expects($this->any())->method('getUserId')->will($this->returnValue($userId));
+            $useContextMock->expects($this->any())->method('getUserType')->will($this->returnValue($userType));
+        }
+        return $useContextMock;
+    }
+
+    /**
+     * @param CompositeUserContext $model
+     * @param CompositeUserContext $userContextMock
+     */
+    protected function verifyUserContextIsAdded($model, $userContextMock)
+    {
+        $userContext = new \ReflectionProperty(
+            'Magento\Authorization\Model\CompositeUserContext',
+            'userContexts'
+        );
+        $userContext->setAccessible(true);
+        $values = $userContext->getValue($model);
+        $this->assertCount(1, $values, 'User context is not registered.');
+        $this->assertEquals($userContextMock, $values[0], 'User context is registered incorrectly.');
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Authorizenet/Helper/DataTest.php b/dev/tests/unit/testsuite/Magento/Authorizenet/Helper/DataTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..3a168e9a37ff5f03b4d74418cfa1b1b843427511
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Authorizenet/Helper/DataTest.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\Authorizenet\Helper;
+
+class DataTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * Last 4 digit of cc
+     */
+    const LAST4 = 1111;
+
+    /**
+     * Transaction ID
+     */
+    const TRID = '2217041665';
+
+    /**
+     * @var Data
+     */
+    protected $_model;
+
+    protected function setUp()
+    {
+        $helper = new \Magento\TestFramework\Helper\ObjectManager($this);
+        $this->_model = $helper->getObject('Magento\Authorizenet\Helper\Data');
+    }
+
+    /**
+     * @param $type
+     * @param $amount
+     * @param $exception
+     * @param $additionalMessage
+     * @param $expected
+     * @dataProvider getMessagesParamDataProvider
+     */
+    public function testGetTransactionMessage($type, $amount, $exception, $additionalMessage, $expected)
+    {
+        $currency = $this->getMock('Magento\Directory\Model\Currency', ['formatTxt', '__wakeup'], [], '', false);
+        $currency->expects($this->any())
+            ->method('formatTxt')
+            ->will($this->returnValue($amount));
+        $order = $this->getMock('Magento\Sales\Model\Order', ['getBaseCurrency', '__wakeup'], [], '', false);
+        $order->expects($this->any())
+            ->method('getBaseCurrency')
+            ->will($this->returnValue($currency));
+        $payment = $this->getMock('Magento\Payment\Model\Info', ['getOrder', '__wakeup'], [], '', false);
+        $payment->expects($this->any())
+            ->method('getOrder')
+            ->will($this->returnValue($order));
+        $card = new \Magento\Framework\Object(['cc_last4' => self::LAST4]);
+        $message = $this->_model->getTransactionMessage(
+            $payment,
+            $type,
+            self::TRID,
+            $card,
+            $amount,
+            $exception,
+            $additionalMessage
+        );
+
+        $this->assertEquals($expected, $message);
+    }
+
+    /**
+     * @return array
+     */
+    public function getMessagesParamDataProvider()
+    {
+        $amount = 12.30;
+        $additionalMessage = 'Addition message.';
+        return [
+            [
+                'AUTH_ONLY',
+                $amount,
+                false,
+                $additionalMessage,
+                'Credit Card: xxxx-' . self::LAST4 . ' amount 12.3 authorize - successful. '
+                . 'Authorize.Net Transaction ID ' . self::TRID . '. Addition message.'
+            ],
+            [
+                'AUTH_CAPTURE',
+                $amount,
+                'some exception',
+                false,
+                'Credit Card: xxxx-' . self::LAST4 . ' amount 12.3 authorize and capture - failed. '
+                . 'Authorize.Net Transaction ID ' . self::TRID . '. some exception'
+            ],
+            [
+                'CREDIT',
+                false,
+                false,
+                $additionalMessage,
+                'Credit Card: xxxx-' . self::LAST4 . ' refund - successful. '
+                . 'Authorize.Net Transaction ID ' . self::TRID . '. Addition message.'
+            ],
+        ];
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Authz/Model/UserIdentifierTest.php b/dev/tests/unit/testsuite/Magento/Authz/Model/UserIdentifierTest.php
deleted file mode 100644
index 0feffb0843827f3f4c03bd577a73d238e9457e25..0000000000000000000000000000000000000000
--- a/dev/tests/unit/testsuite/Magento/Authz/Model/UserIdentifierTest.php
+++ /dev/null
@@ -1,92 +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\Authz\Model;
-
-use Magento\Authz\Model\UserIdentifier;
-
-/**
- * Tests for User identifier.
- */
-class UserIdentifierTest extends \PHPUnit_Framework_TestCase
-{
-    /** @var \PHPUnit_Framework_MockObject_MockObject */
-    protected $_userLocatorMock;
-
-    protected function setUp()
-    {
-        parent::setUp();
-        $this->_userLocatorMock = $this->getMock(
-            'Magento\Authz\Model\UserLocatorInterface',
-            array('getUserId', 'getUserType')
-        );
-    }
-
-    /**
-     * @param string $userType
-     * @param int $userId
-     * @dataProvider constructProvider
-     */
-    public function testConstruct($userType, $userId)
-    {
-        $context = new UserIdentifier($this->_userLocatorMock, $userType, $userId);
-        $this->assertEquals($userId, $context->getUserId());
-        $this->assertEquals($userType, $context->getUserType());
-    }
-
-    /**
-     * @param string $userType
-     * @param int $userId
-     * @param string $exceptionMessage
-     * @dataProvider constructProviderInvalidData
-     */
-    public function testConstructInvalidData($userType, $userId, $exceptionMessage)
-    {
-        $this->setExpectedException('\LogicException', $exceptionMessage);
-        new UserIdentifier($this->_userLocatorMock, $userType, $userId);
-    }
-
-    public function constructProvider()
-    {
-        return array(
-            array(UserIdentifier::USER_TYPE_GUEST, 0),
-            array(UserIdentifier::USER_TYPE_CUSTOMER, 1),
-            array(UserIdentifier::USER_TYPE_ADMIN, 2),
-            array(UserIdentifier::USER_TYPE_INTEGRATION, 3)
-        );
-    }
-
-    public function constructProviderInvalidData()
-    {
-        return array(
-            array(
-                'InvalidUserType',
-                1,
-                'Invalid user type: \'InvalidUserType\'. Allowed types: Guest, Customer, Admin, Integration'
-            ),
-            array(UserIdentifier::USER_TYPE_CUSTOMER, -1, 'Invalid user ID: \'-1\''),
-            array(UserIdentifier::USER_TYPE_ADMIN, 'InvalidUserId', 'Invalid user ID: \'InvalidUserId\''),
-            array(UserIdentifier::USER_TYPE_GUEST, 3, 'Guest user must not have user ID set.')
-        );
-    }
-}
diff --git a/dev/tests/unit/testsuite/Magento/Authz/Service/AuthorizationV1Test.php b/dev/tests/unit/testsuite/Magento/Authz/Service/AuthorizationV1Test.php
deleted file mode 100644
index 6a6ed9da8dc56a2ad5ee9587a8ee05f97e1cc191..0000000000000000000000000000000000000000
--- a/dev/tests/unit/testsuite/Magento/Authz/Service/AuthorizationV1Test.php
+++ /dev/null
@@ -1,91 +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\Authz\Service;
-
-use Magento\Authz\Model\UserIdentifier;
-use Magento\User\Model\Role;
-
-class AuthorizationV1Test extends \PHPUnit_Framework_TestCase
-{
-    /** @var AuthorizationV1 */
-    protected $_authzService;
-
-    protected function setUp()
-    {
-        /** @var \PHPUnit_Framework_MockObject_MockObject|Role $roleMock */
-        $roleMock = $this->getMock('Magento\User\Model\Role', array('load', 'delete', '__wakeup'), array(), '', false);
-        $roleMock->expects($this->any())->method('load')->will($this->returnSelf());
-        $roleMock->expects($this->any())->method('delete')->will($this->returnSelf());
-
-        /** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\User\Model\RoleFactory $roleFactoryMock */
-        $roleFactoryMock = $this->getMock('Magento\User\Model\RoleFactory', array('create'), array(), '', false);
-        $roleFactoryMock->expects($this->any())->method('create')->will($this->returnValue($roleMock));
-
-        $this->_authzService = new AuthorizationV1(
-            $this->getMock('Magento\Framework\Acl\Builder', array(), array(), '', false),
-            $this->getMock('Magento\Authz\Model\UserIdentifier', array(), array(), '', false),
-            $roleFactoryMock,
-            $this->getMock('Magento\User\Model\Resource\Role\CollectionFactory', array(), array(), '', false),
-            $this->getMock('Magento\User\Model\RulesFactory', array(), array(), '', false),
-            $this->getMock('Magento\User\Model\Resource\Rules\CollectionFactory', array(), array(), '', false),
-            $this->getMock('Magento\Framework\Logger', array(), array(), '', false),
-            $this->getMock('Magento\Framework\Acl\RootResource', array(), array(), '', false)
-        );
-    }
-
-    public function testRemovePermissions()
-    {
-        $this->_authzService->removePermissions($this->_getUserIdentifierMock(UserIdentifier::USER_TYPE_INTEGRATION));
-    }
-
-    /**
-     * @expectedException \Magento\Framework\Exception\NoSuchEntityException
-     * @expectedExceptionMessage No such entity with userType = Admin
-     */
-    public function testRemovePermissionsException()
-    {
-        // Wrong user identifier type
-        $this->_authzService->removePermissions($this->_getUserIdentifierMock(UserIdentifier::USER_TYPE_ADMIN));
-    }
-
-    /**
-     * @param string $getUserTypeValue
-     * @return UserIdentifier|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected function _getUserIdentifierMock($getUserTypeValue)
-    {
-        /** @var UserIdentifier|\PHPUnit_Framework_MockObject_MockObject  $userIdentiferMock */
-        $userIdentiferMock = $this->getMock(
-            'Magento\Authz\Model\UserIdentifier',
-            array('getUserType', 'getUserId'),
-            array(),
-            '',
-            false
-        );
-
-        $userIdentiferMock->expects($this->any())->method('getUserType')->will($this->returnValue($getUserTypeValue));
-
-        return $userIdentiferMock;
-    }
-}
diff --git a/dev/tests/unit/testsuite/Magento/Backend/Model/SessionTest.php b/dev/tests/unit/testsuite/Magento/Backend/Model/SessionTest.php
index 2e4218d795f3166ccfc83135003dc80ba9c7b024..00a936d0dce643b1b6f3028010c9c21212fd6f0e 100644
--- a/dev/tests/unit/testsuite/Magento/Backend/Model/SessionTest.php
+++ b/dev/tests/unit/testsuite/Magento/Backend/Model/SessionTest.php
@@ -42,7 +42,7 @@ class SessionTest extends \PHPUnit_Framework_TestCase
     public function testConstructor()
     {
         $helper = new \Magento\TestFramework\Helper\ObjectManager($this);
-        include __DIR__ . '/_files/session_backend_mock.php';
+        require_once __DIR__ . '/../../_files/session_backend_mock.php';
         $requestMock = $helper->getObject('Magento\Framework\App\Request\Http');
         $helper->getObject('Magento\Backend\Model\Session', array('request' => $requestMock));
         $this->assertTrue(self::$sessionStart);
diff --git a/dev/tests/unit/testsuite/Magento/Bundle/Model/Plugin/PriceBackendTest.php b/dev/tests/unit/testsuite/Magento/Bundle/Model/Plugin/PriceBackendTest.php
index 6f306983a2d7786d3e70c4c3303872c919a4a90a..ee66c981ddf4004a4cb1c1eaff78eb502949f924 100644
--- a/dev/tests/unit/testsuite/Magento/Bundle/Model/Plugin/PriceBackendTest.php
+++ b/dev/tests/unit/testsuite/Magento/Bundle/Model/Plugin/PriceBackendTest.php
@@ -24,7 +24,6 @@
 
 namespace Magento\Bundle\Model\Plugin;
 
-
 use Magento\Bundle\Model\Product\Price;
 use Magento\Catalog\Model\Product\Type;
 use Magento\TestFramework\Helper\ObjectManager;
diff --git a/dev/tests/unit/testsuite/Magento/Bundle/Service/V1/Product/Link/WriteServiceTest.php b/dev/tests/unit/testsuite/Magento/Bundle/Service/V1/Product/Link/WriteServiceTest.php
index 58dcca446fcb9496cdde0b302aff52b3a4e607c2..5b8e693b8bd1ff04cc70004372a71284c2f35af6 100644
--- a/dev/tests/unit/testsuite/Magento/Bundle/Service/V1/Product/Link/WriteServiceTest.php
+++ b/dev/tests/unit/testsuite/Magento/Bundle/Service/V1/Product/Link/WriteServiceTest.php
@@ -521,6 +521,7 @@ class WriteServiceTest extends \PHPUnit_Framework_TestCase
 
         $bundle->expects($this->once())->method('dropAllUnneededSelections')->with(3, array());
         $bundle->expects($this->once())->method('saveProductRelations')->with(3, array());
+        //Params come in lowercase to method
         $this->assertTrue($this->service->removeChild($productSku, $optionId, $childSku));
     }
 
diff --git a/dev/tests/unit/testsuite/Magento/Bundle/Service/V1/Product/Option/ReadServiceTest.php b/dev/tests/unit/testsuite/Magento/Bundle/Service/V1/Product/Option/ReadServiceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..0a6a3a975d17766e99bab9e7b915313406b356e9
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Bundle/Service/V1/Product/Option/ReadServiceTest.php
@@ -0,0 +1,217 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Bundle\Service\V1\Product\Option;
+
+use Magento\TestFramework\Helper\ObjectManager;
+
+class ReadServiceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Bundle\Service\V1\Product\Option\ReadService
+     */
+    private $model;
+
+    /**
+     * @var \Magento\Catalog\Model\ProductRepository|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $productRepository;
+
+    /**
+     * @var \Magento\Bundle\Service\V1\Data\Product\OptionConverter|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $optionConverter;
+
+    /**
+     * @var \Magento\Bundle\Model\Product\Type|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $productType;
+
+    /**
+     * @var \Magento\Catalog\Model\Product|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $product;
+
+    /**
+     * @var \Magento\Bundle\Model\Option|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $optionModel;
+
+    /**
+     * @var \Magento\Bundle\Service\V1\Data\Product\Option|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $option;
+
+    /**
+     * @var \Magento\Bundle\Model\Resource\Option\Collection|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $optionCollection;
+
+    public function setUp()
+    {
+        $objectManager = new ObjectManager($this);
+
+        $this->productRepository = $this->getMockBuilder('Magento\Catalog\Model\ProductRepository')
+            ->setMethods(['get'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->productType = $this->getMockBuilder('Magento\Bundle\Model\Product\Type')
+            ->setMethods(['getOptionsCollection'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->product = $this->getMockBuilder('Magento\Catalog\Model\Product')
+            ->setMethods(['__wakeup', 'getTypeId', 'getTypeInstance'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->optionModel = $this->getMockBuilder('Magento\Bundle\Model\Option')
+            ->setMethods(['__wakeup', 'getId'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->optionCollection = $this->getMockBuilder('Magento\Bundle\Model\Resource\Option\Collection')
+            ->setMethods(['setIdFilter', 'getFirstItem'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->optionConverter = $this->getMockBuilder('\Magento\Bundle\Service\V1\Data\Product\OptionConverter')
+            ->setMethods(['createDataFromModel'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->option = $this->getMockBuilder('Magento\Bundle\Service\V1\Data\Product\Option')
+            ->setMethods(['getId'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->model = $objectManager->getObject(
+            'Magento\Bundle\Service\V1\Product\Option\ReadService',
+            [
+                'optionConverter' => $this->optionConverter,
+                'productRepository' => $this->productRepository,
+                'type' => $this->productType
+            ]
+        );
+    }
+
+    public function testGet()
+    {
+        $productSku = 'oneSku';
+        $optionId = 3;
+
+        $this->productRepository->expects($this->once())->method('get')
+            ->with($this->equalTo($productSku))
+            ->will($this->returnValue($this->product));
+
+        $this->product->expects($this->once())->method('getTypeId')
+            ->will($this->returnValue(\Magento\Catalog\Model\Product\Type::TYPE_BUNDLE));
+
+        $this->optionCollection->expects($this->once())->method('setIdFilter')
+            ->with($this->equalTo($optionId));
+        $this->optionCollection->expects($this->once())->method('getFirstItem')
+            ->will($this->returnValue($this->optionModel));
+
+        $this->productType->expects($this->once())->method('getOptionsCollection')
+            ->with($this->equalTo($this->product))
+            ->will($this->returnValue($this->optionCollection));
+
+        $this->optionConverter->expects($this->once())->method('createDataFromModel')
+            ->with($this->equalTo($this->optionModel), $this->equalTo($this->product))
+            ->will($this->returnValue($this->option));
+
+        $this->optionModel->expects($this->once())->method('getId')->will($this->returnValue($optionId));
+
+        $this->assertEquals($this->option, $this->model->get($productSku, $optionId));
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\NoSuchEntityException
+     */
+    public function testGetNoSuchEntityException()
+    {
+        $productSku = 'oneSku';
+        $optionId = 3;
+
+        $this->productRepository->expects($this->once())->method('get')
+            ->with($this->equalTo($productSku))
+            ->will($this->returnValue($this->product));
+
+        $this->product->expects($this->once())->method('getTypeId')
+            ->will($this->returnValue(\Magento\Catalog\Model\Product\Type::TYPE_BUNDLE));
+
+        $this->optionCollection->expects($this->once())->method('setIdFilter')
+            ->with($this->equalTo($optionId));
+        $this->optionCollection->expects($this->once())->method('getFirstItem')
+            ->will($this->returnValue($this->optionModel));
+
+        $this->productType->expects($this->once())->method('getOptionsCollection')
+            ->with($this->equalTo($this->product))
+            ->will($this->returnValue($this->optionCollection));
+
+        $this->optionModel->expects($this->once())->method('getId');
+
+        $this->model->get($productSku, $optionId);
+    }
+
+    public function testGetList()
+    {
+        $productSku = 'oneSku';
+
+        $this->productRepository->expects($this->once())->method('get')
+            ->with($this->equalTo($productSku))
+            ->will($this->returnValue($this->product));
+
+        $this->product->expects($this->once())->method('getTypeId')
+            ->will($this->returnValue(\Magento\Catalog\Model\Product\Type::TYPE_BUNDLE));
+
+        $this->productType->expects($this->once())->method('getOptionsCollection')
+            ->with($this->equalTo($this->product))
+            ->will($this->returnValue([$this->optionModel]));
+
+        $this->optionConverter->expects($this->once())->method('createDataFromModel')
+            ->with($this->equalTo($this->optionModel), $this->equalTo($this->product))
+            ->will($this->returnValue($this->option));
+
+        $this->assertEquals([$this->option], $this->model->getList($productSku));
+    }
+
+    /**
+     * @expectedException \Magento\Webapi\Exception
+     * @expectedExceptionCode 403
+     */
+    public function testGetListWebApiException()
+    {
+        $productSku = 'oneSku';
+
+        $this->productRepository->expects($this->once())->method('get')
+            ->with($this->equalTo($productSku))
+            ->will($this->returnValue($this->product));
+
+        $this->product->expects($this->once())->method('getTypeId')
+            ->will($this->returnValue(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE));
+
+        $this->model->getList($productSku);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Bundle/Service/V1/Product/Option/Type/ReadServiceTest.php b/dev/tests/unit/testsuite/Magento/Bundle/Service/V1/Product/Option/Type/ReadServiceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..eef50926fb96cafe500e6ac823520ccfe1af1908
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Bundle/Service/V1/Product/Option/Type/ReadServiceTest.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\Bundle\Service\V1\Product\Option\Type;
+
+use Magento\TestFramework\Helper\ObjectManager;
+use Magento\Bundle\Service\V1\Data\Product\Option\Type;
+
+class ReadServiceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Bundle\Service\V1\Product\Option\Type\ReadService
+     */
+    private $model;
+
+    /**
+     * @var \Magento\Bundle\Model\Source\Option\Type|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $typeModel;
+
+    /**
+     * @var \Magento\Bundle\Service\V1\Data\Product\Option\TypeConverter|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $typeConverter;
+
+    /**
+     * @var \Magento\Bundle\Service\V1\Data\Product\Option\Type|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $type;
+
+    public function setUp()
+    {
+        $objectManager = new ObjectManager($this);
+
+        $this->typeModel = $this->getMockBuilder('Magento\Bundle\Model\Source\Option\Type')
+            ->setMethods(['toOptionArray'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->typeConverter = $this->getMockBuilder('Magento\Bundle\Service\V1\Data\Product\Option\TypeConverter')
+            ->setMethods(['createDataFromModel'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->type = $this->getMockBuilder('Magento\Bundle\Service\V1\Data\Product\Option\Type')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->model = $objectManager->getObject(
+            'Magento\Bundle\Service\V1\Product\Option\Type\ReadService',
+            ['type' => $this->typeModel, 'typeConverter' => $this->typeConverter]
+        );
+    }
+
+    public function testGetTypes()
+    {
+        $label = 'someLabel';
+        $value = 'someValue';
+        $this->typeModel->expects($this->once())->method('toOptionArray')
+            ->will($this->returnValue([['label' => $label, 'value' => $value]]));
+
+        $this->typeConverter->expects($this->once())->method('createDataFromModel')
+            ->will($this->returnValue($this->type));
+
+        $this->assertEquals([$this->type], $this->model->getTypes());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Bundle/Service/V1/Product/Option/WriteServiceTest.php b/dev/tests/unit/testsuite/Magento/Bundle/Service/V1/Product/Option/WriteServiceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..c772618a8127be5143fa4704252229ed91fdad0a
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Bundle/Service/V1/Product/Option/WriteServiceTest.php
@@ -0,0 +1,393 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Bundle\Service\V1\Product\Option;
+
+use Magento\TestFramework\Helper\ObjectManager;
+
+/**
+ * Class WriteServiceTest
+ *
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
+class WriteServiceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Bundle\Service\V1\Product\Option\WriteService
+     */
+    private $model;
+
+    /**
+     * @var \Magento\Catalog\Model\ProductRepository|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $productRepository;
+
+    /**
+     * @var \Magento\Bundle\Service\V1\Data\Product\OptionConverter|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $optionConverter;
+
+    /**
+     * @var \Magento\Store\Model\StoreManager|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $storeManager;
+
+    /**
+     * @var \Magento\Bundle\Model\Product\Type|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $productType;
+
+    /**
+     * @var \Magento\Catalog\Model\Product|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $product;
+
+    /**
+     * @var \Magento\Bundle\Model\Option|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $optionModel;
+
+    /**
+     * @var \Magento\Bundle\Service\V1\Data\Product\Option|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $option;
+
+    /**
+     * @var \Magento\Store\Model\Store|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $store;
+
+    /**
+     * @var \Magento\Bundle\Model\Resource\Option\Collection|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $optionCollection;
+
+    public function setUp()
+    {
+        $objectManager = new ObjectManager($this);
+
+        $this->productRepository = $this->getMockBuilder('Magento\Catalog\Model\ProductRepository')
+            ->setMethods(['get'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->store = $this->getMockBuilder('Magento\Store\Model\Store')
+            ->setMethods(['getId', '__wakeup'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->storeManager = $this->getMockBuilder('Magento\Store\Model\StoreManager')
+            ->setMethods(['getStore'])
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->storeManager->expects($this->any())->method('getStore')->will($this->returnValue($this->store));
+
+        $this->optionConverter = $this->getMockBuilder('Magento\Bundle\Service\V1\Data\Product\OptionConverter')
+            ->setMethods(['createModelFromData', 'createDataFromModel', 'getModelFromData'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->productType = $this->getMockBuilder('Magento\Bundle\Model\Product\Type')
+            ->setMethods(['getOptionsCollection'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->option = $this->getMockBuilder('Magento\Bundle\Service\V1\Data\Product\Option')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->product = $this->getMockBuilder('Magento\Catalog\Model\Product')
+            ->setMethods(['__wakeup', 'getTypeId', 'getSku'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->optionModel = $this->getMockBuilder('Magento\Bundle\Model\Option')
+            ->setMethods(['__wakeup', 'getId', 'delete', 'setStoreId', 'save'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->optionCollection = $this->getMockBuilder('Magento\Bundle\Model\Resource\Option\Collection')
+            ->setMethods(['setIdFilter', 'getFirstItem'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->model = $objectManager->getObject(
+            'Magento\Bundle\Service\V1\Product\Option\WriteService',
+            [
+                'productRepository' => $this->productRepository,
+                'type' => $this->productType,
+                'storeManager' => $this->storeManager,
+                'optionConverter' => $this->optionConverter
+            ]
+        );
+    }
+
+    public function testAdd()
+    {
+        $productSku = 'oneSku';
+        $optionId = 33;
+
+        $this->productRepository->expects($this->once())->method('get')
+            ->with($this->equalTo($productSku))
+            ->will($this->returnValue($this->product));
+
+        $this->product->expects($this->once())->method('getTypeId')
+            ->will($this->returnValue(\Magento\Catalog\Model\Product\Type::TYPE_BUNDLE));
+
+        $storeId = 1;
+        $this->store->expects($this->once())->method('getId')->will($this->returnValue($storeId));
+
+        $this->optionModel->expects($this->once())->method('setStoreId')->with($this->equalTo($storeId));
+        $this->optionModel->expects($this->once())->method('save');
+
+        $this->optionConverter->expects($this->once())->method('createModelFromData')
+            ->with($this->equalTo($this->option), $this->equalTo($this->product))
+            ->will($this->returnValue($this->optionModel));
+        $this->optionModel->expects($this->once())->method('getId')
+            ->will($this->returnValue($optionId));
+
+        $this->assertEquals($optionId, $this->model->add($productSku, $this->option));
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\CouldNotSaveException
+     */
+    public function testAddCouldNotSaveException()
+    {
+        $productSku = 'oneSku';
+
+        $this->productRepository->expects($this->once())->method('get')
+            ->with($this->equalTo($productSku))
+            ->will($this->returnValue($this->product));
+
+        $this->product->expects($this->once())->method('getTypeId')
+            ->will($this->returnValue(\Magento\Catalog\Model\Product\Type::TYPE_BUNDLE));
+
+        $storeId = 1;
+        $this->store->expects($this->once())->method('getId')->will($this->returnValue($storeId));
+
+        $this->optionModel->expects($this->once())->method('setStoreId')->with($this->equalTo($storeId));
+        $this->optionModel->expects($this->once())->method('save')->will(
+            $this->returnCallback(
+                function () {
+                    throw new \Exception();
+                }
+            )
+        );
+
+        $this->optionConverter->expects($this->once())->method('createModelFromData')
+            ->with($this->equalTo($this->option), $this->equalTo($this->product))
+            ->will($this->returnValue($this->optionModel));
+
+        $this->assertEquals($this->option, $this->model->add($productSku, $this->option));
+    }
+
+    public function testUpdate()
+    {
+        $productSku = 'oneSku';
+        $optionId = 3;
+
+        $this->productRepository->expects($this->once())->method('get')
+            ->with($this->equalTo($productSku))
+            ->will($this->returnValue($this->product));
+
+        $this->product->expects($this->once())->method('getTypeId')
+            ->will($this->returnValue(\Magento\Catalog\Model\Product\Type::TYPE_BUNDLE));
+
+        $this->productType->expects($this->once())->method('getOptionsCollection')
+            ->with($this->equalTo($this->product))
+            ->will($this->returnValue($this->optionCollection));
+
+        $this->optionCollection->expects($this->once())->method('setIdFilter')
+            ->with($this->equalTo($optionId));
+        $this->optionCollection->expects($this->once())->method('getFirstItem')
+            ->will($this->returnValue($this->optionModel));
+
+        $storeId = 1;
+        $this->store->expects($this->once())->method('getId')->will($this->returnValue($storeId));
+
+        $this->optionModel->expects($this->once())->method('setStoreId')->with($this->equalTo($storeId));
+        $this->optionModel->expects($this->once())->method('getId')->will($this->returnValue($optionId));
+        $this->optionModel->expects($this->once())->method('save');
+
+        $this->optionConverter->expects($this->once())->method('getModelFromData')
+            ->with($this->equalTo($this->option), $this->equalTo($this->optionModel))
+            ->will($this->returnValue($this->optionModel));
+
+        $this->assertTrue($this->model->update($productSku, $optionId, $this->option));
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\CouldNotSaveException
+     */
+    public function testUpdateCouldNotSaveException()
+    {
+        $productSku = 'oneSku';
+        $optionId = 3;
+
+        $this->productRepository->expects($this->once())->method('get')
+            ->with($this->equalTo($productSku))
+            ->will($this->returnValue($this->product));
+
+        $this->product->expects($this->once())->method('getTypeId')
+            ->will($this->returnValue(\Magento\Catalog\Model\Product\Type::TYPE_BUNDLE));
+
+        $this->productType->expects($this->once())->method('getOptionsCollection')
+            ->with($this->equalTo($this->product))
+            ->will($this->returnValue($this->optionCollection));
+
+        $this->optionCollection->expects($this->once())->method('setIdFilter')
+            ->with($this->equalTo($optionId));
+        $this->optionCollection->expects($this->once())->method('getFirstItem')
+            ->will($this->returnValue($this->optionModel));
+
+        $storeId = 1;
+        $this->store->expects($this->once())->method('getId')->will($this->returnValue($storeId));
+
+        $this->optionModel->expects($this->once())->method('setStoreId')->with($this->equalTo($storeId));
+        $this->optionModel->expects($this->once())->method('getId')->will($this->returnValue($optionId));
+        $this->optionModel->expects($this->once())->method('save')->will(
+            $this->returnCallback(
+                function () {
+                    throw new \Exception();
+                }
+            )
+        );
+
+        $this->optionConverter->expects($this->once())->method('getModelFromData')
+            ->with($this->equalTo($this->option), $this->equalTo($this->optionModel))
+            ->will($this->returnValue($this->optionModel));
+
+        $this->assertTrue($this->model->update($productSku, $optionId, $this->option));
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\NoSuchEntityException
+     */
+    public function testUpdateNoSuchEntityException()
+    {
+        $productSku = 'oneSku';
+        $optionId = 3;
+
+        $this->productRepository->expects($this->once())->method('get')
+            ->with($this->equalTo($productSku))
+            ->will($this->returnValue($this->product));
+
+        $this->product->expects($this->once())->method('getTypeId')
+            ->will($this->returnValue(\Magento\Catalog\Model\Product\Type::TYPE_BUNDLE));
+
+        $this->productType->expects($this->once())->method('getOptionsCollection')
+            ->with($this->equalTo($this->product))
+            ->will($this->returnValue($this->optionCollection));
+
+        $this->optionCollection->expects($this->once())->method('setIdFilter')
+            ->with($this->equalTo($optionId));
+        $this->optionCollection->expects($this->once())->method('getFirstItem')
+            ->will($this->returnValue($this->optionModel));
+
+        $this->optionConverter->expects($this->once())->method('getModelFromData')
+            ->with($this->equalTo($this->option), $this->equalTo($this->optionModel))
+            ->will($this->returnValue($this->optionModel));
+
+        $this->optionModel->expects($this->once())->method('getId');
+
+        $this->model->update($productSku, $optionId, $this->option);
+    }
+
+    public function testRemove()
+    {
+        $productSku = 'oneSku';
+        $optionId = 3;
+
+        $this->productRepository->expects($this->once())->method('get')
+            ->with($this->equalTo($productSku))
+            ->will($this->returnValue($this->product));
+
+        $this->product->expects($this->once())->method('getTypeId')
+            ->will($this->returnValue(\Magento\Catalog\Model\Product\Type::TYPE_BUNDLE));
+
+        $this->productType->expects($this->once())->method('getOptionsCollection')
+            ->with($this->equalTo($this->product))
+            ->will($this->returnValue($this->optionCollection));
+
+        $this->optionCollection->expects($this->once())->method('setIdFilter')
+            ->with($this->equalTo($optionId));
+        $this->optionCollection->expects($this->once())->method('getFirstItem')
+            ->will($this->returnValue($this->optionModel));
+
+        $this->optionModel->expects($this->once())->method('getId')->will($this->returnValue($optionId));
+        $this->optionModel->expects($this->once())->method('delete');
+
+        $this->assertTrue($this->model->remove($productSku, $optionId));
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\NoSuchEntityException
+     */
+    public function testRemoveNoSuchEntityException()
+    {
+        $productSku = 'oneSku';
+        $optionId = 3;
+
+        $this->productRepository->expects($this->once())->method('get')
+            ->with($this->equalTo($productSku))
+            ->will($this->returnValue($this->product));
+
+        $this->product->expects($this->once())->method('getTypeId')
+            ->will($this->returnValue(\Magento\Catalog\Model\Product\Type::TYPE_BUNDLE));
+
+        $this->productType->expects($this->once())->method('getOptionsCollection')
+            ->with($this->equalTo($this->product))
+            ->will($this->returnValue($this->optionCollection));
+
+        $this->optionCollection->expects($this->once())->method('setIdFilter')
+            ->with($this->equalTo($optionId));
+        $this->optionCollection->expects($this->once())->method('getFirstItem')
+            ->will($this->returnValue($this->optionModel));
+
+        $this->optionModel->expects($this->once())->method('getId');
+
+        $this->model->remove($productSku, $optionId);
+    }
+
+    /**
+     * @expectedException \Magento\Webapi\Exception
+     * @expectedExceptionCode 403
+     */
+    public function testRemoveWebApiException()
+    {
+        $productSku = 'oneSku';
+        $optionId = 3;
+
+        $this->productRepository->expects($this->once())->method('get')
+            ->with($this->equalTo($productSku))
+            ->will($this->returnValue($this->product));
+
+        $this->product->expects($this->once())->method('getTypeId')
+            ->will($this->returnValue(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE));
+        $this->product->expects($this->once())->method('getSku')
+            ->will($this->returnValue($productSku));
+
+        $this->model->remove($productSku, $optionId);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Initialization/HelperTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Initialization/HelperTest.php
index 2faacb4ec0408f83dd0d70653775faf2c86fd9b0..4c7620a2bb538a432b4fb9954d60eedf55f18a0e 100644
--- a/dev/tests/unit/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Initialization/HelperTest.php
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Controller/Adminhtml/Product/Initialization/HelperTest.php
@@ -118,20 +118,26 @@ class HelperTest extends \PHPUnit_Framework_TestCase
             '',
             false
         );
+    }
 
-        $this->websiteMock->expects($this->once())->method('getId')->will($this->returnValue($this->websiteId));
+    /**
+     * @covers Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper::initialize
+     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
+     */
+    public function testInitialize()
+    {
+        $this->websiteMock->expects($this->once())
+            ->method('getId')
+            ->will($this->returnValue($this->websiteId));
 
-        $this->storeMock->expects($this->once())->method('getWebsite')->will($this->returnValue($this->websiteMock));
+        $this->storeMock->expects($this->once())
+            ->method('getWebsite')
+            ->will($this->returnValue($this->websiteMock));
 
-        $this->storeManagerMock->expects(
-            $this->once()
-        )->method(
-            'getStore'
-        )->with(
-            true
-        )->will(
-            $this->returnValue($this->storeMock)
-        );
+        $this->storeManagerMock->expects($this->once())
+            ->method('getStore')
+            ->with(true)
+            ->will($this->returnValue($this->storeMock));
 
         $this->jsHelperMock = $this->getMock('\Magento\Backend\Helper\Js', [], [], '', false);
         $this->helper = new Helper(
@@ -141,13 +147,7 @@ class HelperTest extends \PHPUnit_Framework_TestCase
             $this->productLinksMock,
             $this->jsHelperMock
         );
-    }
 
-    /**
-     * @covers Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper::initialize
-     */
-    public function testInitialize()
-    {
         $productData = array(
             'stock_data' => array('stock_data'),
             'url_key_create_redirect' => true,
@@ -156,92 +156,142 @@ class HelperTest extends \PHPUnit_Framework_TestCase
 
         $useDefaults = array('attributeCode1', 'attributeCode2');
 
-        $this->requestMock->expects(
-            $this->at(0)
-        )->method(
-            'getPost'
-        )->with(
-            'product'
-        )->will(
-            $this->returnValue($productData)
-        );
-
-        $this->requestMock->expects(
-            $this->at(1)
-        )->method(
-            'getPost'
-        )->with(
-            'use_default'
-        )->will(
-            $this->returnValue($useDefaults)
-        );
-
-        $this->requestMock->expects(
-            $this->at(3)
-        )->method(
-            'getPost'
-        )->with(
-            'affect_product_custom_options'
-        )->will(
-            $this->returnValue(true)
-        );
-
-        $this->stockFilterMock->expects(
-            $this->once()
-        )->method(
-            'filter'
-        )->with(
-            array('stock_data')
-        )->will(
-            $this->returnValue(array('stock_data'))
-        );
-
-        $this->storeManagerMock->expects($this->once())->method('hasSingleStore')->will($this->returnValue(true));
-
-        $this->productLinksMock->expects(
-            $this->once()
-        )->method(
-            'initializeLinks'
-        )->with(
-            $this->productMock
-        )->will(
-            $this->returnValue($this->productMock)
-        );
-
-        $this->productMock->expects(
-            $this->once()
-        )->method(
-            'isLockedAttribute'
-        )->with(
-            'media'
-        )->will(
-            $this->returnValue(true)
-        );
-
-        $this->productMock->expects($this->once())->method('unlockAttribute')->with('media');
-
-        $this->productMock->expects($this->once())->method('lockAttribute')->with('media');
+        $this->requestMock->expects($this->at(0))
+            ->method('getPost')
+            ->with('product')
+            ->will($this->returnValue($productData));
+
+        $this->requestMock->expects($this->at(1))
+            ->method('getPost')
+            ->with('use_default')
+            ->will($this->returnValue($useDefaults));
+
+        $this->requestMock->expects($this->at(3))
+            ->method('getPost')
+            ->with('options_use_default')
+            ->will($this->returnValue(true));
+
+        $this->requestMock->expects($this->at(4))
+            ->method('getPost')
+            ->with('affect_product_custom_options')
+            ->will($this->returnValue(true));
+
+        $this->stockFilterMock->expects($this->once())
+            ->method('filter')
+            ->with(array('stock_data'))
+            ->will($this->returnValue(array('stock_data')));
+
+        $this->storeManagerMock->expects($this->once())
+            ->method('hasSingleStore')
+            ->will($this->returnValue(true));
+
+        $this->productLinksMock->expects($this->once())
+            ->method('initializeLinks')
+            ->with($this->productMock)
+            ->will($this->returnValue($this->productMock));
+
+        $this->productMock->expects($this->once())
+            ->method('isLockedAttribute')
+            ->with('media')
+            ->will($this->returnValue(true));
+
+        $this->productMock->expects($this->once())
+            ->method('unlockAttribute')
+            ->with('media');
+
+        $this->productMock->expects($this->once())
+            ->method('lockAttribute')
+            ->with('media');
 
         $productData['category_ids'] = array();
         $productData['website_ids'] = array();
-        $this->productMock->expects($this->once())->method('addData')->with($productData);
+        $this->productMock->expects($this->once())
+            ->method('addData')
+            ->with($productData);
 
-        $this->productMock->expects($this->once())->method('getId')->will($this->returnValue(true));
+        $this->productMock->expects($this->once())
+            ->method('getId')
+            ->will($this->returnValue(true));
 
-        $this->productMock->expects($this->once())->method('setWebsiteIds')->with(array($this->websiteId));
+        $this->productMock->expects($this->once())
+            ->method('setWebsiteIds')
+            ->with(array($this->websiteId));
 
-        $this->productMock->expects($this->at(6))->method('setData')->with('save_rewrites_history', true);
+        $this->productMock->expects($this->at(6))
+            ->method('setData')
+            ->with('save_rewrites_history', true);
 
-        $this->productMock->expects($this->at(7))->method('setData')->with('attributeCode1', false);
+        $this->productMock->expects($this->at(7))
+            ->method('setData')
+            ->with('attributeCode1', false);
 
-        $this->productMock->expects($this->at(8))->method('setData')->with('attributeCode2', false);
+        $this->productMock->expects($this->at(8))
+            ->method('setData')
+            ->with('attributeCode2', false);
 
-        $this->productMock->expects($this->any())->method('getOptionsReadOnly')->will($this->returnValue(false));
+        $this->productMock->expects($this->any())
+            ->method('getOptionsReadOnly')
+            ->will($this->returnValue(false));
 
-        $this->productMock->expects($this->once())->method('setProductOptions')->with($productData['options']);
+        $this->productMock->expects($this->once())
+            ->method('setProductOptions')
+            ->with($productData['options']);
 
-        $this->productMock->expects($this->once())->method('setCanSaveCustomOptions')->with(true);
+        $this->productMock->expects($this->once())
+            ->method('setCanSaveCustomOptions')
+            ->with(true);
 
         $this->assertEquals($this->productMock, $this->helper->initialize($this->productMock));
     }
+
+    /**
+     * Data provider for testMergeProductOptions
+     *
+     * @return array
+     */
+    public function mergeProductOptionsDataProvider()
+    {
+        return [
+            [
+                null,
+                [],
+                [],
+            ],
+            [
+                ['key' => 'val'],
+                null,
+                ['key' => 'val'],
+            ],
+            [
+                ['key' => ['key' => 'val']],
+                ['key' => ['key' => 'val2' , 'key2' => 'val2']],
+                ['key' => ['key' => 'val2' , 'key2' => 'val2']],
+            ],
+            [
+                ['key' => ['key' => 'val', 'another_key' => 'another_value']],
+                ['key' => ['key' => 'val2' , 'key2' => 'val2']],
+                ['key' => ['key' => 'val2' , 'another_key' => 'another_value', 'key2' => 'val2', ]],
+            ],
+        ];
+    }
+
+    /**
+     * @param array $productOptions
+     * @param array $defaultOptions
+     * @param array $expectedResults
+     * @dataProvider mergeProductOptionsDataProvider
+     */
+    public function testMergeProductOptions($productOptions, $defaultOptions, $expectedResults)
+    {
+        $this->jsHelperMock = $this->getMock('\Magento\Backend\Helper\Js', [], [], '', false);
+        $this->helper = new Helper(
+            $this->requestMock,
+            $this->storeManagerMock,
+            $this->stockFilterMock,
+            $this->productLinksMock,
+            $this->jsHelperMock
+        );
+        $result = $this->helper->mergeProductOptions($productOptions, $defaultOptions);
+        $this->assertEquals($expectedResults, $result);
+    }
 }
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/Option/Validator/DefaultValidatorTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/Option/Validator/DefaultValidatorTest.php
index 5df12e54d03902eeec2482f912cc827b20b08e0b..03309c1df6d70118ef31021c56c965734822f892 100644
--- a/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/Option/Validator/DefaultValidatorTest.php
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/Product/Option/Validator/DefaultValidatorTest.php
@@ -63,50 +63,119 @@ class DefaultValidatorTest extends \PHPUnit_Framework_TestCase
             ],
         ];
         $configMock->expects($this->once())->method('getAll')->will($this->returnValue($config));
-        $methods = ['getTitle', 'getType', 'getPriceType', 'getPrice', '__wakeup'];
-        $this->valueMock = $this->getMock('Magento\Catalog\Model\Product\Option', $methods, [], '', false);
         $this->validator = new \Magento\Catalog\Model\Product\Option\Validator\DefaultValidator(
             $configMock,
             $priceConfigMock
         );
     }
 
-    public function testIsValidSuccess()
+    /**
+     * Data provider for testIsValidSuccess
+     * @return array
+     */
+    public function isValidTitleDataProvider()
     {
-        $this->valueMock->expects($this->once())->method('getTitle')->will($this->returnValue('option_title'));
-        $this->valueMock->expects($this->exactly(2))->method('getType')->will($this->returnValue('name 1.1'));
-        $this->valueMock->expects($this->once())->method('getPriceType')->will($this->returnValue('fixed'));
-        $this->valueMock->expects($this->once())->method('getPrice')->will($this->returnValue(10));
-        $this->assertTrue($this->validator->isValid($this->valueMock));
-        $this->assertEmpty($this->validator->getMessages());
+        $mess = ['option required fields' => 'Missed values for option required fields'];
+        return [
+            ['option_title', 'name 1.1', 'fixed', 10, new \Magento\Framework\Object(['store_id' => 1]), [], true],
+            ['option_title', 'name 1.1', 'fixed', 10, new \Magento\Framework\Object(['store_id' => 0]), [], true],
+            [null, 'name 1.1', 'fixed', 10, new \Magento\Framework\Object(['store_id' => 1]), [], true],
+            [null, 'name 1.1', 'fixed', 10, new \Magento\Framework\Object(['store_id' => 0]), $mess, false],
+        ];
     }
 
-    public function testIsValidFail()
+    /**
+     * @param $title
+     * @param $type
+     * @param $priceType
+     * @param $price
+     * @param $product
+     * @param $messages
+     * @param $result
+     * @dataProvider isValidTitleDataProvider
+     */
+    public function testIsValidTitle($title, $type, $priceType, $price, $product, $messages, $result)
     {
-        $this->valueMock->expects($this->once())->method('getTitle');
-        $this->valueMock->expects($this->once())->method('getType');
-        $this->valueMock->expects($this->once())->method('getPriceType')->will($this->returnValue('some_new_value'));
-        $this->valueMock->expects($this->never())->method('getPrice');
+        $methods = ['getTitle', 'getType', 'getPriceType', 'getPrice', '__wakeup', 'getProduct'];
+        $valueMock = $this->getMock('Magento\Catalog\Model\Product\Option', $methods, [], '', false);
+        $valueMock->expects($this->once())->method('getTitle')->will($this->returnValue($title));
+        $valueMock->expects($this->any())->method('getType')->will($this->returnValue($type));
+        $valueMock->expects($this->once())->method('getPriceType')->will($this->returnValue($priceType));
+        $valueMock->expects($this->once())->method('getPrice')->will($this->returnValue($price));
+        $valueMock->expects($this->once())->method('getProduct')->will($this->returnValue($product));
+        $this->assertEquals($result, $this->validator->isValid($valueMock));
+        $this->assertEquals($messages, $this->validator->getMessages());
+    }
+
+    /**
+     * Data provider for testIsValidFail
+     *
+     * @return array
+     */
+    public function isValidFailDataProvider()
+    {
+        return [
+            [new \Magento\Framework\Object(['store_id' => 1])],
+            [new \Magento\Framework\Object(['store_id' => 0])],
+        ];
+    }
+
+    /**
+     * @param $product
+     * @dataProvider isValidFailDataProvider
+     */
+    public function testIsValidFail($product)
+    {
+        $methods = ['getTitle', 'getType', 'getPriceType', 'getPrice', '__wakeup', 'getProduct'];
+        $valueMock = $this->getMock('Magento\Catalog\Model\Product\Option', $methods, [], '', false);
+        $valueMock->expects($this->once())->method('getProduct')->will($this->returnValue($product));
+        $valueMock->expects($this->once())->method('getTitle');
+        $valueMock->expects($this->any())->method('getType');
+        $valueMock->expects($this->once())->method('getPriceType')->will($this->returnValue('some_new_value'));
+        $valueMock->expects($this->never())->method('getPrice');
         $messages = [
             'option required fields' => 'Missed values for option required fields',
             'option type' => 'Invalid option type',
             'option values' => 'Invalid option value'
         ];
-        $this->assertFalse($this->validator->isValid($this->valueMock));
+        $this->assertFalse($this->validator->isValid($valueMock));
         $this->assertEquals($messages, $this->validator->getMessages());
     }
 
-    public function testValidationNegativePrice()
+    /**
+     * Data provider for testValidationNegativePrice
+     * @return array
+     */
+    public function validationNegativePriceDataProvider()
+    {
+        return [
+            ['option_title', 'name 1.1', 'fixed', -12, new \Magento\Framework\Object(['store_id' => 1])],
+            ['option_title', 'name 1.1', 'fixed', -12, new \Magento\Framework\Object(['store_id' => 0])],
+        ];
+    }
+
+    /**
+     * @param $title
+     * @param $type
+     * @param $priceType
+     * @param $price
+     * @param $product
+     * @dataProvider validationNegativePriceDataProvider
+     */
+    public function testValidationNegativePrice($title, $type, $priceType, $price, $product)
     {
-        $this->valueMock->expects($this->once())->method('getTitle')->will($this->returnValue('option_title'));
-        $this->valueMock->expects($this->exactly(2))->method('getType')->will($this->returnValue('name 1.1'));
-        $this->valueMock->expects($this->once())->method('getPriceType')->will($this->returnValue('fixed'));
-        $this->valueMock->expects($this->once())->method('getPrice')->will($this->returnValue(-12));
+        $methods = ['getTitle', 'getType', 'getPriceType', 'getPrice', '__wakeup', 'getProduct'];
+        $valueMock = $this->getMock('Magento\Catalog\Model\Product\Option', $methods, [], '', false);
+        $valueMock->expects($this->once())->method('getTitle')->will($this->returnValue($title));
+        $valueMock->expects($this->exactly(2))->method('getType')->will($this->returnValue($type));
+        $valueMock->expects($this->once())->method('getPriceType')->will($this->returnValue($priceType));
+        $valueMock->expects($this->once())->method('getPrice')->will($this->returnValue($price));
+        $valueMock->expects($this->once())->method('getProduct')->will($this->returnValue($product));
 
         $messages = [
             'option values' => 'Invalid option value'
         ];
-        $this->assertFalse($this->validator->isValid($this->valueMock));
+        $this->assertFalse($this->validator->isValid($valueMock));
         $this->assertEquals($messages, $this->validator->getMessages());
     }
 }
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Resource/Product/Option/ValueTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Resource/Product/Option/ValueTest.php
deleted file mode 100644
index 2d1f39eda73cd5b3214a654dd3557abb9b1c5e04..0000000000000000000000000000000000000000
--- a/dev/tests/unit/testsuite/Magento/Catalog/Model/Resource/Product/Option/ValueTest.php
+++ /dev/null
@@ -1,71 +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\Option;
-
-class ValueTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var \Magento\Catalog\Model\Resource\Product\Option\ValueStub
-     */
-    protected $_object;
-
-    /**
-     * Option value title data
-     *
-     * @var array
-     */
-    public static $valueTitleData = array(
-        'id' => 2,
-        'store_id' => \Magento\Store\Model\Store::DEFAULT_STORE_ID,
-        'scope' => array('title' => 1)
-    );
-
-    protected function setUp()
-    {
-        $this->_object = new \Magento\Catalog\Model\Resource\Product\Option\ValueStub();
-    }
-
-    protected function tearDown()
-    {
-        unset($this->_object);
-    }
-
-    /**
-     * Test that there is no notice in _saveValueTitles()
-     *
-     * @covers \Magento\Catalog\Model\Resource\Product\Option\Value::_saveValueTitles
-     */
-    public function testSaveValueTitles()
-    {
-        $object = new Stub(
-            $this->getMock('Magento\Framework\Model\Context', array(), array(), '', false),
-            $this->getMock('Magento\Framework\Registry', array(), array(), '', false),
-            null,
-            null,
-            self::$valueTitleData
-        );
-
-        $this->_object->saveValueTitles($object);
-    }
-}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Service/V1/Category/ProductLinks/ReadServiceTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Service/V1/Category/ProductLinks/ReadServiceTest.php
index 71140ba25c97857d90d06698912b1680b692f118..5d173eb2e4ca76558641f6d30cfcb3c01a37d146 100644
--- a/dev/tests/unit/testsuite/Magento/Catalog/Service/V1/Category/ProductLinks/ReadServiceTest.php
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Service/V1/Category/ProductLinks/ReadServiceTest.php
@@ -24,9 +24,8 @@
 namespace Magento\Catalog\Service\V1\Category\ProductLinks;
 
 use Magento\Catalog\Model\Category;
-use Magento\Catalog\Service\V1\Data\Eav\Category\ProductConverterFactory;
-use Magento\Catalog\Service\V1\Data\Eav\Category\ProductLink;
-use Magento\Catalog\Service\V1\Data\Eav\Category\ProductLinkBuilder;
+use Magento\Catalog\Service\V1\Data\Category\ProductLink;
+use Magento\Catalog\Service\V1\Data\Category\ProductLinkBuilder;
 use Magento\TestFramework\Helper\ObjectManager;
 
 class ReadServiceTest extends \PHPUnit_Framework_TestCase
@@ -68,12 +67,12 @@ class ReadServiceTest extends \PHPUnit_Framework_TestCase
         $categoryFactory->expects($this->any())->method('create')
             ->will($this->returnValue($this->category));
 
-        $this->productLink = $this->getMockBuilder('Magento\Catalog\Service\V1\Data\Eav\Category\ProductLink')
+        $this->productLink = $this->getMockBuilder('Magento\Catalog\Service\V1\Data\Category\ProductLink')
             ->disableOriginalConstructor()
             ->getMock();
 
         $this->productLinkBuilder = $this->getMockBuilder(
-            'Magento\Catalog\Service\V1\Data\Eav\Category\ProductLinkBuilder'
+            'Magento\Catalog\Service\V1\Data\Category\ProductLinkBuilder'
         )
             ->disableOriginalConstructor()
             ->getMock();
@@ -96,7 +95,7 @@ class ReadServiceTest extends \PHPUnit_Framework_TestCase
         $productId = $categoryId + 6;
         $productSku = "sku{$productId}";
 
-        $productDto = $this->getMockBuilder('Magento\Catalog\Service\V1\Data\Eav\Category\ProductLink')
+        $productDto = $this->getMockBuilder('Magento\Catalog\Service\V1\Data\Category\ProductLink')
             ->disableOriginalConstructor()
             ->getMock();
 
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Service/V1/Category/ProductLinks/WriteServiceTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Service/V1/Category/ProductLinks/WriteServiceTest.php
index d04bae14a25115686d7eb2b3609fc09a3ea83d8e..24c0ede6ee021948e98c0b260ec34efc192d19b1 100644
--- a/dev/tests/unit/testsuite/Magento/Catalog/Service/V1/Category/ProductLinks/WriteServiceTest.php
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Service/V1/Category/ProductLinks/WriteServiceTest.php
@@ -48,7 +48,7 @@ class WriteServiceTest extends \PHPUnit_Framework_TestCase
     private $categoryLoader;
 
     /**
-     * @var \Magento\Catalog\Service\V1\Data\Eav\Category\ProductLink|\PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Catalog\Service\V1\Data\Category\ProductLink|\PHPUnit_Framework_MockObject_MockObject
      */
     private $productLink;
 
@@ -56,7 +56,7 @@ class WriteServiceTest extends \PHPUnit_Framework_TestCase
     {
         $objectManager = new ObjectManager($this);
 
-        $this->productLink = $this->getMockBuilder('Magento\Catalog\Service\V1\Data\Eav\Category\ProductLink')
+        $this->productLink = $this->getMockBuilder('Magento\Catalog\Service\V1\Data\Category\ProductLink')
             ->setMethods(['getSku', 'getPosition'])
             ->disableOriginalConstructor()
             ->getMock();
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Service/V1/Category/WriteServiceTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Service/V1/Category/WriteServiceTest.php
index d55e5e3af5ce3722a61b9b75f3c46e8b62d37e46..7668158e8108e9bee286ddcb302ff9f9540a3a61 100644
--- a/dev/tests/unit/testsuite/Magento/Catalog/Service/V1/Category/WriteServiceTest.php
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Service/V1/Category/WriteServiceTest.php
@@ -138,9 +138,9 @@ class WriteServiceTest extends \PHPUnit_Framework_TestCase
     }
 
     /**
-     * @expectedException \Magento\Framework\Exception\CouldNotSaveException
+     * @expectedException \Magento\Framework\Exception\StateException
      */
-    public function testDeleteCouldNotSaveException()
+    public function testDeleteStateException()
     {
         $id = 3;
         $this->category->expects($this->once())->method('getId')->will($this->returnValue($id));
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Service/V1/Data/Category/TreeTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Service/V1/Data/Category/TreeTest.php
index e4d323578036cdd115f5cb23733cc77dff2f06c0..469d333c07f67e30c53a5bc8f3a7c07eb8f19974 100644
--- a/dev/tests/unit/testsuite/Magento/Catalog/Service/V1/Data/Category/TreeTest.php
+++ b/dev/tests/unit/testsuite/Magento/Catalog/Service/V1/Data/Category/TreeTest.php
@@ -173,6 +173,8 @@ class TreeTest extends \PHPUnit_Framework_TestCase
             ->will($this->returnSelf());
         $builder->expects($this->any())->method('setActive')->with($this->equalTo(true))
             ->will($this->returnSelf());
+        $builder->expects($this->any())->method('setProductCount')->with(4)
+            ->will($this->returnSelf());
         $builder->expects($this->any())->method('setChildren')->will($this->returnSelf());
         $builder->expects($this->any())->method('create')->will($this->returnValue([]));
 
@@ -187,7 +189,8 @@ class TreeTest extends \PHPUnit_Framework_TestCase
                     'getName',
                     'getPosition',
                     'getLevel',
-                    'getIsActive'
+                    'getIsActive',
+                    'getProductCount'
                 ]
             )
             ->getMock();
@@ -200,6 +203,7 @@ class TreeTest extends \PHPUnit_Framework_TestCase
         $node->expects($this->any())->method('getPosition')->will($this->returnValue($currentLevel));
         $node->expects($this->any())->method('getLevel')->will($this->returnValue($currentLevel));
         $node->expects($this->any())->method('getIsActive')->will($this->returnValue(true));
+        $node->expects($this->any())->method('getProductCount')->will($this->returnValue(4));
         $this->tree->getTree($node, $depth, $currentLevel);
     }
 }
diff --git a/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Address/Billing/ReadServiceTest.php b/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Address/Billing/ReadServiceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..8dc87b47f2f631010ef45886372147abf6d70661
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Address/Billing/ReadServiceTest.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\Checkout\Service\V1\Address\Billing;
+
+class ReadServiceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var ReadService
+     */
+    protected $service;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $quoteLoaderMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $converterMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeManagerMock;
+
+    protected function setUp()
+    {
+        $this->quoteLoaderMock = $this->getMock('\Magento\Checkout\Service\V1\QuoteLoader', [], [], '', false);
+        $this->storeManagerMock = $this->getMock('\Magento\Store\Model\StoreManagerInterface');
+        $this->converterMock = $this->getMock('\Magento\Checkout\Service\V1\Address\Converter', [], [], '', false);
+
+        $this->service = new ReadService($this->quoteLoaderMock, $this->converterMock, $this->storeManagerMock);
+    }
+
+    public  function testGetAddress()
+    {
+        $storeMock = $this->getMock('\Magento\Store\Model\Store', [], [], '', false);
+        $storeMock->expects($this->once())->method('getId')->will($this->returnValue(11));
+        $this->storeManagerMock->expects($this->once())->method('getStore')->will($this->returnValue($storeMock));
+
+        $quoteMock = $this->getMock('\Magento\Sales\Model\Quote', [], [], '', false);
+        $this->quoteLoaderMock->expects($this->once())->method('load')
+            ->with('cartId', '11')->will($this->returnValue($quoteMock));
+
+        $addressMock = $this->getMock('\Magento\Sales\Model\Quote\Address', [], [], '', false);
+        $quoteMock->expects($this->any())->method('getBillingAddress')->will($this->returnValue($addressMock));
+
+        $this->converterMock->expects($this->once())->method('convertModelToDataObject')
+            ->with($addressMock)->will($this->returnValue('BillingAddress'));
+
+        $this->assertEquals('BillingAddress', $this->service->getAddress('cartId'));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Address/Billing/WriteServiceTest.php b/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Address/Billing/WriteServiceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..64bb4c6ffaba991b760f93abb80554b9ce6ad257
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Address/Billing/WriteServiceTest.php
@@ -0,0 +1,170 @@
+<?php
+/**
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Checkout\Service\V1\Address\Billing;
+
+class WriteServiceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var WriteService
+     */
+    protected $service;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $quoteLoaderMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $addressFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $quoteAddressMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeManagerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $validatorMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $converterMock;
+
+    /**
+     * @var \Magento\TestFramework\Helper\ObjectManager
+     */
+    protected $objectManager;
+
+    protected function setUp()
+    {
+        $this->quoteLoaderMock = $this->getMock('\Magento\Checkout\Service\V1\QuoteLoader', [], [], '', false);
+        $this->storeManagerMock = $this->getMock('\Magento\Store\Model\StoreManagerInterface');
+        $this->addressFactoryMock = $this->getMock(
+            '\Magento\Sales\Model\Quote\AddressFactory', ['create', '__wakeup'], [], '', false
+        );
+
+        $this->objectManager = new \Magento\TestFramework\Helper\ObjectManager($this);
+        $this->quoteAddressMock = $this->getMock(
+            '\Magento\Sales\Model\Quote\Address',
+            ['getCustomerId', 'load', 'getData', 'setData', 'setStreet', 'setRegionId', 'setRegion', '__wakeup'],
+            [],
+            '',
+            false
+        );
+        $this->addressFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->quoteAddressMock));
+
+        $this->validatorMock = $this->getMock(
+            '\Magento\Checkout\Service\V1\Address\Validator', [], [], '', false
+        );
+
+        $this->converterMock = $this->getMock(
+            '\Magento\Checkout\Service\V1\Address\Converter', [], [], '', false
+        );
+
+        $this->service = $this->objectManager->getObject(
+            '\Magento\Checkout\Service\V1\Address\Billing\WriteService',
+            [
+                'quoteLoader' => $this->quoteLoaderMock,
+                'storeManager' => $this->storeManagerMock,
+                'quoteAddressFactory' => $this->addressFactoryMock,
+                'addressValidator' => $this->validatorMock,
+                'addressConverter' => $this->converterMock,
+            ]
+        );
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\NoSuchEntityException
+     * @expected ExceptionMessage error123
+     */
+    public function testSetAddressValidationFailed()
+    {
+        $storeId = 323;
+        $storeMock = $this->getMock('\Magento\Store\Model\Store', [], [], '', false);
+        $storeMock->expects($this->once())->method('getId')->will($this->returnValue($storeId));
+        $this->storeManagerMock->expects($this->once())->method('getStore')->will($this->returnValue($storeMock));
+
+        $quoteMock = $this->getMock('\Magento\Sales\Model\Quote', [], [], '', false);
+        $this->quoteLoaderMock->expects($this->once())
+            ->method('load')
+            ->with('cartId', $storeId)
+            ->will($this->returnValue($quoteMock));
+
+        $this->validatorMock->expects($this->once())->method('validate')
+            ->will($this->throwException(new \Magento\Framework\Exception\NoSuchEntityException('error123')));
+
+        $this->service->setAddress('cartId', null);
+    }
+
+    public  function testSetAddress()
+    {
+        $storeId = 323;
+        $storeMock = $this->getMock('\Magento\Store\Model\Store', [], [], '', false);
+        $storeMock->expects($this->once())->method('getId')->will($this->returnValue($storeId));
+        $this->storeManagerMock->expects($this->once())->method('getStore')->will($this->returnValue($storeMock));
+
+        $quoteMock = $this->getMock('\Magento\Sales\Model\Quote', [], [], '', false);
+        $this->quoteLoaderMock->expects($this->once())
+            ->method('load')
+            ->with('cartId', $storeId)
+            ->will($this->returnValue($quoteMock));
+
+        /** @var \Magento\Checkout\Service\V1\Data\Cart\AddressBuilder $addressDataBuilder */
+        $addressDataBuilder = $this->objectManager->getObject('Magento\Checkout\Service\V1\Data\Cart\AddressBuilder');
+        /** @var \Magento\Checkout\Service\V1\Data\Cart\Address $addressData */
+        $addressData = $addressDataBuilder->setId(454)->create();
+
+        $this->validatorMock->expects($this->once())->method('validate')
+            ->with($addressData)
+        ->will($this->returnValue(true));
+
+        $this->converterMock->expects($this->once())->method('convertDataObjectToModel')
+            ->with($addressData, $this->quoteAddressMock)
+            ->will($this->returnValue($this->quoteAddressMock));
+
+        $quoteMock->expects($this->once())->method('setBillingAddress')->with($this->quoteAddressMock);
+        $quoteMock->expects($this->once())->method('setDataChanges')->with(true);
+        $quoteMock->expects($this->once())->method('save');
+        $addressId = 1;
+        $billingAddressMock = $this->getMock('\Magento\Sales\Model\Quote\Address', [], [], '', false);
+        $billingAddressMock->expects($this->once())->method('getId')->will($this->returnValue($addressId));
+        $quoteMock->expects($this->once())->method('getBillingAddress')
+            ->will($this->returnValue($billingAddressMock));
+
+        $this->assertEquals($addressId, $this->service->setAddress('cartId', $addressData));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Address/ConverterTest.php b/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Address/ConverterTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..69ebcdeb3247972f097dd67306030fc6cbf5b778
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Address/ConverterTest.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\Checkout\Service\V1\Address;
+
+use \Magento\Checkout\Service\V1\Data\Cart\Address;
+use \Magento\Checkout\Service\V1\Data\Cart\Address\Region;
+use \Magento\Framework\Service\Data\Eav\AttributeValue;
+
+class ConverterTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Converter
+     */
+    protected $model;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $addressBuilderMock;
+
+    protected function setUp()
+    {
+        $this->addressBuilderMock = $this->getMock(
+            '\Magento\Checkout\Service\V1\Data\Cart\AddressBuilder', [], [], '', false
+        );
+
+        $this->model = new Converter($this->addressBuilderMock);
+    }
+
+    public  function testConvertModelToDataObject()
+    {
+        $addressMockMethods = [
+            'getCountryId', 'getId', 'getCustomerId', 'getRegion', 'getRegionId', 'getRegionCode',
+            'getStreet', 'getCompany', 'getTelephone', 'getFax', 'getPostcode', 'getFirstname', 'getMiddlename',
+            'getLastname', 'getPrefix', 'getSuffix', 'getEmail', 'getVatId', 'getCustomField', 'getCity', '__wakeup'
+        ];
+        $addressMock = $this->getMock('\Magento\Sales\Model\Quote\Address', $addressMockMethods, [], '', false);
+
+        $addressMock->expects($this->atLeastOnce())->method('getCountryId')->will($this->returnValue(1));
+        $addressMock->expects($this->atLeastOnce())->method('getId')->will($this->returnValue(2));
+        $addressMock->expects($this->atLeastOnce())->method('getCustomerId')->will($this->returnValue(3));
+        $addressMock->expects($this->atLeastOnce())->method('getRegion')->will($this->returnValue('Alabama'));
+        $addressMock->expects($this->atLeastOnce())->method('getRegionId')->will($this->returnValue(4));
+        $addressMock->expects($this->atLeastOnce())->method('getRegionCode')->will($this->returnValue('aa'));
+        $addressMock->expects($this->atLeastOnce())->method('getStreet')->will($this->returnValue('street'));
+        $addressMock->expects($this->atLeastOnce())->method('getCompany')->will($this->returnValue('company'));
+        $addressMock->expects($this->atLeastOnce())->method('getTelephone')->will($this->returnValue('123-123'));
+        $addressMock->expects($this->atLeastOnce())->method('getFax')->will($this->returnValue('234-234'));
+        $addressMock->expects($this->atLeastOnce())->method('getPostcode')->will($this->returnValue('80010'));
+        $addressMock->expects($this->atLeastOnce())->method('getCity')->will($this->returnValue('Town'));
+        $addressMock->expects($this->atLeastOnce())->method('getFirstname')->will($this->returnValue('Vasya'));
+        $addressMock->expects($this->atLeastOnce())->method('getMiddlename')->will($this->returnValue('Vasya'));
+        $addressMock->expects($this->atLeastOnce())->method('getLastname')->will($this->returnValue('Pupkin'));
+        $addressMock->expects($this->atLeastOnce())->method('getPrefix')->will($this->returnValue('prefix'));
+        $addressMock->expects($this->atLeastOnce())->method('getSuffix')->will($this->returnValue('suffix'));
+        $addressMock->expects($this->atLeastOnce())->method('getEmail')->will($this->returnValue('aaa@aaa.com'));
+        $addressMock->expects($this->atLeastOnce())->method('getVatId')->will($this->returnValue(5));
+        $addressMock->expects($this->atLeastOnce())->method('getCustomField')->will($this->returnValue('custom_value'));
+
+        $testData = [
+            Address::KEY_COUNTRY_ID => 1,
+            Address::KEY_ID => 2,
+            Address::KEY_CUSTOMER_ID => 3,
+            Address::KEY_REGION => [
+                Region::KEY_REGION => 'Alabama',
+                Region::KEY_REGION_ID => 4,
+                Region::KEY_REGION_CODE => 'aa',
+            ],
+            Address::KEY_STREET => 'street',
+            Address::KEY_COMPANY => 'company',
+            Address::KEY_TELEPHONE => '123-123',
+            Address::KEY_FAX => '234-234',
+            Address::KEY_POSTCODE => '80010',
+            Address::KEY_CITY => 'Town',
+            Address::KEY_FIRSTNAME => 'Vasya',
+            Address::KEY_LASTNAME => 'Pupkin',
+            Address::KEY_MIDDLENAME => 'Vasya',
+            Address::KEY_PREFIX => 'prefix',
+            Address::KEY_SUFFIX => 'suffix',
+            Address::KEY_EMAIL => 'aaa@aaa.com',
+            Address::KEY_VAT_ID => 5,
+            Address::CUSTOM_ATTRIBUTES_KEY => [['attribute_code' => 'custom_field', 'value' => 'custom_value']]
+        ];
+
+        $this->addressBuilderMock->expects($this->any())->method('getCustomAttributesCodes')->will(
+            $this->returnValue(array('custom_field'))
+        );
+        $this->addressBuilderMock->expects($this->once())->method('populateWithArray')->with($testData)->will(
+            $this->returnValue($this->addressBuilderMock)
+        );
+        $this->addressBuilderMock->expects($this->once())->method('create')->will(
+            $this->returnValue('Expected value')
+        );
+
+        $this->assertEquals('Expected value', $this->model->convertModelToDataObject($addressMock));
+    }
+
+    public function testConvertDataObjectToModel()
+    {
+        $dataObjectMock = $this->getMock('Magento\Checkout\Service\V1\Data\Cart\Address', [], [], '', false);
+        $methods = ['setData', 'setStreet', 'setRegionId', 'setRegion', '__wakeUp'];
+        $addressMock = $this->getMock('Magento\Sales\Model\Quote\Address', $methods, [], '', false);
+        $attributeValueMock = $this->getMock('\Magento\Framework\Service\Data\Eav\AttributeValue', [], [], '', false);
+        $attributeValueMock->expects($this->once())->method('getAttributeCode')->will($this->returnValue('value_code'));
+        $attributeValueMock->expects($this->once())->method('getValue')->will($this->returnValue('value'));
+
+        $addressData = [
+            'some_code' => 'some_value'
+        ];
+        $regionMock = $this->getMock('Magento\Checkout\Service\V1\Data\Cart\Address\Region', [], [], '', false);
+
+        $dataObjectMock->expects($this->once())->method('__toArray')->will($this->returnValue($addressData));
+        $valueMap = [
+            [$addressData, null],
+            ['attribute_value', 'value']
+        ];
+        $addressMock->expects($this->any())->method('setData')->will($this->returnValueMap($valueMap));
+        $dataObjectMock
+            ->expects($this->once())
+            ->method('getCustomAttributes')
+            ->will($this->returnValue([$attributeValueMock]));
+        $dataObjectMock->expects($this->once())->method('getStreet')->will($this->returnValue('street'));
+        $addressMock->expects($this->once())->method('setStreet')->with('street');
+        $dataObjectMock->expects($this->any())->method('getRegion')->will($this->returnValue($regionMock));
+        $regionMock->expects($this->once())->method('getRegionId')->will($this->returnValue('regionId'));
+        $regionMock->expects($this->once())->method('getRegion')->will($this->returnValue('region'));
+        $addressMock->expects($this->once())->method('setRegionId')->with('regionId');
+        $addressMock->expects($this->once())->method('setRegion')->with('region');
+        $this->model->convertDataObjectToModel($dataObjectMock, $addressMock);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Address/Shipping/ReadServiceTest.php b/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Address/Shipping/ReadServiceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..9c9f4f83871e4bbd503e9d7a1162181dedc80e7d
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Address/Shipping/ReadServiceTest.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\Checkout\Service\V1\Address\Shipping;
+
+class ReadServiceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var ReadService
+     */
+    protected $service;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $quoteLoaderMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $converterMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeManagerMock;
+
+    protected function setUp()
+    {
+        $this->quoteLoaderMock = $this->getMock('\Magento\Checkout\Service\V1\QuoteLoader', [], [], '', false);
+        $this->storeManagerMock = $this->getMock('\Magento\Store\Model\StoreManagerInterface');
+        $this->converterMock = $this->getMock('\Magento\Checkout\Service\V1\Address\Converter', [], [], '', false);
+
+        $storeMock = $this->getMock('\Magento\Store\Model\Store', [], [], '', false);
+        $storeMock->expects($this->any())->method('getId')->will($this->returnValue(123));
+        $this->storeManagerMock->expects($this->once())->method('getStore')->will($this->returnValue($storeMock));
+
+        $this->service = new ReadService($this->quoteLoaderMock, $this->converterMock, $this->storeManagerMock);
+    }
+
+    public function testGetAddress()
+    {
+        $quoteMock = $this->getMock('\Magento\Sales\Model\Quote', [], [], '', false);
+        $this->quoteLoaderMock->expects($this->once())->method('load')->with('cartId', '123')->will(
+            $this->returnValue($quoteMock)
+        );
+
+        $addressMock = $this->getMock('\Magento\Sales\Model\Quote\Address', [], [], '', false);
+        $quoteMock->expects($this->any())->method('getShippingAddress')->will($this->returnValue($addressMock));
+        $quoteMock->expects($this->any())->method('isVirtual')->will($this->returnValue(false));
+
+        $this->converterMock->expects($this->once())->method('convertModelToDataObject')
+            ->with($addressMock)->will($this->returnValue('ShippingAddress'));
+
+        $this->assertEquals('ShippingAddress', $this->service->getAddress('cartId'));
+    }
+
+    /**
+     * @expectedException \Exception
+     * @expectedExceptionMessage Cart contains virtual product(s) only. Shipping address is not applicable
+     */
+    public function testGetAddressOfQuoteWithVirtualProducts()
+    {
+        $quoteMock = $this->getMock('\Magento\Sales\Model\Quote', [], [], '', false);
+        $this->quoteLoaderMock->expects($this->once())->method('load')->with('cartId', '123')->will(
+            $this->returnValue($quoteMock)
+        );
+
+        $quoteMock->expects($this->any())->method('isVirtual')->will($this->returnValue(true));
+        $quoteMock->expects($this->never())->method('getShippingAddress');
+
+        $this->service->getAddress('cartId');
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Address/Shipping/WriteServiceTest.php b/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Address/Shipping/WriteServiceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..f51418ace4340005309e5e039f769fbba8d5bae7
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Address/Shipping/WriteServiceTest.php
@@ -0,0 +1,205 @@
+<?php
+/**
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Checkout\Service\V1\Address\Shipping;
+
+class WriteServiceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var WriteService
+     */
+    protected $service;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $quoteLoaderMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $addressFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $quoteAddressMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeManagerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $validatorMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $converterMock;
+
+    /**
+     * @var \Magento\TestFramework\Helper\ObjectManager
+     */
+    protected $objectManager;
+
+    protected function setUp()
+    {
+        $this->quoteLoaderMock = $this->getMock('\Magento\Checkout\Service\V1\QuoteLoader', [], [], '', false);
+        $this->storeManagerMock = $this->getMock('\Magento\Store\Model\StoreManagerInterface');
+        $this->addressFactoryMock = $this->getMock(
+            '\Magento\Sales\Model\Quote\AddressFactory', ['create', '__wakeup'], [], '', false
+        );
+
+        $this->objectManager = new \Magento\TestFramework\Helper\ObjectManager($this);
+        $this->quoteAddressMock = $this->getMock(
+            '\Magento\Sales\Model\Quote\Address',
+            ['getCustomerId', 'load', 'getData', 'setData', 'setStreet', 'setRegionId', 'setRegion', '__wakeup'],
+            [],
+            '',
+            false
+        );
+        $this->addressFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->quoteAddressMock));
+
+        $this->validatorMock = $this->getMock(
+            '\Magento\Checkout\Service\V1\Address\Validator', [], [], '', false
+        );
+
+        $this->converterMock = $this->getMock(
+            '\Magento\Checkout\Service\V1\Address\Converter', [], [], '', false
+        );
+
+        $this->service = $this->objectManager->getObject(
+            '\Magento\Checkout\Service\V1\Address\Shipping\WriteService',
+            [
+                'quoteLoader' => $this->quoteLoaderMock,
+                'storeManager' => $this->storeManagerMock,
+                'quoteAddressFactory' => $this->addressFactoryMock,
+                'addressValidator' => $this->validatorMock,
+                'addressConverter' => $this->converterMock,
+            ]
+        );
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\NoSuchEntityException
+     * @expected ExceptionMessage error345
+     */
+    public function testSetAddressValidationFailed()
+    {
+        $storeId = 554;
+        $storeMock = $this->getMock('\Magento\Store\Model\Store', [], [], '', false);
+        $storeMock->expects($this->once())->method('getId')->will($this->returnValue($storeId));
+        $this->storeManagerMock->expects($this->once())->method('getStore')->will($this->returnValue($storeMock));
+
+        $quoteMock = $this->getMock('\Magento\Sales\Model\Quote', [], [], '', false);
+        $this->quoteLoaderMock->expects($this->once())
+            ->method('load')
+            ->with('cart654', $storeId)
+            ->will($this->returnValue($quoteMock));
+
+        $this->validatorMock->expects($this->once())->method('validate')
+            ->will($this->throwException(new \Magento\Framework\Exception\NoSuchEntityException('error345')));
+
+        $this->service->setAddress('cart654', null);
+    }
+
+    public function testSetAddress()
+    {
+        $storeId = 323;
+        $storeMock = $this->getMock('\Magento\Store\Model\Store', [], [], '', false);
+        $storeMock->expects($this->once())->method('getId')->will($this->returnValue($storeId));
+        $this->storeManagerMock->expects($this->once())->method('getStore')->will($this->returnValue($storeMock));
+
+        $quoteMock = $this->getMock('\Magento\Sales\Model\Quote', [], [], '', false);
+        $this->quoteLoaderMock->expects($this->once())
+            ->method('load')
+            ->with('cart867', $storeId)
+            ->will($this->returnValue($quoteMock));
+        $quoteMock->expects($this->once())->method('isVirtual')->will($this->returnValue(false));
+
+        /** @var \Magento\Checkout\Service\V1\Data\Cart\AddressBuilder $addressDataBuilder */
+        $addressDataBuilder = $this->objectManager->getObject('Magento\Checkout\Service\V1\Data\Cart\AddressBuilder');
+
+        /** @var \Magento\Checkout\Service\V1\Data\Cart\Address $addressData */
+        $addressData = $addressDataBuilder->setId(356)->create();
+
+        $this->validatorMock->expects($this->once())->method('validate')
+            ->with($addressData)
+            ->will($this->returnValue(true));
+
+        $this->converterMock->expects($this->once())->method('convertDataObjectToModel')
+            ->with($addressData, $this->quoteAddressMock)
+            ->will($this->returnValue($this->quoteAddressMock));
+
+        $quoteMock->expects($this->once())->method('setShippingAddress')->with($this->quoteAddressMock);
+        $quoteMock->expects($this->once())->method('setDataChanges')->with(true);
+        $quoteMock->expects($this->once())->method('save');
+
+        $addressId = 1;
+        $shippingAddressMock = $this->getMock('\Magento\Sales\Model\Quote\Address', [], [], '', false);
+        $shippingAddressMock->expects($this->once())->method('getId')->will($this->returnValue($addressId));
+        $quoteMock->expects($this->once())->method('getShippingAddress')
+            ->will($this->returnValue($shippingAddressMock));
+
+        $this->assertEquals($addressId, $this->service->setAddress('cart867', $addressData));
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\NoSuchEntityException
+     * @expectedExceptionMessage Cart contains virtual product(s) only. Shipping address is not applicable
+     */
+    public function testSetAddressForVirtualProduct()
+    {
+        $storeId = 323;
+        $storeMock = $this->getMock('\Magento\Store\Model\Store', [], [], '', false);
+        $storeMock->expects($this->once())->method('getId')->will($this->returnValue($storeId));
+        $this->storeManagerMock->expects($this->once())->method('getStore')->will($this->returnValue($storeMock));
+
+        $quoteMock = $this->getMock('\Magento\Sales\Model\Quote', [], [], '', false);
+        $this->quoteLoaderMock->expects($this->once())
+            ->method('load')
+            ->with('cart867', $storeId)
+            ->will($this->returnValue($quoteMock));
+        $quoteMock->expects($this->once())->method('isVirtual')->will($this->returnValue(true));
+
+        /** @var \Magento\Checkout\Service\V1\Data\Cart\AddressBuilder $addressDataBuilder */
+        $addressDataBuilder = $this->objectManager->getObject('Magento\Checkout\Service\V1\Data\Cart\AddressBuilder');
+
+        /** @var \Magento\Checkout\Service\V1\Data\Cart\Address $addressData */
+        $addressData = $addressDataBuilder->setId(356)->create();
+
+        $this->validatorMock->expects($this->never())->method('validate');
+
+        $quoteMock->expects($this->never())->method('setShippingAddress');
+        $quoteMock->expects($this->never())->method('save');
+
+        $this->service->setAddress('cart867', $addressData);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Address/ValidatorTest.php b/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Address/ValidatorTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..7b81d325859220382479b8fe2a4bd577e70b1963
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Address/ValidatorTest.php
@@ -0,0 +1,224 @@
+<?php
+/**
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Checkout\Service\V1\Address;
+
+use \Magento\Checkout\Service\V1\Data\Cart\Address;
+use \Magento\Checkout\Service\V1\Data\Cart\Address\Region;
+
+class ValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Checkout\Service\V1\Address\Validator
+     */
+    protected $model;
+
+    /**
+     * @var \Magento\TestFramework\Helper\ObjectManager
+     */
+    protected $objectManager;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $addressFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $customerFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $quoteAddressMock;
+
+    /**
+     * @var \Magento\Checkout\Service\V1\Data\Cart\AddressBuilder
+     */
+    protected $addressDataBuilder;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $customerMock;
+
+    public function setUp()
+    {
+        $this->objectManager = new \Magento\TestFramework\Helper\ObjectManager($this);
+
+        $this->addressFactoryMock = $this->getMock(
+            '\Magento\Sales\Model\Quote\AddressFactory', ['create', '__wakeup'], [], '', false
+        );
+        $this->quoteAddressMock = $this->getMock(
+            '\Magento\Sales\Model\Quote\Address',
+            ['getCustomerId', 'load', 'getId', '__wakeup'],
+            [],
+            '',
+            false
+        );
+        $this->customerFactoryMock = $this->getMock(
+            '\Magento\Customer\Model\CustomerFactory', ['create', '__wakeup'], [], '', false)
+        ;
+        $this->customerMock = $this->getMock('\Magento\Customer\Model\Customer', [], [], '', false);
+
+        $this->addressDataBuilder = $this->objectManager->getObject(
+            '\Magento\Checkout\Service\V1\Data\Cart\AddressBuilder'
+        );
+
+        $this->model = $this->objectManager->getObject(
+            '\Magento\Checkout\Service\V1\Address\Validator',
+            [
+                'quoteAddressFactory' => $this->addressFactoryMock,
+                'customerFactory' => $this->customerFactoryMock,
+            ]
+        );
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\NoSuchEntityException
+     * @expectedExceptionMessage Invalid customer id 100
+     */
+    public function testValidateInvalidCustomer()
+    {
+        $customerId = 100;
+
+        $this->customerFactoryMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($this->customerMock));
+
+        $this->customerMock->expects($this->once())->method('load')->with($customerId);
+        $this->customerMock->expects($this->once())->method('getId')->will($this->returnValue(null));
+
+        $addressData = $this->addressDataBuilder
+            ->setCustomerId($customerId)
+            ->setCompany('eBay Inc')
+            ->create();
+        $this->model->validate($addressData);
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\NoSuchEntityException
+     * @expectedExceptionMessage Invalid address id 101
+     */
+    public function testValidateInvalidAddress()
+    {
+        $this->customerFactoryMock->expects($this->never())->method('create');
+        $this->customerMock->expects($this->never())->method('load');
+
+        $this->addressFactoryMock->expects($this->once())->method('create')
+            ->will($this->returnValue($this->quoteAddressMock));
+
+
+        $addressData = $this->addressDataBuilder
+            ->setId(101)
+            ->setCompany('eBay Inc')
+            ->create();
+        $this->model->validate($addressData);
+    }
+
+    /**
+     * Neither customer id used nor address id exists
+     */
+    public function testValidateNewAddress()
+    {
+        $this->customerFactoryMock->expects($this->never())->method('create');
+        $this->addressFactoryMock->expects($this->never())->method('create');
+
+        $addressData = $this->addressDataBuilder->setCompany('eBay Inc')->create();
+        $this->assertTrue($this->model->validate($addressData));
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\InputException
+     * @expectedExceptionMessage Address with id 100 belongs to another customer
+     */
+    public function testValidateWithAddressOfOtherCustomer()
+    {
+        $addressCustomer = 100;
+        $addressId = 100;
+
+        /** Address data object */
+        $addressData = $this->addressDataBuilder
+            ->setId($addressId)
+            ->setCompany('eBay Inc')
+            ->setCustomerId($addressCustomer)
+            ->create();
+
+        /** Customer mock */
+        $this->customerFactoryMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($this->customerMock));
+
+        $this->customerMock->expects($this->once())->method('load')->with($addressCustomer);
+        $this->customerMock->expects($this->once())->method('getId')->will($this->returnValue($addressCustomer));
+
+        /** Quote address mock */
+        $this->addressFactoryMock->expects($this->once())->method('create')
+            ->will($this->returnValue($this->quoteAddressMock));
+
+        $this->quoteAddressMock->expects($this->once())->method('load')->with($addressId);
+        $this->quoteAddressMock->expects($this->once())->method('getId')->will($this->returnValue($addressId));
+        $this->quoteAddressMock->expects($this->any())->method('getCustomerId')
+            ->will($this->returnValue(10));
+
+        /** Validate */
+        $this->model->validate($addressData);
+    }
+
+
+    public function testValidateWithValidAddress()
+    {
+        $addressCustomer = 100;
+        $addressId = 100;
+
+        /** Address data object */
+        $addressData = $this->addressDataBuilder
+            ->setId($addressId)
+            ->setCompany('eBay Inc')
+            ->setCustomerId($addressCustomer)
+            ->create();
+
+        /** Customer mock */
+        $this->customerFactoryMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($this->customerMock));
+
+        $this->customerMock->expects($this->once())->method('load')->with($addressCustomer);
+        $this->customerMock->expects($this->once())->method('getId')->will($this->returnValue($addressCustomer));
+
+        /** Quote address mock */
+        $this->addressFactoryMock->expects($this->once())->method('create')
+            ->will($this->returnValue($this->quoteAddressMock));
+
+        $this->quoteAddressMock->expects($this->once())->method('load')->with($addressId);
+        $this->quoteAddressMock->expects($this->once())->method('getId')->will($this->returnValue($addressId));
+        $this->quoteAddressMock->expects($this->any())->method('getCustomerId')
+            ->will($this->returnValue($addressCustomer));
+
+        /** Validate */
+        $this->model->validate($addressData);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Cart/ReadServiceTest.php b/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Cart/ReadServiceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..063530e44c69262b785e83639761c329ba9b06b0
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Cart/ReadServiceTest.php
@@ -0,0 +1,380 @@
+<?php
+/** 
+ * 
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Checkout\Service\V1\Cart;
+
+use \Magento\Checkout\Service\V1\Data\Cart;
+use \Magento\Checkout\Service\V1\Data\Cart\Totals;
+use \Magento\Checkout\Service\V1\Data\Cart\Customer;
+use \Magento\Framework\Service\V1\Data\SearchCriteria;
+use \Magento\Checkout\Service\V1\Data\Cart\Currency;
+
+class ReadServiceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var ReadService
+     */
+    protected $service;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $quoteFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $quoteCollectionMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $cartBuilderMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $searchResultsBuilderMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $totalsBuilderMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $customerBuilderMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $currencyBuilderMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $quoteMock;
+
+    protected function setUp()
+    {
+        $objectManager = new \Magento\TestFramework\Helper\ObjectManager($this);
+        $this->quoteFactoryMock =
+            $this->getMock('\Magento\Sales\Model\QuoteFactory', ['create'], [], '', false);
+        $methods = [
+            'getId', 'getStoreId', 'getCreatedAt', 'getUpdatedAt', 'getConvertedAt',
+            'getIsActive', 'getIsVirtual', 'getItemsCount', 'getItemsQty', 'getCheckoutMethod', 'getReservedOrderId',
+            'getOrigOrderId', 'getBaseGrandTotal', 'getBaseSubtotal', 'getSubtotal', 'getBaseSubtotalWithDiscount',
+            'getSubtotalWithDiscount', 'getCustomerId', 'getCustomerEmail', 'getCustomerGroupId',
+            'getCustomerTaxClassId', 'getCustomerPrefix', 'getCustomerFirstname', 'getCustomerMiddlename',
+            'getCustomerLastname', 'getCustomerSuffix', 'getCustomerDob', 'getCustomerNote', 'getCustomerNoteNotify',
+            'getCustomerIsGuest', 'getCustomerGender', 'getCustomerTaxvat', '__wakeup', 'load', 'getGrandTotal',
+            'getGlobalCurrencyCode', 'getBaseCurrencyCode', 'getStoreCurrencyCode', 'getQuoteCurrencyCode',
+            'getStoreToBaseRate', 'getStoreToQuoteRate', 'getBaseToGlobalRate', 'getBaseToQuoteRate',
+        ];
+        $this->quoteMock = $this->getMock('\Magento\Sales\Model\Quote', $methods, [], '', false);
+        $this->quoteCollectionMock = $objectManager->getCollectionMock(
+            '\Magento\Sales\Model\Resource\Quote\Collection', [$this->quoteMock]);
+        $this->cartBuilderMock =
+            $this->getMock('\Magento\Checkout\Service\V1\Data\CartBuilder', [], [], '', false);
+        $this->searchResultsBuilderMock =
+            $this->getMock('\Magento\Checkout\Service\V1\Data\CartSearchResultsBuilder', [], [], '', false);
+        $this->totalsBuilderMock =
+            $this->getMock('\Magento\Checkout\Service\V1\Data\Cart\TotalsBuilder', [], [], '', false);
+        $this->customerBuilderMock =
+            $this->getMock('\Magento\Checkout\Service\V1\Data\Cart\CustomerBuilder', [], [], '', false);
+        $this->currencyBuilderMock =
+            $this->getMock('\Magento\Checkout\Service\V1\Data\Cart\CurrencyBuilder', [], [], '', false);
+
+        $this->service = new ReadService(
+            $this->quoteFactoryMock,
+            $this->quoteCollectionMock,
+            $this->cartBuilderMock,
+            $this->searchResultsBuilderMock,
+            $this->totalsBuilderMock,
+            $this->customerBuilderMock,
+            $this->currencyBuilderMock
+        );
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\NoSuchEntityException
+     * @expectedExceptionMessage There is no cart with provided ID.
+     */
+    public function testGetCartWithNoSuchEntityException()
+    {
+        $cartId = 12;
+        $this->quoteFactoryMock->expects($this->once())->method('create')->will($this->returnValue($this->quoteMock));
+        $this->quoteMock->expects($this->once())
+            ->method('load')->with($cartId)->will($this->returnValue($this->quoteMock));
+        $this->quoteMock->expects($this->once())->method('getId')->will($this->returnValue(13));
+        $this->cartBuilderMock->expects($this->never())->method('populateWithArray');
+
+        $this->service->getCart($cartId);
+    }
+
+    public function testGetCartSuccess()
+    {
+        $cartId = 12;
+        $this->quoteFactoryMock->expects($this->once())->method('create')->will($this->returnValue($this->quoteMock));
+        $this->quoteMock->expects($this->once())
+            ->method('load')->with($cartId)->will($this->returnValue($this->quoteMock));
+        $this->quoteMock->expects($this->any())->method('getId')->will($this->returnValue($cartId));
+        $this->cartBuilderMock->expects($this->once())->method('populateWithArray');
+        $this->totalsBuilderMock->expects($this->once())->method('populateWithArray');
+        $this->customerBuilderMock->expects($this->once())->method('populateWithArray');
+        $this->currencyBuilderMock->expects($this->once())->method('populateWithArray');
+        $this->cartBuilderMock->expects($this->once())->method('setCustomer');
+        $this->cartBuilderMock->expects($this->once())->method('setTotals');
+        $this->cartBuilderMock->expects($this->once())->method('setCurrency');
+        $this->cartBuilderMock->expects($this->once())->method('create');
+
+        $this->service->getCart($cartId);
+    }
+
+    /**
+     * @param int $direction
+     * @param string $expected
+     * @dataProvider getCartListSuccessDataProvider
+     */
+    public function testGetCartListSuccess($direction, $expected)
+    {
+        $searchResult = $this->getMock('\Magento\Checkout\Service\V1\Data\CartSearchResults', [], [], '', false);
+        $searchCriteriaMock = $this->getMock('\Magento\Framework\Service\V1\Data\SearchCriteria', [], [], '', false);
+        $customerMock = $this->getMock('Magento\Customer\Model\Customer', [], [], '', false);
+        $totalMock = $this->getMock('Magento\Sales\Model\Order\Total', [], [], '', false);
+        $cartMock = $this->getMock('Magento\Payment\Model\Cart', [], [], '', false);
+        $currencyMock = $this->getMock('Magento\Checkout\Service\V1\Data\Cart\Currency', [], [], '', false);
+        $this->searchResultsBuilderMock
+            ->expects($this->once())
+            ->method('setSearchCriteria')
+            ->will($this->returnValue($searchCriteriaMock));
+        $filterGroupMock = $this->getMock('\Magento\Framework\Service\V1\Data\Search\FilterGroup', [], [], '', false);
+        $searchCriteriaMock
+            ->expects($this->any())
+            ->method('getFilterGroups')
+            ->will($this->returnValue([$filterGroupMock]));
+        $filterMock = $this->getMock('\Magento\Framework\Service\V1\Data\Filter', [], [], '', false);
+        $filterGroupMock->expects($this->any())->method('getFilters')->will($this->returnValue([$filterMock]));
+        $filterMock->expects($this->once())->method('getField')->will($this->returnValue('store_id'));
+        $filterMock->expects($this->any())->method('getConditionType')->will($this->returnValue('eq'));
+        $filterMock->expects($this->once())->method('getValue')->will($this->returnValue('filter_value'));
+        $this->quoteCollectionMock
+            ->expects($this->once())
+            ->method('addFieldToFilter')
+            ->with(['store_id'], [0 => ['eq' => 'filter_value']]);
+
+        $this->quoteCollectionMock->expects($this->once())->method('getSize')->will($this->returnValue(10));
+        $this->searchResultsBuilderMock->expects($this->once())->method('setTotalCount')->with(10);
+
+        $searchCriteriaMock
+            ->expects($this->once())
+            ->method('getSortOrders')
+            ->will($this->returnValue(['id' => $direction]));
+        $this->quoteCollectionMock->expects($this->once())->method('addOrder')->with('entity_id', $expected);
+        $searchCriteriaMock->expects($this->once())->method('getCurrentPage')->will($this->returnValue(1));
+        $searchCriteriaMock->expects($this->once())->method('getPageSize')->will($this->returnValue(10));
+        $this->getTotalData();
+        $this->getCartData();
+        $this->getCustomerData();
+        $this->setCurrencyDataExpectations();
+        $this->currencyBuilderMock->expects($this->once())->method('create')->will($this->returnValue($currencyMock));
+        $this->cartBuilderMock->expects($this->once())->method('setCurrency')->with($currencyMock);
+
+        $this->customerBuilderMock->expects($this->once())->method('create')->will($this->returnValue($customerMock));
+        $this->cartBuilderMock->expects($this->once())->method('setCustomer')->with($customerMock);
+        $this->totalsBuilderMock->expects($this->once())->method('create')->will($this->returnValue($totalMock));
+        $this->cartBuilderMock->expects($this->once())->method('setTotals')->will($this->returnValue($totalMock));
+        $this->cartBuilderMock->expects($this->once())->method('create')->will($this->returnValue($cartMock));
+        $this->searchResultsBuilderMock->expects($this->once())->method('setItems')->with([$cartMock]);
+        $this->searchResultsBuilderMock
+            ->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($searchResult));
+        $this->assertEquals($searchResult, $this->service->getCartList($searchCriteriaMock));
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\InputException
+     * @expectedExceptionMessage Field 'any_value' cannot be used for search.
+     */
+    public function testGetCartListWithNotExistingField()
+    {
+        $searchCriteriaMock = $this->getMock('\Magento\Framework\Service\V1\Data\SearchCriteria', [], [], '', false);
+        $this->searchResultsBuilderMock
+            ->expects($this->once())
+            ->method('setSearchCriteria')
+            ->will($this->returnValue($searchCriteriaMock));
+
+        $filterGroupMock = $this->getMock('\Magento\Framework\Service\V1\Data\Search\FilterGroup', [], [], '', false);
+        $searchCriteriaMock
+            ->expects($this->any())
+            ->method('getFilterGroups')
+            ->will($this->returnValue([$filterGroupMock]));
+        $filterMock = $this->getMock('\Magento\Framework\Service\V1\Data\Filter', [], [], '', false);
+        $filterGroupMock->expects($this->any())->method('getFilters')->will($this->returnValue([$filterMock]));
+        $filterMock->expects($this->once())->method('getField')->will($this->returnValue('any_value'));
+        $filterMock->expects($this->never())->method('getConditionType');
+        $this->service->getCartList($searchCriteriaMock);
+    }
+
+    public function getCartListSuccessDataProvider()
+    {
+        return [
+            'asc' => [SearchCriteria::SORT_ASC, 'ASC'],
+            'desc' => [SearchCriteria::SORT_DESC, 'DESC']
+        ];
+    }
+
+    protected function getCartData()
+    {
+        $expected = [
+            Cart::ID => 10,
+            Cart::STORE_ID => 1,
+            Cart::CREATED_AT => '2014-04-02 12:28:50',
+            Cart::UPDATED_AT => '2014-04-02 12:28:50',
+            Cart::CONVERTED_AT => '2014-04-02 12:28:50',
+            Cart::IS_ACTIVE => true,
+            Cart::IS_VIRTUAL => false,
+            Cart::ITEMS_COUNT => 10,
+            Cart::ITEMS_QUANTITY => 15,
+            Cart::CHECKOUT_METHOD => 'check mo',
+            Cart::RESERVED_ORDER_ID => 'order_id',
+            Cart::ORIG_ORDER_ID => 'orig_order_id'
+        ];
+        $expectedMethods = [
+            'getId' => 10,
+            'getStoreId' => 1,
+            'getCreatedAt' => '2014-04-02 12:28:50',
+            'getUpdatedAt' => '2014-04-02 12:28:50',
+            'getConvertedAt' => '2014-04-02 12:28:50',
+            'getIsActive' => true,
+            'getIsVirtual' => false,
+            'getItemsCount' => 10,
+            'getItemsQty' => 15,
+            'getCheckoutMethod' => 'check mo',
+            'getReservedOrderId' => 'order_id',
+            'getOrigOrderId' => 'orig_order_id'
+        ];
+        foreach ($expectedMethods as $method => $value) {
+            $this->quoteMock->expects($this->once())->method($method)->will($this->returnValue($value));
+        }
+        $this->cartBuilderMock->expects($this->once())->method('populateWithArray')->with($expected);
+    }
+
+    protected function getTotalData()
+    {
+        $expected = [
+            Totals::BASE_GRAND_TOTAL => 100,
+            Totals::GRAND_TOTAL => 150,
+            Totals::BASE_SUBTOTAL => 150,
+            Totals::SUBTOTAL => 150,
+            Totals::BASE_SUBTOTAL_WITH_DISCOUNT => 120,
+            Totals::SUBTOTAL_WITH_DISCOUNT => 120,
+        ];
+        $expectedMethods = [
+            'getBaseGrandTotal' => 100,
+            'getGrandTotal' => 150,
+            'getBaseSubtotal' => 150,
+            'getSubtotal' => 150,
+            'getBaseSubtotalWithDiscount' => 120,
+            'getSubtotalWithDiscount' => 120
+        ];
+        foreach ($expectedMethods as $method => $value) {
+            $this->quoteMock->expects($this->once())->method($method)->will($this->returnValue($value));
+        }
+        $this->totalsBuilderMock->expects($this->once())->method('populateWithArray')->with($expected);
+    }
+
+    protected function getCustomerData()
+    {
+        $expected = [
+            Customer::ID => 10,
+            Customer::EMAIL => 'customer@example.com',
+            Customer::GROUP_ID => '4',
+            Customer::TAX_CLASS_ID => 10,
+            Customer::PREFIX => 'prefix_',
+            Customer::FIRST_NAME => 'First Name',
+            Customer::MIDDLE_NAME => 'Middle Name',
+            Customer::LAST_NAME => 'Last Name',
+            Customer::SUFFIX => 'suffix',
+            Customer::DOB => '1/1/1989',
+            Customer::NOTE => 'customer_note',
+            Customer::NOTE_NOTIFY => 'note_notify',
+            Customer::IS_GUEST => false,
+            Customer::GENDER => 'male',
+            Customer::TAXVAT => 'taxvat',
+            ];
+        $expectedMethods = [
+            'getCustomerId' => 10,
+            'getCustomerEmail' => 'customer@example.com',
+            'getCustomerGroupId' => 4,
+            'getCustomerTaxClassId' => 10,
+            'getCustomerPrefix' => 'prefix_',
+            'getCustomerFirstname' => 'First Name',
+            'getCustomerMiddlename' => 'Middle Name',
+            'getCustomerLastname' => 'Last Name',
+            'getCustomerSuffix' => 'suffix',
+            'getCustomerDob' => '1/1/1989',
+            'getCustomerNote' => 'customer_note',
+            'getCustomerNoteNotify' => 'note_notify',
+            'getCustomerIsGuest' => false,
+            'getCustomerGender' => 'male',
+            'getCustomerTaxvat' => 'taxvat',
+        ];
+        foreach ($expectedMethods as $method => $value) {
+            $this->quoteMock->expects($this->once())->method($method)->will($this->returnValue($value));
+        }
+        $this->customerBuilderMock->expects($this->once())->method('populateWithArray')->with($expected);
+    }
+
+    protected function setCurrencyDataExpectations()
+    {
+        $expected = [
+            Currency::GLOBAL_CURRENCY_CODE => 'USD',
+            Currency::BASE_CURRENCY_CODE => 'EUR',
+            Currency::STORE_CURRENCY_CODE => 'USD',
+            Currency::QUOTE_CURRENCY_CODE => 'EUR',
+            Currency::STORE_TO_BASE_RATE => 1,
+            Currency::STORE_TO_QUOTE_RATE => 2,
+            Currency::BASE_TO_GLOBAL_RATE => 3,
+            Currency::BASE_TO_QUOTE_RATE => 4,
+        ];
+        $expectedMethods = [
+            'getGlobalCurrencyCode' => 'USD',
+            'getBaseCurrencyCode' => 'EUR',
+            'getStoreCurrencyCode' => 'USD',
+            'getQuoteCurrencyCode' => 'EUR',
+            'getStoreToBaseRate' => 1,
+            'getStoreToQuoteRate' => 2,
+            'getBaseToGlobalRate' => 3,
+            'getBaseToQuoteRate' => 4,
+        ];
+        foreach ($expectedMethods as $method => $value) {
+            $this->quoteMock->expects($this->once())->method($method)->will($this->returnValue($value));
+        }
+        $this->currencyBuilderMock->expects($this->once())->method('populateWithArray')->with($expected);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Cart/WriteServiceTest.php b/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Cart/WriteServiceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..cdfe50596c66e5d56caa49317792e216e4e1f0b3
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Cart/WriteServiceTest.php
@@ -0,0 +1,268 @@
+<?php
+/**
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Checkout\Service\V1\Cart;
+
+use Magento\TestFramework\Helper\ObjectManager;
+use Magento\Framework\Exception\CouldNotSaveException;
+
+class WriteServiceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Checkout\Service\V1\Cart\WriteService
+     */
+    protected $service;
+
+    /**
+     * @var \Magento\TestFramework\Helper\ObjectManager
+     */
+    protected $objectManager;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $quoteFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeManagerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $quoteMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $customerRegistryMock;
+
+    public function setUp()
+    {
+        $this->objectManager = new ObjectManager($this);
+        $this->quoteFactoryMock = $this->getMock(
+            '\Magento\Sales\Model\QuoteFactory', ['create', '__wakeup'], [], '', false
+        );
+        $this->storeManagerMock = $this->getMock('\Magento\Store\Model\StoreManagerInterface', [], [], '', false);
+
+        $this->storeMock = $this->getMock('\Magento\Store\Model\Store', [], [], '', false);
+        $this->quoteMock =
+            $this->getMock('\Magento\Sales\Model\Quote',
+                [
+                    'setStoreId',
+                    'save',
+                    'load',
+                    'getId',
+                    'getStoreId',
+                    'getCustomerId',
+                    'setCustomer',
+                    'setCustomerIsGuest',
+                    '__wakeup'
+                ],
+                [], '', false);
+
+        $this->customerRegistryMock =
+            $this->getMock('\Magento\Customer\Model\CustomerRegistry', [], [], '', false);
+        $this->service = $this->objectManager->getObject(
+            '\Magento\Checkout\Service\V1\Cart\WriteService',
+            [
+                'quoteFactory' => $this->quoteFactoryMock,
+                'storeManager' => $this->storeManagerMock,
+                'customerRegistry' => $this->customerRegistryMock
+            ]
+        );
+    }
+
+    public function testCreate()
+    {
+        $storeId = 345;
+
+        $this->storeManagerMock->expects($this->once())->method('getStore')->will($this->returnValue($this->storeMock));
+        $this->storeMock->expects($this->once())->method('getId')->will($this->returnValue($storeId));
+
+        $this->quoteFactoryMock->expects($this->once())->method('create')->will($this->returnValue($this->quoteMock));
+        $this->quoteMock->expects($this->once())->method('setStoreId')->with($storeId);
+        $this->quoteMock->expects($this->once())->method('save');
+
+        $this->service->create();
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\CouldNotSaveException
+     * @expectedExceptionMessage Cannot create quote
+     */
+    public function testCreateWithException()
+    {
+        $storeId = 345;
+
+        $this->storeManagerMock->expects($this->once())->method('getStore')->will($this->returnValue($this->storeMock));
+        $this->storeMock->expects($this->once())->method('getId')->will($this->returnValue($storeId));
+
+        $this->quoteFactoryMock->expects($this->once())->method('create')->will($this->returnValue($this->quoteMock));
+        $this->quoteMock->expects($this->once())->method('setStoreId')->with($storeId);
+        $this->quoteMock->expects($this->once())->method('save')
+            ->will($this->throwException(new CouldNotSaveException('Cannot create quote')));
+
+        $this->service->create();
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\NoSuchEntityException
+     * @expectedExceptionMessage There is no cart with provided ID.
+     */
+    public function testAssignCustomerNoSuchEntityExceptionByCartId()
+    {
+        $cartId = 956;
+        $customerId = 125;
+        $storeId = 12;
+
+        $this->storeManagerMock->expects($this->once())->method('getStore')->will($this->returnValue($this->storeMock));
+        $this->storeMock->expects($this->once())->method('getId')->will($this->returnValue($storeId));
+        $this->quoteFactoryMock->expects($this->once())->method('create')->will($this->returnValue($this->quoteMock));
+        $this->quoteMock->expects($this->once())
+            ->method('load')->with($cartId)->will($this->returnValue($this->quoteMock));
+        $this->quoteMock->expects($this->once())->method('getId')->will($this->returnValue(33));
+        $customerRegistryMock =
+            $this->getMock('\Magento\Customer\Model\CustomerRegistry', [], [], '', false);
+        $customerRegistryMock->expects($this->never())->method('retrieve');
+
+        $this->service->assignCustomer($cartId, $customerId);
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\NoSuchEntityException
+     * @expectedExceptionMessage There is no cart with provided ID.
+     */
+    public function testAssignCustomerNoSuchEntityExceptionByStoreId()
+    {
+        $cartId = 956;
+        $customerId = 125;
+        $storeId = 12;
+
+        $this->storeManagerMock->expects($this->once())->method('getStore')->will($this->returnValue($this->storeMock));
+        $this->storeMock->expects($this->once())->method('getId')->will($this->returnValue($storeId));
+        $this->quoteFactoryMock->expects($this->once())->method('create')->will($this->returnValue($this->quoteMock));
+        $this->quoteMock->expects($this->once())
+            ->method('load')->with($cartId)->will($this->returnValue($this->quoteMock));
+        $this->quoteMock->expects($this->once())->method('getId')->will($this->returnValue($cartId));
+        $this->quoteMock->expects($this->once())->method('getStoreId')->will($this->returnValue(99));
+
+        $this->customerRegistryMock->expects($this->never())->method('retrieve');
+
+        $this->service->assignCustomer($cartId, $customerId);
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\StateException
+     * @expectedExceptionMessage Cannot assign customer to the given cart. The cart belongs to different store.
+     */
+    public function testAssignCustomerStateExceptionWithStoreId()
+    {
+        $cartId = 956;
+        $customerId = 125;
+        $storeId = 12;
+
+        $this->storeManagerMock->expects($this->once())->method('getStore')->will($this->returnValue($this->storeMock));
+        $this->storeMock->expects($this->once())->method('getId')->will($this->returnValue($storeId));
+        $this->quoteFactoryMock->expects($this->once())->method('create')->will($this->returnValue($this->quoteMock));
+        $this->quoteMock->expects($this->once())
+            ->method('load')->with($cartId)->will($this->returnValue($this->quoteMock));
+        $this->quoteMock->expects($this->once())->method('getId')->will($this->returnValue($cartId));
+        $this->quoteMock->expects($this->once())->method('getStoreId')->will($this->returnValue($storeId));
+        $customerMock = $this->getMock('\Magento\Customer\Model\Customer', [], [], '', false);
+        $this->customerRegistryMock->expects($this->once())
+            ->method('retrieve')->with($customerId)->will($this->returnValue($customerMock));
+        $customerMock->expects($this->once())->method('getSharedStoreIds')->will($this->returnValue([11]));
+
+        $this->service->assignCustomer($cartId, $customerId);
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\StateException
+     * @expectedExceptionMessage Cannot assign customer to the given cart. The cart is not anonymous.
+     */
+    public function testAssignCustomerStateExceptionWithCustomerId()
+    {
+        $cartId = 956;
+        $customerId = 125;
+        $storeId = 12;
+
+        $this->storeManagerMock->expects($this->once())->method('getStore')->will($this->returnValue($this->storeMock));
+        $this->storeMock->expects($this->once())->method('getId')->will($this->returnValue($storeId));
+        $this->quoteFactoryMock->expects($this->once())->method('create')->will($this->returnValue($this->quoteMock));
+        $this->quoteMock->expects($this->once())
+            ->method('load')->with($cartId)->will($this->returnValue($this->quoteMock));
+        $this->quoteMock->expects($this->once())->method('getId')->will($this->returnValue($cartId));
+        $this->quoteMock->expects($this->once())->method('getStoreId')->will($this->returnValue($storeId));
+        $customerMock = $this->getMock('\Magento\Customer\Model\Customer', [], [], '', false);
+        $this->customerRegistryMock->expects($this->once())
+            ->method('retrieve')->with($customerId)->will($this->returnValue($customerMock));
+        $customerMock->expects($this->once())->method('getSharedStoreIds')->will($this->returnValue([$storeId]));
+        $this->quoteMock->expects($this->once())->method('getCustomerId')->will($this->returnValue($customerId));
+        $this->quoteMock->expects($this->never())->method('setCustomer');
+
+        $this->service->assignCustomer($cartId, $customerId);
+    }
+
+    public function testAssignCustomer()
+    {
+        $cartId = 956;
+        $customerId = 125;
+        $storeId = 12;
+
+        $this->storeManagerMock->expects($this->once())->method('getStore')->will($this->returnValue($this->storeMock));
+        $this->storeMock->expects($this->once())->method('getId')->will($this->returnValue($storeId));
+        $this->quoteFactoryMock->expects($this->at(0))->method('create')->will($this->returnValue($this->quoteMock));
+        $this->quoteMock->expects($this->once())
+            ->method('load')->with($cartId)->will($this->returnValue($this->quoteMock));
+        $this->quoteMock->expects($this->once())->method('getId')->will($this->returnValue($cartId));
+        $this->quoteMock->expects($this->once())->method('getStoreId')->will($this->returnValue($storeId));
+        $customerMock = $this->getMock('\Magento\Customer\Model\Customer', [], [], '', false);
+        $this->customerRegistryMock->expects($this->once())
+            ->method('retrieve')->with($customerId)->will($this->returnValue($customerMock));
+
+        $customerQuoteMock = $this->getMock('\Magento\Sales\Model\Quote', [], [], '', false);
+        $customerQuoteMock->expects($this->once())->method('loadByCustomer')->with($customerMock)
+            ->will($this->returnSelf());
+        $this->quoteFactoryMock->expects($this->at(1))->method('create')->will($this->returnValue($customerQuoteMock));
+
+        $customerMock->expects($this->once())->method('getSharedStoreIds')->will($this->returnValue([$storeId]));
+        $this->quoteMock->expects($this->once())->method('getCustomerId')->will($this->returnValue(false));
+        $this->quoteMock->expects($this->once())
+            ->method('setCustomer')->with($customerMock)->will($this->returnValue($this->quoteMock));
+        $this->quoteMock->expects($this->once())
+            ->method('setCustomerIsGuest')->with(0)->will($this->returnValue($this->quoteMock));
+        $this->quoteMock->expects($this->once())->method('save')->will($this->returnValue($this->quoteMock));
+
+        $this->assertTrue($this->service->assignCustomer($cartId, $customerId));
+    }
+
+}
\ No newline at end of file
diff --git a/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Item/ReaderServiceTest.php b/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Item/ReaderServiceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..990691411db2d577fdb5b05189674455428c47f1
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Item/ReaderServiceTest.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\Checkout\Service\V1\Item;
+
+use \Magento\Checkout\Service\V1\Data\Cart\Item as Item;
+
+class ReaderServiceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var ReadService
+     */
+    protected $service;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $quoteLoaderMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $itemBuilderMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeManagerMock;
+
+    protected function setUp()
+    {
+        $this->quoteLoaderMock = $this->getMock('\Magento\Checkout\Service\V1\QuoteLoader', [], [], '', false);
+        $this->itemBuilderMock =
+            $this->getMock('\Magento\Checkout\Service\V1\Data\Cart\ItemBuilder', [], [], '', false);
+        $this->storeManagerMock = $this->getMock('\Magento\Store\Model\StoreManagerInterface');
+        $this->service = new ReadService($this->quoteLoaderMock, $this->itemBuilderMock, $this->storeManagerMock);
+    }
+
+    public  function testGetList()
+    {
+        $storeMock = $this->getMock('\Magento\Store\Model\Store', [], [], '', false);
+        $this->storeManagerMock->expects($this->once())->method('getStore')->will($this->returnValue($storeMock));
+        $storeMock->expects($this->once())->method('getId')->will($this->returnValue(11));
+        $quoteMock = $this->getMock('\Magento\Sales\Model\Quote', [], [], '', false);
+        $this->quoteLoaderMock->expects($this->once())->method('load')
+            ->with(33, 11)
+            ->will($this->returnValue($quoteMock));
+        $itemMock = $this->getMock('\Magento\Sales\Model\Quote\Item',
+            ['getSku', 'getName', 'getPrice', 'getQty', 'getProductType', '__wakeup'], [], '', false);
+        $quoteMock->expects($this->any())->method('getAllItems')->will($this->returnValue(array($itemMock)));
+        $itemMock->expects($this->any())->method('getSku')->will($this->returnValue('prd_SKU'));
+        $itemMock->expects($this->any())->method('getName')->will($this->returnValue('prd_NAME'));
+        $itemMock->expects($this->any())->method('getPrice')->will($this->returnValue(100.15));
+        $itemMock->expects($this->any())->method('getQty')->will($this->returnValue(16));
+        $itemMock->expects($this->any())->method('getProductType')->will($this->returnValue('simple'));
+        $testData = [
+            Item::SKU => 'prd_SKU',
+            Item::NAME => 'prd_NAME',
+            Item::PRICE => 100.15,
+            Item::QTY => 16,
+            Item::TYPE => 'simple',
+        ];
+        $this->itemBuilderMock->expects($this->once())
+            ->method('populateWithArray')
+            ->with($testData)
+            ->will($this->returnValue($this->itemBuilderMock));
+        $this->itemBuilderMock->expects($this->once())->method('create')->will($this->returnValue('Expected value'));
+
+        $this->assertEquals(array('Expected value'), $this->service->getList(33));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Item/WriteServiceTest.php b/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Item/WriteServiceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..ca0628c1f6da40a08e00e5d64ce4820ab2803a1c
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/Item/WriteServiceTest.php
@@ -0,0 +1,332 @@
+<?php
+/**
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Checkout\Service\V1\Item;
+
+class WriteServiceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var WriteService
+     */
+    protected $service;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $quoteLoaderMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $itemBuilderMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $productLoaderMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeManagerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $dataMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $quoteMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $productMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $quoteItemMock;
+
+    protected function setUp()
+    {
+        $this->quoteLoaderMock =
+            $this->getMock('\Magento\Checkout\Service\V1\QuoteLoader', [], [], '', false);
+        $this->itemBuilderMock =
+            $this->getMock('\Magento\Checkout\Service\V1\Data\Cart\ItemBuilder', [], [], '', false);
+        $this->productLoaderMock =
+            $this->getMock('\Magento\Catalog\Service\V1\Product\ProductLoader', [], [], '', false);
+        $this->storeManagerMock =
+            $this->getMock('\Magento\Store\Model\StoreManagerInterface');
+        $this->dataMock = $this->getMock('\Magento\Checkout\Service\V1\Data\Cart\Item', [], [], '', false);
+        $this->storeMock = $this->getMock('\Magento\Store\Model\Store', [], [], '', false);
+        $this->quoteMock = $this->getMock('\Magento\Sales\Model\Quote', [], [], '', false);
+        $this->productMock = $this->getMock('\Magento\Catalog\Model\Product', [], [], '', false);
+        $this->quoteItemMock = $this->getMock('\Magento\Sales\Model\Quote\Item', [], [], '', false);
+
+        $this->service = new WriteService($this->quoteLoaderMock, $this->itemBuilderMock,
+            $this->productLoaderMock, $this->storeManagerMock);
+    }
+
+    /**
+     * @param null|string|bool|int|float $value
+     * @expectedException \Magento\Framework\Exception\InputException
+     * @expectedExceptionMessage Invalid value of
+     * @dataProvider addItemWithInvalidQtyDataProvider
+     */
+    public function testAddItemWithInvalidQty($value)
+    {
+        $cartId = 12;
+        $this->dataMock->expects($this->once())->method('getQty')->will($this->returnValue($value));
+        $this->storeManagerMock->expects($this->never())->method('getStore');
+
+        $this->service->addItem($cartId, $this->dataMock);
+    }
+
+    public function addItemWithInvalidQtyDataProvider()
+    {
+        return array(
+            array('string'),
+            array(0),
+            array(''),
+            array(null),
+            array(-12),
+            array(false),
+            array(-13.1),
+        );
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\CouldNotSaveException
+     * @expectedExceptionMessage Could not add item to quote
+     */
+    public function testAddItemCouldNotSaveException()
+    {
+        $cartId = 13;
+        $this->dataMock->expects($this->once())->method('getQty')->will($this->returnValue(12));
+        $this->storeManagerMock->expects($this->once())->method('getStore')->will($this->returnValue($this->storeMock));
+        $this->storeMock->expects($this->once())->method('getId')->will($this->returnValue(0));
+        $this->quoteLoaderMock->expects($this->once())->method('load')
+            ->with($cartId, 0)->will($this->returnValue($this->quoteMock));
+        $this->dataMock->expects($this->once())->method('getSku')->will($this->returnValue('product_sku'));
+        $this->productLoaderMock->expects($this->once())
+            ->method('load')->with('product_sku')->will($this->returnValue($this->productMock));
+        $this->quoteMock->expects($this->once())->method('addProduct')->with($this->productMock, 12);
+        $this->quoteMock->expects($this->once())->method('collectTotals')->will($this->returnValue($this->quoteMock));
+        $exceptionMessage = 'Could not add item to quote';
+        $exception = new \Magento\Framework\Exception\CouldNotSaveException($exceptionMessage);
+        $this->quoteMock->expects($this->once())->method('save')->will($this->throwException($exception));
+
+        $this->service->addItem($cartId, $this->dataMock);
+    }
+
+    public function testAddItem()
+    {
+        $cartId = 13;
+        $this->dataMock->expects($this->once())->method('getQty')->will($this->returnValue(12));
+        $this->storeManagerMock->expects($this->once())->method('getStore')->will($this->returnValue($this->storeMock));
+        $this->storeMock->expects($this->once())->method('getId')->will($this->returnValue(0));
+        $this->quoteLoaderMock->expects($this->once())
+            ->method('load')->with($cartId, 0)->will($this->returnValue($this->quoteMock));
+        $this->productLoaderMock->expects($this->once())->method('load')->will($this->returnValue($this->productMock));
+        $this->dataMock->expects($this->once())->method('getSku');
+        $this->quoteMock->expects($this->once())->method('addProduct')->with($this->productMock, 12);
+        $this->quoteMock->expects($this->once())->method('collectTotals')->will($this->returnValue($this->quoteMock));
+        $this->quoteMock->expects($this->once())->method('save');
+
+        $this->assertTrue($this->service->addItem($cartId, $this->dataMock));
+    }
+
+    /**
+     * @param null|string|bool|int|float $value
+     * @expectedException \Magento\Framework\Exception\InputException
+     * @expectedExceptionMessage Invalid value of
+     * @dataProvider updateItemWithInvalidQtyDataProvider
+     */
+    public function testUpdateItemWithInvalidQty($value)
+    {
+        $cartId = 11;
+        $itemSku = 'item_sku';
+        $this->dataMock->expects($this->once())->method('getQty')->will($this->returnValue($value));
+        $this->storeManagerMock->expects($this->never())->method('getStore');
+        $this->service->updateItem($cartId, $itemSku, $this->dataMock);
+    }
+
+    public function updateItemWithInvalidQtyDataProvider()
+    {
+        return array(
+            array('string'),
+            array(0),
+            array(''),
+            array(null),
+            array(-12),
+            array(false),
+            array(-13.1),
+        );
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\NoSuchEntityException
+     * @expectedExceptionMessage Cart 11 doesn't contain product item_sku
+     */
+    public function testUpdateItemWithInvalidQuoteItem()
+    {
+        $cartId = 11;
+        $itemSku = 'item_sku';
+        $this->dataMock->expects($this->once())->method('getQty')->will($this->returnValue(12));
+        $this->storeManagerMock->expects($this->once())->method('getStore')->will($this->returnValue($this->storeMock));
+        $this->storeMock->expects($this->once())->method('getId')->will($this->returnValue(0));
+        $this->quoteLoaderMock->expects($this->once())
+            ->method('load')->with($cartId, 0)->will($this->returnValue($this->quoteMock));
+        $this->productLoaderMock->expects($this->once())
+            ->method('load')->with($itemSku)->will($this->returnValue($this->productMock));
+        $this->quoteMock->expects($this->once())
+            ->method('getItemByProduct')->with($this->productMock)->will($this->returnValue(false));
+        $this->quoteItemMock->expects($this->never())->method('setData');
+
+        $this->service->updateItem($cartId, $itemSku, $this->dataMock);
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\CouldNotSaveException
+     * @expectedExceptionMessage Could not update quote item
+     */
+    public function testUpdateItemWithCouldNotSaveException()
+    {
+        $cartId = 11;
+        $itemSku = 'item_sku';
+        $this->dataMock->expects($this->once())->method('getQty')->will($this->returnValue(12));
+        $this->storeManagerMock->expects($this->once())->method('getStore')->will($this->returnValue($this->storeMock));
+        $this->storeMock->expects($this->once())->method('getId')->will($this->returnValue(0));
+        $this->quoteLoaderMock->expects($this->once())
+            ->method('load')->with($cartId, 0)->will($this->returnValue($this->quoteMock));
+        $this->productLoaderMock->expects($this->once())
+            ->method('load')->with($itemSku)->will($this->returnValue($this->productMock));
+        $this->quoteMock->expects($this->once())
+            ->method('getItemByProduct')->with($this->productMock)->will($this->returnValue($this->quoteItemMock));
+        $this->quoteItemMock->expects($this->once())->method('setData')->with('qty', 12);
+        $this->quoteMock->expects($this->once())->method('collectTotals')->will($this->returnValue($this->quoteMock));
+        $exceptionMessage = 'Could not update quote item';
+        $exception = new \Magento\Framework\Exception\CouldNotSaveException($exceptionMessage);
+        $this->quoteMock->expects($this->once())->method('save')->will($this->throwException($exception));
+
+        $this->service->updateItem($cartId, $itemSku, $this->dataMock);
+    }
+
+    public function testUpdateItem()
+    {
+        $cartId = 11;
+        $itemSku = 'item_sku';
+        $this->dataMock->expects($this->once())->method('getQty')->will($this->returnValue(12));
+        $this->storeManagerMock->expects($this->once())->method('getStore')->will($this->returnValue($this->storeMock));
+        $this->storeMock->expects($this->once())->method('getId')->will($this->returnValue(0));
+        $this->quoteLoaderMock->expects($this->once())
+            ->method('load')->with($cartId, 0)->will($this->returnValue($this->quoteMock));
+        $this->productLoaderMock->expects($this->once())
+            ->method('load')->with($itemSku)->will($this->returnValue($this->productMock));
+        $this->quoteMock->expects($this->once())
+            ->method('getItemByProduct')->with($this->productMock)->will($this->returnValue($this->quoteItemMock));
+        $this->quoteItemMock->expects($this->once())->method('setData')->with('qty', 12);
+        $this->quoteMock->expects($this->once())->method('collectTotals')->will($this->returnValue($this->quoteMock));
+        $this->quoteMock->expects($this->once())->method('save')->will($this->returnValue($this->quoteMock));
+
+        $this->assertTrue($this->service->updateItem($cartId, $itemSku, $this->dataMock));
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\NoSuchEntityException
+     * @expectedExceptionMessage Cart 11 doesn't contain product item_sku
+     */
+    public function testRemoveItemWithInvalidQuoteItem()
+    {
+        $cartId = 11;
+        $itemSku = 'item_sku';
+        $this->storeManagerMock->expects($this->once())->method('getStore')->will($this->returnValue($this->storeMock));
+        $this->storeMock->expects($this->once())->method('getId')->will($this->returnValue(0));
+        $this->quoteLoaderMock->expects($this->once())
+            ->method('load')->with($cartId, 0)->will($this->returnValue($this->quoteMock));
+        $this->productLoaderMock->expects($this->once())
+            ->method('load')->with($itemSku)->will($this->returnValue($this->productMock));
+        $this->quoteMock->expects($this->once())
+            ->method('getItemByProduct')->with($this->productMock)->will($this->returnValue(false));
+        $this->quoteMock->expects($this->never())->method('removeItem');
+
+        $this->service->removeItem($cartId, $itemSku, $this->dataMock);
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\CouldNotSaveException
+     * @expectedExceptionMessage Could not remove item from quote
+     */
+    public function testRemoveItemWithCouldNotSaveException()
+    {
+        $cartId = 11;
+        $itemSku = 'item_sku';
+        $this->storeManagerMock->expects($this->once())->method('getStore')->will($this->returnValue($this->storeMock));
+        $this->storeMock->expects($this->once())->method('getId')->will($this->returnValue(0));
+        $this->quoteLoaderMock->expects($this->once())
+            ->method('load')->with($cartId, 0)->will($this->returnValue($this->quoteMock));
+        $this->productLoaderMock->expects($this->once())
+            ->method('load')->with($itemSku)->will($this->returnValue($this->productMock));
+        $this->quoteMock->expects($this->once())
+            ->method('getItemByProduct')->with($this->productMock)->will($this->returnValue($this->quoteItemMock));
+        $this->quoteItemMock->expects($this->once())->method('getId')->will($this->returnValue(33));
+        $this->quoteMock->expects($this->once())
+            ->method('removeItem')->with(33)->will($this->returnValue($this->quoteMock));
+        $this->quoteMock->expects($this->once())->method('collectTotals')->will($this->returnValue($this->quoteMock));
+        $exceptionMessage = 'Could not remove item from quote';
+        $exception = new \Magento\Framework\Exception\CouldNotSaveException($exceptionMessage);
+        $this->quoteMock->expects($this->once())->method('save')->will($this->throwException($exception));
+
+        $this->service->removeItem($cartId, $itemSku, $this->dataMock);
+    }
+
+    public function testRemoveItem()
+    {
+        $cartId = 11;
+        $itemSku = 'item_sku';
+        $this->storeManagerMock->expects($this->once())->method('getStore')->will($this->returnValue($this->storeMock));
+        $this->storeMock->expects($this->once())->method('getId')->will($this->returnValue(0));
+        $this->quoteLoaderMock->expects($this->once())
+            ->method('load')->with($cartId, 0)->will($this->returnValue($this->quoteMock));
+        $this->productLoaderMock->expects($this->once())
+            ->method('load')->with($itemSku)->will($this->returnValue($this->productMock));
+        $this->quoteMock->expects($this->once())
+            ->method('getItemByProduct')->with($this->productMock)->will($this->returnValue($this->quoteItemMock));
+        $this->quoteMock->expects($this->once())->method('removeItem');
+        $this->quoteItemMock->expects($this->once())->method('getId');
+        $this->quoteMock->expects($this->once())->method('collectTotals')->will($this->returnValue($this->quoteMock));
+        $this->quoteMock->expects($this->once())->method('save')->will($this->returnValue($this->quoteMock));
+
+        $this->assertTrue($this->service->removeItem($cartId, $itemSku, $this->dataMock));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/QuoteLoaderTest.php b/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/QuoteLoaderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..68e2bd150cd71a33dc777a045206f29e85949a02
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Checkout/Service/V1/QuoteLoaderTest.php
@@ -0,0 +1,81 @@
+<?php
+/**
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Checkout\Service\V1;
+
+class QuoteLoaderTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var QuoteLoader
+     */
+    protected $quoteLoader;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $quoteFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $quoteMock;
+
+    protected function setUp()
+    {
+        $this->quoteFactoryMock = $this->getMock('\Magento\Sales\Model\QuoteFactory', ['create'], [], '', false);
+        $this->quoteMock =
+            $this->getMock('\Magento\Sales\Model\Quote', ['setStoreId', 'load', 'getId', '__wakeup'], [], '', false);
+        $this->quoteLoader = new QuoteLoader($this->quoteFactoryMock);
+    }
+
+    public function testLoadWithId()
+    {
+        $storeId = 1;
+        $cartId = 45;
+        $this->quoteFactoryMock->expects($this->once())->method('create')->will($this->returnValue($this->quoteMock));
+        $this->quoteMock->expects($this->once())
+            ->method('setStoreId')->with($storeId)->will($this->returnValue($this->quoteMock));
+        $this->quoteMock->expects($this->once())->method('load')->with($cartId);
+        $this->quoteMock->expects($this->once())->method('getId')->will($this->returnValue(33));
+
+        $this->assertEquals($this->quoteMock, $this->quoteLoader->load($cartId, $storeId));
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\NoSuchEntityException
+     * @expectedExceptionMessage No such entity with cartId = 34
+     */
+    public function testLoadWithoutId()
+    {
+        $storeId = 12;
+        $cartId = 34;
+        $this->quoteFactoryMock->expects($this->once())->method('create')->will($this->returnValue($this->quoteMock));
+        $this->quoteMock->expects($this->once())
+            ->method('setStoreId')->with($storeId)->will($this->returnValue($this->quoteMock));
+        $this->quoteMock->expects($this->once())->method('load')->with($cartId);
+        $this->quoteMock->expects($this->once())->method('getId')->will($this->returnValue(false));
+        $this->quoteLoader->load($cartId, $storeId);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Model/Export/RowCustomizerTest.php b/dev/tests/unit/testsuite/Magento/ConfigurableImportExport/Model/Export/RowCustomizerTest.php
similarity index 97%
rename from dev/tests/unit/testsuite/Magento/ConfigurableProduct/Model/Export/RowCustomizerTest.php
rename to dev/tests/unit/testsuite/Magento/ConfigurableImportExport/Model/Export/RowCustomizerTest.php
index 87b43a19e22c8598e8cb2c411626bc1b023882d5..a4ee610edb8b93dce83362b5dc197f85885d632c 100644
--- a/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Model/Export/RowCustomizerTest.php
+++ b/dev/tests/unit/testsuite/Magento/ConfigurableImportExport/Model/Export/RowCustomizerTest.php
@@ -21,12 +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\ConfigurableProduct\Model\Export;
+namespace Magento\ConfigurableImportExport\Model\Export;
 
 class RowCustomizerTest extends \PHPUnit_Framework_TestCase
 {
     /**
-     * @var \Magento\CatalogImportExport\Model\Export\RowCustomizer
+     * @var \Magento\ConfigurableImportExport\Model\Export\RowCustomizer
      */
     protected $_model;
 
@@ -44,7 +44,7 @@ class RowCustomizerTest extends \PHPUnit_Framework_TestCase
             '',
             false
         );
-        $this->_model = new \Magento\CatalogImportExport\Model\Export\RowCustomizer;
+        $this->_model = new \Magento\ConfigurableImportExport\Model\Export\RowCustomizer;
     }
 
     public function testPrepareData()
diff --git a/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Service/V1/Data/OptionConverterTest.php b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Service/V1/Data/OptionConverterTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..4595b470f1518f48f6d9bee6f97243dfffb399a7
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Service/V1/Data/OptionConverterTest.php
@@ -0,0 +1,185 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Data;
+
+use Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute;
+use Magento\ConfigurableProduct\Model\Product\Type\Configurable\AttributeFactory;
+use Magento\TestFramework\Helper\ObjectManager;
+
+class OptionConverterTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\ConfigurableProduct\Service\V1\Data\OptionConverter
+     */
+    private $converter;
+
+    /**
+     * @var Attribute|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $configurableAttribute;
+
+    /**
+     * @var \Magento\ConfigurableProduct\Service\V1\Data\Option|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $option;
+
+    /**
+     * @var AttributeFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $attributeFactory;
+
+    /**
+     * @var \Magento\ConfigurableProduct\Service\V1\Data\Option\ValueConverter|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $valueConverter;
+
+    /**
+     * @var \Magento\ConfigurableProduct\Service\V1\Data\Option\Value|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $value;
+
+    protected function setUp()
+    {
+        $helper = new ObjectManager($this);
+
+        $this->configurableAttribute = $this->getMockBuilder(
+            'Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute'
+        )
+            ->setMethods(
+                [
+                    'setData',
+                    'getData',
+                    'addData',
+                    '__wakeup',
+                    'getId',
+                    'setId',
+                    'getAttributeId',
+                    'setAttributeId',
+                    'setValues',
+                ]
+            )
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->option = $this->getMockBuilder('Magento\ConfigurableProduct\Service\V1\Data\Option')
+            ->setMethods(['__toArray', 'getValues'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->valueConverter = $this->getMockBuilder(
+            'Magento\ConfigurableProduct\Service\V1\Data\Option\ValueConverter'
+        )
+            ->setMethods(['convertArrayFromData'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->value = $this->getMockBuilder('Magento\ConfigurableProduct\Service\V1\Data\Option\Value')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->attributeFactory = $this->getMockBuilder(
+            'Magento\ConfigurableProduct\Model\Product\Type\Configurable\AttributeFactory'
+        )
+            ->setMethods(['create'])
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->attributeFactory->expects($this->any())->method('create')
+            ->will($this->returnValue($this->configurableAttribute));
+
+        $this->converter = $helper->getObject(
+            'Magento\ConfigurableProduct\Service\V1\Data\OptionConverter',
+            ['attributeFactory' => $this->attributeFactory, 'valueConverter' => $this->valueConverter]
+        );
+    }
+
+    public function testConvertFromModel()
+    {
+        $converterMock = $this->getMockBuilder('Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute')
+            ->disableOriginalConstructor()
+            ->setMethods(['getId', 'getData', 'getLabel', '__sleep', '__wakeup', 'getProductAttribute'])
+            ->getMock();
+
+        $productAttribute = $this->getMockBuilder('Magento\Catalog\Model\Resource\Eav\Attribute')
+            ->disableOriginalConstructor()
+            ->setMethods(['getFrontend', '__wakeup'])
+            ->getMock();
+
+        $frontend = $this->getMockBuilder('Magento\Eav\Model\Entity\Attribute\Frontend\DefaultFrontend')
+            ->disableOriginalConstructor()
+            ->setMethods(['getInputType'])
+            ->getMock();
+
+        $productAttribute->expects($this->any())->method('getFrontend')->will($this->returnValue($frontend));
+        $frontend->expects($this->once())->method('getInputType')->will($this->returnValue('select'));
+
+        $prices = ['value_index' => 1, 'pricing_value' => 12, 'is_percent' => true];
+        $converterMock->expects($this->at(0))->method('getData')->with('prices')->will($this->returnValue([$prices]));
+        $converterMock->expects($this->once())->method('getId')->will($this->returnValue(1));
+        $converterMock->expects($this->at(2))->method('getData')->with('attribute_id')->will($this->returnValue(2));
+        $converterMock->expects($this->once())->method('getLabel')->will($this->returnValue('Test Label'));
+        $converterMock->expects($this->any())->method('getProductAttribute')
+            ->will($this->returnValue($productAttribute));
+        $converterMock->expects($this->at(5))->method('getData')->with('position')->will($this->returnValue(3));
+        $converterMock->expects($this->at(6))->method('getData')->with('use_default')->will($this->returnValue(true));
+
+        /** @var \Magento\ConfigurableProduct\Service\V1\Data\Option $option */
+        $option = $this->converter->convertFromModel($converterMock);
+
+        $this->assertEquals(1, $option->getId());
+        $this->assertEquals(2, $option->getAttributeId());
+        $this->assertEquals('Test Label', $option->getLabel());
+        $this->assertEquals(3, $option->getPosition());
+
+        /** @var \Magento\ConfigurableProduct\Service\V1\Data\Option\Value $value */
+        $value = \current($option->getValues());
+        $this->assertEquals(1, $value->getIndex());
+        $this->assertEquals(12, $value->getPrice());
+        $this->assertEquals(true, $value->isPercent());
+    }
+
+    public function testGetModelFromData()
+    {
+        $data = ['data'];
+        $id = 33;
+        $this->configurableAttribute->expects($this->any())->method('getData')->will($this->returnValue($data));
+        $this->configurableAttribute->expects($this->once())->method('setData')->with($this->equalTo($data));
+        $this->configurableAttribute->expects($this->once())->method('addData')->with($this->equalTo($data));
+        $this->configurableAttribute->expects($this->any())->method('getId')->will($this->returnValue($id));
+        $this->configurableAttribute->expects($this->once())->method('setId')->with($this->equalTo($id));
+        $this->configurableAttribute->expects($this->any())->method('getAttributeId')->will($this->returnValue($id));
+        $this->configurableAttribute->expects($this->once())->method('setAttributeId')->with($this->equalTo($id));
+        $this->configurableAttribute->expects($this->any())->method('getValues')->will($this->returnValue($data));
+        $this->configurableAttribute->expects($this->any())->method('setValues')->with($this->equalTo($data));
+
+        $this->option->expects($this->any())->method('getValues')->will($this->returnValue([$this->value]));
+        $this->option->expects($this->any())->method('__toArray')->will($this->returnValue($data));
+
+        $this->valueConverter->expects($this->any())->method('convertArrayFromData')
+            ->with($this->equalTo($this->value))
+            ->will($this->returnValue($data[0]));
+
+        $result = $this->converter->getModelFromData($this->option, $this->configurableAttribute);
+        $this->assertEquals($this->configurableAttribute, $result);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Service/V1/Product/Option/ReadServiceTest.php b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Service/V1/Product/Option/ReadServiceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..eb4b4cfb53c1e7994504ab2d65c084592a664838
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Service/V1/Product/Option/ReadServiceTest.php
@@ -0,0 +1,307 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Product\Option;
+
+use Magento\ConfigurableProduct\Model\Product\Type\Configurable as ConfigurableType;
+use Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute as ResourceAttribute;
+use Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute;
+use Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute\Collection;
+use Magento\TestFramework\Helper\ObjectManager;
+
+/**
+ * Class ReadServiceTest
+ *
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
+class ReadServiceTest extends \PHPUnit_Framework_TestCase
+{
+    const TYPE_FIELD_NAME = 'frontend_input';
+    const ATTRIBUTE_ID_FIELD_NAME = 'product_super_attribute_id';
+    const OPTION_TYPE = 'select';
+    /**
+     * @var \Magento\Catalog\Model\Resource\Eav\Attribute|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $eavAttribute;
+    /**
+     * @var ResourceAttribute|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $attributeResource;
+    /**
+     * @var \Magento\ConfigurableProduct\Service\V1\Product\Option\ReadService
+     */
+    private $model;
+
+    /**
+     * @var \Magento\Catalog\Model\ProductRepository|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $productRepository;
+
+    /**
+     * @var \Magento\ConfigurableProduct\Service\V1\Data\OptionConverter|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $optionConverter;
+
+    /**
+     * @var \Magento\ConfigurableProduct\Model\Product\Type\Configurable|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $productType;
+
+    /**
+     * @var \Magento\Catalog\Model\Product|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $product;
+
+    /**
+     * @var Attribute|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $option;
+
+    /**
+     * @var Collection|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $configurableAttributeCollection;
+
+    /**
+     * @var \Magento\ConfigurableProduct\Service\V1\Data\Option|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $metadata;
+    /**
+     * @var \Magento\Catalog\Model\System\Config\Source\Inputtype|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $inputType;
+
+    public function setUp()
+    {
+        $objectManager = new ObjectManager($this);
+
+        $this->productRepository = $this->getMockBuilder('Magento\Catalog\Model\ProductRepository')
+            ->setMethods(['get'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->productType = $this->getMockBuilder(
+            'Magento\ConfigurableProduct\Model\Product\Type\Configurable'
+        )
+            ->setMethods(['getConfigurableAttributeCollection'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->product = $this->getMockBuilder('Magento\Catalog\Model\Product')
+            ->setMethods(['__wakeup', 'getTypeId'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->option = $this->getMockBuilder('Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute')
+            ->setMethods(['__wakeup', 'getId', 'getProductAttribute'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->eavAttribute = $this->getMockBuilder('Magento\Catalog\Model\Resource\Eav\Attribute')
+            ->setMethods(['getData', '__wakeup'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->attributeResource = $this->getMockBuilder(
+            'Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute'
+        )
+            ->setMethods(['getIdFieldName', '__wakeup'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->configurableAttributeCollection = $this->getMockBuilder(
+            'Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute\Collection'
+        )
+            ->setMethods(['getResource', 'addFieldToFilter', 'getFirstItem'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->optionConverter = $this->getMockBuilder(
+            'Magento\ConfigurableProduct\Service\V1\Data\OptionConverter'
+        )
+            ->setMethods(['convertFromModel'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->metadata = $this->getMockBuilder('\Magento\ConfigurableProduct\Service\V1\Data\Option')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->inputType = $this->getMockBuilder('Magento\Catalog\Model\System\Config\Source\Inputtype')
+            ->setMethods(['toOptionArray'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->model = $objectManager->getObject(
+            'Magento\ConfigurableProduct\Service\V1\Product\Option\ReadService',
+            [
+                'productRepository' => $this->productRepository,
+                'optionConverter'   => $this->optionConverter,
+                'configurableType'  => $this->productType,
+                'inputType'         => $this->inputType,
+            ]
+        );
+    }
+
+    public function testGetList()
+    {
+        $productSku = 'oneSku';
+
+        $this->productRepository->expects($this->once())->method('get')
+            ->with($this->equalTo($productSku))
+            ->will($this->returnValue($this->product));
+
+        $this->product->expects($this->once())->method('getTypeId')
+            ->will($this->returnValue(ConfigurableType::TYPE_CODE));
+
+        $this->productType->expects($this->once())->method('getConfigurableAttributeCollection')
+            ->with($this->equalTo($this->product))
+            ->will($this->returnValue([$this->option]));
+
+        $this->optionConverter->expects($this->once())->method('convertFromModel')
+            ->with($this->equalTo($this->option))
+            ->will($this->returnValue($this->metadata));
+
+        $this->assertEquals([$this->metadata], $this->model->getList($productSku));
+    }
+
+    public function testGet()
+    {
+        $productSku = 'oneSku';
+        $optionId = 3;
+
+        $this->productRepository->expects($this->once())->method('get')
+            ->with($this->equalTo($productSku))
+            ->will($this->returnValue($this->product));
+
+        $this->product->expects($this->once())->method('getTypeId')
+            ->will($this->returnValue(ConfigurableType::TYPE_CODE));
+
+        $this->productType->expects($this->once())->method('getConfigurableAttributeCollection')
+            ->with($this->equalTo($this->product))
+            ->will($this->returnValue($this->configurableAttributeCollection));
+
+        $this->configurableAttributeCollection->expects($this->once())
+            ->method('addFieldToFilter')
+            ->with(self::ATTRIBUTE_ID_FIELD_NAME, $optionId);
+
+        $this->configurableAttributeCollection->expects($this->once())
+            ->method('getFirstItem')
+            ->will($this->returnValue($this->option));
+
+        $this->option->expects($this->once())
+            ->method('getId')
+            ->will($this->returnValue($optionId));
+
+        $this->attributeResource->expects($this->once())
+            ->method('getIdFieldName')
+            ->will($this->returnValue(self::ATTRIBUTE_ID_FIELD_NAME));
+
+        $this->configurableAttributeCollection->expects($this->once())
+            ->method('getResource')
+            ->will($this->returnValue($this->attributeResource));
+
+        $this->optionConverter->expects($this->once())->method('convertFromModel')
+            ->with($this->equalTo($this->option))
+            ->will($this->returnValue($this->metadata));
+
+        $this->assertEquals($this->metadata, $this->model->get($productSku, $optionId));
+    }
+
+    public function testGetTypes()
+    {
+        $optionArray = array(
+            array('value' => 'multiselect', 'label' => __('Multiple Select')),
+            array('value' => 'select', 'label' => __('Dropdown'))
+        );
+        $expectedResult = ['multiselect', 'select'];
+
+        $this->inputType->expects($this->once())
+            ->method('toOptionArray')
+            ->will($this->returnValue($optionArray));
+        $this->assertEquals($expectedResult, $this->model->getTypes());
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\NoSuchEntityException
+     * @expectedExceptionMessage Requested option doesn't exist: 3
+     */
+    public function testGetNoSuchEntityException()
+    {
+        $productSku = 'oneSku';
+        $optionId = 3;
+
+        $this->productRepository->expects($this->once())->method('get')
+            ->with($this->equalTo($productSku))
+            ->will($this->returnValue($this->product));
+
+        $this->product->expects($this->once())->method('getTypeId')
+            ->will($this->returnValue(ConfigurableType::TYPE_CODE));
+
+        $this->productType->expects($this->once())->method('getConfigurableAttributeCollection')
+            ->with($this->equalTo($this->product))
+            ->will($this->returnValue($this->configurableAttributeCollection));
+
+        $this->configurableAttributeCollection->expects($this->once())
+            ->method('addFieldToFilter')
+            ->with(self::ATTRIBUTE_ID_FIELD_NAME, $optionId)
+            ->will($this->returnSelf());
+
+        $this->configurableAttributeCollection->expects($this->once())
+            ->method('getFirstItem')
+            ->will($this->returnValue($this->option));
+
+        $this->option->expects($this->once())
+            ->method('getId')
+            ->will($this->returnValue(null));
+
+        $this->attributeResource->expects($this->once())
+            ->method('getIdFieldName')
+            ->will($this->returnValue(self::ATTRIBUTE_ID_FIELD_NAME));
+
+        $this->configurableAttributeCollection->expects($this->once())
+            ->method('getResource')
+            ->will($this->returnValue($this->attributeResource));
+
+        $this->model->get($productSku, $optionId);
+    }
+
+    /**
+     * @expectedException \Magento\Webapi\Exception
+     * @expectedExceptionCode 403
+     * @expectedExceptionMessage Only implemented for configurable product: oneSku
+     */
+    public function testGetListWebApiException()
+    {
+        $productSku = 'oneSku';
+
+        $this->productRepository->expects($this->once())->method('get')
+            ->with($this->equalTo($productSku))
+            ->will($this->returnValue($this->product));
+
+        $this->product->expects($this->once())->method('getTypeId')
+            ->will($this->returnValue(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE));
+
+        $this->model->getList($productSku);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Service/V1/Product/Option/WriteServiceTest.php b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Service/V1/Product/Option/WriteServiceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..4d73a7f403871d465484e8b7f9cf97853afbcedf
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Service/V1/Product/Option/WriteServiceTest.php
@@ -0,0 +1,426 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Product\Option;
+
+use Magento\Catalog\Model\Product\Type as ProductType;
+use Magento\Catalog\Model\ProductRepository;
+use Magento\ConfigurableProduct\Model\Product\Type\Configurable as ConfigurableType;
+use Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute;
+use Magento\ConfigurableProduct\Model\Product\Type\Configurable\AttributeFactory as ConfigurableAttributeFactory;
+use Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute\Collection;
+use Magento\ConfigurableProduct\Service\V1\Data\Option;
+use Magento\TestFramework\Helper\ObjectManager;
+
+/**
+ * Class WriteServiceTest
+ *
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
+class WriteServiceTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var ObjectManager */
+    protected $objectManager;
+
+    /**
+     * @var ProductRepository|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $productRepositoryMock;
+
+    /**
+     * @var ConfigurableAttributeFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $confAttributeFactoryMock;
+
+    /**
+     * @var \Magento\Eav\Model\Config|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $eavConfigMock;
+
+    /**
+     * @var \Magento\ConfigurableProduct\Service\V1\Data\OptionBuilder
+     */
+    protected $optionBuilder;
+
+    /**
+     * @var \Magento\ConfigurableProduct\Service\V1\Product\Option\WriteService
+     */
+    protected $writeService;
+
+    /**
+     * @var \Magento\Catalog\Model\Product|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $productMock;
+
+    /**
+     * @var \Magento\ConfigurableProduct\Model\Product\Type\Configurable|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $productTypeMock;
+
+    /**
+     * @var Collection|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $attributeCollectionMock;
+
+    /**
+     * @var Attribute|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $attributeMock;
+
+    /**
+     * @var \Magento\ConfigurableProduct\Service\V1\Data\Option|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $optionMock;
+
+    /**
+     * @var \Magento\ConfigurableProduct\Service\V1\Data\OptionConverter|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $optionConverterMock;
+
+    protected function setUp()
+    {
+        $this->objectManager = new ObjectManager($this);
+
+        $this->productRepositoryMock = $this->getMockBuilder('Magento\Catalog\Model\ProductRepository')
+            ->disableOriginalConstructor()->setMethods(['get'])->getMock();
+
+        $this->confAttributeFactoryMock = $this
+            ->getMockBuilder('Magento\ConfigurableProduct\Model\Product\Type\Configurable\AttributeFactory')
+            ->disableOriginalConstructor()->setMethods(['create'])->getMock();
+
+        $this->eavConfigMock = $this
+            ->getMockBuilder('Magento\Eav\Model\Config')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->productMock = $this->getMockBuilder('Magento\Catalog\Model\Product')
+            ->setMethods(['getSku', 'getTypeId', '__wakeup', 'getId'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->productTypeMock = $this->getMockBuilder('Magento\ConfigurableProduct\Model\Product\Type\Configurable')
+            ->setMethods(['getConfigurableAttributeCollection'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->optionConverterMock = $this->getMockBuilder(
+            'Magento\ConfigurableProduct\Service\V1\Data\OptionConverter'
+        )
+            ->setMethods(['getModelFromData', 'convertFromModel', 'convertArrayFromData'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->optionMock = $this->getMockBuilder('Magento\ConfigurableProduct\Service\V1\Data\Option')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->attributeCollectionMock = $this->getMockBuilder(
+            'Magento\ConfigurableProduct\Model\Resource\Product\Type\Configurable\Attribute\Collection'
+        )
+            ->setMethods(['getItemById'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->attributeMock = $this->getMockBuilder(
+            'Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute'
+        )
+            ->setMethods(['delete', '__wakeup', 'load', 'save', 'getId', 'getProductId'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $storeManagerMock = $this->getMock('Magento\Store\Model\StoreManagerInterface', [], [], '', false);
+        $storeManagerMock->expects($this->any())
+            ->method('getStore')
+            ->will($this->returnValue(new \Magento\Framework\Object()));
+
+        $this->writeService = $this->objectManager->getObject(
+            'Magento\ConfigurableProduct\Service\V1\Product\Option\WriteService',
+            [
+                'productRepository' => $this->productRepositoryMock,
+                'configurableAttributeFactory' => $this->confAttributeFactoryMock,
+                'eavConfig' => $this->eavConfigMock,
+                'storeManager' => $storeManagerMock,
+                'productType' => $this->productTypeMock,
+                'optionConverter' => $this->optionConverterMock
+            ]
+        );
+
+        $this->optionBuilder = $this->objectManager
+            ->getObject('Magento\ConfigurableProduct\Service\V1\Data\OptionBuilder');
+    }
+
+    /**
+     * Add configurable option test
+     */
+    public function testAdd()
+    {
+        $productSku = 'test_sku';
+        $option = $this->getOption();
+
+        $productMock = $this->getMock(
+            'Magento\Catalog\Model\Product',
+            ['save', 'setConfigurableAttributesData', 'setStoreId', 'getTypeId', 'setTypeId', '__sleep', '__wakeup'],
+            [],
+            '',
+            false
+        );
+        $productMock->expects($this->any())
+            ->method('getTypeId')
+            ->will($this->returnValue(ProductType::TYPE_SIMPLE));
+        $this->productRepositoryMock->expects($this->any())
+            ->method('get')
+            ->will($this->returnValue($productMock));
+
+        $confAttributeMock = $this->getMock(
+            'Magento\ConfigurableProduct\Model\Product\Type\Configurable\Attribute',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->confAttributeFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($confAttributeMock));
+
+        $confAttributeMock->expects($this->exactly(2))->method('loadByProductAndAttribute');
+        $confAttributeMock->expects($this->at(1))->method('getId')->will($this->returnValue(null));
+        $confAttributeMock->expects($this->at(3))->method('getId')->will($this->returnValue(1));
+
+        $productMock->expects($this->once())->method('setTypeId')->with(ConfigurableType::TYPE_CODE);
+        $productMock->expects($this->once())->method('setConfigurableAttributesData');
+        $productMock->expects($this->once())->method('setStoreId')->with(0);
+        $productMock->expects($this->once())->method('save');
+
+        $this->optionConverterMock->expects($this->once())->method('convertArrayFromData')->with($option);
+
+        $this->writeService->add($productSku, $option);
+    }
+
+    /**
+     * Invalid product type check
+     *
+     * @expectedException \InvalidArgumentException
+     */
+    public function testAddInvalidProductType()
+    {
+        $productSku = 'test_sku';
+        $option = $this->getOption();
+
+        $productMock = $this->getMock('Magento\Catalog\Model\Product', [], [], '', false);
+        $productMock->expects($this->any())
+            ->method('getTypeId')
+            ->will($this->returnValue(ProductType::TYPE_BUNDLE));
+        $this->productRepositoryMock->expects($this->any())
+            ->method('get')
+            ->will($this->returnValue($productMock));
+
+        $this->writeService->add($productSku, $option);
+    }
+
+    public function testUpdate()
+    {
+        $productSku = 'productSku';
+        $optionId = 3;
+
+        $this->productRepositoryMock->expects($this->once())->method('get')
+            ->with($this->equalTo($productSku))
+            ->will($this->returnValue($this->productMock));
+
+        $this->productMock->expects($this->once())->method('getTypeId')
+            ->will($this->returnValue(ConfigurableType::TYPE_CODE));
+        $this->productMock->expects($this->any())->method('getId')
+            ->will($this->returnValue($optionId));
+
+        $this->confAttributeFactoryMock->expects($this->once())->method('create')
+            ->will($this->returnValue($this->attributeMock));
+
+        $this->attributeMock->expects($this->once())->method('load')->with($this->equalTo($optionId));
+        $this->attributeMock->expects($this->any())->method('getId')->will($this->returnValue($optionId));
+        $this->attributeMock->expects($this->any())->method('getProductId')->will($this->returnValue($optionId));
+        $this->attributeMock->expects($this->any())->method('save');
+
+        $this->optionConverterMock->expects($this->once())->method('getModelFromData')
+            ->with($this->equalTo($this->optionMock), $this->equalTo($this->attributeMock))
+            ->will($this->returnValue($this->attributeMock));
+
+        $this->writeService->update($productSku, $optionId, $this->optionMock);
+    }
+
+    /**
+     * #@expectedException \Magento\Framework\Exception\CouldNotSaveException
+     */
+    public function testUpdateCouldNotSaveException()
+    {
+        $productSku = 'productSku';
+        $optionId = 3;
+
+        $this->productRepositoryMock->expects($this->once())->method('get')
+            ->with($this->equalTo($productSku))
+            ->will($this->returnValue($this->productMock));
+
+        $this->productMock->expects($this->once())->method('getTypeId')
+            ->will($this->returnValue(ConfigurableType::TYPE_CODE));
+        $this->productMock->expects($this->any())->method('getId')
+            ->will($this->returnValue($optionId));
+
+        $this->confAttributeFactoryMock->expects($this->once())->method('create')
+            ->will($this->returnValue($this->attributeMock));
+
+        $this->attributeMock->expects($this->once())->method('load')->with($this->equalTo($optionId));
+        $this->attributeMock->expects($this->any())->method('getId')->will($this->returnValue($optionId));
+        $this->attributeMock->expects($this->any())->method('getProductId')->will($this->returnValue($optionId));
+        $this->attributeMock->expects($this->any())->method('save')
+            ->will(
+                $this->returnCallback(
+                    function () {
+                        throw new \Exception();
+                    }
+                )
+            );
+
+        $this->optionConverterMock->expects($this->once())->method('getModelFromData')
+            ->with($this->equalTo($this->optionMock), $this->equalTo($this->attributeMock))
+            ->will($this->returnValue($this->attributeMock));
+
+        $this->writeService->update($productSku, $optionId, $this->optionMock);
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\NoSuchEntityException
+     */
+    public function testUpdateNoSuchEntityException()
+    {
+        $productSku = 'productSku';
+        $optionId = 3;
+
+        $this->productRepositoryMock->expects($this->once())->method('get')
+            ->with($this->equalTo($productSku))
+            ->will($this->returnValue($this->productMock));
+
+        $this->productMock->expects($this->once())->method('getTypeId')
+            ->will($this->returnValue(ConfigurableType::TYPE_CODE));
+
+        $this->confAttributeFactoryMock->expects($this->once())->method('create')
+            ->will($this->returnValue($this->attributeMock));
+
+        $this->attributeMock->expects($this->once())->method('load')->with($this->equalTo($optionId));
+        $this->attributeMock->expects($this->any())->method('getId')->will($this->returnValue(0));
+
+        $this->writeService->update($productSku, $optionId, $this->optionMock);
+    }
+
+    public function testRemove()
+    {
+        $productSku = 'productSku';
+        $optionId = 3;
+
+        $this->productRepositoryMock->expects($this->once())->method('get')
+            ->with($this->equalTo($productSku))
+            ->will($this->returnValue($this->productMock));
+
+        $this->productMock->expects($this->once())->method('getTypeId')
+            ->will($this->returnValue(ConfigurableType::TYPE_CODE));
+
+        $this->productTypeMock->expects($this->once())->method('getConfigurableAttributeCollection')
+            ->with($this->equalTo($this->productMock))
+            ->will($this->returnValue($this->attributeCollectionMock));
+
+        $this->attributeCollectionMock->expects($this->once())->method('getItemById')
+            ->with($this->equalTo($optionId))
+            ->will($this->returnValue($this->attributeMock));
+
+        $this->attributeMock->expects($this->once())->method('delete');
+
+        $this->assertTrue($this->writeService->remove($productSku, $optionId));
+    }
+
+    /**
+     * @expectedException \Magento\Framework\Exception\NoSuchEntityException
+     */
+    public function testRemoveNoSuchEntityException()
+    {
+        $productSku = 'productSku';
+        $optionId = 3;
+
+        $this->productRepositoryMock->expects($this->once())->method('get')
+            ->with($this->equalTo($productSku))
+            ->will($this->returnValue($this->productMock));
+
+        $this->productMock->expects($this->once())->method('getTypeId')
+            ->will($this->returnValue(ConfigurableType::TYPE_CODE));
+
+        $this->productTypeMock->expects($this->once())->method('getConfigurableAttributeCollection')
+            ->with($this->equalTo($this->productMock))
+            ->will($this->returnValue($this->attributeCollectionMock));
+
+        $this->attributeCollectionMock->expects($this->once())->method('getItemById')
+            ->with($this->equalTo($optionId))
+            ->will($this->returnValue(null));
+
+        $this->writeService->remove($productSku, $optionId);
+    }
+
+    /**
+     * @expectedException \Magento\Webapi\Exception
+     */
+    public function testRemoveWebApiException()
+    {
+        $productSku = 'productSku';
+
+        $this->productRepositoryMock->expects($this->once())->method('get')
+            ->with($this->equalTo($productSku))
+            ->will($this->returnValue($this->productMock));
+
+        $this->productMock->expects($this->once())->method('getTypeId')
+            ->will($this->returnValue(ProductType::TYPE_SIMPLE));
+        $this->productMock->expects($this->once())->method('getSku')
+            ->will($this->returnValue($productSku));
+
+        $this->writeService->remove($productSku, 3);
+    }
+
+    /**
+     * Return instance of option for configurable product
+     *
+     * @return \Magento\Framework\Service\Data\AbstractObject
+     */
+    private function getOption()
+    {
+        $data = [
+            Option::ID => 1,
+            Option::ATTRIBUTE_ID => 2,
+            Option::LABEL => 'Test Label',
+            Option::POSITION => 1,
+            Option::USE_DEFAULT => true,
+            Option::VALUES => [
+                [
+                    'index' => 1,
+                    'price' => 12,
+                    'percent' => true
+                ]
+            ]
+        ];
+
+        return $this->optionBuilder->populateWithArray($data)->create();
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Service/V1/ReadServiceTest.php b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Service/V1/ReadServiceTest.php
index 6e3c86f66799ea77e5bfcc32a39e4705e0459958..bd338f156f537c3758b78b10546aabc60469d95f 100644
--- a/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Service/V1/ReadServiceTest.php
+++ b/dev/tests/unit/testsuite/Magento/ConfigurableProduct/Service/V1/ReadServiceTest.php
@@ -117,8 +117,8 @@ class ReadServiceTest extends \PHPUnit_Framework_TestCase
                                 'value' => '14',
                                 'label' => 'dd',
                                 'price' => [
-                                    'value_index' => 14,
-                                    'pricing_value' => 10,
+                                    'index' => 14,
+                                    'price' => 10,
                                 ],
                             ],
                         ],
@@ -134,7 +134,7 @@ class ReadServiceTest extends \PHPUnit_Framework_TestCase
             ->will($this->returnValue(100));
 
         $configurableAttribute = $this->getMockBuilder(
-            'Magento\ConfigurableProduct\Service\V1\Data\ConfigurableAttribute'
+            'Magento\ConfigurableProduct\Service\V1\Data\Option'
         )
             ->disableOriginalConstructor()
             ->getMock();
diff --git a/dev/tests/unit/testsuite/Magento/Customer/Model/Authorization/CustomerSessionUserContextTest.php b/dev/tests/unit/testsuite/Magento/Customer/Model/Authorization/CustomerSessionUserContextTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..44d35a342dc768b580e5d6ef67b1d729b91ae26e
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Customer/Model/Authorization/CustomerSessionUserContextTest.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\Customer\Model\Authorization;
+
+use Magento\Authorization\Model\UserContextInterface;
+
+/**
+ * Tests Magento\Customer\Model\Authorization\CustomerSessionUserContext
+ */
+class CustomerSessionUserContextTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\TestFramework\Helper\ObjectManager
+     */
+    protected $objectManager;
+
+    /**
+     * @var \Magento\Customer\Model\Authorization\CustomerSessionUserContext
+     */
+    protected $customerSessionUserContext;
+
+    /**
+     * @var \Magento\Customer\Model\Session
+     */
+    protected $customerSession;
+
+    protected function setUp()
+    {
+        $this->objectManager = new \Magento\TestFramework\Helper\ObjectManager($this);
+
+        $this->customerSession = $this->getMockBuilder('Magento\Customer\Model\Session')
+            ->disableOriginalConstructor()
+            ->setMethods(['getId'])
+            ->getMock();
+
+        $this->customerSessionUserContext = $this->objectManager->getObject(
+            'Magento\Customer\Model\Authorization\CustomerSessionUserContext',
+            ['customerSession' => $this->customerSession]
+        );
+    }
+
+    public function testGetUserIdExist()
+    {
+        $userId = 1;
+        $this->setupUserId($userId);
+        $this->assertEquals($userId, $this->customerSessionUserContext->getUserId());
+    }
+
+    public function testGetUserIdDoesNotExist()
+    {
+        $userId = null;
+        $this->setupUserId($userId);
+        $this->assertEquals($userId, $this->customerSessionUserContext->getUserId());
+    }
+
+    public function testGetUserType()
+    {
+        $this->assertEquals(UserContextInterface::USER_TYPE_CUSTOMER, $this->customerSessionUserContext->getUserType());
+    }
+
+    /**
+     * @param int|null $userId
+     * @return void
+     */
+    public function setupUserId($userId)
+    {
+        $this->customerSession->expects($this->once())
+            ->method('getId')
+            ->will($this->returnValue($userId));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Fedex/Model/CarrierTest.php b/dev/tests/unit/testsuite/Magento/Fedex/Model/CarrierTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..9736c734575660fcd0667691e76a81840504950d
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Fedex/Model/CarrierTest.php
@@ -0,0 +1,184 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Fedex\Model;
+
+use Magento\Framework\Object;
+
+class CarrierTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\TestFramework\Helper\ObjectManager
+     */
+    protected $_helper;
+
+    /**
+     * @var \Magento\Fedex\Model\Carrier
+     */
+    protected $_model;
+
+    /**
+     * @return void
+     */
+    public function setUp()
+    {
+        $scopeConfig = $this->getMock(
+            'Magento\Framework\App\Config\ScopeConfigInterface',
+            ['isSetFlag', 'getValue'],
+            [],
+            '',
+            false
+        );
+        $scopeConfig->expects($this->any())->method('isSetFlag')->will($this->returnValue(true));
+        $scopeConfig->expects($this->any())->method('getValue')->will($this->returnValue('ServiceType'));
+        $country = $this->getMock(
+            'Magento\Directory\Model\Country',
+            ['load', 'getIso2Code', '__wakeup'],
+            [],
+            '',
+            false
+        );
+        $country->expects($this->any())->method('load')->will($this->returnSelf());
+        $countryFactory = $this->getMock('Magento\Directory\Model\CountryFactory', ['create'], [], '', false);
+        $countryFactory->expects($this->any())->method('create')->will($this->returnValue($country));
+
+        $rate = $this->getMock('Magento\Shipping\Model\Rate\Result', ['getError'], [], '', false);
+        $rateFactory = $this->getMock('Magento\Shipping\Model\Rate\ResultFactory', ['create'], [], '', false);
+        $rateFactory->expects($this->any())->method('create')->will($this->returnValue($rate));
+
+        $store = $this->getMock('Magento\Store\Model\Store', ['getBaseCurrencyCode', '__wakeup'], [], '', false);
+        $storeManager = $this->getMock(
+            'Magento\Store\Model\StoreManagerInterface',
+            [
+                'getStore',
+                'setIsSingleStoreModeAllowed',
+                'hasSingleStore',
+                'isSingleStoreMode',
+                'getStores',
+                'getWebsite',
+                'getWebsites',
+                'reinitStores',
+                'getDefaultStoreView',
+                'getGroup',
+                'getGroups',
+                'clearWebsiteCache',
+                'setCurrentStore'
+            ],
+            [],
+            '',
+            false
+        );
+        $storeManager->expects($this->any())->method('getStore')->will($this->returnValue($store));
+        $rateMethod = $this->getMock(
+            'Magento\Sales\Model\Quote\Address\RateResult\Method',
+            null,
+            ['storeManager' => $storeManager]
+        );
+        $rateMethodFactory = $this->getMock(
+            'Magento\Sales\Model\Quote\Address\RateResult\MethodFactory',
+            ['create'],
+            [],
+            '',
+            false
+        );
+        $rateMethodFactory->expects($this->any())->method('create')->will($this->returnValue($rateMethod));
+        $this->_model = $this->getMock(
+            'Magento\Fedex\Model\Carrier',
+            ['_getCachedQuotes', '_debug'],
+            [
+                'scopeConfig' => $scopeConfig,
+                'rateErrorFactory' =>
+                    $this->getMock('Magento\Sales\Model\Quote\Address\RateResult\ErrorFactory', [], [], '', false),
+                'logAdapterFactory' => $this->getMock('Magento\Framework\Logger\AdapterFactory', [], [], '', false),
+                'xmlElFactory' => $this->getMock('Magento\Shipping\Model\Simplexml\ElementFactory', [], [], '', false),
+                'rateFactory' => $rateFactory,
+                'rateMethodFactory' => $rateMethodFactory,
+                'trackFactory' => $this->getMock('Magento\Shipping\Model\Tracking\ResultFactory', [], [], '', false),
+                'trackErrorFactory' =>
+                    $this->getMock('Magento\Shipping\Model\Tracking\Result\ErrorFactory', [], [], '', false),
+                'trackStatusFactory' =>
+                    $this->getMock('Magento\Shipping\Model\Tracking\Result\StatusFactory', [], [], '', false),
+                'regionFactory' => $this->getMock('Magento\Directory\Model\RegionFactory', [], [], '', false),
+                'countryFactory' => $countryFactory,
+                'currencyFactory' => $this->getMock('Magento\Directory\Model\CurrencyFactory', [], [], '', false),
+                'directoryData' => $this->getMock('Magento\Directory\Helper\Data', [], [], '', false),
+                'stockItemService' =>
+                    $this->getMock('Magento\CatalogInventory\Service\V1\StockItemService', [], [], '', false),
+                'logger' => $this->getMock('Magento\Framework\Logger', [], [], '', false),
+                'storeManager' => $storeManager,
+                'configReader' => $this->getMock('Magento\Framework\Module\Dir\Reader', [], [], '', false),
+                'productCollectionFactory' =>
+                    $this->getMock('Magento\Catalog\Model\Resource\Product\CollectionFactory', [], [], '', false),
+                'data' => []
+            ]
+        );
+    }
+
+    /**
+     * @dataProvider collectRatesDataProvider
+     */
+    public function testCollectRatesRateAmountOriginBased($amount, $rateType, $expected)
+    {
+        // @codingStandardsIgnoreStart
+        $netAmount = new \Magento\Framework\Object([]);
+        $netAmount->Amount = $amount;
+
+        $totalNetCharge = new \Magento\Framework\Object([]);
+        $totalNetCharge->TotalNetCharge = $netAmount;
+        $totalNetCharge->RateType = $rateType;
+
+        $ratedShipmentDetail = new \Magento\Framework\Object([]);
+        $ratedShipmentDetail->ShipmentRateDetail = $totalNetCharge;
+
+        $rate = new \Magento\Framework\Object([]);
+        $rate->ServiceType = 'ServiceType';
+        $rate->RatedShipmentDetails = [$ratedShipmentDetail];
+
+        $response = new \Magento\Framework\Object([]);
+        $response->HighestSeverity = 'SUCCESS';
+        $response->RateReplyDetails = $rate;
+
+        $this->_model->expects($this->any())->method('_getCachedQuotes')->will(
+            $this->returnValue(serialize($response))
+        );
+        $request = $this->getMock('Magento\Sales\Model\Quote\Address\RateRequest', [], [], '', false);
+        foreach ($this->_model->collectRates($request)->getAllRates() as $allRates) {
+            $this->assertEquals($expected, $allRates->getData('cost'));
+        }
+        // @codingStandardsIgnoreEnd
+    }
+
+    public function collectRatesDataProvider()
+    {
+        return [
+            [10.0, 'RATED_ACCOUNT_PACKAGE', 10],
+            [11.50, 'PAYOR_ACCOUNT_PACKAGE', 11.5],
+            [100.01, 'RATED_ACCOUNT_SHIPMENT', 100.01],
+            [32.2, 'PAYOR_ACCOUNT_SHIPMENT', 32.2],
+            [15.0, 'RATED_LIST_PACKAGE', 15],
+            [123.25, 'PAYOR_LIST_PACKAGE', 123.25],
+            [12.12, 'RATED_LIST_SHIPMENT', 12.12],
+            [38.9, 'PAYOR_LIST_SHIPMENT', 38.9],
+        ];
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Framework/Event/Config/_files/valid_events.xml b/dev/tests/unit/testsuite/Magento/Framework/Event/Config/_files/valid_events.xml
index b5f4d134f8bbbd8f542f97a44f0ebec2b0e85f2b..19d6744073ee495dbfdfe655d2dda84370b43d5b 100644
--- a/dev/tests/unit/testsuite/Magento/Framework/Event/Config/_files/valid_events.xml
+++ b/dev/tests/unit/testsuite/Magento/Framework/Event/Config/_files/valid_events.xml
@@ -24,10 +24,10 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../../../lib/internal/Magento/Framework/Event/etc/events.xsd">
-    <event name="admin_roles_load_after">
+    <event name="authorization_roles_load_after">
         <observer name="observer_name" instance="Some_Test_Value" method="addDataAfterRoleLoad" disabled="false" shared="true"/>
     </event>
-    <event name="admin_roles_save_before">
+    <event name="authorization_roles_save_before">
         <observer name="second_name" instance="Some_Test_Value_Two" method="setDataBeforeRoleSave" />
     </event>
 </config>
diff --git a/dev/tests/unit/testsuite/Magento/Framework/Notification/NotifierListTest.php b/dev/tests/unit/testsuite/Magento/Framework/Notification/NotifierListTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..afbfa92a04bf1db291f57cf4492f7878512a4566
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Framework/Notification/NotifierListTest.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\Framework\Notification;
+
+use \Magento\TestFramework\Helper\ObjectManager as ObjectManagerHelper;
+
+class NotifierListTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var ObjectManagerHelper */
+    protected $objectManagerHelper;
+
+    /** @var \Magento\Framework\ObjectManager|\PHPUnit_Framework_MockObject_MockObject */
+    protected $objectManager;
+
+    protected function setUp()
+    {
+        $this->objectManager = $this->getMock('Magento\Framework\ObjectManager');
+        $this->objectManagerHelper = new ObjectManagerHelper($this);
+    }
+
+    public function testAsArraySuccess()
+    {
+        $notifier1 = $this->objectManagerHelper->getObject('Magento\Framework\Notification\NotifierPool');
+        $notifier2 = $this->objectManagerHelper->getObject('Magento\Framework\Notification\NotifierPool');
+        $notifierList = $this->objectManagerHelper->getObject(
+            'Magento\Framework\Notification\NotifierList',
+            [
+                'objectManager' => $this->objectManager,
+                'notifiers' => [$notifier1, $notifier2]
+            ]
+        );
+        $this->setExpectedException('InvalidArgumentException');
+        $result = $notifierList->asArray();
+        foreach ($result as $notifier) {
+            $this->assertInstanceOf('Magento\Framework\Notification\NotifierInterface', $notifier);
+        }
+    }
+
+    public function testAsArrayException()
+    {
+        $notifierCorrect = $this->objectManagerHelper->getObject('Magento\Framework\Notification\NotifierPool');
+        $notifierIncorrect = $this->objectManagerHelper->getObject('Magento\Framework\Notification\NotifierList');
+        $notifierList = $this->objectManagerHelper->getObject(
+            'Magento\Framework\Notification\NotifierList',
+            [
+                'objectManager' => $this->objectManager,
+                'notifiers' => [$notifierCorrect, $notifierIncorrect]
+            ]
+        );
+        $this->setExpectedException('InvalidArgumentException');
+        $notifierList->asArray();
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Framework/Notification/NotifierPoolTest.php b/dev/tests/unit/testsuite/Magento/Framework/Notification/NotifierPoolTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..bc66e1191ed79509d9fc2167d2f9035f0067c877
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Framework/Notification/NotifierPoolTest.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\Framework\Notification;
+
+use \Magento\TestFramework\Helper\ObjectManager as ObjectManagerHelper;
+
+class NotifierPoolTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var \Magento\Framework\Notification\NotifierPool */
+    protected $notifierPool;
+
+    /** @var ObjectManagerHelper */
+    protected $objectManagerHelper;
+
+    /** @var \Magento\Framework\Notification\NotifierList|\PHPUnit_Framework_MockObject_MockObject */
+    protected $notifierList;
+
+    /**
+     * @var \Magento\Framework\Notification\NotifierPool[]|\PHPUnit_Framework_MockObject_MockObject[]
+     */
+    protected $notifiers;
+
+    protected function setUp()
+    {
+        $this->objectManagerHelper = new ObjectManagerHelper($this);
+        $notifier1 = $this->getMock('Magento\Framework\Notification\NotifierPool', [], [], '', false);
+        $notifier2 = $this->getMock('Magento\Framework\Notification\NotifierPool', [], [], '', false);
+        $this->notifiers = [$notifier1, $notifier2];
+        $this->notifierList = $this->getMock('Magento\Framework\Notification\NotifierList', [], [], '', false);
+        $this->notifierList->expects($this->any())->method('asArray')->will($this->returnValue($this->notifiers));
+        $this->notifierPool = $this->objectManagerHelper->getObject(
+            'Magento\Framework\Notification\NotifierPool',
+            [
+                'notifierList' => $this->notifierList
+            ]
+        );
+    }
+
+    public function testAdd()
+    {
+        $severity = \Magento\Framework\Notification\MessageInterface::SEVERITY_CRITICAL;
+        $title = 'title';
+        $description = 'desc';
+        foreach ($this->notifiers as $notifier) {
+            $notifier->expects($this->once())->method('add')->with($severity, $title, $description);
+        }
+        $this->notifierPool->add($severity, $title, $description);
+    }
+
+    public function testAddCritical()
+    {
+        $title = 'title';
+        $description = 'desc';
+        foreach ($this->notifiers as $notifier) {
+            $notifier->expects($this->once())->method('addCritical')->with($title, $description);
+        }
+        $this->notifierPool->addCritical($title, $description);
+    }
+
+    public function testAddMajor()
+    {
+        $title = 'title';
+        $description = 'desc';
+        foreach ($this->notifiers as $notifier) {
+            $notifier->expects($this->once())->method('addMajor')->with($title, $description);
+        }
+        $this->notifierPool->addMajor($title, $description);
+    }
+
+    public function testAddMinor()
+    {
+        $title = 'title';
+        $description = 'desc';
+        foreach ($this->notifiers as $notifier) {
+            $notifier->expects($this->once())->method('addMinor')->with($title, $description);
+        }
+        $this->notifierPool->addMinor($title, $description);
+    }
+
+    public function testAddNotice()
+    {
+        $title = 'title';
+        $description = 'desc';
+        foreach ($this->notifiers as $notifier) {
+            $notifier->expects($this->once())->method('addNotice')->with($title, $description);
+        }
+        $this->notifierPool->addNotice($title, $description);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Framework/ObjectManager/Code/Generator/ConverterTest.php b/dev/tests/unit/testsuite/Magento/Framework/ObjectManager/Code/Generator/ConverterTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..167a36251d38db616e52e6e38c7332d1c31cbbb0
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Framework/ObjectManager/Code/Generator/ConverterTest.php
@@ -0,0 +1,152 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\ObjectManager\Code\Generator;
+
+use Magento\Framework\Code\Generator\Io;
+use Magento\TestFramework\Helper\ObjectManager;
+
+/**
+ * Class ConverterTest
+ * @package Magento\Framework\ObjectManager\Code\Generator
+ */
+class ConverterTest extends \PHPUnit_Framework_TestCase
+{
+    const SOURCE_CLASS_NAME = 'Magento\Framework\ObjectManager\Code\Generator\Sample';
+    const RESULT_CLASS_NAME = 'Magento\Framework\ObjectManager\Code\Generator\SampleConverter';
+
+    /**
+     * @var Io | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $ioObjectMock;
+
+    /**
+     * @var \Magento\Framework\Code\Generator\EntityAbstract
+     */
+    protected $generator;
+
+    /**
+     * @var \Magento\Framework\Autoload\IncludePath | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $autoloaderMock;
+
+    /**
+     * @var \Magento\Framework\Code\Generator\CodeGenerator\Zend | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $classGenerator;
+
+    protected function setUp()
+    {
+        $this->ioObjectMock = $this->getMock(
+            'Magento\Framework\Code\Generator\Io',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->autoloaderMock = $this->getMock(
+            'Magento\Framework\Autoload\IncludePath',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->classGenerator = $this->getMock(
+            'Magento\Framework\Code\Generator\CodeGenerator\Zend',
+            [],
+            [],
+            '',
+            false
+        );
+
+        $objectManager = new ObjectManager($this);
+        $this->generator = $objectManager->getObject(
+            'Magento\Framework\ObjectManager\Code\Generator\Converter',
+            [
+                'sourceClassName' => self::SOURCE_CLASS_NAME,
+                'resultClassName' => self::RESULT_CLASS_NAME,
+                'ioObject' => $this->ioObjectMock,
+                'classGenerator' => $this->classGenerator,
+                'autoLoader' => $this->autoloaderMock
+            ]
+        );
+    }
+
+    public function testGenerate()
+    {
+        $generatedCode = 'Generated code';
+        $sourceFileName = 'Sample.php';
+        $resultFileName = 'SampleConverter.php';
+
+        //Mocking _validateData call
+        $this->autoloaderMock->expects($this->at(0))
+            ->method('getFile')
+            ->with(self::SOURCE_CLASS_NAME)
+            ->will($this->returnValue($sourceFileName));
+        $this->autoloaderMock->expects($this->at(1))
+            ->method('getFile')
+            ->with(self::RESULT_CLASS_NAME)
+            ->will($this->returnValue(false));
+
+        $this->ioObjectMock->expects($this->once())
+            ->method('makeGenerationDirectory')
+            ->will($this->returnValue(true));
+        $this->ioObjectMock->expects($this->once())
+            ->method('makeResultFileDirectory')
+            ->with(self::RESULT_CLASS_NAME)
+            ->will($this->returnValue(true));
+        $this->ioObjectMock->expects($this->once())
+            ->method('fileExists')
+            ->with($resultFileName)
+            ->will($this->returnValue(false));
+
+        //Mocking _generateCode call
+        $this->classGenerator->expects($this->once())
+            ->method('setName')
+            ->with(self::RESULT_CLASS_NAME)
+            ->will($this->returnSelf());
+        $this->classGenerator->expects($this->once())
+            ->method('addProperties')
+            ->will($this->returnSelf());
+        $this->classGenerator->expects($this->once())
+            ->method('addMethods')
+            ->will($this->returnSelf());
+        $this->classGenerator->expects($this->once())
+            ->method('setClassDocBlock')
+            ->will($this->returnSelf());
+        $this->classGenerator->expects($this->once())
+            ->method('generate')
+            ->will($this->returnValue($generatedCode));
+
+        //Mocking generation
+        $this->ioObjectMock->expects($this->any())
+            ->method('getResultFileName')
+            ->with(self::RESULT_CLASS_NAME)
+            ->will($this->returnValue($resultFileName));
+        $this->ioObjectMock->expects($this->once())
+            ->method('writeResultFile')
+            ->with($resultFileName, $generatedCode);
+
+        $this->assertTrue($this->generator->generate());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Framework/ObjectManager/Code/Generator/GenerateRepositoryTest.php b/dev/tests/unit/testsuite/Magento/Framework/ObjectManager/Code/Generator/GenerateRepositoryTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..1254703f3a38d71d0cb724988d060b417bdb5d68
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Framework/ObjectManager/Code/Generator/GenerateRepositoryTest.php
@@ -0,0 +1,113 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\ObjectManager\Code\Generator;
+
+/**
+ * Class RepositoryTest
+ */
+class GenerateRepositoryTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $ioObjectMock;
+
+    /**
+     * test setUp
+     */
+    protected function setUp()
+    {
+        $this->ioObjectMock = $this->getMock(
+            '\Magento\Framework\Code\Generator\Io',
+            [],
+            [],
+            '',
+            false
+        );
+    }
+
+    /**
+     * generate repository name
+     */
+    public function testGenerate()
+    {
+        require_once __DIR__ . '/_files/Sample.php';
+        $model = $this->getMock(
+            'Magento\Framework\ObjectManager\Code\Generator\Repository',
+            [
+                '_validateData'
+            ],
+            [
+                '\Magento\Framework\ObjectManager\Code\Generator\Sample',
+                null,
+                $this->ioObjectMock,
+                null,
+                null
+            ]
+        );
+        $sampleRepositoryCode = file_get_contents(__DIR__ . '/_files/SampleRepository.txt');
+
+        $this->ioObjectMock->expects($this->once())
+            ->method('getResultFileName')
+            ->with('\Magento\Framework\ObjectManager\Code\Generator\SampleRepository')
+            ->will($this->returnValue('SampleRepository.php'));
+        $this->ioObjectMock->expects($this->once())
+            ->method('writeResultFile')
+            ->with(
+                $this->equalTo('SampleRepository.php'),
+                $this->equalTo($sampleRepositoryCode)
+            );
+
+        $model->expects($this->once())->method('_validateData')->will($this->returnValue(true));
+        $this->assertTrue($model->generate());
+    }
+
+    /**
+     * test protected _validateData()
+     */
+    public function testValidateData()
+    {
+        $sourceClassName = 'Magento_Module_Controller_Index';
+        $resultClassName = 'Magento_Module_Controller';
+
+        $includePathMock = $this->getMockBuilder('Magento\Framework\Autoload\IncludePath')
+            ->disableOriginalConstructor()
+            ->setMethods(['getFile'])
+            ->getMock();
+        $includePathMock->expects($this->at(0))
+            ->method('getFile')
+            ->with($sourceClassName)
+            ->will($this->returnValue(true));
+        $includePathMock->expects($this->at(1))
+            ->method('getFile')
+            ->with($resultClassName)
+            ->will($this->returnValue(false));
+
+        $repository = new Repository(
+            null, null, null, null, $includePathMock
+        );
+        $repository->init($sourceClassName, $resultClassName);
+        $this->assertFalse($repository->generate());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Framework/ObjectManager/Code/Generator/RepositoryTest.php b/dev/tests/unit/testsuite/Magento/Framework/ObjectManager/Code/Generator/RepositoryTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..f6b61de9581a6ff00495bcec7dbe6eb144c1af71
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Framework/ObjectManager/Code/Generator/RepositoryTest.php
@@ -0,0 +1,155 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\ObjectManager\Code\Generator;
+
+use Magento\Framework\Code\Generator\Io;
+use Magento\TestFramework\Helper\ObjectManager;
+
+/**
+ * Class RepositoryTest
+ */
+class RepositoryTest extends \PHPUnit_Framework_TestCase
+{
+    const SOURCE_CLASS_NAME = 'Magento\Framework\ObjectManager\Code\Generator\Sample';
+    const RESULT_CLASS_NAME = 'Magento\Framework\ObjectManager\Code\Generator\SampleRepository';
+    const GENERATOR_CLASS_NAME = 'Magento\Framework\ObjectManager\Code\Generator\Repository';
+    const OUTPUT_FILE_NAME = 'SampleConverter.php';
+    /**
+     * @var Io | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $ioObjectMock;
+
+    /**
+     * @var \Magento\Framework\Code\Generator\EntityAbstract
+     */
+    protected $generator;
+
+    /**
+     * @var \Magento\Framework\Autoload\IncludePath | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $autoloaderMock;
+
+    /**
+     * @var \Magento\Framework\Code\Generator\CodeGenerator\Zend | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $classGenerator;
+
+    protected function setUp()
+    {
+        $this->ioObjectMock = $this->getMock(
+            'Magento\Framework\Code\Generator\Io',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->autoloaderMock = $this->getMock(
+            'Magento\Framework\Autoload\IncludePath',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->classGenerator = $this->getMock(
+            'Magento\Framework\Code\Generator\CodeGenerator\Zend',
+            [],
+            [],
+            '',
+            false
+        );
+
+        $objectManager = new ObjectManager($this);
+        $this->generator = $objectManager->getObject(
+            self::GENERATOR_CLASS_NAME,
+            [
+                'sourceClassName' => self::SOURCE_CLASS_NAME,
+                'resultClassName' => self::RESULT_CLASS_NAME,
+                'ioObject' => $this->ioObjectMock,
+                'classGenerator' => $this->classGenerator,
+                'autoLoader' => $this->autoloaderMock
+            ]
+        );
+    }
+
+    /**
+     * generate repository name
+     */
+    public function testGenerate()
+    {
+        $generatedCode = 'Generated code';
+        $sourceFileName = 'Sample.php';
+        $resultFileName = self::OUTPUT_FILE_NAME;
+
+        //Mocking _validateData call
+        $this->autoloaderMock->expects($this->at(0))
+            ->method('getFile')
+            ->with(self::SOURCE_CLASS_NAME)
+            ->will($this->returnValue($sourceFileName));
+        $this->autoloaderMock->expects($this->at(1))
+            ->method('getFile')
+            ->with(self::RESULT_CLASS_NAME)
+            ->will($this->returnValue(false));
+
+        $this->ioObjectMock->expects($this->once())
+            ->method('makeGenerationDirectory')
+            ->will($this->returnValue(true));
+        $this->ioObjectMock->expects($this->once())
+            ->method('makeResultFileDirectory')
+            ->with(self::RESULT_CLASS_NAME)
+            ->will($this->returnValue(true));
+        $this->ioObjectMock->expects($this->once())
+            ->method('fileExists')
+            ->with($resultFileName)
+            ->will($this->returnValue(false));
+
+        //Mocking _generateCode call
+        $this->classGenerator->expects($this->once())
+            ->method('setName')
+            ->with(self::RESULT_CLASS_NAME)
+            ->will($this->returnSelf());
+        $this->classGenerator->expects($this->once())
+            ->method('addProperties')
+            ->will($this->returnSelf());
+        $this->classGenerator->expects($this->once())
+            ->method('addMethods')
+            ->will($this->returnSelf());
+        $this->classGenerator->expects($this->once())
+            ->method('setClassDocBlock')
+            ->will($this->returnSelf());
+        $this->classGenerator->expects($this->once())
+            ->method('generate')
+            ->will($this->returnValue($generatedCode));
+
+        //Mocking generation
+        $this->ioObjectMock->expects($this->any())
+            ->method('getResultFileName')
+            ->with(self::RESULT_CLASS_NAME)
+            ->will($this->returnValue($resultFileName));
+        $this->ioObjectMock->expects($this->once())
+            ->method('writeResultFile')
+            ->with($resultFileName, $generatedCode);
+
+        $this->assertTrue($this->generator->generate());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Framework/ObjectManager/Code/Generator/_files/SampleRepository.txt b/dev/tests/unit/testsuite/Magento/Framework/ObjectManager/Code/Generator/_files/SampleRepository.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2d4340d4155b09c1ff0d12f0fd02b39ed406afd7
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Framework/ObjectManager/Code/Generator/_files/SampleRepository.txt
@@ -0,0 +1,98 @@
+namespace \Magento\Framework\ObjectManager\Code\Generator;
+
+/**
+ * Repository class for \Magento\Framework\ObjectManager\Code\Generator\Sample
+ */
+class SampleRepository
+{
+    /**
+     * sampleFactory
+     *
+     * @var \Magento\Framework\ObjectManager\Code\Generator\SampleFactory
+     */
+    protected $sampleFactory = null;
+
+    /**
+     * Collection Factory
+     *
+     * @var
+     * \Magento\Framework\ObjectManager\Resource\Code\Generator\Sample\CollectionFactory
+     */
+    protected $sampleCollectionFactory = null;
+
+    /**
+     * Magento\Framework\ObjectManager\Code\Generator\Sample[]
+     *
+     * @var array
+     */
+    protected $registry = array();
+
+    /**
+     * Repository constructor
+     *
+     * @param \Magento\Framework\ObjectManager\Code\Generator\Sample $sampleFactory
+     * @param
+     * \Magento\Framework\ObjectManager\Resource\Code\Generator\Sample\CollectionFactory
+     * $sampleCollectionFactory
+     */
+    public function __construct(\Magento\Framework\ObjectManager\Code\Generator\SampleFactory $sampleFactory, \Magento\Framework\ObjectManager\Resource\Code\Generator\Sample\CollectionFactory $sampleCollectionFactory)
+    {
+        $this->sampleFactory = $sampleFactory;
+        $this->sampleCollectionFactory = $sampleCollectionFactory;
+    }
+
+    /**
+     * load entity
+     *
+     * @param int $id
+     * @return \Magento\Framework\ObjectManager\Code\Generator\Sample
+     * @throws \Magento\Framework\Exception\NoSuchEntityException
+     */
+    public function get($id)
+    {
+        if (!$id) {
+            throw new \Magento\Framework\Exception\NoSuchEntityException('Requested product doesn\'t exist');
+        }
+        if (!isset($this->registry[$id])) {
+            $this->registry[$id] = $this->sampleFactory->create()->load($id);
+        }
+        return $this->registry[$id];
+    }
+
+    /**
+     * Register entity
+     *
+     * @param \Magento\Framework\ObjectManager\Code\Generator\Sample $object
+     * @return \Magento\Framework\ObjectManager\Code\Generator\SampleRepository
+     */
+    public function register(\Magento\Framework\ObjectManager\Code\Generator\Sample $object)
+    {
+        if ($object->getId() && !isset($this->registry[$object->getId()])) {
+            $object->load($object->getId());
+            $this->registry[$object->getId()] = $object;
+        }
+        return $this;
+    }
+
+    /**
+     * Find entities by criteria
+     *
+     * @param \Magento\Framework\Service\V1\Data\SearchCriteria  $criteria
+     * @return \Magento\Framework\ObjectManager\Code\Generator\Sample[]
+     */
+    public function find(\Magento\Framework\Service\V1\Data\SearchCriteria $criteria)
+    {
+        $collection = $this->sampleCollectionFactory->create();
+        foreach($criteria->getFilterGroups() as $filterGroup) {
+            foreach ($filterGroup->getFilters() as $filter) {
+                $condition = $filter->getConditionType() ? $filter->getConditionType() : 'eq';
+                $collection->addFieldToFilter($filter->getField(), [$condition => $filter->getValue()]);
+            }
+        }
+        foreach ($collection as $object) {
+            $this->register($object);
+        }
+        $objectIds = $collection->getAllIds();
+        return array_intersect_key($this->registry, array_flip($objectIds));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Framework/Search/RequestFactoryTest.php b/dev/tests/unit/testsuite/Magento/Framework/Search/RequestFactoryTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..2369f366626635df7ed392e1ba06bd78fce720d7
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Framework/Search/RequestFactoryTest.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)
+ */
+namespace Magento\Framework\Search;
+
+use Magento\TestFramework\Helper\ObjectManager;
+
+class RequestFactoryTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Framework\Search\RequestFactory
+     */
+    private $factory;
+
+    /**
+     * @var \Magento\Framework\ObjectManager|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $objectManager;
+
+    /**
+     * @var \Magento\Framework\Search\Request\Config|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $config;
+
+    protected function setUp()
+    {
+        $helper = new ObjectManager($this);
+
+        $this->objectManager = $this->getMockBuilder('Magento\Framework\ObjectManager')
+            ->setMethods(['create', 'get', 'configure'])
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->config = $this->getMockBuilder('Magento\Framework\Search\Request\Config')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->factory = $helper->getObject(
+            '\Magento\Framework\Search\RequestFactory',
+            [
+                'objectManager' => $this->objectManager,
+                'config' => $this->config
+            ]
+        );
+    }
+
+    public function testCreate()
+    {
+        $requestName = 'request';
+        $bindValues = [':str' => 'rpl'];
+        $configData = [
+            'queries' => ':str',
+            'filters' => 'f',
+            'query' => 'q',
+            'index' => 'i',
+            'from' => 1,
+            'size' => 15
+        ];
+        $mappedQuery = $configData['query'] . 'Mapped';
+        $this->config->expects($this->once())->method('get')->with($this->equalTo($requestName))
+            ->will($this->returnValue($configData));
+
+        /** @var \Magento\Framework\Search\Request\Mapper|\PHPUnit_Framework_MockObject_MockObject $mapper */
+        $mapper = $this->getMockBuilder('Magento\Framework\Search\Request\Mapper')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        /** @var \Magento\Framework\Search\Request|\PHPUnit_Framework_MockObject_MockObject $request */
+        $request = $this->getMockBuilder('Magento\Framework\Search\Request')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->objectManager->expects($this->at(0))->method('create')
+            ->with(
+                $this->equalTo('Magento\Framework\Search\Request\Mapper'),
+                $this->equalTo(
+                    [
+                        'objectManager' => $this->objectManager,
+                        'queries' => $bindValues[':str'],
+                        'filters' => $configData['filters']
+                    ]
+                )
+            )
+            ->will($this->returnValue($mapper));
+        $this->objectManager->expects($this->at(1))->method('create')
+            ->with(
+                $this->equalTo('Magento\Framework\Search\Request'),
+                $this->equalTo(
+                    [
+                        'name' => $configData['query'],
+                        'indexName' => $configData['index'],
+                        'from' => $configData['from'],
+                        'size' => $configData['size'],
+                        'query' => $mappedQuery,
+                        'buckets' => [],
+                    ]
+                )
+            )
+            ->will($this->returnValue($request));
+
+        $mapper->expects($this->once())->method('get')->with($this->equalTo($configData['query']))
+            ->will($this->returnValue($mappedQuery));
+
+        $this->assertEquals($request, $this->factory->create($requestName, $bindValues));
+    }
+
+    /**
+     * @expectedException \InvalidArgumentException
+     */
+    public function testCreateInvalidArgumentException()
+    {
+        $requestName = 'rn';
+        $this->config->expects($this->once())->method('get')->with($this->equalTo($requestName))
+            ->will($this->returnValue(null));
+
+        $this->factory->create($requestName);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/BuilderTest.php b/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/BuilderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..61c9b5cf360f095df48961f13510e416a8260c1d
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/BuilderTest.php
@@ -0,0 +1,156 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\Service\Code\Generator;
+
+use Magento\Framework\Code\Generator\Io;
+use Magento\TestFramework\Helper\ObjectManager;
+
+/**
+ * Class BuilderTest
+ */
+class BuilderTest extends \PHPUnit_Framework_TestCase
+{
+    const SOURCE_CLASS_NAME = 'Magento\Framework\Service\Code\Generator\Sample';
+    const RESULT_CLASS_NAME = 'Magento\Framework\Service\Code\Generator\SampleBuilder';
+    const GENERATOR_CLASS_NAME = 'Magento\Framework\Service\Code\Generator\Builder';
+    const OUTPUT_FILE_NAME = 'SampleBuilder.php';
+    /**
+     * @var Io | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $ioObjectMock;
+
+    /**
+     * @var \Magento\Framework\Code\Generator\EntityAbstract
+     */
+    protected $generator;
+
+    /**
+     * @var \Magento\Framework\Autoload\IncludePath | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $autoloaderMock;
+
+    /**
+     * @var \Magento\Framework\Code\Generator\CodeGenerator\Zend | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $classGenerator;
+
+    protected function setUp()
+    {
+        require_once __DIR__ . '/_files/Sample.php';
+        $this->ioObjectMock = $this->getMock(
+            'Magento\Framework\Code\Generator\Io',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->autoloaderMock = $this->getMock(
+            'Magento\Framework\Autoload\IncludePath',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->classGenerator = $this->getMock(
+            'Magento\Framework\Code\Generator\CodeGenerator\Zend',
+            [],
+            [],
+            '',
+            false
+        );
+
+        $objectManager = new ObjectManager($this);
+        $this->generator = $objectManager->getObject(
+            self::GENERATOR_CLASS_NAME,
+            [
+                'sourceClassName' => self::SOURCE_CLASS_NAME,
+                'resultClassName' => self::RESULT_CLASS_NAME,
+                'ioObject' => $this->ioObjectMock,
+                'classGenerator' => $this->classGenerator,
+                'autoLoader' => $this->autoloaderMock
+            ]
+        );
+    }
+
+    /**
+     * generate repository name
+     */
+    public function testGenerate()
+    {
+        $generatedCode = 'Generated code';
+        $sourceFileName = 'Sample.php';
+        $resultFileName = self::OUTPUT_FILE_NAME;
+
+        //Mocking _validateData call
+        $this->autoloaderMock->expects($this->at(0))
+            ->method('getFile')
+            ->with(self::SOURCE_CLASS_NAME)
+            ->will($this->returnValue($sourceFileName));
+        $this->autoloaderMock->expects($this->at(1))
+            ->method('getFile')
+            ->with(self::RESULT_CLASS_NAME)
+            ->will($this->returnValue(false));
+
+        $this->ioObjectMock->expects($this->once())
+            ->method('makeGenerationDirectory')
+            ->will($this->returnValue(true));
+        $this->ioObjectMock->expects($this->once())
+            ->method('makeResultFileDirectory')
+            ->with(self::RESULT_CLASS_NAME)
+            ->will($this->returnValue(true));
+        $this->ioObjectMock->expects($this->once())
+            ->method('fileExists')
+            ->with($resultFileName)
+            ->will($this->returnValue(false));
+
+        //Mocking _generateCode call
+        $this->classGenerator->expects($this->once())
+            ->method('setName')
+            ->with(self::RESULT_CLASS_NAME)
+            ->will($this->returnSelf());
+        $this->classGenerator->expects($this->once())
+            ->method('addProperties')
+            ->will($this->returnSelf());
+        $this->classGenerator->expects($this->once())
+            ->method('addMethods')
+            ->will($this->returnSelf());
+        $this->classGenerator->expects($this->once())
+            ->method('setClassDocBlock')
+            ->will($this->returnSelf());
+        $this->classGenerator->expects($this->once())
+            ->method('generate')
+            ->will($this->returnValue($generatedCode));
+
+        //Mocking generation
+        $this->ioObjectMock->expects($this->any())
+            ->method('getResultFileName')
+            ->with(self::RESULT_CLASS_NAME)
+            ->will($this->returnValue($resultFileName));
+        $this->ioObjectMock->expects($this->once())
+            ->method('writeResultFile')
+            ->with($resultFileName, $generatedCode);
+
+        $this->assertTrue($this->generator->generate());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/GenerateBuilderTest.php b/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/GenerateBuilderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..59033b4611569a9980195497978a442cf30b8801
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/GenerateBuilderTest.php
@@ -0,0 +1,83 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\Service\Code\Generator;
+
+/**
+ * Class BuilderTest
+ */
+class GenerateBuilderTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $ioObjectMock;
+
+    /**
+     * Prepare test env
+     */
+    protected function setUp()
+    {
+        $this->ioObjectMock = $this->getMock(
+            '\Magento\Framework\Code\Generator\Io',
+            [],
+            [],
+            '',
+            false
+        );
+    }
+
+    /**
+     * generate repository class
+     */
+    public function testGenerate()
+    {
+        require_once __DIR__ . '/_files/Sample.php';
+        $model = $this->getMock(
+            'Magento\Framework\Service\Code\Generator\Builder',
+            [
+                '_validateData'
+            ],
+            [
+                '\Magento\Framework\Service\Code\Generator\Sample',
+                null,
+                $this->ioObjectMock,
+                null,
+                null
+            ]
+        );
+        $sampleBuilderCode = file_get_contents(__DIR__ . '/_files/SampleBuilder.txt');
+        $this->ioObjectMock->expects($this->once())
+            ->method('getResultFileName')
+            ->with('\Magento\Framework\Service\Code\Generator\SampleBuilder')
+            ->will($this->returnValue('SampleBuilder.php'));
+        $this->ioObjectMock->expects($this->once())
+            ->method('writeResultFile')
+            ->with('SampleBuilder.php', $sampleBuilderCode);
+
+        $model->expects($this->once())
+            ->method('_validateData')
+            ->will($this->returnValue(true));
+        $this->assertTrue($model->generate());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/GenerateMapperTest.php b/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/GenerateMapperTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..0effd4a0c81a52fa389e000a6e7d2b659c532dcf
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/GenerateMapperTest.php
@@ -0,0 +1,83 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\Service\Code\Generator;
+
+/**
+ * Class MapperTest
+ */
+class GenerateMapperTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $ioObjectMock;
+
+    /**
+     * Prepare test env
+     */
+    protected function setUp()
+    {
+        $this->ioObjectMock = $this->getMock(
+            '\Magento\Framework\Code\Generator\Io',
+            [],
+            [],
+            '',
+            false
+        );
+    }
+
+    /**
+     * Create mock for class \Magento\Framework\Code\Generator\Io
+     */
+    public function testGenerate()
+    {
+        require_once __DIR__ . '/_files/Sample.php';
+        $model = $this->getMock(
+            'Magento\Framework\Service\Code\Generator\Mapper',
+            [
+                '_validateData'
+            ],
+            [
+                '\Magento\Framework\Service\Code\Generator\Sample',
+                null,
+                $this->ioObjectMock,
+                null,
+                null
+            ]
+        );
+        $sampleMapperCode = file_get_contents(__DIR__ . '/_files/SampleMapper.txt');
+        $this->ioObjectMock->expects($this->once())
+            ->method('getResultFileName')
+            ->with('\Magento\Framework\Service\Code\Generator\SampleMapper')
+            ->will($this->returnValue('SampleMapper.php'));
+        $this->ioObjectMock->expects($this->once())
+            ->method('writeResultFile')
+            ->with('SampleMapper.php', $sampleMapperCode);
+
+        $model->expects($this->once())
+            ->method('_validateData')
+            ->will($this->returnValue(true));
+        $this->assertTrue($model->generate());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/GenerateSearchResultsBuilderTest.php b/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/GenerateSearchResultsBuilderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..4af404ba580d98bc8dfa7ce55dadb7bc2e872d4a
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/GenerateSearchResultsBuilderTest.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\Framework\Service\Code\Generator;
+
+use Magento\Framework\Service\Code\Generator\SearchResultsBuilder;
+
+/**
+ * Class SearchResultBuilderTest
+ */
+class GenerateSearchResultsBuilderTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $ioObjectMock;
+
+    /**
+     * Create mock for class \Magento\Framework\Code\Generator\Io
+     */
+    protected function setUp()
+    {
+        $this->ioObjectMock = $this->getMock(
+            '\Magento\Framework\Code\Generator\Io',
+            [],
+            [],
+            '',
+            false
+        );
+    }
+
+    /**
+     * generate SearchResultBuilder class
+     */
+    public function testGenerate()
+    {
+        require_once __DIR__ . '/_files/Sample.php';
+        $model = $this->getMock(
+            'Magento\Framework\Service\Code\Generator\SearchResultsBuilder',
+            [
+                '_validateData'
+            ],
+            [
+                '\Magento\Framework\Service\Code\Generator\Sample',
+                null,
+                $this->ioObjectMock,
+                null,
+                null
+            ]
+        );
+        $sampleSearchResultBuilderCode = file_get_contents(__DIR__ . '/_files/SampleSearchResultsBuilder.txt');
+        $this->ioObjectMock->expects($this->once())
+            ->method('getResultFileName')
+            ->with('\Magento\Framework\Service\Code\Generator\SampleSearchResultsBuilder')
+            ->will($this->returnValue('SampleSearchResultsBuilder.php'));
+        $this->ioObjectMock->expects($this->once())
+            ->method('writeResultFile')
+            ->with('SampleSearchResultsBuilder.php', $sampleSearchResultBuilderCode);
+
+        $model->expects($this->once())
+            ->method('_validateData')
+            ->will($this->returnValue(true));
+        $this->assertTrue($model->generate());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/GenerateSearchResultsTest.php b/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/GenerateSearchResultsTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..a2d0c66423e6867354c323de3d2f86e9bfe4ba17
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/GenerateSearchResultsTest.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\Framework\Service\Code\Generator;
+
+use Magento\Framework\Service\Code\Generator\SearchResults;
+
+/**
+ * Class SearchResultTest
+ */
+class GenerateSearchResultsTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $ioObjectMock;
+
+    /**
+     * Create mock for class \Magento\Framework\Code\Generator\Io
+     */
+    protected function setUp()
+    {
+        $this->ioObjectMock = $this->getMock(
+            '\Magento\Framework\Code\Generator\Io',
+            [],
+            [],
+            '',
+            false
+        );
+    }
+
+    /**
+     * Generate SearchResult class
+     */
+    public function testGenerate()
+    {
+        require_once __DIR__ . '/_files/Sample.php';
+        $model = $this->getMock(
+            'Magento\Framework\Service\Code\Generator\SearchResults',
+            [
+                '_validateData'
+            ],
+            [
+                '\Magento\Framework\Service\Code\Generator\Sample',
+                null,
+                $this->ioObjectMock,
+                null,
+                null
+            ]
+        );
+        $sampleSearchResultBuilderCode = file_get_contents(__DIR__ . '/_files/SampleSearchResults.txt');
+        $this->ioObjectMock->expects($this->once())
+            ->method('getResultFileName')
+            ->with('\Magento\Framework\Service\Code\Generator\SampleSearchResults')
+            ->will($this->returnValue('SampleSearchResults.php'));
+        $this->ioObjectMock->expects($this->once())
+            ->method('writeResultFile')
+            ->with('SampleSearchResults.php', $sampleSearchResultBuilderCode);
+
+        $model->expects($this->once())
+            ->method('_validateData')
+            ->will($this->returnValue(true));
+        $this->assertTrue($model->generate());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/MapperTest.php b/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/MapperTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..66207b268d7eb4771ac6e82277037449a4281eed
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/MapperTest.php
@@ -0,0 +1,155 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\Service\Code\Generator;
+
+use Magento\Framework\Code\Generator\Io;
+use Magento\TestFramework\Helper\ObjectManager;
+
+/**
+ * Class MapperTest
+ */
+class MapperTest extends \PHPUnit_Framework_TestCase
+{
+    const SOURCE_CLASS_NAME = 'Magento\Framework\Service\Code\Generator\Sample';
+    const RESULT_CLASS_NAME = 'Magento\Framework\Service\Code\Generator\SampleMapper';
+    const GENERATOR_CLASS_NAME = 'Magento\Framework\Service\Code\Generator\Mapper';
+    const OUTPUT_FILE_NAME = 'SampleMapper.php';
+    /**
+     * @var Io | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $ioObjectMock;
+
+    /**
+     * @var \Magento\Framework\Code\Generator\EntityAbstract
+     */
+    protected $generator;
+
+    /**
+     * @var \Magento\Framework\Autoload\IncludePath | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $autoloaderMock;
+
+    /**
+     * @var \Magento\Framework\Code\Generator\CodeGenerator\Zend | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $classGenerator;
+
+    protected function setUp()
+    {
+        $this->ioObjectMock = $this->getMock(
+            'Magento\Framework\Code\Generator\Io',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->autoloaderMock = $this->getMock(
+            'Magento\Framework\Autoload\IncludePath',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->classGenerator = $this->getMock(
+            'Magento\Framework\Code\Generator\CodeGenerator\Zend',
+            [],
+            [],
+            '',
+            false
+        );
+
+        $objectManager = new ObjectManager($this);
+        $this->generator = $objectManager->getObject(
+            self::GENERATOR_CLASS_NAME,
+            [
+                'sourceClassName' => self::SOURCE_CLASS_NAME,
+                'resultClassName' => self::RESULT_CLASS_NAME,
+                'ioObject' => $this->ioObjectMock,
+                'classGenerator' => $this->classGenerator,
+                'autoLoader' => $this->autoloaderMock
+            ]
+        );
+    }
+
+    /**
+     * generate repository name
+     */
+    public function testGenerate()
+    {
+        $generatedCode = 'Generated code';
+        $sourceFileName = 'Sample.php';
+        $resultFileName = self::OUTPUT_FILE_NAME;
+
+        //Mocking _validateData call
+        $this->autoloaderMock->expects($this->at(0))
+            ->method('getFile')
+            ->with(self::SOURCE_CLASS_NAME)
+            ->will($this->returnValue($sourceFileName));
+        $this->autoloaderMock->expects($this->at(1))
+            ->method('getFile')
+            ->with(self::RESULT_CLASS_NAME)
+            ->will($this->returnValue(false));
+
+        $this->ioObjectMock->expects($this->once())
+            ->method('makeGenerationDirectory')
+            ->will($this->returnValue(true));
+        $this->ioObjectMock->expects($this->once())
+            ->method('makeResultFileDirectory')
+            ->with(self::RESULT_CLASS_NAME)
+            ->will($this->returnValue(true));
+        $this->ioObjectMock->expects($this->once())
+            ->method('fileExists')
+            ->with($resultFileName)
+            ->will($this->returnValue(false));
+
+        //Mocking _generateCode call
+        $this->classGenerator->expects($this->once())
+            ->method('setName')
+            ->with(self::RESULT_CLASS_NAME)
+            ->will($this->returnSelf());
+        $this->classGenerator->expects($this->once())
+            ->method('addProperties')
+            ->will($this->returnSelf());
+        $this->classGenerator->expects($this->once())
+            ->method('addMethods')
+            ->will($this->returnSelf());
+        $this->classGenerator->expects($this->once())
+            ->method('setClassDocBlock')
+            ->will($this->returnSelf());
+        $this->classGenerator->expects($this->once())
+            ->method('generate')
+            ->will($this->returnValue($generatedCode));
+
+        //Mocking generation
+        $this->ioObjectMock->expects($this->any())
+            ->method('getResultFileName')
+            ->with(self::RESULT_CLASS_NAME)
+            ->will($this->returnValue($resultFileName));
+        $this->ioObjectMock->expects($this->once())
+            ->method('writeResultFile')
+            ->with($resultFileName, $generatedCode);
+
+        $this->assertTrue($this->generator->generate());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/SearchResultsBuilderTest.php b/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/SearchResultsBuilderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..eebadd7f6ab832effcbf30c9f6c79fc1e943ebd0
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/SearchResultsBuilderTest.php
@@ -0,0 +1,157 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\Service\Code\Generator;
+
+use Magento\Framework\Code\Generator\Io;
+use Magento\TestFramework\Helper\ObjectManager;
+
+/**
+ * Class MapperTest
+ */
+class SearchResultsBuilderTest extends \PHPUnit_Framework_TestCase
+{
+    const SOURCE_CLASS_NAME = 'Magento\Framework\Service\Code\Generator\Sample';
+    const RESULT_CLASS_NAME = 'Magento\Framework\Service\Code\Generator\SampleSearchResultsBuilder';
+    const GENERATOR_CLASS_NAME = 'Magento\Framework\Service\Code\Generator\SearchResultsBuilder';
+    const OUTPUT_FILE_NAME = 'SampleSearchResultsBuilder.php';
+
+    /**
+     * @var Io | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $ioObjectMock;
+
+    /**
+     * @var \Magento\Framework\Code\Generator\EntityAbstract
+     */
+    protected $generator;
+
+    /**
+     * @var \Magento\Framework\Autoload\IncludePath | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $autoloaderMock;
+
+    /**
+     * @var \Magento\Framework\Code\Generator\CodeGenerator\Zend | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $classGenerator;
+
+    protected function setUp()
+    {
+        $this->ioObjectMock = $this->getMock(
+            'Magento\Framework\Code\Generator\Io',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->autoloaderMock = $this->getMock(
+            'Magento\Framework\Autoload\IncludePath',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->classGenerator = $this->getMock(
+            'Magento\Framework\Code\Generator\CodeGenerator\Zend',
+            [],
+            [],
+            '',
+            false
+        );
+
+        $objectManager = new ObjectManager($this);
+        $this->generator = $objectManager->getObject(
+            self::GENERATOR_CLASS_NAME,
+            [
+                'sourceClassName' => self::SOURCE_CLASS_NAME,
+                'resultClassName' => self::RESULT_CLASS_NAME,
+                'ioObject' => $this->ioObjectMock,
+                'classGenerator' => $this->classGenerator,
+                'autoLoader' => $this->autoloaderMock
+            ]
+        );
+    }
+
+    /**
+     * generate repository name
+     */
+    public function testGenerate()
+    {
+        $generatedCode = 'Generated code';
+        $sourceFileName = 'Sample.php';
+        $resultFileName = self::OUTPUT_FILE_NAME;
+
+        //Mocking _validateData call
+        $this->autoloaderMock->expects($this->at(0))
+            ->method('getFile')
+            ->with(self::SOURCE_CLASS_NAME)
+            ->will($this->returnValue($sourceFileName));
+        $this->autoloaderMock->expects($this->at(1))
+            ->method('getFile')
+            ->with(self::RESULT_CLASS_NAME)
+            ->will($this->returnValue(false));
+
+        $this->ioObjectMock->expects($this->once())
+            ->method('makeGenerationDirectory')
+            ->will($this->returnValue(true));
+        $this->ioObjectMock->expects($this->once())
+            ->method('makeResultFileDirectory')
+            ->with(self::RESULT_CLASS_NAME)
+            ->will($this->returnValue(true));
+        $this->ioObjectMock->expects($this->once())
+            ->method('fileExists')
+            ->with($resultFileName)
+            ->will($this->returnValue(false));
+
+        //Mocking _generateCode call
+        $this->classGenerator->expects($this->once())
+            ->method('setName')
+            ->with(self::RESULT_CLASS_NAME)
+            ->will($this->returnSelf());
+        $this->classGenerator->expects($this->once())
+            ->method('setExtendedClass')
+            ->with(SearchResultsBuilder::SEARCH_RESULT_BUILDER)
+            ->will($this->returnSelf());
+        $this->classGenerator->expects($this->once())
+            ->method('addMethods')
+            ->will($this->returnSelf());
+        $this->classGenerator->expects($this->once())
+            ->method('setClassDocBlock')
+            ->will($this->returnSelf());
+        $this->classGenerator->expects($this->once())
+            ->method('generate')
+            ->will($this->returnValue($generatedCode));
+
+        //Mocking generation
+        $this->ioObjectMock->expects($this->any())
+            ->method('getResultFileName')
+            ->with(self::RESULT_CLASS_NAME)
+            ->will($this->returnValue($resultFileName));
+        $this->ioObjectMock->expects($this->once())
+            ->method('writeResultFile')
+            ->with($resultFileName, $generatedCode);
+
+        $this->assertTrue($this->generator->generate());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/SearchResultsTest.php b/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/SearchResultsTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..c27513612f668205e90edb4a05d8e0acc3c8aaa0
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/SearchResultsTest.php
@@ -0,0 +1,155 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\Service\Code\Generator;
+
+use Magento\Framework\Code\Generator\Io;
+use Magento\TestFramework\Helper\ObjectManager;
+
+/**
+ * Class MapperTest
+ */
+class SearchResultsTest extends \PHPUnit_Framework_TestCase
+{
+    const SOURCE_CLASS_NAME = 'Magento\Framework\Service\Code\Generator\Sample';
+    const RESULT_CLASS_NAME = 'Magento\Framework\Service\Code\Generator\SampleSearchResults';
+    const GENERATOR_CLASS_NAME = 'Magento\Framework\Service\Code\Generator\SearchResults';
+    const OUTPUT_FILE_NAME = 'SampleSearchResults.php';
+
+    /**
+     * @var Io | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $ioObjectMock;
+
+    /**
+     * @var \Magento\Framework\Code\Generator\EntityAbstract
+     */
+    protected $generator;
+
+    /**
+     * @var \Magento\Framework\Autoload\IncludePath | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $autoloaderMock;
+
+    /**
+     * @var \Magento\Framework\Code\Generator\CodeGenerator\Zend | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $classGenerator;
+
+    protected function setUp()
+    {
+        $this->ioObjectMock = $this->getMock(
+            'Magento\Framework\Code\Generator\Io',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->autoloaderMock = $this->getMock(
+            'Magento\Framework\Autoload\IncludePath',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->classGenerator = $this->getMock(
+            'Magento\Framework\Code\Generator\CodeGenerator\Zend',
+            [],
+            [],
+            '',
+            false
+        );
+
+        $objectManager = new ObjectManager($this);
+        $this->generator = $objectManager->getObject(
+            self::GENERATOR_CLASS_NAME,
+            [
+                'sourceClassName' => self::SOURCE_CLASS_NAME,
+                'resultClassName' => self::RESULT_CLASS_NAME,
+                'ioObject' => $this->ioObjectMock,
+                'classGenerator' => $this->classGenerator,
+                'autoLoader' => $this->autoloaderMock
+            ]
+        );
+    }
+
+    /**
+     * generate repository name
+     */
+    public function testGenerate()
+    {
+        $generatedCode = 'Generated code';
+        $sourceFileName = 'Sample.php';
+        $resultFileName = self::OUTPUT_FILE_NAME;
+
+        //Mocking _validateData call
+        $this->autoloaderMock->expects($this->at(0))
+            ->method('getFile')
+            ->with(self::SOURCE_CLASS_NAME)
+            ->will($this->returnValue($sourceFileName));
+        $this->autoloaderMock->expects($this->at(1))
+            ->method('getFile')
+            ->with(self::RESULT_CLASS_NAME)
+            ->will($this->returnValue(false));
+
+        $this->ioObjectMock->expects($this->once())
+            ->method('makeGenerationDirectory')
+            ->will($this->returnValue(true));
+        $this->ioObjectMock->expects($this->once())
+            ->method('makeResultFileDirectory')
+            ->with(self::RESULT_CLASS_NAME)
+            ->will($this->returnValue(true));
+        $this->ioObjectMock->expects($this->once())
+            ->method('fileExists')
+            ->with($resultFileName)
+            ->will($this->returnValue(false));
+
+        //Mocking _generateCode call
+        $this->classGenerator->expects($this->once())
+            ->method('setName')
+            ->with(self::RESULT_CLASS_NAME)
+            ->will($this->returnSelf());
+        $this->classGenerator->expects($this->once())
+            ->method('setExtendedClass')
+            ->with(SearchResults::SEARCH_RESULT)
+            ->will($this->returnSelf());
+        $this->classGenerator->expects($this->once())
+            ->method('addMethods')
+            ->will($this->returnSelf());
+
+        $this->classGenerator->expects($this->once())
+            ->method('generate')
+            ->will($this->returnValue($generatedCode));
+
+        //Mocking generation
+        $this->ioObjectMock->expects($this->any())
+            ->method('getResultFileName')
+            ->with(self::RESULT_CLASS_NAME)
+            ->will($this->returnValue($resultFileName));
+        $this->ioObjectMock->expects($this->once())
+            ->method('writeResultFile')
+            ->with($resultFileName, $generatedCode);
+
+        $this->assertTrue($this->generator->generate());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/_files/Sample.php b/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/_files/Sample.php
new file mode 100644
index 0000000000000000000000000000000000000000..5c68f84fb3117a3a8180a01a47f7a2f6215a86f1
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/_files/Sample.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\Framework\Service\Code\Generator;
+
+/**
+ * Class Sample for Proxy and Factory generation
+ */
+class Sample
+{
+    /**
+     * @var array
+     */
+    protected $messages = array();
+
+    /**
+     * @return array
+     */
+    public function getMessages()
+    {
+        return $this->messages;
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/_files/SampleBuilder.txt b/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/_files/SampleBuilder.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c6c952b7600f06ada1e4e3f72af711b1ff30232d
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/_files/SampleBuilder.txt
@@ -0,0 +1,15 @@
+namespace \Magento\Framework\Service\Code\Generator;
+
+/**
+ * Builder class for \Magento\Framework\Service\Code\Generator\Sample
+ */
+class SampleBuilder extends \Magento\Framework\Service\Data\AbstractObjectBuilder
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function setMessages($messages)
+    {
+        $this->_set(\Magento\Framework\Service\Code\Generator\Sample::MESSAGES, $messages);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/_files/SampleMapper.txt b/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/_files/SampleMapper.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6c0f698e38c9801ad75f0c16c401fc1de0d1764f
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/_files/SampleMapper.txt
@@ -0,0 +1,43 @@
+namespace \Magento\Framework\Service\Code\Generator;
+
+/**
+ * Mapper class for \Magento\Framework\Service\Code\Generator\Sample
+ */
+class SampleMapper
+{
+    /**
+     * sampleBuilder
+     *
+     * @var \Magento\Framework\Service\Code\Generator\SampleBuilder
+     */
+    protected $sampleBuilder = null;
+
+    /**
+     * Magento\Framework\Service\Code\Generator\Sample[]
+     *
+     * @var array
+     */
+    protected $registry = array();
+
+    /**
+     * Mapper constructor
+     *
+     * @param \Magento\Framework\Service\Code\Generator\Sample $sampleBuilder
+     */
+    public function __construct(\Magento\Framework\Service\Code\Generator\SampleBuilder $sampleBuilder)
+    {
+        $this->sampleBuilder = $sampleBuilder;
+    }
+
+    /**
+     * Extract data object from model
+     *
+     * @param \Magento\Framework\Model\AbstractModel $object
+     * @return \Magento\Framework\Service\Code\Generator\Sample
+     */
+    public function extractDto(\Magento\Framework\Model\AbstractModel $object)
+    {
+        $this->sampleBuilder->populateWithArray($object->getData());
+        return $this->sampleBuilder->create();
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/_files/SampleSearchResults.txt b/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/_files/SampleSearchResults.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e98e4d3a8dc4883e1c0949ed4eb236d1e4f64096
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/_files/SampleSearchResults.txt
@@ -0,0 +1,14 @@
+namespace \Magento\Framework\Service\Code\Generator;
+
+class SampleSearchResults extends \Magento\Framework\Service\V1\Data\SearchResults
+{
+    /**
+     * Returns array of items
+     *
+     * @return \Magento\Framework\Service\Code\Generator\Sample[]
+     */
+    public function getItems()
+    {
+        return parent::getItems();
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/_files/SampleSearchResultsBuilder.txt b/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/_files/SampleSearchResultsBuilder.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e6e0a47c1edd2089ac6687562ecba6a568d14f8b
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Framework/Service/Code/Generator/_files/SampleSearchResultsBuilder.txt
@@ -0,0 +1,17 @@
+namespace \Magento\Framework\Service\Code\Generator;
+
+/**
+ * SearchResultsBuilder class for \Magento\Framework\Service\Code\Generator\Sample
+ */
+class SampleSearchResultsBuilder extends \Magento\Framework\Service\V1\Data\AbstractSearchResultsBuilder
+{
+    /**
+     * SearchResultsBuilder constructor
+     *
+     * @param
+     */
+    public function __construct(\Magento\Framework\Service\Data\ObjectFactory $objectFactory, \Magento\Framework\Service\V1\Data\SearchCriteriaBuilder $searchCriteriaBuilder, \Magento\Framework\Service\Code\Generator\SampleBuilder $itemObjectBuilder)
+    {
+        parent::__construct($objectFactory, $searchCriteriaBuilder, $itemObjectBuilder);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Framework/Session/SessionManagerTest.php b/dev/tests/unit/testsuite/Magento/Framework/Session/SessionManagerTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..1b7e52ee1644216ac51f8cee8b9c67ad2980ff11
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Framework/Session/SessionManagerTest.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)
+ */
+// @codingStandardsIgnoreStart
+namespace {
+    $mockPHPFunctions = false;
+}
+
+namespace Magento\Framework\Session {
+    // @codingStandardsIgnoreEnd
+
+    /**
+     * Mock ini_set global function
+     *
+     * @param string $varName
+     * @param string $newValue
+     * @return bool|string
+     */
+    function ini_set($varName, $newValue)
+    {
+        global $mockPHPFunctions;
+        if ($mockPHPFunctions) {
+            SessionManagerTest::$isIniSetInvoked = true;
+            SessionManagerTest::assertSame(SessionManagerTest::SESSION_USE_ONLY_COOKIES, $varName);
+            SessionManagerTest::assertSame(SessionManagerTest::SESSION_USE_ONLY_COOKIES_ENABLE, $newValue);
+            return true;
+        }
+        return call_user_func_array('\ini_set', func_get_args());
+    }
+
+    /**
+     * Mock session_regenerate_id to fail if false is passed
+     *
+     * @param bool $var
+     * @return bool
+     */
+    function session_regenerate_id($var)
+    {
+        global $mockPHPFunctions;
+        if ($mockPHPFunctions) {
+            SessionManagerTest::assertTrue($var);
+            return true;
+        }
+        return call_user_func_array('\session_regenerate_id', func_get_args());
+    }
+
+    
+    /**
+     * Test SessionManager
+     *
+     */
+    class SessionManagerTest extends \PHPUnit_Framework_TestCase
+    {
+        const SESSION_USE_ONLY_COOKIES = 'session.use_only_cookies';
+        const SESSION_USE_ONLY_COOKIES_ENABLE = '1';
+
+        /**
+         * @var \Magento\TestFramework\Helper\ObjectManager
+         */
+        private $objectManager;
+
+        /**
+         * @var \Magento\Framework\Session\SessionManager
+         */
+        private $sessionManager;
+
+        /**
+         * @var \Magento\Framework\Session\Config\ConfigInterface | \PHPUnit_Framework_MockObject_MockObject
+         */
+        private $mockSessionConfig;
+
+        /**
+         * @var bool
+         */
+        public static $isIniSetInvoked;
+
+        public function setUp()
+        {
+            global $mockPHPFunctions;
+            $mockPHPFunctions = true;
+            $this->mockSessionConfig = $this->getMockBuilder('\Magento\Framework\Session\Config\ConfigInterface')
+                ->disableOriginalConstructor()
+                ->getMock();
+
+            $this->objectManager = new \Magento\TestFramework\Helper\ObjectManager($this);
+            $arguments = ['sessionConfig' => $this->mockSessionConfig];
+            $this->sessionManager = $this->objectManager->getObject(
+                'Magento\Framework\Session\SessionManager',
+                $arguments
+            );
+        }
+
+        public function testSessionManagerConstructor()
+        {
+            self::$isIniSetInvoked = false;
+            $this->objectManager->getObject('Magento\Framework\Session\SessionManager');
+            $this->assertTrue(SessionManagerTest::$isIniSetInvoked);
+        }
+
+        /**
+         * @runInSeparateProcess
+         */
+        public function testRegenerateId()
+        {
+            require_once __DIR__ . '/../../_files/session_backend_mock.php';
+
+            $this->mockSessionConfig->expects($this->once())
+                ->method('getUseCookies')
+                ->will($this->returnValue(false));
+            $this->assertSame($this->sessionManager, $this->sessionManager->regenerateId());
+        }
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Framework/Stdlib/Cookie/CookieScopeTest.php b/dev/tests/unit/testsuite/Magento/Framework/Stdlib/Cookie/CookieScopeTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..6122770c29116045707f93b7d6f6c3ab85e09f7d
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Framework/Stdlib/Cookie/CookieScopeTest.php
@@ -0,0 +1,309 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\Stdlib\Cookie;
+
+use Magento\TestFramework\Helper\ObjectManager;
+
+/**
+ * Test CookieScope
+ *
+ * @coversDefaultClass Magento\Framework\Stdlib\Cookie\CookieScope
+ */
+class CookieScopeTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var ObjectManager
+     */
+    private $objectManager;
+
+    private $defaultScopeParams;
+
+    public function setUp()
+    {
+        $this->objectManager = new ObjectManager($this);
+        $cookieMetadataFactory = $this
+            ->getMockBuilder('Magento\Framework\Stdlib\Cookie\CookieMetadataFactory')
+            ->disableOriginalConstructor()->getMock();
+        $cookieMetadataFactory->expects($this->any())
+            ->method('createSensitiveCookieMetadata')
+            ->will($this->returnCallback([$this, 'createSensitiveMetadata']));
+        $cookieMetadataFactory->expects($this->any())
+            ->method('createPublicCookieMetadata')
+            ->will($this->returnCallback([$this, 'createPublicMetadata']));
+        $cookieMetadataFactory->expects($this->any())
+            ->method('createCookieMetadata')
+            ->will($this->returnCallback([$this, 'createCookieMetadata']));
+        $this->defaultScopeParams = [
+            'cookieMetadataFactory' => $cookieMetadataFactory
+        ];
+    }
+
+    /**
+     * @covers ::getSensitiveCookieMetadata
+     */
+    public function testGetSensitiveCookieMetadataEmpty()
+    {
+        $cookieScope = $this->createCookieScope();
+
+        $this->assertEmpty($cookieScope->getSensitiveCookieMetadata()->__toArray());
+    }
+
+    /**
+     * @covers ::getPublicCookieMetadata
+     */
+    public function testGetPublicCookieMetadataEmpty()
+    {
+        $cookieScope = $this->createCookieScope();
+
+        $this->assertEmpty($cookieScope->getPublicCookieMetadata()->__toArray());
+    }
+
+    /**
+     * @covers ::getCookieMetadata
+     */
+    public function testGetCookieMetadataEmpty()
+    {
+        $cookieScope = $this->createCookieScope();
+
+        $this->assertEmpty($cookieScope->getPublicCookieMetadata()->__toArray());
+    }
+
+    /**
+     * @covers ::createSensitiveMetadata ::getPublicCookieMetadata
+     */
+    public function testGetSensitiveCookieMetadataDefaults()
+    {
+        $defaultValues = [
+            SensitiveCookieMetadata::KEY_PATH => 'default path',
+            SensitiveCookieMetadata::KEY_DOMAIN => 'default domain',
+        ];
+        $sensitive = $this->createSensitiveMetadata($defaultValues);
+        $cookieScope = $this->createCookieScope(
+            [
+                'sensitiveCookieMetadata' => $sensitive,
+                'publicCookieMetadata' => null,
+                'deleteCookieMetadata' => null
+            ]
+        );
+
+        $this->assertEmpty($cookieScope->getPublicCookieMetadata()->__toArray());
+        $this->assertEmpty($cookieScope->getCookieMetadata()->__toArray());
+        $this->assertEquals($defaultValues, $cookieScope->getSensitiveCookieMetadata()->__toArray());
+    }
+
+    /**
+     * @covers ::createSensitiveMetadata ::getPublicCookieMetadata ::getCookieMetadata
+     */
+    public function testGetPublicCookieMetadataDefaults()
+    {
+        $defaultValues = [
+            PublicCookieMetadata::KEY_PATH => 'default path',
+            PublicCookieMetadata::KEY_DOMAIN => 'default domain',
+            PublicCookieMetadata::KEY_DURATION => 'default duration',
+            PublicCookieMetadata::KEY_HTTP_ONLY => 'default http',
+            PublicCookieMetadata::KEY_SECURE => 'default secure',
+        ];
+        $public = $this->createPublicMetadata($defaultValues);
+        $cookieScope = $this->createCookieScope(
+            [
+                'sensitiveCookieMetadata' => null,
+                'publicCookieMetadata' => $public,
+                'deleteCookieMetadata' => null
+            ]
+        );
+
+        $this->assertEmpty($cookieScope->getSensitiveCookieMetadata()->__toArray());
+        $this->assertEmpty($cookieScope->getCookieMetadata()->__toArray());
+        $this->assertEquals($defaultValues, $cookieScope->getPublicCookieMetadata()->__toArray());
+    }
+
+    /**
+     * @covers ::createSensitiveMetadata ::getPublicCookieMetadata ::getCookieMetadata
+     */
+    public function testGetCookieMetadataDefaults()
+    {
+        $defaultValues = [
+            CookieMetadata::KEY_PATH => 'default path',
+            CookieMetadata::KEY_DOMAIN => 'default domain',
+        ];
+        $cookieMetadata = $this->createCookieMetadata($defaultValues);
+        $cookieScope = $this->createCookieScope(
+            [
+                'sensitiveCookieMetadata' => null,
+                'publicCookieMetadata' => null,
+                'deleteCookieMetadata' => $cookieMetadata
+            ]
+        );
+
+        $this->assertEquals($defaultValues, $cookieScope->getCookieMetadata()->__toArray());
+    }
+
+    /**
+     * @covers ::createSensitiveMetadata ::getPublicCookieMetadata ::getCookieMetadata
+     */
+    public function testGetSensitiveCookieMetadataOverrides()
+    {
+        $defaultValues = [
+            SensitiveCookieMetadata::KEY_PATH => 'default path',
+            SensitiveCookieMetadata::KEY_DOMAIN => 'default domain',
+        ];
+        $overrideValues = [
+            SensitiveCookieMetadata::KEY_PATH => 'override path',
+            SensitiveCookieMetadata::KEY_DOMAIN => 'override domain',
+        ];
+        $sensitive = $this->createSensitiveMetadata($defaultValues);
+        $cookieScope = $this->createCookieScope(
+            [
+                'sensitiveCookieMetadata' => $sensitive,
+                'publicCookieMetadata' => null,
+                'deleteCookieMetadata' => null
+            ]
+        );
+        $override = $this->createSensitiveMetadata($overrideValues);
+
+        $this->assertEmpty($cookieScope->getPublicCookieMetadata($this->createPublicMetadata())->__toArray());
+        $this->assertEmpty($cookieScope->getCookieMetadata($this->createCookieMetadata())->__toArray());
+        $this->assertEquals($overrideValues, $cookieScope->getSensitiveCookieMetadata($override)->__toArray());
+    }
+
+    /**
+     * @covers ::createSensitiveMetadata ::getPublicCookieMetadata ::getCookieMetadata
+     */
+    public function testGetPublicCookieMetadataOverrides()
+    {
+        $defaultValues = [
+            PublicCookieMetadata::KEY_PATH => 'default path',
+            PublicCookieMetadata::KEY_DOMAIN => 'default domain',
+            PublicCookieMetadata::KEY_DURATION => 'default duration',
+            PublicCookieMetadata::KEY_HTTP_ONLY => 'default http',
+            PublicCookieMetadata::KEY_SECURE => 'default secure',
+        ];
+        $overrideValues = [
+            PublicCookieMetadata::KEY_PATH => 'override path',
+            PublicCookieMetadata::KEY_DOMAIN => 'override domain',
+            PublicCookieMetadata::KEY_DURATION => 'override duration',
+            PublicCookieMetadata::KEY_HTTP_ONLY => 'override http',
+            PublicCookieMetadata::KEY_SECURE => 'override secure',
+        ];
+        $public = $this->createPublicMetadata($defaultValues);
+        $cookieScope = $this->createCookieScope(
+            [
+                'sensitiveCookieMetadata' => null,
+                'publicCookieMetadata' => $public,
+                'cookieMetadata' => null
+            ]
+        );
+        $override = $this->createPublicMetadata($overrideValues);
+        $this->assertEquals($overrideValues, $cookieScope->getPublicCookieMetadata($override)->__toArray());
+    }
+
+    /**
+     * @covers ::createSensitiveMetadata ::getPublicCookieMetadata ::getCookieMetadata
+     */
+    public function testGetCookieMetadataOverrides()
+    {
+        $defaultValues = [
+            CookieMetadata::KEY_PATH => 'default path',
+            CookieMetadata::KEY_DOMAIN => 'default domain',
+        ];
+        $overrideValues = [
+            CookieMetadata::KEY_PATH => 'override path',
+            CookieMetadata::KEY_DOMAIN => 'override domain',
+        ];
+        $cookieMeta = $this->createCookieMetadata($defaultValues);
+        $cookieScope = $this->createCookieScope(
+            [
+                'sensitiveCookieMetadata' => null,
+                'publicCookieMetadata' => null,
+                'deleteCookieMetadata' => $cookieMeta
+            ]
+        );
+        $override = $this->createCookieMetadata($overrideValues);
+
+        $this->assertEquals(
+            [],
+            $cookieScope->getSensitiveCookieMetadata($this->createSensitiveMetadata())->__toArray()
+        );
+        $this->assertEquals(
+            [],
+            $cookieScope->getPublicCookieMetadata($this->createPublicMetadata())->__toArray()
+        );
+        $this->assertEquals($overrideValues, $cookieScope->getCookieMetadata($override)->__toArray());
+    }
+
+    /**
+     * Creates a CookieScope object with the given parameters.
+     *
+     * @param array $params
+     * @return CookieScope
+     */
+    protected function createCookieScope($params = [])
+    {
+        $params = array_merge($this->defaultScopeParams, $params);
+        return $this->objectManager->getObject('Magento\Framework\Stdlib\Cookie\CookieScope', $params);
+    }
+
+    /**
+     * Creates a SensitiveCookieMetadata object with provided metadata values.
+     *
+     * @param array $metadata
+     * @return SensitiveCookieMetadata
+     */
+    public function createSensitiveMetadata($metadata = [])
+    {
+        return $this->objectManager->getObject(
+            'Magento\Framework\Stdlib\Cookie\SensitiveCookieMetadata',
+            ['metadata' => $metadata]
+        );
+    }
+
+    /**
+     * Creates a PublicCookieMetadata object with provided metadata values.
+     *
+     * @param array $metadata
+     * @return PublicCookieMetadata
+     */
+    public function createPublicMetadata($metadata = [])
+    {
+        return $this->objectManager->getObject(
+            'Magento\Framework\Stdlib\Cookie\PublicCookieMetadata',
+            ['metadata' => $metadata]
+        );
+    }
+
+    /**
+     * Creates a CookieMetadata object with provided metadata values.
+     *
+     * @param array $metadata
+     * @return CookieMetadata
+     */
+    public function createCookieMetadata($metadata = [])
+    {
+        return $this->objectManager->getObject(
+            'Magento\Framework\Stdlib\Cookie\CookieMetadata',
+            ['metadata' => $metadata]
+        );
+    }
+} 
diff --git a/dev/tests/unit/testsuite/Magento/Framework/Stdlib/Cookie/PhpCookieManagerTest.php b/dev/tests/unit/testsuite/Magento/Framework/Stdlib/Cookie/PhpCookieManagerTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..9859a781e2928cc32ce702b573017c265e28c832
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Framework/Stdlib/Cookie/PhpCookieManagerTest.php
@@ -0,0 +1,782 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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)
+ */
+
+// @codingStandardsIgnoreStart
+namespace {
+    $mockTranslateSetCookie = false;
+}
+
+namespace Magento\Framework\Stdlib\Cookie {
+    // @codingStandardsIgnoreEnd
+    use Magento\Framework\Exception\InputException;
+
+    /**
+     * Mock global setcookie function
+     *
+     * @param string $name
+     * @param string $value
+     * @param int $expiry
+     * @param string $path
+     * @param string $domain
+     * @param bool $secure
+     * @param bool $httpOnly
+     * @return bool
+     */
+    function setcookie($name, $value, $expiry, $path, $domain, $secure, $httpOnly)
+    {
+        global $mockTranslateSetCookie;
+
+        if (isset($mockTranslateSetCookie) && $mockTranslateSetCookie === true) {
+            PhpCookieManagerTest::$isSetCookieInvoked = true;
+            return PhpCookieManagerTest::assertCookie($name, $value, $expiry, $path, $domain, $secure, $httpOnly);
+        } else {
+
+            return call_user_func_array(__FUNCTION__, func_get_args());
+        }
+    }
+
+    /**
+     * Test PhpCookieManager
+     *
+     */
+    class PhpCookieManagerTest extends \PHPUnit_Framework_TestCase
+    {
+        const COOKIE_NAME = 'cookie_name';
+        const SENSITIVE_COOKIE_NAME_NO_METADATA = 'sensitive_cookie_name_no_metadata';
+        const SENSITIVE_COOKIE_NAME_NO_DOMAIN_NO_PATH = 'sensitive_cookie_name_no_domain_no_path';
+        const SENSITIVE_COOKIE_NAME_WITH_DOMAIN_AND_PATH = 'sensitive_cookie_name_with_domain_and_path';
+        const PUBLIC_COOKIE_NAME_NO_METADATA = 'public_cookie_name_no_metadata';
+        const PUBLIC_COOKIE_NAME_DEFAULT_VALUES = 'public_cookie_name_default_values';
+        const PUBLIC_COOKIE_NAME_SOME_FIELDS_SET = 'public_cookie_name_some_fields_set';
+        const MAX_COOKIE_SIZE_TEST_NAME = 'max_cookie_size_test_name';
+        const MAX_NUM_COOKIE_TEST_NAME = 'max_num_cookie_test_name';
+        const DELETE_COOKIE_NAME = 'delete_cookie_name';
+        const DELETE_COOKIE_NAME_NO_METADATA = 'delete_cookie_name_no_metadata';
+        const EXCEPTION_COOKIE_NAME = 'exception_cookie_name';
+        const COOKIE_VALUE = 'cookie_value';
+        const COOKIE_SECURE = true;
+        const COOKIE_NOT_SECURE = false;
+        const COOKIE_HTTP_ONLY = true;
+        const COOKIE_NOT_HTTP_ONLY = false;
+        const COOKIE_EXPIRE_END_OF_SESSION = 0;
+        const MAX_NUM_COOKIES = 20;
+        const MAX_COOKIE_SIZE = 4096;
+
+        /**
+         * Mapping from constant names to functions that handle the assertions.
+         */
+        static $functionTestAssertionMapping = [
+            self::DELETE_COOKIE_NAME => 'self::assertDeleteCookie',
+            self::DELETE_COOKIE_NAME_NO_METADATA => 'self::assertDeleteCookieWithNoMetadata',
+            self::SENSITIVE_COOKIE_NAME_NO_METADATA => 'self::assertSensitiveCookieWithNoMetaData',
+            self::SENSITIVE_COOKIE_NAME_NO_DOMAIN_NO_PATH => 'self::assertSensitiveCookieNoDomainNoPath',
+            self::SENSITIVE_COOKIE_NAME_WITH_DOMAIN_AND_PATH => 'self::assertSensitiveCookieWithDomainAndPath',
+            self::PUBLIC_COOKIE_NAME_NO_METADATA => 'self::assertPublicCookieWithNoMetaData',
+            self::PUBLIC_COOKIE_NAME_DEFAULT_VALUES => 'self::assertPublicCookieWithDefaultValues',
+            self::PUBLIC_COOKIE_NAME_NO_METADATA => 'self::assertPublicCookieWithNoMetaData',
+            self::PUBLIC_COOKIE_NAME_DEFAULT_VALUES => 'self::assertPublicCookieWithDefaultValues',
+            self::PUBLIC_COOKIE_NAME_SOME_FIELDS_SET => 'self::assertPublicCookieWithSomeFieldSet',
+            self::MAX_COOKIE_SIZE_TEST_NAME => 'self::assertCookieSize',
+        ];
+
+
+        /**
+         * @var \Magento\TestFramework\Helper\ObjectManager
+         */
+        protected $objectManager;
+
+        /**
+         * Cookie Manager
+         *
+         * @var \Magento\Framework\Stdlib\Cookie\PhpCookieManager
+         */
+        protected $cookieManager;
+        /**
+         * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Stdlib\Cookie\CookieScope
+         */
+        protected $scopeMock;
+
+        /**
+         * @var bool
+         */
+        public static $isSetCookieInvoked;
+
+        protected function setUp()
+        {
+            global $mockTranslateSetCookie;
+            $mockTranslateSetCookie = true;
+            self::$isSetCookieInvoked = false;
+            $this->objectManager = new \Magento\TestFramework\Helper\ObjectManager($this);
+            $this->scopeMock = $this->getMockBuilder('Magento\Framework\Stdlib\Cookie\CookieScope')
+                ->setMethods(['getPublicCookieMetadata', 'getCookieMetadata', 'getSensitiveCookieMetadata'])
+                ->disableOriginalConstructor()
+                ->getMock();
+            $this->cookieManager = $this->objectManager->getObject(
+                'Magento\Framework\Stdlib\Cookie\PhpCookieManager',
+                ['scope' => $this->scopeMock]
+            );
+        }
+
+        public function testGetCookie()
+        {
+            $_COOKIE[self::COOKIE_NAME] = self::COOKIE_VALUE;
+            $defaultCookieValue = 'default';
+            $this->assertEquals(
+                $defaultCookieValue,
+                $this->cookieManager->getCookie('unknownCookieName', $defaultCookieValue)
+            );
+            $this->assertEquals(
+                self::COOKIE_VALUE,
+                $this->cookieManager->getCookie(self::COOKIE_NAME, $defaultCookieValue)
+            );
+            $this->assertEquals($defaultCookieValue, $this->cookieManager->getCookie(null, $defaultCookieValue));
+            $this->assertNull($this->cookieManager->getCookie(null));
+        }
+
+        public function testDeleteCookie()
+        {
+            self::$isSetCookieInvoked = false;
+            $_COOKIE[self::DELETE_COOKIE_NAME] = self::COOKIE_VALUE;
+
+            /** @var \Magento\Framework\Stdlib\Cookie\CookieMetaData $cookieMetadata */
+            $cookieMetadata = $this->objectManager->getObject(
+                'Magento\Framework\Stdlib\Cookie\CookieMetaData',
+                [
+                    'metadata' => [
+                        'domain' => 'magento.url',
+                        'path' => '/backend',
+                    ]
+                ]
+            );
+
+            $this->scopeMock->expects($this->once())
+                ->method('getCookieMetadata')
+                ->with($cookieMetadata)
+                ->will(
+                    $this->returnValue($cookieMetadata)
+                );
+
+            $this->assertEquals(self::COOKIE_VALUE, $this->cookieManager->getCookie(self::DELETE_COOKIE_NAME));
+            $this->cookieManager->deleteCookie(self::DELETE_COOKIE_NAME, $cookieMetadata);
+            $this->assertNull($this->cookieManager->getCookie(self::DELETE_COOKIE_NAME));
+            $this->assertTrue(self::$isSetCookieInvoked);
+        }
+
+        public function testDeleteCookieWithNoCookieMetadata()
+        {
+            self::$isSetCookieInvoked = false;
+            $_COOKIE[self::DELETE_COOKIE_NAME_NO_METADATA] = self::COOKIE_VALUE;
+
+            $cookieMetadata = $this->objectManager->getObject('Magento\Framework\Stdlib\Cookie\CookieMetaData');
+            $this->scopeMock->expects($this->once())
+                ->method('getCookieMetadata')
+                ->with()
+                ->will(
+                    $this->returnValue($cookieMetadata)
+                );
+
+            $this->assertEquals(
+                self::COOKIE_VALUE,
+                $this->cookieManager->getCookie(self::DELETE_COOKIE_NAME_NO_METADATA)
+            );
+            $this->cookieManager->deleteCookie(self::DELETE_COOKIE_NAME_NO_METADATA);
+            $this->assertNull($this->cookieManager->getCookie(self::DELETE_COOKIE_NAME_NO_METADATA));
+            $this->assertTrue(self::$isSetCookieInvoked);
+        }
+
+        public function testDeleteCookieWithFailureToSendException()
+        {
+            self::$isSetCookieInvoked = false;
+            $_COOKIE[self::EXCEPTION_COOKIE_NAME] = self::COOKIE_VALUE;
+
+            $cookieMetadata = $this->objectManager->getObject('Magento\Framework\Stdlib\Cookie\CookieMetaData');
+            $this->scopeMock->expects($this->once())
+                ->method('getCookieMetadata')
+                ->with()
+                ->will(
+                    $this->returnValue($cookieMetadata)
+                );
+
+            try {
+                $this->cookieManager->deleteCookie(self::EXCEPTION_COOKIE_NAME, $cookieMetadata);
+                $this->fail('Expected exception not thrown.');
+            } catch (FailureToSendException $fse) {
+                $this->assertTrue(self::$isSetCookieInvoked);
+                $this->assertSame(
+                    'Unable to delete the cookie with cookieName = exception_cookie_name',
+                    $fse->getMessage()
+                );
+            }
+        }
+
+        public function testSetSensitiveCookieNoMetadata()
+        {
+            self::$isSetCookieInvoked = false;
+            /** @var SensitiveCookieMetadata $sensitiveCookieMetadata */
+            $sensitiveCookieMetadata = $this->objectManager
+                ->getObject('Magento\Framework\Stdlib\Cookie\SensitiveCookieMetadata');
+
+            $this->scopeMock->expects($this->once())
+                ->method('getSensitiveCookieMetadata')
+                ->with()
+                ->will(
+                    $this->returnValue($sensitiveCookieMetadata)
+                );
+
+            $this->cookieManager->setSensitiveCookie(
+                self::SENSITIVE_COOKIE_NAME_NO_METADATA,
+                'cookie_value'
+            );
+            $this->assertTrue(self::$isSetCookieInvoked);
+        }
+
+        public function testSetSensitiveCookieNullDomainAndPath()
+        {
+            self::$isSetCookieInvoked = false;
+            /** @var SensitiveCookieMetadata $sensitiveCookieMetadata */
+            $sensitiveCookieMetadata = $this->objectManager
+                ->getObject(
+                    'Magento\Framework\Stdlib\Cookie\SensitiveCookieMetadata',
+                    [
+                        'metadata' => [
+                            'domain' => null,
+                            'path' => null,
+                        ],
+                    ]
+                );
+
+
+
+            $this->scopeMock->expects($this->once())
+                ->method('getSensitiveCookieMetadata')
+                ->with($sensitiveCookieMetadata)
+                ->will(
+                    $this->returnValue($sensitiveCookieMetadata)
+                );
+
+            $this->cookieManager->setSensitiveCookie(
+                self::SENSITIVE_COOKIE_NAME_NO_DOMAIN_NO_PATH,
+                'cookie_value',
+                $sensitiveCookieMetadata
+            );
+            $this->assertTrue(self::$isSetCookieInvoked);
+        }
+
+        public function testSetSensitiveCookieWithPathAndDomain()
+        {
+            self::$isSetCookieInvoked = false;
+            /** @var SensitiveCookieMetadata $sensitiveCookieMetadata */
+            $sensitiveCookieMetadata = $this->objectManager
+                ->getObject(
+                    'Magento\Framework\Stdlib\Cookie\SensitiveCookieMetadata',
+                    [
+                        'metadata' => [
+                            'domain' => 'magento.url',
+                            'path' => '/backend',
+                        ],
+                    ]
+                );
+
+            $this->scopeMock->expects($this->once())
+                ->method('getSensitiveCookieMetadata')
+                ->with($sensitiveCookieMetadata)
+                ->will(
+                    $this->returnValue($sensitiveCookieMetadata)
+                );
+            $this->cookieManager->setSensitiveCookie(
+                self::SENSITIVE_COOKIE_NAME_WITH_DOMAIN_AND_PATH,
+                'cookie_value',
+                $sensitiveCookieMetadata
+            );
+            $this->assertTrue(self::$isSetCookieInvoked);
+        }
+
+        public function testSetPublicCookieNoMetadata()
+        {
+            self::$isSetCookieInvoked = false;
+            /** @var PublicCookieMetadata $publicCookieMetadata */
+            $publicCookieMetadata = $this->objectManager->getObject(
+                'Magento\Framework\Stdlib\Cookie\PublicCookieMetadata'
+            );
+
+            $this->scopeMock->expects($this->once())
+                ->method('getPublicCookieMetadata')
+                ->with()
+                ->will(
+                    $this->returnValue($publicCookieMetadata)
+                );
+
+            $this->cookieManager->setPublicCookie(
+                self::PUBLIC_COOKIE_NAME_NO_METADATA,
+                'cookie_value'
+            );
+            $this->assertTrue(self::$isSetCookieInvoked);
+        }
+
+        public function testSetPublicCookieDefaultValues()
+        {
+            /** @var PublicCookieMetadata $publicCookieMetadata */
+            $publicCookieMetadata = $this->objectManager->getObject(
+                'Magento\Framework\Stdlib\Cookie\PublicCookieMetadata',
+                [
+                    'metadata' => [
+                        'domain' => null,
+                        'path' => null,
+                        'secure' => false,
+                        'http_only' => false,
+                    ],
+                ]
+            );
+
+            $this->scopeMock->expects($this->once())
+                ->method('getPublicCookieMetadata')
+                ->with($publicCookieMetadata)
+                ->will(
+                    $this->returnValue($publicCookieMetadata)
+                );
+
+            $this->cookieManager->setPublicCookie(
+                self::PUBLIC_COOKIE_NAME_DEFAULT_VALUES,
+                'cookie_value',
+                $publicCookieMetadata
+            );
+
+            $this->assertTrue(self::$isSetCookieInvoked);
+        }
+
+        public function testSetPublicCookieSomeFieldsSet()
+        {
+            self::$isSetCookieInvoked = false;
+            /** @var PublicCookieMetadata $publicCookieMetadata */
+            $publicCookieMetadata = $this->objectManager->getObject(
+                'Magento\Framework\Stdlib\Cookie\PublicCookieMetadata',
+                [
+                    'metadata' => [
+                        'domain' => 'magento.url',
+                        'path' => '/backend',
+                        'http_only' => true,
+                    ],
+                ]
+            );
+
+            $this->scopeMock->expects($this->once())
+                ->method('getPublicCookieMetadata')
+                ->with($publicCookieMetadata)
+                ->will(
+                    $this->returnValue($publicCookieMetadata)
+                );
+
+            $this->cookieManager->setPublicCookie(
+                self::PUBLIC_COOKIE_NAME_SOME_FIELDS_SET,
+                'cookie_value',
+                $publicCookieMetadata
+            );
+            $this->assertTrue(self::$isSetCookieInvoked);
+        }
+
+        public function testSetCookieBadName()
+        {
+            /** @var \Magento\Framework\Stdlib\Cookie\PublicCookieMetadata $publicCookieMetadata */
+            $publicCookieMetadata = $this->objectManager->getObject(
+                'Magento\Framework\Stdlib\Cookie\PublicCookieMetadata',
+                [
+                    'metadata' => [
+                        'domain' => null,
+                        'path' => null,
+                        'secure' => false,
+                        'http_only' => false,
+                    ],
+                ]
+            );
+
+            $badCookieName = '';
+            $cookieValue = 'some_value';
+
+            $this->scopeMock->expects($this->once())
+                ->method('getPublicCookieMetadata')
+                ->with()
+                ->will(
+                    $this->returnValue($publicCookieMetadata)
+                );
+
+            try {
+                $this->cookieManager->setPublicCookie(
+                    $badCookieName,
+                    $cookieValue,
+                    $publicCookieMetadata
+                );
+                $this->fail('Failed to throw exception of bad cookie name');
+            } catch (InputException $e) {
+                $this->assertEquals(
+                    'Cookie name cannot be empty and cannot contain these characters: =,; \\t\\r\\n\\013\\014',
+                    $e->getMessage()
+                );
+            }
+        }
+
+        public function testSetCookieSizeTooLarge()
+        {
+            /** @var PublicCookieMetadata $publicCookieMetadata */
+            $publicCookieMetadata = $this->objectManager->getObject(
+                'Magento\Framework\Stdlib\Cookie\PublicCookieMetadata',
+                [
+                    'metadata' => [
+                        'domain' => null,
+                        'path' => null,
+                        'secure' => false,
+                        'http_only' => false,
+                        'duration' => 3600,
+                    ],
+                ]
+            );
+
+            $this->scopeMock->expects($this->once())
+                ->method('getPublicCookieMetadata')
+                ->with()
+                ->will(
+                    $this->returnValue($publicCookieMetadata)
+                );
+
+            $cookieValue = '';
+            for ($i = 0; $i < self::MAX_COOKIE_SIZE + 1; $i++) {
+                $cookieValue = $cookieValue . 'a';
+            }
+
+
+            try {
+                $this->cookieManager->setPublicCookie(
+                    self::MAX_COOKIE_SIZE_TEST_NAME,
+                    $cookieValue,
+                    $publicCookieMetadata
+                );
+                $this->fail('Failed to throw exception of excess cookie size.');
+            } catch (CookieSizeLimitReachedException $e) {
+                $this->assertEquals(
+                    "Unable to send the cookie. Size of 'max_cookie_size_test_name' is 4123 bytes.",
+                    $e->getMessage()
+                );
+            }
+        }
+
+        public function testSetTooManyCookies()
+        {
+            /** @var PublicCookieMetadata $publicCookieMetadata */
+            $publicCookieMetadata = $this->objectManager->getObject(
+                'Magento\Framework\Stdlib\Cookie\PublicCookieMetadata'
+            );
+
+            $cookieValue = 'some_value';
+
+            // Set self::MAX_NUM_COOKIES number of cookies in superglobal $_COOKIE.
+            for ($i = count($_COOKIE); $i < self::MAX_NUM_COOKIES; $i++) {
+                $_COOKIE['test_cookie_' . $i] = 'some_value';
+            }
+
+            $this->scopeMock->expects($this->once())
+                ->method('getPublicCookieMetadata')
+                ->with()
+                ->will(
+                    $this->returnValue($publicCookieMetadata)
+                );
+
+            try {
+                $this->cookieManager->setPublicCookie(
+                    self::MAX_COOKIE_SIZE_TEST_NAME,
+                    $cookieValue,
+                    $publicCookieMetadata
+                );
+                $this->fail('Failed to throw exception of too many cookies.');
+            } catch (CookieSizeLimitReachedException $e) {
+                $this->assertEquals(
+                    'Unable to send the cookie. Maximum number of cookies would be exceeded.',
+                    $e->getMessage()
+                );
+            }
+        }
+
+        /**
+         * Assert public, sensitive and delete cookie
+         *
+         * Suppressing UnusedFormalParameter, since PHPMD doesn't detect the callback call.
+         * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+         */
+        public static function assertCookie($name, $value, $expiry, $path, $domain, $secure, $httpOnly)
+        {
+            if (self::EXCEPTION_COOKIE_NAME == $name) {
+                return false;
+            } elseif (isset(self::$functionTestAssertionMapping[$name])) {
+                call_user_func_array(self::$functionTestAssertionMapping[$name], func_get_args());
+            } else {
+                self::fail('Non-tested case in mock setcookie()');
+            }
+            return true;
+        }
+
+        /**
+         * Assert delete cookie
+         *
+         * Suppressing UnusedPrivateMethod, since PHPMD doesn't detect callback method use.
+         * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
+         */
+        private static function assertDeleteCookie(
+            $name,
+            $value,
+            $expiry,
+            $path,
+            $domain,
+            $secure,
+            $httpOnly
+        ) {
+            self::assertEquals(self::DELETE_COOKIE_NAME, $name);
+            self::assertEquals('', $value);
+            self::assertEquals($expiry, PhpCookieManager::EXPIRE_NOW_TIME);
+            self::assertFalse($secure);
+            self::assertFalse($httpOnly);
+            self::assertEquals('magento.url', $domain);
+            self::assertEquals('/backend', $path);
+        }
+
+        /**
+         * Assert delete cookie with no meta data
+         *
+         * Suppressing UnusedPrivateMethod, since PHPMD doesn't detect callback method use.
+         * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
+         */
+        private static function assertDeleteCookieWithNoMetadata(
+            $name,
+            $value,
+            $expiry,
+            $path,
+            $domain,
+            $secure,
+            $httpOnly
+        ) {
+            self::assertEquals(self::DELETE_COOKIE_NAME_NO_METADATA, $name);
+            self::assertEquals('', $value);
+            self::assertEquals($expiry, PhpCookieManager::EXPIRE_NOW_TIME);
+            self::assertFalse($secure);
+            self::assertFalse($httpOnly);
+            self::assertEquals('', $domain);
+            self::assertEquals('', $path);
+        }
+
+        /**
+         * Assert sensitive cookie with no meta data
+         *
+         * Suppressing UnusedPrivateMethod, since PHPMD doesn't detect callback method use.
+         * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
+         */
+        private static function assertSensitiveCookieWithNoMetaData(
+            $name,
+            $value,
+            $expiry,
+            $path,
+            $domain,
+            $secure,
+            $httpOnly
+        ) {
+            self::assertEquals(self::SENSITIVE_COOKIE_NAME_NO_METADATA, $name);
+            self::assertEquals(self::COOKIE_VALUE, $value);
+            self::assertEquals(PhpCookieManager::EXPIRE_AT_END_OF_SESSION_TIME, $expiry);
+            self::assertTrue($secure);
+            self::assertTrue($httpOnly);
+            self::assertEquals('', $domain);
+            self::assertEquals('', $path);
+        }
+
+        /**
+         * Assert sensitive cookie with no domain and path
+         *
+         * Suppressing UnusedPrivateMethod, since PHPMD doesn't detect callback method use.
+         * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
+         */
+        private static function assertSensitiveCookieNoDomainNoPath(
+            $name,
+            $value,
+            $expiry,
+            $path,
+            $domain,
+            $secure,
+            $httpOnly
+        ) {
+            self::assertEquals(self::SENSITIVE_COOKIE_NAME_NO_DOMAIN_NO_PATH, $name);
+            self::assertEquals(self::COOKIE_VALUE, $value);
+            self::assertEquals(PhpCookieManager::EXPIRE_AT_END_OF_SESSION_TIME, $expiry);
+            self::assertTrue($secure);
+            self::assertTrue($httpOnly);
+            self::assertEquals('', $domain);
+            self::assertEquals('', $path);
+        }
+
+        /**
+         * Assert sensitive cookie with domain and path
+         *
+         * Suppressing UnusedPrivateMethod, since PHPMD doesn't detect callback method use.
+         * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
+         */
+        private static function assertSensitiveCookieWithDomainAndPath(
+            $name,
+            $value,
+            $expiry,
+            $path,
+            $domain,
+            $secure,
+            $httpOnly
+        ) {
+            self::assertEquals(self::SENSITIVE_COOKIE_NAME_WITH_DOMAIN_AND_PATH, $name);
+            self::assertEquals(self::COOKIE_VALUE, $value);
+            self::assertEquals(PhpCookieManager::EXPIRE_AT_END_OF_SESSION_TIME, $expiry);
+            self::assertTrue($secure);
+            self::assertTrue($httpOnly);
+            self::assertEquals('magento.url', $domain);
+            self::assertEquals('/backend', $path);
+        }
+
+        /**
+         * Assert public cookie with no metadata
+         *
+         * Suppressing UnusedPrivateMethod, since PHPMD doesn't detect callback method use.
+         * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
+         */
+        private static function assertPublicCookieWithNoMetaData(
+            $name,
+            $value,
+            $expiry,
+            $path,
+            $domain,
+            $secure,
+            $httpOnly
+        ) {
+            self::assertEquals(self::PUBLIC_COOKIE_NAME_NO_METADATA, $name);
+            self::assertEquals(self::COOKIE_VALUE, $value);
+            self::assertEquals(self::COOKIE_EXPIRE_END_OF_SESSION, $expiry);
+            self::assertFalse($secure);
+            self::assertFalse($httpOnly);
+            self::assertEquals('', $domain);
+            self::assertEquals('', $path);
+        }
+
+        /**
+         * Assert public cookie with no domain and path
+         *
+         * Suppressing UnusedPrivateMethod, since PHPMD doesn't detect callback method use.
+         * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
+         */
+        private static function assertPublicCookieWithNoDomainNoPath(
+            $name,
+            $value,
+            $expiry,
+            $path,
+            $domain,
+            $secure,
+            $httpOnly
+        ) {
+            self::assertEquals(self::PUBLIC_COOKIE_NAME_NO_METADATA, $name);
+            self::assertEquals(self::COOKIE_VALUE, $value);
+            self::assertEquals(PhpCookieManager::EXPIRE_AT_END_OF_SESSION_TIME, $expiry);
+            self::assertTrue($secure);
+            self::assertTrue($httpOnly);
+            self::assertEquals('magento.url', $domain);
+            self::assertEquals('/backend', $path);
+        }
+
+        /**
+         * Assert public cookie with default values
+         *
+         * Suppressing UnusedPrivateMethod, since PHPMD doesn't detect callback method use.
+         * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
+         */
+        private static function assertPublicCookieWithDefaultValues(
+            $name,
+            $value,
+            $expiry,
+            $path,
+            $domain,
+            $secure,
+            $httpOnly
+        ) {
+            self::assertEquals(self::PUBLIC_COOKIE_NAME_DEFAULT_VALUES, $name);
+            self::assertEquals(self::COOKIE_VALUE, $value);
+            self::assertEquals(self::COOKIE_EXPIRE_END_OF_SESSION, $expiry);
+            self::assertFalse($secure);
+            self::assertFalse($httpOnly);
+            self::assertEquals('', $domain);
+            self::assertEquals('', $path);
+        }
+
+        /**
+         * Assert public cookie with no field set
+         *
+         * Suppressing UnusedPrivateMethod, since PHPMD doesn't detect callback method use.
+         * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
+         */
+        private static function assertPublicCookieWithSomeFieldSet(
+            $name,
+            $value,
+            $expiry,
+            $path,
+            $domain,
+            $secure,
+            $httpOnly
+        ) {
+            self::assertEquals(self::PUBLIC_COOKIE_NAME_SOME_FIELDS_SET, $name);
+            self::assertEquals(self::COOKIE_VALUE, $value);
+            self::assertEquals(self::COOKIE_EXPIRE_END_OF_SESSION, $expiry);
+            self::assertFalse($secure);
+            self::assertTrue($httpOnly);
+            self::assertEquals('magento.url', $domain);
+            self::assertEquals('/backend', $path);
+        }
+
+        /**
+         * Assert cookie size
+         *
+         * Suppressing UnusedPrivateMethod, since PHPMD doesn't detect callback method use.
+         * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
+         */
+        private static function assertCookieSize(
+            $name,
+            $value,
+            $expiry,
+            $path,
+            $domain,
+            $secure,
+            $httpOnly
+        ) {
+            self::assertEquals(self::MAX_COOKIE_SIZE_TEST_NAME, $name);
+            self::assertEquals(self::COOKIE_VALUE, $value);
+            self::assertEquals(self::COOKIE_EXPIRE_END_OF_SESSION, $expiry);
+            self::assertFalse($secure);
+            self::assertFalse($httpOnly);
+            self::assertEquals('', $domain);
+            self::assertEquals('', $path);
+        }
+
+        public function tearDown()
+        {
+            global $mockTranslateSetCookie;
+            $mockTranslateSetCookie = false;
+        }
+    }
+}
\ No newline at end of file
diff --git a/dev/tests/unit/testsuite/Magento/Framework/Stdlib/Cookie/PublicCookieMetadataTest.php b/dev/tests/unit/testsuite/Magento/Framework/Stdlib/Cookie/PublicCookieMetadataTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..a9bc0f038ec3dd16b54d7e1bf8e098b4a55bb59f
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Framework/Stdlib/Cookie/PublicCookieMetadataTest.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\Framework\Stdlib\Cookie;
+
+use Magento\TestFramework\Helper\ObjectManager;
+
+/**
+ * Test PublicCookieMetadata
+ *
+ */
+class PublicCookieMetadataTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var PublicCookieMetadata */
+    private $publicCookieMetadata;
+
+    public function setUp()
+    {
+        $objectManager = new ObjectManager($this);
+        $this->publicCookieMetadata = $objectManager->getObject(
+            'Magento\Framework\Stdlib\Cookie\PublicCookieMetadata'
+        );
+    }
+
+    /**
+     * @param String $setMethodName
+     * @param String $getMethodName
+     * @param String $expectedValue
+     * @dataProvider getMethodData
+     */
+
+    public function testGetters($setMethodName, $getMethodName, $expectedValue)
+    {
+        $this->publicCookieMetadata->$setMethodName($expectedValue);
+        $this->assertSame($expectedValue, $this->publicCookieMetadata->$getMethodName());
+    }
+
+    /**
+     * @return array
+     */
+    public function getMethodData()
+    {
+        return [
+            "getDomain" => ["setDomain", 'getDomain', "example.com"],
+            "getPath" => ["setPath", 'getPath', "path"],
+            "getDuration" => ["setDuration", 'getDuration', 125],
+            "getHttpOnly" => ["setHttpOnly", 'getHttpOnly', true],
+            "getSecure" => ["setSecure", 'getSecure', true]
+        ];
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Framework/Stdlib/Cookie/SensitiveCookieMetadataTest.php b/dev/tests/unit/testsuite/Magento/Framework/Stdlib/Cookie/SensitiveCookieMetadataTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..ce9c1b8e4f01d5f58bced81853fe51e5ca0531eb
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Framework/Stdlib/Cookie/SensitiveCookieMetadataTest.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\Framework\Stdlib\Cookie;
+
+use Magento\TestFramework\Helper\ObjectManager;
+
+/**
+ * Test SensitiveCookieMetaData
+ *
+ */
+class SensitiveCookieMetadataTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var SensitiveCookieMetadata */
+    private $sensitiveCookieMetadata;
+
+    public function setUp()
+    {
+        $objectManager = new ObjectManager($this);
+        $this->sensitiveCookieMetadata = $objectManager->getObject(
+            'Magento\Framework\Stdlib\Cookie\SensitiveCookieMetadata'
+        );
+    }
+
+    /**
+     * @param String $setMethodName
+     * @param String $getMethodName
+     * @param String $expectedValue
+     * @dataProvider getMethodData
+     */
+
+    public function testGetters($setMethodName, $getMethodName, $expectedValue)
+    {
+        $this->sensitiveCookieMetadata->$setMethodName($expectedValue);
+        $this->assertSame($expectedValue, $this->sensitiveCookieMetadata->$getMethodName());
+    }
+
+    /**
+     * @return array
+     */
+    public function getMethodData()
+    {
+        return [
+            "getDomain" => ["setDomain", 'getDomain', "example.com"],
+            "getPath" => ["setPath", 'getPath', "path"]
+        ];
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Framework/Validator/ExceptionTest.php b/dev/tests/unit/testsuite/Magento/Framework/Validator/ExceptionTest.php
index 7c3fca468fe29dc42e9abd1823181fe477f74a67..16ba57eb90f297c21d880c4d1ed9b2630f1e5ce9 100644
--- a/dev/tests/unit/testsuite/Magento/Framework/Validator/ExceptionTest.php
+++ b/dev/tests/unit/testsuite/Magento/Framework/Validator/ExceptionTest.php
@@ -24,6 +24,8 @@
 
 namespace Magento\Framework\Validator;
 
+use \Magento\Framework\Exception\InputException;
+
 /**
  * Test case for \Magento\Framework\Validator\ValidatorException
  */
@@ -36,7 +38,12 @@ class ExceptionTest extends \PHPUnit_Framework_TestCase
     {
         $expectedMessage = 'error1' . PHP_EOL . 'error2' . PHP_EOL . 'error3';
         $messages = array('field1' => array('error1', 'error2'), 'field2' => array('error3'));
-        $exception = new \Magento\Framework\Validator\ValidatorException($messages);
+        $exception = new \Magento\Framework\Validator\ValidatorException(
+            InputException::DEFAULT_MESSAGE,
+            [],
+            null,
+            $messages
+        );
         $this->assertEquals($expectedMessage, $exception->getMessage());
     }
 }
diff --git a/dev/tests/unit/testsuite/Magento/Framework/View/Element/AbstractBlockTest.php b/dev/tests/unit/testsuite/Magento/Framework/View/Element/AbstractBlockTest.php
index da7825859eb98be8420bf64a7a5401b0575c7e9e..5a675e46df19c623de1816c9a043d2ce11569790 100644
--- a/dev/tests/unit/testsuite/Magento/Framework/View/Element/AbstractBlockTest.php
+++ b/dev/tests/unit/testsuite/Magento/Framework/View/Element/AbstractBlockTest.php
@@ -63,7 +63,12 @@ class AbstractBlockTest extends \PHPUnit_Framework_TestCase
                 'CaPSed BLOCK NAME',
                 array('cAp$Ed PaRaM1', 'caPs2', 'bUT-TOn')
             ),
-            array(' data-ui-id="block-0-1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16-17-18-19-20" ', '!block!', range(0, 20))
+            array(
+                ' data-ui-id="capsed-block-name-cap-ed-param1-caps2-but-ton-but-ton" ',
+                'CaPSed BLOCK NAME',
+                array('cAp$Ed PaRaM1', 'caPs2', 'bUT-TOn', 'bUT-TOn')
+            ),
+            array(' data-ui-id="block-0-1-2-3-4" ', '!block!', range(0, 5))
         );
     }
 
diff --git a/dev/tests/unit/testsuite/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Items/MassAddTest.php b/dev/tests/unit/testsuite/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Items/MassAddTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..92d2ca223a75583be1a70a4323d97d1d9e179462
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Items/MassAddTest.php
@@ -0,0 +1,117 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\GoogleShopping\Controller\Adminhtml\Googleshopping\Items;
+
+use \Magento\TestFramework\Helper\ObjectManager as ObjectManagerHelper;
+
+class MassAddTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var \Magento\GoogleShopping\Controller\Adminhtml\Googleshopping\Items\MassAdd */
+    protected $controller;
+
+    /**
+     * @var \Magento\GoogleShopping\Model\Flag
+     */
+    protected $flag;
+
+    /**
+     * @var array
+     */
+    protected $controllerArguments;
+
+    /**
+     * @var ObjectManagerHelper
+     */
+    protected $objectManagerHelper;
+
+    /**
+     * @var \Magento\Framework\Notification\NotifierInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $notificationInterface;
+
+    protected function setUp()
+    {
+        $this->notificationInterface = $this->getMock('Magento\Framework\Notification\NotifierInterface');
+
+        $this->objectManagerHelper = new ObjectManagerHelper($this);
+        $this->controllerArguments = $this->objectManagerHelper->getConstructArguments(
+            'Magento\GoogleShopping\Controller\Adminhtml\Googleshopping\Items\MassAdd',
+            [
+                'notifier' => $this->notificationInterface
+            ]
+        );
+        $this->flag = $this->getMockBuilder('Magento\GoogleShopping\Model\Flag')->disableOriginalConstructor()
+            ->setMethods(array('loadSelf', '__sleep', '__wakeup', 'isLocked', 'lock', 'unlock'))->getMock();
+        $this->flag->expects($this->once())->method('loadSelf')->will($this->returnSelf());
+        $this->flag->expects($this->once())->method('isLocked')->will($this->returnValue(false));
+
+        $store = $this->getMockBuilder('\Magento\Store\Model\Store')->disableOriginalConstructor()
+                ->setMethods(array('getId', '__sleep', '__wakeup'))->getMock();
+        $store->expects($this->exactly(2))->method('getId')->will($this->returnValue(1));
+
+        $storeManager = $this->getMock('Magento\Store\Model\StoreManagerInterface');
+        $storeManager->expects($this->once())->method('getStore')->will($this->returnValue($store));
+
+        $this->controllerArguments['context']->getObjectManager()
+            ->expects($this->at(0))->method('get')->with('Magento\GoogleShopping\Model\Flag')
+            ->will($this->returnValue($this->flag));
+        $this->controllerArguments['context']->getObjectManager()
+            ->expects($this->at(1))->method('get')->with('Magento\Store\Model\StoreManagerInterface')
+            ->will($this->returnValue($storeManager));
+
+        $this->controller = $this->objectManagerHelper->getObject(
+            'Magento\GoogleShopping\Controller\Adminhtml\Googleshopping\Items\MassAdd',
+            $this->controllerArguments
+        );
+    }
+
+    public function testExecuteWithException()
+    {
+        $this->flag->expects($this->once())->method('lock')
+            ->will($this->throwException(new \Exception('Test exception')));
+
+        $logger = $this->getMockBuilder('Magento\Framework\Logger')->setMethods(array('logException'))
+            ->disableOriginalConstructor()->getMock();
+        $this->controllerArguments['context']->getObjectManager()
+            ->expects($this->at(2))->method('get')->with('Magento\Framework\Logger')
+            ->will($this->returnValue($logger));
+
+        $this->controller->execute();
+    }
+
+    public function testExecute()
+    {
+        $massOperations = $this->getMockBuilder('Magento\GoogleShopping\Model\MassOperations')
+            ->disableOriginalConstructor()->setMethods(array('setFlag', 'addProducts'))->getMock();
+        $massOperations->expects($this->once())->method('setFlag')->will($this->returnSelf());
+        $massOperations->expects($this->once())->method('addProducts')->will($this->returnSelf());
+
+        $this->controllerArguments['context']->getObjectManager()->expects($this->once())->method('create')
+            ->with('Magento\GoogleShopping\Model\MassOperations')
+            ->will($this->returnValue($massOperations));
+
+        $this->controller->execute();
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Items/RefreshTest.php b/dev/tests/unit/testsuite/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Items/RefreshTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..62fe8912634f5f2efaa3fc0893aaedf2a0e31292
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Items/RefreshTest.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\GoogleShopping\Controller\Adminhtml\Googleshopping\Items;
+
+use \Magento\TestFramework\Helper\ObjectManager as ObjectManagerHelper;
+
+class RefreshTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\GoogleShopping\Controller\Adminhtml\Googleshopping\Items\Refresh
+     */
+    protected $controller;
+
+    /**
+     * @var ObjectManagerHelper
+     */
+    protected $objectManagerHelper;
+
+    /**
+     * @var \Magento\GoogleShopping\Model\Flag
+     */
+    protected $flag;
+
+    /**
+     * @var array
+     */
+    protected $controllerArguments;
+
+    /**
+     * @var \Magento\Framework\Notification\NotifierInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $notificationInterface;
+
+    protected function setUp()
+    {
+        $this->notificationInterface = $this->getMock('Magento\Framework\Notification\NotifierInterface');
+        $this->objectManagerHelper = new ObjectManagerHelper($this);
+        $this->controllerArguments = $this->objectManagerHelper->getConstructArguments(
+            'Magento\GoogleShopping\Controller\Adminhtml\Googleshopping\Items\Refresh',
+            [
+                'notifier' => $this->notificationInterface
+            ]
+        );
+
+        $this->flag = $this->getMockBuilder('Magento\GoogleShopping\Model\Flag')->disableOriginalConstructor()
+            ->setMethods(array('loadSelf', '__sleep', '__wakeup', 'isLocked', 'lock', 'unlock'))->getMock();
+        $this->flag->expects($this->once())->method('loadSelf')->will($this->returnSelf());
+        $this->flag->expects($this->once())->method('isLocked')->will($this->returnValue(false));
+        $this->flag->expects($this->once())->method('unlock')->will($this->returnSelf());
+
+        /** @var \PHPUnit_Framework_MockObject_MockObject $objectMananger */
+        $objectMananger = $this->controllerArguments['context']->getObjectManager();
+        $objectMananger->expects($this->at(0))->method('get')->with('Magento\GoogleShopping\Model\Flag')
+            ->will($this->returnValue($this->flag));
+
+        $this->controller = $this->objectManagerHelper->getObject(
+            'Magento\GoogleShopping\Controller\Adminhtml\Googleshopping\Items\Refresh',
+            $this->controllerArguments
+        );
+    }
+
+    public function testExecuteWithException()
+    {
+        $this->flag->expects($this->once())->method('lock')
+            ->will($this->throwException(new \Exception('Test exception')));
+
+        $logger = $this->getMockBuilder('Magento\Framework\Logger')->setMethods(array('logException'))
+            ->disableOriginalConstructor()->getMock();
+        $this->controllerArguments['context']->getObjectManager()->expects($this->at(1))->method('get')
+            ->with('Magento\Framework\Logger')
+            ->will($this->returnValue($logger));
+
+        $this->controller->execute();
+    }
+
+    public function testExecute()
+    {
+        $massOperations = $this->getMockBuilder('Magento\GoogleShopping\Model\MassOperations')
+            ->disableOriginalConstructor()->setMethods(array('setFlag', 'synchronizeItems'))->getMock();
+        $massOperations->expects($this->once())->method('setFlag')->will($this->returnSelf());
+        $massOperations->expects($this->once())->method('synchronizeItems')->will($this->returnSelf());
+
+        $this->controllerArguments['context']->getObjectManager()->expects($this->once())->method('create')
+            ->with('Magento\GoogleShopping\Model\MassOperations')
+            ->will($this->returnValue($massOperations));
+
+        $this->controller->execute();
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/GoogleShopping/Model/MassOperationsTest.php b/dev/tests/unit/testsuite/Magento/GoogleShopping/Model/MassOperationsTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..abc62510be2b5ce653fd517a6f546f383320be56
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/GoogleShopping/Model/MassOperationsTest.php
@@ -0,0 +1,193 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\GoogleShopping\Model;
+
+use \Magento\TestFramework\Helper\ObjectManager as ObjectManagerHelper;
+
+class MassOperationsTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var \Magento\GoogleShopping\Model\MassOperations */
+    protected $massOperations;
+
+    /** @var ObjectManagerHelper */
+    protected $objectManagerHelper;
+
+    /** @var \PHPUnit_Framework_MockObject_MockObject */
+    protected $collectionFactory;
+
+    /** @var \PHPUnit_Framework_MockObject_MockObject */
+    protected $itemFactory;
+
+    /** @var \PHPUnit_Framework_MockObject_MockObject */
+    protected $productFactory;
+
+    /** @var \Magento\Framework\Notification\NotifierInterface|\PHPUnit_Framework_MockObject_MockObject */
+    protected $notificationInterface;
+
+    /** @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject */
+    protected $storeManagerInterface;
+
+    /** @var \Magento\Framework\Logger|\PHPUnit_Framework_MockObject_MockObject */
+    protected $logger;
+
+    /** @var \Magento\GoogleShopping\Helper\Data|\PHPUnit_Framework_MockObject_MockObject */
+    protected $googleShoppingHelper;
+
+    /** @var \Magento\GoogleShopping\Helper\Category|\PHPUnit_Framework_MockObject_MockObject */
+    protected $googleShoppingCategoryHelper;
+
+    protected function setUp()
+    {
+        $this->collectionFactory = $this->getMockBuilder(
+            'Magento\GoogleShopping\Model\Resource\Item\CollectionFactory'
+        )->disableOriginalConstructor()->setMethods(array('create'))->getMock();
+
+        $this->itemFactory = $this->getMock('Magento\GoogleShopping\Model\ItemFactory');
+        $this->productFactory = $this->getMock('Magento\Catalog\Model\ProductFactory');
+        $this->notificationInterface = $this->getMock('Magento\Framework\Notification\NotifierInterface');
+        $this->storeManagerInterface = $this->getMock('Magento\Store\Model\StoreManagerInterface');
+        $this->logger = $this->getMock('Magento\Framework\Logger', [], [], '', false);
+        $this->googleShoppingHelper = $this->getMock('Magento\GoogleShopping\Helper\Data', [], [], '', false);
+        $this->googleShoppingCategoryHelper = $this->getMock('Magento\GoogleShopping\Helper\Category');
+
+        $this->objectManagerHelper = new ObjectManagerHelper($this);
+        $this->massOperations = $this->objectManagerHelper->getObject(
+            'Magento\GoogleShopping\Model\MassOperations',
+            [
+                'collectionFactory' => $this->collectionFactory,
+                'itemFactory' => $this->itemFactory,
+                'productFactory' => $this->productFactory,
+                'notifier' => $this->notificationInterface,
+                'storeManager' => $this->storeManagerInterface,
+                'logger' => $this->logger,
+                'gleShoppingData' => $this->googleShoppingHelper,
+                'gleShoppingCategory' => $this->googleShoppingCategoryHelper
+            ]
+        );
+    }
+
+    public function testSynchronizeItems()
+    {
+        $collection = $this->getMockBuilder('Magento\GoogleShopping\Model\Resource\Item\Collection')
+            ->disableOriginalConstructor()->setMethods(array('count', 'addFieldToFilter', 'getIterator'))->getMock();
+        $collection->expects($this->once())->method('addFieldToFilter')->will($this->returnSelf());
+        $collection->expects($this->once())->method('count')->will($this->returnValue(1));
+
+        $item = $this->getMockBuilder('Magento\GoogleShopping\Model\Item')->disableOriginalConstructor()->getMock();
+        $iterator = new \ArrayIterator([$item]);
+        $collection->expects($this->once())->method('getIterator')->will($this->returnValue($iterator));
+
+        $this->collectionFactory->expects($this->once())->method('create')->will($this->returnValue($collection));
+
+        $this->notificationInterface->expects($this->once())->method('addNotice')
+            ->with(
+                'Product synchronization with Google Shopping completed',
+                'A total of 0 items(s) have been deleted; a total of 1 items(s) have been updated.'
+            )->will($this->returnSelf());
+
+        $this->massOperations->synchronizeItems(array(1));
+    }
+
+    public function testSynchronizeItemsWithException()
+    {
+        $collection = $this->getMockBuilder('Magento\GoogleShopping\Model\Resource\Item\Collection')
+            ->disableOriginalConstructor()->setMethods(array('count', 'addFieldToFilter', 'getIterator'))->getMock();
+        $collection->expects($this->once())->method('addFieldToFilter')->will($this->returnSelf());
+        $collection->expects($this->once())->method('count')->will($this->returnValue(1));
+
+        $item = $this->getMockBuilder('Magento\GoogleShopping\Model\Item')->disableOriginalConstructor()->getMock();
+        $item->expects($this->once())->method('save')->will($this->throwException(new \Exception('Test exception')));
+
+        $product = $this->getMockBuilder('Magento\Catalog\Model\Product')->disableOriginalConstructor()
+            ->setMethods(array('getName', '__sleep', '__wakeup'))->getMock();
+        $product->expects($this->once())->method('getName')->will($this->returnValue('Product Name'));
+
+        $item->expects($this->once())->method('getProduct')->will($this->returnValue($product));
+        $iterator = new \ArrayIterator([$item]);
+        $collection->expects($this->once())->method('getIterator')->will($this->returnValue($iterator));
+
+        $this->collectionFactory->expects($this->once())->method('create')->will($this->returnValue($collection));
+
+        $this->notificationInterface->expects($this->once())->method('addMajor')
+            ->with(
+                'Errors happened during synchronization with Google Shopping',
+                array('We cannot update 1 items.', 'The item "Product Name" hasn\'t been updated.')
+            )->will($this->returnSelf());
+        $this->massOperations->synchronizeItems(array(1));
+    }
+
+    public function testDeleteItems()
+    {
+        $item = $this->getMockBuilder('Magento\GoogleShopping\Model\Item')->disableOriginalConstructor()->getMock();
+        $item->expects($this->once())->method('deleteItem')->will($this->returnSelf());
+        $item->expects($this->once())->method('delete')->will($this->returnSelf());
+
+        $collection = $this->getMockBuilder('Magento\GoogleShopping\Model\Resource\Item\Collection')
+            ->disableOriginalConstructor()->setMethods(array('count', 'addFieldToFilter', 'getIterator'))->getMock();
+        $collection->expects($this->once())->method('addFieldToFilter')->will($this->returnSelf());
+        $collection->expects($this->once())->method('count')->will($this->returnValue(1));
+        $collection->expects($this->once())->method('getIterator')
+            ->will($this->returnValue(new \ArrayIterator([$item])));
+
+        $this->collectionFactory->expects($this->once())->method('create')->will($this->returnValue($collection));
+
+        $this->notificationInterface->expects($this->once())->method('addNotice')
+            ->with(
+                'Google Shopping item removal process succeded',
+                'Total of 1 items(s) have been removed from Google Shopping.'
+            )->will($this->returnSelf());
+
+        $this->massOperations->deleteItems(array(1));
+    }
+
+    public function testDeleteItemsWitException()
+    {
+        $product = $this->getMockBuilder('Magento\Catalog\Model\Product')->disableOriginalConstructor()
+            ->setMethods(array('getName', '__sleep', '__wakeup'))->getMock();
+        $product->expects($this->once())->method('getName')->will($this->returnValue('Product Name'));
+
+        $item = $this->getMockBuilder('Magento\GoogleShopping\Model\Item')->disableOriginalConstructor()->getMock();
+        $item->expects($this->once())->method('getProduct')->will($this->returnValue($product));
+        $item->expects($this->once())->method('deleteItem')
+            ->will($this->throwException(new \Exception('Test exception')));
+
+        $collection = $this->getMockBuilder('Magento\GoogleShopping\Model\Resource\Item\Collection')
+            ->disableOriginalConstructor()->setMethods(array('count', 'addFieldToFilter', 'getIterator'))->getMock();
+        $collection->expects($this->once())->method('addFieldToFilter')->will($this->returnSelf());
+        $collection->expects($this->once())->method('count')->will($this->returnValue(1));
+        $collection->expects($this->once())->method('getIterator')
+            ->will($this->returnValue(new \ArrayIterator([$item])));
+
+        $this->collectionFactory->expects($this->once())->method('create')->will($this->returnValue($collection));
+
+        $this->notificationInterface->expects($this->once())->method('addMajor')
+            ->with(
+                'Errors happened while deleting items from Google Shopping',
+                array('The item "Product Name" hasn\'t been deleted.')
+            )->will($this->returnSelf());
+        $this->massOperations->deleteItems(array(1));
+
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/GoogleShopping/Model/ObserverTest.php b/dev/tests/unit/testsuite/Magento/GoogleShopping/Model/ObserverTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..f58cef3015c090ad930d12d52a46b4c6a244982a
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/GoogleShopping/Model/ObserverTest.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\GoogleShopping\Model;
+
+use \Magento\TestFramework\Helper\ObjectManager as ObjectManagerHelper;
+
+class ObserverTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var \Magento\GoogleShopping\Model\Observer */
+    protected $observer;
+
+    /** @var ObjectManagerHelper */
+    protected $objectManagerHelper;
+
+    /** @var \PHPUnit_Framework_MockObject_MockObject */
+    protected $collectionFactory;
+
+    /** @var \PHPUnit_Framework_MockObject_MockObject */
+    protected $massOperationsFactory;
+
+    /** @var \Magento\Framework\Notification\NotifierInterface|\PHPUnit_Framework_MockObject_MockObject */
+    protected $notificationInterface;
+
+    /** @var \Magento\Framework\App\Config\ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject */
+    protected $scopeConfigInterface;
+
+    /** @var \Magento\Framework\Message\ManagerInterface|\PHPUnit_Framework_MockObject_MockObject */
+    protected $managerInterface;
+
+    /** @var \Magento\GoogleShopping\Model\Flag|\PHPUnit_Framework_MockObject_MockObject */
+    protected $flag;
+
+    protected function setUp()
+    {
+        $this->collectionFactory = $this->getMock('Magento\GoogleShopping\Model\Resource\Item\CollectionFactory');
+        $this->massOperationsFactory = $this->getMock('Magento\GoogleShopping\Model\MassOperationsFactory');
+        $this->notificationInterface = $this->getMock('Magento\Framework\Notification\NotifierInterface');
+        $this->scopeConfigInterface = $this->getMock('Magento\Framework\App\Config\ScopeConfigInterface');
+        $this->managerInterface = $this->getMock('Magento\Framework\Message\ManagerInterface');
+        $this->flag = $this->getMockBuilder('Magento\GoogleShopping\Model\Flag')
+            ->setMethods(['loadSelf', 'isExpired', 'unlock', '__sleep', '__wakeup'])
+            ->disableOriginalConstructor()->getMock();
+
+        $this->objectManagerHelper = new ObjectManagerHelper($this);
+        $this->observer = $this->objectManagerHelper->getObject(
+            'Magento\GoogleShopping\Model\Observer',
+            [
+                'collectionFactory' => $this->collectionFactory,
+                'operationsFactory' => $this->massOperationsFactory,
+                'notifier' => $this->notificationInterface,
+                'scopeConfig' => $this->scopeConfigInterface,
+                'messageManager' => $this->managerInterface,
+                'flag' => $this->flag
+            ]
+        );
+    }
+
+    public function testCheckSynchronizationOperations()
+    {
+        $this->flag->expects($this->once())->method('loadSelf')->will($this->returnSelf());
+        $this->flag->expects($this->once())->method('isExpired')->will($this->returnValue(true));
+        $observer = $this->objectManagerHelper->getObject('\Magento\Framework\Event\Observer');
+        $this->notificationInterface->expects($this->once())->method('addMajor')
+            ->with(
+                'Google Shopping operation has expired.',
+                'One or more google shopping synchronization operations failed because of timeout.'
+            )->will($this->returnSelf());
+        $this->observer->checkSynchronizationOperations($observer);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Integration/Controller/Adminhtml/Integration/TokensDialogTest.php b/dev/tests/unit/testsuite/Magento/Integration/Controller/Adminhtml/Integration/TokensDialogTest.php
index ac2641b635eec6b74bc08ec88374354df25b7db9..54192a1a5ffa7bb0ce8adcb26924a5681d645a5b 100644
--- a/dev/tests/unit/testsuite/Magento/Integration/Controller/Adminhtml/Integration/TokensDialogTest.php
+++ b/dev/tests/unit/testsuite/Magento/Integration/Controller/Adminhtml/Integration/TokensDialogTest.php
@@ -98,7 +98,7 @@ class TokensDialogTest extends \Magento\Integration\Controller\Adminhtml\Integra
                 $this->returnValue($this->_getIntegrationModelMock())
             );
 
-        $this->_oauthSvcMock->expects($this->once())->method('deleteToken');
+        $this->_oauthSvcMock->expects($this->once())->method('deleteIntegrationToken');
         $this->_oauthSvcMock->expects($this->once())->method('postToConsumer');
 
         $this->_messageManager->expects($this->once())->method('addNotice');
diff --git a/dev/tests/unit/testsuite/Magento/Integration/Oauth/OauthTest.php b/dev/tests/unit/testsuite/Magento/Integration/Oauth/OauthTest.php
index 027c684f9104a195b2fe06f1ca71943e885cdabd..6464cf29a306ee37e63bb25629ddc7b32f10ef80 100644
--- a/dev/tests/unit/testsuite/Magento/Integration/Oauth/OauthTest.php
+++ b/dev/tests/unit/testsuite/Magento/Integration/Oauth/OauthTest.php
@@ -112,6 +112,8 @@ class OauthTest extends \PHPUnit_Framework_TestCase
                     'getConsumerId',
                     'convertToAccess',
                     'getRevoked',
+                    'getResource',
+                    'loadByConsumerIdAndUserType',
                     '__wakeup'
                 )
             )
@@ -139,7 +141,8 @@ class OauthTest extends \PHPUnit_Framework_TestCase
             $this->_consumerFactory,
             $this->_tokenFactory,
             $this->_dataHelperMock,
-            $this->_dateMock
+            $this->_dateMock,
+            $this->_tokenMock
         );
         $this->_oauth = new \Magento\Framework\Oauth\Oauth(
             $this->_oauthHelperMock,
@@ -401,6 +404,7 @@ class OauthTest extends \PHPUnit_Framework_TestCase
         $this->_tokenMock->expects($this->any())->method('getVerifier')->will($this->returnValue($verifier));
         $this->_tokenMock->expects($this->any())->method('convertToAccess')->will($this->returnSelf());
         $this->_tokenMock->expects($this->any())->method('getRevoked')->will($this->returnValue($isRevoked));
+        $this->_tokenMock->expects($this->any())->method('loadByConsumerIdAndUserType')->will($this->returnSelf());
     }
 
     /**
diff --git a/dev/tests/unit/testsuite/Magento/Integration/Service/V1/AuthorizationServiceTest.php b/dev/tests/unit/testsuite/Magento/Integration/Service/V1/AuthorizationServiceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..4e9b2a4e8bc35c039b4fd186f134deb120ab01d2
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Integration/Service/V1/AuthorizationServiceTest.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\Integration\Service\V1;
+
+use Magento\Authorization\Model\Role;
+use Magento\Authorization\Model\UserContextInterface;
+
+class AuthorizationServiceTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var \PHPUnit_Framework_MockObject_MockObject|Role */
+    protected $roleMock;
+
+    /** @var AuthorizationService */
+    protected $integrationAuthorizationService;
+
+    protected function setUp()
+    {
+        $this->roleMock = $this->getMock(
+            'Magento\Authorization\Model\Role',
+            array('load', 'delete', '__wakeup'),
+            array(),
+            '',
+            false
+        );
+        $this->roleMock->expects($this->any())->method('load')->will($this->returnSelf());
+        $this->roleMock->expects($this->any())->method('delete')->will($this->returnSelf());
+
+        /** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Authorization\Model\RoleFactory $roleFactoryMock */
+        $roleFactoryMock = $this->getMock(
+            'Magento\Authorization\Model\RoleFactory',
+            array('create'),
+            array(),
+            '',
+            false
+        );
+        $roleFactoryMock->expects($this->any())->method('create')->will($this->returnValue($this->roleMock));
+
+        $this->integrationAuthorizationService = new AuthorizationService(
+            $this->getMock('Magento\Framework\Acl\Builder', array(), array(), '', false),
+            $roleFactoryMock,
+            $this->getMock('Magento\Authorization\Model\Resource\Role\CollectionFactory', array(), array(), '', false),
+            $this->getMock('Magento\Authorization\Model\RulesFactory', array(), array(), '', false),
+            $this->getMock('Magento\Authorization\Model\Resource\Rules\CollectionFactory', array(), array(), '', false),
+            $this->getMock('Magento\Framework\Logger', array(), array(), '', false),
+            $this->getMock('Magento\Framework\Acl\RootResource', array(), array(), '', false)
+        );
+    }
+
+    public function testRemovePermissions()
+    {
+        $integrationId = 22;
+        $roleName = UserContextInterface::USER_TYPE_INTEGRATION . $integrationId;
+        $this->roleMock->expects($this->once())->method('load')->with($roleName)->will($this->returnSelf());
+        $this->integrationAuthorizationService->removePermissions($integrationId);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Integration/Service/V1/IntegrationTest.php b/dev/tests/unit/testsuite/Magento/Integration/Service/V1/IntegrationTest.php
index 6199dc10aa7ceced96cdb10fe70a2bdbd3979e0d..99ab443c9899aeb62b57567180d4bc47bca48c1d 100644
--- a/dev/tests/unit/testsuite/Magento/Integration/Service/V1/IntegrationTest.php
+++ b/dev/tests/unit/testsuite/Magento/Integration/Service/V1/IntegrationTest.php
@@ -94,9 +94,6 @@ class IntegrationTest extends \PHPUnit_Framework_TestCase
             $this->returnValue($this->_integrationMock)
         );
 
-        $userIdentifierFactory = $this->getMockBuilder(
-            'Magento\Authz\Model\UserIdentifier\Factory'
-        )->disableOriginalConstructor()->getMock();
         $oauthConsumerHelper = $this->getMockBuilder(
             'Magento\Integration\Service\V1\Oauth'
         )->disableOriginalConstructor()->getMock();
@@ -111,10 +108,6 @@ class IntegrationTest extends \PHPUnit_Framework_TestCase
             $this->returnValue($oauthConsumer)
         );
         $oauthConsumerHelper->expects($this->any())->method('loadConsumer')->will($this->returnValue($oauthConsumer));
-        $userIdentifier = $this->getMockBuilder(
-            'Magento\Authz\Model\UserIdentifier'
-        )->disableOriginalConstructor()->getMock();
-        $userIdentifierFactory->expects($this->any())->method('create')->will($this->returnValue($userIdentifier));
 
         $this->_service = new \Magento\Integration\Service\V1\Integration(
             $this->_integrationFactory,
diff --git a/dev/tests/unit/testsuite/Magento/Integration/Service/V1/OauthTest.php b/dev/tests/unit/testsuite/Magento/Integration/Service/V1/OauthTest.php
index 2f6ca070d83cf9ec49f8b6631346fcdb3d774b0a..199ccae56c8187bac22399b0e49c7951d4fd6430 100644
--- a/dev/tests/unit/testsuite/Magento/Integration/Service/V1/OauthTest.php
+++ b/dev/tests/unit/testsuite/Magento/Integration/Service/V1/OauthTest.php
@@ -177,7 +177,7 @@ class OauthTest extends \PHPUnit_Framework_TestCase
         $this->_tokenProviderMock->expects(
             $this->any()
         )->method(
-            'getTokenByConsumerId'
+            'getIntegrationTokenByConsumerId'
         )->will(
             $this->returnValue($this->_tokenMock)
         );
@@ -214,7 +214,7 @@ class OauthTest extends \PHPUnit_Framework_TestCase
         $this->_tokenProviderMock->expects(
             $this->any()
         )->method(
-            'getTokenByConsumerId'
+            'getIntegrationTokenByConsumerId'
         )->will(
             $this->returnValue($this->_tokenMock)
         );
@@ -239,7 +239,7 @@ class OauthTest extends \PHPUnit_Framework_TestCase
         $this->_tokenProviderMock->expects(
             $this->any()
         )->method(
-            'getTokenByConsumerId'
+            'getIntegrationTokenByConsumerId'
         )->will(
             $this->throwException(
                 new \Magento\Framework\Oauth\Exception(
@@ -353,14 +353,14 @@ class OauthTest extends \PHPUnit_Framework_TestCase
         $this->_tokenProviderMock->expects(
             $this->any()
         )->method(
-            'getTokenByConsumerId'
+            'getIntegrationTokenByConsumerId'
         )->will(
             $this->returnValue($this->_tokenMock)
         );
 
         $this->_tokenMock->expects($this->once())->method('delete');
 
-        $this->assertTrue($this->_service->deleteToken(self::VALUE_CONSUMER_ID));
+        $this->assertTrue($this->_service->deleteIntegrationToken(self::VALUE_CONSUMER_ID));
     }
 
     public function testDeleteTokenNegative()
@@ -378,14 +378,14 @@ class OauthTest extends \PHPUnit_Framework_TestCase
         $this->_tokenProviderMock->expects(
             $this->any()
         )->method(
-            'getTokenByConsumerId'
+            'getIntegrationTokenByConsumerId'
         )->will(
             $this->returnValue($this->_tokenMock)
         );
 
         $this->_tokenMock->expects($this->never())->method('delete');
 
-        $this->assertFalse($this->_service->deleteToken(null));
+        $this->assertFalse($this->_service->deleteIntegrationToken(null));
     }
 
     public function testGetAccessTokenNoAccess()
@@ -403,7 +403,7 @@ class OauthTest extends \PHPUnit_Framework_TestCase
         $this->_tokenProviderMock->expects(
             $this->any()
         )->method(
-            'getTokenByConsumerId'
+            'getIntegrationTokenByConsumerId'
         )->will(
             $this->returnValue($this->_tokenMock)
         );
@@ -428,7 +428,7 @@ class OauthTest extends \PHPUnit_Framework_TestCase
         $this->_tokenProviderMock->expects(
             $this->any()
         )->method(
-            'getTokenByConsumerId'
+            'getIntegrationTokenByConsumerId'
         )->will(
             $this->returnValue($this->_tokenMock)
         );
diff --git a/dev/tests/unit/testsuite/Magento/RecurringPayment/Model/Plugin/TabsTest.php b/dev/tests/unit/testsuite/Magento/RecurringPayment/Model/Plugin/TabsTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..ac9a2fd6d955965ba6556fc34dc9c4c4d50415a9
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/RecurringPayment/Model/Plugin/TabsTest.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\RecurringPayment\Model\Plugin;
+
+class TabsTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @param $collection \Magento\Eav\Model\Resource\Entity\Attribute\Group\Collection
+     * @param $isOutputEnabled bool
+     * @param $size int
+     *
+     * @dataProvider getGroupCollectionDataProvider
+     */
+    public function testAfterGetGroupCollection($collection, $isOutputEnabled, $size)
+    {
+        $moduleManager = $this->getMock('Magento\Framework\Module\Manager', [], [], '', false);
+        $moduleManager->expects($this->once())
+            ->method('isOutputEnabled')
+            ->with('Magento_RecurringPayment')
+            ->will($this->returnValue($isOutputEnabled)
+         );
+
+        $subject = $this->getMock('Magento\Catalog\Block\Adminhtml\Product\Edit\Tabs', [], [], '', false);
+        $object = new \Magento\RecurringPayment\Model\Plugin\Tabs($moduleManager);
+
+        $collection = $object->afterGetGroupCollection($subject, $collection);
+        $this->assertEquals($collection->getSize(), $size);
+    }
+
+    public function getGroupCollectionDataProvider()
+    {
+        $item1 = new \Magento\Framework\Object(['attribute_group_code' => 'recurring-payment']);
+        $item2 = new \Magento\Framework\Object(['attribute_group_code' => 'data1']);
+        $item3 = new \Magento\Framework\Object(['attribute_group_code' => 'data2']);
+
+        $collection1 = new \Magento\Framework\Data\Collection(
+            $this->getMock('Magento\Core\Model\EntityFactory', array(), array(), '', false)
+        );
+        $collection1->addItem($item1);
+        $collection1->addItem($item2);
+
+        $collection2 = clone $collection1;
+
+        $collection3 = new \Magento\Framework\Data\Collection(
+            $this->getMock('Magento\Core\Model\EntityFactory', array(), array(), '', false)
+        );
+        $collection3->addItem($item2);
+        $collection3->addItem($item3);
+
+        return [[$collection1, true, 2], [$collection2, false, 1], [$collection3, false, 2]];
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Helper/DataTest.php b/dev/tests/unit/testsuite/Magento/Sales/Helper/DataTest.php
index 1d7625239cb53502df499dc0453af8f3b98340c8..433b70301f7653fe42cd6a3007b02c1f1491b48b 100644
--- a/dev/tests/unit/testsuite/Magento/Sales/Helper/DataTest.php
+++ b/dev/tests/unit/testsuite/Magento/Sales/Helper/DataTest.php
@@ -143,11 +143,13 @@ class DataTest extends \PHPUnit_Framework_TestCase
 
     /**
      * @dataProvider getScopeConfigValue
-     * @return void
      */
     public function testCanSendNewOrderConfirmationEmail($scopeConfigValue)
     {
-        $this->setupScopeConfigIsSetFlag(\Magento\Sales\Model\Order::XML_PATH_EMAIL_ENABLED, $scopeConfigValue);
+        $this->setupScopeConfigIsSetFlag(
+            \Magento\Sales\Model\Order\Email\Container\OrderIdentity::XML_PATH_EMAIL_ENABLED,
+            $scopeConfigValue
+        );
 
         $this->assertEquals($scopeConfigValue, $this->helper->canSendNewOrderConfirmationEmail($this->storeMock));
     }
@@ -158,7 +160,10 @@ class DataTest extends \PHPUnit_Framework_TestCase
      */
     public function testCanSendNewOrderEmail($scopeConfigValue)
     {
-        $this->setupScopeConfigIsSetFlag(\Magento\Sales\Model\Order::XML_PATH_EMAIL_ENABLED, $scopeConfigValue);
+        $this->setupScopeConfigIsSetFlag(
+            \Magento\Sales\Model\Order\Email\Container\OrderIdentity::XML_PATH_EMAIL_ENABLED,
+            $scopeConfigValue
+        );
 
         $this->assertEquals($scopeConfigValue, $this->helper->canSendNewOrderEmail($this->storeMock));
     }
@@ -170,7 +175,7 @@ class DataTest extends \PHPUnit_Framework_TestCase
     public function testCanSendOrderCommentEmail($scopeConfigValue)
     {
         $this->setupScopeConfigIsSetFlag(
-            \Magento\Sales\Model\Order::XML_PATH_UPDATE_EMAIL_ENABLED,
+            \Magento\Sales\Model\Order\Email\Container\OrderCommentIdentity::XML_PATH_EMAIL_ENABLED,
             $scopeConfigValue
         );
 
@@ -184,7 +189,7 @@ class DataTest extends \PHPUnit_Framework_TestCase
     public function testCanSendNewShipmentEmail($scopeConfigValue)
     {
         $this->setupScopeConfigIsSetFlag(
-            \Magento\Sales\Model\Order\Shipment::XML_PATH_EMAIL_ENABLED,
+            \Magento\Sales\Model\Order\Email\Container\ShipmentIdentity::XML_PATH_EMAIL_ENABLED,
             $scopeConfigValue
         );
 
@@ -198,7 +203,7 @@ class DataTest extends \PHPUnit_Framework_TestCase
     public function testCanSendShipmentCommentEmail($scopeConfigValue)
     {
         $this->setupScopeConfigIsSetFlag(
-            \Magento\Sales\Model\Order\Shipment::XML_PATH_UPDATE_EMAIL_ENABLED,
+            \Magento\Sales\Model\Order\Email\Container\ShipmentCommentIdentity::XML_PATH_EMAIL_ENABLED,
             $scopeConfigValue
         );
 
@@ -207,12 +212,11 @@ class DataTest extends \PHPUnit_Framework_TestCase
 
     /**
      * @dataProvider getScopeConfigValue
-     * @return void
      */
     public function testCanSendNewInvoiceEmail($scopeConfigValue)
     {
         $this->setupScopeConfigIsSetFlag(
-            \Magento\Sales\Model\Order\Invoice::XML_PATH_EMAIL_ENABLED,
+            \Magento\Sales\Model\Order\Email\Container\InvoiceIdentity::XML_PATH_EMAIL_ENABLED,
             $scopeConfigValue
         );
 
@@ -221,12 +225,11 @@ class DataTest extends \PHPUnit_Framework_TestCase
 
     /**
      * @dataProvider getScopeConfigValue
-     * @return void
      */
     public function testCanSendInvoiceCommentEmail($scopeConfigValue)
     {
         $this->setupScopeConfigIsSetFlag(
-            \Magento\Sales\Model\Order\Invoice::XML_PATH_UPDATE_EMAIL_ENABLED,
+            \Magento\Sales\Model\Order\Email\Container\InvoiceCommentIdentity::XML_PATH_EMAIL_ENABLED,
             $scopeConfigValue
         );
 
@@ -240,7 +243,7 @@ class DataTest extends \PHPUnit_Framework_TestCase
     public function testCanSendNewCreditmemoEmail($scopeConfigValue)
     {
         $this->setupScopeConfigIsSetFlag(
-            \Magento\Sales\Model\Order\Creditmemo::XML_PATH_EMAIL_ENABLED,
+            \Magento\Sales\Model\Order\Email\Container\CreditmemoIdentity::XML_PATH_EMAIL_ENABLED,
             $scopeConfigValue
         );
 
@@ -254,7 +257,7 @@ class DataTest extends \PHPUnit_Framework_TestCase
     public function testCanSendCreditmemoCommentEmail($scopeConfigValue)
     {
         $this->setupScopeConfigIsSetFlag(
-            \Magento\Sales\Model\Order\Creditmemo::XML_PATH_UPDATE_EMAIL_ENABLED,
+            \Magento\Sales\Model\Order\Email\Container\CreditmemoCommentIdentity::XML_PATH_EMAIL_ENABLED,
             $scopeConfigValue
         );
 
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/AdminOrder/CreateTest.php b/dev/tests/unit/testsuite/Magento/Sales/Model/AdminOrder/CreateTest.php
index 539dbabda3fe80ad61b4da22103fe5e25566d2fe..3112c42692d3b0a35e8e363122e8f6765160e5c8 100644
--- a/dev/tests/unit/testsuite/Magento/Sales/Model/AdminOrder/CreateTest.php
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/AdminOrder/CreateTest.php
@@ -50,6 +50,11 @@ class CreateTest extends \PHPUnit_Framework_TestCase
     /** @var \Magento\Sales\Model\Quote\Item\Updater|\PHPUnit_Framework_MockObject_MockObject */
     protected $itemUpdater;
 
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $objectFactory;
+
     protected function setUp()
     {
         $objectManagerMock = $this->getMock('Magento\Framework\ObjectManager');
@@ -71,8 +76,8 @@ class CreateTest extends \PHPUnit_Framework_TestCase
         );
         $this->formFactoryMock = $this->getMock(
             'Magento\Customer\Model\Metadata\FormFactory',
-            array(),
-            array(),
+            ['create'],
+            [],
             '',
             false
         );
@@ -88,6 +93,11 @@ class CreateTest extends \PHPUnit_Framework_TestCase
 
         $this->itemUpdater = $this->getMock('Magento\Sales\Model\Quote\Item\Updater', array(), array(), '', false);
 
+        $this->objectFactory = $this->getMockBuilder('\Magento\Framework\Object\Factory')
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
+
         $objectManagerHelper = new ObjectManagerHelper($this);
         $this->adminOrderCreate = $objectManagerHelper->getObject(
             'Magento\Sales\Model\AdminOrder\Create',
@@ -107,7 +117,8 @@ class CreateTest extends \PHPUnit_Framework_TestCase
                 'customerBuilder' => $this->customerBuilderMock,
                 'customerHelper' => $customerHelperMock,
                 'customerGroupService' => $this->customerGroupServiceMock,
-                'quoteItemUpdater' => $this->itemUpdater
+                'quoteItemUpdater' => $this->itemUpdater,
+                'objectFactory' => $this->objectFactory
             )
         );
     }
@@ -224,7 +235,8 @@ class CreateTest extends \PHPUnit_Framework_TestCase
         $this->sessionQuoteMock->expects($this->any())->method('getQuote')->will($this->returnValue($quoteMock));
         $this->itemUpdater->expects($this->once())
             ->method('update')
-            ->with($this->equalTo($itemMock), $this->equalTo($items[1]));
+            ->with($this->equalTo($itemMock), $this->equalTo($items[1]))
+            ->will($this->returnSelf());
 
         $this->adminOrderCreate->setRecollect(false);
         $this->adminOrderCreate->updateQuoteItems($items);
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/AdminOrder/EmailSenderTest.php b/dev/tests/unit/testsuite/Magento/Sales/Model/AdminOrder/EmailSenderTest.php
index 8899af9c4555e50c3a077d5986c653b8678744bf..dc27b688da98bcb851c827fd507cfd4188bf3e9b 100644
--- a/dev/tests/unit/testsuite/Magento/Sales/Model/AdminOrder/EmailSenderTest.php
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/AdminOrder/EmailSenderTest.php
@@ -45,6 +45,11 @@ class EmailSenderTest extends \PHPUnit_Framework_TestCase
      */
     protected $emailSender;
 
+    /**
+     * @var \Magento\Sales\Model\Order\Email\Sender\OrderSender
+     */
+    protected $orderSenderMock;
+
     protected function setUp()
     {
         $this->messageManagerMock = $this->getMock(
@@ -68,20 +73,28 @@ class EmailSenderTest extends \PHPUnit_Framework_TestCase
             '',
             false
         );
-        $this->emailSender = new EmailSender($this->messageManagerMock, $this->loggerMock);
+        $this->orderSenderMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\Sender\OrderSender',
+            [],
+            [],
+            '',
+            false
+        );
+
+        $this->emailSender = new EmailSender($this->messageManagerMock, $this->loggerMock, $this->orderSenderMock);
     }
 
     public function testSendSuccess()
     {
-        $this->orderMock->expects($this->once())
-            ->method('sendNewOrderEmail');
+        $this->orderSenderMock->expects($this->once())
+            ->method('send');
         $this->assertTrue($this->emailSender->send($this->orderMock));
     }
 
     public function testSendFailure()
     {
-        $this->orderMock->expects($this->once())
-            ->method('sendNewOrderEmail')
+        $this->orderSenderMock->expects($this->once())
+            ->method('send')
             ->will($this->throwException(new \Magento\Framework\Mail\Exception('test message')));
         $this->messageManagerMock->expects($this->once())
             ->method('addWarning');
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/NotifierTest.php b/dev/tests/unit/testsuite/Magento/Sales/Model/NotifierTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..efc875255ce4643a06308879f5e554d5bd3eca57
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/NotifierTest.php
@@ -0,0 +1,165 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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;
+
+use Magento\Sales\Model\Resource\Order\Status\History\CollectionFactory;
+use Magento\Framework\Mail\Exception;
+
+/**
+ * Class NotifierTest
+ */
+class NotifierTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var CollectionFactory |\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $historyCollectionFactory;
+
+    /**
+     * @var \Magento\Sales\Model\Notifier
+     */
+    protected $notifier;
+
+    /**
+     * @var \Magento\Sales\Model\Order|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $order;
+
+    /**
+     * @var \Magento\Framework\ObjectManager |\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $loggerMock;
+
+    /**
+     * @var \Magento\Framework\ObjectManager\ObjectManager |\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderSenderMock;
+
+    public function setUp()
+    {
+        $this->historyCollectionFactory = $this->getMock(
+            'Magento\Sales\Model\Resource\Order\Status\History\CollectionFactory',
+            ['create'],
+            [],
+            '',
+            false
+        );
+        $this->order = $this->getMock(
+            'Magento\Sales\Model\Order',
+            ['__wakeUp', 'getEmailSent'],
+            [],
+            '',
+            false
+        );
+        $this->orderSenderMock = $this->getMock(
+            'Magento\Sales\Model\Order\Email\Sender\OrderSender',
+            ['send'],
+            [],
+            '',
+            false
+        );
+        $this->loggerMock = $this->getMock(
+            'Magento\Framework\Logger',
+            ['logException'],
+            [],
+            '',
+            false
+        );
+        $this->notifier = new Notifier(
+            $this->historyCollectionFactory,
+            $this->loggerMock,
+            $this->orderSenderMock
+        );
+    }
+
+    /**
+     * Test case for successful email sending
+     */
+    public function testNotifySuccess()
+    {
+        $historyCollection = $this->getMock(
+            'Magento\Sales\Model\Resource\Order\Status\History\Collection',
+            ['getUnnotifiedForInstance', 'save', 'setIsCustomerNotified'],
+            [],
+            '',
+            false
+        );
+        $historyItem = $this->getMock(
+            'Magento\Sales\Model\Order\Status\History',
+            ['setIsCustomerNotified', 'save', '__wakeUp'],
+            [],
+            '',
+            false
+        );
+        $historyItem->expects($this->at(0))
+            ->method('setIsCustomerNotified')
+            ->with(1);
+        $historyItem->expects($this->at(1))
+            ->method('save');
+        $historyCollection->expects($this->once())
+            ->method('getUnnotifiedForInstance')
+            ->with($this->order, \Magento\Sales\Model\Order::HISTORY_ENTITY_NAME)
+            ->will($this->returnValue($historyItem));
+        $this->order->expects($this->once())
+            ->method('getEmailSent')
+            ->will($this->returnValue(true));
+        $this->historyCollectionFactory->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($historyCollection));
+
+        $this->orderSenderMock->expects($this->once())
+            ->method('send')
+            ->with($this->equalTo($this->order));
+
+        $this->assertTrue($this->notifier->notify($this->order));
+    }
+
+    /**
+     * Test case when email has not been sent
+     */
+    public function testNotifyFail()
+    {
+        $this->order->expects($this->once())
+            ->method('getEmailSent')
+            ->will($this->returnValue(false));
+        $this->assertFalse($this->notifier->notify($this->order));
+    }
+
+    /**
+     * Test case when Mail Exception has been thrown
+     */
+    public function testNotifyException()
+    {
+        $exception = new Exception('Email has not been sent');
+        $this->orderSenderMock->expects($this->once())
+            ->method('send')
+            ->with($this->equalTo($this->order))
+            ->will($this->throwException($exception));
+        $this->loggerMock->expects($this->once())
+            ->method('logException')
+            ->with($this->equalTo($exception));
+        $this->assertFalse($this->notifier->notify($this->order));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Address/ValidatorTest.php b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Address/ValidatorTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..f2de0967f5248522d648d8ca9fd75a2b8092efd0
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Address/ValidatorTest.php
@@ -0,0 +1,124 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Address;
+
+/**
+ * Class ValidatorTest
+ */
+class ValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Sales\Model\Order\Address\Validator
+     */
+    protected $validator;
+
+    /**
+     * @var \Magento\Sales\Model\Order\Address|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $addressMock;
+
+    /**
+     * Mock order address model
+     */
+    public function setUp()
+    {
+        $this->addressMock = $this->getMock(
+            'Magento\Sales\Model\Order\Address',
+            ['hasData', 'getEmail', 'getAddressType', '__wakeup'],
+            [],
+            '',
+            false
+        );
+        $this->validator = new \Magento\Sales\Model\Order\Address\Validator();
+    }
+
+    /**
+     * @param $addressData
+     * @param $expectedWarnings
+     * @dataProvider providerAddressData
+     */
+    public function testValidate($addressData, $email, $addressType, $expectedWarnings)
+    {
+        $this->addressMock->expects($this->any())
+            ->method('hasData')
+            ->will($this->returnValueMap($addressData));
+        $this->addressMock->expects($this->once())
+            ->method('getEmail')
+            ->will($this->returnValue($email));
+        $this->addressMock->expects($this->once())
+            ->method('getAddressType')
+            ->will($this->returnValue($addressType));
+        $actualWarnings = $this->validator->validate($this->addressMock);
+        $this->assertEquals($expectedWarnings, $actualWarnings);
+    }
+
+    /**
+     * Provides address data for tests
+     *
+     * @return array
+     */
+    public function providerAddressData()
+    {
+        return [
+            [
+                [
+                    ['parent_id', true],
+                    ['postcode', true],
+                    ['lastname', true],
+                    ['street', true],
+                    ['city', true],
+                    ['email', true],
+                    ['telephone', true],
+                    ['country_id', true],
+                    ['firstname', true],
+                    ['address_type', true],
+                ],
+                'co@co.co',
+                'billing',
+                []
+            ],
+            [
+                [
+                    ['parent_id', true],
+                    ['postcode', true],
+                    ['lastname', true],
+                    ['street', false],
+                    ['city', true],
+                    ['email', true],
+                    ['telephone', true],
+                    ['country_id', true],
+                    ['firstname', true],
+                    ['address_type', true],
+                ],
+                'co.co.co',
+                'coco-shipping',
+                [
+                    'Street is a required field',
+                    'Email has a wrong format',
+                    'Address type doesn\'t match required options'
+                ]
+            ]
+        ];
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/CreditmemoCommentIdentityTest.php b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/CreditmemoCommentIdentityTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..40df95b36e0bb9e6e6f1795c3362b4b6cdb917bb
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/CreditmemoCommentIdentityTest.php
@@ -0,0 +1,222 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Email\Container;
+
+class CreditmemoCommentIdentityTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Sales\Model\Order\Email\Container\CreditmemoCommentIdentity
+     */
+    protected $identity;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeManagerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $scopeConfigInterfaceMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeMock;
+
+    protected $storeId;
+
+    protected function setUp()
+    {
+        $this->scopeConfigInterfaceMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\Container\Stub\ScopeConfigInterfaceMock',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->storeManagerMock = $this->getMock(
+            '\Magento\Store\Model\Storage\DefaultStorage',
+            [],
+            [],
+            '',
+            false
+        );
+
+        $this->storeMock = $this->getMock(
+            '\Magento\Store\Model\Store',
+            ['getStoreId', '__wakeup'],
+            [],
+            '',
+            false
+        );
+
+        $this->storeId = 999999999999;
+        $this->storeMock->expects($this->any())
+            ->method('getStoreId')
+            ->will($this->returnValue($this->storeId));
+
+        $this->identity = new CreditmemoCommentIdentity($this->scopeConfigInterfaceMock, $this->storeManagerMock);
+    }
+
+    public function testIsEnabledTrue()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('isSetFlag')
+            ->with(
+                $this->equalTo(CreditmemoCommentIdentity::XML_PATH_EMAIL_ENABLED),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue(true));
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->isEnabled();
+        $this->assertTrue($result);
+    }
+
+    public function testGetEmailCopyTo()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(CreditmemoCommentIdentity::XML_PATH_EMAIL_COPY_TO),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('test_value,test_value2'));
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getEmailCopyTo();
+        $this->assertEquals(['test_value', 'test_value2'], $result);
+    }
+
+    public function testGetEmailCopyToEmptyResult()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(CreditmemoCommentIdentity::XML_PATH_EMAIL_COPY_TO),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue(null));
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getEmailCopyTo();
+        $this->assertFalse($result);
+    }
+
+    public function testCopyMethod()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(CreditmemoCommentIdentity::XML_PATH_EMAIL_COPY_METHOD),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('copy_method'));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getCopyMethod();
+        $this->assertEquals('copy_method', $result);
+    }
+
+    public function testGuestTemplateId()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(CreditmemoCommentIdentity::XML_PATH_EMAIL_GUEST_TEMPLATE),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('template_id'));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getGuestTemplateId();
+        $this->assertEquals('template_id', $result);
+    }
+
+    public function testTemplateId()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(CreditmemoCommentIdentity::XML_PATH_EMAIL_TEMPLATE),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('template_id'));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getTemplateId();
+        $this->assertEquals('template_id', $result);
+    }
+
+    public function testSetStore()
+    {
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getStore();
+        $this->assertEquals($this->storeMock, $result);
+    }
+
+    public function testGetStoreFromStoreManager()
+    {
+        $this->storeManagerMock->expects($this->once())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+        $result = $this->identity->getStore();
+        $this->assertEquals($this->storeMock, $result);
+    }
+
+    public function testSetCustomerEmail()
+    {
+        $this->identity->setCustomerEmail('email');
+        $result = $this->identity->getCustomerEmail();
+        $this->assertEquals('email', $result);
+    }
+
+    public function testSetCusomerName()
+    {
+        $this->identity->setCustomerName('name');
+        $result = $this->identity->getCustomerName();
+        $this->assertEquals('name', $result);
+    }
+
+    public function testGetEmailIdentity()
+    {
+        $emailIdentity = 'test@example.com';
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(CreditmemoCommentIdentity::XML_PATH_EMAIL_IDENTITY),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue($emailIdentity));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getEmailIdentity();
+        $this->assertEquals($emailIdentity, $result);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/CreditmemoIdentityTest.php b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/CreditmemoIdentityTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..ecc74e1b9c6d9c7b0a66878f05f2fa000af1f1aa
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/CreditmemoIdentityTest.php
@@ -0,0 +1,222 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Email\Container;
+
+class CreditmemoIdentityTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Sales\Model\Order\Email\Container\CreditmemoIdentity
+     */
+    protected $identity;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeManagerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $scopeConfigInterfaceMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeMock;
+
+    protected $storeId;
+
+    protected function setUp()
+    {
+        $this->scopeConfigInterfaceMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\Container\Stub\ScopeConfigInterfaceMock',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->storeManagerMock = $this->getMock(
+            '\Magento\Store\Model\Storage\DefaultStorage',
+            [],
+            [],
+            '',
+            false
+        );
+
+        $this->storeMock = $this->getMock(
+            '\Magento\Store\Model\Store',
+            ['getStoreId', '__wakeup'],
+            [],
+            '',
+            false
+        );
+
+        $this->storeId = 999999999999;
+        $this->storeMock->expects($this->any())
+            ->method('getStoreId')
+            ->will($this->returnValue($this->storeId));
+
+        $this->identity = new CreditmemoIdentity($this->scopeConfigInterfaceMock, $this->storeManagerMock);
+    }
+
+    public function testIsEnabledTrue()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('isSetFlag')
+            ->with(
+                $this->equalTo(CreditmemoIdentity::XML_PATH_EMAIL_ENABLED),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue(true));
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->isEnabled();
+        $this->assertTrue($result);
+    }
+
+    public function testGetEmailCopyTo()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(CreditmemoIdentity::XML_PATH_EMAIL_COPY_TO),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('test_value,test_value2'));
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getEmailCopyTo();
+        $this->assertEquals(['test_value', 'test_value2'], $result);
+    }
+
+    public function testGetEmailCopyToEmptyResult()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(CreditmemoIdentity::XML_PATH_EMAIL_COPY_TO),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue(null));
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getEmailCopyTo();
+        $this->assertFalse($result);
+    }
+
+    public function testCopyMethod()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(CreditmemoIdentity::XML_PATH_EMAIL_COPY_METHOD),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('copy_method'));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getCopyMethod();
+        $this->assertEquals('copy_method', $result);
+    }
+
+    public function testGuestTemplateId()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(CreditmemoIdentity::XML_PATH_EMAIL_GUEST_TEMPLATE),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('template_id'));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getGuestTemplateId();
+        $this->assertEquals('template_id', $result);
+    }
+
+    public function testTemplateId()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(CreditmemoIdentity::XML_PATH_EMAIL_TEMPLATE),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('template_id'));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getTemplateId();
+        $this->assertEquals('template_id', $result);
+    }
+
+    public function testSetStore()
+    {
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getStore();
+        $this->assertEquals($this->storeMock, $result);
+    }
+
+    public function testGetStoreFromStoreManager()
+    {
+        $this->storeManagerMock->expects($this->once())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+        $result = $this->identity->getStore();
+        $this->assertEquals($this->storeMock, $result);
+    }
+
+    public function testSetCustomerEmail()
+    {
+        $this->identity->setCustomerEmail('email');
+        $result = $this->identity->getCustomerEmail();
+        $this->assertEquals('email', $result);
+    }
+
+    public function testSetCusomerName()
+    {
+        $this->identity->setCustomerName('name');
+        $result = $this->identity->getCustomerName();
+        $this->assertEquals('name', $result);
+    }
+
+    public function testGetEmailIdentity()
+    {
+        $emailIdentity = 'test@example.com';
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(CreditmemoIdentity::XML_PATH_EMAIL_IDENTITY),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue($emailIdentity));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getEmailIdentity();
+        $this->assertEquals($emailIdentity, $result);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/InvoiceCommentIdentityTest.php b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/InvoiceCommentIdentityTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..420b5f951f05a0420a1307e8d5fc6bd2a0bade8b
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/InvoiceCommentIdentityTest.php
@@ -0,0 +1,222 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Email\Container;
+
+class InvoiceCommentIdentityTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Sales\Model\Order\Email\Container\InvoiceCommentIdentity
+     */
+    protected $identity;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeManagerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $scopeConfigInterfaceMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeMock;
+
+    protected $storeId;
+
+    protected function setUp()
+    {
+        $this->scopeConfigInterfaceMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\Container\Stub\ScopeConfigInterfaceMock',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->storeManagerMock = $this->getMock(
+            '\Magento\Store\Model\Storage\DefaultStorage',
+            [],
+            [],
+            '',
+            false
+        );
+
+        $this->storeMock = $this->getMock(
+            '\Magento\Store\Model\Store',
+            ['getStoreId', '__wakeup'],
+            [],
+            '',
+            false
+        );
+
+        $this->storeId = 999999999999;
+        $this->storeMock->expects($this->any())
+            ->method('getStoreId')
+            ->will($this->returnValue($this->storeId));
+
+        $this->identity = new InvoiceCommentIdentity($this->scopeConfigInterfaceMock, $this->storeManagerMock);
+    }
+
+    public function testIsEnabledTrue()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('isSetFlag')
+            ->with(
+                $this->equalTo(InvoiceCommentIdentity::XML_PATH_EMAIL_ENABLED),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue(true));
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->isEnabled();
+        $this->assertTrue($result);
+    }
+
+    public function testGetEmailCopyTo()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(InvoiceCommentIdentity::XML_PATH_EMAIL_COPY_TO),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('test_value,test_value2'));
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getEmailCopyTo();
+        $this->assertEquals(['test_value', 'test_value2'], $result);
+    }
+
+    public function testGetEmailCopyToEmptyResult()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(InvoiceCommentIdentity::XML_PATH_EMAIL_COPY_TO),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue(null));
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getEmailCopyTo();
+        $this->assertFalse($result);
+    }
+
+    public function testCopyMethod()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(InvoiceCommentIdentity::XML_PATH_EMAIL_COPY_METHOD),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('copy_method'));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getCopyMethod();
+        $this->assertEquals('copy_method', $result);
+    }
+
+    public function testGuestTemplateId()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(InvoiceCommentIdentity::XML_PATH_EMAIL_GUEST_TEMPLATE),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('template_id'));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getGuestTemplateId();
+        $this->assertEquals('template_id', $result);
+    }
+
+    public function testTemplateId()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(InvoiceCommentIdentity::XML_PATH_EMAIL_TEMPLATE),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('template_id'));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getTemplateId();
+        $this->assertEquals('template_id', $result);
+    }
+
+    public function testSetStore()
+    {
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getStore();
+        $this->assertEquals($this->storeMock, $result);
+    }
+
+    public function testGetStoreFromStoreManager()
+    {
+        $this->storeManagerMock->expects($this->once())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+        $result = $this->identity->getStore();
+        $this->assertEquals($this->storeMock, $result);
+    }
+
+    public function testSetCustomerEmail()
+    {
+        $this->identity->setCustomerEmail('email');
+        $result = $this->identity->getCustomerEmail();
+        $this->assertEquals('email', $result);
+    }
+
+    public function testSetCusomerName()
+    {
+        $this->identity->setCustomerName('name');
+        $result = $this->identity->getCustomerName();
+        $this->assertEquals('name', $result);
+    }
+
+    public function testGetEmailIdentity()
+    {
+        $emailIdentity = 'test@example.com';
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(InvoiceCommentIdentity::XML_PATH_EMAIL_IDENTITY),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue($emailIdentity));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getEmailIdentity();
+        $this->assertEquals($emailIdentity, $result);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/InvoiceIdentityTest.php b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/InvoiceIdentityTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..e05985e06877a52a949692cc885bf68f0bf623b6
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/InvoiceIdentityTest.php
@@ -0,0 +1,222 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Email\Container;
+
+class InvoiceIdentityTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Sales\Model\Order\Email\Container\InvoiceIdentity
+     */
+    protected $identity;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeManagerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $scopeConfigInterfaceMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeMock;
+
+    protected $storeId;
+
+    protected function setUp()
+    {
+        $this->scopeConfigInterfaceMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\Container\Stub\ScopeConfigInterfaceMock',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->storeManagerMock = $this->getMock(
+            '\Magento\Store\Model\Storage\DefaultStorage',
+            [],
+            [],
+            '',
+            false
+        );
+
+        $this->storeMock = $this->getMock(
+            '\Magento\Store\Model\Store',
+            ['getStoreId', '__wakeup'],
+            [],
+            '',
+            false
+        );
+
+        $this->storeId = 999999999999;
+        $this->storeMock->expects($this->any())
+            ->method('getStoreId')
+            ->will($this->returnValue($this->storeId));
+
+        $this->identity = new InvoiceIdentity($this->scopeConfigInterfaceMock, $this->storeManagerMock);
+    }
+
+    public function testIsEnabledTrue()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('isSetFlag')
+            ->with(
+                $this->equalTo(InvoiceIdentity::XML_PATH_EMAIL_ENABLED),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue(true));
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->isEnabled();
+        $this->assertTrue($result);
+    }
+
+    public function testGetEmailCopyTo()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(InvoiceIdentity::XML_PATH_EMAIL_COPY_TO),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('test_value,test_value2'));
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getEmailCopyTo();
+        $this->assertEquals(['test_value', 'test_value2'], $result);
+    }
+
+    public function testGetEmailCopyToEmptyResult()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(InvoiceIdentity::XML_PATH_EMAIL_COPY_TO),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue(null));
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getEmailCopyTo();
+        $this->assertFalse($result);
+    }
+
+    public function testCopyMethod()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(InvoiceIdentity::XML_PATH_EMAIL_COPY_METHOD),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('copy_method'));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getCopyMethod();
+        $this->assertEquals('copy_method', $result);
+    }
+
+    public function testGuestTemplateId()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(InvoiceIdentity::XML_PATH_EMAIL_GUEST_TEMPLATE),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('template_id'));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getGuestTemplateId();
+        $this->assertEquals('template_id', $result);
+    }
+
+    public function testTemplateId()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(InvoiceIdentity::XML_PATH_EMAIL_TEMPLATE),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('template_id'));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getTemplateId();
+        $this->assertEquals('template_id', $result);
+    }
+
+    public function testSetStore()
+    {
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getStore();
+        $this->assertEquals($this->storeMock, $result);
+    }
+
+    public function testGetStoreFromStoreManager()
+    {
+        $this->storeManagerMock->expects($this->once())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+        $result = $this->identity->getStore();
+        $this->assertEquals($this->storeMock, $result);
+    }
+
+    public function testSetCustomerEmail()
+    {
+        $this->identity->setCustomerEmail('email');
+        $result = $this->identity->getCustomerEmail();
+        $this->assertEquals('email', $result);
+    }
+
+    public function testSetCusomerName()
+    {
+        $this->identity->setCustomerName('name');
+        $result = $this->identity->getCustomerName();
+        $this->assertEquals('name', $result);
+    }
+
+    public function testGetEmailIdentity()
+    {
+        $emailIdentity = 'test@example.com';
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(InvoiceIdentity::XML_PATH_EMAIL_IDENTITY),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue($emailIdentity));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getEmailIdentity();
+        $this->assertEquals($emailIdentity, $result);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/OrderCommentIdentityTest.php b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/OrderCommentIdentityTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..5aa8adb9d5171aaf3ca13ae257040f2bc8b06a18
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/OrderCommentIdentityTest.php
@@ -0,0 +1,222 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Email\Container;
+
+class OrderCommentIdentityTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Sales\Model\Order\Email\Container\OrderCommentIdentity
+     */
+    protected $identity;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeManagerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $scopeConfigInterfaceMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeMock;
+
+    protected $storeId;
+
+    protected function setUp()
+    {
+        $this->scopeConfigInterfaceMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\Container\Stub\ScopeConfigInterfaceMock',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->storeManagerMock = $this->getMock(
+            '\Magento\Store\Model\Storage\DefaultStorage',
+            [],
+            [],
+            '',
+            false
+        );
+
+        $this->storeMock = $this->getMock(
+            '\Magento\Store\Model\Store',
+            ['getStoreId', '__wakeup'],
+            [],
+            '',
+            false
+        );
+
+        $this->storeId = 999999999999;
+        $this->storeMock->expects($this->any())
+            ->method('getStoreId')
+            ->will($this->returnValue($this->storeId));
+
+        $this->identity = new OrderCommentIdentity($this->scopeConfigInterfaceMock, $this->storeManagerMock);
+    }
+
+    public function testIsEnabledTrue()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('isSetFlag')
+            ->with(
+                $this->equalTo(OrderCommentIdentity::XML_PATH_EMAIL_ENABLED),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue(true));
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->isEnabled();
+        $this->assertTrue($result);
+    }
+
+    public function testGetEmailCopyTo()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(OrderCommentIdentity::XML_PATH_EMAIL_COPY_TO),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('test_value,test_value2'));
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getEmailCopyTo();
+        $this->assertEquals(['test_value', 'test_value2'], $result);
+    }
+
+    public function testGetEmailCopyToEmptyResult()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(OrderCommentIdentity::XML_PATH_EMAIL_COPY_TO),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue(null));
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getEmailCopyTo();
+        $this->assertFalse($result);
+    }
+
+    public function testCopyMethod()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(OrderCommentIdentity::XML_PATH_EMAIL_COPY_METHOD),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('copy_method'));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getCopyMethod();
+        $this->assertEquals('copy_method', $result);
+    }
+
+    public function testGuestTemplateId()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(OrderCommentIdentity::XML_PATH_EMAIL_GUEST_TEMPLATE),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('template_id'));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getGuestTemplateId();
+        $this->assertEquals('template_id', $result);
+    }
+
+    public function testTemplateId()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(OrderCommentIdentity::XML_PATH_EMAIL_TEMPLATE),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('template_id'));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getTemplateId();
+        $this->assertEquals('template_id', $result);
+    }
+
+    public function testSetStore()
+    {
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getStore();
+        $this->assertEquals($this->storeMock, $result);
+    }
+
+    public function testGetStoreFromStoreManager()
+    {
+        $this->storeManagerMock->expects($this->once())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+        $result = $this->identity->getStore();
+        $this->assertEquals($this->storeMock, $result);
+    }
+
+    public function testSetCustomerEmail()
+    {
+        $this->identity->setCustomerEmail('email');
+        $result = $this->identity->getCustomerEmail();
+        $this->assertEquals('email', $result);
+    }
+
+    public function testSetCusomerName()
+    {
+        $this->identity->setCustomerName('name');
+        $result = $this->identity->getCustomerName();
+        $this->assertEquals('name', $result);
+    }
+
+    public function testGetEmailIdentity()
+    {
+        $emailIdentity = 'test@example.com';
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(OrderCommentIdentity::XML_PATH_EMAIL_IDENTITY),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue($emailIdentity));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getEmailIdentity();
+        $this->assertEquals($emailIdentity, $result);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/OrderIdentityTest.php b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/OrderIdentityTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..1b02572af5769b2dab137789fb8b3b2dd776ff26
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/OrderIdentityTest.php
@@ -0,0 +1,222 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Email\Container;
+
+class OrderIdentityTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Sales\Model\Order\Email\Container\OrderIdentity
+     */
+    protected $identity;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeManagerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $scopeConfigInterfaceMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeMock;
+
+    protected $storeId;
+
+    protected function setUp()
+    {
+        $this->scopeConfigInterfaceMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\Container\Stub\ScopeConfigInterfaceMock',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->storeManagerMock = $this->getMock(
+            '\Magento\Store\Model\Storage\DefaultStorage',
+            [],
+            [],
+            '',
+            false
+        );
+
+        $this->storeMock = $this->getMock(
+            '\Magento\Store\Model\Store',
+            ['getStoreId', '__wakeup'],
+            [],
+            '',
+            false
+        );
+
+        $this->storeId = 999999999999;
+        $this->storeMock->expects($this->any())
+            ->method('getStoreId')
+            ->will($this->returnValue($this->storeId));
+
+        $this->identity = new OrderIdentity($this->scopeConfigInterfaceMock, $this->storeManagerMock);
+    }
+
+    public function testIsEnabledTrue()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('isSetFlag')
+            ->with(
+                $this->equalTo(OrderIdentity::XML_PATH_EMAIL_ENABLED),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue(true));
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->isEnabled();
+        $this->assertTrue($result);
+    }
+
+    public function testGetEmailCopyTo()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(OrderIdentity::XML_PATH_EMAIL_COPY_TO),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('test_value,test_value2'));
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getEmailCopyTo();
+        $this->assertEquals(['test_value', 'test_value2'], $result);
+    }
+
+    public function testGetEmailCopyToEmptyResult()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(OrderIdentity::XML_PATH_EMAIL_COPY_TO),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue(null));
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getEmailCopyTo();
+        $this->assertFalse($result);
+    }
+
+    public function testCopyMethod()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(OrderIdentity::XML_PATH_EMAIL_COPY_METHOD),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('copy_method'));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getCopyMethod();
+        $this->assertEquals('copy_method', $result);
+    }
+
+    public function testGuestTemplateId()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(OrderIdentity::XML_PATH_EMAIL_GUEST_TEMPLATE),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('template_id'));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getGuestTemplateId();
+        $this->assertEquals('template_id', $result);
+    }
+
+    public function testTemplateId()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(OrderIdentity::XML_PATH_EMAIL_TEMPLATE),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('template_id'));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getTemplateId();
+        $this->assertEquals('template_id', $result);
+    }
+
+    public function testSetStore()
+    {
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getStore();
+        $this->assertEquals($this->storeMock, $result);
+    }
+
+    public function testGetStoreFromStoreManager()
+    {
+        $this->storeManagerMock->expects($this->once())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+        $result = $this->identity->getStore();
+        $this->assertEquals($this->storeMock, $result);
+    }
+
+    public function testSetCustomerEmail()
+    {
+        $this->identity->setCustomerEmail('email');
+        $result = $this->identity->getCustomerEmail();
+        $this->assertEquals('email', $result);
+    }
+
+    public function testSetCusomerName()
+    {
+        $this->identity->setCustomerName('name');
+        $result = $this->identity->getCustomerName();
+        $this->assertEquals('name', $result);
+    }
+
+    public function testGetEmailIdentity()
+    {
+        $emailIdentity = 'test@example.com';
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(OrderIdentity::XML_PATH_EMAIL_IDENTITY),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue($emailIdentity));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getEmailIdentity();
+        $this->assertEquals($emailIdentity, $result);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/ShipmentCommentIdentityTest.php b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/ShipmentCommentIdentityTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..20d89ac2108083b1bd553e55c9f6713096436f18
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/ShipmentCommentIdentityTest.php
@@ -0,0 +1,222 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Email\Container;
+
+class ShipmentCommentIdentityTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Sales\Model\Order\Email\Container\ShipmentCommentIdentity
+     */
+    protected $identity;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeManagerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $scopeConfigInterfaceMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeMock;
+
+    protected $storeId;
+
+    protected function setUp()
+    {
+        $this->scopeConfigInterfaceMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\Container\Stub\ScopeConfigInterfaceMock',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->storeManagerMock = $this->getMock(
+            '\Magento\Store\Model\Storage\DefaultStorage',
+            [],
+            [],
+            '',
+            false
+        );
+
+        $this->storeMock = $this->getMock(
+            '\Magento\Store\Model\Store',
+            ['getStoreId', '__wakeup'],
+            [],
+            '',
+            false
+        );
+
+        $this->storeId = 999999999999;
+        $this->storeMock->expects($this->any())
+            ->method('getStoreId')
+            ->will($this->returnValue($this->storeId));
+
+        $this->identity = new ShipmentCommentIdentity($this->scopeConfigInterfaceMock, $this->storeManagerMock);
+    }
+
+    public function testIsEnabledTrue()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('isSetFlag')
+            ->with(
+                $this->equalTo(ShipmentCommentIdentity::XML_PATH_EMAIL_ENABLED),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue(true));
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->isEnabled();
+        $this->assertTrue($result);
+    }
+
+    public function testGetEmailCopyTo()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(ShipmentCommentIdentity::XML_PATH_EMAIL_COPY_TO),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('test_value,test_value2'));
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getEmailCopyTo();
+        $this->assertEquals(['test_value', 'test_value2'], $result);
+    }
+
+    public function testGetEmailCopyToEmptyResult()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(ShipmentCommentIdentity::XML_PATH_EMAIL_COPY_TO),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue(null));
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getEmailCopyTo();
+        $this->assertFalse($result);
+    }
+
+    public function testCopyMethod()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(ShipmentCommentIdentity::XML_PATH_EMAIL_COPY_METHOD),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('copy_method'));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getCopyMethod();
+        $this->assertEquals('copy_method', $result);
+    }
+
+    public function testGuestTemplateId()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(ShipmentCommentIdentity::XML_PATH_EMAIL_GUEST_TEMPLATE),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('template_id'));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getGuestTemplateId();
+        $this->assertEquals('template_id', $result);
+    }
+
+    public function testTemplateId()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(ShipmentCommentIdentity::XML_PATH_EMAIL_TEMPLATE),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('template_id'));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getTemplateId();
+        $this->assertEquals('template_id', $result);
+    }
+
+    public function testSetStore()
+    {
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getStore();
+        $this->assertEquals($this->storeMock, $result);
+    }
+
+    public function testGetStoreFromStoreManager()
+    {
+        $this->storeManagerMock->expects($this->once())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+        $result = $this->identity->getStore();
+        $this->assertEquals($this->storeMock, $result);
+    }
+
+    public function testSetCustomerEmail()
+    {
+        $this->identity->setCustomerEmail('email');
+        $result = $this->identity->getCustomerEmail();
+        $this->assertEquals('email', $result);
+    }
+
+    public function testSetCusomerName()
+    {
+        $this->identity->setCustomerName('name');
+        $result = $this->identity->getCustomerName();
+        $this->assertEquals('name', $result);
+    }
+
+    public function testGetEmailIdentity()
+    {
+        $emailIdentity = 'test@example.com';
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(ShipmentCommentIdentity::XML_PATH_EMAIL_IDENTITY),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue($emailIdentity));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getEmailIdentity();
+        $this->assertEquals($emailIdentity, $result);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/ShipmentIdentityTest.php b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/ShipmentIdentityTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..e4258a8a5447c4b60a76992f5321b120ea194e85
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/ShipmentIdentityTest.php
@@ -0,0 +1,222 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Email\Container;
+
+class ShipmentIdentityTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Sales\Model\Order\Email\Container\ShipmentIdentity
+     */
+    protected $identity;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeManagerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $scopeConfigInterfaceMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeMock;
+
+    protected $storeId;
+
+    protected function setUp()
+    {
+        $this->scopeConfigInterfaceMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\Container\Stub\ScopeConfigInterfaceMock',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->storeManagerMock = $this->getMock(
+            '\Magento\Store\Model\Storage\DefaultStorage',
+            [],
+            [],
+            '',
+            false
+        );
+
+        $this->storeMock = $this->getMock(
+            '\Magento\Store\Model\Store',
+            ['getStoreId', '__wakeup'],
+            [],
+            '',
+            false
+        );
+
+        $this->storeId = 999999999999;
+        $this->storeMock->expects($this->any())
+            ->method('getStoreId')
+            ->will($this->returnValue($this->storeId));
+
+        $this->identity = new ShipmentIdentity($this->scopeConfigInterfaceMock, $this->storeManagerMock);
+    }
+
+    public function testIsEnabledTrue()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('isSetFlag')
+            ->with(
+                $this->equalTo(ShipmentIdentity::XML_PATH_EMAIL_ENABLED),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue(true));
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->isEnabled();
+        $this->assertTrue($result);
+    }
+
+    public function testGetEmailCopyTo()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(ShipmentIdentity::XML_PATH_EMAIL_COPY_TO),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('test_value,test_value2'));
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getEmailCopyTo();
+        $this->assertEquals(['test_value', 'test_value2'], $result);
+    }
+
+    public function testGetEmailCopyToEmptyResult()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(ShipmentIdentity::XML_PATH_EMAIL_COPY_TO),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue(null));
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getEmailCopyTo();
+        $this->assertFalse($result);
+    }
+
+    public function testCopyMethod()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(ShipmentIdentity::XML_PATH_EMAIL_COPY_METHOD),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('copy_method'));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getCopyMethod();
+        $this->assertEquals('copy_method', $result);
+    }
+
+    public function testGuestTemplateId()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(ShipmentIdentity::XML_PATH_EMAIL_GUEST_TEMPLATE),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('template_id'));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getGuestTemplateId();
+        $this->assertEquals('template_id', $result);
+    }
+
+    public function testTemplateId()
+    {
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(ShipmentIdentity::XML_PATH_EMAIL_TEMPLATE),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue('template_id'));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getTemplateId();
+        $this->assertEquals('template_id', $result);
+    }
+
+    public function testSetStore()
+    {
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getStore();
+        $this->assertEquals($this->storeMock, $result);
+    }
+
+    public function testGetStoreFromStoreManager()
+    {
+        $this->storeManagerMock->expects($this->once())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+        $result = $this->identity->getStore();
+        $this->assertEquals($this->storeMock, $result);
+    }
+
+    public function testSetCustomerEmail()
+    {
+        $this->identity->setCustomerEmail('email');
+        $result = $this->identity->getCustomerEmail();
+        $this->assertEquals('email', $result);
+    }
+
+    public function testSetCusomerName()
+    {
+        $this->identity->setCustomerName('name');
+        $result = $this->identity->getCustomerName();
+        $this->assertEquals('name', $result);
+    }
+
+    public function testGetEmailIdentity()
+    {
+        $emailIdentity = 'test@example.com';
+        $this->scopeConfigInterfaceMock->expects($this->once())
+            ->method('getValue')
+            ->with(
+                $this->equalTo(ShipmentIdentity::XML_PATH_EMAIL_IDENTITY),
+                $this->equalTo(\Magento\Store\Model\ScopeInterface::SCOPE_STORE),
+                $this->equalTo($this->storeId)
+            )
+            ->will($this->returnValue($emailIdentity));
+
+        $this->identity->setStore($this->storeMock);
+        $result = $this->identity->getEmailIdentity();
+        $this->assertEquals($emailIdentity, $result);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/Stub/ScopeConfigInterfaceMock.php b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/Stub/ScopeConfigInterfaceMock.php
new file mode 100644
index 0000000000000000000000000000000000000000..cb1c05fb5e2889f441fb289a28a765d1d1da4fab
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/Stub/ScopeConfigInterfaceMock.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\Sales\Model\Order\Email\Container\Stub;
+
+use Magento\Framework\App\Config\ScopeConfigInterface;
+
+class ScopeConfigInterfaceMock implements ScopeConfigInterface
+{
+    public function getValue($path, $scope = \Magento\Framework\App\ScopeInterface::SCOPE_DEFAULT, $scopeCode = null)
+    {
+        return;
+    }
+
+    public function isSetFlag($path, $scope = \Magento\Framework\App\ScopeInterface::SCOPE_DEFAULT, $scopeCode = null)
+    {
+        return;
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/TemplateTest.php b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/TemplateTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..e3a2af5fa705a9b1110407b0710dd9ac730eeeb6
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Container/TemplateTest.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\Sales\Model\Order\Email\Container;
+
+class TemplateTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Sales\Model\Order\Email\Container\Template
+     */
+    protected $template;
+
+    protected function setUp()
+    {
+        $this->template = new Template();
+    }
+
+    public function testSetTemplateId()
+    {
+        $templateId = 'test_template_id';
+        $this->template->setTemplateId($templateId);
+        $result = $this->template->getTemplateId();
+        $this->assertEquals($templateId, $result);
+    }
+
+    public function testSetTemplateOptions()
+    {
+        $templateOptions = ['opt1', 'opt2'];
+        $this->template->setTemplateOptions($templateOptions);
+        $result = $this->template->getTemplateOptions();
+        $this->assertEquals($templateOptions, $result);
+    }
+
+    public function testSetTemplateVars()
+    {
+        $templateVars = ['opt1', 'opt2'];
+        $this->template->setTemplateVars($templateVars);
+        $result = $this->template->getTemplateVars();
+        $this->assertEquals($templateVars, $result);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Sender/CreditmemoCommentSenderTest.php b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Sender/CreditmemoCommentSenderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..2f92489627a3bbbbe47ebddc517bf034c0c14f3a
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Sender/CreditmemoCommentSenderTest.php
@@ -0,0 +1,238 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Email\Sender;
+
+class CreditmemoCommentSenderTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Sales\Model\Order\Email\Sender\InvoiceCommentSender
+     */
+    protected $sender;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $senderBuilderFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $templateContainerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $identityContainerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $creditmemoMock;
+
+    protected function setUp()
+    {
+        $this->senderBuilderFactoryMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\SenderBuilderFactory',
+            ['create'],
+            [],
+            '',
+            false
+        );
+        $this->templateContainerMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\Container\Template',
+            ['setTemplateVars'],
+            [],
+            '',
+            false
+        );
+
+        $this->storeMock = $this->getMock(
+            '\Magento\Store\Model\Store',
+            ['getStoreId', '__wakeup'],
+            [],
+            '',
+            false
+        );
+
+        $this->identityContainerMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\Container\CreditmemoCommentIdentity',
+            ['getStore', 'isEnabled', 'getConfigValue', 'getTemplateId', 'getGuestTemplateId'],
+            [],
+            '',
+            false
+        );
+        $this->identityContainerMock->expects($this->any())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+
+        $this->orderMock = $this->getMock(
+            '\Magento\Sales\Model\Order',
+            [
+                'getStore', 'getBillingAddress', 'getPayment',
+                '__wakeup', 'getCustomerIsGuest', 'getCustomerName',
+                'getCustomerEmail'
+            ],
+            [],
+            '',
+            false
+        );
+
+        $this->orderMock->expects($this->any())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+
+        $this->creditmemoMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Creditmemo',
+            ['getStore', '__wakeup', 'getOrder'],
+            [],
+            '',
+            false
+        );
+        $this->creditmemoMock->expects($this->any())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+        $this->creditmemoMock->expects($this->any())
+            ->method('getOrder')
+            ->will($this->returnValue($this->orderMock));
+
+        $this->sender = new CreditmemoCommentSender(
+            $this->templateContainerMock,
+            $this->identityContainerMock,
+            $this->senderBuilderFactoryMock
+        );
+    }
+
+    public function testSendFalse()
+    {
+        $result = $this->sender->send($this->creditmemoMock);
+        $this->assertFalse($result);
+    }
+
+    public function testSendTrueWithCustomerCopy()
+    {
+        $billingAddress = 'billing_address';
+        $comment = 'comment_test';
+
+        $this->orderMock->expects($this->once())
+            ->method('getCustomerIsGuest')
+            ->will($this->returnValue(false));
+        $this->orderMock->expects($this->any())
+            ->method('getBillingAddress')
+            ->will($this->returnValue($billingAddress));
+
+        $this->identityContainerMock->expects($this->once())
+            ->method('isEnabled')
+            ->will($this->returnValue(true));
+        $this->templateContainerMock->expects($this->once())
+            ->method('setTemplateVars')
+            ->with(
+                $this->equalTo(
+                    [
+                        'order' => $this->orderMock,
+                        'creditmemo' => $this->creditmemoMock,
+                        'comment' => $comment,
+                        'billing' => $billingAddress,
+                        'store' => $this->storeMock
+                    ]
+                )
+            );
+
+        $senderMock = $this->getMock(
+            'Magento\Sales\Model\Order\Email\Sender',
+            ['send', 'sendCopyTo'],
+            [],
+            '',
+            false
+        );
+        $senderMock->expects($this->once())
+            ->method('send');
+        $senderMock->expects($this->never())
+            ->method('sendCopyTo');
+
+        $this->senderBuilderFactoryMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($senderMock));
+
+        $result = $this->sender->send($this->creditmemoMock, true, $comment);
+        $this->assertTrue($result);
+    }
+
+    public function testSendTrueWithoutCustomerCopy()
+    {
+        $billingAddress = 'billing_address';
+        $comment = 'comment_test';
+
+        $this->orderMock->expects($this->once())
+            ->method('getCustomerIsGuest')
+            ->will($this->returnValue(false));
+        $this->orderMock->expects($this->any())
+            ->method('getBillingAddress')
+            ->will($this->returnValue($billingAddress));
+
+        $this->identityContainerMock->expects($this->once())
+            ->method('isEnabled')
+            ->will($this->returnValue(true));
+        $this->templateContainerMock->expects($this->once())
+            ->method('setTemplateVars')
+            ->with(
+                $this->equalTo(
+                    [
+                        'order' => $this->orderMock,
+                        'creditmemo' => $this->creditmemoMock,
+                        'billing' => $billingAddress,
+                        'comment' => $comment,
+                        'store' => $this->storeMock
+                    ]
+                )
+            );
+        $senderMock = $this->getMock(
+            'Magento\Sales\Model\Order\Email\Sender',
+            ['send', 'sendCopyTo'],
+            [],
+            '',
+            false
+        );
+        $senderMock->expects($this->never())
+            ->method('send');
+        $senderMock->expects($this->once())
+            ->method('sendCopyTo');
+
+        $this->senderBuilderFactoryMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($senderMock));
+
+        $result = $this->sender->send($this->creditmemoMock, false, $comment);
+        $this->assertTrue($result);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Sender/CreditmemoSenderTest.php b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Sender/CreditmemoSenderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b9c50ebcba9896d7f602880c78e8ba6ac6ace93b
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Sender/CreditmemoSenderTest.php
@@ -0,0 +1,283 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Email\Sender;
+
+class CreditmemoSenderTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Sales\Model\Order\Email\Sender\CreditmemoSender
+     */
+    protected $sender;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $senderBuilderFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $templateContainerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $identityContainerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $creditmemoMock;
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $paymentHelper;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $creditmemoResource;
+
+    protected function setUp()
+    {
+        $this->senderBuilderFactoryMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\SenderBuilderFactory',
+            ['create'],
+            [],
+            '',
+            false
+        );
+        $this->templateContainerMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\Container\Template',
+            ['setTemplateVars'],
+            [],
+            '',
+            false
+        );
+        $this->paymentHelper = $this->getMock('\Magento\Payment\Helper\Data', ['getInfoBlockHtml'], [], '', false);
+        $this->paymentHelper->expects($this->any())
+            ->method('getInfoBlockHtml')
+            ->will($this->returnValue('payment'));
+
+        $this->creditmemoResource = $this->getMock(
+            '\Magento\Sales\Model\Resource\Order\Creditmemo',
+            [],
+            [],
+            '',
+            false
+        );
+
+        $this->storeMock = $this->getMock(
+            '\Magento\Store\Model\Store',
+            ['getStoreId', '__wakeup'],
+            [],
+            '',
+            false
+        );
+
+        $this->identityContainerMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\Container\CreditmemoIdentity',
+            ['getStore', 'isEnabled', 'getConfigValue', 'getTemplateId', 'getGuestTemplateId'],
+            [],
+            '',
+            false
+        );
+        $this->identityContainerMock->expects($this->any())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+
+        $this->orderMock = $this->getMock(
+            '\Magento\Sales\Model\Order',
+            [
+                'getStore', 'getBillingAddress', 'getPayment',
+                '__wakeup', 'getCustomerIsGuest', 'getCustomerName',
+                'getCustomerEmail'
+            ],
+            [],
+            '',
+            false
+        );
+
+        $this->orderMock->expects($this->any())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+        $paymentInfoMock = $this->getMock(
+            '\Magento\Payment\Model\Info',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->orderMock->expects($this->once())
+            ->method('getPayment')
+            ->will($this->returnValue($paymentInfoMock));
+
+        $this->creditmemoMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Creditmemo',
+            ['getStore', '__wakeup', 'getOrder'],
+            [],
+            '',
+            false
+        );
+        $this->creditmemoMock->expects($this->any())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+        $this->creditmemoMock->expects($this->any())
+            ->method('getOrder')
+            ->will($this->returnValue($this->orderMock));
+
+        $this->sender = new CreditmemoSender(
+            $this->templateContainerMock,
+            $this->identityContainerMock,
+            $this->senderBuilderFactoryMock,
+            $this->paymentHelper,
+            $this->creditmemoResource
+        );
+    }
+
+    public function testSendFalse()
+    {
+        $result = $this->sender->send($this->creditmemoMock);
+        $this->assertFalse($result);
+    }
+
+    public function testSendTrueWithCustomerCopy()
+    {
+        $billingAddress = 'billing_address';
+        $comment = 'comment_test';
+
+        $this->orderMock->expects($this->once())
+            ->method('getCustomerIsGuest')
+            ->will($this->returnValue(false));
+        $this->orderMock->expects($this->any())
+            ->method('getBillingAddress')
+            ->will($this->returnValue($billingAddress));
+
+        $this->identityContainerMock->expects($this->once())
+            ->method('isEnabled')
+            ->will($this->returnValue(true));
+        $this->templateContainerMock->expects($this->once())
+            ->method('setTemplateVars')
+            ->with(
+                $this->equalTo(
+                    [
+                        'order' => $this->orderMock,
+                        'invoice' => $this->creditmemoMock,
+                        'comment' => $comment,
+                        'billing' => $billingAddress,
+                        'payment_html' => 'payment',
+                        'store' => $this->storeMock
+                    ]
+                )
+            );
+        $paymentInfoMock = $this->getMock(
+            '\Magento\Payment\Model\Info',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->orderMock->expects($this->once())
+            ->method('getPayment')
+            ->will($this->returnValue($paymentInfoMock));
+
+        $senderMock = $this->getMock(
+            'Magento\Sales\Model\Order\Email\Sender',
+            ['send', 'sendCopyTo'],
+            [],
+            '',
+            false
+        );
+        $senderMock->expects($this->once())
+            ->method('send');
+        $senderMock->expects($this->never())
+            ->method('sendCopyTo');
+
+        $this->senderBuilderFactoryMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($senderMock));
+
+        $result = $this->sender->send($this->creditmemoMock, true, $comment);
+        $this->assertTrue($result);
+    }
+
+    public function testSendTrueWithoutCustomerCopy()
+    {
+        $billingAddress = 'billing_address';
+        $comment = 'comment_test';
+
+        $this->orderMock->expects($this->once())
+            ->method('getCustomerIsGuest')
+            ->will($this->returnValue(false));
+        $this->orderMock->expects($this->any())
+            ->method('getBillingAddress')
+            ->will($this->returnValue($billingAddress));
+
+        $this->identityContainerMock->expects($this->once())
+            ->method('isEnabled')
+            ->will($this->returnValue(true));
+        $this->templateContainerMock->expects($this->once())
+            ->method('setTemplateVars')
+            ->with(
+                $this->equalTo(
+                    [
+                        'order' => $this->orderMock,
+                        'invoice' => $this->creditmemoMock,
+                        'billing' => $billingAddress,
+                        'payment_html' => 'payment',
+                        'comment' => $comment,
+                        'store' => $this->storeMock
+                    ]
+                )
+            );
+        $senderMock = $this->getMock(
+            'Magento\Sales\Model\Order\Email\Sender',
+            ['send', 'sendCopyTo'],
+            [],
+            '',
+            false
+        );
+        $senderMock->expects($this->never())
+            ->method('send');
+        $senderMock->expects($this->once())
+            ->method('sendCopyTo');
+
+        $this->senderBuilderFactoryMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($senderMock));
+
+        $result = $this->sender->send($this->creditmemoMock, false, $comment);
+        $this->assertTrue($result);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Sender/InvoiceCommentSenderTest.php b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Sender/InvoiceCommentSenderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..6ba32da12f8821d50c8c3c50dab767e3e2934d6d
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Sender/InvoiceCommentSenderTest.php
@@ -0,0 +1,254 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Email\Sender;
+
+class InvoiceCommentSenderTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Sales\Model\Order\Email\Sender\InvoiceCommentSender
+     */
+    protected $sender;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $senderBuilderFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $templateContainerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $identityContainerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $invoiceMock;
+
+    protected function setUp()
+    {
+        $this->senderBuilderFactoryMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\SenderBuilderFactory',
+            ['create'],
+            [],
+            '',
+            false
+        );
+        $this->templateContainerMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\Container\Template',
+            ['setTemplateVars'],
+            [],
+            '',
+            false
+        );
+        $this->paymentHelper = $this->getMock(
+            '\Magento\Payment\Helper\Data',
+            ['getInfoBlockHtml'],
+            [],
+            '',
+            false
+        );
+
+        $this->invoiceResource = $this->getMock(
+            '\Magento\Sales\Model\Resource\Order\Invoice',
+            [],
+            [],
+            '',
+            false
+        );
+
+        $this->storeMock = $this->getMock(
+            '\Magento\Store\Model\Store',
+            ['getStoreId', '__wakeup'],
+            [],
+            '',
+            false
+        );
+
+        $this->identityContainerMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\Container\InvoiceCommentIdentity',
+            ['getStore', 'isEnabled', 'getConfigValue', 'getTemplateId', 'getGuestTemplateId'],
+            [],
+            '',
+            false
+        );
+        $this->identityContainerMock->expects($this->any())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+
+        $this->orderMock = $this->getMock(
+            '\Magento\Sales\Model\Order',
+            [
+                'getStore', 'getBillingAddress', 'getPayment',
+                '__wakeup', 'getCustomerIsGuest', 'getCustomerName',
+                'getCustomerEmail'
+            ],
+            [],
+            '',
+            false
+        );
+
+        $this->orderMock->expects($this->any())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+
+        $this->invoiceMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Invoice',
+            ['getStore', '__wakeup', 'getOrder'],
+            [],
+            '',
+            false
+        );
+        $this->invoiceMock->expects($this->any())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+        $this->invoiceMock->expects($this->any())
+            ->method('getOrder')
+            ->will($this->returnValue($this->orderMock));
+
+
+        $this->sender = new InvoiceCommentSender(
+            $this->templateContainerMock,
+            $this->identityContainerMock,
+            $this->senderBuilderFactoryMock
+        );
+    }
+
+    public function testSendFalse()
+    {
+        $result = $this->sender->send($this->invoiceMock);
+        $this->assertFalse($result);
+    }
+
+    public function testSendTrueWithCustomerCopy()
+    {
+        $billingAddress = 'billing_address';
+        $comment = 'comment_test';
+
+        $this->orderMock->expects($this->once())
+            ->method('getCustomerIsGuest')
+            ->will($this->returnValue(false));
+        $this->orderMock->expects($this->any())
+            ->method('getBillingAddress')
+            ->will($this->returnValue($billingAddress));
+
+        $this->identityContainerMock->expects($this->once())
+            ->method('isEnabled')
+            ->will($this->returnValue(true));
+        $this->templateContainerMock->expects($this->once())
+            ->method('setTemplateVars')
+            ->with(
+                $this->equalTo(
+                    [
+                        'order' => $this->orderMock,
+                        'invoice' => $this->invoiceMock,
+                        'comment' => $comment,
+                        'billing' => $billingAddress,
+                        'store' => $this->storeMock
+                    ]
+                )
+            );
+
+        $senderMock = $this->getMock(
+            'Magento\Sales\Model\Order\Email\Sender',
+            ['send', 'sendCopyTo'],
+            [],
+            '',
+            false
+        );
+        $senderMock->expects($this->once())
+            ->method('send');
+        $senderMock->expects($this->never())
+            ->method('sendCopyTo');
+
+        $this->senderBuilderFactoryMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($senderMock));
+
+        $result = $this->sender->send($this->invoiceMock, true, $comment);
+        $this->assertTrue($result);
+    }
+
+    public function testSendTrueWithoutCustomerCopy()
+    {
+        $billingAddress = 'billing_address';
+        $comment = 'comment_test';
+
+        $this->orderMock->expects($this->once())
+            ->method('getCustomerIsGuest')
+            ->will($this->returnValue(false));
+        $this->orderMock->expects($this->any())
+            ->method('getBillingAddress')
+            ->will($this->returnValue($billingAddress));
+
+        $this->identityContainerMock->expects($this->once())
+            ->method('isEnabled')
+            ->will($this->returnValue(true));
+        $this->templateContainerMock->expects($this->once())
+            ->method('setTemplateVars')
+            ->with(
+                $this->equalTo(
+                    [
+                        'order' => $this->orderMock,
+                        'invoice' => $this->invoiceMock,
+                        'billing' => $billingAddress,
+                        'comment' => $comment,
+                        'store' => $this->storeMock
+                    ]
+                )
+            );
+        $senderMock = $this->getMock(
+            'Magento\Sales\Model\Order\Email\Sender',
+            ['send', 'sendCopyTo'],
+            [],
+            '',
+            false
+        );
+        $senderMock->expects($this->never())
+            ->method('send');
+        $senderMock->expects($this->once())
+            ->method('sendCopyTo');
+
+        $this->senderBuilderFactoryMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($senderMock));
+
+        $result = $this->sender->send($this->invoiceMock, false, $comment);
+        $this->assertTrue($result);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Sender/InvoiceSenderTest.php b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Sender/InvoiceSenderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..f310de15e61f7ea62d31b3505dee0121dc5e4f13
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Sender/InvoiceSenderTest.php
@@ -0,0 +1,284 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Email\Sender;
+
+class InvoiceSenderTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Sales\Model\Order\Email\Sender\InvoiceSender
+     */
+    protected $sender;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $senderBuilderFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $templateContainerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $identityContainerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $invoiceMock;
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $paymentHelper;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $invoiceResource;
+
+    protected function setUp()
+    {
+        $this->senderBuilderFactoryMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\SenderBuilderFactory',
+            ['create'],
+            [],
+            '',
+            false
+        );
+        $this->templateContainerMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\Container\Template',
+            ['setTemplateVars'],
+            [],
+            '',
+            false
+        );
+        $this->paymentHelper = $this->getMock('\Magento\Payment\Helper\Data', ['getInfoBlockHtml'], [], '', false);
+        $this->paymentHelper->expects($this->any())
+            ->method('getInfoBlockHtml')
+            ->will($this->returnValue('payment'));
+
+        $this->invoiceResource = $this->getMock(
+            '\Magento\Sales\Model\Resource\Order\Invoice',
+            [],
+            [],
+            '',
+            false
+        );
+
+        $this->storeMock = $this->getMock(
+            '\Magento\Store\Model\Store',
+            ['getStoreId', '__wakeup'],
+            [],
+            '',
+            false
+        );
+
+        $this->identityContainerMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\Container\InvoiceIdentity',
+            ['getStore', 'isEnabled', 'getConfigValue', 'getTemplateId', 'getGuestTemplateId'],
+            [],
+            '',
+            false
+        );
+        $this->identityContainerMock->expects($this->any())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+
+        $this->orderMock = $this->getMock(
+            '\Magento\Sales\Model\Order',
+            [
+                'getStore', 'getBillingAddress', 'getPayment',
+                '__wakeup', 'getCustomerIsGuest', 'getCustomerName',
+                'getCustomerEmail'
+            ],
+            [],
+            '',
+            false
+        );
+
+        $this->orderMock->expects($this->any())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+        $paymentInfoMock = $this->getMock(
+            '\Magento\Payment\Model\Info',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->orderMock->expects($this->once())
+            ->method('getPayment')
+            ->will($this->returnValue($paymentInfoMock));
+
+        $this->invoiceMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Invoice',
+            ['getStore', '__wakeup', 'getOrder'],
+            [],
+            '',
+            false
+        );
+        $this->invoiceMock->expects($this->any())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+        $this->invoiceMock->expects($this->any())
+            ->method('getOrder')
+            ->will($this->returnValue($this->orderMock));
+
+        $this->sender = new InvoiceSender(
+            $this->templateContainerMock,
+            $this->identityContainerMock,
+            $this->senderBuilderFactoryMock,
+            $this->paymentHelper,
+            $this->invoiceResource
+        );
+    }
+
+    public function testSendFalse()
+    {
+        $result = $this->sender->send($this->invoiceMock);
+        $this->assertFalse($result);
+    }
+
+    public function testSendTrueWithCustomerCopy()
+    {
+        $billingAddress = 'billing_address';
+        $comment = 'comment_test';
+
+        $this->orderMock->expects($this->once())
+            ->method('getCustomerIsGuest')
+            ->will($this->returnValue(false));
+        $this->orderMock->expects($this->any())
+            ->method('getBillingAddress')
+            ->will($this->returnValue($billingAddress));
+
+        $this->identityContainerMock->expects($this->once())
+            ->method('isEnabled')
+            ->will($this->returnValue(true));
+        $this->templateContainerMock->expects($this->once())
+            ->method('setTemplateVars')
+            ->with(
+                $this->equalTo(
+                    [
+                        'order' => $this->orderMock,
+                        'invoice' => $this->invoiceMock,
+                        'comment' => $comment,
+                        'billing' => $billingAddress,
+                        'payment_html' => 'payment',
+                        'store' => $this->storeMock
+                    ]
+                )
+            );
+        $paymentInfoMock = $this->getMock(
+            '\Magento\Payment\Model\Info',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->orderMock->expects($this->once())
+            ->method('getPayment')
+            ->will($this->returnValue($paymentInfoMock));
+
+
+        $senderMock = $this->getMock(
+            'Magento\Sales\Model\Order\Email\Sender',
+            ['send', 'sendCopyTo'],
+            [],
+            '',
+            false
+        );
+        $senderMock->expects($this->once())
+            ->method('send');
+        $senderMock->expects($this->never())
+            ->method('sendCopyTo');
+
+        $this->senderBuilderFactoryMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($senderMock));
+
+        $result = $this->sender->send($this->invoiceMock, true, $comment);
+        $this->assertTrue($result);
+    }
+
+    public function testSendTrueWithoutCustomerCopy()
+    {
+        $billingAddress = 'billing_address';
+        $comment = 'comment_test';
+
+        $this->orderMock->expects($this->once())
+            ->method('getCustomerIsGuest')
+            ->will($this->returnValue(false));
+        $this->orderMock->expects($this->any())
+            ->method('getBillingAddress')
+            ->will($this->returnValue($billingAddress));
+
+        $this->identityContainerMock->expects($this->once())
+            ->method('isEnabled')
+            ->will($this->returnValue(true));
+        $this->templateContainerMock->expects($this->once())
+            ->method('setTemplateVars')
+            ->with(
+                $this->equalTo(
+                    [
+                        'order' => $this->orderMock,
+                        'invoice' => $this->invoiceMock,
+                        'billing' => $billingAddress,
+                        'payment_html' => 'payment',
+                        'comment' => $comment,
+                        'store' => $this->storeMock
+                    ]
+                )
+            );
+        $senderMock = $this->getMock(
+            'Magento\Sales\Model\Order\Email\Sender',
+            ['send', 'sendCopyTo'],
+            [],
+            '',
+            false
+        );
+        $senderMock->expects($this->never())
+            ->method('send');
+        $senderMock->expects($this->once())
+            ->method('sendCopyTo');
+
+        $this->senderBuilderFactoryMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($senderMock));
+
+        $result = $this->sender->send($this->invoiceMock, false, $comment);
+        $this->assertTrue($result);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Sender/OrderCommentSenderTest.php b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Sender/OrderCommentSenderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..7c11c6aa1378d22c277fdce0be69a03836ac7b86
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Sender/OrderCommentSenderTest.php
@@ -0,0 +1,169 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Email\Sender;
+
+class OrderCommentSenderTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Sales\Model\Order\Email\Sender\OrderCommentSender
+     */
+    protected $sender;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $senderBuilderFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $templateContainerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $identityContainerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderMock;
+
+    protected function setUp()
+    {
+        $this->senderBuilderFactoryMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\SenderBuilderFactory',
+            ['create'],
+            [],
+            '',
+            false
+        );
+        $this->templateContainerMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\Container\Template',
+            ['setTemplateVars'],
+            [],
+            '',
+            false
+        );
+
+        $this->storeMock = $this->getMock(
+            '\Magento\Store\Model\Store',
+            ['getStoreId', '__wakeup'],
+            [],
+            '',
+            false
+        );
+
+        $this->identityContainerMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\Container\OrderCommentIdentity',
+            ['getStore', 'isEnabled', 'getConfigValue', 'getTemplateId', 'getGuestTemplateId'],
+            [],
+            '',
+            false
+        );
+        $this->identityContainerMock->expects($this->any())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+
+        $this->orderMock = $this->getMock(
+            '\Magento\Sales\Model\Order',
+            [
+                'getStore', 'getBillingAddress', 'getPayment',
+                '__wakeup', 'getCustomerIsGuest', 'getCustomerName',
+                'getCustomerEmail'
+            ],
+            [],
+            '',
+            false
+        );
+
+        $this->orderMock->expects($this->any())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+
+        $this->sender = new OrderCommentSender(
+            $this->templateContainerMock,
+            $this->identityContainerMock,
+            $this->senderBuilderFactoryMock
+        );
+    }
+
+    public function testSendFalse()
+    {
+        $result = $this->sender->send($this->orderMock);
+        $this->assertFalse($result);
+    }
+
+    public function testSendTrue()
+    {
+        $billingAddress = 'billing_address';
+        $comment = 'comment_test';
+
+        $this->orderMock->expects($this->once())
+            ->method('getCustomerIsGuest')
+            ->will($this->returnValue(false));
+        $this->orderMock->expects($this->any())
+            ->method('getBillingAddress')
+            ->will($this->returnValue($billingAddress));
+
+        $this->identityContainerMock->expects($this->once())
+            ->method('isEnabled')
+            ->will($this->returnValue(true));
+        $this->templateContainerMock->expects($this->once())
+            ->method('setTemplateVars')
+            ->with(
+                $this->equalTo(
+                    [
+                        'order' => $this->orderMock,
+                        'billing' => $billingAddress,
+                        'comment' => $comment,
+                        'store' => $this->storeMock
+                    ]
+                )
+            );
+        $senderMock = $this->getMock(
+            'Magento\Sales\Model\Order\Email\Sender',
+            ['send', 'sendCopyTo'],
+            [],
+            '',
+            false
+        );
+        $senderMock->expects($this->once())
+            ->method('send');
+        $senderMock->expects($this->never())
+            ->method('sendCopyTo');
+
+        $this->senderBuilderFactoryMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($senderMock));
+
+        $result = $this->sender->send($this->orderMock, true, $comment);
+        $this->assertTrue($result);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Sender/OrderSenderTest.php b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Sender/OrderSenderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..9b143ffdb9a5956c462b9d92734cc5948e71a2ba
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Sender/OrderSenderTest.php
@@ -0,0 +1,275 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Email\Sender;
+
+class OrderSenderTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Sales\Model\Order\Email\Sender\OrderSender
+     */
+    protected $sender;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $senderBuilderFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $templateContainerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $identityContainerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $paymentHelper;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderResource;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderMock;
+
+    protected function setUp()
+    {
+        $this->senderBuilderFactoryMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\SenderBuilderFactory',
+            ['create'],
+            [],
+            '',
+            false
+        );
+        $this->templateContainerMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\Container\Template',
+            ['setTemplateVars'],
+            [],
+            '',
+            false
+        );
+        $this->paymentHelper = $this->getMock(
+            '\Magento\Payment\Helper\Data',
+            ['getInfoBlockHtml'],
+            [],
+            '',
+            false
+        );
+        $this->paymentHelper->expects($this->any())
+            ->method('getInfoBlockHtml')
+            ->will($this->returnValue('payment'));
+
+        $this->orderResource = $this->getMock(
+            '\Magento\Sales\Model\Resource\Order',
+            [],
+            [],
+            '',
+            false
+        );
+
+        $this->storeMock = $this->getMock(
+            '\Magento\Store\Model\Store',
+            ['getStoreId', '__wakeup'],
+            [],
+            '',
+            false
+        );
+
+        $this->identityContainerMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\Container\OrderIdentity',
+            ['getStore', 'isEnabled', 'getConfigValue', 'getTemplateId', 'getGuestTemplateId'],
+            [],
+            '',
+            false
+        );
+        $this->identityContainerMock->expects($this->any())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+
+        $this->orderMock = $this->getMock(
+            '\Magento\Sales\Model\Order',
+            [
+                'getStore', 'getBillingAddress', 'getPayment',
+                '__wakeup', 'getCustomerIsGuest', 'getCustomerName',
+                'getCustomerEmail'
+            ],
+            [],
+            '',
+            false
+        );
+
+        $this->orderMock->expects($this->any())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+
+        $this->sender = new OrderSender(
+            $this->templateContainerMock,
+            $this->identityContainerMock,
+            $this->senderBuilderFactoryMock,
+            $this->paymentHelper,
+            $this->orderResource
+        );
+    }
+
+    public function testSendFalse()
+    {
+        $result = $this->sender->send($this->orderMock);
+        $this->assertFalse($result);
+    }
+
+    public function testSendTrueForCustomer()
+    {
+        $billingAddress = 'billing_address';
+
+        $this->orderMock->expects($this->once())
+            ->method('getCustomerIsGuest')
+            ->will($this->returnValue(false));
+        $this->orderMock->expects($this->any())
+            ->method('getBillingAddress')
+            ->will($this->returnValue($billingAddress));
+
+        $paymentInfoMock = $this->getMock(
+            '\Magento\Payment\Model\Info',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->orderMock->expects($this->once())
+            ->method('getPayment')
+            ->will($this->returnValue($paymentInfoMock));
+
+        $this->identityContainerMock->expects($this->once())
+            ->method('isEnabled')
+            ->will($this->returnValue(true));
+        $this->templateContainerMock->expects($this->once())
+            ->method('setTemplateVars')
+            ->with(
+                $this->equalTo(
+                    [
+                        'order' => $this->orderMock,
+                        'billing' => $billingAddress,
+                        'payment_html' => 'payment',
+                        'store' => $this->storeMock
+                    ]
+                )
+            );
+        $senderMock = $this->getMock(
+            'Magento\Sales\Model\Order\Email\Sender',
+            ['send', 'sendCopyTo'],
+            [],
+            '',
+            false
+        );
+        $senderMock->expects($this->once())
+            ->method('send');
+        $senderMock->expects($this->once())
+            ->method('sendCopyTo');
+
+        $this->senderBuilderFactoryMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($senderMock));
+
+        $result = $this->sender->send($this->orderMock);
+        $this->assertTrue($result);
+    }
+
+    public function testSendTrueForGuest()
+    {
+        $billingAddress = $this->getMock(
+            '\Magento\Sales\Model\Order\Address',
+            [],
+            [],
+            '',
+            false
+        );
+
+        $billingAddress->expects($this->any())
+            ->method('getName')
+            ->will($this->returnValue('name'));
+        $this->orderMock->expects($this->once())
+            ->method('getCustomerIsGuest')
+            ->will($this->returnValue(true));
+        $this->orderMock->expects($this->any())
+            ->method('getBillingAddress')
+            ->will($this->returnValue($billingAddress));
+
+        $paymentInfoMock = $this->getMock(
+            '\Magento\Payment\Model\Info',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->orderMock->expects($this->once())
+            ->method('getPayment')
+            ->will($this->returnValue($paymentInfoMock));
+
+        $this->identityContainerMock->expects($this->once())
+            ->method('isEnabled')
+            ->will($this->returnValue(true));
+        $this->templateContainerMock->expects($this->once())
+            ->method('setTemplateVars')
+            ->with(
+                $this->equalTo(
+                    [
+                        'order' => $this->orderMock,
+                        'billing' => $billingAddress,
+                        'payment_html' => 'payment',
+                        'store' => $this->storeMock
+                    ]
+                )
+            );
+        $senderMock = $this->getMock(
+            'Magento\Sales\Model\Order\Email\Sender',
+            ['send', 'sendCopyTo'],
+            [],
+            '',
+            false
+        );
+        $senderMock->expects($this->once())
+            ->method('send');
+        $senderMock->expects($this->once())
+            ->method('sendCopyTo');
+
+        $this->senderBuilderFactoryMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($senderMock));
+
+        $result = $this->sender->send($this->orderMock);
+        $this->assertTrue($result);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Sender/ShipmentCommentSenderTest.php b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Sender/ShipmentCommentSenderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..af8a158e544c5a9c36b3406f444a7c6bc7029236
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Sender/ShipmentCommentSenderTest.php
@@ -0,0 +1,237 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Email\Sender;
+
+class ShipmentCommentSenderTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Sales\Model\Order\Email\Sender\ShipmentCommentSender
+     */
+    protected $sender;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $senderBuilderFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $templateContainerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $identityContainerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $shipmentMock;
+
+    protected function setUp()
+    {
+        $this->senderBuilderFactoryMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\SenderBuilderFactory',
+            ['create'],
+            [],
+            '',
+            false
+        );
+        $this->templateContainerMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\Container\Template',
+            ['setTemplateVars'],
+            [],
+            '',
+            false
+        );
+
+        $this->storeMock = $this->getMock(
+            '\Magento\Store\Model\Store',
+            ['getStoreId', '__wakeup'],
+            [],
+            '',
+            false
+        );
+
+        $this->identityContainerMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\Container\ShipmentCommentIdentity',
+            ['getStore', 'isEnabled', 'getConfigValue', 'getTemplateId', 'getGuestTemplateId'],
+            [],
+            '',
+            false
+        );
+        $this->identityContainerMock->expects($this->any())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+
+        $this->orderMock = $this->getMock(
+            '\Magento\Sales\Model\Order',
+            [
+                'getStore', 'getBillingAddress', 'getPayment',
+                '__wakeup', 'getCustomerIsGuest', 'getCustomerName',
+                'getCustomerEmail'
+            ],
+            [],
+            '',
+            false
+        );
+
+        $this->orderMock->expects($this->any())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+
+        $this->shipmentMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Shipment',
+            ['getStore', '__wakeup', 'getOrder'],
+            [],
+            '',
+            false
+        );
+        $this->shipmentMock->expects($this->any())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+        $this->shipmentMock->expects($this->any())
+            ->method('getOrder')
+            ->will($this->returnValue($this->orderMock));
+
+        $this->sender = new ShipmentCommentSender(
+            $this->templateContainerMock,
+            $this->identityContainerMock,
+            $this->senderBuilderFactoryMock
+        );
+    }
+
+    public function testSendFalse()
+    {
+        $result = $this->sender->send($this->shipmentMock);
+        $this->assertFalse($result);
+    }
+
+    public function testSendTrueWithCustomerCopy()
+    {
+        $billingAddress = 'billing_address';
+        $comment = 'comment_test';
+
+        $this->orderMock->expects($this->once())
+            ->method('getCustomerIsGuest')
+            ->will($this->returnValue(false));
+        $this->orderMock->expects($this->any())
+            ->method('getBillingAddress')
+            ->will($this->returnValue($billingAddress));
+
+        $this->identityContainerMock->expects($this->once())
+            ->method('isEnabled')
+            ->will($this->returnValue(true));
+        $this->templateContainerMock->expects($this->once())
+            ->method('setTemplateVars')
+            ->with(
+                $this->equalTo(
+                    [
+                        'order' => $this->orderMock,
+                        'shipment' => $this->shipmentMock,
+                        'billing' => $billingAddress,
+                        'comment' => $comment,
+                        'store' => $this->storeMock
+                    ]
+                )
+            );
+        $senderMock = $this->getMock(
+            'Magento\Sales\Model\Order\Email\Sender',
+            ['send', 'sendCopyTo'],
+            [],
+            '',
+            false
+        );
+        $senderMock->expects($this->once())
+            ->method('send');
+        $senderMock->expects($this->never())
+            ->method('sendCopyTo');
+
+        $this->senderBuilderFactoryMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($senderMock));
+
+        $result = $this->sender->send($this->shipmentMock, true, $comment);
+        $this->assertTrue($result);
+    }
+
+    public function testSendTrueWithoutCustomerCopy()
+    {
+        $billingAddress = 'billing_address';
+        $comment = 'comment_test';
+
+        $this->orderMock->expects($this->once())
+            ->method('getCustomerIsGuest')
+            ->will($this->returnValue(false));
+        $this->orderMock->expects($this->any())
+            ->method('getBillingAddress')
+            ->will($this->returnValue($billingAddress));
+
+        $this->identityContainerMock->expects($this->once())
+            ->method('isEnabled')
+            ->will($this->returnValue(true));
+        $this->templateContainerMock->expects($this->once())
+            ->method('setTemplateVars')
+            ->with(
+                $this->equalTo(
+                    [
+                        'order' => $this->orderMock,
+                        'shipment' => $this->shipmentMock,
+                        'billing' => $billingAddress,
+                        'comment' => $comment,
+                        'store' => $this->storeMock
+                    ]
+                )
+            );
+        $senderMock = $this->getMock(
+            'Magento\Sales\Model\Order\Email\Sender',
+            ['send', 'sendCopyTo'],
+            [],
+            '',
+            false
+        );
+        $senderMock->expects($this->never())
+            ->method('send');
+        $senderMock->expects($this->once())
+            ->method('sendCopyTo');
+
+        $this->senderBuilderFactoryMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($senderMock));
+
+        $result = $this->sender->send($this->shipmentMock, false, $comment);
+        $this->assertTrue($result);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Sender/ShipmentSenderTest.php b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Sender/ShipmentSenderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..26f0f663e595ed8ea90b7389e19755256734c72b
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Sender/ShipmentSenderTest.php
@@ -0,0 +1,284 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Email\Sender;
+
+class ShipmentSenderTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Sales\Model\Order\Email\Sender\ShipmentSender
+     */
+    protected $sender;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $senderBuilderFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $templateContainerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $identityContainerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $storeMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $shipmentMock;
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $paymentHelper;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $shipmentResource;
+
+    protected function setUp()
+    {
+        $this->senderBuilderFactoryMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\SenderBuilderFactory',
+            ['create'],
+            [],
+            '',
+            false
+        );
+        $this->templateContainerMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\Container\Template',
+            ['setTemplateVars'],
+            [],
+            '',
+            false
+        );
+        $this->paymentHelper = $this->getMock('\Magento\Payment\Helper\Data', ['getInfoBlockHtml'], [], '', false);
+        $this->paymentHelper->expects($this->any())
+            ->method('getInfoBlockHtml')
+            ->will($this->returnValue('payment'));
+
+        $this->shipmentResource = $this->getMock(
+            '\Magento\Sales\Model\Resource\Order\Shipment',
+            [],
+            [],
+            '',
+            false
+        );
+
+        $this->storeMock = $this->getMock(
+            '\Magento\Store\Model\Store',
+            ['getStoreId', '__wakeup'],
+            [],
+            '',
+            false
+        );
+
+        $this->identityContainerMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\Container\ShipmentIdentity',
+            ['getStore', 'isEnabled', 'getConfigValue', 'getTemplateId', 'getGuestTemplateId'],
+            [],
+            '',
+            false
+        );
+        $this->identityContainerMock->expects($this->any())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+
+        $this->orderMock = $this->getMock(
+            '\Magento\Sales\Model\Order',
+            [
+                'getStore', 'getBillingAddress', 'getPayment',
+                '__wakeup', 'getCustomerIsGuest', 'getCustomerName',
+                'getCustomerEmail'
+            ],
+            [],
+            '',
+            false
+        );
+
+        $this->orderMock->expects($this->any())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+        $paymentInfoMock = $this->getMock(
+            '\Magento\Payment\Model\Info',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->orderMock->expects($this->once())
+            ->method('getPayment')
+            ->will($this->returnValue($paymentInfoMock));
+
+        $this->shipmentMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Shipment',
+            ['getStore', '__wakeup', 'getOrder'],
+            [],
+            '',
+            false
+        );
+        $this->shipmentMock->expects($this->any())
+            ->method('getStore')
+            ->will($this->returnValue($this->storeMock));
+        $this->shipmentMock->expects($this->any())
+            ->method('getOrder')
+            ->will($this->returnValue($this->orderMock));
+
+        $this->sender = new ShipmentSender(
+            $this->templateContainerMock,
+            $this->identityContainerMock,
+            $this->senderBuilderFactoryMock,
+            $this->paymentHelper,
+            $this->shipmentResource
+        );
+    }
+
+    public function testSendFalse()
+    {
+        $result = $this->sender->send($this->shipmentMock);
+        $this->assertFalse($result);
+    }
+
+    public function testSendTrueWithCustomerCopy()
+    {
+        $billingAddress = 'billing_address';
+        $comment = 'comment_test';
+
+        $this->orderMock->expects($this->once())
+            ->method('getCustomerIsGuest')
+            ->will($this->returnValue(false));
+        $this->orderMock->expects($this->any())
+            ->method('getBillingAddress')
+            ->will($this->returnValue($billingAddress));
+
+        $this->identityContainerMock->expects($this->once())
+            ->method('isEnabled')
+            ->will($this->returnValue(true));
+        $this->templateContainerMock->expects($this->once())
+            ->method('setTemplateVars')
+            ->with(
+                $this->equalTo(
+                    [
+                        'order' => $this->orderMock,
+                        'shipment' => $this->shipmentMock,
+                        'comment' => $comment,
+                        'billing' => $billingAddress,
+                        'payment_html' => 'payment',
+                        'store' => $this->storeMock
+                    ]
+                )
+            );
+        $paymentInfoMock = $this->getMock(
+            '\Magento\Payment\Model\Info',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->orderMock->expects($this->once())
+            ->method('getPayment')
+            ->will($this->returnValue($paymentInfoMock));
+
+
+        $senderMock = $this->getMock(
+            'Magento\Sales\Model\Order\Email\Sender',
+            ['send', 'sendCopyTo'],
+            [],
+            '',
+            false
+        );
+        $senderMock->expects($this->once())
+            ->method('send');
+        $senderMock->expects($this->never())
+            ->method('sendCopyTo');
+
+        $this->senderBuilderFactoryMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($senderMock));
+
+        $result = $this->sender->send($this->shipmentMock, true, $comment);
+        $this->assertTrue($result);
+    }
+
+    public function testSendTrueWithoutCustomerCopy()
+    {
+        $billingAddress = 'billing_address';
+        $comment = 'comment_test';
+
+        $this->orderMock->expects($this->once())
+            ->method('getCustomerIsGuest')
+            ->will($this->returnValue(false));
+        $this->orderMock->expects($this->any())
+            ->method('getBillingAddress')
+            ->will($this->returnValue($billingAddress));
+
+        $this->identityContainerMock->expects($this->once())
+            ->method('isEnabled')
+            ->will($this->returnValue(true));
+        $this->templateContainerMock->expects($this->once())
+            ->method('setTemplateVars')
+            ->with(
+                $this->equalTo(
+                    [
+                        'order' => $this->orderMock,
+                        'shipment' => $this->shipmentMock,
+                        'billing' => $billingAddress,
+                        'payment_html' => 'payment',
+                        'comment' => $comment,
+                        'store' => $this->storeMock
+                    ]
+                )
+            );
+        $senderMock = $this->getMock(
+            'Magento\Sales\Model\Order\Email\Sender',
+            ['send', 'sendCopyTo'],
+            [],
+            '',
+            false
+        );
+        $senderMock->expects($this->never())
+            ->method('send');
+        $senderMock->expects($this->once())
+            ->method('sendCopyTo');
+
+        $this->senderBuilderFactoryMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($senderMock));
+
+        $result = $this->sender->send($this->shipmentMock, false, $comment);
+        $this->assertTrue($result);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/SenderBuilderTest.php b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/SenderBuilderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..71bd41c4738e9a2d8f98a8b4ce2539f55fa4bb49
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/SenderBuilderTest.php
@@ -0,0 +1,194 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Email;
+
+class SenderBuilderTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var SenderBuilder
+     */
+    protected $senderBuilder;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $templateContainerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $identityContainerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $transportBuilder;
+
+    protected function setUp()
+    {
+        $templateId = 'test_template_id';
+        $templateOptions = ['option1', 'option2'];
+        $templateVars = ['var1', 'var2'];
+        $emailIdentity = 'email_identity_test';
+        $emailCopyTo = ['example@mail.com'];
+
+        $this->templateContainerMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\Container\Template',
+            ['getTemplateVars', 'getTemplateOptions', 'getTemplateId'],
+            [],
+            '',
+            false
+        );
+
+        $this->storeMock = $this->getMock(
+            '\Magento\Store\Model\Store',
+            ['getStoreId', '__wakeup'],
+            [],
+            '',
+            false
+        );
+
+        $this->identityContainerMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\Container\ShipmentIdentity',
+            [
+                'getEmailIdentity', 'getCustomerEmail',
+                'getCustomerName', 'getTemplateOptions', 'getEmailCopyTo',
+                'getCopyMethod'
+            ],
+            [],
+            '',
+            false
+        );
+
+        $this->transportBuilder = $this->getMock(
+            '\Magento\Framework\Mail\Template\TransportBuilder',
+            [
+                'addTo', 'addBcc', 'getTransport',
+                'setTemplateIdentifier', 'setTemplateOptions', 'setTemplateVars',
+                'setFrom',
+            ],
+            [],
+            '',
+            false
+        );
+
+        $this->templateContainerMock->expects($this->once())
+            ->method('getTemplateId')
+            ->will($this->returnValue($templateId));
+        $this->transportBuilder->expects($this->once())
+            ->method('setTemplateIdentifier')
+            ->with($this->equalTo($templateId));
+        $this->templateContainerMock->expects($this->once())
+            ->method('getTemplateOptions')
+            ->will($this->returnValue($templateOptions));
+        $this->transportBuilder->expects($this->once())
+            ->method('setTemplateOptions')
+            ->with($this->equalTo($templateOptions));
+        $this->templateContainerMock->expects($this->once())
+            ->method('getTemplateVars')
+            ->will($this->returnValue($templateVars));
+        $this->transportBuilder->expects($this->once())
+            ->method('setTemplateVars')
+            ->with($this->equalTo($templateVars));
+
+        $this->identityContainerMock->expects($this->once())
+            ->method('getEmailIdentity')
+            ->will($this->returnValue($emailIdentity));
+        $this->transportBuilder->expects($this->once())
+            ->method('setFrom')
+            ->with($this->equalTo($emailIdentity));
+
+        $this->identityContainerMock->expects($this->once())
+            ->method('getEmailCopyTo')
+            ->will($this->returnValue($emailCopyTo));
+
+        $this->senderBuilder = new SenderBuilder(
+            $this->templateContainerMock,
+            $this->identityContainerMock,
+            $this->transportBuilder
+        );
+    }
+
+    public function testSend()
+    {
+        $customerName = 'test_name';
+        $customerEmail = 'test_email';
+        $transportMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\Stub\TransportInterfaceMock',
+            [],
+            [],
+            '',
+            false
+        );
+
+        $this->identityContainerMock->expects($this->once())
+            ->method('getEmailCopyTo')
+            ->will($this->returnValue(['example@mail.com']));
+        $this->identityContainerMock->expects($this->once())
+            ->method('getCopyMethod')
+            ->will($this->returnValue('bcc'));
+        $this->identityContainerMock->expects($this->once())
+            ->method('getCustomerEmail')
+            ->will($this->returnValue($customerEmail));
+        $this->identityContainerMock->expects($this->once())
+            ->method('getCustomerName')
+            ->will($this->returnValue($customerName));
+        $this->transportBuilder->expects($this->once())
+            ->method('addTo')
+            ->with($this->equalTo($customerEmail), $this->equalTo($customerName));
+
+        $this->transportBuilder->expects($this->once())
+            ->method('getTransport')
+            ->will($this->returnValue($transportMock));
+
+        $this->senderBuilder->send();
+    }
+
+    public function testSendCopyTo()
+    {
+        $transportMock = $this->getMock(
+            '\Magento\Sales\Model\Order\Email\Stub\TransportInterfaceMock',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->identityContainerMock->expects($this->once())
+            ->method('getCopyMethod')
+            ->will($this->returnValue('copy'));
+        $this->identityContainerMock->expects($this->never())
+            ->method('getCustomerEmail');
+        $this->identityContainerMock->expects($this->never())
+            ->method('getCustomerName');
+        $this->transportBuilder->expects($this->once())
+            ->method('addTo')
+            ->with($this->equalTo('example@mail.com'));
+
+        $this->transportBuilder->expects($this->once())
+            ->method('getTransport')
+            ->will($this->returnValue($transportMock));
+
+        $this->senderBuilder->sendCopyTo();
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Stub/TransportInterfaceMock.php b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Stub/TransportInterfaceMock.php
new file mode 100644
index 0000000000000000000000000000000000000000..e7ea8c616d9b9f64cb471d6229775ce2e8b95d35
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Email/Stub/TransportInterfaceMock.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\Sales\Model\Order\Email\Stub;
+
+use \Magento\Framework\Mail\TransportInterface;
+
+class TransportInterfaceMock implements TransportInterface
+{
+    /**
+     * Mock of send a mail using transport
+     *
+     * @return void
+     */
+    public function sendMessage()
+    {
+        return;
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Status/History/ValidatorTest.php b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Status/History/ValidatorTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..5d87a68cc913e7bf10a511e6dec168530ad9cd9e
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/Order/Status/History/ValidatorTest.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.
+ *
+ * @copyright   Copyright (c) 2014 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\Status\History;
+
+class ValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    public function testValidate()
+    {
+        $history = $this->getMock('Magento\Sales\Model\Order\Status\History', ['hasData'], [], '', false);
+        $history->expects($this->any())
+            ->method('hasData')
+            ->will($this->returnValue(true));
+        $validator = new Validator();
+        $this->assertEmpty($validator->validate($history));
+    }
+
+    public function testValidateNegative()
+    {
+        $history = $this->getMock('Magento\Sales\Model\Order\Status\History', ['hasData'], [], '', false);
+        $history->expects($this->any())
+            ->method('hasData')
+            ->with('parent_id')
+            ->will($this->returnValue(false));
+        $validator = new Validator();
+        $this->assertEquals(['Order Id is a required field'], $validator->validate($history));
+    }
+} 
\ No newline at end of file
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/Quote/Address/ValidatorTest.php b/dev/tests/unit/testsuite/Magento/Sales/Model/Quote/Address/ValidatorTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..a831dc5cb3428d54c3d5829653f300f18b288fe3
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/Quote/Address/ValidatorTest.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\Sales\Model\Quote\Address;
+
+class ValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Validator
+     */
+    protected $model;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $factoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $itemMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $countryMock;
+
+    protected function setUp()
+    {
+        $this->factoryMock = $this->getMock('\Magento\Directory\Model\CountryFactory', [], [], '', false);
+        $this->countryMock = $this->getMock('\Magento\Directory\Model\Country', [], [], '', false);
+        $this->itemMock = $this->getMock(
+            '\Magento\Sales\Model\Quote\Address',
+            ['getCountryId', 'getEmail'],
+            [],
+            '',
+            false
+        );
+        $this->factoryMock->expects($this->any())->method('create')->will($this->returnValue($this->countryMock));
+        $this->model = new Validator($this->factoryMock);
+    }
+
+    public function testValidateWithEmptyObject()
+    {
+        $this->itemMock->expects($this->once())->method('getEmail')->will($this->returnValue(null));
+        $this->itemMock->expects($this->once())->method('getCountryId')->will($this->returnValue(null));
+        $this->assertTrue($this->model->isValid($this->itemMock));
+        $this->assertEmpty($this->model->getMessages());
+    }
+
+    public function testValidateWithInvalidEmail()
+    {
+        $this->itemMock->expects($this->once())->method('getEmail')->will($this->returnValue('invalid_email'));
+        $this->itemMock->expects($this->once())->method('getCountryId')->will($this->returnValue(null));
+        $this->assertFalse($this->model->isValid($this->itemMock));
+        $messages = ['invalid_email_format' => 'Invalid email format'];
+        $this->assertEquals($messages, $this->model->getMessages());
+    }
+
+    public function testValidateWithInvalidCountryId()
+    {
+        $this->itemMock->expects($this->once())->method('getEmail')->will($this->returnValue(null));
+        $this->itemMock->expects($this->once())->method('getCountryId')->will($this->returnValue(100));
+
+        $this->countryMock->expects($this->once())->method('load')->with(100);
+        $this->countryMock->expects($this->once())->method('getId')->will($this->returnValue(null));
+
+        $this->assertFalse($this->model->isValid($this->itemMock));
+        $messages = ['invalid_country_code' => 'Invalid country code'];
+        $this->assertEquals($messages, $this->model->getMessages());
+    }
+
+    public function testValidateWithInvalidData()
+    {
+        $this->itemMock->expects($this->once())->method('getEmail')->will($this->returnValue('invalid_email'));
+        $this->itemMock->expects($this->once())->method('getCountryId')->will($this->returnValue(100));
+
+        $this->countryMock->expects($this->once())->method('load')->with(100);
+        $this->countryMock->expects($this->once())->method('getId')->will($this->returnValue(null));
+
+        $this->assertFalse($this->model->isValid($this->itemMock));
+        $messages = [
+            'invalid_email_format' => 'Invalid email format',
+            'invalid_country_code' => 'Invalid country code'
+        ];
+        $this->assertEquals($messages, $this->model->getMessages());
+    }
+
+    public function testValidateWithValidData()
+    {
+        $this->itemMock->expects($this->once())->method('getEmail')->will($this->returnValue('test@example.com'));
+        $this->itemMock->expects($this->once())->method('getCountryId')->will($this->returnValue(100));
+
+        $this->countryMock->expects($this->once())->method('load')->with(100);
+        $this->countryMock->expects($this->once())->method('getId')->will($this->returnValue(100));
+
+        $this->assertTrue($this->model->isValid($this->itemMock));
+        $this->assertEmpty($this->model->getMessages());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/Resource/Order/AddressTest.php b/dev/tests/unit/testsuite/Magento/Sales/Model/Resource/Order/AddressTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..400ece2cc9a62ddf90809f055078b3911d9769e9
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/Resource/Order/AddressTest.php
@@ -0,0 +1,137 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Resource\Order;
+
+/**
+ * Class AddressTest
+ */
+class AddressTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Sales\Model\Resource\Order\Address
+     */
+    protected $addressResource;
+
+    /**
+     * @var \Magento\Framework\App\Resource|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $appResourceMock;
+
+    /**
+     * @var \Magento\Sales\Model\Order\Address|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $addressMock;
+
+    /**
+     * @var \Magento\Framework\DB\Adapter\Pdo\Mysql|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $adapterMock;
+
+    /**
+     * @var \Magento\Sales\Model\Order\Address\Validator|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $validatorMock;
+    /**
+     *
+     */
+    public function setUp()
+    {
+        $this->addressMock = $this->getMock(
+            'Magento\Sales\Model\Order\Address',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->appResourceMock = $this->getMock(
+            'Magento\Framework\App\Resource',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->adapterMock = $this->getMock(
+            'Magento\Framework\DB\Adapter\Pdo\Mysql',
+            ['describeTable', 'insert', 'lastInsertId'],
+            [],
+            '',
+            false
+        );
+        $this->validatorMock = $this->getMock(
+            'Magento\Sales\Model\Order\Address\Validator',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->appResourceMock->expects($this->any())
+            ->method('getConnection')
+            ->will($this->returnValue($this->adapterMock));
+        $objectManager = new \Magento\TestFramework\Helper\ObjectManager($this);
+        $this->adapterMock->expects($this->any())
+            ->method('describeTable')
+            ->will($this->returnValue([]));
+        $this->adapterMock->expects($this->any())
+            ->method('insert');
+        $this->adapterMock->expects($this->any())
+            ->method('lastInsertId');
+        $this->addressResource = $objectManager->getObject(
+            'Magento\Sales\Model\Resource\Order\Address',
+            [
+                'resource' => $this->appResourceMock,
+                'validator' => $this->validatorMock
+            ]
+        );
+
+    }
+
+    /**
+     * test _beforeSaveMethod via save()
+     */
+    public function testSave()
+    {
+        $this->validatorMock->expects($this->once())
+            ->method('validate')
+            ->with($this->equalTo($this->addressMock))
+            ->will($this->returnValue([]));
+        $this->addressResource->save($this->addressMock);
+        $this->assertTrue(true);
+    }
+
+    /**
+     * test _beforeSaveMethod via save() with failed validation
+     *
+     * @expectedException \Magento\Framework\Model\Exception
+     * @expectedExceptionMessage Cannot save address:
+     */
+    public function testSaveValidationFailed()
+    {
+        $this->validatorMock->expects($this->once())
+            ->method('validate')
+            ->with($this->equalTo($this->addressMock))
+            ->will($this->returnValue(['warning message']));
+        $this->addressResource->save($this->addressMock);
+        $this->assertTrue(true);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Model/Resource/Order/Status/HistoryTest.php b/dev/tests/unit/testsuite/Magento/Sales/Model/Resource/Order/Status/HistoryTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..10be5797615777177164358373efd55be2166aa1
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Model/Resource/Order/Status/HistoryTest.php
@@ -0,0 +1,141 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Resource\Order\Status;
+
+/**
+ * Class HistoryTest
+ * @package Magento\Sales\Model\Resource\Order\Status
+ */
+class HistoryTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Sales\Model\Resource\Order\Status\History
+     */
+    protected $historyResource;
+
+    /**
+     * @var \Magento\Framework\App\Resource|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $appResourceMock;
+
+    /**
+     * @var \Magento\Sales\Model\Order\Status\History|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $historyMock;
+
+    /**
+     * @var \Magento\Framework\DB\Adapter\Pdo\Mysql|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $adapterMock;
+
+    /**
+     * @var \Magento\Sales\Model\Order\Status\History\Validator|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $validatorMock;
+
+
+    public function setUp()
+    {
+        $this->appResourceMock = $this->getMock(
+            'Magento\Framework\App\Resource',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->adapterMock = $this->getMock(
+            'Magento\Framework\DB\Adapter\Pdo\Mysql',
+            ['describeTable', 'insert', 'lastInsertId'],
+            [],
+            '',
+            false
+        );
+        $this->validatorMock = $this->getMock(
+            'Magento\Sales\Model\Order\Status\History\Validator',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->appResourceMock->expects($this->any())
+            ->method('getConnection')
+            ->will($this->returnValue($this->adapterMock));
+        $objectManager = new \Magento\TestFramework\Helper\ObjectManager($this);
+        $this->adapterMock->expects($this->any())
+            ->method('describeTable')
+            ->will($this->returnValue([]));
+        $this->adapterMock->expects($this->any())
+            ->method('insert');
+        $this->adapterMock->expects($this->any())
+            ->method('lastInsertId');
+        $this->historyResource = $objectManager->getObject(
+            'Magento\Sales\Model\Resource\Order\Status\History',
+            [
+                'resource' => $this->appResourceMock,
+                'validator' => $this->validatorMock
+            ]
+        );
+
+    }
+
+    /**
+     * test _beforeSaveMethod via save()
+     */
+    public function testSave()
+    {
+        $historyMock = $this->getMock(
+            'Magento\Sales\Model\Order\Status\History',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->validatorMock->expects($this->once())
+            ->method('validate')
+            ->with($historyMock)
+            ->will($this->returnValue([]));
+        $this->historyResource->save($historyMock);
+    }
+    
+    /**
+     * test _beforeSaveMethod via save()
+     * @expectedException \Magento\Framework\Model\Exception
+     * @expectedExceptionMessage Cannot save comment:
+     */
+    public function testValidate()
+    {
+        $historyMock = $this->getMock(
+            'Magento\Sales\Model\Order\Status\History',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->validatorMock->expects($this->once())
+            ->method('validate')
+            ->with($historyMock)
+            ->will($this->returnValue(['Some warnings']));
+        $this->assertEquals($this->historyResource, $this->historyResource->save($historyMock));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/CommentTest.php b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/CommentTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..4e12d0d0cb1c4de9344aee78eaee73621a34e6f8
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/CommentTest.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\Sales\Service\V1\Data;
+
+class CommentTest extends \PHPUnit_Framework_TestCase
+{
+    public function testGetComment()
+    {
+        $data = ['comment' => 'test_value_comment'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Comment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_comment', $object->getComment());
+    }
+
+    public function testGetCreatedAt()
+    {
+        $data = ['created_at' => 'test_value_created_at'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Comment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_created_at', $object->getCreatedAt());
+    }
+
+    public function testGetEntityId()
+    {
+        $data = ['entity_id' => 'test_value_entity_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Comment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_entity_id', $object->getEntityId());
+    }
+
+    public function testGetIsCustomerNotified()
+    {
+        $data = ['is_customer_notified' => 'test_value_is_customer_notified'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Comment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_is_customer_notified', $object->getIsCustomerNotified());
+    }
+
+    public function testGetIsVisibleOnFront()
+    {
+        $data = ['is_visible_on_front' => 'test_value_is_visible_on_front'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Comment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_is_visible_on_front', $object->getIsVisibleOnFront());
+    }
+
+    public function testGetParentId()
+    {
+        $data = ['parent_id' => 'test_value_parent_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Comment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_parent_id', $object->getParentId());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/CreditmemoCommentTest.php b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/CreditmemoCommentTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..66c692cffbf9d6ac52b9904ac8bf9e72396ee0ed
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/CreditmemoCommentTest.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\Sales\Service\V1\Data;
+
+class CreditmemoCommentTest extends \PHPUnit_Framework_TestCase
+{
+    public function testGetComment()
+    {
+        $data = ['comment' => 'test_value_comment'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoComment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_comment', $object->getComment());
+    }
+
+    public function testGetCreatedAt()
+    {
+        $data = ['created_at' => 'test_value_created_at'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoComment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_created_at', $object->getCreatedAt());
+    }
+
+    public function testGetEntityId()
+    {
+        $data = ['entity_id' => 'test_value_entity_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoComment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_entity_id', $object->getEntityId());
+    }
+
+    public function testGetIsCustomerNotified()
+    {
+        $data = ['is_customer_notified' => 'test_value_is_customer_notified'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoComment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_is_customer_notified', $object->getIsCustomerNotified());
+    }
+
+    public function testGetIsVisibleOnFront()
+    {
+        $data = ['is_visible_on_front' => 'test_value_is_visible_on_front'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoComment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_is_visible_on_front', $object->getIsVisibleOnFront());
+    }
+
+    public function testGetParentId()
+    {
+        $data = ['parent_id' => 'test_value_parent_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoComment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_parent_id', $object->getParentId());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/CreditmemoItemTest.php b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/CreditmemoItemTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..32e30f5984b919400a490638f99ff6eb2a73993b
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/CreditmemoItemTest.php
@@ -0,0 +1,555 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Data;
+
+class CreditmemoItemTest extends \PHPUnit_Framework_TestCase
+{
+    public function testGetAdditionalData()
+    {
+        $data = ['additional_data' => 'test_value_additional_data'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_additional_data', $object->getAdditionalData());
+    }
+
+    public function testGetBaseCost()
+    {
+        $data = ['base_cost' => 'test_value_base_cost'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_cost', $object->getBaseCost());
+    }
+
+    public function testGetBaseDiscountAmount()
+    {
+        $data = ['base_discount_amount' => 'test_value_base_discount_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_discount_amount', $object->getBaseDiscountAmount());
+    }
+
+    public function testGetBaseHiddenTaxAmount()
+    {
+        $data = ['base_hidden_tax_amount' => 'test_value_base_hidden_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_hidden_tax_amount', $object->getBaseHiddenTaxAmount());
+    }
+
+    public function testGetBasePrice()
+    {
+        $data = ['base_price' => 'test_value_base_price'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_price', $object->getBasePrice());
+    }
+
+    public function testGetBasePriceInclTax()
+    {
+        $data = ['base_price_incl_tax' => 'test_value_base_price_incl_tax'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_price_incl_tax', $object->getBasePriceInclTax());
+    }
+
+    public function testGetBaseRowTotal()
+    {
+        $data = ['base_row_total' => 'test_value_base_row_total'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_row_total', $object->getBaseRowTotal());
+    }
+
+    public function testGetBaseRowTotalInclTax()
+    {
+        $data = ['base_row_total_incl_tax' => 'test_value_base_row_total_incl_tax'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_row_total_incl_tax', $object->getBaseRowTotalInclTax());
+    }
+
+    public function testGetBaseTaxAmount()
+    {
+        $data = ['base_tax_amount' => 'test_value_base_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_tax_amount', $object->getBaseTaxAmount());
+    }
+
+    public function testGetBaseWeeeTaxAppliedAmount()
+    {
+        $data = ['base_weee_tax_applied_amount' => 'test_value_base_weee_tax_applied_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_weee_tax_applied_amount', $object->getBaseWeeeTaxAppliedAmount());
+    }
+
+    public function testGetBaseWeeeTaxAppliedRowAmnt()
+    {
+        $data = ['base_weee_tax_applied_row_amnt' => 'test_value_base_weee_tax_applied_row_amnt'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_weee_tax_applied_row_amnt', $object->getBaseWeeeTaxAppliedRowAmnt());
+    }
+
+    public function testGetBaseWeeeTaxDisposition()
+    {
+        $data = ['base_weee_tax_disposition' => 'test_value_base_weee_tax_disposition'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_weee_tax_disposition', $object->getBaseWeeeTaxDisposition());
+    }
+
+    public function testGetBaseWeeeTaxRowDisposition()
+    {
+        $data = ['base_weee_tax_row_disposition' => 'test_value_base_weee_tax_row_disposition'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_weee_tax_row_disposition', $object->getBaseWeeeTaxRowDisposition());
+    }
+
+    public function testGetDescription()
+    {
+        $data = ['description' => 'test_value_description'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_description', $object->getDescription());
+    }
+
+    public function testGetDiscountAmount()
+    {
+        $data = ['discount_amount' => 'test_value_discount_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_discount_amount', $object->getDiscountAmount());
+    }
+
+    public function testGetEntityId()
+    {
+        $data = ['entity_id' => 'test_value_entity_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_entity_id', $object->getEntityId());
+    }
+
+    public function testGetHiddenTaxAmount()
+    {
+        $data = ['hidden_tax_amount' => 'test_value_hidden_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_hidden_tax_amount', $object->getHiddenTaxAmount());
+    }
+
+    public function testGetName()
+    {
+        $data = ['name' => 'test_value_name'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_name', $object->getName());
+    }
+
+    public function testGetOrderItemId()
+    {
+        $data = ['order_item_id' => 'test_value_order_item_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_order_item_id', $object->getOrderItemId());
+    }
+
+    public function testGetParentId()
+    {
+        $data = ['parent_id' => 'test_value_parent_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_parent_id', $object->getParentId());
+    }
+
+    public function testGetPrice()
+    {
+        $data = ['price' => 'test_value_price'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_price', $object->getPrice());
+    }
+
+    public function testGetPriceInclTax()
+    {
+        $data = ['price_incl_tax' => 'test_value_price_incl_tax'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_price_incl_tax', $object->getPriceInclTax());
+    }
+
+    public function testGetProductId()
+    {
+        $data = ['product_id' => 'test_value_product_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_product_id', $object->getProductId());
+    }
+
+    public function testGetQty()
+    {
+        $data = ['qty' => 'test_value_qty'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_qty', $object->getQty());
+    }
+
+    public function testGetRowTotal()
+    {
+        $data = ['row_total' => 'test_value_row_total'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_row_total', $object->getRowTotal());
+    }
+
+    public function testGetRowTotalInclTax()
+    {
+        $data = ['row_total_incl_tax' => 'test_value_row_total_incl_tax'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_row_total_incl_tax', $object->getRowTotalInclTax());
+    }
+
+    public function testGetSku()
+    {
+        $data = ['sku' => 'test_value_sku'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_sku', $object->getSku());
+    }
+
+    public function testGetTaxAmount()
+    {
+        $data = ['tax_amount' => 'test_value_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_tax_amount', $object->getTaxAmount());
+    }
+
+    public function testGetWeeeTaxApplied()
+    {
+        $data = ['weee_tax_applied' => 'test_value_weee_tax_applied'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_weee_tax_applied', $object->getWeeeTaxApplied());
+    }
+
+    public function testGetWeeeTaxAppliedAmount()
+    {
+        $data = ['weee_tax_applied_amount' => 'test_value_weee_tax_applied_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_weee_tax_applied_amount', $object->getWeeeTaxAppliedAmount());
+    }
+
+    public function testGetWeeeTaxAppliedRowAmount()
+    {
+        $data = ['weee_tax_applied_row_amount' => 'test_value_weee_tax_applied_row_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_weee_tax_applied_row_amount', $object->getWeeeTaxAppliedRowAmount());
+    }
+
+    public function testGetWeeeTaxDisposition()
+    {
+        $data = ['weee_tax_disposition' => 'test_value_weee_tax_disposition'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_weee_tax_disposition', $object->getWeeeTaxDisposition());
+    }
+
+    public function testGetWeeeTaxRowDisposition()
+    {
+        $data = ['weee_tax_row_disposition' => 'test_value_weee_tax_row_disposition'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\CreditmemoItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_weee_tax_row_disposition', $object->getWeeeTaxRowDisposition());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/CreditmemoTest.php b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/CreditmemoTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..cf970c2f404faf719bae430b661edf6556c32194
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/CreditmemoTest.php
@@ -0,0 +1,801 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Data;
+
+/**
+ * Class CreditmemoTest
+ *
+ * @SuppressWarnings(PHPMD.ExcessivePublicCount)
+ * @package Magento\Sales\Service\V1\Data
+ */
+class CreditmemoTest extends \PHPUnit_Framework_TestCase
+{
+    public function testGetAdjustment()
+    {
+        $data = ['adjustment' => 'test_value_adjustment'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_adjustment', $object->getAdjustment());
+    }
+
+    public function testGetAdjustmentNegative()
+    {
+        $data = ['adjustment_negative' => 'test_value_adjustment_negative'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_adjustment_negative', $object->getAdjustmentNegative());
+    }
+
+    public function testGetAdjustmentPositive()
+    {
+        $data = ['adjustment_positive' => 'test_value_adjustment_positive'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_adjustment_positive', $object->getAdjustmentPositive());
+    }
+
+    public function testGetBaseAdjustment()
+    {
+        $data = ['base_adjustment' => 'test_value_base_adjustment'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_adjustment', $object->getBaseAdjustment());
+    }
+
+    public function testGetBaseAdjustmentNegative()
+    {
+        $data = ['base_adjustment_negative' => 'test_value_base_adjustment_negative'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_adjustment_negative', $object->getBaseAdjustmentNegative());
+    }
+
+    public function testGetBaseAdjustmentPositive()
+    {
+        $data = ['base_adjustment_positive' => 'test_value_base_adjustment_positive'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_adjustment_positive', $object->getBaseAdjustmentPositive());
+    }
+
+    public function testGetBaseCurrencyCode()
+    {
+        $data = ['base_currency_code' => 'test_value_base_currency_code'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_currency_code', $object->getBaseCurrencyCode());
+    }
+
+    public function testGetBaseDiscountAmount()
+    {
+        $data = ['base_discount_amount' => 'test_value_base_discount_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_discount_amount', $object->getBaseDiscountAmount());
+    }
+
+    public function testGetBaseGrandTotal()
+    {
+        $data = ['base_grand_total' => 'test_value_base_grand_total'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_grand_total', $object->getBaseGrandTotal());
+    }
+
+    public function testGetBaseHiddenTaxAmount()
+    {
+        $data = ['base_hidden_tax_amount' => 'test_value_base_hidden_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_hidden_tax_amount', $object->getBaseHiddenTaxAmount());
+    }
+
+    public function testGetBaseShippingAmount()
+    {
+        $data = ['base_shipping_amount' => 'test_value_base_shipping_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_shipping_amount', $object->getBaseShippingAmount());
+    }
+
+    public function testGetBaseShippingHiddenTaxAmnt()
+    {
+        $data = ['base_shipping_hidden_tax_amnt' => 'test_value_base_shipping_hidden_tax_amnt'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_shipping_hidden_tax_amnt', $object->getBaseShippingHiddenTaxAmnt());
+    }
+
+    public function testGetBaseShippingInclTax()
+    {
+        $data = ['base_shipping_incl_tax' => 'test_value_base_shipping_incl_tax'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_shipping_incl_tax', $object->getBaseShippingInclTax());
+    }
+
+    public function testGetBaseShippingTaxAmount()
+    {
+        $data = ['base_shipping_tax_amount' => 'test_value_base_shipping_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_shipping_tax_amount', $object->getBaseShippingTaxAmount());
+    }
+
+    public function testGetBaseSubtotal()
+    {
+        $data = ['base_subtotal' => 'test_value_base_subtotal'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_subtotal', $object->getBaseSubtotal());
+    }
+
+    public function testGetBaseSubtotalInclTax()
+    {
+        $data = ['base_subtotal_incl_tax' => 'test_value_base_subtotal_incl_tax'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_subtotal_incl_tax', $object->getBaseSubtotalInclTax());
+    }
+
+    public function testGetBaseTaxAmount()
+    {
+        $data = ['base_tax_amount' => 'test_value_base_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_tax_amount', $object->getBaseTaxAmount());
+    }
+
+    public function testGetBaseToGlobalRate()
+    {
+        $data = ['base_to_global_rate' => 'test_value_base_to_global_rate'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_to_global_rate', $object->getBaseToGlobalRate());
+    }
+
+    public function testGetBaseToOrderRate()
+    {
+        $data = ['base_to_order_rate' => 'test_value_base_to_order_rate'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_to_order_rate', $object->getBaseToOrderRate());
+    }
+
+    public function testGetBillingAddressId()
+    {
+        $data = ['billing_address_id' => 'test_value_billing_address_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_billing_address_id', $object->getBillingAddressId());
+    }
+
+    public function testGetCreatedAt()
+    {
+        $data = ['created_at' => 'test_value_created_at'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_created_at', $object->getCreatedAt());
+    }
+
+    public function testGetCreditmemoStatus()
+    {
+        $data = ['creditmemo_status' => 'test_value_creditmemo_status'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_creditmemo_status', $object->getCreditmemoStatus());
+    }
+
+    public function testGetDiscountAmount()
+    {
+        $data = ['discount_amount' => 'test_value_discount_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_discount_amount', $object->getDiscountAmount());
+    }
+
+    public function testGetDiscountDescription()
+    {
+        $data = ['discount_description' => 'test_value_discount_description'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_discount_description', $object->getDiscountDescription());
+    }
+
+    public function testGetEmailSent()
+    {
+        $data = ['email_sent' => 'test_value_email_sent'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_email_sent', $object->getEmailSent());
+    }
+
+    public function testGetEntityId()
+    {
+        $data = ['entity_id' => 'test_value_entity_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_entity_id', $object->getEntityId());
+    }
+
+    public function testGetGlobalCurrencyCode()
+    {
+        $data = ['global_currency_code' => 'test_value_global_currency_code'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_global_currency_code', $object->getGlobalCurrencyCode());
+    }
+
+    public function testGetGrandTotal()
+    {
+        $data = ['grand_total' => 'test_value_grand_total'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_grand_total', $object->getGrandTotal());
+    }
+
+    public function testGetHiddenTaxAmount()
+    {
+        $data = ['hidden_tax_amount' => 'test_value_hidden_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_hidden_tax_amount', $object->getHiddenTaxAmount());
+    }
+
+    public function testGetIncrementId()
+    {
+        $data = ['increment_id' => 'test_value_increment_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_increment_id', $object->getIncrementId());
+    }
+
+    public function testGetInvoiceId()
+    {
+        $data = ['invoice_id' => 'test_value_invoice_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_invoice_id', $object->getInvoiceId());
+    }
+
+    public function testGetOrderCurrencyCode()
+    {
+        $data = ['order_currency_code' => 'test_value_order_currency_code'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_order_currency_code', $object->getOrderCurrencyCode());
+    }
+
+    public function testGetOrderId()
+    {
+        $data = ['order_id' => 'test_value_order_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_order_id', $object->getOrderId());
+    }
+
+    public function testGetShippingAddressId()
+    {
+        $data = ['shipping_address_id' => 'test_value_shipping_address_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_shipping_address_id', $object->getShippingAddressId());
+    }
+
+    public function testGetShippingAmount()
+    {
+        $data = ['shipping_amount' => 'test_value_shipping_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_shipping_amount', $object->getShippingAmount());
+    }
+
+    public function testGetShippingHiddenTaxAmount()
+    {
+        $data = ['shipping_hidden_tax_amount' => 'test_value_shipping_hidden_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_shipping_hidden_tax_amount', $object->getShippingHiddenTaxAmount());
+    }
+
+    public function testGetShippingInclTax()
+    {
+        $data = ['shipping_incl_tax' => 'test_value_shipping_incl_tax'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_shipping_incl_tax', $object->getShippingInclTax());
+    }
+
+    public function testGetShippingTaxAmount()
+    {
+        $data = ['shipping_tax_amount' => 'test_value_shipping_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_shipping_tax_amount', $object->getShippingTaxAmount());
+    }
+
+    public function testGetState()
+    {
+        $data = ['state' => 'test_value_state'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_state', $object->getState());
+    }
+
+    public function testGetStoreCurrencyCode()
+    {
+        $data = ['store_currency_code' => 'test_value_store_currency_code'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_store_currency_code', $object->getStoreCurrencyCode());
+    }
+
+    public function testGetStoreId()
+    {
+        $data = ['store_id' => 'test_value_store_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_store_id', $object->getStoreId());
+    }
+
+    public function testGetStoreToBaseRate()
+    {
+        $data = ['store_to_base_rate' => 'test_value_store_to_base_rate'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_store_to_base_rate', $object->getStoreToBaseRate());
+    }
+
+    public function testGetStoreToOrderRate()
+    {
+        $data = ['store_to_order_rate' => 'test_value_store_to_order_rate'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_store_to_order_rate', $object->getStoreToOrderRate());
+    }
+
+    public function testGetSubtotal()
+    {
+        $data = ['subtotal' => 'test_value_subtotal'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_subtotal', $object->getSubtotal());
+    }
+
+    public function testGetSubtotalInclTax()
+    {
+        $data = ['subtotal_incl_tax' => 'test_value_subtotal_incl_tax'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_subtotal_incl_tax', $object->getSubtotalInclTax());
+    }
+
+    public function testGetTaxAmount()
+    {
+        $data = ['tax_amount' => 'test_value_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_tax_amount', $object->getTaxAmount());
+    }
+
+    public function testGetTransactionId()
+    {
+        $data = ['transaction_id' => 'test_value_transaction_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_transaction_id', $object->getTransactionId());
+    }
+
+    public function testGetUpdatedAt()
+    {
+        $data = ['updated_at' => 'test_value_updated_at'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Creditmemo($abstractBuilderMock);
+
+        $this->assertEquals('test_value_updated_at', $object->getUpdatedAt());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/InvoiceItemTest.php b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/InvoiceItemTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..c3cdf9a504d9eaadc5127ba961f75157ceb47f09
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/InvoiceItemTest.php
@@ -0,0 +1,411 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Data;
+
+class InvoiceItemTest extends \PHPUnit_Framework_TestCase
+{
+    public function testGetAdditionalData()
+    {
+        $data = ['additional_data' => 'test_value_additional_data'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\InvoiceItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_additional_data', $object->getAdditionalData());
+    }
+
+    public function testGetBaseCost()
+    {
+        $data = ['base_cost' => 'test_value_base_cost'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\InvoiceItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_cost', $object->getBaseCost());
+    }
+
+    public function testGetBaseDiscountAmount()
+    {
+        $data = ['base_discount_amount' => 'test_value_base_discount_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\InvoiceItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_discount_amount', $object->getBaseDiscountAmount());
+    }
+
+    public function testGetBaseHiddenTaxAmount()
+    {
+        $data = ['base_hidden_tax_amount' => 'test_value_base_hidden_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\InvoiceItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_hidden_tax_amount', $object->getBaseHiddenTaxAmount());
+    }
+
+    public function testGetBasePrice()
+    {
+        $data = ['base_price' => 'test_value_base_price'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\InvoiceItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_price', $object->getBasePrice());
+    }
+
+    public function testGetBasePriceInclTax()
+    {
+        $data = ['base_price_incl_tax' => 'test_value_base_price_incl_tax'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\InvoiceItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_price_incl_tax', $object->getBasePriceInclTax());
+    }
+
+    public function testGetBaseRowTotal()
+    {
+        $data = ['base_row_total' => 'test_value_base_row_total'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\InvoiceItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_row_total', $object->getBaseRowTotal());
+    }
+
+    public function testGetBaseRowTotalInclTax()
+    {
+        $data = ['base_row_total_incl_tax' => 'test_value_base_row_total_incl_tax'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\InvoiceItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_row_total_incl_tax', $object->getBaseRowTotalInclTax());
+    }
+
+    public function testGetBaseTaxAmount()
+    {
+        $data = ['base_tax_amount' => 'test_value_base_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\InvoiceItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_tax_amount', $object->getBaseTaxAmount());
+    }
+
+    public function testGetDescription()
+    {
+        $data = ['description' => 'test_value_description'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\InvoiceItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_description', $object->getDescription());
+    }
+
+    public function testGetDiscountAmount()
+    {
+        $data = ['discount_amount' => 'test_value_discount_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\InvoiceItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_discount_amount', $object->getDiscountAmount());
+    }
+
+    public function testGetEntityId()
+    {
+        $data = ['entity_id' => 'test_value_entity_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\InvoiceItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_entity_id', $object->getEntityId());
+    }
+
+    public function testGetHiddenTaxAmount()
+    {
+        $data = ['hidden_tax_amount' => 'test_value_hidden_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\InvoiceItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_hidden_tax_amount', $object->getHiddenTaxAmount());
+    }
+
+    public function testGetName()
+    {
+        $data = ['name' => 'test_value_name'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\InvoiceItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_name', $object->getName());
+    }
+
+    public function testGetOrderItemId()
+    {
+        $data = ['order_item_id' => 'test_value_order_item_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\InvoiceItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_order_item_id', $object->getOrderItemId());
+    }
+
+    public function testGetParentId()
+    {
+        $data = ['parent_id' => 'test_value_parent_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\InvoiceItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_parent_id', $object->getParentId());
+    }
+
+    public function testGetPrice()
+    {
+        $data = ['price' => 'test_value_price'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\InvoiceItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_price', $object->getPrice());
+    }
+
+    public function testGetPriceInclTax()
+    {
+        $data = ['price_incl_tax' => 'test_value_price_incl_tax'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\InvoiceItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_price_incl_tax', $object->getPriceInclTax());
+    }
+
+    public function testGetProductId()
+    {
+        $data = ['product_id' => 'test_value_product_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\InvoiceItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_product_id', $object->getProductId());
+    }
+
+    public function testGetQty()
+    {
+        $data = ['qty' => 'test_value_qty'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\InvoiceItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_qty', $object->getQty());
+    }
+
+    public function testGetRowTotal()
+    {
+        $data = ['row_total' => 'test_value_row_total'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\InvoiceItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_row_total', $object->getRowTotal());
+    }
+
+    public function testGetRowTotalInclTax()
+    {
+        $data = ['row_total_incl_tax' => 'test_value_row_total_incl_tax'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\InvoiceItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_row_total_incl_tax', $object->getRowTotalInclTax());
+    }
+
+    public function testGetSku()
+    {
+        $data = ['sku' => 'test_value_sku'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\InvoiceItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_sku', $object->getSku());
+    }
+
+    public function testGetTaxAmount()
+    {
+        $data = ['tax_amount' => 'test_value_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\InvoiceItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_tax_amount', $object->getTaxAmount());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/InvoiceTest.php b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/InvoiceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..e05a8f42f9ebfc7c932538eea9be9f818d40c743
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/InvoiceTest.php
@@ -0,0 +1,769 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Data;
+
+/**
+ * Class InvoiceTest
+ *
+ * @SuppressWarnings(PHPMD.ExcessivePublicCount)
+ * @package Magento\Sales\Service\V1\Data
+ */
+class InvoiceTest extends \PHPUnit_Framework_TestCase
+{
+    public function testGetBaseCurrencyCode()
+    {
+        $data = ['base_currency_code' => 'test_value_base_currency_code'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_currency_code', $object->getBaseCurrencyCode());
+    }
+
+    public function testGetBaseDiscountAmount()
+    {
+        $data = ['base_discount_amount' => 'test_value_base_discount_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_discount_amount', $object->getBaseDiscountAmount());
+    }
+
+    public function testGetBaseGrandTotal()
+    {
+        $data = ['base_grand_total' => 'test_value_base_grand_total'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_grand_total', $object->getBaseGrandTotal());
+    }
+
+    public function testGetBaseHiddenTaxAmount()
+    {
+        $data = ['base_hidden_tax_amount' => 'test_value_base_hidden_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_hidden_tax_amount', $object->getBaseHiddenTaxAmount());
+    }
+
+    public function testGetBaseShippingAmount()
+    {
+        $data = ['base_shipping_amount' => 'test_value_base_shipping_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_shipping_amount', $object->getBaseShippingAmount());
+    }
+
+    public function testGetBaseShippingHiddenTaxAmnt()
+    {
+        $data = ['base_shipping_hidden_tax_amnt' => 'test_value_base_shipping_hidden_tax_amnt'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_shipping_hidden_tax_amnt', $object->getBaseShippingHiddenTaxAmnt());
+    }
+
+    public function testGetBaseShippingInclTax()
+    {
+        $data = ['base_shipping_incl_tax' => 'test_value_base_shipping_incl_tax'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_shipping_incl_tax', $object->getBaseShippingInclTax());
+    }
+
+    public function testGetBaseShippingTaxAmount()
+    {
+        $data = ['base_shipping_tax_amount' => 'test_value_base_shipping_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_shipping_tax_amount', $object->getBaseShippingTaxAmount());
+    }
+
+    public function testGetBaseSubtotal()
+    {
+        $data = ['base_subtotal' => 'test_value_base_subtotal'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_subtotal', $object->getBaseSubtotal());
+    }
+
+    public function testGetBaseSubtotalInclTax()
+    {
+        $data = ['base_subtotal_incl_tax' => 'test_value_base_subtotal_incl_tax'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_subtotal_incl_tax', $object->getBaseSubtotalInclTax());
+    }
+
+    public function testGetBaseTaxAmount()
+    {
+        $data = ['base_tax_amount' => 'test_value_base_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_tax_amount', $object->getBaseTaxAmount());
+    }
+
+    public function testGetBaseTotalRefunded()
+    {
+        $data = ['base_total_refunded' => 'test_value_base_total_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_total_refunded', $object->getBaseTotalRefunded());
+    }
+
+    public function testGetBaseToGlobalRate()
+    {
+        $data = ['base_to_global_rate' => 'test_value_base_to_global_rate'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_to_global_rate', $object->getBaseToGlobalRate());
+    }
+
+    public function testGetBaseToOrderRate()
+    {
+        $data = ['base_to_order_rate' => 'test_value_base_to_order_rate'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_to_order_rate', $object->getBaseToOrderRate());
+    }
+
+    public function testGetBillingAddressId()
+    {
+        $data = ['billing_address_id' => 'test_value_billing_address_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_billing_address_id', $object->getBillingAddressId());
+    }
+
+    public function testGetCanVoidFlag()
+    {
+        $data = ['can_void_flag' => 'test_value_can_void_flag'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_can_void_flag', $object->getCanVoidFlag());
+    }
+
+    public function testGetCreatedAt()
+    {
+        $data = ['created_at' => 'test_value_created_at'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_created_at', $object->getCreatedAt());
+    }
+
+    public function testGetDiscountAmount()
+    {
+        $data = ['discount_amount' => 'test_value_discount_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_discount_amount', $object->getDiscountAmount());
+    }
+
+    public function testGetDiscountDescription()
+    {
+        $data = ['discount_description' => 'test_value_discount_description'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_discount_description', $object->getDiscountDescription());
+    }
+
+    public function testGetEmailSent()
+    {
+        $data = ['email_sent' => 'test_value_email_sent'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_email_sent', $object->getEmailSent());
+    }
+
+    public function testGetEntityId()
+    {
+        $data = ['entity_id' => 'test_value_entity_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_entity_id', $object->getEntityId());
+    }
+
+    public function testGetGlobalCurrencyCode()
+    {
+        $data = ['global_currency_code' => 'test_value_global_currency_code'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_global_currency_code', $object->getGlobalCurrencyCode());
+    }
+
+    public function testGetGrandTotal()
+    {
+        $data = ['grand_total' => 'test_value_grand_total'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_grand_total', $object->getGrandTotal());
+    }
+
+    public function testGetHiddenTaxAmount()
+    {
+        $data = ['hidden_tax_amount' => 'test_value_hidden_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_hidden_tax_amount', $object->getHiddenTaxAmount());
+    }
+
+    public function testGetIncrementId()
+    {
+        $data = ['increment_id' => 'test_value_increment_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_increment_id', $object->getIncrementId());
+    }
+
+    public function testGetIsUsedForRefund()
+    {
+        $data = ['is_used_for_refund' => 'test_value_is_used_for_refund'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_is_used_for_refund', $object->getIsUsedForRefund());
+    }
+
+    public function testGetOrderCurrencyCode()
+    {
+        $data = ['order_currency_code' => 'test_value_order_currency_code'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_order_currency_code', $object->getOrderCurrencyCode());
+    }
+
+    public function testGetOrderId()
+    {
+        $data = ['order_id' => 'test_value_order_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_order_id', $object->getOrderId());
+    }
+
+    public function testGetShippingAddressId()
+    {
+        $data = ['shipping_address_id' => 'test_value_shipping_address_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_shipping_address_id', $object->getShippingAddressId());
+    }
+
+    public function testGetShippingAmount()
+    {
+        $data = ['shipping_amount' => 'test_value_shipping_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_shipping_amount', $object->getShippingAmount());
+    }
+
+    public function testGetShippingHiddenTaxAmount()
+    {
+        $data = ['shipping_hidden_tax_amount' => 'test_value_shipping_hidden_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_shipping_hidden_tax_amount', $object->getShippingHiddenTaxAmount());
+    }
+
+    public function testGetShippingInclTax()
+    {
+        $data = ['shipping_incl_tax' => 'test_value_shipping_incl_tax'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_shipping_incl_tax', $object->getShippingInclTax());
+    }
+
+    public function testGetShippingTaxAmount()
+    {
+        $data = ['shipping_tax_amount' => 'test_value_shipping_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_shipping_tax_amount', $object->getShippingTaxAmount());
+    }
+
+    public function testGetState()
+    {
+        $data = ['state' => 'test_value_state'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_state', $object->getState());
+    }
+
+    public function testGetStoreCurrencyCode()
+    {
+        $data = ['store_currency_code' => 'test_value_store_currency_code'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_store_currency_code', $object->getStoreCurrencyCode());
+    }
+
+    public function testGetStoreId()
+    {
+        $data = ['store_id' => 'test_value_store_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_store_id', $object->getStoreId());
+    }
+
+    public function testGetStoreToBaseRate()
+    {
+        $data = ['store_to_base_rate' => 'test_value_store_to_base_rate'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_store_to_base_rate', $object->getStoreToBaseRate());
+    }
+
+    public function testGetStoreToOrderRate()
+    {
+        $data = ['store_to_order_rate' => 'test_value_store_to_order_rate'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_store_to_order_rate', $object->getStoreToOrderRate());
+    }
+
+    public function testGetSubtotal()
+    {
+        $data = ['subtotal' => 'test_value_subtotal'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_subtotal', $object->getSubtotal());
+    }
+
+    public function testGetSubtotalInclTax()
+    {
+        $data = ['subtotal_incl_tax' => 'test_value_subtotal_incl_tax'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_subtotal_incl_tax', $object->getSubtotalInclTax());
+    }
+
+    public function testGetTaxAmount()
+    {
+        $data = ['tax_amount' => 'test_value_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_tax_amount', $object->getTaxAmount());
+    }
+
+    public function testGetTotalQty()
+    {
+        $data = ['total_qty' => 'test_value_total_qty'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_total_qty', $object->getTotalQty());
+    }
+
+    public function testGetTransactionId()
+    {
+        $data = ['transaction_id' => 'test_value_transaction_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_transaction_id', $object->getTransactionId());
+    }
+
+    public function testGetUpdatedAt()
+    {
+        $data = ['updated_at' => 'test_value_updated_at'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_updated_at', $object->getUpdatedAt());
+    }
+
+    public function testGetItems()
+    {
+        $data = ['items' => 'test_value_items'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_items', $object->getItems());
+    }
+
+    public function testGetComments()
+    {
+        $data = ['comments' => 'test_value_comments'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Invoice($abstractBuilderMock);
+
+        $this->assertEquals('test_value_comments', $object->getComments());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/OrderAddressTest.php b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/OrderAddressTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..3be4a17236e04725cbd2fd800ba56a10b4f7f2b9
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/OrderAddressTest.php
@@ -0,0 +1,443 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Data;
+
+class OrderAddressTest extends \PHPUnit_Framework_TestCase
+{
+    public function testGetAddressType()
+    {
+        $data = ['address_type' => 'test_value_address_type'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderAddress($abstractBuilderMock);
+
+        $this->assertEquals('test_value_address_type', $object->getAddressType());
+    }
+
+    public function testGetCity()
+    {
+        $data = ['city' => 'test_value_city'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderAddress($abstractBuilderMock);
+
+        $this->assertEquals('test_value_city', $object->getCity());
+    }
+
+    public function testGetCompany()
+    {
+        $data = ['company' => 'test_value_company'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderAddress($abstractBuilderMock);
+
+        $this->assertEquals('test_value_company', $object->getCompany());
+    }
+
+    public function testGetCountryId()
+    {
+        $data = ['country_id' => 'test_value_country_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderAddress($abstractBuilderMock);
+
+        $this->assertEquals('test_value_country_id', $object->getCountryId());
+    }
+
+    public function testGetCustomerAddressId()
+    {
+        $data = ['customer_address_id' => 'test_value_customer_address_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderAddress($abstractBuilderMock);
+
+        $this->assertEquals('test_value_customer_address_id', $object->getCustomerAddressId());
+    }
+
+    public function testGetCustomerId()
+    {
+        $data = ['customer_id' => 'test_value_customer_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderAddress($abstractBuilderMock);
+
+        $this->assertEquals('test_value_customer_id', $object->getCustomerId());
+    }
+
+    public function testGetEmail()
+    {
+        $data = ['email' => 'test_value_email'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderAddress($abstractBuilderMock);
+
+        $this->assertEquals('test_value_email', $object->getEmail());
+    }
+
+    public function testGetEntityId()
+    {
+        $data = ['entity_id' => 'test_value_entity_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderAddress($abstractBuilderMock);
+
+        $this->assertEquals('test_value_entity_id', $object->getEntityId());
+    }
+
+    public function testGetFax()
+    {
+        $data = ['fax' => 'test_value_fax'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderAddress($abstractBuilderMock);
+
+        $this->assertEquals('test_value_fax', $object->getFax());
+    }
+
+    public function testGetFirstname()
+    {
+        $data = ['firstname' => 'test_value_firstname'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderAddress($abstractBuilderMock);
+
+        $this->assertEquals('test_value_firstname', $object->getFirstname());
+    }
+
+    public function testGetLastname()
+    {
+        $data = ['lastname' => 'test_value_lastname'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderAddress($abstractBuilderMock);
+
+        $this->assertEquals('test_value_lastname', $object->getLastname());
+    }
+
+    public function testGetMiddlename()
+    {
+        $data = ['middlename' => 'test_value_middlename'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderAddress($abstractBuilderMock);
+
+        $this->assertEquals('test_value_middlename', $object->getMiddlename());
+    }
+
+    public function testGetParentId()
+    {
+        $data = ['parent_id' => 'test_value_parent_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderAddress($abstractBuilderMock);
+
+        $this->assertEquals('test_value_parent_id', $object->getParentId());
+    }
+
+    public function testGetPostcode()
+    {
+        $data = ['postcode' => 'test_value_postcode'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderAddress($abstractBuilderMock);
+
+        $this->assertEquals('test_value_postcode', $object->getPostcode());
+    }
+
+    public function testGetPrefix()
+    {
+        $data = ['prefix' => 'test_value_prefix'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderAddress($abstractBuilderMock);
+
+        $this->assertEquals('test_value_prefix', $object->getPrefix());
+    }
+
+    public function testGetQuoteAddressId()
+    {
+        $data = ['quote_address_id' => 'test_value_quote_address_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderAddress($abstractBuilderMock);
+
+        $this->assertEquals('test_value_quote_address_id', $object->getQuoteAddressId());
+    }
+
+    public function testGetRegion()
+    {
+        $data = ['region' => 'test_value_region'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderAddress($abstractBuilderMock);
+
+        $this->assertEquals('test_value_region', $object->getRegion());
+    }
+
+    public function testGetRegionId()
+    {
+        $data = ['region_id' => 'test_value_region_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderAddress($abstractBuilderMock);
+
+        $this->assertEquals('test_value_region_id', $object->getRegionId());
+    }
+
+    public function testGetStreet()
+    {
+        $data = ['street' => 'test_value_street'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderAddress($abstractBuilderMock);
+
+        $this->assertEquals('test_value_street', $object->getStreet());
+    }
+
+    public function testGetSuffix()
+    {
+        $data = ['suffix' => 'test_value_suffix'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderAddress($abstractBuilderMock);
+
+        $this->assertEquals('test_value_suffix', $object->getSuffix());
+    }
+
+    public function testGetTelephone()
+    {
+        $data = ['telephone' => 'test_value_telephone'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderAddress($abstractBuilderMock);
+
+        $this->assertEquals('test_value_telephone', $object->getTelephone());
+    }
+
+    public function testGetVatId()
+    {
+        $data = ['vat_id' => 'test_value_vat_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderAddress($abstractBuilderMock);
+
+        $this->assertEquals('test_value_vat_id', $object->getVatId());
+    }
+
+    public function testGetVatIsValid()
+    {
+        $data = ['vat_is_valid' => 'test_value_vat_is_valid'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderAddress($abstractBuilderMock);
+
+        $this->assertEquals('test_value_vat_is_valid', $object->getVatIsValid());
+    }
+
+    public function testGetVatRequestDate()
+    {
+        $data = ['vat_request_date' => 'test_value_vat_request_date'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderAddress($abstractBuilderMock);
+
+        $this->assertEquals('test_value_vat_request_date', $object->getVatRequestDate());
+    }
+
+    public function testGetVatRequestId()
+    {
+        $data = ['vat_request_id' => 'test_value_vat_request_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderAddress($abstractBuilderMock);
+
+        $this->assertEquals('test_value_vat_request_id', $object->getVatRequestId());
+    }
+
+    public function testGetVatRequestSuccess()
+    {
+        $data = ['vat_request_success' => 'test_value_vat_request_success'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderAddress($abstractBuilderMock);
+
+        $this->assertEquals('test_value_vat_request_success', $object->getVatRequestSuccess());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/OrderItemTest.php b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/OrderItemTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..6e7d555c57a52149e277eabffbcbe734f727fd91
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/OrderItemTest.php
@@ -0,0 +1,1537 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Data;
+
+/**
+ * Class OrderItemTest
+ *
+ * @SuppressWarnings(PHPMD.ExcessivePublicCount)
+ * @package Magento\Sales\Service\V1\Data
+ */
+class OrderItemTest extends \PHPUnit_Framework_TestCase
+{
+    public function testGetAdditionalData()
+    {
+        $data = ['additional_data' => 'test_value_additional_data'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_additional_data', $object->getAdditionalData());
+    }
+
+    public function testGetAmountRefunded()
+    {
+        $data = ['amount_refunded' => 'test_value_amount_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_amount_refunded', $object->getAmountRefunded());
+    }
+
+    public function testGetAppliedRuleIds()
+    {
+        $data = ['applied_rule_ids' => 'test_value_applied_rule_ids'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_applied_rule_ids', $object->getAppliedRuleIds());
+    }
+
+    public function testGetBaseAmountRefunded()
+    {
+        $data = ['base_amount_refunded' => 'test_value_base_amount_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_amount_refunded', $object->getBaseAmountRefunded());
+    }
+
+    public function testGetBaseCost()
+    {
+        $data = ['base_cost' => 'test_value_base_cost'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_cost', $object->getBaseCost());
+    }
+
+    public function testGetBaseDiscountAmount()
+    {
+        $data = ['base_discount_amount' => 'test_value_base_discount_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_discount_amount', $object->getBaseDiscountAmount());
+    }
+
+    public function testGetBaseDiscountInvoiced()
+    {
+        $data = ['base_discount_invoiced' => 'test_value_base_discount_invoiced'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_discount_invoiced', $object->getBaseDiscountInvoiced());
+    }
+
+    public function testGetBaseDiscountRefunded()
+    {
+        $data = ['base_discount_refunded' => 'test_value_base_discount_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_discount_refunded', $object->getBaseDiscountRefunded());
+    }
+
+    public function testGetBaseHiddenTaxAmount()
+    {
+        $data = ['base_hidden_tax_amount' => 'test_value_base_hidden_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_hidden_tax_amount', $object->getBaseHiddenTaxAmount());
+    }
+
+    public function testGetBaseHiddenTaxInvoiced()
+    {
+        $data = ['base_hidden_tax_invoiced' => 'test_value_base_hidden_tax_invoiced'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_hidden_tax_invoiced', $object->getBaseHiddenTaxInvoiced());
+    }
+
+    public function testGetBaseHiddenTaxRefunded()
+    {
+        $data = ['base_hidden_tax_refunded' => 'test_value_base_hidden_tax_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_hidden_tax_refunded', $object->getBaseHiddenTaxRefunded());
+    }
+
+    public function testGetBaseOriginalPrice()
+    {
+        $data = ['base_original_price' => 'test_value_base_original_price'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_original_price', $object->getBaseOriginalPrice());
+    }
+
+    public function testGetBasePrice()
+    {
+        $data = ['base_price' => 'test_value_base_price'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_price', $object->getBasePrice());
+    }
+
+    public function testGetBasePriceInclTax()
+    {
+        $data = ['base_price_incl_tax' => 'test_value_base_price_incl_tax'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_price_incl_tax', $object->getBasePriceInclTax());
+    }
+
+    public function testGetBaseRowInvoiced()
+    {
+        $data = ['base_row_invoiced' => 'test_value_base_row_invoiced'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_row_invoiced', $object->getBaseRowInvoiced());
+    }
+
+    public function testGetBaseRowTotal()
+    {
+        $data = ['base_row_total' => 'test_value_base_row_total'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_row_total', $object->getBaseRowTotal());
+    }
+
+    public function testGetBaseRowTotalInclTax()
+    {
+        $data = ['base_row_total_incl_tax' => 'test_value_base_row_total_incl_tax'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_row_total_incl_tax', $object->getBaseRowTotalInclTax());
+    }
+
+    public function testGetBaseTaxAmount()
+    {
+        $data = ['base_tax_amount' => 'test_value_base_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_tax_amount', $object->getBaseTaxAmount());
+    }
+
+    public function testGetBaseTaxBeforeDiscount()
+    {
+        $data = ['base_tax_before_discount' => 'test_value_base_tax_before_discount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_tax_before_discount', $object->getBaseTaxBeforeDiscount());
+    }
+
+    public function testGetBaseTaxInvoiced()
+    {
+        $data = ['base_tax_invoiced' => 'test_value_base_tax_invoiced'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_tax_invoiced', $object->getBaseTaxInvoiced());
+    }
+
+    public function testGetBaseTaxRefunded()
+    {
+        $data = ['base_tax_refunded' => 'test_value_base_tax_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_tax_refunded', $object->getBaseTaxRefunded());
+    }
+
+    public function testGetBaseWeeeTaxAppliedAmount()
+    {
+        $data = ['base_weee_tax_applied_amount' => 'test_value_base_weee_tax_applied_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_weee_tax_applied_amount', $object->getBaseWeeeTaxAppliedAmount());
+    }
+
+    public function testGetBaseWeeeTaxAppliedRowAmnt()
+    {
+        $data = ['base_weee_tax_applied_row_amnt' => 'test_value_base_weee_tax_applied_row_amnt'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_weee_tax_applied_row_amnt', $object->getBaseWeeeTaxAppliedRowAmnt());
+    }
+
+    public function testGetBaseWeeeTaxDisposition()
+    {
+        $data = ['base_weee_tax_disposition' => 'test_value_base_weee_tax_disposition'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_weee_tax_disposition', $object->getBaseWeeeTaxDisposition());
+    }
+
+    public function testGetBaseWeeeTaxRowDisposition()
+    {
+        $data = ['base_weee_tax_row_disposition' => 'test_value_base_weee_tax_row_disposition'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_weee_tax_row_disposition', $object->getBaseWeeeTaxRowDisposition());
+    }
+
+    public function testGetCreatedAt()
+    {
+        $data = ['created_at' => 'test_value_created_at'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_created_at', $object->getCreatedAt());
+    }
+
+    public function testGetDescription()
+    {
+        $data = ['description' => 'test_value_description'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_description', $object->getDescription());
+    }
+
+    public function testGetDiscountAmount()
+    {
+        $data = ['discount_amount' => 'test_value_discount_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_discount_amount', $object->getDiscountAmount());
+    }
+
+    public function testGetDiscountInvoiced()
+    {
+        $data = ['discount_invoiced' => 'test_value_discount_invoiced'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_discount_invoiced', $object->getDiscountInvoiced());
+    }
+
+    public function testGetDiscountPercent()
+    {
+        $data = ['discount_percent' => 'test_value_discount_percent'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_discount_percent', $object->getDiscountPercent());
+    }
+
+    public function testGetDiscountRefunded()
+    {
+        $data = ['discount_refunded' => 'test_value_discount_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_discount_refunded', $object->getDiscountRefunded());
+    }
+
+    public function testGetEventId()
+    {
+        $data = ['event_id' => 'test_value_event_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_event_id', $object->getEventId());
+    }
+
+    public function testGetExtOrderItemId()
+    {
+        $data = ['ext_order_item_id' => 'test_value_ext_order_item_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_ext_order_item_id', $object->getExtOrderItemId());
+    }
+
+    public function testGetFreeShipping()
+    {
+        $data = ['free_shipping' => 'test_value_free_shipping'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_free_shipping', $object->getFreeShipping());
+    }
+
+    public function testGetGwBasePrice()
+    {
+        $data = ['gw_base_price' => 'test_value_gw_base_price'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_gw_base_price', $object->getGwBasePrice());
+    }
+
+    public function testGetGwBasePriceInvoiced()
+    {
+        $data = ['gw_base_price_invoiced' => 'test_value_gw_base_price_invoiced'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_gw_base_price_invoiced', $object->getGwBasePriceInvoiced());
+    }
+
+    public function testGetGwBasePriceRefunded()
+    {
+        $data = ['gw_base_price_refunded' => 'test_value_gw_base_price_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_gw_base_price_refunded', $object->getGwBasePriceRefunded());
+    }
+
+    public function testGetGwBaseTaxAmount()
+    {
+        $data = ['gw_base_tax_amount' => 'test_value_gw_base_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_gw_base_tax_amount', $object->getGwBaseTaxAmount());
+    }
+
+    public function testGetGwBaseTaxAmountInvoiced()
+    {
+        $data = ['gw_base_tax_amount_invoiced' => 'test_value_gw_base_tax_amount_invoiced'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_gw_base_tax_amount_invoiced', $object->getGwBaseTaxAmountInvoiced());
+    }
+
+    public function testGetGwBaseTaxAmountRefunded()
+    {
+        $data = ['gw_base_tax_amount_refunded' => 'test_value_gw_base_tax_amount_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_gw_base_tax_amount_refunded', $object->getGwBaseTaxAmountRefunded());
+    }
+
+    public function testGetGwId()
+    {
+        $data = ['gw_id' => 'test_value_gw_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_gw_id', $object->getGwId());
+    }
+
+    public function testGetGwPrice()
+    {
+        $data = ['gw_price' => 'test_value_gw_price'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_gw_price', $object->getGwPrice());
+    }
+
+    public function testGetGwPriceInvoiced()
+    {
+        $data = ['gw_price_invoiced' => 'test_value_gw_price_invoiced'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_gw_price_invoiced', $object->getGwPriceInvoiced());
+    }
+
+    public function testGetGwPriceRefunded()
+    {
+        $data = ['gw_price_refunded' => 'test_value_gw_price_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_gw_price_refunded', $object->getGwPriceRefunded());
+    }
+
+    public function testGetGwTaxAmount()
+    {
+        $data = ['gw_tax_amount' => 'test_value_gw_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_gw_tax_amount', $object->getGwTaxAmount());
+    }
+
+    public function testGetGwTaxAmountInvoiced()
+    {
+        $data = ['gw_tax_amount_invoiced' => 'test_value_gw_tax_amount_invoiced'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_gw_tax_amount_invoiced', $object->getGwTaxAmountInvoiced());
+    }
+
+    public function testGetGwTaxAmountRefunded()
+    {
+        $data = ['gw_tax_amount_refunded' => 'test_value_gw_tax_amount_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_gw_tax_amount_refunded', $object->getGwTaxAmountRefunded());
+    }
+
+    public function testGetHiddenTaxAmount()
+    {
+        $data = ['hidden_tax_amount' => 'test_value_hidden_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_hidden_tax_amount', $object->getHiddenTaxAmount());
+    }
+
+    public function testGetHiddenTaxCanceled()
+    {
+        $data = ['hidden_tax_canceled' => 'test_value_hidden_tax_canceled'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_hidden_tax_canceled', $object->getHiddenTaxCanceled());
+    }
+
+    public function testGetHiddenTaxInvoiced()
+    {
+        $data = ['hidden_tax_invoiced' => 'test_value_hidden_tax_invoiced'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_hidden_tax_invoiced', $object->getHiddenTaxInvoiced());
+    }
+
+    public function testGetHiddenTaxRefunded()
+    {
+        $data = ['hidden_tax_refunded' => 'test_value_hidden_tax_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_hidden_tax_refunded', $object->getHiddenTaxRefunded());
+    }
+
+    public function testGetIsNominal()
+    {
+        $data = ['is_nominal' => 'test_value_is_nominal'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_is_nominal', $object->getIsNominal());
+    }
+
+    public function testGetIsQtyDecimal()
+    {
+        $data = ['is_qty_decimal' => 'test_value_is_qty_decimal'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_is_qty_decimal', $object->getIsQtyDecimal());
+    }
+
+    public function testGetIsVirtual()
+    {
+        $data = ['is_virtual' => 'test_value_is_virtual'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_is_virtual', $object->getIsVirtual());
+    }
+
+    public function testGetItemId()
+    {
+        $data = ['item_id' => 'test_value_item_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_item_id', $object->getItemId());
+    }
+
+    public function testGetLockedDoInvoice()
+    {
+        $data = ['locked_do_invoice' => 'test_value_locked_do_invoice'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_locked_do_invoice', $object->getLockedDoInvoice());
+    }
+
+    public function testGetLockedDoShip()
+    {
+        $data = ['locked_do_ship' => 'test_value_locked_do_ship'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_locked_do_ship', $object->getLockedDoShip());
+    }
+
+    public function testGetName()
+    {
+        $data = ['name' => 'test_value_name'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_name', $object->getName());
+    }
+
+    public function testGetNoDiscount()
+    {
+        $data = ['no_discount' => 'test_value_no_discount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_no_discount', $object->getNoDiscount());
+    }
+
+    public function testGetOrderId()
+    {
+        $data = ['order_id' => 'test_value_order_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_order_id', $object->getOrderId());
+    }
+
+    public function testGetOriginalPrice()
+    {
+        $data = ['original_price' => 'test_value_original_price'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_original_price', $object->getOriginalPrice());
+    }
+
+    public function testGetParentItemId()
+    {
+        $data = ['parent_item_id' => 'test_value_parent_item_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_parent_item_id', $object->getParentItemId());
+    }
+
+    public function testGetPrice()
+    {
+        $data = ['price' => 'test_value_price'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_price', $object->getPrice());
+    }
+
+    public function testGetPriceInclTax()
+    {
+        $data = ['price_incl_tax' => 'test_value_price_incl_tax'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_price_incl_tax', $object->getPriceInclTax());
+    }
+
+    public function testGetProductId()
+    {
+        $data = ['product_id' => 'test_value_product_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_product_id', $object->getProductId());
+    }
+
+    public function testGetProductOptions()
+    {
+        $data = ['product_options' => 'test_value_product_options'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_product_options', $object->getProductOptions());
+    }
+
+    public function testGetProductType()
+    {
+        $data = ['product_type' => 'test_value_product_type'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_product_type', $object->getProductType());
+    }
+
+    public function testGetQtyBackordered()
+    {
+        $data = ['qty_backordered' => 'test_value_qty_backordered'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_qty_backordered', $object->getQtyBackordered());
+    }
+
+    public function testGetQtyCanceled()
+    {
+        $data = ['qty_canceled' => 'test_value_qty_canceled'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_qty_canceled', $object->getQtyCanceled());
+    }
+
+    public function testGetQtyInvoiced()
+    {
+        $data = ['qty_invoiced' => 'test_value_qty_invoiced'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_qty_invoiced', $object->getQtyInvoiced());
+    }
+
+    public function testGetQtyOrdered()
+    {
+        $data = ['qty_ordered' => 'test_value_qty_ordered'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_qty_ordered', $object->getQtyOrdered());
+    }
+
+    public function testGetQtyRefunded()
+    {
+        $data = ['qty_refunded' => 'test_value_qty_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_qty_refunded', $object->getQtyRefunded());
+    }
+
+    public function testGetQtyReturned()
+    {
+        $data = ['qty_returned' => 'test_value_qty_returned'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_qty_returned', $object->getQtyReturned());
+    }
+
+    public function testGetQtyShipped()
+    {
+        $data = ['qty_shipped' => 'test_value_qty_shipped'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_qty_shipped', $object->getQtyShipped());
+    }
+
+    public function testGetQuoteItemId()
+    {
+        $data = ['quote_item_id' => 'test_value_quote_item_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_quote_item_id', $object->getQuoteItemId());
+    }
+
+    public function testGetRowInvoiced()
+    {
+        $data = ['row_invoiced' => 'test_value_row_invoiced'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_row_invoiced', $object->getRowInvoiced());
+    }
+
+    public function testGetRowTotal()
+    {
+        $data = ['row_total' => 'test_value_row_total'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_row_total', $object->getRowTotal());
+    }
+
+    public function testGetRowTotalInclTax()
+    {
+        $data = ['row_total_incl_tax' => 'test_value_row_total_incl_tax'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_row_total_incl_tax', $object->getRowTotalInclTax());
+    }
+
+    public function testGetRowWeight()
+    {
+        $data = ['row_weight' => 'test_value_row_weight'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_row_weight', $object->getRowWeight());
+    }
+
+    public function testGetSku()
+    {
+        $data = ['sku' => 'test_value_sku'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_sku', $object->getSku());
+    }
+
+    public function testGetStoreId()
+    {
+        $data = ['store_id' => 'test_value_store_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_store_id', $object->getStoreId());
+    }
+
+    public function testGetTaxAmount()
+    {
+        $data = ['tax_amount' => 'test_value_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_tax_amount', $object->getTaxAmount());
+    }
+
+    public function testGetTaxBeforeDiscount()
+    {
+        $data = ['tax_before_discount' => 'test_value_tax_before_discount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_tax_before_discount', $object->getTaxBeforeDiscount());
+    }
+
+    public function testGetTaxCanceled()
+    {
+        $data = ['tax_canceled' => 'test_value_tax_canceled'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_tax_canceled', $object->getTaxCanceled());
+    }
+
+    public function testGetTaxInvoiced()
+    {
+        $data = ['tax_invoiced' => 'test_value_tax_invoiced'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_tax_invoiced', $object->getTaxInvoiced());
+    }
+
+    public function testGetTaxPercent()
+    {
+        $data = ['tax_percent' => 'test_value_tax_percent'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_tax_percent', $object->getTaxPercent());
+    }
+
+    public function testGetTaxRefunded()
+    {
+        $data = ['tax_refunded' => 'test_value_tax_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_tax_refunded', $object->getTaxRefunded());
+    }
+
+    public function testGetUpdatedAt()
+    {
+        $data = ['updated_at' => 'test_value_updated_at'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_updated_at', $object->getUpdatedAt());
+    }
+
+    public function testGetWeeeTaxApplied()
+    {
+        $data = ['weee_tax_applied' => 'test_value_weee_tax_applied'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_weee_tax_applied', $object->getWeeeTaxApplied());
+    }
+
+    public function testGetWeeeTaxAppliedAmount()
+    {
+        $data = ['weee_tax_applied_amount' => 'test_value_weee_tax_applied_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_weee_tax_applied_amount', $object->getWeeeTaxAppliedAmount());
+    }
+
+    public function testGetWeeeTaxAppliedRowAmount()
+    {
+        $data = ['weee_tax_applied_row_amount' => 'test_value_weee_tax_applied_row_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_weee_tax_applied_row_amount', $object->getWeeeTaxAppliedRowAmount());
+    }
+
+    public function testGetWeeeTaxDisposition()
+    {
+        $data = ['weee_tax_disposition' => 'test_value_weee_tax_disposition'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_weee_tax_disposition', $object->getWeeeTaxDisposition());
+    }
+
+    public function testGetWeeeTaxRowDisposition()
+    {
+        $data = ['weee_tax_row_disposition' => 'test_value_weee_tax_row_disposition'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_weee_tax_row_disposition', $object->getWeeeTaxRowDisposition());
+    }
+
+    public function testGetWeight()
+    {
+        $data = ['weight' => 'test_value_weight'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_weight', $object->getWeight());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/OrderMapperTest.php b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/OrderMapperTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..e7a552ef7a12d4e81cf57b754d5f23fc48b84083
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/OrderMapperTest.php
@@ -0,0 +1,198 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Data;
+
+/**
+ * Class OrderGetTest
+ */
+class OrderMapperTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Sales\Service\V1\Data\OrderMapper
+     */
+    protected $orderMapper;
+    /**
+     * @var \Magento\Sales\Service\V1\Data\OrderBuilder|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderBuilderMock;
+    /**
+     * @var \Magento\Sales\Service\V1\Data\OrderItemMapper|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderItemMapperMock;
+    /**
+     * @var \Magento\Sales\Service\V1\Data\OrderPaymentMapper|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderPaymentMapperMock;
+    /**
+     * @var \Magento\Sales\Service\V1\Data\OrderAddressMapper|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderAddressMapperMock;
+    /**
+     * @var \Magento\Sales\Model\Order|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderMock;
+    /**
+     * @var \Magento\Sales\Model\Order\Item|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderItemMock;
+    /**
+     * @var \Magento\Sales\Model\Order\Payment|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderPaymentMock;
+    /**
+     * @var \Magento\Sales\Model\Order\Address|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderAddressMock;
+    /**
+     * @var \Magento\Sales\Service\V1\Data\Order|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $dataObjectMock;
+
+    /**
+     * SetUp
+     */
+    protected function setUp()
+    {
+        $this->orderBuilderMock = $this->getMock(
+            'Magento\Sales\Service\V1\Data\OrderBuilder',
+            ['populateWithArray', 'setItems', 'setPayments', 'setBillingAddress', 'setShippingAddress', 'create'],
+            [],
+            '',
+            false
+        );
+        $this->orderItemMapperMock = $this->getMock(
+            'Magento\Sales\Service\V1\Data\OrderItemMapper',
+            ['extractDto'],
+            [],
+            '',
+            false
+        );
+        $this->orderPaymentMapperMock = $this->getMock(
+            'Magento\Sales\Service\V1\Data\OrderPaymentMapper',
+            ['extractDto'],
+            [],
+            '',
+            false
+        );
+        $this->orderAddressMapperMock = $this->getMock(
+            'Magento\Sales\Service\V1\Data\OrderAddressMapper',
+            ['extractDto'],
+            [],
+            '',
+            false
+        );
+        $this->orderMock = $this->getMock(
+            'Magento\Sales\Model\Order',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->orderItemMock = $this->getMock(
+            'Magento\Sales\Model\Order\Item',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->orderPaymentMock = $this->getMock(
+            'Magento\Sales\Model\Order\Payment',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->orderAddressMock = $this->getMock(
+            'Magento\Sales\Model\Order\Address',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->orderMapper = new \Magento\Sales\Service\V1\Data\OrderMapper(
+            $this->orderBuilderMock,
+            $this->orderItemMapperMock,
+            $this->orderPaymentMapperMock,
+            $this->orderAddressMapperMock
+        );
+    }
+
+    /**
+     * test order mapper
+     */
+    public function testInvoke()
+    {
+        $this->orderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue(['field-1' => 'value-1']));
+        $this->orderMock->expects($this->once())
+            ->method('getItemsCollection')
+            ->will($this->returnValue([$this->orderItemMock]));
+        $this->orderMock->expects($this->once())
+            ->method('getPaymentsCollection')
+            ->will($this->returnValue([$this->orderPaymentMock]));
+        $this->orderMock->expects($this->exactly(2))
+            ->method('getBillingAddress')
+            ->will($this->returnValue($this->orderAddressMock));
+        $this->orderMock->expects($this->exactly(2))
+            ->method('getShippingAddress')
+            ->will($this->returnValue($this->orderAddressMock));
+        $this->orderBuilderMock->expects($this->once())
+            ->method('populateWithArray')
+            ->with($this->equalTo(['field-1' => 'value-1']))
+            ->will($this->returnSelf());
+        $this->orderItemMapperMock->expects($this->once())
+            ->method('extractDto')
+            ->with($this->equalTo($this->orderItemMock))
+            ->will($this->returnValue('item-1'));
+        $this->orderPaymentMapperMock->expects($this->once())
+            ->method('extractDto')
+            ->with($this->equalTo($this->orderPaymentMock))
+            ->will($this->returnValue('payment-1'));
+        $this->orderAddressMapperMock->expects($this->exactly(2))
+            ->method('extractDto')
+            ->with($this->equalTo($this->orderAddressMock))
+            ->will($this->returnValue('address-1'));
+        $this->orderBuilderMock->expects($this->once())
+            ->method('setItems')
+            ->with($this->equalTo(['item-1']))
+            ->will($this->returnSelf());
+        $this->orderBuilderMock->expects($this->once())
+            ->method('setPayments')
+            ->with($this->equalTo(['payment-1']))
+            ->will($this->returnSelf());
+        $this->orderBuilderMock->expects($this->once())
+            ->method('setBillingAddress')
+            ->with($this->equalTo('address-1'))
+            ->will($this->returnSelf());
+        $this->orderBuilderMock->expects($this->once())
+            ->method('setShippingAddress')
+            ->with($this->equalTo('address-1'))
+            ->will($this->returnSelf());
+        $this->orderBuilderMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue('data-object-with-order'));
+        $this->assertEquals('data-object-with-order', $this->orderMapper->extractDto($this->orderMock));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/OrderPaymentTest.php b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/OrderPaymentTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..2915d122dd8aa9bcf0a82f33adfa14ad975f2b38
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/OrderPaymentTest.php
@@ -0,0 +1,897 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Data;
+
+/**
+ * Class OrderPaymentTest
+ *
+ * @SuppressWarnings(PHPMD.ExcessivePublicCount)
+ * @package Magento\Sales\Service\V1\Data
+ */
+class OrderPaymentTest extends \PHPUnit_Framework_TestCase
+{
+    public function testGetAccountStatus()
+    {
+        $data = ['account_status' => 'test_value_account_status'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_account_status', $object->getAccountStatus());
+    }
+
+    public function testGetAdditionalData()
+    {
+        $data = ['additional_data' => 'test_value_additional_data'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_additional_data', $object->getAdditionalData());
+    }
+
+    public function testGetAdditionalInformation()
+    {
+        $data = ['additional_information' => 'test_value_additional_information'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_additional_information', $object->getAdditionalInformation());
+    }
+
+    public function testGetAddressStatus()
+    {
+        $data = ['address_status' => 'test_value_address_status'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_address_status', $object->getAddressStatus());
+    }
+
+    public function testGetAmountAuthorized()
+    {
+        $data = ['amount_authorized' => 'test_value_amount_authorized'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_amount_authorized', $object->getAmountAuthorized());
+    }
+
+    public function testGetAmountCanceled()
+    {
+        $data = ['amount_canceled' => 'test_value_amount_canceled'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_amount_canceled', $object->getAmountCanceled());
+    }
+
+    public function testGetAmountOrdered()
+    {
+        $data = ['amount_ordered' => 'test_value_amount_ordered'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_amount_ordered', $object->getAmountOrdered());
+    }
+
+    public function testGetAmountPaid()
+    {
+        $data = ['amount_paid' => 'test_value_amount_paid'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_amount_paid', $object->getAmountPaid());
+    }
+
+    public function testGetAmountRefunded()
+    {
+        $data = ['amount_refunded' => 'test_value_amount_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_amount_refunded', $object->getAmountRefunded());
+    }
+
+    public function testGetAnetTransMethod()
+    {
+        $data = ['anet_trans_method' => 'test_value_anet_trans_method'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_anet_trans_method', $object->getAnetTransMethod());
+    }
+
+    public function testGetBaseAmountAuthorized()
+    {
+        $data = ['base_amount_authorized' => 'test_value_base_amount_authorized'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_amount_authorized', $object->getBaseAmountAuthorized());
+    }
+
+    public function testGetBaseAmountCanceled()
+    {
+        $data = ['base_amount_canceled' => 'test_value_base_amount_canceled'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_amount_canceled', $object->getBaseAmountCanceled());
+    }
+
+    public function testGetBaseAmountOrdered()
+    {
+        $data = ['base_amount_ordered' => 'test_value_base_amount_ordered'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_amount_ordered', $object->getBaseAmountOrdered());
+    }
+
+    public function testGetBaseAmountPaid()
+    {
+        $data = ['base_amount_paid' => 'test_value_base_amount_paid'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_amount_paid', $object->getBaseAmountPaid());
+    }
+
+    public function testGetBaseAmountPaidOnline()
+    {
+        $data = ['base_amount_paid_online' => 'test_value_base_amount_paid_online'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_amount_paid_online', $object->getBaseAmountPaidOnline());
+    }
+
+    public function testGetBaseAmountRefunded()
+    {
+        $data = ['base_amount_refunded' => 'test_value_base_amount_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_amount_refunded', $object->getBaseAmountRefunded());
+    }
+
+    public function testGetBaseAmountRefundedOnline()
+    {
+        $data = ['base_amount_refunded_online' => 'test_value_base_amount_refunded_online'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_amount_refunded_online', $object->getBaseAmountRefundedOnline());
+    }
+
+    public function testGetBaseShippingAmount()
+    {
+        $data = ['base_shipping_amount' => 'test_value_base_shipping_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_shipping_amount', $object->getBaseShippingAmount());
+    }
+
+    public function testGetBaseShippingCaptured()
+    {
+        $data = ['base_shipping_captured' => 'test_value_base_shipping_captured'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_shipping_captured', $object->getBaseShippingCaptured());
+    }
+
+    public function testGetBaseShippingRefunded()
+    {
+        $data = ['base_shipping_refunded' => 'test_value_base_shipping_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_shipping_refunded', $object->getBaseShippingRefunded());
+    }
+
+    public function testGetCcApproval()
+    {
+        $data = ['cc_approval' => 'test_value_cc_approval'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_cc_approval', $object->getCcApproval());
+    }
+
+    public function testGetCcAvsStatus()
+    {
+        $data = ['cc_avs_status' => 'test_value_cc_avs_status'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_cc_avs_status', $object->getCcAvsStatus());
+    }
+
+    public function testGetCcCidStatus()
+    {
+        $data = ['cc_cid_status' => 'test_value_cc_cid_status'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_cc_cid_status', $object->getCcCidStatus());
+    }
+
+    public function testGetCcDebugRequestBody()
+    {
+        $data = ['cc_debug_request_body' => 'test_value_cc_debug_request_body'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_cc_debug_request_body', $object->getCcDebugRequestBody());
+    }
+
+    public function testGetCcDebugResponseBody()
+    {
+        $data = ['cc_debug_response_body' => 'test_value_cc_debug_response_body'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_cc_debug_response_body', $object->getCcDebugResponseBody());
+    }
+
+    public function testGetCcDebugResponseSerialized()
+    {
+        $data = ['cc_debug_response_serialized' => 'test_value_cc_debug_response_serialized'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_cc_debug_response_serialized', $object->getCcDebugResponseSerialized());
+    }
+
+    public function testGetCcExpMonth()
+    {
+        $data = ['cc_exp_month' => 'test_value_cc_exp_month'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_cc_exp_month', $object->getCcExpMonth());
+    }
+
+    public function testGetCcExpYear()
+    {
+        $data = ['cc_exp_year' => 'test_value_cc_exp_year'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_cc_exp_year', $object->getCcExpYear());
+    }
+
+    public function testGetCcLast4()
+    {
+        $data = ['cc_last4' => 'test_value_cc_last4'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_cc_last4', $object->getCcLast4());
+    }
+
+    public function testGetCcNumberEnc()
+    {
+        $data = ['cc_number_enc' => 'test_value_cc_number_enc'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_cc_number_enc', $object->getCcNumberEnc());
+    }
+
+    public function testGetCcOwner()
+    {
+        $data = ['cc_owner' => 'test_value_cc_owner'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_cc_owner', $object->getCcOwner());
+    }
+
+    public function testGetCcSecureVerify()
+    {
+        $data = ['cc_secure_verify' => 'test_value_cc_secure_verify'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_cc_secure_verify', $object->getCcSecureVerify());
+    }
+
+    public function testGetCcSsIssue()
+    {
+        $data = ['cc_ss_issue' => 'test_value_cc_ss_issue'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_cc_ss_issue', $object->getCcSsIssue());
+    }
+
+    public function testGetCcSsStartMonth()
+    {
+        $data = ['cc_ss_start_month' => 'test_value_cc_ss_start_month'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_cc_ss_start_month', $object->getCcSsStartMonth());
+    }
+
+    public function testGetCcSsStartYear()
+    {
+        $data = ['cc_ss_start_year' => 'test_value_cc_ss_start_year'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_cc_ss_start_year', $object->getCcSsStartYear());
+    }
+
+    public function testGetCcStatus()
+    {
+        $data = ['cc_status' => 'test_value_cc_status'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_cc_status', $object->getCcStatus());
+    }
+
+    public function testGetCcStatusDescription()
+    {
+        $data = ['cc_status_description' => 'test_value_cc_status_description'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_cc_status_description', $object->getCcStatusDescription());
+    }
+
+    public function testGetCcTransId()
+    {
+        $data = ['cc_trans_id' => 'test_value_cc_trans_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_cc_trans_id', $object->getCcTransId());
+    }
+
+    public function testGetCcType()
+    {
+        $data = ['cc_type' => 'test_value_cc_type'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_cc_type', $object->getCcType());
+    }
+
+    public function testGetEcheckAccountName()
+    {
+        $data = ['echeck_account_name' => 'test_value_echeck_account_name'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_echeck_account_name', $object->getEcheckAccountName());
+    }
+
+    public function testGetEcheckAccountType()
+    {
+        $data = ['echeck_account_type' => 'test_value_echeck_account_type'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_echeck_account_type', $object->getEcheckAccountType());
+    }
+
+    public function testGetEcheckBankName()
+    {
+        $data = ['echeck_bank_name' => 'test_value_echeck_bank_name'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_echeck_bank_name', $object->getEcheckBankName());
+    }
+
+    public function testGetEcheckRoutingNumber()
+    {
+        $data = ['echeck_routing_number' => 'test_value_echeck_routing_number'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_echeck_routing_number', $object->getEcheckRoutingNumber());
+    }
+
+    public function testGetEcheckType()
+    {
+        $data = ['echeck_type' => 'test_value_echeck_type'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_echeck_type', $object->getEcheckType());
+    }
+
+    public function testGetEntityId()
+    {
+        $data = ['entity_id' => 'test_value_entity_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_entity_id', $object->getEntityId());
+    }
+
+    public function testGetLastTransId()
+    {
+        $data = ['last_trans_id' => 'test_value_last_trans_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_last_trans_id', $object->getLastTransId());
+    }
+
+    public function testGetMethod()
+    {
+        $data = ['method' => 'test_value_method'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_method', $object->getMethod());
+    }
+
+    public function testGetParentId()
+    {
+        $data = ['parent_id' => 'test_value_parent_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_parent_id', $object->getParentId());
+    }
+
+    public function testGetPoNumber()
+    {
+        $data = ['po_number' => 'test_value_po_number'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_po_number', $object->getPoNumber());
+    }
+
+    public function testGetProtectionEligibility()
+    {
+        $data = ['protection_eligibility' => 'test_value_protection_eligibility'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_protection_eligibility', $object->getProtectionEligibility());
+    }
+
+    public function testGetQuotePaymentId()
+    {
+        $data = ['quote_payment_id' => 'test_value_quote_payment_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_quote_payment_id', $object->getQuotePaymentId());
+    }
+
+    public function testGetShippingAmount()
+    {
+        $data = ['shipping_amount' => 'test_value_shipping_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_shipping_amount', $object->getShippingAmount());
+    }
+
+    public function testGetShippingCaptured()
+    {
+        $data = ['shipping_captured' => 'test_value_shipping_captured'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_shipping_captured', $object->getShippingCaptured());
+    }
+
+    public function testGetShippingRefunded()
+    {
+        $data = ['shipping_refunded' => 'test_value_shipping_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderPayment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_shipping_refunded', $object->getShippingRefunded());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/OrderStatusHistoryTest.php b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/OrderStatusHistoryTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..6b75f0147805f78b9e0c94214c6b2adab09e3b0c
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/OrderStatusHistoryTest.php
@@ -0,0 +1,155 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Data;
+
+class OrderStatusHistoryTest extends \PHPUnit_Framework_TestCase
+{
+    public function testGetComment()
+    {
+        $data = ['comment' => 'test_value_comment'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderStatusHistory($abstractBuilderMock);
+
+        $this->assertEquals('test_value_comment', $object->getComment());
+    }
+
+    public function testGetCreatedAt()
+    {
+        $data = ['created_at' => 'test_value_created_at'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderStatusHistory($abstractBuilderMock);
+
+        $this->assertEquals('test_value_created_at', $object->getCreatedAt());
+    }
+
+    public function testGetEntityId()
+    {
+        $data = ['entity_id' => 'test_value_entity_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderStatusHistory($abstractBuilderMock);
+
+        $this->assertEquals('test_value_entity_id', $object->getEntityId());
+    }
+
+    public function testGetEntityName()
+    {
+        $data = ['entity_name' => 'test_value_entity_name'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderStatusHistory($abstractBuilderMock);
+
+        $this->assertEquals('test_value_entity_name', $object->getEntityName());
+    }
+
+    public function testGetIsCustomerNotified()
+    {
+        $data = ['is_customer_notified' => 'test_value_is_customer_notified'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderStatusHistory($abstractBuilderMock);
+
+        $this->assertEquals('test_value_is_customer_notified', $object->getIsCustomerNotified());
+    }
+
+    public function testGetIsVisibleOnFront()
+    {
+        $data = ['is_visible_on_front' => 'test_value_is_visible_on_front'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderStatusHistory($abstractBuilderMock);
+
+        $this->assertEquals('test_value_is_visible_on_front', $object->getIsVisibleOnFront());
+    }
+
+    public function testGetParentId()
+    {
+        $data = ['parent_id' => 'test_value_parent_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderStatusHistory($abstractBuilderMock);
+
+        $this->assertEquals('test_value_parent_id', $object->getParentId());
+    }
+
+    public function testGetStatus()
+    {
+        $data = ['status' => 'test_value_status'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\OrderStatusHistory($abstractBuilderMock);
+
+        $this->assertEquals('test_value_status', $object->getStatus());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/OrderTest.php b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/OrderTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b4707dcacebedb46c0e78661c65a98614b0eeff1
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/OrderTest.php
@@ -0,0 +1,2242 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Data;
+
+/**
+ * Class OrderTest
+ *
+ * @SuppressWarnings(PHPMD.ExcessivePublicCount)
+ * @SuppressWarnings(PHPMD.ExcessiveClassComplexity)
+ * @package Magento\Sales\Service\V1\Data
+ */
+class OrderTest extends \PHPUnit_Framework_TestCase
+{
+    public function testGetAdjustmentNegative()
+    {
+        $data = ['adjustment_negative' => 'test_value_adjustment_negative'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_adjustment_negative', $object->getAdjustmentNegative());
+    }
+
+    public function testGetAdjustmentPositive()
+    {
+        $data = ['adjustment_positive' => 'test_value_adjustment_positive'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_adjustment_positive', $object->getAdjustmentPositive());
+    }
+
+    public function testGetAppliedRuleIds()
+    {
+        $data = ['applied_rule_ids' => 'test_value_applied_rule_ids'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_applied_rule_ids', $object->getAppliedRuleIds());
+    }
+
+    public function testGetBaseAdjustmentNegative()
+    {
+        $data = ['base_adjustment_negative' => 'test_value_base_adjustment_negative'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_adjustment_negative', $object->getBaseAdjustmentNegative());
+    }
+
+    public function testGetBaseAdjustmentPositive()
+    {
+        $data = ['base_adjustment_positive' => 'test_value_base_adjustment_positive'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_adjustment_positive', $object->getBaseAdjustmentPositive());
+    }
+
+    public function testGetBaseCurrencyCode()
+    {
+        $data = ['base_currency_code' => 'test_value_base_currency_code'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_currency_code', $object->getBaseCurrencyCode());
+    }
+
+    public function testGetBaseDiscountAmount()
+    {
+        $data = ['base_discount_amount' => 'test_value_base_discount_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_discount_amount', $object->getBaseDiscountAmount());
+    }
+
+    public function testGetBaseDiscountCanceled()
+    {
+        $data = ['base_discount_canceled' => 'test_value_base_discount_canceled'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_discount_canceled', $object->getBaseDiscountCanceled());
+    }
+
+    public function testGetBaseDiscountInvoiced()
+    {
+        $data = ['base_discount_invoiced' => 'test_value_base_discount_invoiced'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_discount_invoiced', $object->getBaseDiscountInvoiced());
+    }
+
+    public function testGetBaseDiscountRefunded()
+    {
+        $data = ['base_discount_refunded' => 'test_value_base_discount_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_discount_refunded', $object->getBaseDiscountRefunded());
+    }
+
+    public function testGetBaseGrandTotal()
+    {
+        $data = ['base_grand_total' => 'test_value_base_grand_total'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_grand_total', $object->getBaseGrandTotal());
+    }
+
+    public function testGetBaseHiddenTaxAmount()
+    {
+        $data = ['base_hidden_tax_amount' => 'test_value_base_hidden_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_hidden_tax_amount', $object->getBaseHiddenTaxAmount());
+    }
+
+    public function testGetBaseHiddenTaxInvoiced()
+    {
+        $data = ['base_hidden_tax_invoiced' => 'test_value_base_hidden_tax_invoiced'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_hidden_tax_invoiced', $object->getBaseHiddenTaxInvoiced());
+    }
+
+    public function testGetBaseHiddenTaxRefunded()
+    {
+        $data = ['base_hidden_tax_refunded' => 'test_value_base_hidden_tax_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_hidden_tax_refunded', $object->getBaseHiddenTaxRefunded());
+    }
+
+    public function testGetBaseShippingAmount()
+    {
+        $data = ['base_shipping_amount' => 'test_value_base_shipping_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_shipping_amount', $object->getBaseShippingAmount());
+    }
+
+    public function testGetBaseShippingCanceled()
+    {
+        $data = ['base_shipping_canceled' => 'test_value_base_shipping_canceled'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_shipping_canceled', $object->getBaseShippingCanceled());
+    }
+
+    public function testGetBaseShippingDiscountAmount()
+    {
+        $data = ['base_shipping_discount_amount' => 'test_value_base_shipping_discount_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_shipping_discount_amount', $object->getBaseShippingDiscountAmount());
+    }
+
+    public function testGetBaseShippingHiddenTaxAmnt()
+    {
+        $data = ['base_shipping_hidden_tax_amnt' => 'test_value_base_shipping_hidden_tax_amnt'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_shipping_hidden_tax_amnt', $object->getBaseShippingHiddenTaxAmnt());
+    }
+
+    public function testGetBaseShippingInclTax()
+    {
+        $data = ['base_shipping_incl_tax' => 'test_value_base_shipping_incl_tax'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_shipping_incl_tax', $object->getBaseShippingInclTax());
+    }
+
+    public function testGetBaseShippingInvoiced()
+    {
+        $data = ['base_shipping_invoiced' => 'test_value_base_shipping_invoiced'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_shipping_invoiced', $object->getBaseShippingInvoiced());
+    }
+
+    public function testGetBaseShippingRefunded()
+    {
+        $data = ['base_shipping_refunded' => 'test_value_base_shipping_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_shipping_refunded', $object->getBaseShippingRefunded());
+    }
+
+    public function testGetBaseShippingTaxAmount()
+    {
+        $data = ['base_shipping_tax_amount' => 'test_value_base_shipping_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_shipping_tax_amount', $object->getBaseShippingTaxAmount());
+    }
+
+    public function testGetBaseShippingTaxRefunded()
+    {
+        $data = ['base_shipping_tax_refunded' => 'test_value_base_shipping_tax_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_shipping_tax_refunded', $object->getBaseShippingTaxRefunded());
+    }
+
+    public function testGetBaseSubtotal()
+    {
+        $data = ['base_subtotal' => 'test_value_base_subtotal'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_subtotal', $object->getBaseSubtotal());
+    }
+
+    public function testGetBaseSubtotalCanceled()
+    {
+        $data = ['base_subtotal_canceled' => 'test_value_base_subtotal_canceled'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_subtotal_canceled', $object->getBaseSubtotalCanceled());
+    }
+
+    public function testGetBaseSubtotalInclTax()
+    {
+        $data = ['base_subtotal_incl_tax' => 'test_value_base_subtotal_incl_tax'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_subtotal_incl_tax', $object->getBaseSubtotalInclTax());
+    }
+
+    public function testGetBaseSubtotalInvoiced()
+    {
+        $data = ['base_subtotal_invoiced' => 'test_value_base_subtotal_invoiced'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_subtotal_invoiced', $object->getBaseSubtotalInvoiced());
+    }
+
+    public function testGetBaseSubtotalRefunded()
+    {
+        $data = ['base_subtotal_refunded' => 'test_value_base_subtotal_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_subtotal_refunded', $object->getBaseSubtotalRefunded());
+    }
+
+    public function testGetBaseTaxAmount()
+    {
+        $data = ['base_tax_amount' => 'test_value_base_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_tax_amount', $object->getBaseTaxAmount());
+    }
+
+    public function testGetBaseTaxCanceled()
+    {
+        $data = ['base_tax_canceled' => 'test_value_base_tax_canceled'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_tax_canceled', $object->getBaseTaxCanceled());
+    }
+
+    public function testGetBaseTaxInvoiced()
+    {
+        $data = ['base_tax_invoiced' => 'test_value_base_tax_invoiced'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_tax_invoiced', $object->getBaseTaxInvoiced());
+    }
+
+    public function testGetBaseTaxRefunded()
+    {
+        $data = ['base_tax_refunded' => 'test_value_base_tax_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_tax_refunded', $object->getBaseTaxRefunded());
+    }
+
+    public function testGetBaseTotalCanceled()
+    {
+        $data = ['base_total_canceled' => 'test_value_base_total_canceled'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_total_canceled', $object->getBaseTotalCanceled());
+    }
+
+    public function testGetBaseTotalDue()
+    {
+        $data = ['base_total_due' => 'test_value_base_total_due'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_total_due', $object->getBaseTotalDue());
+    }
+
+    public function testGetBaseTotalInvoiced()
+    {
+        $data = ['base_total_invoiced' => 'test_value_base_total_invoiced'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_total_invoiced', $object->getBaseTotalInvoiced());
+    }
+
+    public function testGetBaseTotalInvoicedCost()
+    {
+        $data = ['base_total_invoiced_cost' => 'test_value_base_total_invoiced_cost'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_total_invoiced_cost', $object->getBaseTotalInvoicedCost());
+    }
+
+    public function testGetBaseTotalOfflineRefunded()
+    {
+        $data = ['base_total_offline_refunded' => 'test_value_base_total_offline_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_total_offline_refunded', $object->getBaseTotalOfflineRefunded());
+    }
+
+    public function testGetBaseTotalOnlineRefunded()
+    {
+        $data = ['base_total_online_refunded' => 'test_value_base_total_online_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_total_online_refunded', $object->getBaseTotalOnlineRefunded());
+    }
+
+    public function testGetBaseTotalPaid()
+    {
+        $data = ['base_total_paid' => 'test_value_base_total_paid'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_total_paid', $object->getBaseTotalPaid());
+    }
+
+    public function testGetBaseTotalQtyOrdered()
+    {
+        $data = ['base_total_qty_ordered' => 'test_value_base_total_qty_ordered'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_total_qty_ordered', $object->getBaseTotalQtyOrdered());
+    }
+
+    public function testGetBaseTotalRefunded()
+    {
+        $data = ['base_total_refunded' => 'test_value_base_total_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_total_refunded', $object->getBaseTotalRefunded());
+    }
+
+    public function testGetBaseToGlobalRate()
+    {
+        $data = ['base_to_global_rate' => 'test_value_base_to_global_rate'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_to_global_rate', $object->getBaseToGlobalRate());
+    }
+
+    public function testGetBaseToOrderRate()
+    {
+        $data = ['base_to_order_rate' => 'test_value_base_to_order_rate'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_base_to_order_rate', $object->getBaseToOrderRate());
+    }
+
+    public function testGetBillingAddressId()
+    {
+        $data = ['billing_address_id' => 'test_value_billing_address_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_billing_address_id', $object->getBillingAddressId());
+    }
+
+    public function testGetCanShipPartially()
+    {
+        $data = ['can_ship_partially' => 'test_value_can_ship_partially'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_can_ship_partially', $object->getCanShipPartially());
+    }
+
+    public function testGetCanShipPartiallyItem()
+    {
+        $data = ['can_ship_partially_item' => 'test_value_can_ship_partially_item'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_can_ship_partially_item', $object->getCanShipPartiallyItem());
+    }
+
+    public function testGetCouponCode()
+    {
+        $data = ['coupon_code' => 'test_value_coupon_code'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_coupon_code', $object->getCouponCode());
+    }
+
+    public function testGetCreatedAt()
+    {
+        $data = ['created_at' => 'test_value_created_at'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_created_at', $object->getCreatedAt());
+    }
+
+    public function testGetCustomerDob()
+    {
+        $data = ['customer_dob' => 'test_value_customer_dob'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_customer_dob', $object->getCustomerDob());
+    }
+
+    public function testGetCustomerEmail()
+    {
+        $data = ['customer_email' => 'test_value_customer_email'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_customer_email', $object->getCustomerEmail());
+    }
+
+    public function testGetCustomerFirstname()
+    {
+        $data = ['customer_firstname' => 'test_value_customer_firstname'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_customer_firstname', $object->getCustomerFirstname());
+    }
+
+    public function testGetCustomerGender()
+    {
+        $data = ['customer_gender' => 'test_value_customer_gender'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_customer_gender', $object->getCustomerGender());
+    }
+
+    public function testGetCustomerGroupId()
+    {
+        $data = ['customer_group_id' => 'test_value_customer_group_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_customer_group_id', $object->getCustomerGroupId());
+    }
+
+    public function testGetCustomerId()
+    {
+        $data = ['customer_id' => 'test_value_customer_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_customer_id', $object->getCustomerId());
+    }
+
+    public function testGetCustomerIsGuest()
+    {
+        $data = ['customer_is_guest' => 'test_value_customer_is_guest'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_customer_is_guest', $object->getCustomerIsGuest());
+    }
+
+    public function testGetCustomerLastname()
+    {
+        $data = ['customer_lastname' => 'test_value_customer_lastname'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_customer_lastname', $object->getCustomerLastname());
+    }
+
+    public function testGetCustomerMiddlename()
+    {
+        $data = ['customer_middlename' => 'test_value_customer_middlename'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_customer_middlename', $object->getCustomerMiddlename());
+    }
+
+    public function testGetCustomerNote()
+    {
+        $data = ['customer_note' => 'test_value_customer_note'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_customer_note', $object->getCustomerNote());
+    }
+
+    public function testGetCustomerNoteNotify()
+    {
+        $data = ['customer_note_notify' => 'test_value_customer_note_notify'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_customer_note_notify', $object->getCustomerNoteNotify());
+    }
+
+    public function testGetCustomerPrefix()
+    {
+        $data = ['customer_prefix' => 'test_value_customer_prefix'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_customer_prefix', $object->getCustomerPrefix());
+    }
+
+    public function testGetCustomerSuffix()
+    {
+        $data = ['customer_suffix' => 'test_value_customer_suffix'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_customer_suffix', $object->getCustomerSuffix());
+    }
+
+    public function testGetCustomerTaxvat()
+    {
+        $data = ['customer_taxvat' => 'test_value_customer_taxvat'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_customer_taxvat', $object->getCustomerTaxvat());
+    }
+
+    public function testGetDiscountAmount()
+    {
+        $data = ['discount_amount' => 'test_value_discount_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_discount_amount', $object->getDiscountAmount());
+    }
+
+    public function testGetDiscountCanceled()
+    {
+        $data = ['discount_canceled' => 'test_value_discount_canceled'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_discount_canceled', $object->getDiscountCanceled());
+    }
+
+    public function testGetDiscountDescription()
+    {
+        $data = ['discount_description' => 'test_value_discount_description'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_discount_description', $object->getDiscountDescription());
+    }
+
+    public function testGetDiscountInvoiced()
+    {
+        $data = ['discount_invoiced' => 'test_value_discount_invoiced'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_discount_invoiced', $object->getDiscountInvoiced());
+    }
+
+    public function testGetDiscountRefunded()
+    {
+        $data = ['discount_refunded' => 'test_value_discount_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_discount_refunded', $object->getDiscountRefunded());
+    }
+
+    public function testGetEditIncrement()
+    {
+        $data = ['edit_increment' => 'test_value_edit_increment'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_edit_increment', $object->getEditIncrement());
+    }
+
+    public function testGetEmailSent()
+    {
+        $data = ['email_sent' => 'test_value_email_sent'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_email_sent', $object->getEmailSent());
+    }
+
+    public function testGetEntityId()
+    {
+        $data = ['entity_id' => 'test_value_entity_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_entity_id', $object->getEntityId());
+    }
+
+    public function testGetExtCustomerId()
+    {
+        $data = ['ext_customer_id' => 'test_value_ext_customer_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_ext_customer_id', $object->getExtCustomerId());
+    }
+
+    public function testGetExtOrderId()
+    {
+        $data = ['ext_order_id' => 'test_value_ext_order_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_ext_order_id', $object->getExtOrderId());
+    }
+
+    public function testGetForcedShipmentWithInvoice()
+    {
+        $data = ['forced_shipment_with_invoice' => 'test_value_forced_shipment_with_invoice'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_forced_shipment_with_invoice', $object->getForcedShipmentWithInvoice());
+    }
+
+    public function testGetGlobalCurrencyCode()
+    {
+        $data = ['global_currency_code' => 'test_value_global_currency_code'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_global_currency_code', $object->getGlobalCurrencyCode());
+    }
+
+    public function testGetGrandTotal()
+    {
+        $data = ['grand_total' => 'test_value_grand_total'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_grand_total', $object->getGrandTotal());
+    }
+
+    public function testGetHiddenTaxAmount()
+    {
+        $data = ['hidden_tax_amount' => 'test_value_hidden_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_hidden_tax_amount', $object->getHiddenTaxAmount());
+    }
+
+    public function testGetHiddenTaxInvoiced()
+    {
+        $data = ['hidden_tax_invoiced' => 'test_value_hidden_tax_invoiced'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_hidden_tax_invoiced', $object->getHiddenTaxInvoiced());
+    }
+
+    public function testGetHiddenTaxRefunded()
+    {
+        $data = ['hidden_tax_refunded' => 'test_value_hidden_tax_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_hidden_tax_refunded', $object->getHiddenTaxRefunded());
+    }
+
+    public function testGetHoldBeforeState()
+    {
+        $data = ['hold_before_state' => 'test_value_hold_before_state'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_hold_before_state', $object->getHoldBeforeState());
+    }
+
+    public function testGetHoldBeforeStatus()
+    {
+        $data = ['hold_before_status' => 'test_value_hold_before_status'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_hold_before_status', $object->getHoldBeforeStatus());
+    }
+
+    public function testGetIncrementId()
+    {
+        $data = ['increment_id' => 'test_value_increment_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_increment_id', $object->getIncrementId());
+    }
+
+    public function testGetIsVirtual()
+    {
+        $data = ['is_virtual' => 'test_value_is_virtual'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_is_virtual', $object->getIsVirtual());
+    }
+
+    public function testGetOrderCurrencyCode()
+    {
+        $data = ['order_currency_code' => 'test_value_order_currency_code'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_order_currency_code', $object->getOrderCurrencyCode());
+    }
+
+    public function testGetOriginalIncrementId()
+    {
+        $data = ['original_increment_id' => 'test_value_original_increment_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_original_increment_id', $object->getOriginalIncrementId());
+    }
+
+    public function testGetPaymentAuthorizationAmount()
+    {
+        $data = ['payment_authorization_amount' => 'test_value_payment_authorization_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_payment_authorization_amount', $object->getPaymentAuthorizationAmount());
+    }
+
+    public function testGetPaymentAuthExpiration()
+    {
+        $data = ['payment_auth_expiration' => 'test_value_payment_auth_expiration'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_payment_auth_expiration', $object->getPaymentAuthExpiration());
+    }
+
+    public function testGetProtectCode()
+    {
+        $data = ['protect_code' => 'test_value_protect_code'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_protect_code', $object->getProtectCode());
+    }
+
+    public function testGetQuoteAddressId()
+    {
+        $data = ['quote_address_id' => 'test_value_quote_address_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_quote_address_id', $object->getQuoteAddressId());
+    }
+
+    public function testGetQuoteId()
+    {
+        $data = ['quote_id' => 'test_value_quote_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_quote_id', $object->getQuoteId());
+    }
+
+    public function testGetRelationChildId()
+    {
+        $data = ['relation_child_id' => 'test_value_relation_child_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_relation_child_id', $object->getRelationChildId());
+    }
+
+    public function testGetRelationChildRealId()
+    {
+        $data = ['relation_child_real_id' => 'test_value_relation_child_real_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_relation_child_real_id', $object->getRelationChildRealId());
+    }
+
+    public function testGetRelationParentId()
+    {
+        $data = ['relation_parent_id' => 'test_value_relation_parent_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_relation_parent_id', $object->getRelationParentId());
+    }
+
+    public function testGetRelationParentRealId()
+    {
+        $data = ['relation_parent_real_id' => 'test_value_relation_parent_real_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_relation_parent_real_id', $object->getRelationParentRealId());
+    }
+
+    public function testGetRemoteIp()
+    {
+        $data = ['remote_ip' => 'test_value_remote_ip'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_remote_ip', $object->getRemoteIp());
+    }
+
+    public function testGetShippingAddressId()
+    {
+        $data = ['shipping_address_id' => 'test_value_shipping_address_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_shipping_address_id', $object->getShippingAddressId());
+    }
+
+    public function testGetShippingAmount()
+    {
+        $data = ['shipping_amount' => 'test_value_shipping_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_shipping_amount', $object->getShippingAmount());
+    }
+
+    public function testGetShippingCanceled()
+    {
+        $data = ['shipping_canceled' => 'test_value_shipping_canceled'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_shipping_canceled', $object->getShippingCanceled());
+    }
+
+    public function testGetShippingDescription()
+    {
+        $data = ['shipping_description' => 'test_value_shipping_description'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_shipping_description', $object->getShippingDescription());
+    }
+
+    public function testGetShippingDiscountAmount()
+    {
+        $data = ['shipping_discount_amount' => 'test_value_shipping_discount_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_shipping_discount_amount', $object->getShippingDiscountAmount());
+    }
+
+    public function testGetShippingHiddenTaxAmount()
+    {
+        $data = ['shipping_hidden_tax_amount' => 'test_value_shipping_hidden_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_shipping_hidden_tax_amount', $object->getShippingHiddenTaxAmount());
+    }
+
+    public function testGetShippingInclTax()
+    {
+        $data = ['shipping_incl_tax' => 'test_value_shipping_incl_tax'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_shipping_incl_tax', $object->getShippingInclTax());
+    }
+
+    public function testGetShippingInvoiced()
+    {
+        $data = ['shipping_invoiced' => 'test_value_shipping_invoiced'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_shipping_invoiced', $object->getShippingInvoiced());
+    }
+
+    public function testGetShippingMethod()
+    {
+        $data = ['shipping_method' => 'test_value_shipping_method'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_shipping_method', $object->getShippingMethod());
+    }
+
+    public function testGetShippingRefunded()
+    {
+        $data = ['shipping_refunded' => 'test_value_shipping_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_shipping_refunded', $object->getShippingRefunded());
+    }
+
+    public function testGetShippingTaxAmount()
+    {
+        $data = ['shipping_tax_amount' => 'test_value_shipping_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_shipping_tax_amount', $object->getShippingTaxAmount());
+    }
+
+    public function testGetShippingTaxRefunded()
+    {
+        $data = ['shipping_tax_refunded' => 'test_value_shipping_tax_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_shipping_tax_refunded', $object->getShippingTaxRefunded());
+    }
+
+    public function testGetState()
+    {
+        $data = ['state' => 'test_value_state'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_state', $object->getState());
+    }
+
+    public function testGetStatus()
+    {
+        $data = ['status' => 'test_value_status'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_status', $object->getStatus());
+    }
+
+    public function testGetStoreCurrencyCode()
+    {
+        $data = ['store_currency_code' => 'test_value_store_currency_code'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_store_currency_code', $object->getStoreCurrencyCode());
+    }
+
+    public function testGetStoreId()
+    {
+        $data = ['store_id' => 'test_value_store_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_store_id', $object->getStoreId());
+    }
+
+    public function testGetStoreName()
+    {
+        $data = ['store_name' => 'test_value_store_name'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_store_name', $object->getStoreName());
+    }
+
+    public function testGetStoreToBaseRate()
+    {
+        $data = ['store_to_base_rate' => 'test_value_store_to_base_rate'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_store_to_base_rate', $object->getStoreToBaseRate());
+    }
+
+    public function testGetStoreToOrderRate()
+    {
+        $data = ['store_to_order_rate' => 'test_value_store_to_order_rate'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_store_to_order_rate', $object->getStoreToOrderRate());
+    }
+
+    public function testGetSubtotal()
+    {
+        $data = ['subtotal' => 'test_value_subtotal'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_subtotal', $object->getSubtotal());
+    }
+
+    public function testGetSubtotalCanceled()
+    {
+        $data = ['subtotal_canceled' => 'test_value_subtotal_canceled'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_subtotal_canceled', $object->getSubtotalCanceled());
+    }
+
+    public function testGetSubtotalInclTax()
+    {
+        $data = ['subtotal_incl_tax' => 'test_value_subtotal_incl_tax'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_subtotal_incl_tax', $object->getSubtotalInclTax());
+    }
+
+    public function testGetSubtotalInvoiced()
+    {
+        $data = ['subtotal_invoiced' => 'test_value_subtotal_invoiced'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_subtotal_invoiced', $object->getSubtotalInvoiced());
+    }
+
+    public function testGetSubtotalRefunded()
+    {
+        $data = ['subtotal_refunded' => 'test_value_subtotal_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_subtotal_refunded', $object->getSubtotalRefunded());
+    }
+
+    public function testGetTaxAmount()
+    {
+        $data = ['tax_amount' => 'test_value_tax_amount'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_tax_amount', $object->getTaxAmount());
+    }
+
+    public function testGetTaxCanceled()
+    {
+        $data = ['tax_canceled' => 'test_value_tax_canceled'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_tax_canceled', $object->getTaxCanceled());
+    }
+
+    public function testGetTaxInvoiced()
+    {
+        $data = ['tax_invoiced' => 'test_value_tax_invoiced'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_tax_invoiced', $object->getTaxInvoiced());
+    }
+
+    public function testGetTaxRefunded()
+    {
+        $data = ['tax_refunded' => 'test_value_tax_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_tax_refunded', $object->getTaxRefunded());
+    }
+
+    public function testGetTotalCanceled()
+    {
+        $data = ['total_canceled' => 'test_value_total_canceled'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_total_canceled', $object->getTotalCanceled());
+    }
+
+    public function testGetTotalDue()
+    {
+        $data = ['total_due' => 'test_value_total_due'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_total_due', $object->getTotalDue());
+    }
+
+    public function testGetTotalInvoiced()
+    {
+        $data = ['total_invoiced' => 'test_value_total_invoiced'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_total_invoiced', $object->getTotalInvoiced());
+    }
+
+    public function testGetTotalItemCount()
+    {
+        $data = ['total_item_count' => 'test_value_total_item_count'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_total_item_count', $object->getTotalItemCount());
+    }
+
+    public function testGetTotalOfflineRefunded()
+    {
+        $data = ['total_offline_refunded' => 'test_value_total_offline_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_total_offline_refunded', $object->getTotalOfflineRefunded());
+    }
+
+    public function testGetTotalOnlineRefunded()
+    {
+        $data = ['total_online_refunded' => 'test_value_total_online_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_total_online_refunded', $object->getTotalOnlineRefunded());
+    }
+
+    public function testGetTotalPaid()
+    {
+        $data = ['total_paid' => 'test_value_total_paid'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_total_paid', $object->getTotalPaid());
+    }
+
+    public function testGetTotalQtyOrdered()
+    {
+        $data = ['total_qty_ordered' => 'test_value_total_qty_ordered'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_total_qty_ordered', $object->getTotalQtyOrdered());
+    }
+
+    public function testGetTotalRefunded()
+    {
+        $data = ['total_refunded' => 'test_value_total_refunded'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_total_refunded', $object->getTotalRefunded());
+    }
+
+    public function testGetUpdatedAt()
+    {
+        $data = ['updated_at' => 'test_value_updated_at'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_updated_at', $object->getUpdatedAt());
+    }
+
+    public function testGetWeight()
+    {
+        $data = ['weight' => 'test_value_weight'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_weight', $object->getWeight());
+    }
+
+    public function testGetXForwardedFor()
+    {
+        $data = ['x_forwarded_for' => 'test_value_x_forwarded_for'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_x_forwarded_for', $object->getXForwardedFor());
+    }
+
+    public function testGetItems()
+    {
+        $data = ['items' => 'test_value_items'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_items', $object->getItems());
+    }
+
+    public function testGetBillingAddress()
+    {
+        $data = ['billing_address' => 'test_value_billing_address'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_billing_address', $object->getBillingAddress());
+    }
+
+    public function testGetShippingAddress()
+    {
+        $data = ['shipping_address' => 'test_value_shipping_address'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_shipping_address', $object->getShippingAddress());
+    }
+
+    public function testGetPayments()
+    {
+        $data = ['payments' => 'test_value_payments'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Order($abstractBuilderMock);
+
+        $this->assertEquals('test_value_payments', $object->getPayments());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/ShipmentItemTest.php b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/ShipmentItemTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..35c4c2993993bbb2f374d5b6f235fdcb667efb64
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/ShipmentItemTest.php
@@ -0,0 +1,219 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Data;
+
+class ShipmentItemTest extends \PHPUnit_Framework_TestCase
+{
+    public function testGetAdditionalData()
+    {
+        $data = ['additional_data' => 'test_value_additional_data'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\ShipmentItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_additional_data', $object->getAdditionalData());
+    }
+
+    public function testGetDescription()
+    {
+        $data = ['description' => 'test_value_description'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\ShipmentItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_description', $object->getDescription());
+    }
+
+    public function testGetEntityId()
+    {
+        $data = ['entity_id' => 'test_value_entity_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\ShipmentItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_entity_id', $object->getEntityId());
+    }
+
+    public function testGetName()
+    {
+        $data = ['name' => 'test_value_name'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\ShipmentItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_name', $object->getName());
+    }
+
+    public function testGetOrderItemId()
+    {
+        $data = ['order_item_id' => 'test_value_order_item_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\ShipmentItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_order_item_id', $object->getOrderItemId());
+    }
+
+    public function testGetParentId()
+    {
+        $data = ['parent_id' => 'test_value_parent_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\ShipmentItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_parent_id', $object->getParentId());
+    }
+
+    public function testGetPrice()
+    {
+        $data = ['price' => 'test_value_price'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\ShipmentItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_price', $object->getPrice());
+    }
+
+    public function testGetProductId()
+    {
+        $data = ['product_id' => 'test_value_product_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\ShipmentItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_product_id', $object->getProductId());
+    }
+
+    public function testGetQty()
+    {
+        $data = ['qty' => 'test_value_qty'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\ShipmentItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_qty', $object->getQty());
+    }
+
+    public function testGetRowTotal()
+    {
+        $data = ['row_total' => 'test_value_row_total'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\ShipmentItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_row_total', $object->getRowTotal());
+    }
+
+    public function testGetSku()
+    {
+        $data = ['sku' => 'test_value_sku'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\ShipmentItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_sku', $object->getSku());
+    }
+
+    public function testGetWeight()
+    {
+        $data = ['weight' => 'test_value_weight'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\ShipmentItem($abstractBuilderMock);
+
+        $this->assertEquals('test_value_weight', $object->getWeight());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/ShipmentTest.php b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/ShipmentTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..8830208dfd7756f2f04ddfa30b5fcc58c8d348e3
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/ShipmentTest.php
@@ -0,0 +1,267 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Data;
+
+class ShipmentTest extends \PHPUnit_Framework_TestCase
+{
+    public function testGetBillingAddressId()
+    {
+        $data = ['billing_address_id' => 'test_value_billing_address_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Shipment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_billing_address_id', $object->getBillingAddressId());
+    }
+
+    public function testGetCreatedAt()
+    {
+        $data = ['created_at' => 'test_value_created_at'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Shipment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_created_at', $object->getCreatedAt());
+    }
+
+    public function testGetCustomerId()
+    {
+        $data = ['customer_id' => 'test_value_customer_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Shipment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_customer_id', $object->getCustomerId());
+    }
+
+    public function testGetEmailSent()
+    {
+        $data = ['email_sent' => 'test_value_email_sent'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Shipment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_email_sent', $object->getEmailSent());
+    }
+
+    public function testGetEntityId()
+    {
+        $data = ['entity_id' => 'test_value_entity_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Shipment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_entity_id', $object->getEntityId());
+    }
+
+    public function testGetIncrementId()
+    {
+        $data = ['increment_id' => 'test_value_increment_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Shipment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_increment_id', $object->getIncrementId());
+    }
+
+    public function testGetOrderId()
+    {
+        $data = ['order_id' => 'test_value_order_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Shipment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_order_id', $object->getOrderId());
+    }
+
+    public function testGetPackages()
+    {
+        $data = ['packages' => 'test_value_packages'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Shipment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_packages', $object->getPackages());
+    }
+
+    public function testGetShipmentStatus()
+    {
+        $data = ['shipment_status' => 'test_value_shipment_status'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Shipment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_shipment_status', $object->getShipmentStatus());
+    }
+
+    public function testGetShippingAddressId()
+    {
+        $data = ['shipping_address_id' => 'test_value_shipping_address_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Shipment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_shipping_address_id', $object->getShippingAddressId());
+    }
+
+    public function testGetShippingLabel()
+    {
+        $data = ['shipping_label' => 'test_value_shipping_label'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Shipment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_shipping_label', $object->getShippingLabel());
+    }
+
+    public function testGetStoreId()
+    {
+        $data = ['store_id' => 'test_value_store_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Shipment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_store_id', $object->getStoreId());
+    }
+
+    public function testGetTotalQty()
+    {
+        $data = ['total_qty' => 'test_value_total_qty'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Shipment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_total_qty', $object->getTotalQty());
+    }
+
+    public function testGetTotalWeight()
+    {
+        $data = ['total_weight' => 'test_value_total_weight'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Shipment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_total_weight', $object->getTotalWeight());
+    }
+
+    public function testGetUpdatedAt()
+    {
+        $data = ['updated_at' => 'test_value_updated_at'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\Shipment($abstractBuilderMock);
+
+        $this->assertEquals('test_value_updated_at', $object->getUpdatedAt());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/ShipmentTrackTest.php b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/ShipmentTrackTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..a23a83674e1d79617968df3a6c055a450c463749
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/Data/ShipmentTrackTest.php
@@ -0,0 +1,203 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1\Data;
+
+class ShipmentTrackTest extends \PHPUnit_Framework_TestCase
+{
+    public function testGetCarrierCode()
+    {
+        $data = ['carrier_code' => 'test_value_carrier_code'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\ShipmentTrack($abstractBuilderMock);
+
+        $this->assertEquals('test_value_carrier_code', $object->getCarrierCode());
+    }
+
+    public function testGetCreatedAt()
+    {
+        $data = ['created_at' => 'test_value_created_at'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\ShipmentTrack($abstractBuilderMock);
+
+        $this->assertEquals('test_value_created_at', $object->getCreatedAt());
+    }
+
+    public function testGetDescription()
+    {
+        $data = ['description' => 'test_value_description'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\ShipmentTrack($abstractBuilderMock);
+
+        $this->assertEquals('test_value_description', $object->getDescription());
+    }
+
+    public function testGetEntityId()
+    {
+        $data = ['entity_id' => 'test_value_entity_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\ShipmentTrack($abstractBuilderMock);
+
+        $this->assertEquals('test_value_entity_id', $object->getEntityId());
+    }
+
+    public function testGetOrderId()
+    {
+        $data = ['order_id' => 'test_value_order_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\ShipmentTrack($abstractBuilderMock);
+
+        $this->assertEquals('test_value_order_id', $object->getOrderId());
+    }
+
+    public function testGetParentId()
+    {
+        $data = ['parent_id' => 'test_value_parent_id'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\ShipmentTrack($abstractBuilderMock);
+
+        $this->assertEquals('test_value_parent_id', $object->getParentId());
+    }
+
+    public function testGetQty()
+    {
+        $data = ['qty' => 'test_value_qty'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\ShipmentTrack($abstractBuilderMock);
+
+        $this->assertEquals('test_value_qty', $object->getQty());
+    }
+
+    public function testGetTitle()
+    {
+        $data = ['title' => 'test_value_title'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\ShipmentTrack($abstractBuilderMock);
+
+        $this->assertEquals('test_value_title', $object->getTitle());
+    }
+
+    public function testGetTrackNumber()
+    {
+        $data = ['track_number' => 'test_value_track_number'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\ShipmentTrack($abstractBuilderMock);
+
+        $this->assertEquals('test_value_track_number', $object->getTrackNumber());
+    }
+
+    public function testGetUpdatedAt()
+    {
+        $data = ['updated_at' => 'test_value_updated_at'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\ShipmentTrack($abstractBuilderMock);
+
+        $this->assertEquals('test_value_updated_at', $object->getUpdatedAt());
+    }
+
+    public function testGetWeight()
+    {
+        $data = ['weight' => 'test_value_weight'];
+        $abstractBuilderMock = $this->getMockBuilder('Magento\Framework\Service\Data\AbstractObjectBuilder')
+            ->setMethods(['getData'])
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $abstractBuilderMock->expects($this->once())
+            ->method('getData')
+            ->will($this->returnValue($data));
+
+        $object = new \Magento\Sales\Service\V1\Data\ShipmentTrack($abstractBuilderMock);
+
+        $this->assertEquals('test_value_weight', $object->getWeight());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderAddressUpdateTest.php b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderAddressUpdateTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..2f8d6568a64b9fd388c9365625070a295e1715aa
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderAddressUpdateTest.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\Sales\Service\V1;
+
+/**
+ * Class OrderAddressUpdateTest
+ */
+class OrderAddressUpdateTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var OrderAddressUpdate
+     */
+    protected $orderAddressUpdate;
+
+    /**
+     * @var \Magento\Sales\Model\Order\AddressConverter|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $addressConverterMock;
+
+    protected function setUp()
+    {
+        $this->addressConverterMock = $this->getMock(
+            'Magento\Sales\Model\Order\AddressConverter',
+            ['getModel'],
+            [],
+            '',
+            false
+        );
+        $this->orderAddressUpdate = new OrderAddressUpdate(
+            $this->addressConverterMock
+        );
+    }
+
+    /**
+     * test Order Address Update service
+     */
+    public function testInvoke()
+    {
+        $dtoMock = $this->getMock(
+            '\Magento\Sales\Service\V1\Data\OrderAddress',
+            [],
+            [],
+            '',
+            false
+        );
+
+        $orderAddressModel = $this->getMock(
+            'Magento\Sales\Model\Order\Address',
+            ['save', '__wakeup'],
+            [],
+            '',
+            false
+        );
+        $this->addressConverterMock->expects($this->once())
+            ->method('getModel')
+            ->with($this->equalTo($dtoMock))
+            ->will($this->returnValue($orderAddressModel));
+        $orderAddressModel->expects($this->once())
+            ->method('save')
+            ->will($this->returnSelf());
+        $this->orderAddressUpdate->invoke($dtoMock);
+
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderCancelTest.php b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderCancelTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b0ba41f3de2edfbb8560809d73d5ef91dbcd5b2c
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderCancelTest.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\Sales\Service\V1;
+
+/**
+ * Class OrderCancelTest
+ */
+class OrderCancelTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Sales\Service\V1\OrderCancel
+     */
+    protected $orderCancel;
+    /**
+     * @var \Magento\Sales\Model\OrderRepository|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderRepositoryMock;
+    /**
+     * @var \Magento\Sales\Model\Order|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderMock;
+
+    /**
+     * SetUp
+     */
+    protected function setUp()
+    {
+        $this->orderRepositoryMock = $this->getMock(
+            'Magento\Sales\Model\OrderRepository',
+            ['get'],
+            [],
+            '',
+            false
+        );
+        $this->orderMock = $this->getMock(
+            'Magento\Sales\Model\Order',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->orderCancel = new \Magento\Sales\Service\V1\OrderCancel(
+            $this->orderRepositoryMock
+        );
+    }
+
+    /**
+     * test order cancel service
+     */
+    public function testInvoke()
+    {
+        $this->orderRepositoryMock->expects($this->once())
+            ->method('get')
+            ->with($this->equalTo(1))
+            ->will($this->returnValue($this->orderMock));
+        $this->orderMock->expects($this->once())
+            ->method('cancel')
+            ->will($this->returnSelf());
+        $this->assertTrue($this->orderCancel->invoke(1));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderCommentsListTest.php b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderCommentsListTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..cea9475a6f6b8bdc21e7c75047dd80382754fcf6
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderCommentsListTest.php
@@ -0,0 +1,189 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1;
+
+/**
+ * Class OrderCommentsListTest
+ */
+class OrderCommentsListTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Sales\Service\V1\OrderCommentsList
+     */
+    protected $orderCommentsList;
+    /**
+     * @var \Magento\Sales\Model\Order\Status\HistoryRepository|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $historyRepositoryMock;
+    /**
+     * @var \Magento\Sales\Service\V1\Data\OrderStatusHistoryMapper|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $historyMapperMock;
+    /**
+     * @var \Magento\Framework\Service\V1\Data\SearchCriteriaBuilder|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $criteriaBuilderMock;
+    /**
+     * @var \Magento\Framework\Service\V1\Data\FilterBuilder|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $filterBuilderMock;
+    /**
+     * @var \Magento\Sales\Service\V1\Data\OrderSearchResultsBuilder|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $searchResultsBuilderMock;
+    /**
+     * @var \Magento\Sales\Model\Order\Status\History|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderCommentMock;
+    /**
+     * @var \Magento\Sales\Service\V1\Data\OrderStatusHistory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $dataObjectMock;
+    /**
+     * @var \Magento\Framework\Service\V1\Data\SearchCriteria|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $searchCriteriaMock;
+
+    protected function setUp()
+    {
+        $this->historyRepositoryMock = $this->getMock(
+            'Magento\Sales\Model\Order\Status\HistoryRepository',
+            ['find'],
+            [],
+            '',
+            false
+        );
+        $this->historyMapperMock = $this->getMock(
+            'Magento\Sales\Service\V1\Data\OrderStatusHistoryMapper',
+            ['extractDto'],
+            [],
+            '',
+            false
+        );
+        $this->criteriaBuilderMock = $this->getMock(
+            'Magento\Framework\Service\V1\Data\SearchCriteriaBuilder',
+            ['create', 'addFilter'],
+            [],
+            '',
+            false
+        );
+        $this->filterBuilderMock = $this->getMock(
+            'Magento\Framework\Service\V1\Data\FilterBuilder',
+            ['setField', 'setValue', 'create'],
+            [],
+            '',
+            false
+        );
+        $this->searchResultsBuilderMock = $this->getMock(
+            'Magento\Sales\Service\V1\Data\OrderStatusHistorySearchResultsBuilder',
+            ['setItems', 'setSearchCriteria', 'create', 'setTotalCount'],
+            [],
+            '',
+            false
+        );
+        $this->orderCommentMock = $this->getMock(
+            'Magento\Sales\Model\Order\Status\History',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->dataObjectMock = $this->getMock(
+            'Magento\Sales\Service\V1\Data\OrderStatusHistory',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->searchCriteriaMock = $this->getMock(
+            'Magento\Framework\Service\V1\Data\SearchCriteria',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->orderCommentsList = new \Magento\Sales\Service\V1\OrderCommentsList(
+            $this->historyRepositoryMock,
+            $this->historyMapperMock,
+            $this->criteriaBuilderMock,
+            $this->filterBuilderMock,
+            $this->searchResultsBuilderMock
+        );
+
+    }
+
+    /**
+     * test order comments list service
+     */
+    public function testInvoke()
+    {
+        $orderId = 1;
+        $this->filterBuilderMock->expects($this->once())
+            ->method('setField')
+            ->with($this->equalTo('parent_id'))
+            ->will($this->returnSelf());
+        $this->filterBuilderMock->expects($this->once())
+            ->method('setValue')
+            ->with($this->equalTo($orderId))
+            ->will($this->returnSelf());
+        $this->filterBuilderMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue('filter'));
+        $this->criteriaBuilderMock->expects($this->once())
+            ->method('addFilter')
+            ->with($this->equalTo(['eq' => 'filter']))
+            ->will($this->returnSelf());
+        $this->criteriaBuilderMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($this->searchCriteriaMock));
+
+        $this->historyRepositoryMock->expects($this->once())
+            ->method('find')
+            ->with($this->equalTo($this->searchCriteriaMock))
+            ->will($this->returnValue([$this->orderCommentMock]));
+
+        $this->historyMapperMock->expects($this->once())
+            ->method('extractDto')
+            ->with($this->equalTo($this->orderCommentMock))
+            ->will($this->returnValue($this->dataObjectMock));
+
+        $this->searchResultsBuilderMock->expects($this->once())
+            ->method('setItems')
+            ->with($this->equalTo([$this->dataObjectMock]))
+            ->will($this->returnSelf());
+        $this->searchResultsBuilderMock->expects($this->once())
+            ->method('setTotalCount')
+            ->with($this->equalTo(1))
+            ->will($this->returnSelf());
+        $this->searchResultsBuilderMock->expects($this->once())
+            ->method('setSearchCriteria')
+            ->with($this->equalTo($this->searchCriteriaMock))
+            ->will($this->returnSelf());
+        $this->searchResultsBuilderMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue('expected-result'));
+
+        $this->assertEquals('expected-result', $this->orderCommentsList->invoke($orderId));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderGetStatusTest.php b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderGetStatusTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..a9539a1d94124e379378d081d5ad26922ff2882f
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderGetStatusTest.php
@@ -0,0 +1,80 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1;
+
+use Magento\Sales\Service\V1\OrderGetStatus;
+use Magento\Sales\Model\OrderRepository;
+
+/**
+ * Class OrderGetStatusTest
+ * @package Magento\Sales\Service\V1
+ */
+class OrderGetStatusTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var OrderGetStatus
+     */
+    protected $service;
+    /**
+     * @var OrderRepository | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderRepositoryMock;
+
+    /**
+     * SetUp
+     */
+    protected function setUp()
+    {
+        $this->orderRepositoryMock = $this->getMock(
+            'Magento\Sales\Model\OrderRepository',
+            ['get'],
+            [],
+            '',
+            false
+        );
+
+        $this->service = new \Magento\Sales\Service\V1\OrderGetStatus($this->orderRepositoryMock);
+    }
+
+    public function testInvoke()
+    {
+        $status = 'pending';
+        $id = 1;
+        $orderMock = $this->getMock(
+            'Magento\Sales\Model\Order',
+            ['getStatus'],
+            [],
+            '',
+            false
+        );
+        $orderMock->expects($this->once())
+            ->method('getStatus')
+            ->will($this->returnValue($status));
+        $this->orderRepositoryMock->expects($this->once())
+            ->method('get')
+            ->with($this->equalTo($id))
+            ->will($this->returnValue($orderMock));
+        $this->assertEquals($status, $this->service->invoke($id));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderGetTest.php b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderGetTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..89ecd2aa47f3203dd5fd0992af9c55ecfe4593ab
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderGetTest.php
@@ -0,0 +1,120 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1;
+
+/**
+ * Class OrderGetTest
+ */
+class OrderGetTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Sales\Service\V1\OrderGet
+     */
+    protected $orderGet;
+    /**
+     * @var \Magento\Sales\Model\OrderRepository|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderRepositoryMock;
+    /**
+     * @var \Magento\Sales\Service\V1\Data\OrderMapper|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderMapperMock;
+    /**
+     * @var \Magento\Sales\Model\Order|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderMock;
+    /**
+     * @var \Magento\Sales\Service\V1\Data\Order|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $dataObjectMock;
+
+    /**
+     * SetUp
+     */
+    protected function setUp()
+    {
+        $this->orderRepositoryMock = $this->getMock(
+            'Magento\Sales\Model\OrderRepository',
+            ['get'],
+            [],
+            '',
+            false
+        );
+        $this->orderMapperMock = $this->getMock(
+            'Magento\Sales\Service\V1\Data\OrderMapper',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->searchResultsBuilderMock = $this->getMock(
+            'Magento\Catalog\Service\V1\Data\Product\SearchResultsBuilder',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->searchCriteriaMock = $this->getMock(
+            'Magento\Framework\Service\V1\Data\SearchCriteria',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->orderMock = $this->getMock(
+            'Magento\Sales\Model\Order',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->dataObjectMock = $this->getMock(
+            'Magento\Sales\Service\V1\Data\Order',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->orderGet = new \Magento\Sales\Service\V1\OrderGet(
+            $this->orderRepositoryMock,
+            $this->orderMapperMock
+        );
+    }
+
+    /**
+     * test order list service
+     */
+    public function testInvoke()
+    {
+        $this->orderRepositoryMock->expects($this->once())
+            ->method('get')
+            ->with($this->equalTo(1))
+            ->will($this->returnValue($this->orderMock));
+        $this->orderMapperMock->expects($this->once())
+            ->method('extractDto')
+            ->with($this->equalTo($this->orderMock))
+            ->will($this->returnValue($this->dataObjectMock));
+        $this->assertEquals($this->dataObjectMock, $this->orderGet->invoke(1));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderHoldTest.php b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderHoldTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b86fd01e6c888220dcdb782b39b940f5deb0f9bd
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderHoldTest.php
@@ -0,0 +1,81 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1;
+
+/**
+ * Class OrderHoldTest
+ */
+class OrderHoldTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Sales\Service\V1\OrderHold
+     */
+    protected $orderHold;
+    /**
+     * @var \Magento\Sales\Model\OrderRepository|\PHPUnit_Framework_MockObject_MockObject
+     */
+
+    protected $orderRepositoryMock;
+    /**
+     * @var \Magento\Sales\Model\Order|\PHPUnit_Framework_MockObject_MockObject
+     */
+
+    protected $orderMock;
+
+    protected function setUp()
+    {
+        $this->orderRepositoryMock = $this->getMock(
+            'Magento\Sales\Model\OrderRepository',
+            ['get'],
+            [],
+            '',
+            false
+        );
+        $this->orderMock = $this->getMock(
+            'Magento\Sales\Model\Order',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->orderHold = new \Magento\Sales\Service\V1\OrderHold(
+            $this->orderRepositoryMock
+        );
+    }
+
+    /**
+     * test order hold service
+     */
+    public function testInvoke()
+    {
+        $this->orderRepositoryMock->expects($this->once())
+            ->method('get')
+            ->with($this->equalTo(1))
+            ->will($this->returnValue($this->orderMock));
+        $this->orderMock->expects($this->once())
+            ->method('hold')
+            ->will($this->returnSelf());
+        $this->assertTrue($this->orderHold->invoke(1));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderListTest.php b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderListTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..386aa8cfe38daa0c1b0690dfd40e8a8a61654932
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderListTest.php
@@ -0,0 +1,144 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1;
+
+/**
+ * Class OrderListTest
+ */
+class OrderListTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Sales\Service\V1\OrderList
+     */
+    protected $orderList;
+    /**
+     * @var \Magento\Sales\Model\OrderRepository|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderRepositoryMock;
+    /**
+     * @var \Magento\Sales\Service\V1\Data\OrderMapper|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderMapperMock;
+    /**
+     * @var \Magento\Catalog\Service\V1\Data\Product\SearchResultsBuilder|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $searchResultsBuilderMock;
+    /**
+     * @var \Magento\Framework\Service\V1\Data\SearchCriteria|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $searchCriteriaMock;
+    /**
+     * @var \Magento\Sales\Model\Order|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderMock;
+    /**
+     * @var \Magento\Sales\Service\V1\Data\Order|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $dataObjectMock;
+
+    /**
+     * SetUp
+     */
+    protected function setUp()
+    {
+        $this->orderRepositoryMock = $this->getMock(
+            'Magento\Sales\Model\OrderRepository',
+            ['find'],
+            [],
+            '',
+            false
+        );
+        $this->orderMapperMock = $this->getMock(
+            'Magento\Sales\Service\V1\Data\OrderMapper',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->searchResultsBuilderMock = $this->getMock(
+            'Magento\Sales\Service\V1\Data\OrderSearchResultsBuilder',
+            ['setItems', 'setSearchCriteria', 'create', 'setTotalCount'],
+            [],
+            '',
+            false
+        );
+        $this->searchCriteriaMock = $this->getMock(
+            'Magento\Framework\Service\V1\Data\SearchCriteria',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->orderMock = $this->getMock(
+            'Magento\Sales\Model\Order',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->dataObjectMock = $this->getMock(
+            'Magento\Sales\Service\V1\Data\Order',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->orderList = new \Magento\Sales\Service\V1\OrderList(
+            $this->orderRepositoryMock,
+            $this->orderMapperMock,
+            $this->searchResultsBuilderMock
+        );
+    }
+
+    /**
+     * test order list service
+     */
+    public function testInvoke()
+    {
+        $this->orderRepositoryMock->expects($this->once())
+            ->method('find')
+            ->with($this->equalTo($this->searchCriteriaMock))
+            ->will($this->returnValue([$this->orderMock]));
+        $this->orderMapperMock->expects($this->once())
+            ->method('extractDto')
+            ->with($this->equalTo($this->orderMock))
+            ->will($this->returnValue($this->dataObjectMock));
+        $this->searchResultsBuilderMock->expects($this->once())
+            ->method('setItems')
+            ->with($this->equalTo([$this->dataObjectMock]))
+            ->will($this->returnSelf());
+        $this->searchResultsBuilderMock->expects($this->once())
+            ->method('setTotalCount')
+            ->with($this->equalTo(1))
+            ->will($this->returnSelf());
+        $this->searchResultsBuilderMock->expects($this->once())
+            ->method('setSearchCriteria')
+            ->with($this->equalTo($this->searchCriteriaMock))
+            ->will($this->returnSelf());
+        $this->searchResultsBuilderMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue('expected-result'));
+        $this->assertEquals('expected-result', $this->orderList->invoke($this->searchCriteriaMock));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderNotifyUserTest.php b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderNotifyUserTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b18d26e513bc25f4c7541468f3d0ad658856fcd3
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderNotifyUserTest.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\Sales\Service\V1;
+
+/**
+ * Test Class OrderNotifyUserTest for Order Service
+ * @package Magento\Sales\Service\V1
+ */
+class OrderNotifyUserTest extends \PHPUnit_Framework_TestCase
+{
+    public function testInvoke()
+    {
+        $orderId = 1;
+        $objectManager = new \Magento\TestFramework\Helper\ObjectManager($this);
+        $orderRepository = $this->getMock('\Magento\Sales\Model\OrderRepository', ['get'], [], '', false);
+        $notifier = $this->getMock('\Magento\Sales\Model\Notifier', ['notify', '__wakeup'], [], '', false);
+        $order = $this->getMock(
+            '\Magento\Sales\Model\Order',
+            ['__wakeup', 'sendNewOrderEmail', 'getEmailSent'],
+            [],
+            '',
+            false
+        );
+
+        $service = $objectManager->getObject(
+            'Magento\Sales\Service\V1\OrderNotifyUser',
+            [
+                'orderRepository' => $orderRepository,
+                'notifier' => $notifier
+            ]
+        );
+        $orderRepository->expects($this->once())
+            ->method('get')
+            ->with($orderId)
+            ->will($this->returnValue($order));
+        $notifier->expects($this->any())
+            ->method('notify')
+            ->with($order)
+            ->will($this->returnValue(true));
+        $this->assertTrue($service->invoke($orderId));
+    }
+}
+ 
\ No newline at end of file
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderStatusHistoryAddTest.php b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderStatusHistoryAddTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..58b1901c6b0f7d1c7255f194000335b311ebdd36
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderStatusHistoryAddTest.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\Sales\Service\V1;
+
+use Magento\Sales\Model\OrderRepository;
+use Magento\Sales\Model\Order\Status\HistoryConverter;
+
+/**
+ * Class OrderStatusHistoryAddTest
+ * @package Magento\Sales\Service\V1
+ */
+class OrderStatusHistoryAddTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Sales\Service\V1\OrderStatusHistoryAdd
+     */
+    protected $service;
+
+    /**
+     * @var OrderRepository | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderRepositoryMock;
+
+    /**
+     * @var HistoryConverter | \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $historyConverterMock;
+
+    /**
+     * SetUp
+     */
+    protected function setUp()
+    {
+        $this->orderRepositoryMock = $this->getMock(
+            'Magento\Sales\Model\OrderRepository',
+            ['get'],
+            [],
+            '',
+            false
+        );
+        $this->historyConverterMock = $this->getMock(
+            'Magento\Sales\Model\Order\Status\HistoryConverter',
+            ['getModel'],
+            [],
+            '',
+            false
+        );
+        $this->service = new OrderStatusHistoryAdd(
+            $this->orderRepositoryMock,
+            $this->historyConverterMock
+        );
+    }
+
+    public function testInvoke()
+    {
+        $id = 1;
+
+        $dataObject = $this->getMock('Magento\Sales\Service\V1\Data\OrderStatusHistory', [], [], '', false);
+        $model = $this->getMock('Magento\Sales\Model\Order\Status\History', [], [], '', false);
+        $this->historyConverterMock->expects($this->once())
+            ->method('getModel')
+            ->with($dataObject)
+            ->will($this->returnValue($model));
+        $orderMock = $this->getMock('Magento\Sales\Model\Order', [], [], '', false);
+        $orderMock->expects($this->once())
+            ->method('addStatusHistory')
+            ->with($model);
+        $this->orderRepositoryMock->expects($this->once())
+            ->method('get')
+            ->with($id)
+            ->will($this->returnValue($orderMock));
+
+        $this->assertTrue($this->service->invoke($id, $dataObject));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderUnHoldTest.php b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderUnHoldTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..2c52a1763fc3336df47bae93b51c54e741736589
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Sales/Service/V1/OrderUnHoldTest.php
@@ -0,0 +1,81 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Service\V1;
+
+/**
+ * Class OrderUnHoldTest
+ */
+class OrderUnHoldTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Sales\Service\V1\OrderUnHold
+     */
+
+    protected $orderUnHold;
+    /**
+     * @var \Magento\Sales\Model\OrderRepository|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderRepositoryMock;
+
+    /**
+     * @var \Magento\Sales\Model\Order|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $orderMock;
+
+    protected function setUp()
+    {
+        $this->orderRepositoryMock = $this->getMock(
+            'Magento\Sales\Model\OrderRepository',
+            ['get'],
+            [],
+            '',
+            false
+        );
+        $this->orderMock = $this->getMock(
+            'Magento\Sales\Model\Order',
+            [],
+            [],
+            '',
+            false
+        );
+        $this->orderUnHold = new \Magento\Sales\Service\V1\OrderUnHold(
+            $this->orderRepositoryMock
+        );
+    }
+
+    /**
+     * test order unhold service
+     */
+    public function testInvoke()
+    {
+        $this->orderRepositoryMock->expects($this->once())
+            ->method('get')
+            ->with($this->equalTo(1))
+            ->will($this->returnValue($this->orderMock));
+        $this->orderMock->expects($this->once())
+            ->method('unhold')
+            ->will($this->returnSelf());
+        $this->assertTrue($this->orderUnHold->invoke(1));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Tax/Service/V1/TaxRateServiceTest.php b/dev/tests/unit/testsuite/Magento/Tax/Service/V1/TaxRateServiceTest.php
index 3f78f7a08df8a4d2abfa059889c987feb6ece04e..020980e2aae776933ff58f372fc87d4835bdb19d 100644
--- a/dev/tests/unit/testsuite/Magento/Tax/Service/V1/TaxRateServiceTest.php
+++ b/dev/tests/unit/testsuite/Magento/Tax/Service/V1/TaxRateServiceTest.php
@@ -147,6 +147,24 @@ class TaxRateServiceTest extends \PHPUnit_Framework_TestCase
 
     }
 
+    /**
+     * @expectedException \Magento\Framework\Exception\InputException
+     * @expectedExceptionMessage id is not expected for this request.
+     */
+    public function testCreateTaxRateWithId()
+    {
+        $taxData = [
+            'id' => 2,
+            'country_id' => '',
+            'region_id' => '8',
+            'percentage_rate' => '8.25',
+            'code' => 'US-CA-*-Rate',
+            'zip_range' => ['from' => 78765, 'to' => 78780]
+        ];
+        $taxRateDataObject = $this->taxRateBuilder->populateWithArray($taxData)->create();
+        $this->taxRateService->createTaxRate($taxRateDataObject);
+    }
+
     /**
      * @expectedException \Magento\Framework\Exception\InputException
      * @expectedExceptionMessage country_id is a required field.
diff --git a/dev/tests/unit/testsuite/Magento/Tax/Service/V1/TaxRuleServiceTest.php b/dev/tests/unit/testsuite/Magento/Tax/Service/V1/TaxRuleServiceTest.php
index a72665c8cf884b51d7f33b0390a8cfaa93c1f407..cec65a1dc64b4192d10d88d6972385160cc157a4 100644
--- a/dev/tests/unit/testsuite/Magento/Tax/Service/V1/TaxRuleServiceTest.php
+++ b/dev/tests/unit/testsuite/Magento/Tax/Service/V1/TaxRuleServiceTest.php
@@ -27,6 +27,8 @@ use Magento\Framework\Exception\ErrorMessage;
 use Magento\Framework\Exception\InputException;
 use Magento\Framework\Exception\NoSuchEntityException;
 use Magento\Tax\Service\V1\Data\TaxRule;
+use Magento\Tax\Service\V1\Data\TaxClass;
+use Magento\Tax\Model\ClassModel as TaxClassModel;
 use Magento\TestFramework\Helper\ObjectManager;
 
 /**
@@ -82,6 +84,11 @@ class TaxRuleServiceTest extends \PHPUnit_Framework_TestCase
      */
     private $objectManager;
 
+    /**
+     * @var TaxClassService | \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $taxClassServiceMock;
+
     public function setUp()
     {
         $this->objectManager = new ObjectManager($this);
@@ -117,6 +124,40 @@ class TaxRuleServiceTest extends \PHPUnit_Framework_TestCase
             ->disableOriginalConstructor()
             ->getMock();
 
+        $this->taxClassServiceMock = $this->getMockBuilder('\Magento\Tax\Service\V1\TaxClassService')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $taxClassBuilder = $this->objectManager->getObject('Magento\Tax\Service\V1\Data\TaxClassBuilder');
+
+        $customerTaxClassArray = [
+            TaxClass::KEY_ID => 3,
+            TaxClass::KEY_NAME => 'Some Customer Tax Class',
+            TaxClass::KEY_TYPE => TaxClassModel::TAX_CLASS_TYPE_CUSTOMER,
+        ];
+
+        $productTaxClassArray = [
+            TaxClass::KEY_ID => 2,
+            TaxClass::KEY_NAME => 'Some Product Tax Class',
+            TaxClass::KEY_TYPE => TaxClassModel::TAX_CLASS_TYPE_PRODUCT,
+        ];
+
+        $customerTaxClass = $taxClassBuilder->populateWithArray($customerTaxClassArray)->create();
+        $productTaxClass = $taxClassBuilder->populateWithArray($productTaxClassArray)->create();
+
+        $map = [
+            [
+                3, $customerTaxClass,
+            ],
+            [
+                2, $productTaxClass,
+            ],
+        ];
+
+        $this->taxClassServiceMock->expects($this->any())
+            ->method('getTaxClass')
+            ->will($this->returnValueMap($map));
+
         $this->taxRuleService = $this->getTaxRuleService($taxRuleResultsBuilder);
     }
 
@@ -260,7 +301,6 @@ class TaxRuleServiceTest extends \PHPUnit_Framework_TestCase
     {
         $taxRuleBuilder = $this->objectManager->getObject('Magento\Tax\Service\V1\Data\TaxRuleBuilder');
         $taxRule = $taxRuleBuilder
-            ->setId(2)
             ->setCode('code')
             ->setCustomerTaxClassIds([3])
             ->setProductTaxClassIds([2])
@@ -283,6 +323,24 @@ class TaxRuleServiceTest extends \PHPUnit_Framework_TestCase
 
         $this->assertSame($expectedTaxRule, $result);
     }
+    /**
+     * @expectedException \Magento\Framework\Exception\InputException
+     */
+    public function testCreateTaxRuleSpecifyingId()
+    {
+        $taxRuleBuilder = $this->objectManager->getObject('Magento\Tax\Service\V1\Data\TaxRuleBuilder');
+        $taxRule = $taxRuleBuilder
+            ->setId(9)
+            ->setCode('code')
+            ->setCustomerTaxClassIds([3])
+            ->setProductTaxClassIds([2])
+            ->setTaxRateIds([2])
+            ->setPriority(0)
+            ->setSortOrder(1)
+            ->create();
+
+        $this->taxRuleService->createTaxRule($taxRule);
+    }
 
     /**
      * @dataProvider createTaxRuleMissingRequiredInfoDataProvider
@@ -325,7 +383,6 @@ class TaxRuleServiceTest extends \PHPUnit_Framework_TestCase
             ],
             'negative fields' => [
                 [
-                    'id' => 3,
                     'customer_tax_class_ids' => [3],
                     'product_tax_class_ids' => [2],
                     'tax_rate_ids' => [1],
@@ -348,7 +405,6 @@ class TaxRuleServiceTest extends \PHPUnit_Framework_TestCase
     {
         $taxRuleBuilder = $this->objectManager->getObject('Magento\Tax\Service\V1\Data\TaxRuleBuilder');
         $taxRule = $taxRuleBuilder
-            ->setId(2)
             ->setCode('code')
             ->setCustomerTaxClassIds([3])
             ->setProductTaxClassIds([2])
@@ -367,6 +423,39 @@ class TaxRuleServiceTest extends \PHPUnit_Framework_TestCase
         $this->taxRuleService->createTaxRule($taxRule);
     }
 
+    public function testCreateTaxRuleInvalidTaxClassIds()
+    {
+        $taxRuleBuilder = $this->objectManager->getObject('Magento\Tax\Service\V1\Data\TaxRuleBuilder');
+        $taxRule = $taxRuleBuilder
+            ->setCode('code')
+            ->setCustomerTaxClassIds([2])
+            ->setProductTaxClassIds([3])
+            ->setTaxRateIds([2])
+            ->setPriority(0)
+            ->setSortOrder(1)
+            ->create();
+
+        try {
+            //Tax rule service call
+            $this->taxRuleService->createTaxRule($taxRule);
+            $this->fail('Did not throw expected InputException');
+        } catch (InputException $e) {
+            $expectedCustomerTaxClassIdParams = [
+                'fieldName' => $taxRule::CUSTOMER_TAX_CLASS_IDS,
+                'value'     => 2,
+            ];
+            $expectedProductTaxClassIdParams = [
+                'fieldName' => $taxRule::PRODUCT_TAX_CLASS_IDS,
+                'value'    => 3,
+            ];
+
+            $actualErrors = $e->getErrors();
+            $this->assertEquals(2, count($actualErrors));
+            $this->assertEquals($expectedCustomerTaxClassIdParams, $actualErrors[0]->getParameters());
+            $this->assertEquals($expectedProductTaxClassIdParams, $actualErrors[1]->getParameters());
+        }
+    }
+
     public function testSearchTaxRulesEmptyResult()
     {
         /** @var \PHPUnit_Framework_MockObject_MockObject |
@@ -610,7 +699,8 @@ class TaxRuleServiceTest extends \PHPUnit_Framework_TestCase
                 'taxRuleSearchResultsBuilder' => $taxRuleResultsBuilder,
                 'filterBuilder' => $this->filterBuilderMock,
                 'taxRateService' => $this->taxRateServiceMock,
-                'searchCriteriaBuilder' => $this->searchCriteriaBuilderMock
+                'searchCriteriaBuilder' => $this->searchCriteriaBuilderMock,
+                'taxClassService' => $this->taxClassServiceMock
             ]
         );
     }
diff --git a/dev/tests/unit/testsuite/Magento/User/Model/Authorization/AdminSessionUserContextTest.php b/dev/tests/unit/testsuite/Magento/User/Model/Authorization/AdminSessionUserContextTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..f876da272c344cff2c07cefdc993afcf67ae533f
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/User/Model/Authorization/AdminSessionUserContextTest.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\User\Model\Authorization;
+
+use Magento\Authorization\Model\UserContextInterface;
+
+/**
+ * Tests Magento\User\Model\Authorization\AdminSessionUserContext
+ */
+class AdminSessionUserContextTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\TestFramework\Helper\ObjectManager
+     */
+    protected $objectManager;
+
+    /**
+     * @var \Magento\User\Model\Authorization\AdminSessionUserContext
+     */
+    protected $adminSessionUserContext;
+
+    /**
+     * @var \Magento\Backend\Model\Auth\Session
+     */
+    protected $adminSession;
+
+    protected function setUp()
+    {
+        $this->objectManager = new \Magento\TestFramework\Helper\ObjectManager($this);
+
+        $this->adminSession = $this->getMockBuilder('Magento\Backend\Model\Auth\Session')
+            ->disableOriginalConstructor()
+            ->setMethods(['hasUser', 'getUser', 'getId'])
+            ->getMock();
+
+        $this->adminSessionUserContext = $this->objectManager->getObject(
+            'Magento\User\Model\Authorization\AdminSessionUserContext',
+            ['adminSession' => $this->adminSession]
+        );
+    }
+
+    public function testGetUserIdExist()
+    {
+        $userId = 1;
+
+        $this->setupUserId($userId);
+
+        $this->assertEquals($userId, $this->adminSessionUserContext->getUserId());
+    }
+
+    public function testGetUserIdDoesNotExist()
+    {
+        $userId = null;
+
+        $this->setupUserId($userId);
+
+        $this->assertEquals($userId, $this->adminSessionUserContext->getUserId());
+    }
+
+    public function testGetUserType()
+    {
+        $this->assertEquals(UserContextInterface::USER_TYPE_ADMIN, $this->adminSessionUserContext->getUserType());
+    }
+
+    /**
+     * @param int|null $userId
+     * @return void
+     */
+    public function setupUserId($userId)
+    {
+        $this->adminSession->expects($this->once())
+            ->method('hasUser')
+            ->will($this->returnValue($userId));
+
+        if ($userId) {
+
+            $this->adminSession->expects($this->once())
+                ->method('getUser')
+                ->will($this->returnSelf());
+
+            $this->adminSession->expects($this->once())
+                ->method('getId')
+                ->will($this->returnValue($userId));
+        }
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/User/Model/UserTest.php b/dev/tests/unit/testsuite/Magento/User/Model/UserTest.php
index d3c9935755ed7c96f60c783c42e1b4336010f11f..d1646b52df9e6ef0511adac6ea0e02b574f3cf8b 100644
--- a/dev/tests/unit/testsuite/Magento/User/Model/UserTest.php
+++ b/dev/tests/unit/testsuite/Magento/User/Model/UserTest.php
@@ -110,7 +110,7 @@ class UserTest extends \PHPUnit_Framework_TestCase
             array('create')
         )->getMock();
         $roleFactoryMock = $this->getMockBuilder(
-            'Magento\User\Model\RoleFactory'
+            'Magento\Authorization\Model\RoleFactory'
         )->disableOriginalConstructor()->setMethods(
             array('create')
         )->getMock();
diff --git a/dev/tests/unit/testsuite/Magento/Webapi/Controller/RestTest.php b/dev/tests/unit/testsuite/Magento/Webapi/Controller/RestTest.php
index 21cb30a8561764912066bc29d467898dc32e57c7..b3da4eb68bc330ca97d39cb6cddb96c48e5def30 100644
--- a/dev/tests/unit/testsuite/Magento/Webapi/Controller/RestTest.php
+++ b/dev/tests/unit/testsuite/Magento/Webapi/Controller/RestTest.php
@@ -23,6 +23,7 @@
  */
 namespace Magento\Webapi\Controller;
 
+use Magento\Authorization\Model\UserContextInterface;
 use Magento\Framework\Exception\AuthorizationException;
 
 /**
@@ -59,8 +60,8 @@ class RestTest extends \PHPUnit_Framework_TestCase
     /** @var \Magento\Framework\Oauth\OauthInterface */
     protected $_oauthServiceMock;
 
-    /** @var \Magento\Authz\Service\AuthorizationV1Interface */
-    protected $_authzServiceMock;
+    /** @var \Magento\Framework\AuthorizationInterface */
+    protected $_authorizationMock;
 
     /**
      * @var \PHPUnit_Framework_MockObject_MockObject
@@ -77,6 +78,11 @@ class RestTest extends \PHPUnit_Framework_TestCase
      */
     protected $areaMock;
 
+    /**
+     * @var \Magento\Authorization\Model\UserContextInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $userContextMock;
+
     const SERVICE_METHOD = 'testMethod';
 
     const SERVICE_ID = 'Magento\Webapi\Controller\TestService';
@@ -100,8 +106,10 @@ class RestTest extends \PHPUnit_Framework_TestCase
             ->disableOriginalConstructor()->getMock();
         $this->_oauthServiceMock = $this->getMockBuilder('\Magento\Framework\Oauth\OauthInterface')
             ->setMethods(['validateAccessTokenRequest'])->getMockForAbstractClass();
-        $this->_authzServiceMock = $this->getMockBuilder('Magento\Authz\Service\AuthorizationV1Interface')
+        $this->_authorizationMock = $this->getMockBuilder('Magento\Framework\AuthorizationInterface')
             ->disableOriginalConstructor()->getMock();
+        $this->userContextMock = $this->getMockBuilder('Magento\Authorization\Model\UserContextInterface')
+            ->disableOriginalConstructor()->setMethods(['getUserId'])->getMockForAbstractClass();
     }
 
     protected function setUp()
@@ -129,10 +137,11 @@ class RestTest extends \PHPUnit_Framework_TestCase
                     'appState' => $this->_appStateMock,
                     'layout' => $layoutMock,
                     'oauthService' => $this->_oauthServiceMock,
-                    'authorizationService' => $this->_authzServiceMock,
+                    'authorization' => $this->_authorizationMock,
                     'serializer' => $this->serializerMock,
                     'errorProcessor' => $errorProcessorMock,
-                    'areaList' => $this->areaListMock
+                    'areaList' => $this->areaListMock,
+                    'userContext' => $this->userContextMock,
                 ]
             );
         // Set default expectations used by all tests
@@ -171,9 +180,10 @@ class RestTest extends \PHPUnit_Framework_TestCase
         $this->_serviceMock->expects($this->any())->method(self::SERVICE_METHOD)->will($this->returnValue([]));
         $this->_routeMock->expects($this->any())->method('isSecure')->will($this->returnValue($isSecureRoute));
         $this->_routeMock->expects($this->once())->method('getParameters')->will($this->returnValue([]));
+        $this->_routeMock->expects($this->any())->method('getAclResources')->will($this->returnValue(['1']));
         $this->_requestMock->expects($this->any())->method('getRequestData')->will($this->returnValue([]));
         $this->_requestMock->expects($this->any())->method('isSecure')->will($this->returnValue($isSecureRequest));
-        $this->_authzServiceMock->expects($this->once())->method('isAllowed')->will($this->returnValue(true));
+        $this->_authorizationMock->expects($this->once())->method('isAllowed')->will($this->returnValue(true));
         $this->serializerMock->expects($this->any())->method('getInputData')->will($this->returnValue([]));
         $this->_restController->dispatch($this->_requestMock);
         $this->assertFalse($this->_responseMock->isException());
@@ -198,8 +208,9 @@ class RestTest extends \PHPUnit_Framework_TestCase
         $this->_appStateMock->expects($this->any())->method('isInstalled')->will($this->returnValue(true));
         $this->_serviceMock->expects($this->any())->method(self::SERVICE_METHOD)->will($this->returnValue([]));
         $this->_routeMock->expects($this->any())->method('isSecure')->will($this->returnValue(true));
+        $this->_routeMock->expects($this->any())->method('getAclResources')->will($this->returnValue(['1']));
         $this->_requestMock->expects($this->any())->method('isSecure')->will($this->returnValue(false));
-        $this->_authzServiceMock->expects($this->once())->method('isAllowed')->will($this->returnValue(true));
+        $this->_authorizationMock->expects($this->once())->method('isAllowed')->will($this->returnValue(true));
 
         // Override default prepareResponse. It should never be called in this case
         $this->_responseMock->expects($this->never())->method('prepareResponse');
@@ -214,7 +225,7 @@ class RestTest extends \PHPUnit_Framework_TestCase
     public function testAuthorizationFailed()
     {
         $this->_appStateMock->expects($this->any())->method('isInstalled')->will($this->returnValue(true));
-        $this->_authzServiceMock->expects($this->once())->method('isAllowed')->will($this->returnValue(false));
+        $this->_authorizationMock->expects($this->once())->method('isAllowed')->will($this->returnValue(false));
         $this->_oauthServiceMock->expects(
             $this->any())->method('validateAccessTokenRequest')->will($this->returnValue('fred')
         );
@@ -233,15 +244,20 @@ class RestTest extends \PHPUnit_Framework_TestCase
      * @param array $requestData Data from the request
      * @param array $parameters Data from config about which parameters to override
      * @param array $expectedOverriddenParams Result of overriding $requestData when applying rules from $parameters
+     * @param int $userId The id of the user invoking the request
+     * @param int $userType The type of user invoking the request
      *
      * @dataProvider overrideParmasDataProvider
      */
-    public function testOverrideParams($requestData, $parameters, $expectedOverriddenParams)
+    public function testOverrideParams($requestData, $parameters, $expectedOverriddenParams, $userId, $userType)
     {
         $this->_routeMock->expects($this->once())->method('getParameters')->will($this->returnValue($parameters));
+        $this->_routeMock->expects($this->any())->method('getAclResources')->will($this->returnValue(['1']));
         $this->_appStateMock->expects($this->any())->method('isInstalled')->will($this->returnValue(true));
-        $this->_authzServiceMock->expects($this->once())->method('isAllowed')->will($this->returnValue(true));
+        $this->_authorizationMock->expects($this->once())->method('isAllowed')->will($this->returnValue(true));
         $this->_requestMock->expects($this->any())->method('getRequestData')->will($this->returnValue($requestData));
+        $this->userContextMock->expects($this->any())->method('getUserId')->will($this->returnValue($userId));
+        $this->userContextMock->expects($this->any())->method('getUserType')->will($this->returnValue($userType));
 
         // serializer should expect overridden params
         $this->serializerMock->expects($this->once())->method('getInputData')
@@ -264,21 +280,43 @@ class RestTest extends \PHPUnit_Framework_TestCase
                 ['Name1' => 'valueIn'],
                 ['Name1' => ['force' => false, 'value' => 'valueOverride']],
                 ['Name1' => 'valueIn'],
+                1,
+                UserContextInterface::USER_TYPE_INTEGRATION,
             ],
             'force true, value present' => [
                 ['Name1' => 'valueIn'],
                 ['Name1' => ['force' => true, 'value' => 'valueOverride']],
-                ['Name1' => 'valueOverride']
+                ['Name1' => 'valueOverride'],
+                1,
+                UserContextInterface::USER_TYPE_INTEGRATION,
             ],
             'force true, value not present' => [
                 ['Name1' => 'valueIn'],
                 ['Name2' => ['force' => true, 'value' => 'valueOverride']],
-                ['Name1' => 'valueIn', 'Name2' => 'valueOverride']
+                ['Name1' => 'valueIn', 'Name2' => 'valueOverride'],
+                1,
+                UserContextInterface::USER_TYPE_INTEGRATION,
             ],
             'force false, value not present' => [
                 ['Name1' => 'valueIn'],
                 ['Name2' => ['force' => false, 'value' => 'valueOverride']],
                 ['Name1' => 'valueIn', 'Name2' => 'valueOverride'],
+                1,
+                UserContextInterface::USER_TYPE_INTEGRATION,
+            ],
+            'force true, value present, override value is %customer_id%' => [
+                ['Name1' => 'valueIn'],
+                ['Name1' => ['force' => true, 'value' => '%customer_id%']],
+                ['Name1' => '1234'],
+                1234,
+                UserContextInterface::USER_TYPE_CUSTOMER,
+            ],
+            'force true, value present, override value is %customer_id%, not a customer' => [
+                ['Name1' => 'valueIn'],
+                ['Name1' => ['force' => true, 'value' => '%customer_id%']],
+                ['Name1' => '%customer_id%'],
+                1234,
+                UserContextInterface::USER_TYPE_INTEGRATION,
             ],
         ];
     }
diff --git a/dev/tests/unit/testsuite/Magento/Webapi/Controller/Soap/Request/HandlerTest.php b/dev/tests/unit/testsuite/Magento/Webapi/Controller/Soap/Request/HandlerTest.php
index 115ba3b9f75aa81f844fb9bdb5a70a9fb8ef5dca..7addf89fb0eddab5a0a28b625432fe8868e9511a 100644
--- a/dev/tests/unit/testsuite/Magento/Webapi/Controller/Soap/Request/HandlerTest.php
+++ b/dev/tests/unit/testsuite/Magento/Webapi/Controller/Soap/Request/HandlerTest.php
@@ -44,7 +44,7 @@ class HandlerTest extends \PHPUnit_Framework_TestCase
     protected $_requestMock;
 
     /** @var \PHPUnit_Framework_MockObject_MockObject */
-    protected $_authzServiceMock;
+    protected $_authorizationMock;
 
     /** @var DataObjectConverter|\PHPUnit_Framework_MockObject_MockObject */
     protected $_dataObjectConverter;
@@ -62,7 +62,7 @@ class HandlerTest extends \PHPUnit_Framework_TestCase
             ->setMethods(array('getServiceMethodInfo'))->disableOriginalConstructor()->getMock();
         $this->_requestMock = $this->getMock('Magento\Webapi\Controller\Soap\Request', [], [], '', false);
         $this->_objectManagerMock = $this->getMock('Magento\Framework\ObjectManager', [], [], '', false);
-        $this->_authzServiceMock = $this->getMock('Magento\Authz\Service\AuthorizationV1Interface', [], [], '', false);
+        $this->_authorizationMock = $this->getMock('Magento\Framework\AuthorizationInterface', [], [], '', false);
         $this->_dataObjectConverter = $this->getMock(
             'Magento\Framework\Service\DataObjectConverter',
             ['convertStdObjectToArray'],
@@ -76,7 +76,7 @@ class HandlerTest extends \PHPUnit_Framework_TestCase
             $this->_requestMock,
             $this->_objectManagerMock,
             $this->_apiConfigMock,
-            $this->_authzServiceMock,
+            $this->_authorizationMock,
             $this->_dataObjectConverter,
             $this->_serializerMock
         );
@@ -111,7 +111,7 @@ class HandlerTest extends \PHPUnit_Framework_TestCase
                 )
             );
 
-        $this->_authzServiceMock->expects($this->once())->method('isAllowed')->will($this->returnValue(true));
+        $this->_authorizationMock->expects($this->once())->method('isAllowed')->will($this->returnValue(true));
         $serviceMock = $this->getMockBuilder($className)
             ->disableOriginalConstructor()
             ->setMethods(array($methodName))
diff --git a/dev/tests/unit/testsuite/Magento/Webapi/Controller/SoapTest.php b/dev/tests/unit/testsuite/Magento/Webapi/Controller/SoapTest.php
index 0e6382eda424e53101b963d7cf6002f4af860ccd..a84ec784d38b37187f4fc5c1bb75f24804567195 100644
--- a/dev/tests/unit/testsuite/Magento/Webapi/Controller/SoapTest.php
+++ b/dev/tests/unit/testsuite/Magento/Webapi/Controller/SoapTest.php
@@ -48,9 +48,6 @@ class SoapTest extends \PHPUnit_Framework_TestCase
     /** @var \Magento\Framework\App\State */
     protected $_appStateMock;
 
-    /** @var \Magento\Framework\Oauth\Oauth */
-    protected $_oauthServiceMock;
-
     /**
      * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Locale\ResolverInterface
      */
@@ -99,10 +96,6 @@ class SoapTest extends \PHPUnit_Framework_TestCase
 
         $layoutMock = $this->getMock('Magento\Framework\View\LayoutInterface');
 
-        $this->_oauthServiceMock = $this->getMockBuilder('Magento\Framework\Oauth\Oauth')
-            ->disableOriginalConstructor()
-            ->getMock();
-
         $this->_responseMock->expects($this->any())->method('clearHeaders')->will($this->returnSelf());
         $this->_soapServerMock->expects($this->any())->method('setWSDL')->will($this->returnSelf());
         $this->_soapServerMock->expects($this->any())->method('setEncoding')->will($this->returnSelf());
@@ -119,7 +112,6 @@ class SoapTest extends \PHPUnit_Framework_TestCase
             $this->_errorProcessorMock,
             $this->_appStateMock,
             $layoutMock,
-            $this->_oauthServiceMock,
             $localeResolverMock,
             $pathProcessorMock,
             $areaListMock
@@ -177,13 +169,6 @@ EXPECTED_MESSAGE;
     {
         $this->_appStateMock->expects($this->any())->method('isInstalled')->will($this->returnValue(true));
         $this->_soapServerMock->expects($this->once())->method('handle');
-        $this->_oauthServiceMock->expects(
-            $this->once()
-        )->method(
-            'validateAccessToken'
-        )->will(
-            $this->returnValue(true)
-        );
         $response = $this->_soapController->dispatch($this->_requestMock);
         $this->assertEquals(200, $response->getHttpResponseCode());
     }
@@ -247,13 +232,3 @@ EXPECTED_MESSAGE;
     }
 }
 
-/**
- * The function became available in CLI mode since PHP 5.5.7 which doesn't fit Magento minimal requirement.
- * @see http://php.net/manual/en/function.getallheaders.php
- * @return array
- */
-function getallheaders()
-{
-    // Mixed case on purpose
-    return array('authOrization' => 'OAuth access_token');
-}
diff --git a/dev/tests/unit/testsuite/Magento/Webapi/Model/Authorization/GuestUserContextTest.php b/dev/tests/unit/testsuite/Magento/Webapi/Model/Authorization/GuestUserContextTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..0f4b9ac39f219c5439e6a213f904c6306d042dac
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Webapi/Model/Authorization/GuestUserContextTest.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\Webapi\Model\Authorization;
+
+use Magento\Authorization\Model\UserContextInterface;
+
+/**
+ * Tests Magento\Webapi\Model\Authorization\GuestUserContext
+ */
+class GuestUserContextTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\TestFramework\Helper\ObjectManager
+     */
+    protected $objectManager;
+
+    /**
+     * @var \Magento\Webapi\Model\Authorization\GuestUserContext
+     */
+    protected $guestUserContext;
+
+    protected function setUp()
+    {
+        $this->objectManager = new \Magento\TestFramework\Helper\ObjectManager($this);
+
+        $this->guestUserContext = $this->objectManager->getObject(
+            'Magento\Webapi\Model\Authorization\GuestUserContext'
+        );
+    }
+
+    public function testGetUserId()
+    {
+        $this->assertEquals(null, $this->guestUserContext->getUserId());
+    }
+
+    public function testGetUserType()
+    {
+        $this->assertEquals(UserContextInterface::USER_TYPE_GUEST, $this->guestUserContext->getUserType());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Webapi/Model/Authorization/OauthUserContextTest.php b/dev/tests/unit/testsuite/Magento/Webapi/Model/Authorization/OauthUserContextTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..094b5db72d15d9d34703b7db6deb0472f7fa8d22
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Webapi/Model/Authorization/OauthUserContextTest.php
@@ -0,0 +1,159 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Webapi\Model\Authorization;
+
+use Magento\Authorization\Model\UserContextInterface;
+
+/**
+ * Tests \Magento\Webapi\Model\Authorization\OauthUserContext
+ */
+class OauthUserContextTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\TestFramework\Helper\ObjectManager
+     */
+    protected $objectManager;
+
+    /**
+     * @var \Magento\Webapi\Model\Authorization\OauthUserContext
+     */
+    protected $oauthUserContext;
+
+    /**
+     * @var \Magento\Webapi\Controller\Request
+     */
+    protected $request;
+
+    /**
+     * @var \Magento\Framework\Oauth\Helper\Request
+     */
+    protected $oauthRequestHelper;
+
+    /**
+     * @var \Magento\Integration\Service\V1\Integration
+     */
+    protected $integrationService;
+
+    /**
+     * @var \Magento\Framework\Oauth\Oauth
+     */
+    protected $oauthService;
+
+    protected function setUp()
+    {
+        $this->objectManager = new \Magento\TestFramework\Helper\ObjectManager($this);
+
+        $this->request = $this->getMockBuilder('Magento\Webapi\Controller\Request')
+            ->disableOriginalConstructor()
+            ->setMethods(['getConsumerId'])
+            ->getMock();
+
+        $this->integrationService = $this->getMockBuilder('Magento\Integration\Service\V1\Integration')
+            ->disableOriginalConstructor()
+            ->setMethods(['findActiveIntegrationByConsumerId'])
+            ->getMock();
+
+        $this->oauthRequestHelper = $this->getMockBuilder('Magento\Framework\Oauth\Helper\Request')
+            ->disableOriginalConstructor()
+            ->setMethods(['prepareRequest'])
+            ->getMock();
+
+        $this->oauthService = $this->getMockBuilder('Magento\Framework\Oauth\Oauth')
+            ->disableOriginalConstructor()
+            ->setMethods(['validateAccessTokenRequest'])
+            ->getMock();
+
+        $this->oauthUserContext = $this->objectManager->getObject(
+            'Magento\Webapi\Model\Authorization\OauthUserContext',
+            [
+                'request' => $this->request,
+                'integrationService' => $this->integrationService,
+                'oauthService' => $this->oauthService,
+                'oauthHelper' => $this->oauthRequestHelper
+            ]
+        );
+    }
+
+    public function testGetUserType()
+    {
+        $this->assertEquals(UserContextInterface::USER_TYPE_INTEGRATION, $this->oauthUserContext->getUserType());
+    }
+
+    public function testGetUserIdExist()
+    {
+        $integrationId = 12345;
+
+        $this->setupUserId($integrationId, ['oauth_token' => 'asdcfsdvanskdcalkdsjcfljldk']);
+
+        $this->assertEquals($integrationId, $this->oauthUserContext->getUserId());
+    }
+
+    public function testGetUserIdDoesNotExist()
+    {
+        $integrationId = null;
+
+        $this->setupUserId($integrationId, ['oauth_token' => 'asdcfsdvanskdcalkdsjcfljldk']);
+
+        $this->assertEquals($integrationId, $this->oauthUserContext->getUserId());
+    }
+
+    public function testGetUserIdNoOauthInformation()
+    {
+        $integrationId = 12345;
+
+        $this->setupUserId($integrationId, []);
+
+        $this->assertEquals(null, $this->oauthUserContext->getUserId());
+    }
+
+    /**
+     * @param int|null $integrationId
+     * @param array $oauthRequest
+     * @return void
+     */
+    public function setupUserId($integrationId, $oauthRequest)
+    {
+        $integration = $this->getMockBuilder('Magento\Integration\Model\Integration')
+            ->disableOriginalConstructor()
+            ->setMethods(['getId', '__wakeup'])
+            ->getMock();
+
+        $this->integrationService->expects($this->any())
+            ->method('findActiveIntegrationByConsumerId')
+            ->will($this->returnValue($integration));
+
+        $this->oauthRequestHelper->expects($this->once())
+            ->method('prepareRequest')
+            ->will($this->returnValue($oauthRequest));
+
+        $this->oauthService->expects($this->any())
+            ->method('validateAccessTokenRequest')
+            ->will($this->returnValue(1));
+
+        $integration->expects($this->any())
+            ->method('getId')
+            ->will($this->returnValue($integrationId));
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Webapi/Model/Authorization/TokenUserContextTest.php b/dev/tests/unit/testsuite/Magento/Webapi/Model/Authorization/TokenUserContextTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..94f162e7d09dafa4c2cd86bab2c22707f4954c0d
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Webapi/Model/Authorization/TokenUserContextTest.php
@@ -0,0 +1,239 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Webapi\Model\Authorization;
+
+use Magento\Authorization\Model\UserContextInterface;
+
+/**
+ * Tests \Magento\Webapi\Model\Authorization\TokenUserContext
+ */
+class TokenUserContextTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\TestFramework\Helper\ObjectManager
+     */
+    protected $objectManager;
+
+    /**
+     * @var \Magento\Webapi\Model\Authorization\TokenUserContext
+     */
+    protected $tokenUserContext;
+
+    /**
+     * @var \Magento\Integration\Model\Oauth\TokenFactory
+     */
+    protected $tokenFactory;
+
+    /**
+     * @var \Magento\Integration\Service\V1\Integration
+     */
+    protected $integrationService;
+
+    /**
+     * @var \Magento\Webapi\Controller\Request
+     */
+    protected $request;
+
+    protected function setUp()
+    {
+        $this->objectManager = new \Magento\TestFramework\Helper\ObjectManager($this);
+
+        $this->request = $this->getMockBuilder('Magento\Webapi\Controller\Request')
+            ->disableOriginalConstructor()
+            ->setMethods(['getHeader'])
+            ->getMock();
+
+        $this->tokenFactory = $this->getMockBuilder('Magento\Integration\Model\Oauth\TokenFactory')
+            ->disableOriginalConstructor()
+            ->setMethods(['create'])
+            ->getMock();
+
+        $this->integrationService = $this->getMockBuilder('Magento\Integration\Service\V1\Integration')
+            ->disableOriginalConstructor()
+            ->setMethods(['findByConsumerId'])
+            ->getMock();
+
+        $this->tokenUserContext = $this->objectManager->getObject(
+            'Magento\Webapi\Model\Authorization\TokenUserContext',
+            [
+                'request' => $this->request,
+                'tokenFactory' => $this->tokenFactory,
+                'integrationService' => $this->integrationService
+            ]
+        );
+    }
+
+    public function testNoAuthorizationHeader()
+    {
+        $this->request->expects($this->once())
+            ->method('getHeader')
+            ->with('Authorization')
+            ->will($this->returnValue(null));
+        $this->assertNull($this->tokenUserContext->getUserType());
+        $this->assertNull($this->tokenUserContext->getUserId());
+    }
+
+    public function testNoTokenInHeader()
+    {
+        $this->request->expects($this->once())
+            ->method('getHeader')
+            ->with('Authorization')
+            ->will($this->returnValue('Bearer'));
+        $this->assertNull($this->tokenUserContext->getUserType());
+        $this->assertNull($this->tokenUserContext->getUserId());
+    }
+
+    public function testNotBearerToken()
+    {
+        $this->request->expects($this->once())
+            ->method('getHeader')
+            ->with('Authorization')
+            ->will($this->returnValue('Access'));
+        $this->assertNull($this->tokenUserContext->getUserType());
+        $this->assertNull($this->tokenUserContext->getUserId());
+    }
+
+    public function testNoTokenInDatabase()
+    {
+        $bearerToken = 'bearer1234';
+
+        $this->request->expects($this->once())
+            ->method('getHeader')
+            ->with('Authorization')
+            ->will($this->returnValue("Bearer {$bearerToken}"));
+
+        $token = $this->getMockBuilder('Magento\Integration\Model\Oauth\Token')
+            ->disableOriginalConstructor()
+            ->setMethods(['loadByToken', 'getId', '__wakeup'])
+            ->getMock();
+        $this->tokenFactory->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($token));
+        $token->expects($this->once())
+            ->method('loadByToken')
+            ->with($bearerToken)
+            ->will($this->returnSelf());
+        $token->expects($this->once())
+            ->method('getId')
+            ->will($this->returnValue(null));
+
+        $this->assertNull($this->tokenUserContext->getUserType());
+        $this->assertNull($this->tokenUserContext->getUserId());
+    }
+
+    /**
+     * @dataProvider getValidTokenData
+     */
+    public function testValidToken($userType, $userId, $expectedUserType, $expectedUserId)
+    {
+        $bearerToken = 'bearer1234';
+
+        $this->request->expects($this->once())
+            ->method('getHeader')
+            ->with('Authorization')
+            ->will($this->returnValue("Bearer {$bearerToken}"));
+
+        $token = $this->getMockBuilder('Magento\Integration\Model\Oauth\Token')
+            ->disableOriginalConstructor()
+            ->setMethods(['loadByToken', 'getId', 'getUserType', 'getCustomerId', 'getAdminId', '__wakeup'])
+            ->getMock();
+        $this->tokenFactory->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($token));
+        $token->expects($this->once())
+            ->method('loadByToken')
+            ->with($bearerToken)
+            ->will($this->returnSelf());
+        $token->expects($this->once())
+            ->method('getId')
+            ->will($this->returnValue(1));
+        $token->expects($this->once())
+            ->method('getUserType')
+            ->will($this->returnValue($userType));
+
+        $integration = $this->getMockBuilder('Magento\Integration\Model\Integration')
+            ->disableOriginalConstructor()
+            ->setMethods(['getId', '__wakeup'])
+            ->getMock();
+
+        switch($userType) {
+            case UserContextInterface::USER_TYPE_INTEGRATION:
+                $integration->expects($this->once())
+                    ->method('getId')
+                    ->will($this->returnValue($userId));
+                $this->integrationService->expects($this->once())
+                    ->method('findByConsumerId')
+                    ->will($this->returnValue($integration));
+                break;
+            case UserContextInterface::USER_TYPE_ADMIN:
+                $token->expects($this->once())
+                    ->method('getAdminId')
+                    ->will($this->returnValue($userId));
+                break;
+            case UserContextInterface::USER_TYPE_CUSTOMER:
+                $token->expects($this->once())
+                    ->method('getCustomerId')
+                    ->will($this->returnValue($userId));
+                break;
+        }
+
+        $this->assertEquals($expectedUserType, $this->tokenUserContext->getUserType());
+        $this->assertEquals($expectedUserId, $this->tokenUserContext->getUserId());
+
+        /* check again to make sure that the above methods were only called once */
+        $this->assertEquals($expectedUserType, $this->tokenUserContext->getUserType());
+        $this->assertEquals($expectedUserId, $this->tokenUserContext->getUserId());
+    }
+
+    public function getValidTokenData()
+    {
+        return [
+            'admin token' => [
+                UserContextInterface::USER_TYPE_ADMIN,
+                1234,
+                UserContextInterface::USER_TYPE_ADMIN,
+                1234,
+            ],
+            'customer token' => [
+                UserContextInterface::USER_TYPE_CUSTOMER,
+                1234,
+                UserContextInterface::USER_TYPE_CUSTOMER,
+                1234,
+            ],
+            'integration token' => [
+                UserContextInterface::USER_TYPE_INTEGRATION,
+                1234,
+                UserContextInterface::USER_TYPE_INTEGRATION,
+                1234,
+            ],
+            'guest user type' => [
+                UserContextInterface::USER_TYPE_GUEST,
+                1234,
+                null,
+                null,
+            ]
+        ];
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Webapi/Model/Config/_files/webapi.php b/dev/tests/unit/testsuite/Magento/Webapi/Model/Config/_files/webapi.php
index f703703fadd69a985439947d0b291b6859ba5ed9..a96970f7d578ea436c330101c0c54b0489d3c7b3 100644
--- a/dev/tests/unit/testsuite/Magento/Webapi/Model/Config/_files/webapi.php
+++ b/dev/tests/unit/testsuite/Magento/Webapi/Model/Config/_files/webapi.php
@@ -79,9 +79,7 @@ return [
                 'parameters' => [
                     'id' => [
                         'force' => true,
-                        'source' => 'session',
-                        'method' => 'getUserId',
-                        'value' => null,
+                        'value' => '%customer_id%',
                     ],
                 ],
             ],
diff --git a/dev/tests/unit/testsuite/Magento/Webapi/Model/Config/_files/webapi.xml b/dev/tests/unit/testsuite/Magento/Webapi/Model/Config/_files/webapi.xml
index 122d07975bdcd3979a06f7df17afc270d31eabbe..b820ab33cde0fc763661dadfb8298d4b5e901c49 100644
--- a/dev/tests/unit/testsuite/Magento/Webapi/Model/Config/_files/webapi.xml
+++ b/dev/tests/unit/testsuite/Magento/Webapi/Model/Config/_files/webapi.xml
@@ -40,7 +40,7 @@
             <resource ref="Magento_Customer::customer_self" />
         </resources>
         <data>
-            <parameter name="id" force="true" source="session" method="getUserId">null</parameter>
+            <parameter name="id" force="true">%customer_id%</parameter>
         </data>
     </route>
     <route url="/V1/customers/me" method="PUT" secure="true">
diff --git a/dev/tests/unit/testsuite/Magento/Webapi/Model/Plugin/IntegrationServiceV1Test.php b/dev/tests/unit/testsuite/Magento/Webapi/Model/Plugin/Service/V1/IntegrationTest.php
similarity index 52%
rename from dev/tests/unit/testsuite/Magento/Webapi/Model/Plugin/IntegrationServiceV1Test.php
rename to dev/tests/unit/testsuite/Magento/Webapi/Model/Plugin/Service/V1/IntegrationTest.php
index ce96df7e15052658e27e05248267478d7668fcfb..81c3c698316783800a07eeb9a2e9d2c50218cc51 100644
--- a/dev/tests/unit/testsuite/Magento/Webapi/Model/Plugin/IntegrationServiceV1Test.php
+++ b/dev/tests/unit/testsuite/Magento/Webapi/Model/Plugin/Service/V1/IntegrationTest.php
@@ -21,31 +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\Webapi\Model\Plugin;
+namespace Magento\Webapi\Model\Plugin\Service\V1;
 
-use Magento\Authz\Model\UserIdentifier;
 use Magento\Integration\Model\Integration;
+use Magento\Authorization\Model\Acl\AclRetriever;
 
-class IntegrationServiceV1Test extends \PHPUnit_Framework_TestCase
+class IntegrationTest extends \PHPUnit_Framework_TestCase
 {
-    /**
-     * Authorization service mock
-     *
-     * @var \Magento\Authz\Service\AuthorizationV1
-     */
-    protected $authzServiceMock;
-
-    /**
-     * Mock for UserIdentifier Factory
-     *
-     * @var \Magento\Authz\Model\UserIdentifier\Factory
-     */
-    protected $userIdentifierFactoryMock;
-
     /**
      * API setup plugin
      *
-     * @var \Magento\Webapi\Model\Plugin\IntegrationServiceV1
+     * @var \Magento\Webapi\Model\Plugin\Service\V1\Integration
      */
     protected $integrationV1Plugin;
 
@@ -54,49 +40,43 @@ class IntegrationServiceV1Test extends \PHPUnit_Framework_TestCase
      */
     protected $subjectMock;
 
+    /** @var  AclRetriever */
+    protected $aclRetrieverMock;
+
+    /**
+     * @var \Magento\Integration\Service\V1\AuthorizationServiceInterface
+     */
+    protected $integrationAuthServiceMock;
+
     public function setUp()
     {
-        $this->authzServiceMock = $this->getMockBuilder(
-            '\Magento\Authz\Service\AuthorizationV1'
-        )->disableOriginalConstructor()->setMethods(
-            array('removePermissions')
-        )->getMock();
-        $this->userIdentifierFactoryMock = $this->getMockBuilder(
-            '\Magento\Authz\Model\UserIdentifier\Factory'
-        )->disableOriginalConstructor()->setMethods(
-            array('create')
-        )->getMock();
         $this->subjectMock = $this->getMock('Magento\Integration\Service\V1\Integration', array(), array(), '', false);
-        $this->integrationV1Plugin = new \Magento\Webapi\Model\Plugin\IntegrationServiceV1(
-            $this->authzServiceMock,
-            $this->userIdentifierFactoryMock
+        $this->integrationAuthServiceMock = $this->getMockBuilder(
+            'Magento\Integration\Service\V1\AuthorizationServiceInterface'
+        )->disableOriginalConstructor()->getMock();
+        $this->aclRetrieverMock = $this->getMockBuilder('Magento\Authorization\Model\Acl\AclRetriever')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->integrationV1Plugin = new \Magento\Webapi\Model\Plugin\Service\V1\Integration(
+            $this->integrationAuthServiceMock,
+            $this->aclRetrieverMock
         );
     }
 
     public function testAfterDelete()
     {
+        $integrationId = 1;
         $integrationsData = array(
-            Integration::ID => 1,
+            Integration::ID => $integrationId,
             Integration::NAME => 'TestIntegration1',
             Integration::EMAIL => 'test-integration1@magento.com',
             Integration::ENDPOINT => 'http://endpoint.com',
             Integration::SETUP_TYPE => 1
         );
-        $userIdentifierMock = $this->getMockBuilder(
-            '\Magento\Authz\Model\UserIdentifier'
-        )->disableOriginalConstructor()->getMock();
-        $this->authzServiceMock->expects($this->once())->method('removePermissions')->with($userIdentifierMock);
-        $this->userIdentifierFactoryMock->expects(
-            $this->at(0)
-        )->method(
-            'create'
-        )->with(
-            UserIdentifier::USER_TYPE_INTEGRATION,
-            1
-        )->will(
-            $this->returnValue($userIdentifierMock)
-        );
-        $this->authzServiceMock->expects($this->once())->method('removePermissions')->with($userIdentifierMock);
+
+        $this->integrationAuthServiceMock->expects($this->once())
+            ->method('removePermissions')
+            ->with($integrationId);
         $this->integrationV1Plugin->afterDelete($this->subjectMock, $integrationsData);
     }
 }
diff --git a/dev/tests/unit/testsuite/Magento/Webapi/Model/Plugin/SetupTest.php b/dev/tests/unit/testsuite/Magento/Webapi/Model/Plugin/SetupTest.php
index 1a2f385c36ed0353011bd528b2ed581edf4ff7e4..0bdb4c8574ba7920a5108483b9b86b5d3e36816f 100644
--- a/dev/tests/unit/testsuite/Magento/Webapi/Model/Plugin/SetupTest.php
+++ b/dev/tests/unit/testsuite/Magento/Webapi/Model/Plugin/SetupTest.php
@@ -23,7 +23,6 @@
  */
 namespace Magento\Webapi\Model\Plugin;
 
-use Magento\Authz\Model\UserIdentifier;
 use Magento\Integration\Model\Integration;
 
 class SetupTest extends \PHPUnit_Framework_TestCase
@@ -45,16 +44,9 @@ class SetupTest extends \PHPUnit_Framework_TestCase
     /**
      * Authorization service mock
      *
-     * @var \Magento\Authz\Service\AuthorizationV1
+     * @var \Magento\Integration\Service\V1\AuthorizationService
      */
-    protected $authzServiceMock;
-
-    /**
-     * Mock for UserIdentifier Factory
-     *
-     * @var \Magento\Authz\Model\UserIdentifier\Factory
-     */
-    protected $userIdentifierFactoryMock;
+    protected $integrationAuthorizationServiceMock;
 
     /**
      * API setup plugin
@@ -82,24 +74,17 @@ class SetupTest extends \PHPUnit_Framework_TestCase
             array('findByName')
         )->getMock();
 
-        $this->authzServiceMock = $this->getMockBuilder(
-            '\Magento\Authz\Service\AuthorizationV1'
+        $this->integrationAuthorizationServiceMock = $this->getMockBuilder(
+            '\Magento\Integration\Service\V1\AuthorizationService'
         )->disableOriginalConstructor()->setMethods(
             array('grantPermissions')
         )->getMock();
 
-        $this->userIdentifierFactoryMock = $this->getMockBuilder(
-            '\Magento\Authz\Model\UserIdentifier\Factory'
-        )->disableOriginalConstructor()->setMethods(
-            array('create')
-        )->getMock();
-
         $this->subjectMock = $this->getMock('Magento\Integration\Model\Resource\Setup', array(), array(), '', false);
         $this->apiSetupPlugin = new \Magento\Webapi\Model\Plugin\Setup(
             $this->integrationConfigMock,
-            $this->authzServiceMock,
-            $this->integrationServiceMock,
-            $this->userIdentifierFactoryMock
+            $this->integrationAuthorizationServiceMock,
+            $this->integrationServiceMock
         );
     }
 
@@ -107,8 +92,6 @@ class SetupTest extends \PHPUnit_Framework_TestCase
     {
         $this->integrationConfigMock->expects($this->never())->method('getIntegrations');
         $this->integrationServiceMock->expects($this->never())->method('findByName');
-        $this->authzServiceMock->expects($this->never())->method('grantPermissions');
-        $this->userIdentifierFactoryMock->expects($this->never())->method('create');
         $this->apiSetupPlugin->afterInitIntegrationProcessing($this->subjectMock, array());
     }
 
@@ -137,10 +120,11 @@ class SetupTest extends \PHPUnit_Framework_TestCase
                 )
             )
         );
+        $firstInegrationId = 1;
 
         $integrationsData1 = new \Magento\Framework\Object(
             array(
-                'id' => 1,
+                'id' => $firstInegrationId,
                 Integration::NAME => 'TestIntegration1',
                 Integration::EMAIL => 'test-integration1@magento.com',
                 Integration::ENDPOINT => 'http://endpoint.com',
@@ -148,9 +132,10 @@ class SetupTest extends \PHPUnit_Framework_TestCase
             )
         );
 
+        $secondIntegrationId = 2;
         $integrationsData2 = new \Magento\Framework\Object(
             array(
-                'id' => 2,
+                'id' => $secondIntegrationId,
                 Integration::NAME => 'TestIntegration2',
                 Integration::EMAIL => 'test-integration2@magento.com',
                 Integration::SETUP_TYPE => 1
@@ -177,51 +162,6 @@ class SetupTest extends \PHPUnit_Framework_TestCase
             $this->returnValue($integrationsData2)
         );
 
-        $userIdentifierMock1 = $this->getMockBuilder(
-            '\Magento\Authz\Model\UserIdentifier'
-        )->disableOriginalConstructor()->getMock();
-        $this->userIdentifierFactoryMock->expects(
-            $this->at(0)
-        )->method(
-            'create'
-        )->with(
-            UserIdentifier::USER_TYPE_INTEGRATION,
-            1
-        )->will(
-            $this->returnValue($userIdentifierMock1)
-        );
-
-        $userIdentifierMock2 = $this->getMockBuilder(
-            '\Magento\Authz\Model\UserIdentifier'
-        )->disableOriginalConstructor()->getMock();
-        $this->userIdentifierFactoryMock->expects(
-            $this->at(1)
-        )->method(
-            'create'
-        )->with(
-            UserIdentifier::USER_TYPE_INTEGRATION,
-            2
-        )->will(
-            $this->returnValue($userIdentifierMock2)
-        );
-
-        $this->authzServiceMock->expects(
-            $this->at(0)
-        )->method(
-            'grantPermissions'
-        )->with(
-            $userIdentifierMock1,
-            $testIntegration1Resource
-        );
-        $this->authzServiceMock->expects(
-            $this->at(1)
-        )->method(
-            'grantPermissions'
-        )->with(
-            $userIdentifierMock2,
-            $testIntegration2Resource
-        );
-
         $this->apiSetupPlugin->afterInitIntegrationProcessing(
             $this->subjectMock,
             array('TestIntegration1', 'TestIntegration2')
diff --git a/dev/tests/unit/testsuite/Magento/Webapi/Model/WebapiRoleLocatorTest.php b/dev/tests/unit/testsuite/Magento/Webapi/Model/WebapiRoleLocatorTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..6e389806d7ecb933a655119d20c7b65fb40ef0ea
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Webapi/Model/WebapiRoleLocatorTest.php
@@ -0,0 +1,135 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Webapi\Model;
+
+use Magento\Authorization\Model\Resource\Role\CollectionFactory as RoleCollectionFactory;
+use Magento\Authorization\Model\Resource\Role\Collection as RoleCollection;
+use Magento\Authorization\Model\Role;
+use Magento\Authorization\Model\UserContextInterface;
+
+class WebapiRoleLocatorTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Webapi\Model\WebapiRoleLocator
+     */
+    protected $locator;
+
+    /**
+     * @var \Magento\TestFramework\Helper\ObjectManager
+     */
+    protected $objectManager;
+
+    /**
+     * @var UserContextInterface
+     */
+    protected $userContext;
+
+    /**
+     * @var RoleCollectionFactory
+     */
+    protected $roleCollectionFactory;
+
+    /**
+     * @var RoleCollection
+     */
+    protected $roleCollection;
+
+    /**
+     * @var Role
+     */
+    protected $role;
+
+    protected function setUp()
+    {
+        $this->_objectManager = new \Magento\TestFramework\Helper\ObjectManager($this);
+
+        $userId = 'userId';
+        $userType = 'userType';
+
+        $this->userContext = $this->getMockBuilder('Magento\Authorization\Model\CompositeUserContext')
+            ->disableOriginalConstructor()
+            ->setMethods(['getUserId', 'getUserType'])
+            ->getMock();
+        $this->userContext->expects($this->once())
+            ->method('getUserId')
+            ->will($this->returnValue($userId));
+        $this->userContext->expects($this->once())
+            ->method('getUserType')
+            ->will($this->returnValue($userType));
+
+        $this->roleCollectionFactory = $this->getMockBuilder(
+            'Magento\Authorization\Model\Resource\Role\CollectionFactory'
+        )->disableOriginalConstructor()->setMethods(['create'])->getMock();
+
+        $this->roleCollection = $this->getMockBuilder('Magento\Authorization\Model\Resource\Role\Collection')
+            ->disableOriginalConstructor()
+            ->setMethods(['setUserFilter', 'getFirstItem'])
+            ->getMock();
+        $this->roleCollectionFactory->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($this->roleCollection));
+        $this->roleCollection->expects($this->once())
+            ->method('setUserFilter')
+            ->with($userId, $userType)
+            ->will($this->returnValue($this->roleCollection));
+
+        $this->role = $this->getMockBuilder('Magento\Authorization\Model\Role')
+            ->disableOriginalConstructor()
+            ->setMethods(['getId', '__wakeup'])
+            ->getMock();
+
+        $this->roleCollection->expects($this->once())
+            ->method('getFirstItem')
+            ->will($this->returnValue($this->role));
+
+        $this->locator = $this->_objectManager->getObject(
+            'Magento\Webapi\Model\WebapiRoleLocator',
+            [
+                'userContext' => $this->userContext,
+                'roleCollectionFactory' => $this->roleCollectionFactory
+            ]
+        );
+    }
+
+    public function testNoRoleId()
+    {
+        $this->role->expects($this->once())
+            ->method('getId')
+            ->will($this->returnValue(null));
+
+        $this->assertEquals('', $this->locator->getAclRoleId());
+    }
+
+    public function testGetAclRoleId()
+    {
+        $roleId = 9;
+
+        $this->role->expects($this->exactly(2))
+            ->method('getId')
+            ->will($this->returnValue($roleId));
+
+        $this->assertEquals($roleId, $this->locator->getAclRoleId());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Backend/Model/_files/session_backend_mock.php b/dev/tests/unit/testsuite/Magento/_files/session_backend_mock.php
similarity index 100%
rename from dev/tests/unit/testsuite/Magento/Backend/Model/_files/session_backend_mock.php
rename to dev/tests/unit/testsuite/Magento/_files/session_backend_mock.php
diff --git a/dev/tools/Magento/Tools/Di/compiler.php b/dev/tools/Magento/Tools/Di/compiler.php
index 60bfb993046b37ce17bc2ad1af88fa97867df878..8c3986a4e45f94a6e40ad2368fdd0544060085ce 100644
--- a/dev/tools/Magento/Tools/Di/compiler.php
+++ b/dev/tools/Magento/Tools/Di/compiler.php
@@ -24,6 +24,7 @@
 require __DIR__ . '/../../../bootstrap.php';
 $rootDir = realpath(__DIR__ . '/../../../../../');
 use Magento\Framework\ObjectManager\Code\Generator\Factory;
+use Magento\Framework\ObjectManager\Code\Generator\Repository;
 use Magento\Framework\ObjectManager\Code\Generator\Proxy;
 use Magento\Tools\Di\Compiler\Log\Log;
 use Magento\Tools\Di\Compiler\Log\Writer;
@@ -31,6 +32,11 @@ use Magento\Tools\Di\Compiler\Directory;
 use Magento\Tools\Di\Code\Scanner;
 use Magento\Tools\Di\Definition\Compressor;
 use Magento\Tools\Di\Definition\Serializer;
+use Magento\Framework\Service\Code\Generator\Builder;
+use Magento\Framework\Service\Code\Generator\Mapper;
+use Magento\Framework\ObjectManager\Code\Generator\Converter;
+use Magento\Framework\Service\Code\Generator\SearchResults;
+use Magento\Framework\Service\Code\Generator\SearchResultsBuilder;
 
 $filePatterns = array('php' => '/.*\.php$/', 'di' => '/\/etc\/([a-zA-Z_]*\/di|di)\.xml$/');
 $codeScanDir = realpath($rootDir . '/app');
@@ -97,10 +103,18 @@ try {
         array(
             \Magento\Framework\Interception\Code\Generator\Interceptor::ENTITY_TYPE =>
                 'Magento\Framework\Interception\Code\Generator\Interceptor',
+            SearchResultsBuilder::ENTITY_TYPE => 'Magento\Framework\Service\Code\Generator\SearchResultsBuilder',
             Proxy::ENTITY_TYPE => 'Magento\Framework\ObjectManager\Code\Generator\Proxy',
-            Factory::ENTITY_TYPE => 'Magento\Framework\ObjectManager\Code\Generator\Factory'
+            Factory::ENTITY_TYPE => 'Magento\Framework\ObjectManager\Code\Generator\Factory',
+            Builder::ENTITY_TYPE => 'Magento\Framework\Service\Code\Generator\Builder',
+            Mapper::ENTITY_TYPE => 'Magento\Framework\Service\Code\Generator\Mapper',
+            Repository::ENTITY_TYPE => 'Magento\Framework\ObjectManager\Code\Generator\Repository',
+            Converter::ENTITY_TYPE => 'Magento\Framework\ObjectManager\Code\Generator\Converter',
+            SearchResults::ENTITY_TYPE => 'Magento\Framework\Service\Code\Generator\SearchResults',
         )
     );
+    $autoloader = new \Magento\Framework\Code\Generator\Autoloader($generator);
+    spl_autoload_register(array($autoloader, 'load'));
     foreach (array('php', 'additional') as $type) {
         sort($entities[$type]);
         foreach ($entities[$type] as $entityName) {
diff --git a/dev/tools/Magento/Tools/Di/entity_generator.php b/dev/tools/Magento/Tools/Di/entity_generator.php
index 0729797407b03125aeef083336d156652ac9bfe7..21745c00408b062481c9ec9a4a0f6acc3f3db698 100644
--- a/dev/tools/Magento/Tools/Di/entity_generator.php
+++ b/dev/tools/Magento/Tools/Di/entity_generator.php
@@ -29,6 +29,12 @@ use Magento\Framework\ObjectManager\Code\Generator\Factory;
 use Magento\Framework\ObjectManager\Code\Generator\Proxy;
 use Magento\Framework\Interception\Code\Generator\Interceptor;
 use Magento\Framework\Exception;
+use Magento\Framework\Service\Code\Generator\Builder;
+use Magento\Framework\Service\Code\Generator\Mapper;
+use Magento\Framework\ObjectManager\Code\Generator\Repository;
+use Magento\Framework\ObjectManager\Code\Generator\Converter;
+use Magento\Framework\Service\Code\Generator\SearchResults;
+use Magento\Framework\Service\Code\Generator\SearchResultsBuilder;
 
 require __DIR__ . '/../../../../../app/bootstrap.php';
 
@@ -87,12 +93,24 @@ $generator = new Generator(
     null,
     $io,
     [
+        SearchResultsBuilder::ENTITY_TYPE =>
+            'Magento\Framework\Service\Code\Generator\SearchResultsBuilder',
         Proxy::ENTITY_TYPE =>
             'Magento\Framework\ObjectManager\Code\Generator\Proxy',
         Factory::ENTITY_TYPE =>
             'Magento\Framework\ObjectManager\Code\Generator\Factory',
         Interceptor::ENTITY_TYPE =>
-            'Magento\Framework\Interception\Code\Generator\Interceptor'
+            'Magento\Framework\Interception\Code\Generator\Interceptor',
+        Builder::ENTITY_TYPE =>
+            'Magento\Framework\Service\Code\Generator\Builder',
+        Mapper::ENTITY_TYPE =>
+            'Magento\Framework\Service\Code\Generator\Mapper',
+        Repository::ENTITY_TYPE =>
+            'Magento\Framework\ObjectManager\Code\Generator\Repository',
+        Converter::ENTITY_TYPE =>
+            'Magento\Framework\ObjectManager\Code\Generator\Converter',
+        SearchResults::ENTITY_TYPE =>
+            'Magento\Framework\Service\Code\Generator\SearchResults',
     ]
 );
 
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 ad701200fc976ca96c03517221b87a4e82b60db1..66abe867592986ed6c3ab4d8f9c9b53e700bc062 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
@@ -30,8 +30,8 @@
 
 return array(
     'admin/assert' => 'admin_assert',
-    'admin/role' => 'admin_role',
-    'admin/rule' => 'admin_rule',
+    'admin/role' => 'authorization_role',
+    'admin/rule' => 'authorization_rule',
     'admin/user' => 'admin_user',
     'adminnotification/inbox' => 'adminnotification_inbox',
     'amazonpayments/api_debug' => 'amazonpayments_api_debug',
diff --git a/lib/internal/Magento/Framework/Acl/Resource/Provider.php b/lib/internal/Magento/Framework/Acl/Resource/Provider.php
index 33241737c12018e31c172b0868909d8144ae7cd2..003a23607ff64733541a5ec65f1fab6943f83901 100644
--- a/lib/internal/Magento/Framework/Acl/Resource/Provider.php
+++ b/lib/internal/Magento/Framework/Acl/Resource/Provider.php
@@ -50,8 +50,7 @@ class Provider implements ProviderInterface
      */
     public function getAclResources()
     {
-        // TODO: As soon as all acl.xml files are moved to global scope, default ('global') scope should be used
-        $aclResourceConfig = $this->_configReader->read('adminhtml');
+        $aclResourceConfig = $this->_configReader->read();
         if (!empty($aclResourceConfig['config']['acl']['resources'])) {
             return $this->_resourceTreeBuilder->build($aclResourceConfig['config']['acl']['resources']);
         }
diff --git a/lib/internal/Magento/Framework/AppInterface.php b/lib/internal/Magento/Framework/AppInterface.php
index b3124782474f9130194eac121c7792b2b67ea8e0..cf5e5daaa9d6941286f35e668ff8367c0ef36721 100644
--- a/lib/internal/Magento/Framework/AppInterface.php
+++ b/lib/internal/Magento/Framework/AppInterface.php
@@ -35,7 +35,7 @@ interface AppInterface
     /**
      * Magento version
      */
-    const VERSION = '0.1.0-alpha89';
+    const VERSION = '0.1.0-alpha90';
 
     /**
      * Launch application
diff --git a/lib/internal/Magento/Framework/Authorization/RoleLocator.php b/lib/internal/Magento/Framework/Authorization/RoleLocator.php
index ecfa82873b580069d34444925b653229faa09e9d..8fb144449ae39205333d4165184aa7228356abd3 100644
--- a/lib/internal/Magento/Framework/Authorization/RoleLocator.php
+++ b/lib/internal/Magento/Framework/Authorization/RoleLocator.php
@@ -32,7 +32,7 @@ interface RoleLocator
     /**
      * Retrieve current role
      *
-     * @return string
+     * @return string|null
      */
     public function getAclRoleId();
 }
diff --git a/lib/internal/Magento/Framework/Code/Generator/EntityAbstract.php b/lib/internal/Magento/Framework/Code/Generator/EntityAbstract.php
index b85c38054b5fdf6feaa778ca77327f2281c28c9c..6d1c0e40382dc789323f7970c92177f4fb6acf22 100644
--- a/lib/internal/Magento/Framework/Code/Generator/EntityAbstract.php
+++ b/lib/internal/Magento/Framework/Code/Generator/EntityAbstract.php
@@ -259,8 +259,6 @@ abstract class EntityAbstract
         $resultClassName = $this->_getResultClassName();
         $resultFileName = $this->_ioObject->getResultFileName($resultClassName);
 
-        $autoloader = $this->_autoloader;
-
         // @todo the controller handling logic below must be removed when controllers become PSR-0 compliant
         $controllerSuffix = 'Controller';
         $pathParts = explode('_', $sourceClassName);
@@ -286,13 +284,13 @@ abstract class EntityAbstract
             $filePath = stream_resolve_include_path(str_replace('_', '/', $controllerPath) . '.php');
             $isSourceClassValid = !empty($filePath);
         } else {
-            $isSourceClassValid = $autoloader->getFile($sourceClassName);
+            $isSourceClassValid = $this->_autoloader->getFile($sourceClassName);
         }
 
         if (!$isSourceClassValid) {
             $this->_addError('Source class ' . $sourceClassName . ' doesn\'t exist.');
             return false;
-        } elseif ($autoloader->getFile($resultClassName)) {
+        } elseif ($this->_autoloader->getFile($resultClassName)) {
             $this->_addError('Result class ' . $resultClassName . ' already exists.');
             return false;
         } elseif (!$this->_ioObject->makeGenerationDirectory()) {
diff --git a/lib/internal/Magento/Framework/Interception/Code/Generator/Interceptor.php b/lib/internal/Magento/Framework/Interception/Code/Generator/Interceptor.php
index 27caa2b95af7d70b0db22bc3740b11de029cc3e6..11809449cbf32671fdbba625bfaa3ffb97291e5a 100644
--- a/lib/internal/Magento/Framework/Interception/Code/Generator/Interceptor.php
+++ b/lib/internal/Magento/Framework/Interception/Code/Generator/Interceptor.php
@@ -141,8 +141,8 @@ class Interceptor extends \Magento\Framework\Code\Generator\EntityAbstract
         $methods[] = array(
             'name' => '__sleep',
             'body' => "if (method_exists(get_parent_class(\$this), '__sleep')) {\n" .
-            "    return parent::__sleep();\n" .
-            "} else {\n" .
+            "    return array_diff(parent::__sleep(), array('pluginLocator', 'pluginList', 'chain', 'subjectType'));" .
+            "\n} else {\n" .
             "    return array_keys(get_class_vars(get_parent_class(\$this)));\n" .
             "}\n"
         );
diff --git a/app/code/Magento/AdminNotification/Model/System/MessageInterface.php b/lib/internal/Magento/Framework/Notification/MessageInterface.php
similarity index 88%
rename from app/code/Magento/AdminNotification/Model/System/MessageInterface.php
rename to lib/internal/Magento/Framework/Notification/MessageInterface.php
index 7ab95cca5bc3c522e5d16c562bd6929f7e6d287c..65f2af1495d5773e83fbf092a12319e9fb0eea91 100644
--- a/app/code/Magento/AdminNotification/Model/System/MessageInterface.php
+++ b/lib/internal/Magento/Framework/Notification/MessageInterface.php
@@ -19,18 +19,28 @@
  * Do not edit or add to this file if you wish to upgrade Magento to newer
  * versions in the future. If you wish to customize Magento for your
  * needs please refer 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\AdminNotification\Model\System;
 
+namespace Magento\Framework\Notification;
+
+/**
+ * Interface for system messages
+ *
+ * Interface MessageInterface
+ */
 interface MessageInterface
 {
     const SEVERITY_CRITICAL = 1;
 
     const SEVERITY_MAJOR = 2;
 
+    const SEVERITY_MINOR = 3;
+
+    const SEVERITY_NOTICE = 4;
+
     /**
      * Retrieve unique message identity
      *
diff --git a/app/code/Magento/AdminNotification/Model/System/MessageList.php b/lib/internal/Magento/Framework/Notification/MessageList.php
similarity index 70%
rename from app/code/Magento/AdminNotification/Model/System/MessageList.php
rename to lib/internal/Magento/Framework/Notification/MessageList.php
index ac86107e988ff4aef0cd9a5fbab75c32c4721435..ac75c22fdfefd250f6852fac7861b3762cca3521 100644
--- a/app/code/Magento/AdminNotification/Model/System/MessageList.php
+++ b/lib/internal/Magento/Framework/Notification/MessageList.php
@@ -17,12 +17,18 @@
  * Do not edit or add to this file if you wish to upgrade Magento to newer
  * versions in the future. If you wish to customize Magento for your
  * needs please refer 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\AdminNotification\Model\System;
 
+namespace Magento\Framework\Notification;
+
+/**
+ * Class for processing the list of system messages
+ *
+ * Class MessageList
+ */
 class MessageList
 {
     /**
@@ -54,17 +60,24 @@ class MessageList
      *
      * @return void
      * @throws \InvalidArgumentException
+     * @throws \UnexpectedValueException
      */
     protected function _loadMessages()
     {
-        if (!$this->_messages) {
-            foreach ($this->_messageClasses as $key => $messageClass) {
-                if (!$messageClass) {
-                    throw new \InvalidArgumentException('Message class for message "' . $key . '" is not set');
-                }
-                $message = $this->_objectManager->get($messageClass);
+        if (!empty($this->_messages)) {
+            return;
+        }
+        foreach ($this->_messageClasses as $key => $messageClass) {
+            if (!$messageClass) {
+                throw new \InvalidArgumentException('Message class for message "' . $key . '" is not set');
+            }
+            $message = $this->_objectManager->get($messageClass);
+            if ($message instanceof \Magento\Framework\Notification\MessageInterface) {
                 $this->_messages[$message->getIdentity()] = $message;
+            } else {
+                throw new \UnexpectedValueException("Message class has to implement the message interface.");
             }
+
         }
     }
 
@@ -72,7 +85,7 @@ class MessageList
      * Retrieve message by
      *
      * @param string $identity
-     * @return null|\Magento\AdminNotification\Model\System\MessageInterface
+     * @return null|\Magento\Framework\Notification\MessageInterface
      */
     public function getMessageByIdentity($identity)
     {
@@ -83,7 +96,7 @@ class MessageList
     /**
      * Retrieve list of all messages
      *
-     * @return \Magento\AdminNotification\Model\System\MessageInterface[]
+     * @return \Magento\Framework\Notification\MessageInterface[]
      */
     public function asArray()
     {
diff --git a/lib/internal/Magento/Framework/Notification/NotifierInterface.php b/lib/internal/Magento/Framework/Notification/NotifierInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..a9586e17dd174936a44c763f043c4934857ec13b
--- /dev/null
+++ b/lib/internal/Magento/Framework/Notification/NotifierInterface.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\Framework\Notification;
+
+/**
+ * Interface for notifiers
+ *
+ * Interface NotifierInterface
+ */
+interface NotifierInterface
+{
+    /**
+     * Add new message
+     *
+     * @param int $severity
+     * @param string $title
+     * @param string|string[] $description
+     * @param string $url
+     * @param bool $isInternal
+     * @throws \Magento\Framework\Model\Exception
+     * @return $this
+     */
+    public function add($severity, $title, $description, $url = '', $isInternal = true);
+
+    /**
+     * Add critical severity message
+     *
+     * @param string $title
+     * @param string|string[] $description
+     * @param string $url
+     * @param bool $isInternal
+     * @return $this
+     */
+    public function addCritical($title, $description, $url = '', $isInternal = true);
+
+    /**
+     * Add major severity message
+     *
+     * @param string $title
+     * @param string|string[] $description
+     * @param string $url
+     * @param bool $isInternal
+     * @return $this
+     */
+    public function addMajor($title, $description, $url = '', $isInternal = true);
+
+    /**
+     * Add minor severity message
+     *
+     * @param string $title
+     * @param string|string[] $description
+     * @param string $url
+     * @param bool $isInternal
+     * @return $this
+     */
+    public function addMinor($title, $description, $url = '', $isInternal = true);
+
+    /**
+     * Add notice
+     *
+     * @param string $title
+     * @param string|string[] $description
+     * @param string $url
+     * @param bool $isInternal
+     * @return $this
+     */
+    public function addNotice($title, $description, $url = '', $isInternal = true);
+}
diff --git a/lib/internal/Magento/Framework/Notification/NotifierList.php b/lib/internal/Magento/Framework/Notification/NotifierList.php
new file mode 100644
index 0000000000000000000000000000000000000000..404cf7481472b19ed3f0f0f2a6247930afe95298
--- /dev/null
+++ b/lib/internal/Magento/Framework/Notification/NotifierList.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\Framework\Notification;
+
+/*
+ * List of registered system notifiers
+ */
+class NotifierList
+{
+    /**
+     * Object manager
+     *
+     * @var \Magento\Framework\ObjectManager
+     */
+    protected $objectManager;
+
+    /**
+     * List of notifiers
+     *
+     * @var NotifierInterface[]|string[]
+     */
+    protected $notifiers;
+
+    /**
+     * Whether the list of notifiers is verified (all notifiers should implement NotifierInterface  interface)
+     *
+     * @var bool
+     */
+    protected $isNotifiersVerified;
+
+    /**
+     * @param \Magento\Framework\ObjectManager $objectManager
+     * @param NotifierInterface[]|string[] $notifiers
+     */
+    public function __construct(\Magento\Framework\ObjectManager $objectManager, $notifiers = array())
+    {
+        $this->objectManager = $objectManager;
+        $this->notifiers = $notifiers;
+        $this->isNotifiersVerified = false;
+    }
+
+    /**
+     * Returning list of notifiers.
+     *
+     * @return NotifierInterface[]
+     * @throws \InvalidArgumentException
+     */
+    public function asArray()
+    {
+        if (!$this->isNotifiersVerified) {
+            $hasErrors = false;
+            foreach ($this->notifiers as $classIndex => $class) {
+                $notifier = $this->objectManager->get($class);
+                if ($notifier instanceof NotifierInterface) {
+                    $this->notifiers[$classIndex] = $notifier;
+                } else {
+                    $hasErrors = true;
+                    unset($this->notifiers[$classIndex]);
+                }
+            }
+            $this->isNotifiersVerified = true;
+            if ($hasErrors) {
+                throw new \InvalidArgumentException('All notifiers should implements NotifierInterface');
+            }
+        }
+        return $this->notifiers;
+    }
+}
diff --git a/lib/internal/Magento/Framework/Notification/NotifierPool.php b/lib/internal/Magento/Framework/Notification/NotifierPool.php
new file mode 100644
index 0000000000000000000000000000000000000000..4a463225d1be23f5cff59689796b6a4c76c92681
--- /dev/null
+++ b/lib/internal/Magento/Framework/Notification/NotifierPool.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)
+ */
+
+namespace Magento\Framework\Notification;
+
+/**
+ * Default notifiers. Iterates through all registered notifiers to process message
+ *
+ * Class NotifierPool
+ */
+class NotifierPool implements NotifierInterface
+{
+    /**
+     * @var NotifierList
+     */
+    protected $notifierList;
+
+    /**
+     * @param NotifierList $notifierList
+     */
+    public function __construct(NotifierList $notifierList)
+    {
+        $this->notifierList = $notifierList;
+    }
+
+    /**
+     * Add new message
+     *
+     * @param int $severity
+     * @param string $title
+     * @param string|string[] $description
+     * @param string $url
+     * @param bool $isInternal
+     * @throws \Magento\Framework\Model\Exception
+     * @return $this
+     */
+    public function add($severity, $title, $description, $url = '', $isInternal = true)
+    {
+        foreach ($this->notifierList->asArray() as $notifier) {
+            $notifier->add($severity, $title, $description, $url, $isInternal);
+        }
+        return $this;
+    }
+
+    /**
+     * Add critical severity message
+     *
+     * @param string $title
+     * @param string|string[] $description
+     * @param string $url
+     * @param bool $isInternal
+     * @return $this
+     */
+    public function addCritical($title, $description, $url = '', $isInternal = true)
+    {
+        foreach ($this->notifierList->asArray() as $notifier) {
+            $notifier->addCritical($title, $description, $url, $isInternal);
+        }
+        return $this;
+    }
+
+    /**
+     * Add major severity message
+     *
+     * @param string $title
+     * @param string|string[] $description
+     * @param string $url
+     * @param bool $isInternal
+     * @return $this
+     */
+    public function addMajor($title, $description, $url = '', $isInternal = true)
+    {
+        foreach ($this->notifierList->asArray() as $notifier) {
+            $notifier->addMajor($title, $description, $url, $isInternal);
+        }
+        return $this;
+    }
+
+    /**
+     * Add minor severity message
+     *
+     * @param string $title
+     * @param string|string[] $description
+     * @param string $url
+     * @param bool $isInternal
+     * @return $this
+     */
+    public function addMinor($title, $description, $url = '', $isInternal = true)
+    {
+        foreach ($this->notifierList->asArray() as $notifier) {
+            $notifier->addMinor($title, $description, $url, $isInternal);
+        }
+        return $this;
+    }
+
+    /**
+     * Add notice
+     *
+     * @param string $title
+     * @param string|string[] $description
+     * @param string $url
+     * @param bool $isInternal
+     * @return $this
+     */
+    public function addNotice($title, $description, $url = '', $isInternal = true)
+    {
+        foreach ($this->notifierList->asArray() as $notifier) {
+            $notifier->addNotice($title, $description, $url, $isInternal);
+        }
+        return $this;
+    }
+}
diff --git a/lib/internal/Magento/Framework/Oauth/Helper/Request.php b/lib/internal/Magento/Framework/Oauth/Helper/Request.php
index 403dceeff5253afffda421880862784f4beedf77..7b2e5f71bdf873e01468160c5883eff83369f40f 100644
--- a/lib/internal/Magento/Framework/Oauth/Helper/Request.php
+++ b/lib/internal/Magento/Framework/Oauth/Helper/Request.php
@@ -93,7 +93,9 @@ class Request
     {
         $protocolParams = array();
 
-        $this->_processHeader($authHeaderValue, $protocolParams);
+        if (!$this->_processHeader($authHeaderValue, $protocolParams)) {
+            return [];
+        }
 
         if ($contentTypeHeader && 0 === strpos($contentTypeHeader, \Zend_Http_Client::ENC_URLENCODED)) {
             $protocolParamsNotSet = !$protocolParams;
@@ -155,7 +157,7 @@ class Request
      *
      * @param string $authHeaderValue
      * @param array &$protocolParams
-     * @return void
+     * @return bool true if parameters from oauth headers are processed correctly
      */
     protected function _processHeader($authHeaderValue, &$protocolParams)
     {
@@ -173,7 +175,9 @@ class Request
                     $protocolParams[rawurldecode($nameAndValue[0])] = rawurldecode(trim($nameAndValue[1], '"'));
                 }
             }
+            return true;
         }
+        return false;
     }
 
     /**
diff --git a/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Converter.php b/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Converter.php
new file mode 100644
index 0000000000000000000000000000000000000000..b1f6fd1ac5c7b11775ca39c2ca61a5bd5555d8f1
--- /dev/null
+++ b/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Converter.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\Framework\ObjectManager\Code\Generator;
+
+/**
+ * Class Converter
+ * @package Magento\Framework\ObjectManager\Code\Generator
+ */
+class Converter extends \Magento\Framework\Code\Generator\EntityAbstract
+{
+    /**
+     * Entity type
+     */
+    const ENTITY_TYPE = 'converter';
+
+    /**
+     * Retrieve class properties
+     *
+     * @return array
+     */
+    protected function _getClassProperties()
+    {
+        return [
+            [
+                'name' => $this->_getFactoryPropertyName(),
+                'visibility' => 'protected',
+                'docblock' => [
+                    'shortDescription' => $this->_getFactoryPropertyName(),
+                    'tags' => [
+                        [
+                            'name' => 'var',
+                            'description' =>
+                                $this->_getFactoryClass()
+                        ]
+                    ]
+                ]
+            ]
+        ];
+    }
+
+    /**
+     * Returns factory name
+     *
+     * @return string
+     */
+    protected function _getFactoryPropertyName()
+    {
+        $parts = explode('\\', $this->_getSourceClassName());
+        return lcfirst(end($parts)) . 'Factory';
+    }
+
+    /**
+     * Returns factory class
+     *
+     * @return string
+     */
+    protected function _getFactoryClass()
+    {
+        return $this->_getFullyQualifiedClassName($this->_getSourceClassName()) . 'Factory';
+    }
+
+    /**
+     * Get default constructor definition for generated class
+     *
+     * @return array
+     */
+    protected function _getDefaultConstructorDefinition()
+    {
+        return [
+            'name' => '__construct',
+            'parameters' => [
+                [
+                    'name' => $this->_getFactoryPropertyName(),
+                    'type' => $this->_getFactoryClass()
+                ],
+            ],
+            'body' => "\$this->"
+                . $this->_getFactoryPropertyName()
+                . " = \$" . $this->_getFactoryPropertyName() . ';',
+            'docblock' => [
+                'shortDescription' => ucfirst(static::ENTITY_TYPE) . ' constructor',
+                'tags' => [
+                    [
+                        'name' => 'param',
+                        'description' => '\\' . $this->_getSourceClassName()
+                            . " \$" . $this->_getFactoryPropertyName()
+                    ]
+                ]
+            ]
+        ];
+    }
+
+    /**
+     * Returns list of methods for class generator
+     *
+     * @return array
+     */
+    protected function _getClassMethods()
+    {
+        $construct = $this->_getDefaultConstructorDefinition();
+        $paramName = 'dataObject';
+        $body = 'return $this->' . $this->_getFactoryPropertyName()
+            . '->create()->setData($' . $paramName .'->__toArray());';
+        $getModel = [
+            'name' => 'getModel',
+            'parameters' => [
+                [
+                    'name' => $paramName,
+                    'type' => '\Magento\Framework\Service\Data\AbstractObject'
+                ]
+            ],
+            'body' => $body,
+            'docblock' => [
+                'shortDescription' => 'Extract data object from model',
+                'tags' => [
+                    [
+                        'name' => 'param',
+                        'description' => '\Magento\Framework\Service\Data\AbstractObject $' . $paramName,
+                    ],
+                    [
+                        'name' => 'return',
+                        'description' => $this->_getFullyQualifiedClassName($this->_getSourceClassName())
+                    ]
+                ]
+            ]
+        ];
+        return array($construct, $getModel);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function _validateData()
+    {
+        if (!parent::_validateData()) {
+            return false;
+        }
+
+        $sourceClassName = $this->_getSourceClassName();
+        $resultClassName = $this->_getResultClassName();
+
+        if ($resultClassName !== $sourceClassName . 'Converter') {
+            $this->_addError(
+                'Invalid Converter class name [' . $resultClassName . ']. Use ' . $sourceClassName . 'Converter'
+            );
+            return false;
+        }
+        return true;
+    }
+}
diff --git a/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Repository.php b/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Repository.php
new file mode 100644
index 0000000000000000000000000000000000000000..de3cd6c97bdde364aaec8d7e54ea951321cece09
--- /dev/null
+++ b/lib/internal/Magento/Framework/ObjectManager/Code/Generator/Repository.php
@@ -0,0 +1,336 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\ObjectManager\Code\Generator;
+
+/**
+ * Class Repository
+ */
+class Repository extends \Magento\Framework\Code\Generator\EntityAbstract
+{
+    /**
+     * Entity type
+     */
+    const ENTITY_TYPE = 'repository';
+
+    /**
+     * No Such Entity Exception
+     */
+    const NO_SUCH_ENTITY_EXCEPTION = '\\Magento\Framework\Exception\NoSuchEntityException';
+    const SEARCH_CRITERIA = '\\Magento\Framework\Service\V1\Data\SearchCriteria';
+
+    /**
+     * Retrieve class properties
+     *
+     * @return array
+     */
+    protected function _getClassProperties()
+    {
+        $properties = [
+            [
+                'name' => $this->_getSourceFactoryPropertyName(),
+                'visibility' => 'protected',
+                'docblock' => [
+                    'shortDescription' =>  $this->_getSourceFactoryPropertyName(),
+                    'tags' => [
+                        [
+                            'name' => 'var',
+                            'description' =>
+                                $this->_getFullyQualifiedClassName($this->_getSourceClassName()) . 'Factory'
+                        ]
+                    ]
+                ]
+            ],
+            [
+                'name' => $this->_getSourceCollectionFactoryPropertyName(),
+                'visibility' => 'protected',
+                'docblock' => [
+                    'shortDescription' =>  'Collection Factory',
+                    'tags' => [
+                        [
+                            'name' => 'var',
+                            'description' =>
+                                $this->_getCollectionFactoryClassName()
+                        ]
+                    ]
+                ]
+            ],
+            [
+                'name' => 'registry',
+                'visibility' => 'protected',
+                'defaultValue' => [],
+                'docblock' => [
+                    'shortDescription' => $this->_getSourceClassName() . '[]',
+                    'tags' => [
+                        [
+                            'name' => 'var',
+                            'description' => 'array'
+                        ]
+                    ]
+                ]
+            ]
+        ];
+        return $properties;
+    }
+
+    /**
+     * Returns source factory property name
+     *
+     * @return string
+     */
+    protected function _getSourceFactoryPropertyName()
+    {
+        $parts = explode('\\', $this->_getSourceClassName());
+        return lcfirst(end($parts)) . 'Factory';
+    }
+
+    /**
+     * Returns source collection factory property name
+     * @return string
+     */
+    protected function _getSourceCollectionFactoryPropertyName()
+    {
+        $parts = explode('\\', $this->_getSourceClassName());
+        return lcfirst(end($parts)) . 'CollectionFactory';
+    }
+
+    /**
+     * Returns collection factory class name
+     *
+     * @return string
+     */
+    protected function _getCollectionFactoryClassName()
+    {
+        $parts = explode('\\', $this->_getSourceClassName());
+        $parts = array_reverse($parts);
+        $className = '\\' . array_pop($parts) . '\\' . array_pop($parts) . '\\' . array_pop($parts) . '\\Resource\\';
+        $parts = array_reverse($parts);
+        return $className . implode('\\', $parts) . '\\CollectionFactory';
+
+    }
+
+    /**
+     * Get default constructor definition for generated class
+     *
+     * @return array
+     */
+    protected function _getDefaultConstructorDefinition()
+    {
+        return [
+            'name' => '__construct',
+            'parameters' => [
+                [
+                    'name' => $this->_getSourceFactoryPropertyName(),
+                    'type' => $this->_getFullyQualifiedClassName($this->_getSourceClassName()) . 'Factory'
+                ],
+                [
+                    'name' => $this->_getSourceCollectionFactoryPropertyName(),
+                    'type' => $this->_getCollectionFactoryClassName(),
+                ],
+            ],
+            'body' => "\$this->"
+                . $this->_getSourceFactoryPropertyName()
+                . " = \$" . $this->_getSourceFactoryPropertyName() . ";\n"
+                . "\$this->"
+                . $this->_getSourceCollectionFactoryPropertyName()
+                . " = \$" . $this->_getSourceCollectionFactoryPropertyName() . ";"
+            ,
+            'docblock' => [
+                'shortDescription' => ucfirst(static::ENTITY_TYPE) . ' constructor',
+                'tags' => [
+                    [
+                        'name' => 'param',
+                        'description' => '\\' . $this->_getSourceClassName()
+                            . " \$" . $this->_getSourceFactoryPropertyName()
+                    ],
+                    [
+                        'name' => 'param',
+                        'description' => $this->_getCollectionFactoryClassName()
+                            . " \$" . $this->_getSourceCollectionFactoryPropertyName()
+                    ]
+                ]
+            ]
+        ];
+    }
+
+    /**
+     * Returns get() method
+     *
+     * @return string
+     */
+    protected function _getGetMethod()
+    {
+        $body = "if (!\$id) {\n"
+            . "    throw new " . self::NO_SUCH_ENTITY_EXCEPTION . "('Requested product doesn\\'t exist');\n"
+            . "}\n"
+            . "if (!isset(\$this->registry[\$id])) {\n"
+            . "    \$this->registry[\$id] = \$this->"
+            . $this->_getSourceFactoryPropertyName()
+            . "->create()->load(\$id);\n"
+            . "}\n"
+            . "return \$this->registry[\$id];";
+        return [
+            'name' => 'get',
+            'parameters' => [
+                [
+                    'name' => 'id',
+                    'type' => 'int'
+                ]
+            ],
+            'body' => $body,
+            'docblock' => [
+                'shortDescription' => 'load entity',
+                'tags' => [
+                    [
+                        'name' => 'param',
+                        'description' => 'int $id'
+                    ],
+                    [
+                        'name' => 'return',
+                        'description' => $this->_getFullyQualifiedClassName($this->_getSourceClassName()),
+                    ],
+                    [
+                        'name' => 'throws',
+                        'description' => self::NO_SUCH_ENTITY_EXCEPTION,
+                    ]
+                ]
+            ]
+        ];
+    }
+
+    /**
+     * Returns register() method
+     *
+     * @return string
+     */
+    protected function _getRegisterMethod()
+    {
+        $body = "if (\$object->getId() && !isset(\$this->registry[\$object->getId()])) {\n"
+            . "    \$object->load(\$object->getId());\n"
+            . "    \$this->registry[\$object->getId()] = \$object;\n"
+            . "}\nreturn \$this;";
+        return [
+            'name' => 'register',
+            'parameters' => [
+                [
+                    'name' => 'object',
+                    'type' => $this->_getFullyQualifiedClassName($this->_getSourceClassName())
+                ]
+            ],
+            'body' => $body,
+            'docblock' => [
+                'shortDescription' => 'Register entity',
+                'tags' => [
+                    [
+                        'name' => 'param',
+                        'description' => $this->_getFullyQualifiedClassName($this->_getSourceClassName()) . ' $object'
+                    ],
+                    [
+                        'name' => 'return',
+                        'description' => $this->_getFullyQualifiedClassName($this->_getResultClassName()),
+                    ]
+                ]
+            ]
+        ];
+    }
+
+    /**
+     * Returns get() method
+     *
+     * @return string
+     */
+    protected function _getFindMethod()
+    {
+        $body = "\$collection = \$this->" . $this->_getSourceCollectionFactoryPropertyName() . "->create();\n"
+        . "foreach(\$criteria->getFilterGroups() as \$filterGroup) {\n"
+        . "    foreach (\$filterGroup->getFilters() as \$filter) {\n"
+        . "        \$condition = \$filter->getConditionType() ? \$filter->getConditionType() : 'eq';\n"
+        . "        \$collection->addFieldToFilter(\$filter->getField(), [\$condition => \$filter->getValue()]);\n"
+        . "    }\n"
+        . "}\n"
+        . "foreach (\$collection as \$object) {\n"
+        . "    \$this->register(\$object);\n"
+        . "}\n"
+        . "\$objectIds = \$collection->getAllIds();\n"
+        . "return array_intersect_key(\$this->registry, array_flip(\$objectIds));\n";
+        return [
+            'name' => 'find',
+            'parameters' => [
+                [
+                    'name' => 'criteria',
+                    'type' => self::SEARCH_CRITERIA
+                ]
+            ],
+            'body' => $body,
+            'docblock' => [
+                'shortDescription' => 'Find entities by criteria',
+                'tags' => [
+                    [
+                        'name' => 'param',
+                        'description' => self::SEARCH_CRITERIA . '  $criteria'
+                    ],
+                    [
+                        'name' => 'return',
+                        'description' => $this->_getFullyQualifiedClassName($this->_getSourceClassName()) . '[]',
+                    ],
+                ]
+            ]
+        ];
+    }
+
+    /**
+     * Returns list of methods for class generator
+     *
+     * @return array
+     */
+    protected function _getClassMethods()
+    {
+        return [
+            $this->_getDefaultConstructorDefinition(),
+            $this->_getGetMethod(),
+            $this->_getRegisterMethod(),
+            $this->_getFindMethod()
+        ];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function _validateData()
+    {
+        $result = parent::_validateData();
+
+        if ($result) {
+            $sourceClassName = $this->_getSourceClassName();
+            $resultClassName = $this->_getResultClassName();
+
+            if ($resultClassName !== $sourceClassName . 'Repository') {
+                $this->_addError(
+                    'Invalid Factory class name [' . $resultClassName . ']. Use ' . $sourceClassName . 'Repository'
+                );
+                $result = false;
+            }
+        }
+        return $result;
+    }
+}
diff --git a/lib/internal/Magento/Framework/ObjectManager/DefinitionFactory.php b/lib/internal/Magento/Framework/ObjectManager/DefinitionFactory.php
index 4c9ec38efbf443886c13c3d368ae7af69f8d7a9c..912c316846998abcb09855c336b70ffe15bd2705 100644
--- a/lib/internal/Magento/Framework/ObjectManager/DefinitionFactory.php
+++ b/lib/internal/Magento/Framework/ObjectManager/DefinitionFactory.php
@@ -31,6 +31,11 @@ use Magento\Framework\ObjectManager\Definition\Runtime;
 use Magento\Framework\ObjectManager\Relations;
 use Magento\Framework\ObjectManager\Code\Generator;
 use Magento\Framework\Interception\Code\Generator as InterceptionGenerator;
+use Magento\Framework\Service\Code\Generator\Builder as BuilderGenerator;
+use Magento\Framework\Service\Code\Generator\Mapper as MapperGenerator;
+use Magento\Framework\ObjectManager\Code\Generator\Converter as ConverterGenerator;
+use Magento\Framework\Service\Code\Generator\SearchResults;
+use Magento\Framework\Service\Code\Generator\SearchResultsBuilder;
 
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
@@ -121,9 +126,24 @@ class DefinitionFactory
                 $autoloader,
                 $generatorIo,
                 array(
-                    Generator\Factory::ENTITY_TYPE => '\Magento\Framework\ObjectManager\Code\Generator\Factory',
-                    Generator\Proxy::ENTITY_TYPE => '\Magento\Framework\ObjectManager\Code\Generator\Proxy',
-                    InterceptionGenerator\Interceptor::ENTITY_TYPE => '\Magento\Framework\Interception\Code\Generator\Interceptor'
+                    SearchResultsBuilder::ENTITY_TYPE
+                        => '\Magento\Framework\Service\Code\Generator\SearchResultsBuilder',
+                    Generator\Factory::ENTITY_TYPE
+                        => '\Magento\Framework\ObjectManager\Code\Generator\Factory',
+                    Generator\Proxy::ENTITY_TYPE
+                        => '\Magento\Framework\ObjectManager\Code\Generator\Proxy',
+                    Generator\Repository::ENTITY_TYPE
+                        => '\Magento\Framework\ObjectManager\Code\Generator\Repository',
+                    InterceptionGenerator\Interceptor::ENTITY_TYPE
+                        => '\Magento\Framework\Interception\Code\Generator\Interceptor',
+                    BuilderGenerator::ENTITY_TYPE
+                        => '\Magento\Framework\Service\Code\Generator\Builder',
+                    MapperGenerator::ENTITY_TYPE
+                        => '\Magento\Framework\Service\Code\Generator\Mapper',
+                    SearchResults::ENTITY_TYPE
+                        => '\Magento\Framework\Service\Code\Generator\SearchResults',
+                    ConverterGenerator::ENTITY_TYPE
+                        => '\Magento\Framework\ObjectManager\Code\Generator\Converter',
                 )
             );
             $autoloader = new \Magento\Framework\Code\Generator\Autoloader($generator);
diff --git a/lib/internal/Magento/Framework/Search/Request.php b/lib/internal/Magento/Framework/Search/Request.php
new file mode 100644
index 0000000000000000000000000000000000000000..5bae18e314ab21e8bf997d55893b18fc2e89637b
--- /dev/null
+++ b/lib/internal/Magento/Framework/Search/Request.php
@@ -0,0 +1,138 @@
+<?php
+/**
+ * Search Request
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\Search;
+
+use Magento\Framework\Search\Request\BucketInterface;
+use Magento\Framework\Search\Request\QueryInterface;
+
+/**
+ * @codeCoverageIgnore
+ */
+class Request implements RequestInterface
+{
+    /**
+     * @var string
+     */
+    protected $name;
+
+    /**
+     * @var string
+     */
+    protected $index;
+
+    /**
+     * @var BucketInterface[]
+     */
+    protected $buckets;
+
+    /**
+     * Main query which represents the whole query hierarchy
+     *
+     * @var QueryInterface
+     */
+    protected $query;
+
+    /**
+     * @var int|null
+     */
+    protected $from;
+
+    /**
+     * @var int|null
+     */
+    protected $size;
+
+    /**
+     * @param string $name
+     * @param string $indexName
+     * @param QueryInterface $query
+     * @param int|null $from
+     * @param int|null $size
+     * @param BucketInterface[] $buckets
+     */
+    public function __construct(
+        $name,
+        $indexName,
+        QueryInterface $query,
+        $from = null,
+        $size = null,
+        array $buckets = null
+    ) {
+        $this->name = $name;
+        $this->index = $indexName;
+        $this->buckets = $buckets;
+        $this->query = $query;
+        $this->from = $from;
+        $this->size = $size;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getIndex()
+    {
+        return $this->index;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getAggregation()
+    {
+        return $this->buckets;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getQuery()
+    {
+        return $this->query;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getFrom()
+    {
+        return $this->from;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getSize()
+    {
+        return $this->size;
+    }
+}
diff --git a/lib/internal/Magento/Framework/Search/Request/Aggregation/Range.php b/lib/internal/Magento/Framework/Search/Request/Aggregation/Range.php
new file mode 100644
index 0000000000000000000000000000000000000000..705ec8ea551c11751f7752f6c26cf42c3a0b8139
--- /dev/null
+++ b/lib/internal/Magento/Framework/Search/Request/Aggregation/Range.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Range
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\Search\Request\Aggregation;
+
+/**
+ * @SuppressWarnings(PHPMD.ShortVariable)
+ */
+class Range
+{
+    /**
+     * @var int|null
+     */
+    protected $from;
+
+    /**
+     * @var int|null
+     */
+    protected $to;
+
+    /**
+     * @param int|null $from
+     * @param int|null $to
+     */
+    public function __construct($from, $to)
+    {
+        $this->from = $from;
+        $this->to = $to;
+    }
+
+    /**
+     * Get From
+     *
+     * @return int|null
+     */
+    public function getFrom()
+    {
+        return $this->from;
+    }
+
+    /**
+     * Get To
+     *
+     * @return int|null
+     */
+    public function getTo()
+    {
+        return $this->to;
+    }
+}
diff --git a/lib/internal/Magento/Framework/Search/Request/Aggregation/RangeBucket.php b/lib/internal/Magento/Framework/Search/Request/Aggregation/RangeBucket.php
new file mode 100644
index 0000000000000000000000000000000000000000..22028dfe32919b5898b74b920365f738dc3d9144
--- /dev/null
+++ b/lib/internal/Magento/Framework/Search/Request/Aggregation/RangeBucket.php
@@ -0,0 +1,111 @@
+<?php
+/**
+ * Range Buckets
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\Search\Request\Aggregation;
+
+use Magento\Framework\Search\Request\BucketInterface;
+
+class RangeBucket implements BucketInterface
+{
+    /**
+     * @var string
+     */
+    protected $name;
+
+    /**
+     * @var string
+     */
+    protected $field;
+
+    /**
+     * @var array
+     */
+    protected $metrics;
+
+    /**
+     * @var Range[]
+     */
+    protected $ranges;
+
+    /**
+     * @param string $name
+     * @param string $field
+     * @param array $metrics
+     * @param Range[] $ranges
+     */
+    public function __construct($name, $field, array $metrics, array $ranges)
+    {
+        $this->name = $name;
+        $this->field = $field;
+        $this->metrics = $metrics;
+        $this->ranges = $ranges;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getType()
+    {
+        return BucketInterface::TYPE_RANGE;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Get Field
+     *
+     * @return string
+     */
+    public function getField()
+    {
+        return $this->field;
+    }
+
+    /**
+     * Get Metrics
+     *
+     * @return array
+     */
+    public function getMetrics()
+    {
+        return $this->metrics;
+    }
+
+    /**
+     * Get Ranges
+     *
+     * @return Range[]
+     */
+    public function getRanges()
+    {
+        return $this->ranges;
+    }
+}
diff --git a/lib/internal/Magento/Framework/Search/Request/Aggregation/TermBucket.php b/lib/internal/Magento/Framework/Search/Request/Aggregation/TermBucket.php
new file mode 100644
index 0000000000000000000000000000000000000000..6c4fca13c4ddac164cdaadd39f04b40af69df865
--- /dev/null
+++ b/lib/internal/Magento/Framework/Search/Request/Aggregation/TermBucket.php
@@ -0,0 +1,94 @@
+<?php
+/**
+ * Term Buckets
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\Search\Request\Aggregation;
+
+use Magento\Framework\Search\Request\BucketInterface;
+
+class TermBucket implements BucketInterface
+{
+    /**
+     * @var string
+     */
+    protected $name;
+
+    /**
+     * @var string
+     */
+    protected $field;
+
+    /**
+     * @var array
+     */
+    protected $metrics;
+
+    /**
+     * @param string $name
+     * @param string $field
+     * @param array $metrics
+     */
+    public function __construct($name, $field, array $metrics)
+    {
+        $this->name = $name;
+        $this->field = $field;
+        $this->metrics = $metrics;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getType()
+    {
+        return BucketInterface::TYPE_TERM;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Get Field
+     *
+     * @return string
+     */
+    public function getField()
+    {
+        return $this->field;
+    }
+
+    /**
+     * Get Metrics
+     *
+     * @return array
+     */
+    public function getMetrics()
+    {
+        return $this->metrics;
+    }
+}
diff --git a/lib/internal/Magento/Framework/Search/Request/BucketInterface.php b/lib/internal/Magento/Framework/Search/Request/BucketInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..8fc0463fe21ffd6b7df73b3289147407e27cb3bf
--- /dev/null
+++ b/lib/internal/Magento/Framework/Search/Request/BucketInterface.php
@@ -0,0 +1,52 @@
+<?php
+/**
+ * Aggregation Bucket 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\Framework\Search\Request;
+
+interface BucketInterface
+{
+    /**
+     * #@+ Bucket Types
+     */
+    const TYPE_TERM = 'term';
+
+    const TYPE_RANGE = 'range';
+
+    /**#@-*/
+
+    /**
+     * Get Type
+     *
+     * @return string
+     */
+    public function getType();
+
+    /**
+     * Get Name
+     *
+     * @return string
+     */
+    public function getName();
+}
diff --git a/lib/internal/Magento/Framework/Search/Request/Config.php b/lib/internal/Magento/Framework/Search/Request/Config.php
new file mode 100644
index 0000000000000000000000000000000000000000..1bf6a976e6613db53be40e4919b9a54a76f1b200
--- /dev/null
+++ b/lib/internal/Magento/Framework/Search/Request/Config.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\Framework\Search\Request;
+
+class Config extends \Magento\Framework\Config\Data
+{
+    /**
+     * @param \Magento\Framework\Config\ReaderInterface $reader
+     * @param \Magento\Framework\Config\CacheInterface $cache
+     * @param string $cacheId
+     */
+    public function __construct(
+        \Magento\Framework\Config\ReaderInterface $reader,
+        \Magento\Framework\Config\CacheInterface $cache,
+        $cacheId = 'request_declaration'
+    ) {
+        parent::__construct($reader, $cache, $cacheId);
+    }
+}
diff --git a/lib/internal/Magento/Framework/Search/Request/Config/Converter.php b/lib/internal/Magento/Framework/Search/Request/Config/Converter.php
new file mode 100644
index 0000000000000000000000000000000000000000..87bd3895fbe75e4fc40cb5b60e8b81cd60e600fe
--- /dev/null
+++ b/lib/internal/Magento/Framework/Search/Request/Config/Converter.php
@@ -0,0 +1,106 @@
+<?php
+/**
+ * Search Request xml converter
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\Search\Request\Config;
+
+class Converter implements \Magento\Framework\Config\ConverterInterface
+{
+    /**
+     * Convert config
+     *
+     * @param \DOMDocument $source
+     * @return array
+     */
+    public function convert($source)
+    {
+        /** @var \DOMNodeList $requestNodes */
+        $requestNodes = $source->getElementsByTagName('request');
+        $requests = [];
+        foreach ($requestNodes as $requestNode) {
+            $simpleXmlNode = simplexml_import_dom($requestNode);
+            /** @var \DOMElement $requestNode */
+            $name = $requestNode->getAttribute('query');
+            $request = $this->mergeAttributes((array)$simpleXmlNode);
+            $request['queries'] = $this->convertNodes($simpleXmlNode->queries, 'name');
+            $request['filters'] = $this->convertNodes($simpleXmlNode->filters, 'name');
+            //$request['aggregation'] = $this->convertNodes($simpleXmlNode->aggregation, 'name');
+            $requests[$name] = $request;
+        }
+        return $requests;
+    }
+
+    /**
+     * Merge attributes in node data
+     *
+     * @param array $data
+     * @return array
+     */
+    protected function mergeAttributes($data)
+    {
+        if (isset($data['@attributes'])) {
+            $data = array_merge($data, $data['@attributes']);
+            unset($data['@attributes']);
+        }
+        return $data;
+    }
+
+    /**
+     * Deep converting simlexml element to array
+     *
+     * @param \SimpleXMLElement $node
+     * @return array
+     */
+    protected function convertToArray(\SimpleXMLElement $node)
+    {
+        return $this->mergeAttributes(json_decode(json_encode($node), true));
+    }
+
+    /**
+     * Convert nodes to array
+     *
+     * @param \SimpleXMLElement $nodes
+     * @param string $name
+     * @return array
+     */
+    protected function convertNodes(\SimpleXMLElement $nodes, $name)
+    {
+        $list = [];
+        /** @var \SimpleXMLElement $node */
+        foreach ($nodes->children() as $node) {
+            $element = $this->convertToArray($node->attributes());
+            if (count($node->children()) > 0) {
+                foreach ($node->children() as $child) {
+                    $element[$child->getName()][] = $this->convertToArray($child);
+                }
+            }
+            $type = (string)$node->attributes('xsi', true)['type'];
+            if (!empty($type)) {
+                $element['type'] = $type;
+            }
+
+            $list[$element[$name]] = $element;
+        }
+        return $list;
+    }
+}
diff --git a/lib/internal/Magento/Framework/Search/Request/Config/SchemaLocator.php b/lib/internal/Magento/Framework/Search/Request/Config/SchemaLocator.php
new file mode 100644
index 0000000000000000000000000000000000000000..f76772e36beb873ec476254f63892e241fb14594
--- /dev/null
+++ b/lib/internal/Magento/Framework/Search/Request/Config/SchemaLocator.php
@@ -0,0 +1,49 @@
+<?php
+/**
+ * Search Request schema locator
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\Search\Request\Config;
+
+class SchemaLocator implements \Magento\Framework\Config\SchemaLocatorInterface
+{
+    /**
+     * Get path to merged config schema
+     *
+     * @return string
+     */
+    public function getSchema()
+    {
+        return realpath(__DIR__ . '/../../etc/search_request_merged.xsd');
+    }
+
+    /**
+     * Get path to pre file validation schema
+     *
+     * @return null
+     */
+    public function getPerFileSchema()
+    {
+        return realpath(__DIR__ . '/../../etc/search_request.xsd');
+    }
+}
diff --git a/lib/internal/Magento/Framework/Search/Request/Filter/Bool.php b/lib/internal/Magento/Framework/Search/Request/Filter/Bool.php
new file mode 100644
index 0000000000000000000000000000000000000000..b83fdf3df443ed07eaaaa92f3a5a40ad0e44531f
--- /dev/null
+++ b/lib/internal/Magento/Framework/Search/Request/Filter/Bool.php
@@ -0,0 +1,116 @@
+<?php
+/**
+ * Bool Filter
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\Search\Request\Filter;
+
+use Magento\Framework\Search\Request\FilterInterface;
+
+class Bool implements FilterInterface
+{
+    /**
+     * @var string
+     */
+    protected $name;
+
+    /**
+     * Filter names to which result set MUST satisfy
+     *
+     * @var array
+     */
+    protected $must = array();
+
+    /**
+     * Filter names to which result set SHOULD satisfy
+     *
+     * @var array
+     */
+    protected $should = array();
+
+    /**
+     * Filter names to which result set MUST NOT satisfy
+     *
+     * @var array
+     */
+    protected $mustNot = array();
+
+    /**
+     * @param string $name
+     * @param array $must
+     * @param array $should
+     * @param array $not
+     */
+    public function __construct($name, array $must = [], array $should = [], array $not = [])
+    {
+        $this->name = $name;
+        $this->must = $must;
+        $this->should = $should;
+        $this->mustNot = $not;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getType()
+    {
+        return FilterInterface::TYPE_BOOL;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Get Must filters
+     *
+     * @return array
+     */
+    public function getMust()
+    {
+        return $this->must;
+    }
+
+    /**
+     * Get Should filters
+     *
+     * @return array
+     */
+    public function getShould()
+    {
+        return $this->should;
+    }
+
+    /**
+     * Get Must Not filters
+     *
+     * @return array
+     */
+    public function getMustNot()
+    {
+        return $this->mustNot;
+    }
+}
diff --git a/lib/internal/Magento/Framework/Search/Request/Filter/Range.php b/lib/internal/Magento/Framework/Search/Request/Filter/Range.php
new file mode 100644
index 0000000000000000000000000000000000000000..db64a3894f8f8867e5d15f762ee1ed92e92fe5c0
--- /dev/null
+++ b/lib/internal/Magento/Framework/Search/Request/Filter/Range.php
@@ -0,0 +1,114 @@
+<?php
+/**
+ * Range Filter
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\Search\Request\Filter;
+
+use Magento\Framework\Search\Request\FilterInterface;
+
+/**
+ * @SuppressWarnings(PHPMD.ShortVariable)
+ */
+class Range implements FilterInterface
+{
+    /**
+     * @var string
+     */
+    protected $name;
+
+    /**
+     * @var string
+     */
+    protected $field;
+
+    /**
+     * @var int
+     */
+    protected $from;
+
+    /**
+     * @var int
+     */
+    protected $to;
+
+    /**
+     * @param string $name
+     * @param string $field
+     * @param int $from
+     * @param int $to
+     */
+    public function __construct($name, $field, $from, $to)
+    {
+        $this->name = $name;
+        $this->field = $field;
+        $this->from = $from;
+        $this->to = $to;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getType()
+    {
+        return FilterInterface::TYPE_RANGE;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Get Field
+     *
+     * @return string
+     */
+    public function getField()
+    {
+        return $this->field;
+    }
+
+    /**
+     * Get From
+     *
+     * @return int
+     */
+    public function getFrom()
+    {
+        return $this->from;
+    }
+
+    /**
+     * Get To
+     *
+     * @return int
+     */
+    public function getTo()
+    {
+        return $this->to;
+    }
+}
diff --git a/lib/internal/Magento/Framework/Search/Request/Filter/Term.php b/lib/internal/Magento/Framework/Search/Request/Filter/Term.php
new file mode 100644
index 0000000000000000000000000000000000000000..1ee1e0628385396c3d1f10c4021aa457091d9b80
--- /dev/null
+++ b/lib/internal/Magento/Framework/Search/Request/Filter/Term.php
@@ -0,0 +1,94 @@
+<?php
+/**
+ * Term Filter
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\Search\Request\Filter;
+
+use Magento\Framework\Search\Request\FilterInterface;
+
+class Term implements FilterInterface
+{
+    /**
+     * @var string
+     */
+    protected $name;
+
+    /**
+     * @var string
+     */
+    protected $field;
+
+    /**
+     * @var string
+     */
+    protected $value;
+
+    /**
+     * @param string $name
+     * @param string $field
+     * @param string $value
+     */
+    public function __construct($name, $field, $value)
+    {
+        $this->name = $name;
+        $this->field = $field;
+        $this->value = $value;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getType()
+    {
+        return FilterInterface::TYPE_TERM;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Get Field
+     *
+     * @return string
+     */
+    public function getField()
+    {
+        return $this->field;
+    }
+
+    /**
+     * Get Value
+     *
+     * @return string
+     */
+    public function getValue()
+    {
+        return $this->value;
+    }
+}
diff --git a/lib/internal/Magento/Framework/Search/Request/FilterInterface.php b/lib/internal/Magento/Framework/Search/Request/FilterInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..4f7df883ff345a0d1583bbfa7901e3df6a5571e4
--- /dev/null
+++ b/lib/internal/Magento/Framework/Search/Request/FilterInterface.php
@@ -0,0 +1,54 @@
+<?php
+/**
+ * Filter 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\Framework\Search\Request;
+
+interface FilterInterface
+{
+    /**
+     * #@+ Filter Types
+     */
+    const TYPE_TERM = 'termFilter';
+
+    const TYPE_BOOL = 'boolFilter';
+
+    const TYPE_RANGE = 'rangeFilter';
+
+    /**#@-*/
+
+    /**
+     * Get Type
+     *
+     * @return string
+     */
+    public function getType();
+
+    /**
+     * Get Name
+     *
+     * @return string
+     */
+    public function getName();
+}
diff --git a/lib/internal/Magento/Framework/Search/Request/Mapper.php b/lib/internal/Magento/Framework/Search/Request/Mapper.php
new file mode 100644
index 0000000000000000000000000000000000000000..a54a217ce80a8167e057408514c1a46b4ff07ecd
--- /dev/null
+++ b/lib/internal/Magento/Framework/Search/Request/Mapper.php
@@ -0,0 +1,212 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\Search\Request;
+
+use Magento\Framework\Search\Request\Query\Filter;
+
+class Mapper
+{
+    /**
+     * @var array
+     */
+    private $queries;
+
+    /**
+     * @var array
+     */
+    private $filters;
+
+    /**
+     * @var \Magento\Framework\ObjectManager
+     */
+    private $objectManager;
+
+    /**
+     * @param \Magento\Framework\ObjectManager $objectManager
+     * @param array $queries
+     * @param array $filters
+     */
+    public function __construct(
+        \Magento\Framework\ObjectManager $objectManager,
+        array $queries,
+        array $filters = null
+    ) {
+        $this->objectManager = $objectManager;
+        $this->queries = $queries;
+        $this->filters = $filters;
+    }
+
+    /**
+     * Get Query Interface by name
+     *
+     * @param string $queryName
+     * @return QueryInterface
+     */
+    public function get($queryName)
+    {
+        return $this->mapQuery($queryName);
+    }
+
+    /**
+     * Convert array to Query instance
+     *
+     * @param string $queryName
+     * @throws \Exception
+     * @return QueryInterface
+     */
+    private function mapQuery($queryName)
+    {
+        if (!isset($this->queries[$queryName])) {
+            throw new \Exception('Query ' . $queryName . ' does not exist');
+        }
+        $query = $this->queries[$queryName];
+        switch ($query['type']) {
+            case QueryInterface::TYPE_MATCH:
+                $query = $this->objectManager->create(
+                    'Magento\Framework\Search\Request\Query\Match',
+                    [
+                        'name' => $query['name'],
+                        'boost' => isset($query['boost']) ? $query['boost'] : 1,
+                        'matches' => $query['match']
+                    ]
+                );
+                break;
+            case QueryInterface::TYPE_FILTER:
+                if (isset($query['queryReference'][0])) {
+                    $reference = $this->mapQuery($query['queryReference'][0]['ref']);
+                    $referenceType = Filter::REFERENCE_QUERY;
+                } elseif (isset($query['filterReference'][0])) {
+                    $reference = $this->mapFilter($query['filterReference'][0]['ref']);
+                    $referenceType = Filter::REFERENCE_FILTER;
+                } else {
+                    throw new \Exception('Reference is not provided');
+                }
+                $query = $this->objectManager->create(
+                    'Magento\Framework\Search\Request\Query\Filter',
+                    [
+                        'name' => $query['name'],
+                        'boost' => isset($query['boost']) ? $query['boost'] : 1,
+                        'reference' => $reference,
+                        'referenceType' => $referenceType
+                    ]
+                );
+                break;
+            case QueryInterface::TYPE_BOOL:
+                $aggregatedByType = $this->aggregateQueriesByType($query['queryReference']);
+                $query = $this->objectManager->create(
+                    'Magento\Framework\Search\Request\Query\Bool',
+                    array_merge(
+                        ['name' => $query['name'], 'boost' => isset($query['boost']) ? $query['boost'] : 1],
+                        $aggregatedByType
+                    )
+                );
+                break;
+            default:
+                throw new \InvalidArgumentException('Invalid query type');
+        }
+        return $query;
+    }
+
+    /**
+     * Aggregate Queries by clause
+     *
+     * @param array $data
+     * @return array
+     */
+    private function aggregateQueriesByType($data)
+    {
+        $list = [];
+        foreach ($data as $value) {
+            $list[$value['clause']][$value['ref']] = $this->mapQuery($value['ref']);
+        }
+        return $list;
+    }
+
+    /**
+     * Aggregate Filters by clause
+     *
+     * @param array $data
+     * @return array
+     */
+    private function aggregateFiltersByType($data)
+    {
+        $list = [];
+        foreach ($data as $value) {
+            $list[$value['clause']][$value['ref']] = $this->mapFilter($value['ref']);
+        }
+        return $list;
+    }
+
+    /**
+     * Convert array to Filter instance
+     *
+     * @param string $filterName
+     * @throws \Exception
+     * @return FilterInterface
+     */
+    private function mapFilter($filterName)
+    {
+        if (!isset($this->filters[$filterName])) {
+            throw new \Exception('Filter ' . $filterName . ' does not exist');
+        }
+        $filter = $this->filters[$filterName];
+        switch ($filter['type']) {
+            case FilterInterface::TYPE_TERM:
+                $filter = $this->objectManager->create(
+                    'Magento\Framework\Search\Request\Filter\Term',
+                    [
+                        'name' => $filter['name'],
+                        'field' => $filter['field'],
+                        'value' => $filter['value']
+                    ]
+                );
+                break;
+            case FilterInterface::TYPE_RANGE:
+                $filter = $this->objectManager->create(
+                    'Magento\Framework\Search\Request\Filter\Range',
+                    [
+                        'name' => $filter['name'],
+                        'field' => $filter['field'],
+                        'from' => $filter['from'],
+                        'to' => $filter['to']
+                    ]
+                );
+
+                break;
+            case FilterInterface::TYPE_BOOL:
+                $aggregatedByType = $this->aggregateFiltersByType($filter['filterReference']);
+                $filter = $this->objectManager->create(
+                    'Magento\Framework\Search\Request\Filter\Bool',
+                    array_merge(
+                        ['name' => $filter['name']],
+                        $aggregatedByType
+                    )
+                );
+                break;
+            default:
+                throw new \InvalidArgumentException('Invalid filter type');
+        }
+        return $filter;
+    }
+}
diff --git a/lib/internal/Magento/Framework/Search/Request/Query/Bool.php b/lib/internal/Magento/Framework/Search/Request/Query/Bool.php
new file mode 100644
index 0000000000000000000000000000000000000000..186c96acf9b9ee2b50f2743144b2d2ecabbb4faa
--- /dev/null
+++ b/lib/internal/Magento/Framework/Search/Request/Query/Bool.php
@@ -0,0 +1,135 @@
+<?php
+/**
+ * Bool Query
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\Search\Request\Query;
+
+use Magento\Framework\Search\Request\QueryInterface;
+
+class Bool implements QueryInterface
+{
+    /**
+     * Boost
+     *
+     * @var int|null
+     */
+    protected $boost;
+
+    /**
+     * Query Name
+     *
+     * @var string
+     */
+    protected $name;
+
+    /**
+     * Query names to which result set SHOULD satisfy
+     *
+     * @var array
+     */
+    protected $should = array();
+
+    /**
+     * Query names to which result set MUST satisfy
+     *
+     * @var array
+     */
+    protected $must = array();
+
+    /**
+     * Query names to which result set MUST NOT satisfy
+     *
+     * @var array
+     */
+    protected $mustNot = array();
+
+    /**
+     * @param string $name
+     * @param int|null $boost
+     * @param array $must
+     * @param array $should
+     * @param array $not
+     */
+    public function __construct($name, $boost, array $must = [], array $should = [], array $not = [])
+    {
+        $this->name = $name;
+        $this->boost = $boost;
+        $this->must = $must;
+        $this->should = $should;
+        $this->mustNot = $not;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getType()
+    {
+        return QueryInterface::TYPE_BOOL;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getBoost()
+    {
+        return $this->boost;
+    }
+
+    /**
+     * Get Should queries
+     *
+     * @return array
+     */
+    public function getShould()
+    {
+        return $this->should;
+    }
+
+    /**
+     * Get Must queries
+     *
+     * @return array
+     */
+    public function getMust()
+    {
+        return $this->must;
+    }
+
+    /**
+     * Get Must Not queries
+     *
+     * @return array
+     */
+    public function getMustNot()
+    {
+        return $this->mustNot;
+    }
+}
diff --git a/lib/internal/Magento/Framework/Search/Request/Query/Filter.php b/lib/internal/Magento/Framework/Search/Request/Query/Filter.php
new file mode 100644
index 0000000000000000000000000000000000000000..480daadb74b69feb95079e2e8e4f35f8a2aa8f77
--- /dev/null
+++ b/lib/internal/Magento/Framework/Search/Request/Query/Filter.php
@@ -0,0 +1,124 @@
+<?php
+/**
+ * Term Query
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\Search\Request\Query;
+
+use Magento\Framework\Search\Request\QueryInterface;
+
+class Filter implements QueryInterface
+{
+    /**
+     * #@+ Reference Types
+     */
+    const REFERENCE_QUERY = 'query';
+
+    const REFERENCE_FILTER = 'filter';
+
+    /**#@-*/
+
+    /**
+     * @var string
+     */
+    protected $name;
+
+    /**
+     * Boost
+     *
+     * @var int|null
+     */
+    protected $boost;
+
+    /**
+     * Reference Type
+     *
+     * @var string
+     */
+    protected $referenceType;
+
+    /**
+     * Reference Name
+     *
+     * @var string
+     */
+    protected $reference;
+
+    /**
+     * @param string $name
+     * @param int|null $boost
+     * @param string $referenceType
+     * @param string $reference
+     */
+    public function __construct($name, $boost, $referenceType, $reference)
+    {
+        $this->name = $name;
+        $this->boost = $boost;
+        $this->referenceType = $referenceType;
+        $this->reference = $reference;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getType()
+    {
+        return QueryInterface::TYPE_FILTER;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getBoost()
+    {
+        return $this->boost;
+    }
+
+    /**
+     * Get Reference
+     *
+     * @return mixed
+     */
+    public function getReference()
+    {
+        return $this->reference;
+    }
+
+    /**
+     * Get Reference Type
+     *
+     * @return string
+     */
+    public function getReferenceType()
+    {
+        return $this->referenceType;
+    }
+}
diff --git a/lib/internal/Magento/Framework/Search/Request/Query/Match.php b/lib/internal/Magento/Framework/Search/Request/Query/Match.php
new file mode 100644
index 0000000000000000000000000000000000000000..da0d3df48490952074f56613320107531032a437
--- /dev/null
+++ b/lib/internal/Magento/Framework/Search/Request/Query/Match.php
@@ -0,0 +1,101 @@
+<?php
+/**
+ * Match Query
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\Search\Request\Query;
+
+use Magento\Framework\Search\Request\QueryInterface;
+
+class Match implements QueryInterface
+{
+    /**
+     * @var string
+     */
+    protected $name;
+
+    /**
+     * Boost
+     *
+     * @var int|null
+     */
+    protected $boost;
+
+    /**
+     * Match query array
+     * Possible structure:
+     * array(
+     *     ['field' => 'some_field', 'value' => 'some_value', 'boost' => 'some_boost'],
+     *     ['field' => 'some_field', 'value' => 'some_value', 'boost' => 'some_boost'],
+     * )
+     *
+     * @var array
+     */
+    protected $matches = array();
+
+    /**
+     * @param string $name
+     * @param int|null $boost
+     * @param array $matches
+     */
+    public function __construct($name, $boost, array $matches)
+    {
+        $this->name = $name;
+        $this->boost = $boost;
+        $this->matches = $matches;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getType()
+    {
+        return QueryInterface::TYPE_MATCH;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getBoost()
+    {
+        return $this->boost;
+    }
+
+    /**
+     * Get Matches
+     *
+     * @return array
+     */
+    public function getMatches()
+    {
+        return $this->matches;
+    }
+}
diff --git a/lib/internal/Magento/Framework/Search/Request/QueryInterface.php b/lib/internal/Magento/Framework/Search/Request/QueryInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..8b709d0571708039472ac095cd702c627db4136f
--- /dev/null
+++ b/lib/internal/Magento/Framework/Search/Request/QueryInterface.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * Query 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\Framework\Search\Request;
+
+interface QueryInterface
+{
+    /**
+     * #@+ Query Types
+     */
+    const TYPE_MATCH = 'matchQuery';
+
+    const TYPE_BOOL = 'boolQuery';
+
+    const TYPE_FILTER = 'filteredQuery';
+
+    /**#@-*/
+
+    /**
+     * Get Type
+     *
+     * @return string
+     */
+    public function getType();
+
+    /**
+     * Get Name
+     *
+     * @return string
+     */
+    public function getName();
+
+    /**
+     * Get Boost
+     *
+     * @return int|null
+     */
+    public function getBoost();
+}
diff --git a/lib/internal/Magento/Framework/Search/RequestFactory.php b/lib/internal/Magento/Framework/Search/RequestFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..38db68f9dbe8f1f5d5dbbda52dc3513efbca620f
--- /dev/null
+++ b/lib/internal/Magento/Framework/Search/RequestFactory.php
@@ -0,0 +1,119 @@
+<?php
+/**
+ * Search Request Pool
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\Search;
+
+class RequestFactory
+{
+    const CACHE_PREFIX = 'search_request::';
+
+    /**
+     * @var Request\Config
+     */
+    private $config;
+
+    /**
+     * @var \Magento\Framework\ObjectManager
+     */
+    private $objectManager;
+
+    /**
+     * Request Pool constructor
+     *
+     * @param \Magento\Framework\ObjectManager $objectManager
+     * @param \Magento\Framework\Search\Request\Config $config
+     */
+    public function __construct(
+        \Magento\Framework\ObjectManager $objectManager,
+        \Magento\Framework\Search\Request\Config $config
+    ) {
+        $this->objectManager = $objectManager;
+        $this->config = $config;
+    }
+
+    /**
+     * Create Request instance with specified parameters
+     *
+     * @param string $requestName
+     * @param array $bindValues
+     * @return \Magento\Framework\Search\Request
+     * @throws \InvalidArgumentException
+     */
+    public function create($requestName, array $bindValues = array())
+    {
+        $data = $this->config->get($requestName);
+        if (is_null($data)) {
+            throw new \InvalidArgumentException("Request name '{$requestName}' doesn't exist.");
+        }
+        $data = $this->replaceBinds((array)$data, array_keys($bindValues), array_values($bindValues));
+        return $this->convert($data);
+    }
+
+    /**
+     * @param string|array $data
+     * @param string[] $bindKeys
+     * @param string[] $bindValues
+     * @return string|array
+     */
+    private function replaceBinds($data, $bindKeys, $bindValues)
+    {
+        if (is_scalar($data)) {
+            return str_replace($bindKeys, $bindValues, $data);
+        } else {
+            foreach ($data as $key => $value) {
+                $data[$key] = $this->replaceBinds($value, $bindKeys, $bindValues);
+            }
+            return $data;
+        }
+    }
+
+    /**
+     * Convert array to Request instance
+     *
+     * @param array $data
+     * @return \Magento\Framework\Search\Request
+     */
+    private function convert($data)
+    {
+        $mapper = $this->objectManager->create(
+            'Magento\Framework\Search\Request\Mapper',
+            [
+                'objectManager' => $this->objectManager,
+                'queries' => $data['queries'],
+                'filters' => $data['filters']
+            ]
+        );
+        return $this->objectManager->create(
+            'Magento\Framework\Search\Request',
+            [
+                'name' => $data['query'],
+                'indexName' => $data['index'],
+                'from' => $data['from'],
+                'size' => $data['size'],
+                'query' => $mapper->get($data['query']),
+                'buckets' => [],
+            ]
+        );
+    }
+}
diff --git a/lib/internal/Magento/Framework/Search/RequestInterface.php b/lib/internal/Magento/Framework/Search/RequestInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..b249646af6557a45a8b5e32ca0ca99c66779d9ca
--- /dev/null
+++ b/lib/internal/Magento/Framework/Search/RequestInterface.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * Search Request
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\Search;
+
+use Magento\Framework\Search\Request\FilterInterface;
+use Magento\Framework\Search\Request\BucketInterface;
+use Magento\Framework\Search\Request\QueryInterface;
+
+interface RequestInterface
+{
+    /**
+     * Get Name
+     *
+     * @return string
+     */
+    public function getName();
+
+    /**
+     * Get Index name
+     *
+     * @return string
+     */
+    public function getIndex();
+
+    /**
+     * Get Aggregation Buckets
+     *
+     * @return BucketInterface[]
+     */
+    public function getAggregation();
+
+    /**
+     * Get Main Request Query
+     *
+     * @return QueryInterface
+     */
+    public function getQuery();
+
+    /**
+     * Get From
+     *
+     * @return int|null
+     */
+    public function getFrom();
+
+    /**
+     * Get Size
+     *
+     * @return int|null
+     */
+    public function getSize();
+}
diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Resource/Product/Option/Stub.php b/lib/internal/Magento/Framework/Search/Response.php
similarity index 88%
rename from dev/tests/unit/testsuite/Magento/Catalog/Model/Resource/Product/Option/Stub.php
rename to lib/internal/Magento/Framework/Search/Response.php
index 3a0973e850066fe682204778548ca89ed7d37cd1..d9bd14fbb4dcae43097d90b746985148e7f88990 100644
--- a/dev/tests/unit/testsuite/Magento/Catalog/Model/Resource/Product/Option/Stub.php
+++ b/lib/internal/Magento/Framework/Search/Response.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Search Response
+ *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -21,8 +23,8 @@
  * @copyright   Copyright (c) 2014 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\Option;
+namespace Magento\Framework\Search;
 
-class Stub extends \Magento\Framework\Model\AbstractModel
+class Response implements ResponseInterface
 {
 }
diff --git a/app/code/Magento/CatalogImportExport/Model/Export/Product/Type/Grouped.php b/lib/internal/Magento/Framework/Search/ResponseInterface.php
similarity index 86%
rename from app/code/Magento/CatalogImportExport/Model/Export/Product/Type/Grouped.php
rename to lib/internal/Magento/Framework/Search/ResponseInterface.php
index feda0988b487972a6ac006e58a6aa1b174968e40..9b058362b33f04f0e7b5d68c8c0c5bb6803cbf1d 100644
--- a/app/code/Magento/CatalogImportExport/Model/Export/Product/Type/Grouped.php
+++ b/lib/internal/Magento/Framework/Search/ResponseInterface.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * Export entity of grouped product type
+ * Search Request
  *
  * Magento
  *
@@ -23,8 +23,8 @@
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
-namespace Magento\CatalogImportExport\Model\Export\Product\Type;
+namespace Magento\Framework\Search;
 
-class Grouped extends AbstractType
+interface ResponseInterface
 {
 }
diff --git a/dev/tests/integration/testsuite/Magento/Authz/Service/AuthorizationV1Test/UserLocatorStub.php b/lib/internal/Magento/Framework/Search/SearchEngine.php
similarity index 75%
rename from dev/tests/integration/testsuite/Magento/Authz/Service/AuthorizationV1Test/UserLocatorStub.php
rename to lib/internal/Magento/Framework/Search/SearchEngine.php
index 080f7a7e051019548669cb4fd128b0468727d18a..7a738edf64ff20013dd8a651eb157574e0d033f0 100644
--- a/dev/tests/integration/testsuite/Magento/Authz/Service/AuthorizationV1Test/UserLocatorStub.php
+++ b/lib/internal/Magento/Framework/Search/SearchEngine.php
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Search Engine
+ *
  * Magento
  *
  * NOTICE OF LICENSE
@@ -21,25 +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\Authz\Service\AuthorizationV1Test;
-
-use Magento\Authz\Model\UserLocatorInterface;
+namespace Magento\Framework\Search;
 
-class UserLocatorStub implements UserLocatorInterface
+class SearchEngine implements SearchEngineInterface
 {
     /**
      * {@inheritdoc}
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
-    public function getUserId()
-    {
-        return '';
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function getUserType()
+    public function search(RequestInterface $request)
     {
-        return '';
     }
 }
diff --git a/lib/internal/Magento/Framework/Search/SearchEngineInterface.php b/lib/internal/Magento/Framework/Search/SearchEngineInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..aab97f199419dd26a35df6cfca5451f1e4ba0cc2
--- /dev/null
+++ b/lib/internal/Magento/Framework/Search/SearchEngineInterface.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Search Engine 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\Framework\Search;
+
+interface SearchEngineInterface
+{
+    /**
+     * Process Search Request
+     *
+     * @param RequestInterface $request
+     * @return ResponseInterface
+     */
+    public function search(RequestInterface $request);
+}
diff --git a/lib/internal/Magento/Framework/Search/etc/requests.xsd b/lib/internal/Magento/Framework/Search/etc/requests.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..67d2cfb81dc40927b8a5f03c4bba77e48bead05b
--- /dev/null
+++ b/lib/internal/Magento/Framework/Search/etc/requests.xsd
@@ -0,0 +1,276 @@
+<?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.
+ *
+ * @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" attributeFormDefault="unqualified" elementFormDefault="qualified">
+
+  <xs:complexType name="request">
+    <xs:sequence>
+      <xs:element type="queries" name="queries" minOccurs="1">
+        <xs:key name="queryName">
+          <xs:selector xpath="query" />
+          <xs:field xpath="@name" />
+        </xs:key>
+      </xs:element>
+      <xs:element type="filters" name="filters">
+        <xs:key name="filterName">
+          <xs:selector xpath="filter" />
+          <xs:field xpath="@name" />
+        </xs:key>
+      </xs:element>
+      <xs:element type="aggregation" name="aggregation" >
+        <xs:key name="aggregationName">
+          <xs:selector xpath="bucket" />
+          <xs:field xpath="@name" />
+        </xs:key>
+      </xs:element>
+      <xs:element type="xs:string" name="from" />
+      <xs:element type="xs:string" name="size" />
+    </xs:sequence>
+    <xs:attribute type="xs:string" name="query" use="required" />
+    <xs:attribute type="xs:string" name="index" use="required" />
+  </xs:complexType>
+
+  <xs:attribute name="clause">
+    <xs:annotation>
+      <xs:documentation>Specifies how clauses are to occur in matching documents.</xs:documentation>
+    </xs:annotation>
+    <xs:simpleType>
+      <xs:restriction base="xs:string">
+        <xs:enumeration value="must" />
+        <xs:enumeration value="should" />
+        <xs:enumeration value="not" />
+      </xs:restriction>
+    </xs:simpleType>
+  </xs:attribute>
+
+  <!-- Queries Type hierarchy -->
+  <xs:complexType name="queries">
+    <xs:annotation>
+      <xs:documentation>Definition of queries</xs:documentation>
+    </xs:annotation>
+    <xs:sequence>
+      <xs:element type="query" name="query" maxOccurs="unbounded" minOccurs="1" />
+    </xs:sequence>
+  </xs:complexType>
+
+
+  <xs:complexType name="query" abstract="true">
+    <xs:attribute type="xs:string" name="name" use="required" />
+    <xs:attribute type="xs:byte" name="boost" use="optional" default="1" />
+  </xs:complexType>
+
+  <xs:complexType name="boolQuery">
+    <xs:complexContent>
+      <xs:extension base="query">
+        <xs:sequence>
+          <xs:element name="queryReference" minOccurs="1" maxOccurs="unbounded">
+            <xs:complexType>
+              <xs:complexContent>
+                <xs:extension base="queryReference">
+                  <xs:attribute ref="clause" use="required" />
+                </xs:extension>
+              </xs:complexContent>
+            </xs:complexType>
+          </xs:element>
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:complexType name="matchQuery">
+    <xs:complexContent>
+      <xs:extension base="query">
+        <xs:sequence>
+          <xs:element type="match" name="match" minOccurs="1" maxOccurs="unbounded" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:complexType name="filteredQuery">
+    <xs:complexContent>
+      <xs:extension base="query">
+        <xs:choice minOccurs="1" maxOccurs="1">
+          <xs:element type="filterReference" name="filterReference" />
+          <xs:element type="queryReference" name="queryReference" />
+        </xs:choice>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+
+  <!--
+    Filters Type hierarchy
+    Example:
+    <filter xsi:type="termFilter" name="promoted_documents_boost" field="promoted" value="1" />
+    <filter xsi:type="rangeFilter" name="price_name" from="10" to="100" />
+    <filter xsi:type="boolFilter" name="price_name">
+        <filterReference clause="must" name="promoted_documents_filter" />
+    </filter
+  -->
+  <xs:complexType name="filters">
+    <xs:sequence>
+      <xs:element type="filter" name="filter" maxOccurs="unbounded" minOccurs="0" />
+    </xs:sequence>
+  </xs:complexType>
+
+  <xs:complexType name="filter" abstract="true">
+    <xs:attribute type="xs:string" name="name" use="required" />
+  </xs:complexType>
+  <xs:complexType name="termFilter">
+    <xs:complexContent>
+      <xs:extension base="filter">
+        <xs:attribute type="xs:string" name="field" use="required" />
+        <xs:attribute type="xs:string" name="value" use="required" />
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:complexType name="rangeFilter">
+    <xs:complexContent>
+      <xs:extension base="filter">
+        <xs:attribute type="xs:string" name="field" use="required" />
+        <xs:attribute type="xs:string" name="from" use="required" />
+        <xs:attribute type="xs:string" name="to" use="required" />
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:complexType name="boolFilter">
+    <xs:complexContent>
+      <xs:extension base="filter">
+        <xs:sequence>
+          <xs:element name="filterReference" minOccurs="1" maxOccurs="unbounded">
+            <xs:complexType>
+              <xs:complexContent>
+                <xs:extension base="filterReference">
+                  <xs:attribute ref="clause" use="required" />
+                </xs:extension>
+              </xs:complexContent>
+            </xs:complexType>
+          </xs:element>
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+
+  <!--
+    Buckets Type hierarchy
+      Example:
+      <bucket xsi:type="termBucket" name="category_bucket" field="category">
+      <bucket xsi:type="rangeBucket" name="price_bucket" field="price">
+  -->
+  <xs:complexType name="bucket" abstract="true">
+    <xs:sequence>
+      <xs:element type="metrics" name="metrics" />
+    </xs:sequence>
+    <xs:attribute type="xs:string" name="name" use="required" />
+    <xs:attribute type="xs:string" name="field" use="required" />
+  </xs:complexType>
+
+  <xs:complexType name="termBucket">
+    <xs:complexContent>
+      <xs:extension base="bucket">
+        </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:complexType name="rangeBucket">
+    <xs:complexContent>
+      <xs:extension base="bucket">
+        <xs:sequence>
+          <xs:element type="ranges" name="ranges" minOccurs="1" />
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:complexType name="metrics">
+    <xs:sequence>
+      <xs:element type="metric" name="metric" maxOccurs="unbounded" minOccurs="0" />
+    </xs:sequence>
+  </xs:complexType>
+
+  <xs:complexType name="match">
+    <xs:simpleContent>
+      <xs:extension base="xs:string">
+        <xs:attribute type="xs:string" name="field" use="required" />
+        <xs:attribute type="xs:string" name="value" use="required" />
+        <xs:attribute type="xs:byte" name="boost" use="optional" />
+      </xs:extension>
+    </xs:simpleContent>
+  </xs:complexType>
+
+  <xs:complexType name="aggregation">
+    <xs:choice maxOccurs="unbounded" minOccurs="1">
+      <xs:element type="bucket" name="bucket" />
+    </xs:choice>
+  </xs:complexType>
+
+  <xs:complexType name="queryReference">
+    <xs:simpleContent>
+      <xs:extension base="xs:string">
+        <xs:attribute type="xs:string" name="ref" use="required" />
+      </xs:extension>
+    </xs:simpleContent>
+  </xs:complexType>
+
+  <xs:complexType name="filterReference">
+    <xs:simpleContent>
+      <xs:extension base="xs:string">
+        <xs:attribute type="xs:string" name="ref" use="required" />
+      </xs:extension>
+    </xs:simpleContent>
+  </xs:complexType>
+
+  <xs:complexType name="metric">
+    <xs:simpleContent>
+      <xs:extension base="xs:string">
+        <xs:attribute name="type">
+          <xs:simpleType>
+            <xs:restriction base="xs:string">
+              <xs:enumeration value="sum" />
+              <xs:enumeration value="count" />
+              <xs:enumeration value="min" />
+              <xs:enumeration value="max" />
+            </xs:restriction>
+          </xs:simpleType>
+        </xs:attribute>
+      </xs:extension>
+    </xs:simpleContent>
+  </xs:complexType>
+
+  <xs:complexType name="ranges">
+    <xs:sequence>
+      <xs:element type="range" name="range" maxOccurs="unbounded" minOccurs="0" />
+    </xs:sequence>
+  </xs:complexType>
+
+  <xs:complexType name="range">
+    <xs:attribute type="xs:string" name="to" use="required" />
+    <xs:attribute type="xs:string" name="from" use="required" />
+  </xs:complexType>
+</xs:schema>
\ No newline at end of file
diff --git a/lib/internal/Magento/Framework/Search/etc/search_request.xsd b/lib/internal/Magento/Framework/Search/etc/search_request.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..d36bb85bec9326dfbefb0c4f3d95c05e96e22b34
--- /dev/null
+++ b/lib/internal/Magento/Framework/Search/etc/search_request.xsd
@@ -0,0 +1,46 @@
+<?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.
+ *
+ * @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" attributeFormDefault="unqualified" elementFormDefault="qualified">
+    <xs:include schemaLocation="requests.xsd"/>
+
+    <xs:complexType name="requests">
+        <xs:sequence>
+            <xs:element type="request" name="request" maxOccurs="unbounded">
+                <xs:keyref name="queryReference" refer="queryName">
+                    <xs:selector xpath=".//queryReference"/>
+                    <xs:field xpath="@ref"/>
+                </xs:keyref>
+
+                <xs:keyref name="filterReference" refer="filterName">
+                    <xs:selector xpath=".//filterReference"/>
+                    <xs:field xpath="@ref"/>
+                </xs:keyref>
+            </xs:element>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:element name="requests" type="requests" />
+</xs:schema>
\ No newline at end of file
diff --git a/lib/internal/Magento/Framework/Search/etc/search_request_merged.xsd b/lib/internal/Magento/Framework/Search/etc/search_request_merged.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..dfedcfe2742715b1bb24c94b006635e09095af84
--- /dev/null
+++ b/lib/internal/Magento/Framework/Search/etc/search_request_merged.xsd
@@ -0,0 +1,48 @@
+<?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.
+ *
+ * @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" attributeFormDefault="unqualified" elementFormDefault="qualified">
+    <xs:include schemaLocation="requests.xsd"/>
+    <xs:complexType name="requests">
+        <xs:sequence>
+            <xs:element type="request" name="request" maxOccurs="unbounded">
+                <xs:keyref name="requestQueryReference" refer="queryName">
+                    <xs:selector xpath="."/>
+                    <xs:field xpath="@query"/>
+                </xs:keyref>
+                <xs:keyref name="queryReference" refer="queryName">
+                    <xs:selector xpath=".//queryReference"/>
+                    <xs:field xpath="@ref"/>
+                </xs:keyref>
+
+                <xs:keyref name="filterReference" refer="filterName">
+                    <xs:selector xpath=".//filterReference"/>
+                    <xs:field xpath="@ref"/>
+                </xs:keyref>
+            </xs:element>
+        </xs:sequence>
+    </xs:complexType>
+    <xs:element name="requests" type="requests"/>
+</xs:schema>
\ No newline at end of file
diff --git a/lib/internal/Magento/Framework/Service/Code/Generator/Builder.php b/lib/internal/Magento/Framework/Service/Code/Generator/Builder.php
new file mode 100644
index 0000000000000000000000000000000000000000..63cbeb3407b019a99891df2eff86958ca0922e7a
--- /dev/null
+++ b/lib/internal/Magento/Framework/Service/Code/Generator/Builder.php
@@ -0,0 +1,156 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to 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_Code
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Framework\Service\Code\Generator;
+
+use Magento\Framework\Code\Generator\EntityAbstract;
+use Zend\Server\Reflection\ReflectionMethod;
+
+/**
+ * Class Builder
+ */
+class Builder extends EntityAbstract
+{
+    /**
+     * Entity type
+     */
+    const ENTITY_TYPE = 'builder';
+
+    /**
+     * Retrieve class properties
+     *
+     * @return array
+     */
+    protected function _getClassProperties()
+    {
+        return [];
+    }
+
+    /**
+     * Get default constructor definition for generated class
+     *
+     * @return array
+     */
+    protected function _getDefaultConstructorDefinition()
+    {
+        return [];
+    }
+
+    /**
+     * Returns list of methods for class generator
+     *
+     * @return array
+     */
+    protected function _getClassMethods()
+    {
+        $methods = [];
+        $reflectionClass = new \ReflectionClass($this->_getSourceClassName());
+        $publicMethods = $reflectionClass->getMethods(\ReflectionMethod::IS_PUBLIC);
+        foreach ($publicMethods as $method) {
+            if (!($method->isConstructor() ||
+                    $method->isFinal() ||
+                    $method->isStatic() ||
+                    $method->isDestructor()) &&
+                !in_array(
+                    $method->getName(),
+                    array('__sleep', '__wakeup', '__clone')
+                )
+            ) {
+                if (substr($method->getName(), 0, 3) == 'get') {
+                    $methods[] = $this->_getMethodInfo($reflectionClass, $method);
+                }
+
+            }
+        }
+        return $methods;
+    }
+
+    /**
+     * Retrieve method info
+     *
+     * @param \ReflectionClass $class
+     * @param \ReflectionMethod $method
+     * @return array
+     */
+    protected function _getMethodInfo(\ReflectionClass $class, \ReflectionMethod $method)
+    {
+        $methodInfo = [
+            'name' => 'set' . substr($method->getName(), 3),
+            'parameters' => [
+                [ 'name' =>  lcfirst(substr($method->getName(), 3))]
+            ],
+            'body' => "\$this->_set("
+                 . '\\' . $class->getName() . "::"
+                . strtoupper(preg_replace('/(.)([A-Z])/', "$1_$2", substr($method->getName(), 3)))
+                . ", \$" . lcfirst(substr($method->getName(), 3)) . ");",
+            'docblock' => array('shortDescription' => '{@inheritdoc}')
+        ];
+
+        return $methodInfo;
+    }
+
+    /**
+     * Validate data
+     *
+     * @return bool
+     */
+    protected function _validateData()
+    {
+        $result = parent::_validateData();
+
+        if ($result) {
+            $sourceClassName = $this->_getSourceClassName();
+            $resultClassName = $this->_getResultClassName();
+
+            if ($resultClassName !== $sourceClassName . 'Builder') {
+                $this->_addError(
+                    'Invalid Builder class name [' . $resultClassName . ']. Use ' . $sourceClassName . 'Builder'
+                );
+                $result = false;
+            }
+        }
+        return $result;
+    }
+
+    /**
+     * Generate code
+     *
+     * @return string
+     */
+    protected function _generateCode()
+    {
+        $this->_classGenerator->setName(
+            $this->_getResultClassName()
+        )->addProperties(
+            $this->_getClassProperties()
+        )->addMethods(
+            $this->_getClassMethods()
+        )->setClassDocBlock(
+            $this->_getClassDocBlock()
+        )->setExtendedClass('\\Magento\Framework\Service\Data\AbstractObjectBuilder');
+
+        return $this->_getGeneratedCode();
+    }
+}
diff --git a/lib/internal/Magento/Framework/Service/Code/Generator/Mapper.php b/lib/internal/Magento/Framework/Service/Code/Generator/Mapper.php
new file mode 100644
index 0000000000000000000000000000000000000000..c1602fc1e8018c19dd00d7dee4d4494108a9393a
--- /dev/null
+++ b/lib/internal/Magento/Framework/Service/Code/Generator/Mapper.php
@@ -0,0 +1,169 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\Service\Code\Generator;
+
+/**
+ * Class Repository
+ */
+class Mapper extends \Magento\Framework\Code\Generator\EntityAbstract
+{
+    /**
+     * Entity type
+     */
+    const ENTITY_TYPE = 'mapper';
+
+    /**
+     * Retrieve class properties
+     *
+     * @return array
+     */
+    protected function _getClassProperties()
+    {
+        $properties = [
+            [
+                'name' => $this->_getSourceBuilderPropertyName(),
+                'visibility' => 'protected',
+                'docblock' => [
+                    'shortDescription' =>  $this->_getSourceBuilderPropertyName(),
+                    'tags' => [
+                        [
+                            'name' => 'var',
+                            'description' =>
+                                $this->_getFullyQualifiedClassName($this->_getSourceClassName()) . 'Builder'
+                        ]
+                    ]
+                ]
+            ],
+            [
+                'name' => 'registry',
+                'visibility' => 'protected',
+                'defaultValue' => [],
+                'docblock' => [
+                    'shortDescription' => $this->_getSourceClassName() . '[]',
+                    'tags' => [['name' => 'var', 'description' => 'array']]
+                ]
+            ]
+        ];
+        return $properties;
+    }
+
+    /**
+     * Returns source factory property Name
+     *
+     * @return string
+     */
+    protected function _getSourceBuilderPropertyName()
+    {
+        $parts = explode('\\', $this->_getSourceClassName());
+        return lcfirst(end($parts)) . 'Builder';
+    }
+
+    /**
+     * Get default constructor definition for generated class
+     *
+     * @return array
+     */
+    protected function _getDefaultConstructorDefinition()
+    {
+        return [
+            'name' => '__construct',
+            'parameters' => [
+                [
+                    'name' => $this->_getSourceBuilderPropertyName(),
+                    'type' => $this->_getFullyQualifiedClassName($this->_getSourceClassName()) . 'Builder'
+                ],
+            ],
+            'body' => "\$this->"
+                . $this->_getSourceBuilderPropertyName()
+                . " = \$" . $this->_getSourceBuilderPropertyName() . ';',
+            'docblock' => [
+                'shortDescription' => ucfirst(static::ENTITY_TYPE) . ' constructor',
+                'tags' => [
+                    [
+                        'name' => 'param',
+                        'description' => '\\' . $this->_getSourceClassName()
+                            . " \$" . $this->_getSourceBuilderPropertyName()
+                    ]
+                ]
+            ]
+        ];
+    }
+
+    /**
+     * Returns list of methods for class generator
+     *
+     * @return array
+     */
+    protected function _getClassMethods()
+    {
+        $construct = $this->_getDefaultConstructorDefinition();
+        $body = "\$this->" . $this->_getSourceBuilderPropertyName() . "->populateWithArray(\$object->getData());"
+            . "\nreturn \$this->" . $this->_getSourceBuilderPropertyName() . "->create();";
+        $extract = [
+            'name' => 'extractDto',
+            'parameters' => [
+                [
+                    'name' => 'object',
+                    'type' => '\\Magento\Framework\Model\AbstractModel'
+                ]
+            ],
+            'body' => $body,
+            'docblock' => [
+                'shortDescription' => 'Extract data object from model',
+                'tags' => [
+                    [
+                        'name' => 'param',
+                        'description' => '\\Magento\Framework\Model\AbstractModel $object'
+                    ],
+                    [
+                        'name' => 'return',
+                        'description' => $this->_getFullyQualifiedClassName($this->_getSourceClassName()),
+                    ]
+                ]
+            ]
+        ];
+        return [$construct, $extract];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function _validateData()
+    {
+        $result = parent::_validateData();
+
+        if ($result) {
+            $sourceClassName = $this->_getSourceClassName();
+            $resultClassName = $this->_getResultClassName();
+
+            if ($resultClassName !== $sourceClassName . 'Mapper') {
+                $this->_addError(
+                    'Invalid Mapper class name [' . $resultClassName . ']. Use ' . $sourceClassName . 'Mapper'
+                );
+                $result = false;
+            }
+        }
+        return $result;
+    }
+}
diff --git a/lib/internal/Magento/Framework/Service/Code/Generator/SearchResults.php b/lib/internal/Magento/Framework/Service/Code/Generator/SearchResults.php
new file mode 100644
index 0000000000000000000000000000000000000000..9b789fcab78e9d2148c4e1035e6a33490c34b631
--- /dev/null
+++ b/lib/internal/Magento/Framework/Service/Code/Generator/SearchResults.php
@@ -0,0 +1,102 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to 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_Code
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Framework\Service\Code\Generator;
+
+use Magento\Framework\Code\Generator\EntityAbstract;
+
+/**
+ * Class Builder
+ */
+
+class SearchResults extends EntityAbstract
+{
+    /**
+     * Entity type
+     */
+    const ENTITY_TYPE = 'searchResults';
+
+    /**
+     * Search result default class
+     */
+    const SEARCH_RESULT = '\\Magento\Framework\Service\V1\Data\SearchResults';
+
+    /**
+     * Retrieve class properties
+     *
+     * @return array
+     */
+    protected function _getClassProperties()
+    {
+        return [];
+    }
+
+    /**
+     * Returns list of methods for class generator
+     *
+     * @return array
+     */
+    protected function _getClassMethods()
+    {
+        $getItems = [
+            'name' => 'getItems',
+            'parameters' => [],
+            'body' => "return parent::getItems();",
+            'docblock' => [
+                'shortDescription' => 'Returns array of items',
+                'tags' => [
+                    [
+                        'name' => 'return',
+                        'description' => $this->_getFullyQualifiedClassName($this->_getSourceClassName()) . '[]',
+                    ]
+                ]
+            ]
+        ];
+        return [$getItems];
+    }
+
+    /**
+     * Returns default constructor definition
+     *
+     * @return array
+     */
+    protected function _getDefaultConstructorDefinition()
+    {
+        return [];
+    }
+
+    /**
+     * Generate code
+     *
+     * @return string
+     */
+    protected function _generateCode()
+    {
+        $this->_classGenerator->setName($this->_getResultClassName())
+            ->setExtendedClass(self::SEARCH_RESULT)
+            ->addMethods($this->_getClassMethods());
+        return $this->_getGeneratedCode();
+    }
+}
diff --git a/lib/internal/Magento/Framework/Service/Code/Generator/SearchResultsBuilder.php b/lib/internal/Magento/Framework/Service/Code/Generator/SearchResultsBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..db32f0fbb6961510666d59f77a259e4e6e5b6b38
--- /dev/null
+++ b/lib/internal/Magento/Framework/Service/Code/Generator/SearchResultsBuilder.php
@@ -0,0 +1,139 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to 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_Code
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Framework\Service\Code\Generator;
+
+use Magento\Framework\Code\Generator\EntityAbstract;
+
+/**
+ * Class Builder
+ */
+class SearchResultsBuilder extends EntityAbstract
+{
+    /**
+     * Entity type
+     */
+    const ENTITY_TYPE = 'searchResultsBuilder';
+
+    /**
+     * Search result builder abstract class
+     */
+    const SEARCH_RESULT_BUILDER = '\\Magento\Framework\Service\V1\Data\AbstractSearchResultsBuilder';
+
+    /**
+     * Retrieve class properties
+     *
+     * @return array
+     */
+    protected function _getClassProperties()
+    {
+        return [];
+    }
+
+    /**
+     * Get default constructor definition for generated class
+     *
+     * @return array
+     */
+    protected function _getDefaultConstructorDefinition()
+    {
+        return [
+            'name' => '__construct',
+            'parameters' => [
+                [
+                    'name' => 'objectFactory',
+                    'type' => '\\Magento\Framework\Service\Data\ObjectFactory'
+                ],
+                [
+                    'name' => 'searchCriteriaBuilder',
+                    'type' => '\\Magento\Framework\Service\V1\Data\SearchCriteriaBuilder'
+                ],
+                [
+                    'name' => 'itemObjectBuilder',
+                    'type' => $this->_getFullyQualifiedClassName($this->_getSourceClassName()) . 'Builder'
+                ],
+            ],
+            'body' => "parent::__construct(\$objectFactory, \$searchCriteriaBuilder, \$itemObjectBuilder);",
+            'docblock' => [
+                'shortDescription' => ucfirst(static::ENTITY_TYPE) . ' constructor',
+                'tags' => [
+                    [
+                        'name' => 'param',
+                        'description' => ''
+                    ]
+                ]
+            ]
+        ];
+    }
+
+    /**
+     * Returns list of methods for class generator
+     *
+     * @return array
+     */
+    protected function _getClassMethods()
+    {
+        return [$this->_getDefaultConstructorDefinition()];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function _validateData()
+    {
+        $result = parent::_validateData();
+
+        if ($result) {
+            $sourceClassName = $this->_getSourceClassName();
+            $resultClassName = $this->_getResultClassName();
+
+            if ($resultClassName !== $sourceClassName . 'SearchResultsBuilder') {
+                $this->_addError(
+                    'Invalid Result class name [' . $resultClassName . ']. Use '
+                    . $sourceClassName . 'SearchResultsBuilder'
+                );
+                $result = false;
+            }
+        }
+        return $result;
+    }
+
+    /**
+     * Generate code
+     *
+     * @return string
+     */
+    protected function _generateCode()
+    {
+        $this->_classGenerator->setName(
+            $this->_getResultClassName()
+        )->addMethods(
+            $this->_getClassMethods()
+        )->setClassDocBlock(
+            $this->_getClassDocBlock()
+        )->setExtendedClass(self::SEARCH_RESULT_BUILDER);
+        return $this->_getGeneratedCode();
+    }
+}
diff --git a/lib/internal/Magento/Framework/Session/SessionManager.php b/lib/internal/Magento/Framework/Session/SessionManager.php
index 7470998ee3989f46d51abb44cfa97a85fde8b3f2..4df283272e9937e0b3704ab5d31299dc1d9dbbed 100644
--- a/lib/internal/Magento/Framework/Session/SessionManager.php
+++ b/lib/internal/Magento/Framework/Session/SessionManager.php
@@ -114,6 +114,9 @@ class SessionManager implements SessionManagerInterface
         $this->saveHandler = $saveHandler;
         $this->validator = $validator;
         $this->storage = $storage;
+
+        // Enable session.use_only_cookies
+        ini_set('session.use_only_cookies', '1');
     }
 
     /**
@@ -436,15 +439,14 @@ class SessionManager implements SessionManagerInterface
     /**
      * Renew session id and update session cookie
      *
-     * @param bool $deleteOldSession
      * @return $this
      */
-    public function regenerateId($deleteOldSession = true)
+    public function regenerateId()
     {
         if (headers_sent()) {
             return $this;
         }
-        session_regenerate_id($deleteOldSession);
+        session_regenerate_id(true);
 
         if ($this->sessionConfig->getUseCookies()) {
             $this->clearSubDomainSessionCookie();
diff --git a/lib/internal/Magento/Framework/Session/SessionManagerInterface.php b/lib/internal/Magento/Framework/Session/SessionManagerInterface.php
index 364e2a48dbb4d9d9b9eedd26462363f646998bdd..5a54bf8e8a65f0737e45033a6a1ebfbd127b301e 100644
--- a/lib/internal/Magento/Framework/Session/SessionManagerInterface.php
+++ b/lib/internal/Magento/Framework/Session/SessionManagerInterface.php
@@ -126,10 +126,9 @@ interface SessionManagerInterface
     /**
      * Renew session id and update session cookie
      *
-     * @param bool $deleteOldSession
      * @return SessionManagerInterface
      */
-    public function regenerateId($deleteOldSession = true);
+    public function regenerateId();
 
     /**
      * Expire the session cookie
diff --git a/lib/internal/Magento/Framework/Stdlib/Cookie/CookieMetadata.php b/lib/internal/Magento/Framework/Stdlib/Cookie/CookieMetadata.php
new file mode 100644
index 0000000000000000000000000000000000000000..ad73a649e29dffc5db58fb877f44fd462d8158a8
--- /dev/null
+++ b/lib/internal/Magento/Framework/Stdlib/Cookie/CookieMetadata.php
@@ -0,0 +1,137 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\Stdlib\Cookie;
+
+/**
+ * Class CookieMetadata
+ *
+ */
+class CookieMetadata
+{
+    /**#@+
+     * Constant for metadata value key.
+     */
+    const KEY_DOMAIN = 'domain';
+    const KEY_PATH = 'path';
+    /**#@-*/
+    
+    /**
+     * Store the metadata in array format to distinguish between null values and no value set.
+     *
+     * @var array
+     */
+    private $metadata;
+
+    /**
+     * @param array $metadata
+     */
+    public function __construct($metadata = [])
+    {
+        if (!is_array($metadata)) {
+            $metadata = [];
+        }
+        $this->metadata = $metadata;
+    }
+
+    /**
+     * Returns an array representation of this metadata.
+     *
+     * If a value has not yet been set then the key will not show up in the array.
+     *
+     * @return array
+     */
+    public function __toArray()
+    {
+        return $this->metadata;
+    }
+
+    /**
+     * Set the domain for the cookie
+     *
+     * @param string $domain
+     * @return $this
+     */
+    public function setDomain($domain)
+    {
+        return $this->set(self::KEY_DOMAIN, $domain);
+    }
+
+    /**
+     * Get the domain for the cookie
+     *
+     * @return string|null
+     */
+    public function getDomain()
+    {
+        return $this->get(self::KEY_DOMAIN);
+    }
+
+    /**
+     * Set path of the cookie
+     *
+     * @param string $path
+     * @return $this
+     */
+    public function setPath($path)
+    {
+        return $this->set(self::KEY_PATH, $path);
+    }
+
+    /**
+     * Get the path of the cookie
+     *
+     * @return string|null
+     */
+    public function getPath()
+    {
+        return $this->get(self::KEY_PATH);
+    }
+
+    /**
+     * Get a value from the metadata storage.
+     *
+     * @param string $name
+     * @return int|float|string|bool|null
+     */
+    protected function get($name)
+    {
+        if (isset($this->metadata[$name])) {
+            return $this->metadata[$name];
+        }
+        return null;
+    }
+
+    /**
+     * Set a value to the metadata storage.
+     *
+     * @param string $name
+     * @param int|float|string|bool|null $value
+     * @return $this
+     */
+    protected function set($name, $value)
+    {
+        $this->metadata[$name] = $value;
+        return $this;
+    }
+}
diff --git a/lib/internal/Magento/Framework/Stdlib/Cookie/CookieMetadataFactory.php b/lib/internal/Magento/Framework/Stdlib/Cookie/CookieMetadataFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..f41a5fdf5f2432b8adfbf391884848eee86904aa
--- /dev/null
+++ b/lib/internal/Magento/Framework/Stdlib/Cookie/CookieMetadataFactory.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\Framework\Stdlib\Cookie;
+
+use Magento\Framework\ObjectManager;
+
+/**
+ * CookieMetadataFactory is used to construct SensitiveCookieMetadata and PublicCookieMetadata objects.
+ */
+class CookieMetadataFactory
+{
+    /**
+     * @var ObjectManager
+     */
+    private $objectManager;
+
+    /**
+     * @param ObjectManager $objectManager
+     */
+    public function __construct(ObjectManager $objectManager)
+    {
+        $this->objectManager = $objectManager;
+    }
+
+    /**
+     * Creates a SensitiveCookieMetadata object with the supplied metadata.
+     *
+     * @param array $metadata
+     * @return SensitiveCookieMetadata
+     */
+    public function createSensitiveCookieMetadata($metadata = [])
+    {
+        return $this->objectManager->create(
+            'Magento\Framework\Stdlib\Cookie\SensitiveCookieMetadata',
+            ['metadata' => $metadata]
+        );
+    }
+
+    /**
+     * Creates a PublicCookieMetadata object with the supplied metadata.
+     *
+     * @param array $metadata
+     * @return PublicCookieMetadata
+     */
+    public function createPublicCookieMetadata($metadata = [])
+    {
+        return $this->objectManager->create(
+            'Magento\Framework\Stdlib\Cookie\PublicCookieMetadata',
+            ['metadata' => $metadata]
+        );
+    }
+
+    /**
+     * Creates CookieMetadata object with the supplied metadata.
+     *
+     * @param array $metadata
+     * @return CookieMetadata
+     */
+    public function createCookieMetadata($metadata)
+    {
+        return $this->objectManager->create(
+            'Magento\Framework\Stdlib\Cookie\CookieMetadata',
+            ['metadata' => $metadata]
+        );
+    }
+}
diff --git a/lib/internal/Magento/Framework/Stdlib/Cookie/CookieScope.php b/lib/internal/Magento/Framework/Stdlib/Cookie/CookieScope.php
new file mode 100644
index 0000000000000000000000000000000000000000..34640b77f077cf3b6d09290c54677fa621810540
--- /dev/null
+++ b/lib/internal/Magento/Framework/Stdlib/Cookie/CookieScope.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)
+ */
+
+namespace Magento\Framework\Stdlib\Cookie;
+
+/**
+ * CookieScope is used to store default scope metadata.
+ */
+class CookieScope
+{
+    /**
+     * @var SensitiveCookieMetadata
+     */
+    private $sensitiveCookieMetadata;
+
+    /**
+     * @var PublicCookieMetadata
+     */
+    private $publicCookieMetadata;
+
+    /**
+     * @var CookieMetadata
+     */
+    private $cookieMetadata;
+
+    /**
+     * @var CookieMetadataFactory
+     */
+    private $cookieMetadataFactory;
+
+
+    /**
+     * @param CookieMetadataFactory $cookieMetadataFactory
+     * @param SensitiveCookieMetadata $sensitiveCookieMetadata
+     * @param PublicCookieMetadata $publicCookieMetadata
+     * @param CookieMetadata $deleteCookieMetadata
+     */
+    public function __construct(
+        CookieMetadataFactory $cookieMetadataFactory,
+        SensitiveCookieMetadata $sensitiveCookieMetadata = null,
+        PublicCookieMetadata $publicCookieMetadata = null,
+        CookieMetadata $deleteCookieMetadata = null
+    ) {
+        $this->cookieMetadataFactory = $cookieMetadataFactory;
+        $this->sensitiveCookieMetadata = $sensitiveCookieMetadata;
+        $this->publicCookieMetadata = $publicCookieMetadata;
+        $this->cookieMetadata = $deleteCookieMetadata;
+    }
+
+    /**
+     * Merges the input override metadata with any defaults set on this Scope, and then returns a CookieMetadata
+     * object representing the merged values.
+     *
+     * @param SensitiveCookieMetadata|null $override
+     * @return SensitiveCookieMetadata
+     */
+    public function getSensitiveCookieMetadata(SensitiveCookieMetadata $override = null)
+    {
+        if (!is_null($this->sensitiveCookieMetadata)) {
+            $merged = $this->sensitiveCookieMetadata->__toArray();
+        } else {
+            $merged = [];
+        }
+        if (!is_null($override)) {
+            $merged = array_merge($merged, $override->__toArray());
+        }
+
+        return $this->cookieMetadataFactory->createSensitiveCookieMetadata($merged);
+    }
+
+    /**
+     * Merges the input override metadata with any defaults set on this Scope, and then returns a CookieMetadata
+     * object representing the merged values.
+     *
+     * @param PublicCookieMetadata|null $override
+     * @return PublicCookieMetadata
+     */
+    public function getPublicCookieMetadata(PublicCookieMetadata $override = null)
+    {
+        if (!is_null($this->publicCookieMetadata)) {
+            $merged = $this->publicCookieMetadata->__toArray();
+        } else {
+            $merged = [];
+        }
+        if (!is_null($override)) {
+            $merged = array_merge($merged, $override->__toArray());
+        }
+
+        return $this->cookieMetadataFactory->createPublicCookieMetadata($merged);
+    }
+
+    /**
+     * Merges the input override metadata with any defaults set on this Scope, and then returns a CookieMetadata
+     * object representing the merged values.
+     *
+     * @param CookieMetadata|null $override
+     * @return CookieMetadata
+     */
+    public function getCookieMetadata(CookieMetadata $override = null)
+    {
+        if (!is_null($this->cookieMetadata)) {
+            $merged = $this->cookieMetadata->__toArray();
+        } else {
+            $merged = [];
+        }
+        if (!is_null($override)) {
+            $merged = array_merge($merged, $override->__toArray());
+        }
+
+        return $this->cookieMetadataFactory->createCookieMetadata($merged);
+    }
+}
diff --git a/lib/internal/Magento/Framework/Stdlib/Cookie/CookieSizeLimitReachedException.php b/lib/internal/Magento/Framework/Stdlib/Cookie/CookieSizeLimitReachedException.php
new file mode 100644
index 0000000000000000000000000000000000000000..52150f51ceb4260387d1224c4d33971003bfe567
--- /dev/null
+++ b/lib/internal/Magento/Framework/Stdlib/Cookie/CookieSizeLimitReachedException.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\Framework\Stdlib\Cookie;
+
+use Magento\Framework\Exception\LocalizedException;
+
+/**
+ * CookieSizeLimitReachedException is thrown when detecting that a browser limit, or potential browser limit has been
+ * reached regarding cookie limits.
+ *
+ * Limits can include the amount of data stored in an individual cookie as well as the number of cookies
+ * set for the domain.
+ */
+class CookieSizeLimitReachedException extends LocalizedException
+{
+
+}
diff --git a/lib/internal/Magento/Framework/Stdlib/Cookie/FailureToSendException.php b/lib/internal/Magento/Framework/Stdlib/Cookie/FailureToSendException.php
new file mode 100644
index 0000000000000000000000000000000000000000..a70f38b339947748482485477d8be3736d4ef1ab
--- /dev/null
+++ b/lib/internal/Magento/Framework/Stdlib/Cookie/FailureToSendException.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\Stdlib\Cookie;
+
+use Magento\Framework\Exception\LocalizedException;
+
+/**
+ * FailureToSendException is thrown when trying to set a cookie but the response has already been sent, making it
+ * impossible to send any cookie information back to the client.
+ */
+class FailureToSendException extends LocalizedException
+{
+
+}
diff --git a/lib/internal/Magento/Framework/Stdlib/Cookie/PhpCookieManager.php b/lib/internal/Magento/Framework/Stdlib/Cookie/PhpCookieManager.php
new file mode 100644
index 0000000000000000000000000000000000000000..dc5729ccc25ec9a7b0337fd06c06b014660ef888
--- /dev/null
+++ b/lib/internal/Magento/Framework/Stdlib/Cookie/PhpCookieManager.php
@@ -0,0 +1,288 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\Stdlib\Cookie;
+
+use Magento\Framework\Exception\InputException;
+use Magento\Framework\Stdlib\CookieManager as CookieManager;
+
+/**
+ * CookieManager helps manage the setting, retrieving and deleting of cookies.
+ *
+ * To aid in security, the cookie manager will make it possible for the application to indicate if the cookie contains
+ * sensitive data so that extra protection can be added to the contents of the cookie as well as how the browser
+ * stores the cookie.
+ */
+class PhpCookieManager implements CookieManager
+{
+    /**#@+
+     * Constants for Cookie manager.
+     * RFC 2109 - Page 15
+     * http://www.ietf.org/rfc/rfc2109.txt
+     */
+    const MAX_NUM_COOKIES = 20;
+    const MAX_COOKIE_SIZE = 4096;
+    const EXPIRE_NOW_TIME = 1;
+    const EXPIRE_AT_END_OF_SESSION_TIME = 0;
+    /**#@-*/
+
+
+    /**#@+
+     * Constant for metadata array key
+     */
+    const KEY_EXPIRE_TIME = 'expiry';
+    /**#@-*/
+
+
+    /**
+     * @var CookieScope
+     */
+    private $scope;
+
+    /**
+     * @param CookieScope $scope
+     */
+    public function __construct(CookieScope $scope)
+    {
+        $this->scope = $scope;
+    }
+
+    /**
+     * Set a value in a private cookie with the given $name $value pairing.
+     *
+     * Sensitive cookies cannot be accessed by JS. HttpOnly will always be set to true for these cookies.
+     *
+     * @param string $name
+     * @param string $value
+     * @param SensitiveCookieMetadata $metadata
+     * @return void
+     * @throws FailureToSendException Cookie couldn't be sent to the browser.  If this exception isn't thrown,
+     * there is still no guarantee that the browser received and accepted the cookie.
+     * @throws CookieSizeLimitReachedException Thrown when the cookie is too big to store any additional data.
+     * @throws InputException If the cookie name is empty or contains invalid characters.
+     */
+    public function setSensitiveCookie($name, $value, SensitiveCookieMetadata $metadata = null)
+    {
+        $metadataArray = $this->scope->getSensitiveCookieMetadata($metadata)->__toArray();
+        $metadataArray[PublicCookieMetadata::KEY_SECURE] = true;
+        $metadataArray[PublicCookieMetadata::KEY_HTTP_ONLY] = true;
+
+        $this->setCookie($name, $value, $metadataArray);
+    }
+
+    /**
+     * Set a value in a public cookie with the given $name $value pairing.
+     *
+     * Public cookies can be accessed by JS. HttpOnly will be set to false by default for these cookies,
+     * but can be changed to true.
+     *
+     * @param string $name
+     * @param string $value
+     * @param PublicCookieMetadata $metadata
+     * @return void
+     * @throws FailureToSendException If cookie couldn't be sent to the browser.
+     * @throws CookieSizeLimitReachedException Thrown when the cookie is too big to store any additional data.
+     * @throws InputException If the cookie name is empty or contains invalid characters.
+     */
+    public function setPublicCookie($name, $value, PublicCookieMetadata $metadata = null)
+    {
+        $metadataArray = $this->scope->getPublicCookieMetadata($metadata)->__toArray();
+        $this->setCookie($name, $value, $metadataArray);
+    }
+
+    /**
+     * Set a value in a cookie with the given $name $value pairing.
+     *
+     * @param string $name
+     * @param string $value
+     * @param array $metadataArray
+     * @return void
+     * @throws FailureToSendException If cookie couldn't be sent to the browser.
+     * @throws CookieSizeLimitReachedException Thrown when the cookie is too big to store any additional data.
+     * @throws InputException If the cookie name is empty or contains invalid characters.
+     */
+    private function setCookie($name, $value, array $metadataArray)
+    {
+        $expire = $this->computeExpirationTime($metadataArray);
+
+        $this->checkAbilityToSendCookie($name, $value);
+
+        $phpSetcookieSuccess = setcookie(
+            $name,
+            $value,
+            $expire,
+            $this->extractValue(CookieMetadata::KEY_PATH, $metadataArray, ''),
+            $this->extractValue(CookieMetadata::KEY_DOMAIN, $metadataArray, ''),
+            $this->extractValue(PublicCookieMetadata::KEY_SECURE, $metadataArray, false),
+            $this->extractValue(PublicCookieMetadata::KEY_HTTP_ONLY, $metadataArray, false)
+        );
+
+        if (!$phpSetcookieSuccess) {
+
+            $params['name'] = $name;
+            if ($value == '') {
+                throw new FailureToSendException('Unable to delete the cookie with cookieName = %name', $params);
+            } else {
+                throw new FailureToSendException('Unable to send the cookie with cookieName = %name', $params);
+            }
+        }
+    }
+
+    /**
+     * Retrieve the size of a cookie.
+     * The size of a cookie is determined by the length of 'name=value' portion of the cookie.
+     *
+     * @param string $name
+     * @param string $value
+     * @return int
+     */
+    private function sizeOfCookie($name, $value)
+    {
+        // The constant '1' is the length of the equal sign in 'name=value'.
+        return strlen($name) + 1 + strlen($value);
+    }
+
+    /**
+     * Determines whether or not it is possible to send the cookie, based on the number of cookies that already
+     * exist and the size of the cookie.
+     *
+     * @param string $name
+     * @param string|null $value
+     * @return void if it is possible to send the cookie
+     * @throws CookieSizeLimitReachedException Thrown when the cookie is too big to store any additional data.
+     * @throws InputException If the cookie name is empty or contains invalid characters.
+     */
+    private function checkAbilityToSendCookie($name, $value)
+    {
+        if ($name == '' || preg_match("/[=,; \t\r\n\013\014]/", $name)) {
+            throw new InputException(
+                'Cookie name cannot be empty and cannot contain these characters: =,; \\t\\r\\n\\013\\014'
+            );
+        }
+
+        $numCookies = count($_COOKIE);
+
+        if (!isset($_COOKIE[$name])) {
+            $numCookies++;
+        }
+
+        $sizeOfCookie = $this->sizeOfCookie($name, $value);
+
+        if ($numCookies > PhpCookieManager::MAX_NUM_COOKIES) {
+            throw new CookieSizeLimitReachedException(
+                'Unable to send the cookie. Maximum number of cookies would be exceeded.'
+            );
+        }
+
+        if ($sizeOfCookie > PhpCookieManager::MAX_COOKIE_SIZE) {
+            throw new CookieSizeLimitReachedException(
+                "Unable to send the cookie. Size of '%name' is %size bytes.",
+                [
+                    'name' => $name,
+                    'size' => $sizeOfCookie,
+                ]
+            );
+        }
+    }
+
+    /**
+     * Determines the expiration time of a cookie.
+     *
+     * @param array $metadataArray
+     * @return int in seconds since the Unix epoch.
+     */
+    private function computeExpirationTime(array $metadataArray)
+    {
+        if (isset($metadataArray[PhpCookieManager::KEY_EXPIRE_TIME])
+            && $metadataArray[PhpCookieManager::KEY_EXPIRE_TIME] < time()
+        ) {
+            $expireTime = $metadataArray[PhpCookieManager::KEY_EXPIRE_TIME];
+        } else {
+            if (isset($metadataArray[PublicCookieMetadata::KEY_DURATION])) {
+                $expireTime = $metadataArray[PublicCookieMetadata::KEY_DURATION] + time();
+            } else {
+                $expireTime = PhpCookieManager::EXPIRE_AT_END_OF_SESSION_TIME;
+            }
+        }
+
+        return $expireTime;
+    }
+
+    /**
+     * Determines the value to be used as a $parameter.
+     * If $metadataArray[$parameter] is not set, returns the $defaultValue.
+     *
+     * @param string $parameter
+     * @param array $metadataArray
+     * @param string|boolean|int|null $defaultValue
+     * @return string|boolean|int|null
+     */
+    private function extractValue($parameter, array $metadataArray, $defaultValue)
+    {
+        if (array_key_exists($parameter, $metadataArray)) {
+            return $metadataArray[$parameter];
+        } else {
+            return $defaultValue;
+        }
+    }
+
+    /**
+     * Retrieve a value from a cookie.
+     *
+     * @param string $name
+     * @param string|null $default The default value to return if no value could be found for the given $name.
+     * @return string|null
+     */
+    public function getCookie($name, $default = null)
+    {
+        return (isset($_COOKIE[$name])) ? $_COOKIE[$name] : $default;
+    }
+
+    /**
+     * Deletes a cookie with the given name.
+     *
+     * @param string $name
+     * @param CookieMetadata $metadata
+     * @return void
+     * @throws FailureToSendException If cookie couldn't be sent to the browser.
+     *     If this exception isn't thrown, there is still no guarantee that the browser
+     *     received and accepted the request to delete this cookie.
+     * @throws InputException If the cookie name is empty or contains invalid characters.
+     */
+    public function deleteCookie($name, CookieMetadata $metadata = null)
+    {
+        // Remove the cookie
+        unset($_COOKIE[$name]);
+
+        $metadataArray = $this->scope->getCookieMetadata($metadata)->__toArray();
+
+        // explicitly set an expiration time in the metadataArray.
+        $metadataArray[PhpCookieManager::KEY_EXPIRE_TIME] = PhpCookieManager::EXPIRE_NOW_TIME;
+
+        $this->checkAbilityToSendCookie($name, '');
+
+        // cookie value set to empty string to delete from the remote client
+        $this->setCookie($name, '', $metadataArray);
+    }
+}
diff --git a/lib/internal/Magento/Framework/Stdlib/Cookie/PublicCookieMetadata.php b/lib/internal/Magento/Framework/Stdlib/Cookie/PublicCookieMetadata.php
new file mode 100644
index 0000000000000000000000000000000000000000..ef6089a3f6bb5c5f04089aa4ab5bf2c8a968eba3
--- /dev/null
+++ b/lib/internal/Magento/Framework/Stdlib/Cookie/PublicCookieMetadata.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\Framework\Stdlib\Cookie;
+
+/**
+ * Class PublicCookieMetadata
+ *
+ */
+class PublicCookieMetadata extends CookieMetadata
+{
+    /**#@+
+     * Constant for metadata value key.
+     */
+    const KEY_SECURE = 'secure';
+    const KEY_HTTP_ONLY = 'http_only';
+    const KEY_DURATION = 'duration';
+    /**#@-*/
+
+    /**
+     * Set the number of seconds until the cookie expires
+     *
+     * The cookie duration can be translated into an expiration date at the time the cookie is sent.
+     *
+     * @param int $duration Time in seconds.
+     * @return $this
+     */
+    public function setDuration($duration)
+    {
+        return $this->set(self::KEY_DURATION, $duration);
+    }
+
+    /**
+     * Get the number of seconds until the cookie expires
+     *
+     * The cookie duration can be translated into an expiration date at the time the cookie is sent.
+     *
+     * @return int|null Time in seconds.
+     */
+    public function getDuration()
+    {
+        return $this->get(self::KEY_DURATION);
+    }
+
+    /**
+     * Set HTTPOnly flag
+     *
+     * @param bool $httpOnly
+     * @return $this
+     */
+    public function setHttpOnly($httpOnly)
+    {
+        return $this->set(self::KEY_HTTP_ONLY, $httpOnly);
+    }
+
+    /**
+     * Get HTTPOnly flag
+     *
+     * @return bool|null
+     */
+    public function getHttpOnly()
+    {
+        return $this->get(self::KEY_HTTP_ONLY);
+    }
+
+    /**
+     * Set whether the cookie is only available under HTTPS
+     *
+     * @param bool $secure
+     * @return $this
+     */
+    public function setSecure($secure)
+    {
+        return $this->set(self::KEY_SECURE, $secure);
+    }
+
+    /**
+     * Get whether the cookie is only available under HTTPS
+     *
+     * @return bool|null
+     */
+    public function getSecure()
+    {
+        return $this->get(self::KEY_SECURE);
+    }
+}
diff --git a/lib/internal/Magento/Framework/Stdlib/Cookie/SensitiveCookieMetadata.php b/lib/internal/Magento/Framework/Stdlib/Cookie/SensitiveCookieMetadata.php
new file mode 100644
index 0000000000000000000000000000000000000000..428c4f22b751ce3c291894711835db26ce0346fa
--- /dev/null
+++ b/lib/internal/Magento/Framework/Stdlib/Cookie/SensitiveCookieMetadata.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer 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\Framework\Stdlib\Cookie;
+
+/**
+ * Class SensitiveCookieMetadata
+ *
+ * The class has only methods extended from CookieMetadata
+ * as path and domain are only data to be exposed by SensitiveCookieMetadata
+ */
+class SensitiveCookieMetadata extends CookieMetadata
+{
+
+}
diff --git a/lib/internal/Magento/Framework/Stdlib/CookieManager.php b/lib/internal/Magento/Framework/Stdlib/CookieManager.php
new file mode 100644
index 0000000000000000000000000000000000000000..a54c34b3157c39a4ff3ba80bc4dcca16bb6347d4
--- /dev/null
+++ b/lib/internal/Magento/Framework/Stdlib/CookieManager.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\Framework\Stdlib;
+
+use Magento\Framework\Stdlib\Cookie\PublicCookieMetadata;
+use Magento\Framework\Stdlib\Cookie\SensitiveCookieMetadata;
+use Magento\Framework\Stdlib\Cookie\FailureToSendException;
+use Magento\Framework\Stdlib\Cookie\CookieSizeLimitReachedException;
+use Magento\Framework\Stdlib\Cookie\CookieMetadata;
+use Magento\Framework\Exception\InputException;
+
+/**
+ * CookieManager helps manage the setting, retrieving and deleting of cookies.
+ *
+ * The cookie manager will make it possible for an application to indicate if a cookie contains sensitive data,
+ * this will allow extra protection to be added to the contents of the cookie as well sending directives to the browser
+ * about how the cookie should be stored and whether JavaScript can access the cookie.
+ */
+interface CookieManager
+{
+    /**
+     * Set a value in a private cookie with the given $name $value pairing.
+     *
+     * Sensitive cookies cannot be accessed by JS. HttpOnly will always be set to true for these cookies.
+     *
+     * @param string $name
+     * @param string $value
+     * @param SensitiveCookieMetadata $metadata
+     * @return void
+     * @throws FailureToSendException Cookie couldn't be sent to the browser.  If this exception isn't thrown,
+     * there is still no guarantee that the browser received and accepted the cookie.
+     * @throws CookieSizeLimitReachedException Thrown when the cookie is too big to store any additional data.
+     * @throws InputException If the cookie name is empty or contains invalid characters.
+     */
+    public function setSensitiveCookie($name, $value, SensitiveCookieMetadata $metadata = null);
+
+    /**
+     * Set a value in a public cookie with the given $name $value pairing.
+     *
+     * Public cookies can be accessed by JS. HttpOnly will be set to false by default for these cookies,
+     * but can be changed to true.
+     *
+     * @param string $name
+     * @param string $value
+     * @param PublicCookieMetadata $metadata
+     * @return void
+     * @throws FailureToSendException If cookie couldn't be sent to the browser.
+     * @throws CookieSizeLimitReachedException Thrown when the cookie is too big to store any additional data.
+     * @throws InputException If the cookie name is empty or contains invalid characters.
+     */
+    public function setPublicCookie($name, $value, PublicCookieMetadata $metadata = null);
+
+    /**
+     * Retrieve a value from a cookie.
+     *
+     * @param string $name
+     * @param string|null $default The default value to return if no value could be found for the given $name.
+     * @return string|null
+     */
+    public function getCookie($name, $default = null);
+
+
+    /**
+     * Deletes a cookie with the given name.
+     *
+     * @param string $name
+     * @param CookieMetadata $metadata
+     * @return void
+     * @throws FailureToSendException If cookie couldn't be sent to the browser.
+     *     If this exception isn't thrown, there is still no guarantee that the browser
+     *     received and accepted the request to delete this cookie.
+     * @throws InputException If the cookie name is empty or contains invalid characters.
+     */
+    public function deleteCookie($name, CookieMetadata $metadata = null);
+}
diff --git a/lib/internal/Magento/Framework/Validator/ValidatorException.php b/lib/internal/Magento/Framework/Validator/ValidatorException.php
index 4434a3a95804a4786a8cac5cbf977ed854c21348..da61cd65ab36a4ff34fa76d5c5de85565b80134e 100644
--- a/lib/internal/Magento/Framework/Validator/ValidatorException.php
+++ b/lib/internal/Magento/Framework/Validator/ValidatorException.php
@@ -25,7 +25,7 @@
  */
 namespace Magento\Framework\Validator;
 
-class ValidatorException extends \Exception
+class ValidatorException extends \Magento\Framework\Exception\InputException
 {
     /**
      * @var array
@@ -35,23 +35,32 @@ class ValidatorException extends \Exception
     /**
      * Constructor
      *
+     * @param string $message
+     * @param [] $params
+     * @param \Exception $cause
      * @param array $messages Validation error messages
      */
-    public function __construct(array $messages = array())
-    {
-        $this->_messages = $messages;
-
-        $message = '';
-        foreach ($this->_messages as $propertyMessages) {
-            foreach ($propertyMessages as $propertyMessage) {
-                if ($message) {
-                    $message .= PHP_EOL;
+    public function __construct(
+        $message = self::DEFAULT_MESSAGE,
+        $params = [],
+        \Exception $cause = null,
+        array $messages = array()
+    ) {
+        if (!empty($messages)) {
+            $this->_messages = $messages;
+            $message = '';
+            foreach ($this->_messages as $propertyMessages) {
+                foreach ($propertyMessages as $propertyMessage) {
+                    if ($message) {
+                        $message .= PHP_EOL;
+                    }
+                    $message .= $propertyMessage;
                 }
-                $message .= $propertyMessage;
             }
+        } else {
+            $this->_messages = [$message];
         }
-
-        parent::__construct($message);
+        parent::__construct($message, $params, $cause);
     }
 
     /**
diff --git a/lib/internal/Magento/Framework/View/Element/AbstractBlock.php b/lib/internal/Magento/Framework/View/Element/AbstractBlock.php
index 0098ebe4b1535ebb144f9dd1b18b893869bb1812..6ad49625459841d131a8c6ecf2bb983ad4c90bf4 100644
--- a/lib/internal/Magento/Framework/View/Element/AbstractBlock.php
+++ b/lib/internal/Magento/Framework/View/Element/AbstractBlock.php
@@ -686,11 +686,16 @@ abstract class AbstractBlock extends \Magento\Framework\Object implements BlockI
      * link/input/container/anything else in template among others.
      * Function takes an arbitrary amount of parameters.
      *
+     * @param string|null $arg1
+     * @param string|null $arg2
+     * @param string|null $arg3
+     * @param string|null $arg4
+     * @param string|null $arg5
      * @return string
      */
-    public function getUiId()
+    public function getUiId($arg1 = null, $arg2 = null, $arg3 = null, $arg4 = null, $arg5 = null)
     {
-        return ' data-ui-id="' . call_user_func_array(array($this, 'getJsId'), func_get_args()) . '" ';
+        return ' data-ui-id="' . $this->getJsId($arg1, $arg2, $arg3, $arg4, $arg5) . '" ';
     }
 
     /**
@@ -698,11 +703,32 @@ abstract class AbstractBlock extends \Magento\Framework\Object implements BlockI
      *
      * Function takes an arbitrary amount of parameters
      *
+     * @param string|null $arg1
+     * @param string|null $arg2
+     * @param string|null $arg3
+     * @param string|null $arg4
+     * @param string|null $arg5
      * @return string
      */
-    public function getJsId()
+    public function getJsId($arg1 = null, $arg2 = null, $arg3 = null, $arg4 = null, $arg5 = null)
     {
-        $rawId = $this->_nameInLayout . '-' . implode('-', func_get_args());
+        $args = [];
+        if (!is_null($arg1)) {
+            $args[] = $arg1;
+        }
+        if (!is_null($arg2)) {
+            $args[] = $arg2;
+        }
+        if (!is_null($arg3)) {
+            $args[] = $arg3;
+        }
+        if (!is_null($arg4)) {
+            $args[] = $arg4;
+        }
+        if (!is_null($arg5)) {
+            $args[] = $arg5;
+        }
+        $rawId = $this->_nameInLayout . '-' . implode('-', $args);
         return trim(preg_replace('/[^a-z0-9]+/', '-', strtolower($rawId)), '-');
     }
 
diff --git a/lib/internal/Magento/Framework/composer.json b/lib/internal/Magento/Framework/composer.json
index 9a4f149393c25d233d6e25a4f4df75ce0af5cc64..56b95e3a75371b38603e463edeaa6557b8fad63a 100644
--- a/lib/internal/Magento/Framework/composer.json
+++ b/lib/internal/Magento/Framework/composer.json
@@ -2,9 +2,9 @@
     "name": "magento/framework",
     "description": "N/A",
     "type": "magento2-library",
-    "version": "0.1.0-alpha89",
+    "version": "0.1.0-alpha90",
     "require": {
-        "php": "5.4.*|5.5.*",
+        "php": "~5.4.11|~5.5.0",
         "ext-spl": "*",
         "ext-dom": "*",
         "ext-simplexml": "*",
@@ -13,8 +13,7 @@
         "ext-curl": "*",
         "ext-iconv": "*",
         "ext-gd": "*",
-        "lib-libxml": "*",
-        "magento/magento-composer-installer": "*"
+        "lib-libxml": "*"
     },
     "suggest": {
         "ext-imagick": "Use Image Magick >=3.0.0 as an optional alternative image processing library"
diff --git a/lib/internal/Zend/Code/Generator/DocBlockGenerator.php b/lib/internal/Zend/Code/Generator/DocBlockGenerator.php
index 1473581b7c6ffab802b5d144ca902d099dafecb9..0b506e11e267aac2a23c135149e07bcc1731ff54 100644
--- a/lib/internal/Zend/Code/Generator/DocBlockGenerator.php
+++ b/lib/internal/Zend/Code/Generator/DocBlockGenerator.php
@@ -69,8 +69,8 @@ class DocBlockGenerator extends AbstractGenerator
         if ($longDescription !== null) {
             $this->setLongDescription($longDescription);
         }
-        if (is_array($tags) && $tags) {
-            $this->setTags($tags);
+        if ($this->tags !== array()) {
+            $this->setTag($tags);
         }
 
     }
diff --git a/lib/internal/Zend/Escaper/composer.json b/lib/internal/Zend/Escaper/composer.json
index 7df2296c42d37b843961283a572d85f9ab802a16..4aff32b67634fa01d3e71a50a7efbde5705b8b84 100644
--- a/lib/internal/Zend/Escaper/composer.json
+++ b/lib/internal/Zend/Escaper/composer.json
@@ -8,7 +8,7 @@
     ],
     "autoload": {
         "psr-0": {
-            "Zend\\Escaper": ""
+            "Zend\\Escaper\\": ""
         }
     },
     "target-dir": "Zend/Escaper",
diff --git a/lib/internal/Zend/I18n/Exception/ExceptionInterface.php b/lib/internal/Zend/I18n/Exception/ExceptionInterface.php
index a13a9c0a1337715567b835f97eea0b41db309289..c14266bb0b3554fcbd2059769e362f1d712c9bae 100644
--- a/lib/internal/Zend/I18n/Exception/ExceptionInterface.php
+++ b/lib/internal/Zend/I18n/Exception/ExceptionInterface.php
@@ -13,7 +13,7 @@ namespace Zend\I18n\Exception;
 /**
  * @category   Zend
  * @package    Zend_I18n
- * @subpackage Translator
+ * @subpackage Exception
  */
 interface ExceptionInterface
 {}
diff --git a/lib/internal/Zend/I18n/Exception/InvalidArgumentException.php b/lib/internal/Zend/I18n/Exception/InvalidArgumentException.php
index bdbdf667d951f37098451224faabaae3a96ca491..4389791c0063683f8608fee64a9390091d783a31 100644
--- a/lib/internal/Zend/I18n/Exception/InvalidArgumentException.php
+++ b/lib/internal/Zend/I18n/Exception/InvalidArgumentException.php
@@ -13,7 +13,7 @@ namespace Zend\I18n\Exception;
 /**
  * @category   Zend
  * @package    Zend_I18n
- * @subpackage Translator
+ * @subpackage Exception
  */
 class InvalidArgumentException extends \InvalidArgumentException implements
     ExceptionInterface
diff --git a/lib/internal/Zend/I18n/Exception/OutOfBoundsException.php b/lib/internal/Zend/I18n/Exception/OutOfBoundsException.php
index 8122fc97b6c9bfae3336c0f30974f477cf42b704..53ab98ef1c2fb8d1e87461b34b9cc12c87e5c732 100644
--- a/lib/internal/Zend/I18n/Exception/OutOfBoundsException.php
+++ b/lib/internal/Zend/I18n/Exception/OutOfBoundsException.php
@@ -13,7 +13,7 @@ namespace Zend\I18n\Exception;
 /**
  * @category   Zend
  * @package    Zend_I18n
- * @subpackage Translator
+ * @subpackage Exception
  */
 class OutOfBoundsException extends \OutOfBoundsException implements
     ExceptionInterface
diff --git a/lib/internal/Zend/I18n/Exception/ParseException.php b/lib/internal/Zend/I18n/Exception/ParseException.php
index 73857be73469a8713bec145c725e91d6e594c7bc..e0fa82a00743c55f9b7a521251a2e774ba4ead9a 100644
--- a/lib/internal/Zend/I18n/Exception/ParseException.php
+++ b/lib/internal/Zend/I18n/Exception/ParseException.php
@@ -13,7 +13,7 @@ namespace Zend\I18n\Exception;
 /**
  * @category   Zend
  * @package    Zend_I18n
- * @subpackage Translator
+ * @subpackage Exception
  */
 class ParseException extends RuntimeException implements ExceptionInterface
 {}
diff --git a/lib/internal/Zend/I18n/Exception/RangeException.php b/lib/internal/Zend/I18n/Exception/RangeException.php
index a534c9721879a815969dfc5120645a325418e583..7d99da01c643a376fa4dbbde3681bb5a46a54e71 100644
--- a/lib/internal/Zend/I18n/Exception/RangeException.php
+++ b/lib/internal/Zend/I18n/Exception/RangeException.php
@@ -13,7 +13,7 @@ namespace Zend\I18n\Exception;
 /**
  * @category   Zend
  * @package    Zend_I18n
- * @subpackage Translator
+ * @subpackage Exception
  */
 class RangeException extends \RangeException implements ExceptionInterface
 {}
diff --git a/lib/internal/Zend/I18n/Exception/RuntimeException.php b/lib/internal/Zend/I18n/Exception/RuntimeException.php
index 024d6e55297b575514d153e19b8b2f901e365cff..4bb5bca8e811272ce9430512177f8b8b8b4a69e4 100644
--- a/lib/internal/Zend/I18n/Exception/RuntimeException.php
+++ b/lib/internal/Zend/I18n/Exception/RuntimeException.php
@@ -13,7 +13,7 @@ namespace Zend\I18n\Exception;
 /**
  * @category   Zend
  * @package    Zend_I18n
- * @subpackage Translator
+ * @subpackage Exception
  */
 class RuntimeException extends \RuntimeException implements ExceptionInterface
 {}
diff --git a/lib/internal/Zend/I18n/Filter/AbstractLocale.php b/lib/internal/Zend/I18n/Filter/AbstractLocale.php
index e74dee77e216950367f44f112435ceee379f8124..7522546235dea1488dd5b84af67b1d47ab675bd4 100644
--- a/lib/internal/Zend/I18n/Filter/AbstractLocale.php
+++ b/lib/internal/Zend/I18n/Filter/AbstractLocale.php
@@ -15,7 +15,8 @@ use Zend\Filter\AbstractFilter;
 
 /**
  * @category   Zend
- * @package    Zend_Filter
+ * @package    Zend_I18n
+ * @subpackage Filter
  */
 abstract class AbstractLocale extends AbstractFilter
 {
diff --git a/lib/internal/Zend/I18n/Filter/Alnum.php b/lib/internal/Zend/I18n/Filter/Alnum.php
index 305e767d6ce0f6bd63c07e428f631ff09be50509..6ec000037b3721507b9b60a03a567f6d1f0fc695 100644
--- a/lib/internal/Zend/I18n/Filter/Alnum.php
+++ b/lib/internal/Zend/I18n/Filter/Alnum.php
@@ -12,11 +12,11 @@ namespace Zend\I18n\Filter;
 
 use Locale;
 use Traversable;
-use Zend\Stdlib\ArrayUtils;
 
 /**
  * @category   Zend
- * @package    Zend_Filter
+ * @package    Zend_I18n
+ * @subpackage Filter
  */
 class Alnum extends AbstractLocale
 {
diff --git a/lib/internal/Zend/I18n/Filter/Alpha.php b/lib/internal/Zend/I18n/Filter/Alpha.php
index 8c619305acbcac2376801bcca5f183614894f3d5..d8929020ffbaf540f671092f3160b74c370e5c1c 100644
--- a/lib/internal/Zend/I18n/Filter/Alpha.php
+++ b/lib/internal/Zend/I18n/Filter/Alpha.php
@@ -14,7 +14,8 @@ use Locale;
 
 /**
  * @category   Zend
- * @package    Zend_Filter
+ * @package    Zend_I18n
+ * @subpackage Filter
  */
 class Alpha extends Alnum
 {
diff --git a/lib/internal/Zend/I18n/Filter/NumberFormat.php b/lib/internal/Zend/I18n/Filter/NumberFormat.php
index fc26ece31926eca1c9891b2b4a540c16c54e7b55..594e2159d87a7cf0633d7f8d9e343e51b5af6157 100644
--- a/lib/internal/Zend/I18n/Filter/NumberFormat.php
+++ b/lib/internal/Zend/I18n/Filter/NumberFormat.php
@@ -15,6 +15,11 @@ use Traversable;
 use Zend\I18n\Exception;
 use Zend\Stdlib\ErrorHandler;
 
+/**
+ * @category   Zend
+ * @package    Zend_I18n
+ * @subpackage Filter
+ */
 class NumberFormat extends AbstractLocale
 {
     protected $options = array(
diff --git a/lib/internal/Zend/I18n/Translator/TranslatorServiceFactory.php b/lib/internal/Zend/I18n/Translator/TranslatorServiceFactory.php
index b2cd93a092ecb29c610c49455ebde6e1522b552f..a6395e745eb3f144af9c6ff789b09f548589372c 100644
--- a/lib/internal/Zend/I18n/Translator/TranslatorServiceFactory.php
+++ b/lib/internal/Zend/I18n/Translator/TranslatorServiceFactory.php
@@ -25,7 +25,7 @@ class TranslatorServiceFactory implements FactoryInterface
     public function createService(ServiceLocatorInterface $serviceLocator)
     {
         // Configure the translator
-        $config = $serviceLocator->get('Configuration');
+        $config = $serviceLocator->get('Config');
         $trConfig = isset($config['translator']) ? $config['translator'] : array();
         $translator = Translator::factory($trConfig);
         return $translator;
diff --git a/lib/internal/Zend/I18n/Validator/Alnum.php b/lib/internal/Zend/I18n/Validator/Alnum.php
index ad1dc3d1e1f0f8847336a32a13f84513c9124d72..1f08ab6ecdefcae4e32297c1616eb6cc5a28d186 100644
--- a/lib/internal/Zend/I18n/Validator/Alnum.php
+++ b/lib/internal/Zend/I18n/Validator/Alnum.php
@@ -15,7 +15,8 @@ use Zend\Validator\AbstractValidator;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_I18n
+ * @subpackage Validator
  */
 class Alnum extends AbstractValidator
 {
diff --git a/lib/internal/Zend/I18n/Validator/Alpha.php b/lib/internal/Zend/I18n/Validator/Alpha.php
index 4dfdd1395f12e366b4e174261b6a35e05beed4e3..53c96adf27bb62c24e55eed3e16b1a7267ac9e18 100644
--- a/lib/internal/Zend/I18n/Validator/Alpha.php
+++ b/lib/internal/Zend/I18n/Validator/Alpha.php
@@ -11,11 +11,11 @@
 namespace Zend\I18n\Validator;
 
 use Zend\I18n\Filter\Alpha as AlphaFilter;
-use Zend\Validator\AbstractValidator;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_I18n
+ * @subpackage Validator
  */
 class Alpha extends Alnum
 {
diff --git a/lib/internal/Zend/I18n/Validator/Float.php b/lib/internal/Zend/I18n/Validator/Float.php
index 010a7d8446fe270049226ea721db6e9f16814b2b..09d70f5a8865dfb8c536a041fc84905490a4eb01 100644
--- a/lib/internal/Zend/I18n/Validator/Float.php
+++ b/lib/internal/Zend/I18n/Validator/Float.php
@@ -19,7 +19,8 @@ use Zend\Validator\Exception;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_I18n
+ * @subpackage Validator
  */
 class Float extends AbstractValidator
 {
diff --git a/lib/internal/Zend/I18n/Validator/Int.php b/lib/internal/Zend/I18n/Validator/Int.php
index 83a2f91db997edfb2a3a7532a548e085ebc657a5..3b7f80a65b21e3e7334b3580d863f4110271b288 100644
--- a/lib/internal/Zend/I18n/Validator/Int.php
+++ b/lib/internal/Zend/I18n/Validator/Int.php
@@ -19,7 +19,8 @@ use Zend\Validator\Exception;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_I18n
+ * @subpackage Validator
  */
 class Int extends AbstractValidator
 {
diff --git a/lib/internal/Zend/I18n/Validator/PostCode.php b/lib/internal/Zend/I18n/Validator/PostCode.php
index 0f4dfa34e8c56d62d929b6969ea775c5e26a794a..6aad8eafa3d46b243174225aafc00fbc859a4ad3 100644
--- a/lib/internal/Zend/I18n/Validator/PostCode.php
+++ b/lib/internal/Zend/I18n/Validator/PostCode.php
@@ -19,7 +19,8 @@ use Zend\Validator\Exception;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_I18n
+ * @subpackage Validator
  */
 class PostCode extends AbstractValidator
 {
diff --git a/lib/internal/Zend/I18n/View/Helper/AbstractTranslatorHelper.php b/lib/internal/Zend/I18n/View/Helper/AbstractTranslatorHelper.php
index f1e9ddb33b4f3a05921c8abc3a540d9eed2b98e5..975d2006d963327b4b970dcc30c61322981b827a 100644
--- a/lib/internal/Zend/I18n/View/Helper/AbstractTranslatorHelper.php
+++ b/lib/internal/Zend/I18n/View/Helper/AbstractTranslatorHelper.php
@@ -16,8 +16,8 @@ use Zend\View\Helper\AbstractHelper;
 
 /**
  * @category   Zend
- * @package    Zend_View
- * @subpackage Helper
+ * @package    Zend_I18n
+ * @subpackage View
  */
 abstract class AbstractTranslatorHelper extends AbstractHelper implements
     TranslatorAwareInterface
diff --git a/lib/internal/Zend/I18n/View/Helper/CurrencyFormat.php b/lib/internal/Zend/I18n/View/Helper/CurrencyFormat.php
index 75f7a0949ced867741d646a66d4fe5b25fb9fec7..e4ad76f7058b43bc12ff8372125573533b608031 100644
--- a/lib/internal/Zend/I18n/View/Helper/CurrencyFormat.php
+++ b/lib/internal/Zend/I18n/View/Helper/CurrencyFormat.php
@@ -15,7 +15,7 @@ use NumberFormatter;
 use Zend\View\Helper\AbstractHelper;
 
 /**
- * View helper for formatting dates.
+ * View helper for formatting currency.
  *
  * @category   Zend
  * @package    Zend_I18n
@@ -37,6 +37,13 @@ class CurrencyFormat extends AbstractHelper
      */
     protected $currencyCode;
 
+    /**
+     * If set to true, the currency will be returned with two decimals
+     *
+     * @var bool
+     */
+    protected $showDecimals = true;
+
     /**
      * Formatter instances.
      *
@@ -66,6 +73,28 @@ class CurrencyFormat extends AbstractHelper
         return $this->currencyCode;
     }
 
+    /**
+     * Set if the view helper should show two decimals
+     *
+     * @param  bool $showDecimals
+     * @return CurrencyFormat
+     */
+    public function setShouldShowDecimals($showDecimals)
+    {
+        $this->showDecimals = (bool) $showDecimals;
+        return $this;
+    }
+
+    /**
+     * Get if the view helper should show two decimals
+     *
+     * @return bool
+     */
+    public function shouldShowDecimals()
+    {
+        return $this->showDecimals;
+    }
+
     /**
      * Set locale to use instead of the default.
      *
@@ -97,12 +126,14 @@ class CurrencyFormat extends AbstractHelper
      *
      * @param  float  $number
      * @param  string $currencyCode
+     * @param  bool    $showDecimals
      * @param  string $locale
      * @return string
      */
     public function __invoke(
         $number,
         $currencyCode = null,
+        $showDecimals = null,
         $locale       = null
     ) {
         if (null === $locale) {
@@ -111,6 +142,9 @@ class CurrencyFormat extends AbstractHelper
         if (null === $currencyCode) {
             $currencyCode = $this->getCurrencyCode();
         }
+        if (null !== $showDecimals) {
+            $this->setShouldShowDecimals($showDecimals);
+        }
 
         $formatterId = md5($locale);
 
@@ -121,6 +155,12 @@ class CurrencyFormat extends AbstractHelper
             );
         }
 
+        if ($this->shouldShowDecimals()) {
+            $this->formatters[$formatterId]->setAttribute(NumberFormatter::FRACTION_DIGITS, 2);
+        } else {
+            $this->formatters[$formatterId]->setAttribute(NumberFormatter::FRACTION_DIGITS, 0);
+        }
+
         return $this->formatters[$formatterId]->formatCurrency(
             $number, $currencyCode
         );
diff --git a/lib/internal/Zend/I18n/composer.json b/lib/internal/Zend/I18n/composer.json
index c93238275c7dcabbe5b70c1c04c9d1c082e5ae86..09aa2c98ce52d99ed844de73095da643ca57161f 100644
--- a/lib/internal/Zend/I18n/composer.json
+++ b/lib/internal/Zend/I18n/composer.json
@@ -8,13 +8,14 @@
     ],
     "autoload": {
         "psr-0": {
-            "Zend\\I18n": ""
+            "Zend\\I18n\\": ""
         }
     },
     "target-dir": "Zend/I18n",
     "require": {
         "php": ">=5.3.3",
         "ext-intl": "*",
+        "zendframework/zend-filter": "self.version",
         "zendframework/zend-stdlib": "self.version"
     }
 }
diff --git a/lib/internal/Zend/Server/composer.json b/lib/internal/Zend/Server/composer.json
index 69400a24eb786e2a9af0184ffb368be5cd469ecc..51dbdf540fefc1607a414a83877db299054b535b 100644
--- a/lib/internal/Zend/Server/composer.json
+++ b/lib/internal/Zend/Server/composer.json
@@ -8,7 +8,7 @@
     ],
     "autoload": {
         "psr-0": {
-            "Zend\\Server": ""
+            "Zend\\Server\\": ""
         }
     },
     "target-dir": "Zend/Server",
diff --git a/lib/internal/Zend/ServiceManager/AbstractFactoryInterface.php b/lib/internal/Zend/ServiceManager/AbstractFactoryInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..6bf8a9720448594a2ae82081c9239a917cf54f88
--- /dev/null
+++ b/lib/internal/Zend/ServiceManager/AbstractFactoryInterface.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ * @package   Zend_ServiceManager
+ */
+
+namespace Zend\ServiceManager;
+
+/**
+ * @category Zend
+ * @package  Zend_ServiceManager
+ */
+interface AbstractFactoryInterface
+{
+    /**
+     * Determine if we can create a service with name
+     *
+     * @param ServiceLocatorInterface $serviceLocator
+     * @param $name
+     * @param $requestedName
+     * @return bool
+     */
+    public function canCreateServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName);
+
+    /**
+     * Create service with name
+     *
+     * @param ServiceLocatorInterface $serviceLocator
+     * @param $name
+     * @param $requestedName
+     * @return mixed
+     */
+    public function createServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName);
+}
diff --git a/lib/internal/Zend/ServiceManager/AbstractPluginManager.php b/lib/internal/Zend/ServiceManager/AbstractPluginManager.php
new file mode 100644
index 0000000000000000000000000000000000000000..61704d451898214acfa19add0b853844b45cdd9a
--- /dev/null
+++ b/lib/internal/Zend/ServiceManager/AbstractPluginManager.php
@@ -0,0 +1,222 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ * @package   Zend_ServiceManager
+ */
+
+namespace Zend\ServiceManager;
+
+/**
+ * ServiceManager implementation for managing plugins
+ *
+ * Automatically registers an initializer which should be used to verify that
+ * a plugin instance is of a valid type. Additionally, allows plugins to accept
+ * an array of options for the constructor, which can be used to configure
+ * the plugin when retrieved. Finally, enables the allowOverride property by
+ * default to allow registering factories, aliases, and invokables to take
+ * the place of those provided by the implementing class.
+ *
+ * @category   Zend
+ * @package    Zend_ServiceManager
+ */
+abstract class AbstractPluginManager extends ServiceManager implements ServiceLocatorAwareInterface
+{
+    /**
+     * Allow overriding by default
+     *
+     * @var bool
+     */
+    protected $allowOverride   = true;
+
+    /**
+     * Whether or not to auto-add a class as an invokable class if it exists
+     *
+     * @var bool
+     */
+    protected $autoAddInvokableClass = true;
+
+    /**
+     * Options to use when creating an instance
+     *
+     * @var mixed
+     */
+    protected $creationOptions = null;
+
+    /**
+     * The main service locator
+     *
+     * @var ServiceLocatorInterface
+     */
+    protected $serviceLocator;
+
+    /**
+     * Constructor
+     *
+     * Add a default initializer to ensure the plugin is valid after instance
+     * creation.
+     *
+     * @param  null|ConfigInterface $configuration
+     */
+    public function __construct(ConfigInterface $configuration = null)
+    {
+        parent::__construct($configuration);
+        $self = $this;
+        $this->addInitializer(function ($instance) use ($self) {
+            if ($instance instanceof ServiceLocatorAwareInterface) {
+                $instance->setServiceLocator($self);
+            }
+            if ($instance instanceof ServiceManagerAwareInterface) {
+                $instance->setServiceManager($self);
+            }
+        });
+    }
+
+    /**
+     * Validate the plugin
+     *
+     * Checks that the filter loaded is either a valid callback or an instance
+     * of FilterInterface.
+     *
+     * @param  mixed $plugin
+     * @return void
+     * @throws Exception\RuntimeException if invalid
+     */
+    abstract public function validatePlugin($plugin);
+
+    /**
+     * Retrieve a service from the manager by name
+     *
+     * Allows passing an array of options to use when creating the instance.
+     * createFromInvokable() will use these and pass them to the instance
+     * constructor if not null and a non-empty array.
+     *
+     * @param  string $name
+     * @param  array $options
+     * @param  bool $usePeeringServiceManagers
+     * @return object
+     */
+    public function get($name, $options = array(), $usePeeringServiceManagers = true)
+    {
+        // Allow specifying a class name directly; registers as an invokable class
+        if (!$this->has($name) && $this->autoAddInvokableClass && class_exists($name)) {
+            $this->setInvokableClass($name, $name);
+        }
+
+        $this->creationOptions = $options;
+        $instance = parent::get($name, $usePeeringServiceManagers);
+        $this->creationOptions = null;
+        $this->validatePlugin($instance);
+        return $instance;
+    }
+
+    /**
+     * Register a service with the locator.
+     *
+     * Validates that the service object via validatePlugin() prior to
+     * attempting to register it.
+     *
+     * @param  string $name
+     * @param  mixed $service
+     * @param  bool $shared
+     * @return AbstractPluginManager
+     * @throws Exception\InvalidServiceNameException
+     */
+    public function setService($name, $service, $shared = true)
+    {
+        if ($service) {
+            $this->validatePlugin($service);
+        }
+        parent::setService($name, $service, $shared);
+        return $this;
+    }
+
+    /**
+     * Set the main service locator so factories can have access to it to pull deps
+     *
+     * @param ServiceLocatorInterface $serviceLocator
+     * @return AbstractPluginManager
+     */
+    public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
+    {
+        $this->serviceLocator = $serviceLocator;
+        return $this;
+    }
+
+    /**
+     * Get the main plugin manager. Useful for fetching dependencies from within factories.
+     *
+     * @return mixed
+     */
+    public function getServiceLocator()
+    {
+        return $this->serviceLocator;
+    }
+
+    /**
+     * Attempt to create an instance via an invokable class
+     *
+     * Overrides parent implementation by passing $creationOptions to the
+     * constructor, if non-null.
+     *
+     * @param  string $canonicalName
+     * @param  string $requestedName
+     * @return null|\stdClass
+     * @throws Exception\ServiceNotCreatedException If resolved class does not exist
+     */
+    protected function createFromInvokable($canonicalName, $requestedName)
+    {
+        $invokable = $this->invokableClasses[$canonicalName];
+
+        if (null === $this->creationOptions
+            || (is_array($this->creationOptions) && empty($this->creationOptions))
+        ) {
+            $instance = new $invokable();
+        } else {
+            $instance = new $invokable($this->creationOptions);
+        }
+
+        return $instance;
+    }
+
+    /**
+     * Attempt to create an instance via a factory class
+     *
+     * Overrides parent implementation by passing $creationOptions to the
+     * constructor, if non-null.
+     *
+     * @param  string $canonicalName
+     * @param  string $requestedName
+     * @return mixed
+     * @throws Exception\ServiceNotCreatedException If factory is not callable
+     */
+    protected function createFromFactory($canonicalName, $requestedName)
+    {
+        $factory = $this->factories[$canonicalName];
+        if (is_string($factory) && class_exists($factory, true)) {
+            if (null === $this->creationOptions || (is_array($this->creationOptions) && empty($this->creationOptions))) {
+                $factory = new $factory();
+            } else {
+                $factory = new $factory($this->creationOptions);
+            }
+
+            $this->factories[$canonicalName] = $factory;
+        }
+
+        if ($factory instanceof FactoryInterface) {
+            $instance = $this->createServiceViaCallback(array($factory, 'createService'), $canonicalName, $requestedName);
+        } elseif (is_callable($factory)) {
+            $instance = $this->createServiceViaCallback($factory, $canonicalName, $requestedName);
+        } else {
+            throw new Exception\ServiceNotCreatedException(sprintf(
+                'While attempting to create %s%s an invalid factory was registered for this instance type.', $canonicalName, ($requestedName ? '(alias: ' . $requestedName . ')' : '')
+            ));
+        }
+
+        return $instance;
+    }
+
+}
diff --git a/lib/internal/Zend/ServiceManager/Config.php b/lib/internal/Zend/ServiceManager/Config.php
new file mode 100644
index 0000000000000000000000000000000000000000..3ce022ebe09859a626bbb5cd7ca8385cf4c069b2
--- /dev/null
+++ b/lib/internal/Zend/ServiceManager/Config.php
@@ -0,0 +1,155 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ * @package   Zend_ServiceManager
+ */
+
+namespace Zend\ServiceManager;
+
+/**
+ * @category Zend
+ * @package  Zend_ServiceManager
+ */
+class Config implements ConfigInterface
+{
+    /**
+     * @var array
+     */
+    protected $config = array();
+
+    /**
+     * Constructor
+     *
+     * @param array $config
+     */
+    public function __construct($config = array())
+    {
+        $this->config = $config;
+    }
+
+    /**
+     * Get allow override
+     *
+     * @return null|bool
+     */
+    public function getAllowOverride()
+    {
+        return (isset($this->config['allow_override'])) ? $this->config['allow_override'] : null;
+    }
+
+    /**
+     * Get factories
+     *
+     * @return array
+     */
+    public function getFactories()
+    {
+        return (isset($this->config['factories'])) ? $this->config['factories'] : array();
+    }
+
+    /**
+     * Get abstract factories
+     *
+     * @return array
+     */
+    public function getAbstractFactories()
+    {
+        return (isset($this->config['abstract_factories'])) ? $this->config['abstract_factories'] : array();
+    }
+
+    /**
+     * Get invokables
+     *
+     * @return array
+     */
+    public function getInvokables()
+    {
+        return (isset($this->config['invokables'])) ? $this->config['invokables'] : array();
+    }
+
+    /**
+     * Get services
+     *
+     * @return array
+     */
+    public function getServices()
+    {
+        return (isset($this->config['services'])) ? $this->config['services'] : array();
+    }
+
+    /**
+     * Get aliases
+     *
+     * @return array
+     */
+    public function getAliases()
+    {
+        return (isset($this->config['aliases'])) ? $this->config['aliases'] : array();
+    }
+
+    /**
+     * Get initializers
+     *
+     * @return array
+     */
+    public function getInitializers()
+    {
+        return (isset($this->config['initializers'])) ? $this->config['initializers'] : array();
+    }
+
+    /**
+     * Get shared
+     *
+     * @return array
+     */
+    public function getShared()
+    {
+        return (isset($this->config['shared'])) ? $this->config['shared'] : array();
+    }
+
+    /**
+     * Configure service manager
+     *
+     * @param ServiceManager $serviceManager
+     * @return void
+     */
+    public function configureServiceManager(ServiceManager $serviceManager)
+    {
+        if (($allowOverride = $this->getAllowOverride()) !== null) {
+            $serviceManager->setAllowOverride($allowOverride);
+        }
+
+        foreach ($this->getFactories() as $name => $factory) {
+            $serviceManager->setFactory($name, $factory);
+        }
+
+        foreach ($this->getAbstractFactories() as $factory) {
+            $serviceManager->addAbstractFactory($factory);
+        }
+
+        foreach ($this->getInvokables() as $name => $invokable) {
+            $serviceManager->setInvokableClass($name, $invokable);
+        }
+
+        foreach ($this->getServices() as $name => $service) {
+            $serviceManager->setService($name, $service);
+        }
+
+        foreach ($this->getAliases() as $alias => $nameOrAlias) {
+            $serviceManager->setAlias($alias, $nameOrAlias);
+        }
+
+        foreach ($this->getInitializers() as $initializer) {
+            $serviceManager->addInitializer($initializer);
+        }
+
+        foreach ($this->getShared() as $name => $isShared) {
+            $serviceManager->setShared($name, $isShared);
+        }
+    }
+
+}
diff --git a/lib/internal/Zend/ServiceManager/ConfigInterface.php b/lib/internal/Zend/ServiceManager/ConfigInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..ddbf22d5fcba65aefc928446323e0970f071364a
--- /dev/null
+++ b/lib/internal/Zend/ServiceManager/ConfigInterface.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ * @package   Zend_ServiceManager
+ */
+
+namespace Zend\ServiceManager;
+
+/**
+ * @category Zend
+ * @package  Zend_ServiceManager
+ */
+interface ConfigInterface
+{
+    /**
+     * Configure service manager
+     *
+     * @param ServiceManager $serviceManager
+     * @return void
+     */
+    public function configureServiceManager(ServiceManager $serviceManager);
+}
diff --git a/lib/internal/Zend/ServiceManager/Di/DiAbstractServiceFactory.php b/lib/internal/Zend/ServiceManager/Di/DiAbstractServiceFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..c6e23697408cd1c0e16c7ace10eb80e26780d7cd
--- /dev/null
+++ b/lib/internal/Zend/ServiceManager/Di/DiAbstractServiceFactory.php
@@ -0,0 +1,62 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ * @package   Zend_ServiceManager
+ */
+
+namespace Zend\ServiceManager\Di;
+
+use Zend\Di\Di;
+use Zend\ServiceManager\AbstractFactoryInterface;
+use Zend\ServiceManager\ServiceLocatorInterface;
+
+class DiAbstractServiceFactory extends DiServiceFactory implements AbstractFactoryInterface
+{
+    /**
+     * Constructor
+     *
+     * @param \Zend\Di\Di $di
+     * @param null|string|\Zend\Di\InstanceManager $useServiceLocator
+     */
+    public function __construct(Di $di, $useServiceLocator = self::USE_SL_NONE)
+    {
+        $this->di = $di;
+        if (in_array($useServiceLocator, array(self::USE_SL_BEFORE_DI, self::USE_SL_AFTER_DI, self::USE_SL_NONE))) {
+            $this->useServiceLocator = $useServiceLocator;
+        }
+
+        // since we are using this in a proxy-fashion, localize state
+        $this->definitions = $this->di->definitions;
+        $this->instanceManager = $this->di->instanceManager;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function createServiceWithName(ServiceLocatorInterface $serviceLocator, $serviceName, $requestedName)
+    {
+        $this->serviceLocator = $serviceLocator;
+        if ($requestedName) {
+            return $this->get($requestedName, array(), true);
+        } else {
+            return $this->get($serviceName, array(), true);
+        }
+
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function canCreateServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName)
+    {
+        return $this->instanceManager->hasSharedInstance($requestedName)
+            || $this->instanceManager->hasAlias($requestedName)
+            || $this->instanceManager->hasConfig($requestedName)
+            || $this->instanceManager->hasTypePreferences($requestedName)
+            || $this->definitions->hasClass($requestedName);
+    }
+}
diff --git a/lib/internal/Zend/ServiceManager/Di/DiInstanceManagerProxy.php b/lib/internal/Zend/ServiceManager/Di/DiInstanceManagerProxy.php
new file mode 100644
index 0000000000000000000000000000000000000000..b94b64e8406f4f75a50c94c69db428bb0a33a617
--- /dev/null
+++ b/lib/internal/Zend/ServiceManager/Di/DiInstanceManagerProxy.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ * @package   Zend_ServiceManager
+ */
+
+namespace Zend\ServiceManager\Di;
+
+use Zend\Di\InstanceManager as DiInstanceManager;
+use Zend\ServiceManager\ServiceLocatorInterface;
+
+class DiInstanceManagerProxy extends DiInstanceManager
+{
+    /**
+     * @var DiInstanceManager
+     */
+    protected $diInstanceManager = null;
+
+    /**
+     * @var ServiceLocatorInterface
+     */
+    protected $serviceLocator = null;
+
+    /**
+     * Constructor
+     *
+     * @param DiInstanceManager $diInstanceManager
+     * @param ServiceLocatorInterface $serviceLocator
+     */
+    public function __construct(DiInstanceManager $diInstanceManager, ServiceLocatorInterface $serviceLocator)
+    {
+        $this->diInstanceManager = $diInstanceManager;
+        $this->serviceLocator = $serviceLocator;
+
+        // localize state
+        $this->aliases = &$diInstanceManager->aliases;
+        $this->sharedInstances = &$diInstanceManager->sharedInstances;
+        $this->sharedInstancesWithParams = &$diInstanceManager->sharedInstancesWithParams;
+        $this->configurations = &$diInstanceManager->configurations;
+        $this->typePreferences = &$diInstanceManager->typePreferences;
+    }
+
+    /**
+     * Determine if we have a shared instance by class or alias
+     *
+     * @param $classOrAlias
+     * @return bool
+     */
+    public function hasSharedInstance($classOrAlias)
+    {
+        return ($this->serviceLocator->has($classOrAlias) || $this->diInstanceManager->hasSharedInstance($classOrAlias));
+    }
+
+    /**
+     * Get shared instance
+     *
+     * @param $classOrAlias
+     * @return mixed
+     */
+    public function getSharedInstance($classOrAlias)
+    {
+        if ($this->serviceLocator->has($classOrAlias)) {
+            return $this->serviceLocator->get($classOrAlias);
+        } else {
+            return $this->diInstanceManager->getSharedInstance($classOrAlias);
+        }
+    }
+}
diff --git a/lib/internal/Zend/ServiceManager/Di/DiServiceFactory.php b/lib/internal/Zend/ServiceManager/Di/DiServiceFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..1443321cf9ccb574bc78049ad7fdfc9d9fb8ae50
--- /dev/null
+++ b/lib/internal/Zend/ServiceManager/Di/DiServiceFactory.php
@@ -0,0 +1,124 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ * @package   Zend_ServiceManager
+ */
+
+namespace Zend\ServiceManager\Di;
+
+use Zend\Di\Di;
+use Zend\Di\Exception\ClassNotFoundException as DiClassNotFoundException;
+use Zend\ServiceManager\Exception;
+use Zend\ServiceManager\FactoryInterface;
+use Zend\ServiceManager\ServiceLocatorInterface;
+
+class DiServiceFactory extends Di implements FactoryInterface
+{
+    /**@#+
+     * constants
+     */
+    const USE_SL_BEFORE_DI = 'before';
+    const USE_SL_AFTER_DI  = 'after';
+    const USE_SL_NONE      = 'none';
+    /**@#-*/
+
+    /**
+     * @var \Zend\Di\Di
+     */
+    protected $di = null;
+
+    /**
+     * @var \Zend\Di\InstanceManager
+     */
+    protected $name = null;
+
+    /**
+     * @var array
+     */
+    protected $parameters = array();
+
+    /**
+     * @var string
+     */
+    protected $useServiceLocator = self::USE_SL_AFTER_DI;
+
+    /**
+     * @var ServiceLocatorInterface
+     */
+    protected $serviceLocator = null;
+
+    /**
+     * Constructor
+     *
+     * @param \Zend\Di\Di $di
+     * @param null|\Zend\Di\InstanceManager $name
+     * @param array $parameters
+     * @param string $useServiceLocator
+     */
+    public function __construct(Di $di, $name, array $parameters = array(), $useServiceLocator = self::USE_SL_NONE)
+    {
+        $this->di = $di;
+        $this->name = $name;
+        $this->parameters = $parameters;
+        if (in_array($useServiceLocator, array(self::USE_SL_BEFORE_DI, self::USE_SL_AFTER_DI, self::USE_SL_NONE))) {
+            $this->useServiceLocator = $useServiceLocator;
+        }
+
+        // since we are using this in a proxy-fashion, localize state
+        $this->definitions = $this->di->definitions;
+        $this->instanceManager = $this->di->instanceManager;
+    }
+
+    /**
+     * Create service
+     *
+     * @param ServiceLocatorInterface $serviceLocator
+     * @return object
+     */
+    public function createService(ServiceLocatorInterface $serviceLocator)
+    {
+        $this->serviceLocator = $serviceLocator;
+        return $this->get($this->name, $this->parameters, true);
+    }
+
+    /**
+     * Override, as we want it to use the functionality defined in the proxy
+     *
+     * @param string $name
+     * @param array $params
+     * @return object
+     * @throws Exception\ServiceNotFoundException
+     */
+    public function get($name, array $params = array())
+    {
+        // allow this di service to get dependencies from the service locator BEFORE trying di
+        if ($this->useServiceLocator == self::USE_SL_BEFORE_DI && $this->serviceLocator->has($name)) {
+            return $this->serviceLocator->get($name);
+        }
+
+        try {
+
+            $service = parent::get($name, $params);
+            return $service;
+
+        } catch (DiClassNotFoundException $e) {
+
+            // allow this di service to get dependencies from the service locator AFTER trying di
+            if ($this->useServiceLocator == self::USE_SL_AFTER_DI && $this->serviceLocator->has($name)) {
+                return $this->serviceLocator->get($name);
+            } else {
+                throw new Exception\ServiceNotFoundException(
+                    sprintf('Service %s was not found in this DI instance', $name),
+                    null,
+                    $e
+                );
+            }
+        }
+
+    }
+
+}
diff --git a/lib/internal/Zend/ServiceManager/Di/DiServiceInitializer.php b/lib/internal/Zend/ServiceManager/Di/DiServiceInitializer.php
new file mode 100644
index 0000000000000000000000000000000000000000..ac6e4cae1f7fa0008f07fbee9cfe67b3dd031c9d
--- /dev/null
+++ b/lib/internal/Zend/ServiceManager/Di/DiServiceInitializer.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ * @package   Zend_ServiceManager
+ */
+
+namespace Zend\ServiceManager\Di;
+
+use Zend\Di\Di;
+use Zend\ServiceManager\Exception;
+use Zend\ServiceManager\InitializerInterface;
+use Zend\ServiceManager\ServiceLocatorInterface;
+
+class DiServiceInitializer extends Di implements InitializerInterface
+{
+    /**
+     * @var Di
+     */
+    protected $di = null;
+
+    /**
+     * @var DiInstanceManagerProxy
+     */
+    protected $diInstanceManagerProxy = null;
+
+    /**
+     * @var ServiceLocatorInterface
+     */
+    protected $serviceLocator = null;
+
+    /**
+     * Constructor
+     *
+     * @param \Zend\Di\Di $di
+     * @param \Zend\ServiceManager\ServiceLocatorInterface $serviceLocator
+     * @param null|DiInstanceManagerProxy $diImProxy
+     */
+    public function __construct(Di $di, ServiceLocatorInterface $serviceLocator, DiInstanceManagerProxy $diImProxy = null)
+    {
+        $this->di = $di;
+        $this->serviceLocator = $serviceLocator;
+        $this->diInstanceManagerProxy = ($diImProxy) ?: new DiInstanceManagerProxy($di->instanceManager(), $serviceLocator);
+    }
+
+    /**
+     * Initialize
+     *
+     * @param $instance
+     * @param ServiceLocatorInterface $serviceLocator
+     * @throws \Exception
+     */
+    public function initialize($instance, ServiceLocatorInterface $serviceLocator)
+    {
+        $instanceManager = $this->di->instanceManager;
+        $this->di->instanceManager = $this->diInstanceManagerProxy;
+        try {
+            $this->di->injectDependencies($instance);
+            $this->di->instanceManager = $instanceManager;
+        } catch (\Exception $e) {
+            $this->di->instanceManager = $instanceManager;
+            throw $e;
+        }
+    }
+
+}
diff --git a/lib/internal/Zend/ServiceManager/Exception/CircularDependencyFoundException.php b/lib/internal/Zend/ServiceManager/Exception/CircularDependencyFoundException.php
new file mode 100644
index 0000000000000000000000000000000000000000..081474d0460d77fb463037ee6deb9bd90cc51d76
--- /dev/null
+++ b/lib/internal/Zend/ServiceManager/Exception/CircularDependencyFoundException.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ * @package   Zend_ServiceManager
+ */
+
+namespace Zend\ServiceManager\Exception;
+
+/**
+ * @category   Zend
+ * @package    Zend_ServiceManager
+ * @subpackage Exception
+ */
+class CircularDependencyFoundException extends RuntimeException
+{
+}
diff --git a/lib/internal/Zend/ServiceManager/Exception/ExceptionInterface.php b/lib/internal/Zend/ServiceManager/Exception/ExceptionInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..091a8a5c3899e824f85d69e474da95cb8249f84e
--- /dev/null
+++ b/lib/internal/Zend/ServiceManager/Exception/ExceptionInterface.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ * @package   Zend_ServiceManager
+ */
+
+namespace Zend\ServiceManager\Exception;
+
+/**
+ * @category   Zend
+ * @package    Zend_ServiceManager
+ * @subpackage Exception
+ */
+interface ExceptionInterface
+{
+}
diff --git a/lib/internal/Zend/ServiceManager/Exception/InvalidArgumentException.php b/lib/internal/Zend/ServiceManager/Exception/InvalidArgumentException.php
new file mode 100644
index 0000000000000000000000000000000000000000..89c062334591fb7f7e5aafc540ce1f40fae9949e
--- /dev/null
+++ b/lib/internal/Zend/ServiceManager/Exception/InvalidArgumentException.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ * @package   Zend_ServiceManager
+ */
+
+namespace Zend\ServiceManager\Exception;
+
+/**
+ * @category   Zend
+ * @package    Zend_ServiceManager
+ * @subpackage Exception
+ */
+class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface
+{
+}
diff --git a/lib/internal/Zend/ServiceManager/Exception/InvalidServiceNameException.php b/lib/internal/Zend/ServiceManager/Exception/InvalidServiceNameException.php
new file mode 100644
index 0000000000000000000000000000000000000000..5ef91655d87c7dc8a14681916f8ba1452251bca5
--- /dev/null
+++ b/lib/internal/Zend/ServiceManager/Exception/InvalidServiceNameException.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ * @package   Zend_ServiceManager
+ */
+
+namespace Zend\ServiceManager\Exception;
+
+/**
+ * @category   Zend
+ * @package    Zend_ServiceManager
+ * @subpackage Exception
+ */
+class InvalidServiceNameException extends RuntimeException
+{
+}
diff --git a/lib/internal/Zend/ServiceManager/Exception/RuntimeException.php b/lib/internal/Zend/ServiceManager/Exception/RuntimeException.php
new file mode 100644
index 0000000000000000000000000000000000000000..ee9046bea7ca3cfedcdad99e0d817a1b51801b1e
--- /dev/null
+++ b/lib/internal/Zend/ServiceManager/Exception/RuntimeException.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ * @package   Zend_ServiceManager
+ */
+
+namespace Zend\ServiceManager\Exception;
+
+/**
+ * @category   Zend
+ * @package    Zend_ServiceManager
+ * @subpackage Exception
+ */
+class RuntimeException extends \RuntimeException implements ExceptionInterface
+{
+}
diff --git a/lib/internal/Zend/ServiceManager/Exception/ServiceNotCreatedException.php b/lib/internal/Zend/ServiceManager/Exception/ServiceNotCreatedException.php
new file mode 100644
index 0000000000000000000000000000000000000000..92cfd6085dac7fb88f1b91a7c859b81f7b53b0cb
--- /dev/null
+++ b/lib/internal/Zend/ServiceManager/Exception/ServiceNotCreatedException.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ * @package   Zend_ServiceManager
+ */
+
+namespace Zend\ServiceManager\Exception;
+
+/**
+ * @category   Zend
+ * @package    Zend_ServiceManager
+ * @subpackage Exception
+ */
+class ServiceNotCreatedException extends RuntimeException
+{
+}
diff --git a/lib/internal/Zend/ServiceManager/Exception/ServiceNotFoundException.php b/lib/internal/Zend/ServiceManager/Exception/ServiceNotFoundException.php
new file mode 100644
index 0000000000000000000000000000000000000000..98854470fc216d1d89c5a87d77fa63d2e6e8fc01
--- /dev/null
+++ b/lib/internal/Zend/ServiceManager/Exception/ServiceNotFoundException.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ * @package   Zend_ServiceManager
+ */
+
+namespace Zend\ServiceManager\Exception;
+
+/**
+ * @category   Zend
+ * @package    Zend_ServiceManager
+ * @subpackage Exception
+ */
+class ServiceNotFoundException extends InvalidArgumentException
+{
+}
diff --git a/lib/internal/Zend/ServiceManager/FactoryInterface.php b/lib/internal/Zend/ServiceManager/FactoryInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..97b15c624c11b3f24f785c3ba6533b764552ac6e
--- /dev/null
+++ b/lib/internal/Zend/ServiceManager/FactoryInterface.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ * @package   Zend_ServiceManager
+ */
+
+namespace Zend\ServiceManager;
+
+/**
+ * @category Zend
+ * @package  Zend_ServiceManager
+ */
+interface FactoryInterface
+{
+    /**
+     * Create service
+     *
+     * @param ServiceLocatorInterface $serviceLocator
+     * @return mixed
+     */
+    public function createService(ServiceLocatorInterface $serviceLocator);
+}
diff --git a/lib/internal/Zend/ServiceManager/InitializerInterface.php b/lib/internal/Zend/ServiceManager/InitializerInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..0de46cc70b3f9af4e4868202a2575f7c41dc0440
--- /dev/null
+++ b/lib/internal/Zend/ServiceManager/InitializerInterface.php
@@ -0,0 +1,29 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ * @package   Zend_ServiceManager
+ */
+
+namespace Zend\ServiceManager;
+
+use Zend\ServiceManager\ServiceLocatorInterface;
+
+/**
+ * @category Zend
+ * @package  Zend_ServiceManager
+ */
+interface InitializerInterface
+{
+    /**
+     * Initialize
+     *
+     * @param $instance
+     * @param ServiceLocatorInterface $serviceLocator
+     * @return mixed
+     */
+    public function initialize($instance, ServiceLocatorInterface $serviceLocator);
+}
diff --git a/lib/internal/Zend/ServiceManager/ServiceLocatorAwareInterface.php b/lib/internal/Zend/ServiceManager/ServiceLocatorAwareInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..39422f3bd5ae164e6b0c03af97327ffb72b3befe
--- /dev/null
+++ b/lib/internal/Zend/ServiceManager/ServiceLocatorAwareInterface.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ * @package   Zend_ServiceManager
+ */
+
+namespace Zend\ServiceManager;
+
+/**
+ * @category Zend
+ * @package  Zend_ServiceManager
+ */
+interface ServiceLocatorAwareInterface
+{
+    /**
+     * Set service locator
+     *
+     * @param ServiceLocatorInterface $serviceLocator
+     */
+    public function setServiceLocator(ServiceLocatorInterface $serviceLocator);
+
+    /**
+     * Get service locator
+     *
+     * @return ServiceLocatorInterface
+     */
+    public function getServiceLocator();
+}
diff --git a/lib/internal/Zend/ServiceManager/ServiceLocatorInterface.php b/lib/internal/Zend/ServiceManager/ServiceLocatorInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..539ce305441cff20150bf0d743409c34d2bd07ea
--- /dev/null
+++ b/lib/internal/Zend/ServiceManager/ServiceLocatorInterface.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ * @package   Zend_ServiceManager
+ */
+
+namespace Zend\ServiceManager;
+
+/**
+ * Service locator interface
+ *
+ * @category Zend
+ * @package Zend_ServiceManager
+ */
+interface ServiceLocatorInterface
+{
+    /**
+     * Retrieve a registered instance
+     *
+     * @param  string  $name
+     * @throws Exception\ServiceNotFoundException
+     * @return object|array
+     */
+    public function get($name);
+
+    /**
+     * Check for a registered instance
+     *
+     * @param  string|array  $name
+     * @return bool
+     */
+    public function has($name);
+}
diff --git a/lib/internal/Zend/ServiceManager/ServiceManager.php b/lib/internal/Zend/ServiceManager/ServiceManager.php
new file mode 100644
index 0000000000000000000000000000000000000000..6dfe797b74dbae283c5640d446dedd54956f65a5
--- /dev/null
+++ b/lib/internal/Zend/ServiceManager/ServiceManager.php
@@ -0,0 +1,960 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ * @package   Zend_ServiceManager
+ */
+
+namespace Zend\ServiceManager;
+
+use Closure;
+use ReflectionClass;
+
+/**
+ * @category Zend
+ * @package  Zend_ServiceManager
+ */
+class ServiceManager implements ServiceLocatorInterface
+{
+
+    /**@#+
+     * Constants
+     */
+    const SCOPE_PARENT = 'parent';
+    const SCOPE_CHILD = 'child';
+    /**@#-*/
+
+    /**
+     * Lookup for canonicalized names.
+     *
+     * @var array
+     */
+    protected $canonicalNames = array();
+
+    /**
+     * @var bool
+     */
+    protected $allowOverride = false;
+
+    /**
+     * @var array
+     */
+    protected $invokableClasses = array();
+
+    /**
+     * @var string|callable|Closure|FactoryInterface[]
+     */
+    protected $factories = array();
+
+    /**
+     * @var AbstractFactoryInterface[]
+     */
+    protected $abstractFactories = array();
+
+    /**
+     * @var array
+     */
+    protected $pendingAbstractFactoryRequests = array();
+
+    /**
+     * @var array
+     */
+    protected $shared = array();
+
+    /**
+     * Registered services and cached values
+     *
+     * @var array
+     */
+    protected $instances = array();
+
+    /**
+     * @var array
+     */
+    protected $aliases = array();
+
+    /**
+     * @var array
+     */
+    protected $initializers = array();
+
+    /**
+     * @var ServiceManager[]
+     */
+    protected $peeringServiceManagers = array();
+
+    /**
+     * Whether or not to share by default
+     *
+     * @var bool
+     */
+    protected $shareByDefault = true;
+
+    /**
+     * @var bool
+     */
+    protected $retrieveFromPeeringManagerFirst = false;
+
+    /**
+     * @var bool Track whether not to throw exceptions during create()
+     */
+    protected $throwExceptionInCreate = true;
+
+    /**
+     * @var array map of characters to be replaced through strtr
+     */
+    protected $canonicalNamesReplacements = array('-' => '', '_' => '', ' ' => '', '\\' => '', '/' => '');
+
+    /**
+     * Constructor
+     *
+     * @param ConfigInterface $config
+     */
+    public function __construct(ConfigInterface $config = null)
+    {
+        if ($config) {
+            $config->configureServiceManager($this);
+        }
+    }
+
+    /**
+     * Set allow override
+     *
+     * @param $allowOverride
+     * @return ServiceManager
+     */
+    public function setAllowOverride($allowOverride)
+    {
+        $this->allowOverride = (bool) $allowOverride;
+        return $this;
+    }
+
+    /**
+     * Get allow override
+     *
+     * @return bool
+     */
+    public function getAllowOverride()
+    {
+        return $this->allowOverride;
+    }
+
+    /**
+     * Set flag indicating whether services are shared by default
+     *
+     * @param  bool $shareByDefault
+     * @return ServiceManager
+     * @throws Exception\RuntimeException if allowOverride is false
+     */
+    public function setShareByDefault($shareByDefault)
+    {
+        if ($this->allowOverride === false) {
+            throw new Exception\RuntimeException(sprintf(
+                '%s: cannot alter default shared service setting; container is marked immutable (allow_override is false)',
+                __METHOD__
+            ));
+        }
+        $this->shareByDefault = (bool) $shareByDefault;
+        return $this;
+    }
+
+    /**
+     * Are services shared by default?
+     *
+     * @return bool
+     */
+    public function shareByDefault()
+    {
+        return $this->shareByDefault;
+    }
+
+    /**
+     * Set throw exceptions in create
+     *
+     * @param  bool $throwExceptionInCreate
+     * @return ServiceManager
+     */
+    public function setThrowExceptionInCreate($throwExceptionInCreate)
+    {
+        $this->throwExceptionInCreate = $throwExceptionInCreate;
+        return $this;
+    }
+
+    /**
+     * Get throw exceptions in create
+     *
+     * @return bool
+     */
+    public function getThrowExceptionInCreate()
+    {
+        return $this->throwExceptionInCreate;
+    }
+
+    /**
+     * Set flag indicating whether to pull from peering manager before attempting creation
+     *
+     * @param  bool $retrieveFromPeeringManagerFirst
+     * @return ServiceManager
+     */
+    public function setRetrieveFromPeeringManagerFirst($retrieveFromPeeringManagerFirst = true)
+    {
+        $this->retrieveFromPeeringManagerFirst = (bool) $retrieveFromPeeringManagerFirst;
+        return $this;
+    }
+
+    /**
+     * Should we retrieve from the peering manager prior to attempting to create a service?
+     *
+     * @return bool
+     */
+    public function retrieveFromPeeringManagerFirst()
+    {
+        return $this->retrieveFromPeeringManagerFirst;
+    }
+
+    /**
+     * Set invokable class
+     *
+     * @param  string  $name
+     * @param  string  $invokableClass
+     * @param  bool $shared
+     * @return ServiceManager
+     * @throws Exception\InvalidServiceNameException
+     */
+    public function setInvokableClass($name, $invokableClass, $shared = true)
+    {
+        $cName = $this->canonicalizeName($name);
+        $rName = $name;
+
+        if ($this->has(array($cName, $rName), false)) {
+            if ($this->allowOverride === false) {
+                throw new Exception\InvalidServiceNameException(sprintf(
+                    'A service by the name or alias "%s" already exists and cannot be overridden; please use an alternate name',
+                    $cName
+                ));
+            }
+            $this->unregisterService($cName);
+        }
+
+        $this->invokableClasses[$cName] = $invokableClass;
+        $this->shared[$cName]           = (bool) $shared;
+
+        return $this;
+    }
+
+    /**
+     * Set factory
+     *
+     * @param  string                           $name
+     * @param  string|FactoryInterface|callable $factory
+     * @param  bool                             $shared
+     * @return ServiceManager
+     * @throws Exception\InvalidArgumentException
+     * @throws Exception\InvalidServiceNameException
+     */
+    public function setFactory($name, $factory, $shared = true)
+    {
+        $cName = $this->canonicalizeName($name);
+        $rName = $name;
+
+        if (!is_string($factory) && !$factory instanceof FactoryInterface && !is_callable($factory)) {
+            throw new Exception\InvalidArgumentException(
+                'Provided abstract factory must be the class name of an abstract factory or an instance of an AbstractFactoryInterface.'
+            );
+        }
+
+        if ($this->has(array($cName, $rName), false)) {
+            if ($this->allowOverride === false) {
+                throw new Exception\InvalidServiceNameException(sprintf(
+                    'A service by the name or alias "%s" already exists and cannot be overridden, please use an alternate name',
+                    $cName
+                ));
+            }
+            $this->unregisterService($cName);
+        }
+
+        $this->factories[$cName] = $factory;
+        $this->shared[$cName]    = (bool) $shared;
+
+        return $this;
+    }
+
+    /**
+     * Add abstract factory
+     *
+     * @param  AbstractFactoryInterface|string $factory
+     * @param  bool                            $topOfStack
+     * @return ServiceManager
+     * @throws Exception\InvalidArgumentException if the abstract factory is invalid
+     */
+    public function addAbstractFactory($factory, $topOfStack = true)
+    {
+        if (!is_string($factory) && !$factory instanceof AbstractFactoryInterface) {
+            throw new Exception\InvalidArgumentException(
+                'Provided abstract factory must be the class name of an abstract factory or an instance of an AbstractFactoryInterface.'
+            );
+        }
+        if (is_string($factory)) {
+            if (!class_exists($factory, true)) {
+                throw new Exception\InvalidArgumentException(
+                    'Provided abstract factory must be the class name of an abstract factory or an instance of an AbstractFactoryInterface.'
+                );
+            }
+            $refl = new ReflectionClass($factory);
+            if (!$refl->implementsInterface(__NAMESPACE__ . '\\AbstractFactoryInterface')) {
+                throw new Exception\InvalidArgumentException(
+                    'Provided abstract factory must be the class name of an abstract factory or an instance of an AbstractFactoryInterface.'
+                );
+            }
+        }
+
+        if ($topOfStack) {
+            array_unshift($this->abstractFactories, $factory);
+        } else {
+            array_push($this->abstractFactories, $factory);
+        }
+        return $this;
+    }
+
+    /**
+     * Add initializer
+     *
+     * @param  callable|InitializerInterface $initializer
+     * @param  bool                          $topOfStack
+     * @return ServiceManager
+     * @throws Exception\InvalidArgumentException
+     */
+    public function addInitializer($initializer, $topOfStack = true)
+    {
+        if (!is_callable($initializer) && !$initializer instanceof InitializerInterface) {
+            if (!is_string($initializer)
+                || !$this->isSubclassOf($initializer, __NAMESPACE__ . '\InitializerInterface')
+            ) {
+                throw new Exception\InvalidArgumentException('$initializer should be callable.');
+            }
+            $initializer = new $initializer;
+        }
+
+        if ($topOfStack) {
+            array_unshift($this->initializers, $initializer);
+        } else {
+            array_push($this->initializers, $initializer);
+        }
+        return $this;
+    }
+
+    /**
+     * Register a service with the locator
+     *
+     * @param  string  $name
+     * @param  mixed   $service
+     * @param  bool    $shared
+     * @return ServiceManager
+     * @throws Exception\InvalidServiceNameException
+     */
+    public function setService($name, $service, $shared = true)
+    {
+        $cName = $this->canonicalizeName($name);
+
+        if ($this->has($cName, false)) {
+            if ($this->allowOverride === false) {
+                throw new Exception\InvalidServiceNameException(sprintf(
+                    '%s: A service by the name "%s" or alias already exists and cannot be overridden, please use an alternate name.',
+                    __METHOD__,
+                    $name
+                ));
+            }
+            $this->unregisterService($cName);
+        }
+
+        $this->instances[$cName] = $service;
+        $this->shared[$cName]    = (bool) $shared;
+        return $this;
+    }
+
+    /**
+     * @param  string $name
+     * @param  bool   $isShared
+     * @return ServiceManager
+     * @throws Exception\ServiceNotFoundException
+     */
+    public function setShared($name, $isShared)
+    {
+        $cName = $this->canonicalizeName($name);
+
+        if (
+            !isset($this->invokableClasses[$cName])
+            && !isset($this->factories[$cName])
+            && !$this->canCreateFromAbstractFactory($cName, $name)
+        ) {
+            throw new Exception\ServiceNotFoundException(sprintf(
+                '%s: A service by the name "%s" was not found and could not be marked as shared',
+                __METHOD__,
+                $name
+            ));
+        }
+
+        $this->shared[$cName] = (bool) $isShared;
+        return $this;
+    }
+
+    /**
+     * Retrieve a registered instance
+     *
+     * @param  string  $name
+     * @param  bool    $usePeeringServiceManagers
+     * @throws Exception\ServiceNotFoundException
+     * @return object|array
+     */
+    public function get($name, $usePeeringServiceManagers = true)
+    {
+        $cName = $this->canonicalizeName($name);
+        $rName = $name;
+
+        if ($this->hasAlias($cName)) {
+            do {
+                $cName = $this->aliases[$cName];
+            } while ($this->hasAlias($cName));
+
+            if (!$this->has(array($cName, $rName))) {
+                throw new Exception\ServiceNotFoundException(sprintf(
+                    'An alias "%s" was requested but no service could be found.',
+                    $name
+                ));
+            }
+        }
+
+        if (isset($this->instances[$cName])) {
+            return $this->instances[$cName];
+        }
+
+        $instance                        = null;
+        $retrieveFromPeeringManagerFirst = $this->retrieveFromPeeringManagerFirst();
+
+        if ($usePeeringServiceManagers && $retrieveFromPeeringManagerFirst) {
+            $instance = $this->retrieveFromPeeringManager($name);
+        }
+        if (!$instance) {
+            if ($this->canCreate(array($cName, $rName))) {
+                $instance = $this->create(array($cName, $rName));
+            } elseif ($usePeeringServiceManagers && !$retrieveFromPeeringManagerFirst) {
+                $instance = $this->retrieveFromPeeringManager($name);
+            }
+        }
+
+        // Still no instance? raise an exception
+        if (!$instance && !is_array($instance)) {
+            throw new Exception\ServiceNotFoundException(sprintf(
+                '%s was unable to fetch or create an instance for %s',
+                    __METHOD__,
+                    $name
+                )
+            );
+        }
+
+        if ($this->shareByDefault() && (!isset($this->shared[$cName]) || $this->shared[$cName] === true)
+        ) {
+            $this->instances[$cName] = $instance;
+        }
+
+        return $instance;
+    }
+
+    /**
+     * Create an instance
+     *
+     * @param  string|array $name
+     * @return false|object
+     * @throws Exception\ServiceNotFoundException
+     * @throws Exception\ServiceNotCreatedException
+     */
+    public function create($name)
+    {
+        $instance = false;
+
+        if (is_array($name)) {
+            list($cName, $rName) = $name;
+        } else {
+            $rName = $name;
+            $cName = $this->canonicalizeName($rName);
+        }
+
+
+        if (isset($this->factories[$cName])) {
+            $instance = $this->createFromFactory($cName, $rName);
+        }
+
+        if (!$instance && isset($this->invokableClasses[$cName])) {
+            $instance = $this->createFromInvokable($cName, $rName);
+        }
+
+        if (!$instance && $this->canCreateFromAbstractFactory($cName, $rName)) {
+            $instance = $this->createFromAbstractFactory($cName, $rName);
+        }
+
+        if ($this->throwExceptionInCreate == true && $instance === false) {
+            throw new Exception\ServiceNotFoundException(sprintf(
+                'No valid instance was found for %s%s',
+                $cName,
+                ($rName ? '(alias: ' . $rName . ')' : '')
+            ));
+        }
+
+        foreach ($this->initializers as $initializer) {
+            if ($initializer instanceof InitializerInterface) {
+                $initializer->initialize($instance, $this);
+            } elseif (is_object($initializer) && is_callable($initializer)) {
+                $initializer($instance, $this);
+            } else {
+                call_user_func($initializer, $instance, $this);
+            }
+        }
+
+        return $instance;
+    }
+
+    /**
+     * Determine if we can create an instance.
+     *
+     * @param  string|array $name
+     * @param  bool         $checkAbstractFactories
+     * @return bool
+     */
+    public function canCreate($name, $checkAbstractFactories = true)
+    {
+        if (is_array($name)) {
+            list($cName, $rName) = $name;
+        } else {
+            $rName = $name;
+            $cName = $this->canonicalizeName($rName);
+        }
+
+        if (
+            isset($this->invokableClasses[$cName])
+            || isset($this->factories[$cName])
+            || isset($this->aliases[$cName])
+            || isset($this->instances[$cName])
+        ) {
+            return true;
+        }
+
+        if ($checkAbstractFactories && $this->canCreateFromAbstractFactory($cName, $rName)) {
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * @param  string|array  $name
+     * @param  bool          $checkAbstractFactories
+     * @param  bool          $usePeeringServiceManagers
+     * @return bool
+     */
+    public function has($name, $checkAbstractFactories = true, $usePeeringServiceManagers = true)
+    {
+        if (is_array($name)) {
+            list($cName, $rName) = $name;
+        } else {
+            $rName = $name;
+            $cName = $this->canonicalizeName($rName);
+        }
+
+        if ($this->canCreate(array($cName, $rName), $checkAbstractFactories)) {
+            return true;
+        }
+
+        if ($usePeeringServiceManagers) {
+            foreach ($this->peeringServiceManagers as $peeringServiceManager) {
+                if ($peeringServiceManager->has($rName)) {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Determine if we can create an instance from an abstract factory.
+     *
+     * @param  string $cName
+     * @param  string $rName
+     * @return bool
+     */
+    public function canCreateFromAbstractFactory($cName, $rName)
+    {
+        // check abstract factories
+        foreach ($this->abstractFactories as $index => $abstractFactory) {
+            // Support string abstract factory class names
+            if (is_string($abstractFactory) && class_exists($abstractFactory, true)) {
+                $this->abstractFactory[$index] = $abstractFactory = new $abstractFactory();
+            }
+
+            if (
+                isset($this->pendingAbstractFactoryRequests[get_class($abstractFactory)])
+                && $this->pendingAbstractFactoryRequests[get_class($abstractFactory)] == $rName
+            ) {
+                return false;
+            }
+
+            if ($abstractFactory->canCreateServiceWithName($this, $cName, $rName)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * @param  string $alias
+     * @param  string $nameOrAlias
+     * @return ServiceManager
+     * @throws Exception\ServiceNotFoundException
+     * @throws Exception\InvalidServiceNameException
+     */
+    public function setAlias($alias, $nameOrAlias)
+    {
+        if (!is_string($alias) || !is_string($nameOrAlias)) {
+            throw new Exception\InvalidServiceNameException('Service or alias names must be strings.');
+        }
+
+        $cAlias = $this->canonicalizeName($alias);
+        $nameOrAlias = $this->canonicalizeName($nameOrAlias);
+
+        if ($alias == '' || $nameOrAlias == '') {
+            throw new Exception\InvalidServiceNameException('Invalid service name alias');
+        }
+
+        if ($this->allowOverride === false && $this->has(array($cAlias, $alias), false)) {
+            throw new Exception\InvalidServiceNameException('An alias by this name already exists');
+        }
+
+        $this->aliases[$cAlias] = $nameOrAlias;
+        return $this;
+    }
+
+    /**
+     * Determine if we have an alias
+     *
+     * @param  string $alias
+     * @return bool
+     */
+    public function hasAlias($alias)
+    {
+        $alias = $this->canonicalizeName($alias);
+        return (isset($this->aliases[$alias]));
+    }
+
+    /**
+     * Create scoped service manager
+     *
+     * @param  string $peering
+     * @return ServiceManager
+     */
+    public function createScopedServiceManager($peering = self::SCOPE_PARENT)
+    {
+        $scopedServiceManager = new ServiceManager();
+        if ($peering == self::SCOPE_PARENT) {
+            $scopedServiceManager->peeringServiceManagers[] = $this;
+        }
+        if ($peering == self::SCOPE_CHILD) {
+            $this->peeringServiceManagers[] = $scopedServiceManager;
+        }
+        return $scopedServiceManager;
+    }
+
+    /**
+     * Add a peering relationship
+     *
+     * @param  ServiceManager $manager
+     * @param  string         $peering
+     * @return ServiceManager
+     */
+    public function addPeeringServiceManager(ServiceManager $manager, $peering = self::SCOPE_PARENT)
+    {
+        if ($peering == self::SCOPE_PARENT) {
+            $this->peeringServiceManagers[] = $manager;
+        }
+        if ($peering == self::SCOPE_CHILD) {
+            $manager->peeringServiceManagers[] = $this;
+        }
+        return $this;
+    }
+
+    /**
+     * Canonicalize name
+     *
+     * @param  string $name
+     * @return string
+     */
+    protected function canonicalizeName($name)
+    {
+        if (isset($this->canonicalNames[$name])) {
+            return $this->canonicalNames[$name];
+        }
+
+        // this is just for performance instead of using str_replace
+        return $this->canonicalNames[$name] = strtolower(strtr($name, $this->canonicalNamesReplacements));
+    }
+
+    /**
+     * Create service via callback
+     *
+     * @param  callable $callable
+     * @param  string   $cName
+     * @param  string   $rName
+     * @throws Exception\ServiceNotCreatedException
+     * @throws Exception\ServiceNotFoundException
+     * @throws Exception\CircularDependencyFoundException
+     * @return object
+     */
+    protected function createServiceViaCallback($callable, $cName, $rName)
+    {
+        static $circularDependencyResolver = array();
+        $depKey = spl_object_hash($this) . '-' . $cName;
+
+        if (isset($circularDependencyResolver[$depKey])) {
+            $circularDependencyResolver = array();
+            throw new Exception\CircularDependencyFoundException('Circular dependency for LazyServiceLoader was found for instance ' . $rName);
+        }
+
+        try {
+            $circularDependencyResolver[$depKey] = true;
+            $instance = call_user_func($callable, $this, $cName, $rName);
+            unset($circularDependencyResolver[$depKey]);
+        } catch (Exception\ServiceNotFoundException $e) {
+            unset($circularDependencyResolver[$depKey]);
+            throw $e;
+        } catch (\Exception $e) {
+            unset($circularDependencyResolver[$depKey]);
+            throw new Exception\ServiceNotCreatedException(
+                sprintf('An exception was raised while creating "%s"; no instance returned', $rName),
+                $e->getCode(),
+                $e
+            );
+        }
+        if ($instance === null) {
+            throw new Exception\ServiceNotCreatedException('The factory was called but did not return an instance.');
+        }
+
+        return $instance;
+    }
+
+    /**
+     * Retrieve a keyed list of all registered services. Handy for debugging!
+     *
+     * @return array
+     */
+    public function getRegisteredServices()
+    {
+        return array(
+            'invokableClasses' => array_keys($this->invokableClasses),
+            'factories' => array_keys($this->factories),
+            'aliases' => array_keys($this->aliases),
+            'instances' => array_keys($this->instances),
+        );
+    }
+
+    /**
+     * Retrieve a keyed list of all canonical names. Handy for debugging!
+     *
+     * @return array
+     */
+    public function getCanonicalNames()
+    {
+        return $this->canonicalNames;
+    }
+
+    /**
+     * Allows to override the canonical names lookup map with predefined
+     * values.
+     *
+     * @param array $canonicalNames
+     * @return ServiceManager
+     */
+    public function setCanonicalNames($canonicalNames)
+    {
+        $this->canonicalNames = $canonicalNames;
+
+        return $this;
+    }
+
+    /**
+     * Attempt to retrieve an instance via a peering manager
+     *
+     * @param  string $name
+     * @return mixed
+     */
+    protected function retrieveFromPeeringManager($name)
+    {
+        foreach ($this->peeringServiceManagers as $peeringServiceManager) {
+            if ($peeringServiceManager->has($name)) {
+                return $peeringServiceManager->get($name);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Attempt to create an instance via an invokable class
+     *
+     * @param  string $canonicalName
+     * @param  string $requestedName
+     * @return null|\stdClass
+     * @throws Exception\ServiceNotFoundException If resolved class does not exist
+     */
+    protected function createFromInvokable($canonicalName, $requestedName)
+    {
+        $invokable = $this->invokableClasses[$canonicalName];
+        if (!class_exists($invokable)) {
+            throw new Exception\ServiceNotFoundException(sprintf(
+                '%s: failed retrieving "%s%s" via invokable class "%s"; class does not exist',
+                __METHOD__,
+                $canonicalName,
+                ($requestedName ? '(alias: ' . $requestedName . ')' : ''),
+                $invokable
+            ));
+        }
+        $instance = new $invokable;
+        return $instance;
+    }
+
+    /**
+     * Attempt to create an instance via a factory
+     *
+     * @param  string $canonicalName
+     * @param  string $requestedName
+     * @return mixed
+     * @throws Exception\ServiceNotCreatedException If factory is not callable
+     */
+    protected function createFromFactory($canonicalName, $requestedName)
+    {
+        $factory = $this->factories[$canonicalName];
+        if (is_string($factory) && class_exists($factory, true)) {
+            $factory = new $factory;
+            $this->factories[$canonicalName] = $factory;
+        }
+        if ($factory instanceof FactoryInterface) {
+            $instance = $this->createServiceViaCallback(array($factory, 'createService'), $canonicalName, $requestedName);
+        } elseif (is_callable($factory)) {
+            $instance = $this->createServiceViaCallback($factory, $canonicalName, $requestedName);
+        } else {
+            throw new Exception\ServiceNotCreatedException(sprintf(
+                'While attempting to create %s%s an invalid factory was registered for this instance type.',
+                $canonicalName,
+                ($requestedName ? '(alias: ' . $requestedName . ')' : '')
+            ));
+        }
+        return $instance;
+    }
+
+    /**
+     * Attempt to create an instance via an abstract factory
+     *
+     * @param  string $canonicalName
+     * @param  string $requestedName
+     * @return object|null
+     * @throws Exception\ServiceNotCreatedException If abstract factory is not callable
+     */
+    protected function createFromAbstractFactory($canonicalName, $requestedName)
+    {
+        foreach ($this->abstractFactories as $index => $abstractFactory) {
+            // support factories as strings
+            if (is_string($abstractFactory) && class_exists($abstractFactory, true)) {
+                $this->abstractFactories[$index] = $abstractFactory = new $abstractFactory;
+            } elseif (!$abstractFactory instanceof AbstractFactoryInterface) {
+                throw new Exception\ServiceNotCreatedException(sprintf(
+                    'While attempting to create %s%s an abstract factory could not produce a valid instance.',
+                    $canonicalName,
+                    ($requestedName ? '(alias: ' . $requestedName . ')' : '')
+                ));
+            }
+            try {
+                $this->pendingAbstractFactoryRequests[get_class($abstractFactory)] = $requestedName;
+                if ($abstractFactory->canCreateServiceWithName($this, $canonicalName, $requestedName)) {
+                    $instance = $this->createServiceViaCallback(
+                        array($abstractFactory, 'createServiceWithName'),
+                        $canonicalName,
+                        $requestedName
+                    );
+                    unset($this->pendingAbstractFactoryRequests[get_class($abstractFactory)]);
+                } else {
+                    $instance = false;
+                }
+            } catch (\Exception $e) {
+                unset($this->pendingAbstractFactoryRequests[get_class($abstractFactory)]);
+                throw new Exception\ServiceNotCreatedException(
+                    sprintf(
+                        'An abstract factory could not create an instance of %s%s.',
+                        $canonicalName,
+                        ($requestedName ? '(alias: ' . $requestedName . ')' : '')
+                    ),
+                    $e->getCode(),
+                    $e
+                );
+            }
+            if (is_object($instance)) {
+                break;
+            }
+        }
+
+        return $instance;
+    }
+
+    /**
+     * Checks if the object has this class as one of its parents
+     *
+     * @see https://bugs.php.net/bug.php?id=53727
+     * @see https://github.com/zendframework/zf2/pull/1807
+     *
+     * @param string $className
+     * @param string $type
+     * @return bool
+     */
+    protected static function isSubclassOf($className, $type)
+    {
+        if (is_subclass_of($className, $type)) {
+            return true;
+        }
+        if (version_compare(PHP_VERSION, '5.3.7', '>=')) {
+            return false;
+        }
+        if (!interface_exists($type)) {
+            return false;
+        }
+        $r = new ReflectionClass($className);
+        return $r->implementsInterface($type);
+    }
+
+    /**
+     * Unregister a service
+     *
+     * Called when $allowOverride is true and we detect that a service being
+     * added to the instance already exists. This will remove the duplicate
+     * entry, and also any shared flags previously registered.
+     *
+     * @param  string $canonical
+     * @return void
+     */
+    protected function unregisterService($canonical)
+    {
+        $types = array('invokableClasses', 'factories', 'aliases');
+        foreach ($types as $type) {
+            if (isset($this->{$type}[$canonical])) {
+                unset($this->{$type}[$canonical]);
+                break;
+            }
+        }
+
+        if (isset($this->instances[$canonical])) {
+            unset($this->instances[$canonical]);
+        }
+
+        if (isset($this->shared[$canonical])) {
+            unset($this->shared[$canonical]);
+        }
+    }
+}
diff --git a/lib/internal/Zend/ServiceManager/ServiceManagerAwareInterface.php b/lib/internal/Zend/ServiceManager/ServiceManagerAwareInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..5ea837087f43c23908f535e08f0c5c5e8bb1b4a2
--- /dev/null
+++ b/lib/internal/Zend/ServiceManager/ServiceManagerAwareInterface.php
@@ -0,0 +1,25 @@
+<?php
+/**
+ * Zend Framework (http://framework.zend.com/)
+ *
+ * @link      http://github.com/zendframework/zf2 for the canonical source repository
+ * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
+ * @license   http://framework.zend.com/license/new-bsd New BSD License
+ * @package   Zend_ServiceManager
+ */
+
+namespace Zend\ServiceManager;
+
+/**
+ * @category Zend
+ * @package  Zend_ServiceManager
+ */
+interface ServiceManagerAwareInterface
+{
+    /**
+     * Set service manager
+     *
+     * @param ServiceManager $serviceManager
+     */
+    public function setServiceManager(ServiceManager $serviceManager);
+}
diff --git a/lib/internal/Zend/ServiceManager/composer.json b/lib/internal/Zend/ServiceManager/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..0382d5d5eb1d82fee976d1de48c8a0adcbd8459a
--- /dev/null
+++ b/lib/internal/Zend/ServiceManager/composer.json
@@ -0,0 +1,21 @@
+{
+    "name": "zendframework/zend-servicemanager",
+    "description": " ",
+    "license": "BSD-3-Clause",
+    "keywords": [
+        "zf2",
+        "servicemanager"
+    ],
+    "autoload": {
+        "psr-0": {
+            "Zend\\ServiceManager\\": ""
+        }
+    },
+    "target-dir": "Zend/ServiceManager",
+    "require": {
+        "php": ">=5.3.3"
+    },
+    "suggest": {
+        "zendframework/zend-di": "Zend\\Di component"
+    }
+}
\ No newline at end of file
diff --git a/lib/internal/Zend/Soap/AutoDiscover.php b/lib/internal/Zend/Soap/AutoDiscover.php
index b6af97ff305fbc854718f0616c3de9ebeaa5d192..f703b9908401f70008ae63bd9df53cda1807d2c8 100644
--- a/lib/internal/Zend/Soap/AutoDiscover.php
+++ b/lib/internal/Zend/Soap/AutoDiscover.php
@@ -13,7 +13,6 @@ namespace Zend\Soap;
 use Zend\Server\Reflection;
 use Zend\Server\Reflection\AbstractFunction;
 use Zend\Server\Reflection\Prototype;
-use Zend\Server\Reflection\ReflectionParameter;
 use Zend\Soap\AutoDiscover\DiscoveryStrategy\DiscoveryStrategyInterface as DiscoveryStrategy;
 use Zend\Soap\AutoDiscover\DiscoveryStrategy\ReflectionDiscovery;
 use Zend\Soap\Wsdl;
@@ -191,7 +190,7 @@ class AutoDiscover
                                          ->getShortName();
             } else {
                 throw new Exception\RuntimeException(
-                    "No service name given. Call Autodiscover#setServiceName()."
+                    "No service name given. Call Autodiscover::setServiceName()."
                 );
             }
         }
@@ -228,7 +227,7 @@ class AutoDiscover
     public function getUri()
     {
         if ($this->uri === null) {
-            throw new Exception\RuntimeException("Missing uri. You have to explicitly configure the Endpoint Uri by calling AutoDiscover#setUri().");
+            throw new Exception\RuntimeException("Missing uri. You have to explicitly configure the Endpoint Uri by calling AutoDiscover::setUri().");
         }
         if (is_string($this->uri)) {
             $this->uri = Uri\UriFactory::factory($this->uri);
diff --git a/lib/internal/Zend/Soap/Client.php b/lib/internal/Zend/Soap/Client.php
index 5d137fc2becf7c8eeccb17727d30d2d3f1c6b54c..285a29101f7c5957efe0073ea711044f3921c041 100644
--- a/lib/internal/Zend/Soap/Client.php
+++ b/lib/internal/Zend/Soap/Client.php
@@ -858,7 +858,7 @@ class Client implements ServerClient
         if ($userAgent === null) {
             $this->user_agent = null;
         } else {
-            $this->user_agent = (string)$userAgent;
+            $this->user_agent = (string) $userAgent;
         }
         return $this;
     }
diff --git a/lib/internal/Zend/Soap/Server/DocumentLiteralWrapper.php b/lib/internal/Zend/Soap/Server/DocumentLiteralWrapper.php
index 750942840c32e74a01198c587e02f8e9dd05939c..65b887f6f1ed5c791b00dafdc963863ccaf82412 100644
--- a/lib/internal/Zend/Soap/Server/DocumentLiteralWrapper.php
+++ b/lib/internal/Zend/Soap/Server/DocumentLiteralWrapper.php
@@ -10,7 +10,6 @@
 
 namespace Zend\Soap\Server;
 
-use ReflectionClass;
 use ReflectionObject;
 use Zend\Soap\Exception\BadMethodCallException;
 use Zend\Soap\Exception\UnexpectedValueException;
diff --git a/lib/internal/Zend/Soap/composer.json b/lib/internal/Zend/Soap/composer.json
index fbf77e9ce41f25ec1c618592f3ddd9aeffdb8046..777a0a5e52d6d3ce6e17b6ae3f34fd358ccfddf7 100644
--- a/lib/internal/Zend/Soap/composer.json
+++ b/lib/internal/Zend/Soap/composer.json
@@ -8,7 +8,7 @@
     ],
     "autoload": {
         "psr-0": {
-            "Zend\\Soap": ""
+            "Zend\\Soap\\": ""
         }
     },
     "target-dir": "Zend/Soap",
diff --git a/lib/internal/Zend/Uri/composer.json b/lib/internal/Zend/Uri/composer.json
index ae5e2cbcf3c6a15a1e28a64297bca2bd76ac2087..82dedad04383045efe8a3bd21b2d79c8fca185cb 100644
--- a/lib/internal/Zend/Uri/composer.json
+++ b/lib/internal/Zend/Uri/composer.json
@@ -8,7 +8,7 @@
     ],
     "autoload": {
         "psr-0": {
-            "Zend\\Uri": ""
+            "Zend\\Uri\\": ""
         }
     },
     "target-dir": "Zend/Uri",
diff --git a/lib/internal/Zend/Validator/AbstractValidator.php b/lib/internal/Zend/Validator/AbstractValidator.php
index ce4dee7fb329886c5d60df6a8cc7f1ef56e6819c..ec3244f7234c511f95286fddd0c1e2773bf73123 100644
--- a/lib/internal/Zend/Validator/AbstractValidator.php
+++ b/lib/internal/Zend/Validator/AbstractValidator.php
@@ -18,7 +18,7 @@ use Zend\Validator\Exception\InvalidArgumentException;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 abstract class AbstractValidator implements
     TranslatorAwareInterface,
diff --git a/lib/internal/Zend/Validator/Barcode.php b/lib/internal/Zend/Validator/Barcode.php
index 615d3405f4b7793b55c83b1f3813085ac0b1ed90..959a119b8f73f515fc7f54147d1eaa5cd46cfd52 100644
--- a/lib/internal/Zend/Validator/Barcode.php
+++ b/lib/internal/Zend/Validator/Barcode.php
@@ -14,7 +14,7 @@ use Traversable;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Barcode extends AbstractValidator
 {
diff --git a/lib/internal/Zend/Validator/Barcode/AbstractAdapter.php b/lib/internal/Zend/Validator/Barcode/AbstractAdapter.php
index 860e5420241214af1b9f2efa5e723f7d34a22e78..3e1f23816f6342abf0f10499ac700f8a318b1e2e 100644
--- a/lib/internal/Zend/Validator/Barcode/AbstractAdapter.php
+++ b/lib/internal/Zend/Validator/Barcode/AbstractAdapter.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 abstract class AbstractAdapter implements AdapterInterface
 {
diff --git a/lib/internal/Zend/Validator/Barcode/AdapterInterface.php b/lib/internal/Zend/Validator/Barcode/AdapterInterface.php
index a2667cd0642b33cc06edb0d7207ca39ba3c98fcc..d83b5563a82ddfd9b826481c0684e7f142aab431 100644
--- a/lib/internal/Zend/Validator/Barcode/AdapterInterface.php
+++ b/lib/internal/Zend/Validator/Barcode/AdapterInterface.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 interface AdapterInterface
 {
diff --git a/lib/internal/Zend/Validator/Barcode/Codabar.php b/lib/internal/Zend/Validator/Barcode/Codabar.php
index 2c52064fdac6cafd2f2d38a06cf42ec9f22ca56f..a653931dcb7cda25e2edededd992ad88284f7fc6 100644
--- a/lib/internal/Zend/Validator/Barcode/Codabar.php
+++ b/lib/internal/Zend/Validator/Barcode/Codabar.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Codabar extends AbstractAdapter
 {
diff --git a/lib/internal/Zend/Validator/Barcode/Code128.php b/lib/internal/Zend/Validator/Barcode/Code128.php
index f97d0f33ec22949519a0ece72a83b7adab808bfb..e2951ff25f04d36c379cdae2c1c12adef017f2b2 100644
--- a/lib/internal/Zend/Validator/Barcode/Code128.php
+++ b/lib/internal/Zend/Validator/Barcode/Code128.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Code128 extends AbstractAdapter
 {
diff --git a/lib/internal/Zend/Validator/Barcode/Code25.php b/lib/internal/Zend/Validator/Barcode/Code25.php
index 22abdef7ee6186000ec20ffb680e8450438f0c04..634e64d4b3e776270c014c4a09c1085fc986e109 100644
--- a/lib/internal/Zend/Validator/Barcode/Code25.php
+++ b/lib/internal/Zend/Validator/Barcode/Code25.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Code25 extends AbstractAdapter
 {
diff --git a/lib/internal/Zend/Validator/Barcode/Code25interleaved.php b/lib/internal/Zend/Validator/Barcode/Code25interleaved.php
index 585bff79dbb4dcc4c4e4ce0272a850eacfa2116b..4f41a8079c5fa2f593e9b312ac0f1310c750aca2 100644
--- a/lib/internal/Zend/Validator/Barcode/Code25interleaved.php
+++ b/lib/internal/Zend/Validator/Barcode/Code25interleaved.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Code25interleaved extends AbstractAdapter
 {
diff --git a/lib/internal/Zend/Validator/Barcode/Code39.php b/lib/internal/Zend/Validator/Barcode/Code39.php
index fb88000b57ec6b63968d315064db38abf24606ca..5e0ce1b092cd27a01299d1e60c38f61fd5699d4a 100644
--- a/lib/internal/Zend/Validator/Barcode/Code39.php
+++ b/lib/internal/Zend/Validator/Barcode/Code39.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Code39 extends AbstractAdapter
 {
diff --git a/lib/internal/Zend/Validator/Barcode/Code39ext.php b/lib/internal/Zend/Validator/Barcode/Code39ext.php
index b8b5fb3fc1205aa3f744dc33ad8a0047d61cf2f9..6fb8a7089d00b9de81ac27245cd5fcfad8185303 100644
--- a/lib/internal/Zend/Validator/Barcode/Code39ext.php
+++ b/lib/internal/Zend/Validator/Barcode/Code39ext.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Code39ext extends AbstractAdapter
 {
diff --git a/lib/internal/Zend/Validator/Barcode/Code93.php b/lib/internal/Zend/Validator/Barcode/Code93.php
index 524ec049bd482e3b0bcd5cc4e6d0effe0d0a1f8d..275c5f953c4e8ebaf297403a5ae3fd056acd2c3f 100644
--- a/lib/internal/Zend/Validator/Barcode/Code93.php
+++ b/lib/internal/Zend/Validator/Barcode/Code93.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Code93 extends AbstractAdapter
 {
diff --git a/lib/internal/Zend/Validator/Barcode/Code93ext.php b/lib/internal/Zend/Validator/Barcode/Code93ext.php
index 3b910d3887bcf1fad100bb08aac933e703720666..c06db6e0fd9021298f39defa46a50cbe2d4668e2 100644
--- a/lib/internal/Zend/Validator/Barcode/Code93ext.php
+++ b/lib/internal/Zend/Validator/Barcode/Code93ext.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Code93ext extends AbstractAdapter
 {
diff --git a/lib/internal/Zend/Validator/Barcode/Ean12.php b/lib/internal/Zend/Validator/Barcode/Ean12.php
index b90d291c81aaa6000732b2a2394ad8605d1776f8..f99b2952ef9b06c2db027889fd654c37b1c932bb 100644
--- a/lib/internal/Zend/Validator/Barcode/Ean12.php
+++ b/lib/internal/Zend/Validator/Barcode/Ean12.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Ean12 extends AbstractAdapter
 {
diff --git a/lib/internal/Zend/Validator/Barcode/Ean13.php b/lib/internal/Zend/Validator/Barcode/Ean13.php
index 5a58ae419ff0e7958ad4395c4deacbbb4f5de2d7..94c3294a8777b153ad18e2540150ad24c4b8be4d 100644
--- a/lib/internal/Zend/Validator/Barcode/Ean13.php
+++ b/lib/internal/Zend/Validator/Barcode/Ean13.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Ean13 extends AbstractAdapter
 {
diff --git a/lib/internal/Zend/Validator/Barcode/Ean14.php b/lib/internal/Zend/Validator/Barcode/Ean14.php
index 426c604c7908b60edd003ff7b622cc20dd53aef1..1cf69d1e5176a71c2372bc4260cd3d944eaa1285 100644
--- a/lib/internal/Zend/Validator/Barcode/Ean14.php
+++ b/lib/internal/Zend/Validator/Barcode/Ean14.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Ean14 extends AbstractAdapter
 {
diff --git a/lib/internal/Zend/Validator/Barcode/Ean18.php b/lib/internal/Zend/Validator/Barcode/Ean18.php
index 0a1a8acd0883391284c4d0ca2d84df4686e509c0..5ad748713546890ce7ff9900aaa7e358bcb57172 100644
--- a/lib/internal/Zend/Validator/Barcode/Ean18.php
+++ b/lib/internal/Zend/Validator/Barcode/Ean18.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Ean18 extends AbstractAdapter
 {
diff --git a/lib/internal/Zend/Validator/Barcode/Ean2.php b/lib/internal/Zend/Validator/Barcode/Ean2.php
index 2dd48d0bc43840bec82bfa2f79972c495ac0bf48..7683488af831ddb7e38724fd167aabaada959784 100644
--- a/lib/internal/Zend/Validator/Barcode/Ean2.php
+++ b/lib/internal/Zend/Validator/Barcode/Ean2.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Ean2 extends AbstractAdapter
 {
diff --git a/lib/internal/Zend/Validator/Barcode/Ean5.php b/lib/internal/Zend/Validator/Barcode/Ean5.php
index ec327c41c9ab8207b41f2557f62b1beba5c17dfe..08003a741d774a460828549c2d4f2cd1a61a02d5 100644
--- a/lib/internal/Zend/Validator/Barcode/Ean5.php
+++ b/lib/internal/Zend/Validator/Barcode/Ean5.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Ean5 extends AbstractAdapter
 {
diff --git a/lib/internal/Zend/Validator/Barcode/Ean8.php b/lib/internal/Zend/Validator/Barcode/Ean8.php
index ea0a1453f8517577dd48beb9634be7a6f9d25ac0..2efe95aa97fde2a9406458b723cbafd874d5a539 100644
--- a/lib/internal/Zend/Validator/Barcode/Ean8.php
+++ b/lib/internal/Zend/Validator/Barcode/Ean8.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Ean8 extends AbstractAdapter
 {
diff --git a/lib/internal/Zend/Validator/Barcode/Gtin12.php b/lib/internal/Zend/Validator/Barcode/Gtin12.php
index 2490969bad88fcc7ab85e1bfa03b224359dbd23e..046b6e3bef81b4037f172dd6fa9a291c819430bd 100644
--- a/lib/internal/Zend/Validator/Barcode/Gtin12.php
+++ b/lib/internal/Zend/Validator/Barcode/Gtin12.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Gtin12 extends AbstractAdapter
 {
diff --git a/lib/internal/Zend/Validator/Barcode/Gtin13.php b/lib/internal/Zend/Validator/Barcode/Gtin13.php
index cdc233d205af48a2853588d121e10034bf1af451..cc97a4a9c393b7a14cd406558adb08be6f0a3305 100644
--- a/lib/internal/Zend/Validator/Barcode/Gtin13.php
+++ b/lib/internal/Zend/Validator/Barcode/Gtin13.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Gtin13 extends AbstractAdapter
 {
diff --git a/lib/internal/Zend/Validator/Barcode/Gtin14.php b/lib/internal/Zend/Validator/Barcode/Gtin14.php
index 9dc9639d6725f575fffa29b099acf4c6afd36170..3e837d32c49925d6725fee2fe98fb0c067b39720 100644
--- a/lib/internal/Zend/Validator/Barcode/Gtin14.php
+++ b/lib/internal/Zend/Validator/Barcode/Gtin14.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Gtin14 extends AbstractAdapter
 {
diff --git a/lib/internal/Zend/Validator/Barcode/Identcode.php b/lib/internal/Zend/Validator/Barcode/Identcode.php
index 60ff77fc4c8e5909c4046f430fd222802ccab0d5..e4e8e050f036e46e26f6b60d0f671659856f2c2e 100644
--- a/lib/internal/Zend/Validator/Barcode/Identcode.php
+++ b/lib/internal/Zend/Validator/Barcode/Identcode.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Identcode extends AbstractAdapter
 {
diff --git a/lib/internal/Zend/Validator/Barcode/Intelligentmail.php b/lib/internal/Zend/Validator/Barcode/Intelligentmail.php
index 6dd31f001a75cff27ed714e556277ea06784b8e1..d301605eac1e78973b347000c6297372faccc24a 100644
--- a/lib/internal/Zend/Validator/Barcode/Intelligentmail.php
+++ b/lib/internal/Zend/Validator/Barcode/Intelligentmail.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Intelligentmail extends AbstractAdapter
 {
diff --git a/lib/internal/Zend/Validator/Barcode/Issn.php b/lib/internal/Zend/Validator/Barcode/Issn.php
index d2b0a531e15e1743363863a8d9297f70a7904c40..283885df60b798e659e59921148b48ef5d928ed1 100644
--- a/lib/internal/Zend/Validator/Barcode/Issn.php
+++ b/lib/internal/Zend/Validator/Barcode/Issn.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Issn extends AbstractAdapter
 {
diff --git a/lib/internal/Zend/Validator/Barcode/Itf14.php b/lib/internal/Zend/Validator/Barcode/Itf14.php
index 51e6166e2a59889d35dc6c02f16606308c3cf454..e2fef44b09958520d879af90f1ec4f0f1862317f 100644
--- a/lib/internal/Zend/Validator/Barcode/Itf14.php
+++ b/lib/internal/Zend/Validator/Barcode/Itf14.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Itf14 extends AbstractAdapter
 {
diff --git a/lib/internal/Zend/Validator/Barcode/Leitcode.php b/lib/internal/Zend/Validator/Barcode/Leitcode.php
index 6a069b0c37a643a8b92178dbfb05dbcca98227ab..d2f5528fa2d822475df4b61a707e94e69895bb80 100644
--- a/lib/internal/Zend/Validator/Barcode/Leitcode.php
+++ b/lib/internal/Zend/Validator/Barcode/Leitcode.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Leitcode extends AbstractAdapter
 {
diff --git a/lib/internal/Zend/Validator/Barcode/Planet.php b/lib/internal/Zend/Validator/Barcode/Planet.php
index 71eb79c492f73b88b27c8cbd87ecee974c754098..041df19ba899ef227ab3d62573b867354a880690 100644
--- a/lib/internal/Zend/Validator/Barcode/Planet.php
+++ b/lib/internal/Zend/Validator/Barcode/Planet.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Planet extends AbstractAdapter
 {
diff --git a/lib/internal/Zend/Validator/Barcode/Postnet.php b/lib/internal/Zend/Validator/Barcode/Postnet.php
index a9a97d5cfd9ba0b43f6007f5f53c63c992d79111..b11992672d0a49376808cb0ccf4d45eaa4b81108 100644
--- a/lib/internal/Zend/Validator/Barcode/Postnet.php
+++ b/lib/internal/Zend/Validator/Barcode/Postnet.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Postnet extends AbstractAdapter
 {
diff --git a/lib/internal/Zend/Validator/Barcode/Royalmail.php b/lib/internal/Zend/Validator/Barcode/Royalmail.php
index 78beea2d6c8a4c5821298eda38a63509af119789..079c670fbe81a6517485bcaa93ff8fe02a710534 100644
--- a/lib/internal/Zend/Validator/Barcode/Royalmail.php
+++ b/lib/internal/Zend/Validator/Barcode/Royalmail.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Royalmail extends AbstractAdapter
 {
diff --git a/lib/internal/Zend/Validator/Barcode/Sscc.php b/lib/internal/Zend/Validator/Barcode/Sscc.php
index 1234034394673ada075856aab37c07b38b2ed14c..56dbbe102cee3272fd6926071cc678995411d954 100644
--- a/lib/internal/Zend/Validator/Barcode/Sscc.php
+++ b/lib/internal/Zend/Validator/Barcode/Sscc.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Sscc extends AbstractAdapter
 {
diff --git a/lib/internal/Zend/Validator/Barcode/Upca.php b/lib/internal/Zend/Validator/Barcode/Upca.php
index 72edb4416212ac38643df8a029d793f5074ec2ff..461af71f0c591e74a2e339ccd9eaf62e909e0884 100644
--- a/lib/internal/Zend/Validator/Barcode/Upca.php
+++ b/lib/internal/Zend/Validator/Barcode/Upca.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Upca extends AbstractAdapter
 {
diff --git a/lib/internal/Zend/Validator/Barcode/Upce.php b/lib/internal/Zend/Validator/Barcode/Upce.php
index f69dfc2ec3bb4220bfec48adcd0421102951f999..57dd4b6898d97a9a9651886e64d872f3e207b1f3 100644
--- a/lib/internal/Zend/Validator/Barcode/Upce.php
+++ b/lib/internal/Zend/Validator/Barcode/Upce.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Barcode;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Upce extends AbstractAdapter
 {
diff --git a/lib/internal/Zend/Validator/Between.php b/lib/internal/Zend/Validator/Between.php
index 9e2c3e78f4595b0181177eda43198c8e19098174..069a4687bc7e961138d5bd398ee00194a313361c 100644
--- a/lib/internal/Zend/Validator/Between.php
+++ b/lib/internal/Zend/Validator/Between.php
@@ -15,7 +15,7 @@ use Zend\Stdlib\ArrayUtils;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Between extends AbstractValidator
 {
diff --git a/lib/internal/Zend/Validator/Callback.php b/lib/internal/Zend/Validator/Callback.php
index d1dd91cb252567a711f74703b79c2c40fe194020..e46e11e0b32c8e9cac07de5cb6669a4c67cd1176 100644
--- a/lib/internal/Zend/Validator/Callback.php
+++ b/lib/internal/Zend/Validator/Callback.php
@@ -12,7 +12,7 @@ namespace Zend\Validator;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Callback extends AbstractValidator
 {
diff --git a/lib/internal/Zend/Validator/CreditCard.php b/lib/internal/Zend/Validator/CreditCard.php
index 406a3b445e4712e4692d73772afed95e2e164cbd..5f6e79d3ee228c20bc749cf7e3f92b39ce72eb29 100644
--- a/lib/internal/Zend/Validator/CreditCard.php
+++ b/lib/internal/Zend/Validator/CreditCard.php
@@ -15,7 +15,7 @@ use Zend\Stdlib\ArrayUtils;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class CreditCard extends AbstractValidator
 {
diff --git a/lib/internal/Zend/Validator/Date.php b/lib/internal/Zend/Validator/Date.php
index c2b12ca54ed8743e7741f95656cef72acea0881d..46fcd8956b04815b6ed28840970fc4bc8a0c16ef 100644
--- a/lib/internal/Zend/Validator/Date.php
+++ b/lib/internal/Zend/Validator/Date.php
@@ -15,7 +15,7 @@ use Traversable;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Date extends AbstractValidator
 {
@@ -128,7 +128,11 @@ class Date extends AbstractValidator
             // and still return a DateTime object
             $errors = DateTime::getLastErrors();
 
-            if (false === $date || $errors['warning_count'] > 0) {
+            if ($errors['warning_count'] > 0) {
+                $this->error(self::INVALID_DATE);
+                return false;
+            }
+            if ($date === false) {
                 $this->error(self::INVALID_DATE);
                 return false;
             }
diff --git a/lib/internal/Zend/Validator/DateStep.php b/lib/internal/Zend/Validator/DateStep.php
index 84b1b2a4d3aa38fbdfd5b57746b99095338074d4..5cf745e124ccfcdcc22d4de9f3f4903e43f524e0 100644
--- a/lib/internal/Zend/Validator/DateStep.php
+++ b/lib/internal/Zend/Validator/DateStep.php
@@ -19,20 +19,16 @@ use Zend\Validator\Exception;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
-class DateStep extends AbstractValidator
+class DateStep extends Date
 {
-    const INVALID      = 'dateStepInvalid';
-    const INVALID_DATE = 'dateStepInvalidDate';
     const NOT_STEP     = 'dateStepNotStep';
 
     /**
      * @var array
      */
     protected $messageTemplates = array(
-        self::INVALID      => "Invalid type given. String, integer, array or DateTime expected",
-        self::INVALID_DATE => "The input does not appear to be a valid date",
         self::NOT_STEP     => "The input is not a valid step"
     );
 
@@ -155,28 +151,6 @@ class DateStep extends AbstractValidator
         return $this->step;
     }
 
-    /**
-     * Returns the format option
-     *
-     * @return string
-     */
-    public function getFormat()
-    {
-        return $this->format;
-    }
-
-    /**
-     * Sets the format option
-     *
-     * @param  string $format
-     * @return DateStep
-     */
-    public function setFormat($format)
-    {
-        $this->format = $format;
-        return $this;
-    }
-
     /**
      * Returns the timezone option
      *
@@ -241,13 +215,7 @@ class DateStep extends AbstractValidator
      */
     public function isValid($value)
     {
-        if (!is_string($value)
-            && !is_int($value)
-            && !($value instanceof DateTime)
-        ) {
-            $this->error(self::INVALID);
-            return false;
-        }
+        parent::isValid($value);
 
         $this->setValue($value);
 
@@ -258,7 +226,6 @@ class DateStep extends AbstractValidator
         try {
             $valueDate = $this->convertToDateTime($value);
         } catch (Exception\InvalidArgumentException $ex) {
-            $this->error(self::INVALID_DATE);
             return false;
         }
 
@@ -281,7 +248,7 @@ class DateStep extends AbstractValidator
             foreach ($intervalParts as $key => $value) {
                 if (0 != $value) {
                     $intervalUnit = $key;
-                    $stepValue    = (int)$value;
+                    $stepValue    = (int) $value;
                     break;
                 }
             }
diff --git a/lib/internal/Zend/Validator/Db/AbstractDb.php b/lib/internal/Zend/Validator/Db/AbstractDb.php
index 476aac362ac1830f5b7299dd6e4dbab4848e2949..dcc7d566d8fa05a7a82492e3db268af3436cab96 100644
--- a/lib/internal/Zend/Validator/Db/AbstractDb.php
+++ b/lib/internal/Zend/Validator/Db/AbstractDb.php
@@ -23,7 +23,7 @@ use Zend\Validator\Exception;
  * Class for Database record validation
  *
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 abstract class AbstractDb extends AbstractValidator
 {
diff --git a/lib/internal/Zend/Validator/Db/NoRecordExists.php b/lib/internal/Zend/Validator/Db/NoRecordExists.php
index ed42d1f34baf860944de8223a31acebdafec8d5a..b2a1ba9c1fd366e72f2f40173726bc34f357e173 100644
--- a/lib/internal/Zend/Validator/Db/NoRecordExists.php
+++ b/lib/internal/Zend/Validator/Db/NoRecordExists.php
@@ -16,7 +16,7 @@ use Zend\Validator\Exception;
  * Confirms a record does not exist in a table.
  *
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class NoRecordExists extends AbstractDb
 {
diff --git a/lib/internal/Zend/Validator/Db/RecordExists.php b/lib/internal/Zend/Validator/Db/RecordExists.php
index 1a0d41ab61d173bb91e341b821c1f06f13a0908d..8a8a68d8a486b88a48ed9bc1fdd193bc870f8af7 100644
--- a/lib/internal/Zend/Validator/Db/RecordExists.php
+++ b/lib/internal/Zend/Validator/Db/RecordExists.php
@@ -16,7 +16,7 @@ use Zend\Validator\Exception;
  * Confirms a record exists in a table.
  *
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class RecordExists extends AbstractDb
 {
diff --git a/lib/internal/Zend/Validator/Digits.php b/lib/internal/Zend/Validator/Digits.php
index f95cf57ba9a764f7b336ac69a577839c265dff80..10043b2a004ab1aca963b9557ae4eeeac118639e 100644
--- a/lib/internal/Zend/Validator/Digits.php
+++ b/lib/internal/Zend/Validator/Digits.php
@@ -14,7 +14,7 @@ use Zend\Filter\Digits as DigitsFilter;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Digits extends AbstractValidator
 {
diff --git a/lib/internal/Zend/Validator/EmailAddress.php b/lib/internal/Zend/Validator/EmailAddress.php
index 67a31d9e7f475cb9d930da9c5d8d76a547332278..03e2fa38f138166fe71d3ef33fd188f6fe78e274 100644
--- a/lib/internal/Zend/Validator/EmailAddress.php
+++ b/lib/internal/Zend/Validator/EmailAddress.php
@@ -12,7 +12,7 @@ namespace Zend\Validator;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class EmailAddress extends AbstractValidator
 {
@@ -486,7 +486,7 @@ class EmailAddress extends AbstractValidator
     }
 
     /**
-     * Defined by Zend_Validate_Interface
+     * Defined by Zend\Validator\ValidatorInterface
      *
      * Returns true if and only if $value is a valid email address
      * according to RFC2822
diff --git a/lib/internal/Zend/Validator/Exception/ExceptionInterface.php b/lib/internal/Zend/Validator/Exception/ExceptionInterface.php
index 3bad3ac22c60fa1f3f295b11b22f6f34ce1ee944..b73a1722de24206c282a1df10b99088b8728bb6c 100644
--- a/lib/internal/Zend/Validator/Exception/ExceptionInterface.php
+++ b/lib/internal/Zend/Validator/Exception/ExceptionInterface.php
@@ -12,7 +12,7 @@ namespace Zend\Validator\Exception;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 interface ExceptionInterface
 {}
diff --git a/lib/internal/Zend/Validator/Explode.php b/lib/internal/Zend/Validator/Explode.php
index 56c8876c6cc72f925433ea072801f21bcd0963b1..9d927b597ab3b4a8bcd02c6feb90c31e734b9bb9 100644
--- a/lib/internal/Zend/Validator/Explode.php
+++ b/lib/internal/Zend/Validator/Explode.php
@@ -12,7 +12,7 @@ namespace Zend\Validator;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Explode extends AbstractValidator
 {
@@ -112,7 +112,7 @@ class Explode extends AbstractValidator
     }
 
     /**
-     * Defined by Zend_Validate_Interface
+     * Defined by Zend\Validator\ValidatorInterface
      *
      * Returns true if all values validate true
      *
diff --git a/lib/internal/Zend/Validator/File/Count.php b/lib/internal/Zend/Validator/File/Count.php
index dbc82dcf2c1b1fd43801eac488c353f3040e24f9..2737f086f9625ad71cfbc02734c1780ef0333263 100644
--- a/lib/internal/Zend/Validator/File/Count.php
+++ b/lib/internal/Zend/Validator/File/Count.php
@@ -17,7 +17,7 @@ use Zend\Validator\Exception;
  * Validator for counting all given files
  *
  * @category  Zend
- * @package   Zend_Validate
+ * @package   Zend_Validator
  */
 class Count extends AbstractValidator
 {
diff --git a/lib/internal/Zend/Validator/File/Crc32.php b/lib/internal/Zend/Validator/File/Crc32.php
index cf55b00554751871e3019e17be407f841b01013e..2103e15e11ff7b55cf6bf159e91a5bca38357553 100644
--- a/lib/internal/Zend/Validator/File/Crc32.php
+++ b/lib/internal/Zend/Validator/File/Crc32.php
@@ -14,7 +14,7 @@ namespace Zend\Validator\File;
  * Validator for the crc32 hash of given files
  *
  * @category  Zend
- * @package   Zend_Validate
+ * @package   Zend_Validator
  */
 class Crc32 extends Hash
 {
diff --git a/lib/internal/Zend/Validator/File/ExcludeExtension.php b/lib/internal/Zend/Validator/File/ExcludeExtension.php
index 57938d9416468116649d4c068ecce77942cb32c6..0ac8d6e38fda578d365c1331121bda2ae6f607a9 100644
--- a/lib/internal/Zend/Validator/File/ExcludeExtension.php
+++ b/lib/internal/Zend/Validator/File/ExcludeExtension.php
@@ -14,7 +14,7 @@ namespace Zend\Validator\File;
  * Validator for the excluding file extensions
  *
  * @category  Zend
- * @package   Zend_Validate
+ * @package   Zend_Validator
  */
 class ExcludeExtension extends Extension
 {
diff --git a/lib/internal/Zend/Validator/File/ExcludeMimeType.php b/lib/internal/Zend/Validator/File/ExcludeMimeType.php
index 62c086ae1640a24c6edaec4fdee125b909abf1c1..a94124c58cf7e269d2f4e5632fb13e3d58a59598 100644
--- a/lib/internal/Zend/Validator/File/ExcludeMimeType.php
+++ b/lib/internal/Zend/Validator/File/ExcludeMimeType.php
@@ -16,7 +16,7 @@ use finfo;
  * Validator for the mime type of a file
  *
  * @category  Zend
- * @package   Zend_Validate
+ * @package   Zend_Validator
  */
 class ExcludeMimeType extends MimeType
 {
diff --git a/lib/internal/Zend/Validator/File/Exists.php b/lib/internal/Zend/Validator/File/Exists.php
index 7631df7e4da0f8b145f5411835cc71b49a6fe38b..52b47ed0d4c3cae39dc0988d4eaa23fce8a9b469 100644
--- a/lib/internal/Zend/Validator/File/Exists.php
+++ b/lib/internal/Zend/Validator/File/Exists.php
@@ -17,7 +17,7 @@ use Zend\Validator\Exception;
  * Validator which checks if the file already exists in the directory
  *
  * @category  Zend
- * @package   Zend_Validate
+ * @package   Zend_Validator
  */
 class Exists extends AbstractValidator
 {
diff --git a/lib/internal/Zend/Validator/File/Extension.php b/lib/internal/Zend/Validator/File/Extension.php
index 8b59d503f123914e928e6e7ad4ab33e9106c1fe9..567d35f1db0f67c9e4d71d0a42a9bbf52ec68aed 100644
--- a/lib/internal/Zend/Validator/File/Extension.php
+++ b/lib/internal/Zend/Validator/File/Extension.php
@@ -18,7 +18,7 @@ use Zend\Validator\AbstractValidator;
  * Validator for the file extension of a file
  *
  * @category  Zend
- * @package   Zend_Validate
+ * @package   Zend_Validator
  */
 class Extension extends AbstractValidator
 {
diff --git a/lib/internal/Zend/Validator/File/FilesSize.php b/lib/internal/Zend/Validator/File/FilesSize.php
index 511e466eadcf104b04b0c81ae922cd8da9838c4c..a7be3735efaf7669336950c83115935119769a14 100644
--- a/lib/internal/Zend/Validator/File/FilesSize.php
+++ b/lib/internal/Zend/Validator/File/FilesSize.php
@@ -19,7 +19,7 @@ use Zend\Validator\Exception;
  * Validator for the size of all files which will be validated in sum
  *
  * @category  Zend
- * @package   Zend_Validate
+ * @package   Zend_Validator
  */
 class FilesSize extends Size
 {
diff --git a/lib/internal/Zend/Validator/File/Hash.php b/lib/internal/Zend/Validator/File/Hash.php
index d51efe04d90c07aa54dcb46830d417e62b8e80ec..b7a56a3f56f6b75069596f2bd7fd4ea5b4227d78 100644
--- a/lib/internal/Zend/Validator/File/Hash.php
+++ b/lib/internal/Zend/Validator/File/Hash.php
@@ -17,7 +17,7 @@ use Zend\Validator\Exception;
  * Validator for the hash of given files
  *
  * @category  Zend
- * @package   Zend_Validate
+ * @package   Zend_Validator
  */
 class Hash extends AbstractValidator
 {
diff --git a/lib/internal/Zend/Validator/File/ImageSize.php b/lib/internal/Zend/Validator/File/ImageSize.php
index 70dfdc6b4d10564da4444f1e2f7d8d69420d6ee4..337b49dadad32e72f08af6007270d3f50ea3074e 100644
--- a/lib/internal/Zend/Validator/File/ImageSize.php
+++ b/lib/internal/Zend/Validator/File/ImageSize.php
@@ -18,7 +18,7 @@ use Zend\Validator\Exception;
  * Validator for the image size of a image file
  *
  * @category  Zend
- * @package   Zend_Validate
+ * @package   Zend_Validator
  */
 class ImageSize extends AbstractValidator
 {
diff --git a/lib/internal/Zend/Validator/File/IsCompressed.php b/lib/internal/Zend/Validator/File/IsCompressed.php
index 19656492166db54ce40320d32df316ef1b7c60c8..3710b375a4c33fb2fbf549507f6350bdc4f36b13 100644
--- a/lib/internal/Zend/Validator/File/IsCompressed.php
+++ b/lib/internal/Zend/Validator/File/IsCompressed.php
@@ -17,7 +17,7 @@ use Zend\Stdlib\ArrayUtils;
  * Validator which checks if the file already exists in the directory
  *
  * @category  Zend
- * @package   Zend_Validate
+ * @package   Zend_Validator
  */
 class IsCompressed extends MimeType
 {
diff --git a/lib/internal/Zend/Validator/File/IsImage.php b/lib/internal/Zend/Validator/File/IsImage.php
index 9acb63e3d7b3af78b87ab7b7f6c592610b011a25..537ed44ed9c6d6cb28c4d50dfaa941c38b181e15 100644
--- a/lib/internal/Zend/Validator/File/IsImage.php
+++ b/lib/internal/Zend/Validator/File/IsImage.php
@@ -17,7 +17,7 @@ use Zend\Stdlib\ArrayUtils;
  * Validator which checks if the file already exists in the directory
  *
  * @category  Zend
- * @package   Zend_Validate
+ * @package   Zend_Validator
  */
 class IsImage extends MimeType
 {
diff --git a/lib/internal/Zend/Validator/File/Md5.php b/lib/internal/Zend/Validator/File/Md5.php
index 38bbf4323b8eed8dbd160d8963c78d9d7277924f..b32ba53ea157c2f0693fcdb4f7a6d8730cfae9f2 100644
--- a/lib/internal/Zend/Validator/File/Md5.php
+++ b/lib/internal/Zend/Validator/File/Md5.php
@@ -14,7 +14,7 @@ namespace Zend\Validator\File;
  * Validator for the md5 hash of given files
  *
  * @category  Zend
- * @package   Zend_Validate
+ * @package   Zend_Validator
  */
 class Md5 extends Hash
 {
diff --git a/lib/internal/Zend/Validator/File/MimeType.php b/lib/internal/Zend/Validator/File/MimeType.php
index cc4ffff6428b473126aabc6ce9dfe4fe9e4df4ac..1f1a536995a2a910b33f982e29171d879e9f73d2 100644
--- a/lib/internal/Zend/Validator/File/MimeType.php
+++ b/lib/internal/Zend/Validator/File/MimeType.php
@@ -20,7 +20,7 @@ use Zend\Validator\Exception;
  * Validator for the mime type of a file
  *
  * @category  Zend
- * @package   Zend_Validate
+ * @package   Zend_Validator
  */
 class MimeType extends AbstractValidator
 {
@@ -339,7 +339,7 @@ class MimeType extends AbstractValidator
     }
 
     /**
-     * Defined by Zend_Validate_Interface
+     * Defined by Zend\Validator\ValidatorInterface
      *
      * Returns true if the mimetype of the file matches the given ones. Also parts
      * of mimetypes can be checked. If you give for example "image" all image
diff --git a/lib/internal/Zend/Validator/File/NotExists.php b/lib/internal/Zend/Validator/File/NotExists.php
index 6ffc314807e7f251201320d3ed49fb77a4110cd7..ca40f46b8745b626f9d4cee7dd0033579ba9b8df 100644
--- a/lib/internal/Zend/Validator/File/NotExists.php
+++ b/lib/internal/Zend/Validator/File/NotExists.php
@@ -14,7 +14,7 @@ namespace Zend\Validator\File;
  * Validator which checks if the destination file does not exist
  *
  * @category  Zend
- * @package   Zend_Validate
+ * @package   Zend_Validator
  */
 class NotExists extends Exists
 {
diff --git a/lib/internal/Zend/Validator/File/Sha1.php b/lib/internal/Zend/Validator/File/Sha1.php
index c76a7a7e41d698dc059bad38a59f10ab3a65dee4..72e37f16e39d0cbeef03c09627d035131d4d16b7 100644
--- a/lib/internal/Zend/Validator/File/Sha1.php
+++ b/lib/internal/Zend/Validator/File/Sha1.php
@@ -10,13 +10,12 @@
 
 namespace Zend\Validator\File;
 
-use Zend\Validator\Exception;
 
 /**
  * Validator for the sha1 hash of given files
  *
  * @category  Zend
- * @package   Zend_Validate
+ * @package   Zend_Validator
  */
 class Sha1 extends Hash
 {
diff --git a/lib/internal/Zend/Validator/File/Size.php b/lib/internal/Zend/Validator/File/Size.php
index 858876a39a7989fdadd98d766b9032ada10b920e..96aae1688981b28781256e7623d425807d95d21a 100644
--- a/lib/internal/Zend/Validator/File/Size.php
+++ b/lib/internal/Zend/Validator/File/Size.php
@@ -18,7 +18,7 @@ use Zend\Validator\Exception;
  * Validator for the maximum size of a file up to a max of 2GB
  *
  * @category  Zend
- * @package   Zend_Validate
+ * @package   Zend_Validator
  */
 class Size extends AbstractValidator
 {
diff --git a/lib/internal/Zend/Validator/File/Upload.php b/lib/internal/Zend/Validator/File/Upload.php
index 59c3846fe39b98f11995e4cec1f8c4ad91c2c97e..dc9e55bf6de88d39d725b135460aede561f88674 100644
--- a/lib/internal/Zend/Validator/File/Upload.php
+++ b/lib/internal/Zend/Validator/File/Upload.php
@@ -17,7 +17,7 @@ use Zend\Validator\Exception;
  * Validator for the maximum size of a file up to a max of 2GB
  *
  * @category  Zend
- * @package   Zend_Validate
+ * @package   Zend_Validator
  */
 class Upload extends AbstractValidator
 {
diff --git a/lib/internal/Zend/Validator/File/WordCount.php b/lib/internal/Zend/Validator/File/WordCount.php
index 48a0fc2cb5d27a0dcbb223681c5292c450b6909a..4587d9ce9d730db7075e1cb9c4a27279f5e1d9aa 100644
--- a/lib/internal/Zend/Validator/File/WordCount.php
+++ b/lib/internal/Zend/Validator/File/WordCount.php
@@ -14,7 +14,7 @@ namespace Zend\Validator\File;
  * Validator for counting all words in a file
  *
  * @category  Zend
- * @package   Zend_Validate
+ * @package   Zend_Validator
  */
 class WordCount extends Count
 {
diff --git a/lib/internal/Zend/Validator/GreaterThan.php b/lib/internal/Zend/Validator/GreaterThan.php
index 38be082f796110adc2ea3e424dbf29041adc86bb..31a3254c06c9bdfbd558b4649d6743a5ff55a8dc 100644
--- a/lib/internal/Zend/Validator/GreaterThan.php
+++ b/lib/internal/Zend/Validator/GreaterThan.php
@@ -15,7 +15,7 @@ use Zend\Stdlib\ArrayUtils;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class GreaterThan extends AbstractValidator
 {
diff --git a/lib/internal/Zend/Validator/Hex.php b/lib/internal/Zend/Validator/Hex.php
index 8aaf75deb8134eab351b856024868def8128053e..320f655ad9e498fd8266ae314e0418045d33d321 100644
--- a/lib/internal/Zend/Validator/Hex.php
+++ b/lib/internal/Zend/Validator/Hex.php
@@ -12,7 +12,7 @@ namespace Zend\Validator;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Hex extends AbstractValidator
 {
diff --git a/lib/internal/Zend/Validator/Hostname/Biz.php b/lib/internal/Zend/Validator/Hostname/Biz.php
index 54b9ea50cc0c21a03311a7b7388acbe8392b1a82..365f5a20b2e54128429a18ae2d0333197223faf2 100644
--- a/lib/internal/Zend/Validator/Hostname/Biz.php
+++ b/lib/internal/Zend/Validator/Hostname/Biz.php
@@ -14,7 +14,7 @@ namespace Zend\Validator\Hostname;
  * Resource file for biz idn validation
  *
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 return array(
     1  => '/^[\x{002d}0-9a-zäåæéöøü]{1,63}$/iu',
diff --git a/lib/internal/Zend/Validator/Hostname/Cn.php b/lib/internal/Zend/Validator/Hostname/Cn.php
index efb14b1261585430bca16a431c5528fc1fab57f0..8552817f157286bba315a822db2d234bdd799c81 100644
--- a/lib/internal/Zend/Validator/Hostname/Cn.php
+++ b/lib/internal/Zend/Validator/Hostname/Cn.php
@@ -14,7 +14,7 @@ namespace Zend\Validator\Hostname;
  * Resource file for chinese idn validation
  *
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 return array(
     1  => '/^[\x{002d}0-9a-z\x{3447}\x{3473}\x{359E}\x{360E}\x{361A}\x{3918}\x{396E}\x{39CF}\x{39D0}' .
diff --git a/lib/internal/Zend/Validator/Hostname/Com.php b/lib/internal/Zend/Validator/Hostname/Com.php
index 8fe41e0164e272723187a4ff6fd6776bdda33df9..9d7382d5e646d71226e94280ae867159bda04d9a 100644
--- a/lib/internal/Zend/Validator/Hostname/Com.php
+++ b/lib/internal/Zend/Validator/Hostname/Com.php
@@ -14,7 +14,7 @@ namespace Zend\Validator\Hostname;
  * Resource file for com and net idn validation
  *
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 return array(
     1  => '/^[\x{002d}0-9\x{0400}-\x{052f}]{1,63}$/iu',
diff --git a/lib/internal/Zend/Validator/Hostname/Jp.php b/lib/internal/Zend/Validator/Hostname/Jp.php
index 50a4856dbceb5373058ebd649434fd9ca62c39d8..fb31f20644f703745e839fe263d09eaa50020d41 100644
--- a/lib/internal/Zend/Validator/Hostname/Jp.php
+++ b/lib/internal/Zend/Validator/Hostname/Jp.php
@@ -14,7 +14,7 @@ namespace Zend\Validator\Hostname;
  * Resource file for japanese idn validation
  *
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 return array(
     1  => '/^[\x{002d}0-9a-z\x{3005}-\x{3007}\x{3041}-\x{3093}\x{309D}\x{309E}' .
diff --git a/lib/internal/Zend/Validator/Iban.php b/lib/internal/Zend/Validator/Iban.php
index c7d9e4b716e96b2c4edd8150d57df7f13442b68f..2eb30aebd25227d6c739e5be35958a927e5643ee 100644
--- a/lib/internal/Zend/Validator/Iban.php
+++ b/lib/internal/Zend/Validator/Iban.php
@@ -19,7 +19,7 @@ use Zend\Validator\Exception;
  * Validates IBAN Numbers (International Bank Account Numbers)
  *
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Iban extends AbstractValidator
 {
@@ -226,7 +226,7 @@ class Iban extends AbstractValidator
             return false;
         }
 
-        $value = strtoupper($value);
+        $value = str_replace(' ', '', strtoupper($value));
         $this->setValue($value);
 
         $countryCode = $this->getCountryCode();
diff --git a/lib/internal/Zend/Validator/Identical.php b/lib/internal/Zend/Validator/Identical.php
index 20afe737ae587dd05c1c101f29a913a10091ce1d..56550bab1c8ad3ecceb2b6d13e1a58b3b00d4a84 100644
--- a/lib/internal/Zend/Validator/Identical.php
+++ b/lib/internal/Zend/Validator/Identical.php
@@ -15,7 +15,7 @@ use Zend\Stdlib\ArrayUtils;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Identical extends AbstractValidator
 {
diff --git a/lib/internal/Zend/Validator/InArray.php b/lib/internal/Zend/Validator/InArray.php
index 8e89775e3e64aa33649dd38cb5deed637738f182..aee741d1df9536ac9cd727121d8461449d0ac323 100644
--- a/lib/internal/Zend/Validator/InArray.php
+++ b/lib/internal/Zend/Validator/InArray.php
@@ -15,7 +15,7 @@ use RecursiveIteratorIterator;
 
 /**
  * @category Zend
- * @package  Zend_Validate
+ * @package  Zend_Validator
  */
 class InArray extends AbstractValidator
 {
diff --git a/lib/internal/Zend/Validator/Ip.php b/lib/internal/Zend/Validator/Ip.php
index c64573ede799eeeb1c8d77e91a0e7abd4c2b2495..24bba30a14bd9b225ebdf88789e2f1e5bb4cf28d 100644
--- a/lib/internal/Zend/Validator/Ip.php
+++ b/lib/internal/Zend/Validator/Ip.php
@@ -11,11 +11,10 @@
 namespace Zend\Validator;
 
 use Traversable;
-use Zend\Stdlib\ArrayUtils;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Ip extends AbstractValidator
 {
@@ -184,7 +183,7 @@ class Ip extends AbstractValidator
          */
         static $regex = '/^v([[:xdigit:]]+)\.[[:alnum:]\-\._~!\$&\'\(\)\*\+,;=:]+$/';
 
-        $result = (bool)preg_match($regex, $value, $matches);
+        $result = (bool) preg_match($regex, $value, $matches);
 
         /*
          * "As such, implementations must not provide the version flag for the
diff --git a/lib/internal/Zend/Validator/Isbn.php b/lib/internal/Zend/Validator/Isbn.php
index 1550083a9f9263fe4a000f1549715c0a10c5e55d..2be59e7d50470469e2779bdf852c20e63e1dc60e 100644
--- a/lib/internal/Zend/Validator/Isbn.php
+++ b/lib/internal/Zend/Validator/Isbn.php
@@ -12,7 +12,7 @@ namespace Zend\Validator;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Isbn extends AbstractValidator
 {
diff --git a/lib/internal/Zend/Validator/LessThan.php b/lib/internal/Zend/Validator/LessThan.php
index c29a2c3781efd99c91aaa43c8da35bec5b44f244..90bcb5f3211f3fde5fdee4a6150f291a219bce3a 100644
--- a/lib/internal/Zend/Validator/LessThan.php
+++ b/lib/internal/Zend/Validator/LessThan.php
@@ -15,7 +15,7 @@ use Zend\Stdlib\ArrayUtils;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class LessThan extends AbstractValidator
 {
diff --git a/lib/internal/Zend/Validator/NotEmpty.php b/lib/internal/Zend/Validator/NotEmpty.php
index 1c4c379de5f54c18782220f367ffb533b0f7c566..137cddfd008191e01b0e9358de3638b5ed5f6548 100644
--- a/lib/internal/Zend/Validator/NotEmpty.php
+++ b/lib/internal/Zend/Validator/NotEmpty.php
@@ -15,7 +15,7 @@ use Zend\Stdlib\ArrayUtils;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class NotEmpty extends AbstractValidator
 {
diff --git a/lib/internal/Zend/Validator/Regex.php b/lib/internal/Zend/Validator/Regex.php
index e4ced1dddf2750ee5cf8d572201af36ee2952534..c7f9a4ba7bff9fa45fb749ec2f9c95697426860f 100644
--- a/lib/internal/Zend/Validator/Regex.php
+++ b/lib/internal/Zend/Validator/Regex.php
@@ -16,7 +16,7 @@ use Zend\Stdlib\ErrorHandler;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Regex extends AbstractValidator
 {
diff --git a/lib/internal/Zend/Validator/Sitemap/Changefreq.php b/lib/internal/Zend/Validator/Sitemap/Changefreq.php
index 66c7c7c9965959784c878fe5f2af4014713e14c5..c75958425af8f218a0653e42c3b67137fd925c45 100644
--- a/lib/internal/Zend/Validator/Sitemap/Changefreq.php
+++ b/lib/internal/Zend/Validator/Sitemap/Changefreq.php
@@ -18,7 +18,7 @@ use Zend\Validator\AbstractValidator;
  * @link       http://www.sitemaps.org/protocol.php Sitemaps XML format
  *
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  * @subpackage Sitemap
  */
 class Changefreq extends AbstractValidator
diff --git a/lib/internal/Zend/Validator/Sitemap/Lastmod.php b/lib/internal/Zend/Validator/Sitemap/Lastmod.php
index 8dd46046897400e8e07d23b4fa845430b2daf3cb..0339a5845e20eac3d2f6c20cb4a3f62f18a4ec39 100644
--- a/lib/internal/Zend/Validator/Sitemap/Lastmod.php
+++ b/lib/internal/Zend/Validator/Sitemap/Lastmod.php
@@ -19,7 +19,7 @@ use Zend\Validator\AbstractValidator;
  * @link       http://www.sitemaps.org/protocol.php Sitemaps XML format
  *
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  * @subpackage Sitemap
  */
 class Lastmod extends AbstractValidator
diff --git a/lib/internal/Zend/Validator/Sitemap/Loc.php b/lib/internal/Zend/Validator/Sitemap/Loc.php
index 6a200477ee6ab94fd2b9ceaa24eb0df2938e6575..1ae91711c12c079a011832c1555f821e3ad41e0c 100644
--- a/lib/internal/Zend/Validator/Sitemap/Loc.php
+++ b/lib/internal/Zend/Validator/Sitemap/Loc.php
@@ -20,7 +20,7 @@ use Zend\Validator\AbstractValidator;
  *
  * @see        Zend\Uri\Uri
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  * @subpackage Sitemap
  */
 class Loc extends AbstractValidator
diff --git a/lib/internal/Zend/Validator/Sitemap/Priority.php b/lib/internal/Zend/Validator/Sitemap/Priority.php
index 113069c56ef07033a5a0410e553dea1c886fe6f1..5a970d1c6c7ff8d12433c1d2272420e99c21f8de 100644
--- a/lib/internal/Zend/Validator/Sitemap/Priority.php
+++ b/lib/internal/Zend/Validator/Sitemap/Priority.php
@@ -18,7 +18,7 @@ use Zend\Validator\AbstractValidator;
  * @link       http://www.sitemaps.org/protocol.php Sitemaps XML format
  *
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  * @subpackage Sitemap
  */
 class Priority extends AbstractValidator
diff --git a/lib/internal/Zend/Validator/StaticValidator.php b/lib/internal/Zend/Validator/StaticValidator.php
index f7ddaab944eafb2a339c6fab2429835efa96bf14..0d9f0b25b1698e97d521ce0de90f5769fb19ec17 100644
--- a/lib/internal/Zend/Validator/StaticValidator.php
+++ b/lib/internal/Zend/Validator/StaticValidator.php
@@ -12,7 +12,7 @@ namespace Zend\Validator;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class StaticValidator
 {
diff --git a/lib/internal/Zend/Validator/Step.php b/lib/internal/Zend/Validator/Step.php
index e598607c52360144775acdf209eacae97331e3f6..6478ce98c9eda9a9dc2ae7f8f7e9fc4478544ef6 100644
--- a/lib/internal/Zend/Validator/Step.php
+++ b/lib/internal/Zend/Validator/Step.php
@@ -14,7 +14,7 @@ use Traversable;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Step extends AbstractValidator
 {
diff --git a/lib/internal/Zend/Validator/StringLength.php b/lib/internal/Zend/Validator/StringLength.php
index 781182c19e70e372519a85939277435eb1205455..1587c2458ea6f642f38a19ceb56873cba9acc541 100644
--- a/lib/internal/Zend/Validator/StringLength.php
+++ b/lib/internal/Zend/Validator/StringLength.php
@@ -12,7 +12,7 @@ namespace Zend\Validator;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class StringLength extends AbstractValidator
 {
diff --git a/lib/internal/Zend/Validator/Uri.php b/lib/internal/Zend/Validator/Uri.php
index 59ea3b472b8882a3c3be5496471878c85815f0b3..6cdc8c8e0fb75fee80143e3dcf3c899297a3573c 100644
--- a/lib/internal/Zend/Validator/Uri.php
+++ b/lib/internal/Zend/Validator/Uri.php
@@ -17,7 +17,7 @@ use Zend\Validator\Exception\InvalidArgumentException;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 class Uri extends AbstractValidator
 {
diff --git a/lib/internal/Zend/Validator/ValidatorInterface.php b/lib/internal/Zend/Validator/ValidatorInterface.php
index 3179e6a7377da0f7f964dd91268cd2157863a2a0..145f7535aa4b93ba5dcf567c14fbf280a2861990 100644
--- a/lib/internal/Zend/Validator/ValidatorInterface.php
+++ b/lib/internal/Zend/Validator/ValidatorInterface.php
@@ -12,7 +12,7 @@ namespace Zend\Validator;
 
 /**
  * @category   Zend
- * @package    Zend_Validate
+ * @package    Zend_Validator
  */
 interface ValidatorInterface
 {
diff --git a/lib/internal/Zend/Validator/ValidatorPluginManager.php b/lib/internal/Zend/Validator/ValidatorPluginManager.php
index 056486d9de31ba267354085714dbe1866bf8ff2b..cbed58bd5ab525e26e03801cb0fcbb4c454aab70 100644
--- a/lib/internal/Zend/Validator/ValidatorPluginManager.php
+++ b/lib/internal/Zend/Validator/ValidatorPluginManager.php
@@ -89,7 +89,7 @@ class ValidatorPluginManager extends AbstractPluginManager
         'greaterthan'              => 'Zend\Validator\GreaterThan',
         'hex'                      => 'Zend\Validator\Hex',
         'hostname'                 => 'Zend\Validator\Hostname',
-        'iban'                     => 'Zend\I18n\Validator\Iban',
+        'iban'                     => 'Zend\Validator\Iban',
         'identical'                => 'Zend\Validator\Identical',
         'inarray'                  => 'Zend\Validator\InArray',
         'int'                      => 'Zend\I18n\Validator\Int',
diff --git a/lib/internal/Zend/Validator/composer.json b/lib/internal/Zend/Validator/composer.json
index 015a02a2b04d055396d55f4c294c36295e9fc1d1..e2a0bffed04e402fe6e4785aee308fafe024f779 100644
--- a/lib/internal/Zend/Validator/composer.json
+++ b/lib/internal/Zend/Validator/composer.json
@@ -8,13 +8,14 @@
     ],
     "autoload": {
         "psr-0": {
-            "Zend\\Validator": ""
+            "Zend\\Validator\\": ""
         }
     },
     "target-dir": "Zend/Validator",
     "require": {
         "php": ">=5.3.3",
         "zendframework/zend-i18n": "self.version",
+        "zendframework/zend-servicemanager": "self.version",
         "zendframework/zend-stdlib": "self.version"
     },
     "require-dev": {
diff --git a/lib/web/app-config.js b/lib/web/app-config.js
index 33624b19c6896e203dd2aa294ea3bf5505aa31ec..2b3bda7d3f699c428faa74a53144fd8f5d7008c6 100644
--- a/lib/web/app-config.js
+++ b/lib/web/app-config.js
@@ -21,6 +21,7 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 require.config({
+    "waitSeconds":"0",
     "shim": {
         "jquery/bootstrap-carousel/jquery.bootstrap-carousel": ["jquery"], // no longer used
         "jquery/bootstrap-carousel/jquery.bootstrap-transition": ["jquery"], // no longer used
diff --git a/lib/web/css/docs/source/actions-toolbar.less b/lib/web/css/docs/source/actions-toolbar.less
index 2db4d8c8efab6326499da8fa40507f0cbbe4ed04..17dd72fac90b960b52ec71c6dc2e59655662da2e 100644
--- a/lib/web/css/docs/source/actions-toolbar.less
+++ b/lib/web/css/docs/source/actions-toolbar.less
@@ -391,7 +391,7 @@
     .actions-toolbar();
 }
 
-@media only screen and (max-width : @break-point-1) {
+@media only screen and (max-width: @screen-m) {
     .example-actions-toolbar-12 {
        .actions-toolbar-clear-floats();
     }
diff --git a/lib/web/css/docs/source/sections.less b/lib/web/css/docs/source/sections.less
index 25304a986d9dc38a38a393a3014f69df396740eb..e940bddb9ad9de97edd7dfcaccfe484161d9d990 100644
--- a/lib/web/css/docs/source/sections.less
+++ b/lib/web/css/docs/source/sections.less
@@ -523,7 +523,7 @@
     }
 }
 
-@media only screen and (max-width: @break-point-1) {
+@media only screen and (max-width: @screen-m) {
     .example-sections-4 {
         .data-accordion();
     }
diff --git a/lib/web/css/docs/source/tables.less b/lib/web/css/docs/source/tables.less
index 3044594a5eb716848220628e19e64915c8fd7a3e..e32732c546c284f39b2d945dc3fca36ba3779a82 100644
--- a/lib/web/css/docs/source/tables.less
+++ b/lib/web/css/docs/source/tables.less
@@ -1456,7 +1456,7 @@
     .table-hover();
 }
 
-@media only screen and (max-width : @break-point-1) {
+@media only screen and (max-width: @screen-m) {
     .example-table-14 {
         .table-overflow();
     }
@@ -1533,7 +1533,7 @@
     .table-hover();
 }
 
-@media only screen and (max-width : @break-point-1) {
+@media only screen and (max-width: @screen-m) {
     .example-table-15 {
         .table-responsive(
             @_table-bg-responsive: #fc0,
diff --git a/lib/web/css/source/lib/abstract.less b/lib/web/css/source/lib/abstract.less
index ad977b19d1dd96301be98a6f56cd27a0ee6f434c..ee29be2b227a05674145e857836529735be9fc59 100644
--- a/lib/web/css/source/lib/abstract.less
+++ b/lib/web/css/source/lib/abstract.less
@@ -22,7 +22,7 @@
 //  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 //  */
 
-.responsive(@break) when (@break = @break-point-1) {
+.responsive(@break) when (@break = @screen-m) {
     ._rwd_width {
         min-width: 0 !important;
         max-width: auto !important;
@@ -33,5 +33,5 @@
     }
 }
 
-.responsive-smaller(@break) when (@break = @break-point-0) {
+.responsive-smaller(@break) when (@break = @screen-s) {
 }
diff --git a/lib/web/css/source/lib/buttons.less b/lib/web/css/source/lib/buttons.less
index 6390d4280ed1fa29d5c585ef10abc7b3d30427d1..c004f2c967fb2f4fccb4fee19bff8c6a4d5ade79 100644
--- a/lib/web/css/source/lib/buttons.less
+++ b/lib/web/css/source/lib/buttons.less
@@ -32,7 +32,7 @@
     @_button-cursor: @button-cursor,                        // button cursor
     @_button-display: @button-display,                      // button display
     @_button-disabled-opacity: @button-disabled-opacity,    // button disabled opacity
-    @_button-height: @button-height,                        // button height
+    @_button-line-height: @button-line-height,              // button line height
     @_button-width: @button-width,                          // button width
     @_button-margin: @button-margin,                        // margins of the button
     @_button-padding: @button-padding,                      // paddings of the button
@@ -83,7 +83,7 @@
     .css(font-family, @_button-font-family);
     .font-size(@_button-font-size);
     .css(font-weight, @_button-font-weight);
-    .css(line-height, @_button-height);
+    .line-height(@_button-line-height);
     //-moz-box-sizing: content-box; // fix Firefox button line-height problem
     .box-sizing();
     .css(margin, @_button-margin);
@@ -137,25 +137,25 @@
 
 //
 //    Button size
-//-------------------------------------- */
+//--------------------------------------
 .button-size(
-    @_button-height: @button-height,
+    @_button-line-height: @button-line-height,
     @_button-padding: @button-padding
 ){
-    .css(line-height, @_button-height);
+    .line-height(@_button-line-height);
     .css(padding, @_button-padding);
 }
 
 //
 //    Large buttons
-//-------------------------------------- */
+//--------------------------------------
 .button-l(
     @_button-l-font-size: @button-l-font-size,
-    @_button-l-height: @button-l-height,
+    @_button-l-height: @button-l-line-height,
     @_button-l-padding: @button-l-padding
 ) {
     .button-size(
-        @_button-height: @_button-l-height,
+        @_button-line-height: @_button-l-height,
         @_button-padding: @_button-l-padding
     );
     .font-size(@_button-l-font-size);
@@ -163,14 +163,14 @@
 
 //
 //    Small buttons
-//-------------------------------------- */
+//--------------------------------------
 .button-s(
     @_button-s-font-size: @button-s-font-size,
-    @_button-s-height: @button-s-height,
+    @_button-s-height: @button-s-line-height,
     @_button-s-padding: @button-s-padding
 ) {
     .button-size(
-        @_button-height: @_button-s-height,
+        @_button-line-height: @_button-s-height,
         @_button-padding: @_button-s-padding
     );
     .font-size(@_button-s-font-size);
@@ -178,7 +178,7 @@
 
 //
 //    Link as button
-//-------------------------------------- */
+//--------------------------------------
 .link-as-button() {
     .css(display, @button-display);
     text-decoration: none;
@@ -191,7 +191,7 @@
 
 //
 //    Button as link
-//-------------------------------------- */
+//--------------------------------------
 .button-as-link(
     @_link-color: @link-color,
     @_link-color-hover: @link-color-hover,
@@ -228,14 +228,14 @@
 
 //
 //    Responsive
-//-------------------------------------- */
+//--------------------------------------
 .button-responsive() {
     width: 100%;
 }
 
 //
 //    Button reset
-//-------------------------------------- */
+//--------------------------------------
 .button-reset() {
     background-image: none; // Reset unusual Firefox-on-Android default style
     background: none;
@@ -269,9 +269,9 @@
 
 //
 //    Button primary
-//-------------------------------------- */
+//--------------------------------------
 .button-primary(
-    @_button-height: @button-primary-height,
+    @_button-line-height: @button-primary-line-height,
     @_button-width: @button-primary-width,
     @_button-margin: @button-primary-margin,
     @_button-padding: @button-primary-padding,
@@ -294,7 +294,7 @@
     @_button-gradient-direction: @button-primary-gradient-direction
 ) {
     .button(
-        @_button-height: @_button-height,
+        @_button-line-height: @_button-line-height,
         @_button-width: @_button-width,
         @_button-margin: @_button-margin,
         @_button-padding: @_button-padding,
@@ -320,7 +320,7 @@
 
 //
 //    Button revert secondary color
-//-------------------------------------- */
+//--------------------------------------
 .button-revert-secondary-color(
     @_button-color: @button-color,
     @_button-background: @button-background,
@@ -352,23 +352,22 @@
 
 //
 //    Button revert secondary size
-//-------------------------------------- */
+//--------------------------------------
 .button-revert-secondary-size(
     @_button-font-size: @button-font-size,
-    @_button-height: @button-height,
+    @_button-line-height: @button-line-height,
     @_button-padding: @button-padding
 ) {
     .font-size(@_button-font-size);
     .button-size(
-        @_button-height: @_button-height,
+        @_button-line-height: @_button-line-height,
         @_button-padding: @_button-padding
     )
 }
 
 //
 //    Inner buttons mixins
-//-------------------------------------- */
-
+//--------------------------------------
 ._button-icon (
     @_button-icon-use: @button-icon-use,
     @_icon-font-content: @button-font-content,
diff --git a/lib/web/css/source/lib/forms.less b/lib/web/css/source/lib/forms.less
index abd46c86f4af5c91bd505c5db74ac65460909fba..15d522129a0b14aaced8816d3048432d0c77ca50 100644
--- a/lib/web/css/source/lib/forms.less
+++ b/lib/web/css/source/lib/forms.less
@@ -780,24 +780,24 @@
         content: " ";
         height: 1px;
         float: left;
-        .css(width, @_type-inline-label-width);
         .css(padding, @_type-inline-label-padding);
+        .css(width, @_type-inline-label-width);
     }
     .description {
         .box-sizing();
         float: left;
+        .css(padding, @_type-inline-label-padding);
         .css(text-align, @_type-inline-label-align);
         .css(width, @_type-inline-label-width);
-        .css(padding, @_type-inline-label-padding);
     }
     &:not(.choice) {
         > .label {
             .box-sizing();
             float: left;
+            .css(margin, @_type-inline-label-margin);
+            .css(padding, @_type-inline-label-padding);
             .css(text-align, @_type-inline-label-align);
             .css(width, @_type-inline-label-width);
-            .css(padding, @_type-inline-label-padding);
-            .css(margin, @_type-inline-label-margin);
         }
         > .control {
             float: left;
@@ -819,8 +819,6 @@
         .css(margin, @_type-block-label-margin);
         .css(padding, @_type-block-label-padding);
     }
-    .control {
-    }
 }
 
 ._form-field-required(
@@ -952,7 +950,7 @@
     @_type-block-label-padding: @form-field-type-block-label-padding,
     @_type-block-label-align: @form-field-type-block-label-align
 ) when (@_type = inline) and not (@_type = false) {
-   > .label {
+    > .label {
         ._revert-type-inline-label-margin(
             @_type-inline-label-margin
         );
diff --git a/lib/web/css/source/lib/icons.less b/lib/web/css/source/lib/icons.less
index 057aab40747440face2f204ab2d2ec0e07f2cf22..dddae1fab03d9cb36b98d0d3bbe1dee27bd55090 100644
--- a/lib/web/css/source/lib/icons.less
+++ b/lib/web/css/source/lib/icons.less
@@ -46,7 +46,7 @@
     @_icon-font-text-hide: @icon-font-text-hide,
     @_icon-font-display: @icon-font-display
 ) when (@_icon-font-position = before) {
-    display: @_icon-font-display;
+    .css(display, @_icon-font-display);
     text-decoration: none;
     ._icon-text-hide(@_icon-font-text-hide);
 
@@ -87,7 +87,7 @@
     @_icon-font-text-hide: @icon-font-text-hide,
     @_icon-font-display: @icon-font-display
 ) when (@_icon-font-position = after) {
-    display: @_icon-font-display;
+    .css(display, @_icon-font-display);
     text-decoration: none;
     ._icon-text-hide(@_icon-font-text-hide);
     &:after {
diff --git a/lib/web/css/source/lib/messages.less b/lib/web/css/source/lib/messages.less
index 69396a5a1a868b2dc6598311918619d89d5c2714..aefb43ac46b72a38ea8e56f6b1243eaeb66a9dd0 100644
--- a/lib/web/css/source/lib/messages.less
+++ b/lib/web/css/source/lib/messages.less
@@ -29,6 +29,10 @@
     @_message-link-color: "message-@{_message-type}-link-color";
     @_message-link-color-hover: "message-@{_message-type}-link-color-hover";
     @_message-link-color-active: "message-@{_message-type}-link-color-active";
+    @_message-icon-top: "message-@{_message-type}-icon-top";
+    @_message-icon-right: "message-@{_message-type}-icon-right";
+    @_message-icon-bottom: "message-@{_message-type}-icon-bottom";
+    @_message-icon-left: "message-@{_message-type}-icon-left";
     ._message();
     ._message-style(
         @_message-color: @@_message-color,
@@ -87,7 +91,7 @@
     @_message-border-style: @message-border-style
 ) when not (@_message-border-width = 0)
 and not (@_message-border-width = false)
-and not ( @_message-border-style = false) {
+and not (@_message-border-style = false) {
     .css(border, @_message-border-width @_message-border-style);
 }
 
@@ -99,12 +103,20 @@ and not ( @_message-border-style = false) {
     @_message-icon: "message-@{_message-type}-icon";
     @_message-icon-color: "message-@{_message-type}-icon-color-lateral";
     @_message-icon-background: "message-@{_message-type}-icon-background";
+    @_message-icon-top: "message-@{_message-type}-icon-top";
+    @_message-icon-right: "message-@{_message-type}-icon-right";
+    @_message-icon-bottom: "message-@{_message-type}-icon-bottom";
+    @_message-icon-left: "message-@{_message-type}-icon-left";
     ._message-icon-lateral(
-           @_message-icon-position,
-           @@_message-icon,
-           @@_message-icon-color,
-           @@_message-icon-background
-       );
+        @_message-icon-position,
+        @@_message-icon,
+        @@_message-icon-color,
+        @@_message-icon-background,
+        @@_message-icon-top,
+        @@_message-icon-left,
+        @@_message-icon-bottom,
+        @@_message-icon-right
+    );
 }
 
 // Messages with inner icon
@@ -114,10 +126,18 @@ and not ( @_message-border-style = false) {
     @_message-icon: "message-@{_message-type}-icon";
     @_message-icon-color: "message-@{_message-type}-icon-color-inner";
     @_message-icon-background: "message-@{_message-type}-icon-background";
+    @_message-icon-top: "message-@{_message-type}-icon-top";
+    @_message-icon-right: "message-@{_message-type}-icon-right";
+    @_message-icon-bottom: "message-@{_message-type}-icon-bottom";
+    @_message-icon-left: "message-@{_message-type}-icon-left";
     ._message-icon-inner(
         @@_message-icon,
         @@_message-icon-color,
-        @@_message-icon-background
+        @@_message-icon-background,
+        @@_message-icon-top,
+        @@_message-icon-left,
+        @@_message-icon-bottom,
+        @@_message-icon-right
     );
 }
 
@@ -126,7 +146,11 @@ and not ( @_message-border-style = false) {
     @_message-icon-position,
     @_message-icon,
     @_message-icon-color,
-    @_message-icon-background
+    @_message-icon-background,
+    @_message-icon-top,
+    @_message-icon-left,
+    @_message-icon-bottom,
+    @_message-icon-right
 ) {
     position: relative;
     &:before {
@@ -153,12 +177,15 @@ and not ( @_message-border-style = false) {
             @_icon-font: @icon-font,
             @_icon-font-size: @message-icon-font-size,
             @_icon-font-line-height: @message-icon-font-line-height,
-            @_icon-font-color:  @_message-icon-color,
+            @_icon-font-color: @_message-icon-color,
             @_icon-font-margin: -@message-icon-font-size/2 0 0,
             @_icon-font-vertical-align: @icon-font-vertical-align
         );
         position: absolute;
-        top: 50%;
+        .css(top, @_message-icon-top);
+        .css(right, @_message-icon-right);
+        .css(bottom, @_message-icon-bottom);
+        .css(left, @_message-icon-left);
         text-align: center;
         .css(width, @message-icon-lateral-width);
     }
@@ -205,13 +232,13 @@ and not ( @_message-border-style = false) {
 }
 
 ._message-icon-lateral-border-radius(
-    @_message-icon-position,
+    @_message-icon-position
 ) when (@_message-icon-position = left) and not (@message-border-radius = false) and not (@message-border-width = false) {
     border-radius: (@message-border-radius - @message-border-width) 0 0 (@message-border-radius - @message-border-width);
 }
 
 ._message-icon-lateral-border-radius(
-    @_message-icon-position,
+    @_message-icon-position
 ) when (@_message-icon-position = right) and not (@message-border-radius = false) and not (@message-border-width = false) {
     border-radius: 0 (@message-border-radius - @message-border-width) (@message-border-radius - @message-border-width) 0;
 }
@@ -219,7 +246,11 @@ and not ( @_message-border-style = false) {
 ._message-icon-inner(
     @_message-icon,
     @_message-icon-color,
-    @_message-icon-background
+    @_message-icon-background,
+    @_message-icon-top,
+    @_message-icon-left,
+    @_message-icon-bottom,
+    @_message-icon-right
 ) {
     position: relative;
     .css(padding-left, @message-icon-inner-padding-left);
@@ -234,8 +265,10 @@ and not ( @_message-border-style = false) {
             @_icon-font-vertical-align: @icon-font-vertical-align
         );
         position: absolute;
-        left: 0;
-        top: 50%;
+        .css(top, @_message-icon-top);
+        .css(right, @_message-icon-right);
+        .css(bottom, @_message-icon-bottom);
+        .css(left, @_message-icon-left);
         text-align: center;
         .css(width, @message-icon-inner-padding-left);
     }
diff --git a/lib/web/css/source/lib/navigation.less b/lib/web/css/source/lib/navigation.less
index fbdb96fed5f5731f23501632baa9e2bb33e50409..39fd7092847e7f3524ca753c16eae068ac8566c0 100644
--- a/lib/web/css/source/lib/navigation.less
+++ b/lib/web/css/source/lib/navigation.less
@@ -62,13 +62,6 @@
     .navigation {
         .css(background, @_nav-bg);
         .css(border, @_nav-border);
-        display: block;
-        left: -86%;
-        top: 180px;
-        overflow: auto;
-        position: absolute;
-        width: 86%;
-        padding: 10px 0px;
         .box-sizing();
         ul {
             margin: 0;
@@ -126,7 +119,7 @@
                 }
             }
             &.expanded {
-              display: block !important;        
+              display: block !important;
               top: 0 !important;
             }
             .active > a {
@@ -197,133 +190,136 @@
     @_submenu-item-color-active: @submenu-desktop-item-color-active,
     @_submenu-item-text-decoration-active: @submenu-desktop-item-text-decoration-active
 ) {
-    .responsive(@break) when (@break = @break-point-1) {
-        .navigation {
-            .css(background, @_nav-bg);
-            .css(border, @_nav-border);
-            .css(font-size, @_nav-font-size);
-            .css(font-weight, @_nav-font-weight);
-            height: inherit;
-            left: auto;
-            overflow: inherit;
-            position: relative;
-            top: 0;
-            width: 100%;
-            z-index: 3;
+
+    .navigation {
+        .css(background, @_nav-bg);
+        .css(border, @_nav-border);
+        .css(font-size, @_nav-font-size);
+        .css(font-weight, @_nav-font-weight);
+        height: inherit;
+        left: auto;
+        overflow: inherit;
+        position: relative;
+        top: 0;
+        width: 100%;
+        z-index: 3;
+        padding: 0;
+        &:empty {
+            display: none;
+        }
+        ul {
+            margin-top: 0;
+            margin-bottom: 0;
             padding: 0;
-            &:empty {
-                display: none;
-            }
-            ul {
-                margin-top: 0;
-                margin-bottom: 0;
-                padding: 0;
-                position: relative;
-            }
-            li.level0 {
-                .css(border-top, none);
+            position: relative;
+        }
+        li.level0 {
+            .css(border-top, none);
+        }
+        .level0 {
+            display: inline-block;
+            position: relative;
+            .css(margin, @_nav-level0-item-margin);
+
+            &:last-child {
+                margin-right: 0;
+                padding-right: 0;
             }
-            .level0 {
-                display: inline-block;
+            > .level-top {
+                .box-sizing();
+                .css(background, @_nav-level0-item-bg);
+                .css(border, @_nav-level0-item-border);
+                .css(color, @_nav-level0-item-color);
+                .css(line-height, @_nav-level0-item-line-height);
+                .css(padding, @_nav-level0-item-padding);
+                .css(text-decoration, @_nav-level0-item-text-decoration);
                 position: relative;
-                .css(margin, @_nav-level0-item-margin);
-
-                &:last-child {
-                    margin-right: 0;
-                    padding-right: 0;
+                &:hover, &.ui-state-focus {
+                    .css(background, @_nav-level0-item-bg-hover);
+                    .css(border, @_nav-level0-item-border-hover);
+                    .css(color, @_nav-level0-item-color-hover);
+                    .css(text-decoration, @_nav-level0-item-text-decoration-hover);
                 }
+            }
+            &.active {
                 > .level-top {
-                    .box-sizing();
-                    .css(background, @_nav-level0-item-bg);
-                    .css(border, @_nav-level0-item-border);
-                    .css(color, @_nav-level0-item-color);
-                    .css(line-height, @_nav-level0-item-line-height);
-                    .css(padding, @_nav-level0-item-padding);
-                    .css(text-decoration, @_nav-level0-item-text-decoration);
-                    position: relative;
+                    .css(background, @_nav-level0-item-bg-active);
+                    .css(border, @_nav-level0-item-border-active);
+                    .css(color, @_nav-level0-item-color-active);
+                    .css(text-decoration, @_nav-level0-item-text-decoration-active);
+                }
+            }
+            &.parent:hover > .submenu {
+                overflow: visible !important;
+            }
+            .ui-menu {
+                .css(font-size, @_submenu-font-size);
+                .css(font-weight, @_submenu-font-weight);
+                left: 0;
+                .css(min-width, @_submenu-min-width);
+                position: absolute;
+                padding: 0;
+                margin: 0 !important;
+                top: 100%;
+                z-index: 1;
+                .css(background, @_submenu-bg);
+                .css(border, @_submenu-border-width @_submenu-border-style @_submenu-border-color);
+                .css(box-shadow, @_submenu-box-shadow);
+                .css(padding, @_submenu-padding);
+                ._submenu-arrow(
+                    @_submenu-arrow,
+                    @_bg: @_submenu-bg,
+                    @_border: @_submenu-border-color,
+                    @_size: @_submenu-arrow-size,
+                    @_left: @_submenu-arrow-left
+                );
+                a {
+                    display: block;
+                    line-height: inherit;
+                    .css(background, @_submenu-item-bg);
+                    .css(border, @_submenu-item-border);
+                    .css(color, @_submenu-item-color);
+                    .css(padding, @_submenu-item-padding);
+                    .css(text-decoration, @_submenu-item-text-decoration);
                     &:hover, &.ui-state-focus {
-                        .css(background, @_nav-level0-item-bg-hover);
-                        .css(border, @_nav-level0-item-border-hover);
-                        .css(color, @_nav-level0-item-color-hover);
-                        .css(text-decoration, @_nav-level0-item-text-decoration-hover);
+                        .css(background, @_submenu-item-bg-hover);
+                        .css(border, @_submenu-item-border-hover);
+                        .css(color, @_submenu-item-color-hover);
+                        .css(text-decoration, @_submenu-item-text-decoration-hover);
                     }
                 }
-                &.active {
-                    > .level-top {
-                        .css(background, @_nav-level0-item-bg-active);
-                        .css(border, @_nav-level0-item-border-active);
-                        .css(color, @_nav-level0-item-color-active);
-                        .css(text-decoration, @_nav-level0-item-text-decoration-active);
-                    }
+                .active > a {
+                    .css(background, @_submenu-item-bg-active);
+                    .css(border, @_submenu-item-border-active);
+                    .css(color, @_submenu-item-color-active);
+                    .css(text-decoration, @_submenu-item-text-decoration-active);
                 }
-                &.parent:hover > .submenu {
-                    overflow: visible !important;
+                .ui-menu {
+                    top: 0 !important;
+                    left: 100%!important;
                 }
-                > .ui-menu {
-                    .css(font-size, @_submenu-font-size);
-                    .css(font-weight, @_submenu-font-weight);
-                    left: 0;
-                    .css(min-width, @_submenu-min-width);
-                    position: absolute;
-                    padding: 0;
-                    margin: 0 !important;
-                    top: 100%;
-                    z-index: 1;
-                    .css(background, @_submenu-bg);
-                    .css(border, @_submenu-border-width @_submenu-border-style @_submenu-border-color);
-                    .css(box-shadow, @_submenu-box-shadow);
-                    .css(padding, @_submenu-padding);
-                    ._submenu-arrow(
-                        @_submenu-arrow,
-                        @_bg: @_submenu-bg,
-                        @_border: @_submenu-border-color,
-                        @_size: @_submenu-arrow-size,
-                        @_left: @_submenu-arrow-left
-                    );
-                    a {
-                        display: block;
-                        line-height: inherit;
-                        .css(background, @_submenu-item-bg);
-                        .css(border, @_submenu-item-border);
-                        .css(color, @_submenu-item-color);
-                        .css(padding, @_submenu-item-padding);
-                        .css(text-decoration, @_submenu-item-text-decoration);
-                        &:hover, &.ui-state-focus {
-                            .css(background, @_submenu-item-bg-hover);
-                            .css(border, @_submenu-item-border-hover);
-                            .css(color, @_submenu-item-color-hover);
-                            .css(text-decoration, @_submenu-item-text-decoration-hover);
-                        }
-                    }
-                    .active > a {
-                        .css(background, @_submenu-item-bg-active);
-                        .css(border, @_submenu-item-border-active);
-                        .css(color, @_submenu-item-color-active);
-                        .css(text-decoration, @_submenu-item-text-decoration-active);
-                    }
+            }
+            &.more {
+                position: relative;
+                .icon-font(
+                    @icon-pointer-down,
+                    @_icon-font-size: 26px,
+                    @_icon-font-position: after
+                );
+                &:before {
+                    display: none;
                 }
-                &.more {
+                &:after {
+                    cursor: pointer;
+                    padding: 8px 12px;
                     position: relative;
-                    .icon-font(
-                        @icon-pointer-down,
-                        @_icon-font-size: 26px,
-                        @_icon-font-position: after
-                    );
-                    &:before {
-                        display: none;
-                    }
-                    &:after {
-                        cursor: pointer;
-                        padding: 8px 12px;
-                        position: relative;
-                        z-index: 1;
-                    }
-                    &:hover > .submenu {
-                        overflow: visible !important;
-                    }
-                    li {
-                        display: block;
-                    }
+                    z-index: 1;
+                }
+                &:hover > .submenu {
+                    overflow: visible !important;
+                }
+                li {
+                    display: block;
                 }
             }
         }
diff --git a/lib/web/css/source/lib/rating.less b/lib/web/css/source/lib/rating.less
index 896bc218770f6c19b4dc901c31ed7cf2f2838747..cd9726868961542895e169cab281dc8981b1be0f 100644
--- a/lib/web/css/source/lib/rating.less
+++ b/lib/web/css/source/lib/rating.less
@@ -103,6 +103,7 @@
     @_icon-color-active: @rating-icon-color-active,
     @_label-hide: @rating-label-hide
 ) {
+    white-space: nowrap;
     overflow: hidden;
     ._rating-label-hide(@_label-hide);
     .rating-result {
diff --git a/lib/web/css/source/lib/resets.less b/lib/web/css/source/lib/resets.less
index 167ad93681620675f6456be3da53174adc072e71..c630893c3d56db38adc80fca0b17067027103841 100644
--- a/lib/web/css/source/lib/resets.less
+++ b/lib/web/css/source/lib/resets.less
@@ -94,7 +94,7 @@
     .form-element-all();
 
     address {
-        font-style: normal
+        font-style: normal;
     }
 }
 
@@ -370,70 +370,70 @@
     article, aside, canvas, details, figcaption, figure,
     footer, header, hgroup, menu, nav, section, summary,
     time, mark, audio, video {
-        margin:0;
-        padding:0;
-        border:0;
-        outline:0;
-        font-size:100%;
-        vertical-align:baseline;
-        background:transparent;
+        margin: 0;
+        padding: 0;
+        border: 0;
+        outline: 0;
+        font-size: 100%;
+        vertical-align: baseline;
+        background: transparent;
     }
     body {
-        line-height:1;
+        line-height: 1;
     }
-    article,aside,details,figcaption,figure,
-    footer,header,hgroup,menu,nav,section {
-        display:block;
+    article, aside, details, figcaption, figure,
+    footer, header, hgroup, menu, nav, section {
+        display: block;
     }
     nav ul {
-        list-style:none;
+        list-style: none;
     }
     blockquote, q {
-        quotes:none;
+        quotes: none;
     }
     blockquote:before, blockquote:after,
     q:before, q:after {
-        content:'';
-        content:none;
+        content: '';
+        content: none;
     }
     a {
-        margin:0;
-        padding:0;
-        font-size:100%;
-        vertical-align:baseline;
-        background:transparent;
+        margin: 0;
+        padding: 0;
+        font-size: 100%;
+        vertical-align: baseline;
+        background: transparent;
     }
     ins {
-        background-color:#ff9;
-        color:#000;
-        text-decoration:none;
+        background-color: #ff9;
+        color: #000;
+        text-decoration: none;
     }
     mark {
-        background-color:#ff9;
-        color:#000;
-        font-style:italic;
-        font-weight:bold;
+        background-color: #ff9;
+        color: #000;
+        font-style: italic;
+        font-weight: bold;
     }
     del {
         text-decoration: line-through;
     }
     abbr[title], dfn[title] {
-        border-bottom:1px dotted;
-        cursor:help;
+        border-bottom: 1px dotted;
+        cursor: help;
     }
     table {
-        border-collapse:collapse;
-        border-spacing:0;
+        border-collapse: collapse;
+        border-spacing: 0;
     }
     hr {
-        display:block;
-        height:1px;
-        border:0;
-        border-top:1px solid #cccccc;
-        margin:1em 0;
-        padding:0;
+        display: block;
+        height: 1px;
+        border: 0;
+        border-top: 1px solid #ccc;
+        margin: 1em 0;
+        padding: 0;
     }
     input, select {
-        vertical-align:middle;
+        vertical-align: middle;
     }
 }
diff --git a/lib/web/css/source/lib/responsive.less b/lib/web/css/source/lib/responsive.less
index ac1a4d76ec00628263ca32aa2f809ce4919fcebb..912a240473b162f40f83ecb3e499f4714eb53512 100644
--- a/lib/web/css/source/lib/responsive.less
+++ b/lib/web/css/source/lib/responsive.less
@@ -23,24 +23,28 @@
 //  */
 
 // Small screens only
-.responsive-smaller(@break-point-0) {}
+.responsive-smaller(@screen-s) {}
 
-@media all and (max-width: @break-point-0) {
-    .responsive-smaller(@break-point-0);
+@media all and (max-width: @screen-xs) {
+    .responsive-smaller(@screen-xs);
 }
 
-@media all and (max-width: @break-point-1) {
-    .responsive-smaller(@break-point-1);
+@media all and (max-width: @screen-s) {
+    .responsive-smaller(@screen-s);
 }
 
-@media all and (min-width: @break-point-0) {
-    .responsive(@break-point-0);
+@media all and (max-width: @screen-m) {
+    .responsive-smaller(@screen-m);
 }
 
-@media all and (min-width: @break-point-1) {
-    .responsive(@break-point-1);
+@media all and (min-width: @screen-s) {
+    .responsive(@screen-s);
 }
 
-@media all and (min-width: @break-point-2) {
-    .responsive(@break-point-2);
+@media all and (min-width: @screen-m) {
+    .responsive(@screen-m);
+}
+
+@media all and (min-width: @screen-l) {
+    .responsive(@screen-l);
 }
diff --git a/lib/web/css/source/lib/typography.less b/lib/web/css/source/lib/typography.less
index a49e62d334eb800496a36949be4aeea46e1c8480..d6962e22dbcf6fc12de46201d7b416c4655dc47f 100644
--- a/lib/web/css/source/lib/typography.less
+++ b/lib/web/css/source/lib/typography.less
@@ -53,6 +53,19 @@
     font-size: @sizeValue;
 }
 
+//  Rem line height
+.line-height(@heightValue) when not (@heightValue = false) and not (ispercentage(@heightValue)) {
+    @value: unit(@heightValue);
+    @remValue: (@value / @font-rem-ratio);
+    @pxValue: @value;
+    line-height: ~"@{pxValue}px";
+    line-height: ~"@{remValue}rem";
+}
+
+.line-height(@heightValue) when (ispercentage(@heightValue)) and not (@heightValue = false) {
+    line-height: @heightValue;
+}
+
 .wrap-words() {
     -ms-word-break: break-all;
     word-break: break-all;
@@ -164,7 +177,6 @@
         .margin-vertical-rem(@@_margin-top, @@_margin-bottom);
 }
 
-
 //
 //  Base typography
 //--------------------------------------
diff --git a/lib/web/css/source/lib/variables.less b/lib/web/css/source/lib/variables.less
index 1242f524db35f91e4a985880623d1784e48c3882..66aec212956f6298b5d8a3d60edc81465d762703 100644
--- a/lib/web/css/source/lib/variables.less
+++ b/lib/web/css/source/lib/variables.less
@@ -25,7 +25,7 @@
 //    Typography
 //--------------------------------------
 
-//  Base
+// Base
 @font-family-sans-serif: 'Helvetica Neue', Helvetica, Arial, sans-serif;
 @font-family-serif: Georgia, 'Times New Roman', Times, serif;
 @font-family-monospace: Menlo, Monaco, Consolas, 'Courier New', monospace;
@@ -34,10 +34,10 @@
 @icon-font-name: 'icons-blank-theme';
 
 @color-primary: #333;
-@color-primary-dark: darken(@color-primary, 35%);  // #000
+@color-primary-dark: darken(@color-primary, 35%);  //  #000
 @color-primary-darker: darken(@color-primary, 13.5%);  // #111
-@color-primary-lighter: lighten(@color-primary, 29%);  // #7d7d7d
-@color-primary-light: lighten(@color-primary, 45%);  // #a6a6a6
+@color-primary-lighter: lighten(@color-primary, 29%);  //  #7d7d7d
+@color-primary-light: lighten(@color-primary, 45%);  //  #a6a6a6
 @color-secondary: #e8e8e8;
 @color-secondary-light: lighten(@color-secondary, 5%);
 @page-bg-color: #fff;
@@ -55,7 +55,7 @@
 @font-size-base: unit((@font-size-root / 100) * 16 * @font-size-base-ratio, px); // Also used in: @loader-text-font-size
 @font-size-xl: ceil(1.5 * @font-size-base);
 @font-size-l: ceil(1.25 * @font-size-base);
-@font-size-s: ceil(0.85 * @font-size-base); // Also used in: Breadcrumbs and in Small button
+@font-size-s: ceil(0.85 * @font-size-base);  // Also used in: Breadcrumbs and in Small button
 @font-size-xs: floor(0.75 * @font-size-base);
 
 @font-weight-base: 400;
@@ -84,9 +84,7 @@
 @border-color-base: darken(@page-bg-color, 18%);
 @border-width-base: 1px;
 
-
-//Links
-
+// Links
 @link-color: #1979c3;
 @link-text-decoration: none;
 
@@ -100,8 +98,8 @@
 @link-text-decoration-active: underline;
 
 // Lists
-@list-color-base: ''; //@text-color
-@list-font-size-base: false; //@font-size-base
+@list-color-base: ''; // @text-color
+@list-font-size-base: false; // @font-size-base
 @list-margin-top: 0;
 @list-margin-bottom: @indent-m-base;
 @list-item-margin-top: 0;
@@ -119,12 +117,12 @@
 @p-margin-top: 0;
 @p-margin-bottom: @indent-s-base;
 
-//Headings
-@heading-font-family-base: false; //@font-family-base
+// Headings
+@heading-font-family-base: false; // @font-family-base
 @heading-font-weight-base: @font-weight-light;
 @heading-line-height-base: 1.1;
-@heading-color-base: false; //@text-color
-@heading-font-style-base: false; //@font-style-base
+@heading-color-base: false; // @text-color
+@heading-font-style-base: false; // @font-style-base
 @heading-margin-top-base: @indent-base;
 @heading-margin-bottom-base: @indent-base;
 
@@ -200,9 +198,7 @@
 @kbd-color: @color-primary-darker;
 @kbd-bg: @panel-bg;
 
-
 // Blockquote
-
 @blockquote-font-size: @font-size-base;
 @blockquote-font-style: @font-style-emphasis;
 @blockquote-border-color: @border-color-base;
@@ -215,7 +211,6 @@
 @cite-font-style: @font-style-base;
 
 // Misc
-
 @hr-border-color: @border-color-base;
 @hr-border-style: solid;
 @hr-border-width: 1px;
@@ -246,7 +241,7 @@
 @table-border-width: @border-width-base;
 @table-border-style: solid;
 
-@table-caption-hide: false; //Default value false, set true to hide caption
+@table-caption-hide: false; // Default value false, set true to hide caption
 @table-caption-font-size: @font-size-l;
 @table-caption-color: @text-color-intense;
 @table-caption-font-family: false;
@@ -310,25 +305,28 @@
 @layout-column-main-width-2-right: @layout-columns-width - @layout-column-right-width;
 @layout-column-main-width-3: @layout-columns-width - @layout-column-left-width - @layout-column-right-width;
 
-//  Checkout columns width
+// Checkout columns width
 @layout-column-checkout-left-width: 3;
 @layout-column-checkout-main-width: @layout-columns-width - @layout-column-checkout-left-width;
 
 //
 //    Responsive
 //--------------------------------------
+
 // Settings variables (TO DO: should be global)
 @use-flex: true; // Use flexbox [true|false]
 @responsive: true; // Theme is responsive [true|false]
 
-@break-point-0: 600px; // catalog products in a row: (width <= 599) - 2 columns, (600 <= width <= 768) - 3 columns, (768 < width ) - 4 columns
-@break-point-1: 768px; // main breakpoint
-@break-point-2: 800px; // checkout and catalog 3 columns layout breakpoint
+@screen-xxs: 320px;
+@screen-xs: 400px;
+@screen-s: 640px;
+@screen-m: 768px;
+@screen-l: 1000px;
+@screen-xl: 1440px;
 
 //
 //    Navigation variables
 //--------------------------------------
-
 @navigation-background: @color-secondary-light;
 @navigation-border: '';
 @navigation-level0-font-size: 16;
@@ -365,8 +363,8 @@
 @submenu-item-color-active: '';
 @submenu-item-text-decoration-active: '';
 
-//  Desktop navigation
-@navigation-desktop-background: @color-secondary;
+// Desktop navigation
+@navigation-desktop-background: @navigation-background;
 @navigation-desktop-border: '';
 @navigation-desktop-font-size: '';
 @navigation-desktop-font-weight: @font-weight-bold;
@@ -420,15 +418,13 @@
 @submenu-desktop-item-color-active: '';
 @submenu-desktop-item-text-decoration-active: '';
 
-
-
 //
 //    Sections variables
 //--------------------------------------
 
-//  Tabs
+// Tabs
 
-//  Tabs controls
+// Tabs controls
 @tab-control-font-size: @font-size-base;
 @tab-control-font-family: @font-family-base;
 @tab-control-font-weight: @font-weight-semibold;
@@ -476,7 +472,7 @@
 @tab-content-padding-left: @tab-content-padding-right;
 @tab-content-padding-bottom: @tab-content-padding-top;
 
-// Accordions  variables
+// Accordions variables
 @accordion-control-font-family: @tab-control-font-family;
 @accordion-control-font-size: @font-size-l;
 @accordion-control-font-style: @tab-control-font-style;
@@ -526,9 +522,9 @@
 @button-font-family: @font-family-base;
 @button-font-size: @font-size-base;
 @button-font-weight: @font-weight-bold;
-@button-height: 30px;
+@button-line-height: @font-size-base + 2;
 @button-margin: 0;
-@button-padding: 0 15px; // is set up to false when buttons don't depend of side paddings or have fixed width, Also used in @button-primary-padding
+@button-padding: 7px 15px; // is set up to false when buttons don't depend of side paddings or have fixed width, Also used in @button-primary-padding
 @button-width: ''; // is set up to false when buttons depend of side paddings or to fixed value when needed
 
 // Buttons display settings
@@ -557,7 +553,7 @@
 @button-gradient-end-color-active: false;
 
 // Primary button
-@button-primary-height: 30px;
+@button-primary-line-height: false;
 @button-primary-width: false;
 @button-primary-margin: false;
 @button-primary-padding: @button-padding;
@@ -592,7 +588,7 @@
 @button-font-content: @icon-settings;
 @button-icon-font: @icon-font; // Also used in: @popup-icon-font
 @button-icon-font-size: 22px; // Also used in: @popup-icon-font-size
-@button-icon-font-line-height: @icon-font-line-height; // Also used in: @popup-icon-font-line-height
+@button-icon-font-line-height: @button-icon-font-size; // Also used in: @popup-icon-font-line-height
 @button-icon-font-color: inherit; // Also used in: @popup-icon-font-color
 @button-icon-font-color-hover: inherit; // Also used in: @popup-icon-font-color-hover
 @button-icon-font-color-active: inherit; // Also used in: @popup-icon-font-color-active
@@ -603,12 +599,13 @@
 
 // Large button
 @button-l-font-size: @font-size-l;
-@button-l-padding: 0 17px;
-@button-l-height: 50px;
+@button-l-line-height: @font-size-l + 4;
+@button-l-padding: 14px 17px;
+
 // Small button
 @button-s-font-size: 11px;
-@button-s-padding: 0 8px;
-@button-s-height: 22px;
+@button-s-line-height: @button-s-font-size + 1;
+@button-s-padding: 5px 8px;
 
 //
 //    Icons variables
@@ -699,6 +696,10 @@
 @message-icon-inner-padding-left: 40px;
 @message-icon-lateral-width: 30px;
 @message-icon-lateral-arrow-size: 5px;
+@message-icon-top: 18px;
+@message-icon-right: false;
+@message-icon-bottom: false;
+@message-icon-left: 0;
 
 @message-border-width: false;
 @message-border-color: false;
@@ -716,6 +717,10 @@
 @message-info-icon-color-inner: #c07600;
 @message-info-icon-color-lateral: #fff;
 @message-info-icon-background: #6f4400;
+@message-info-icon-top: @message-icon-top;
+@message-info-icon-right: @message-icon-right;
+@message-info-icon-bottom: @message-icon-bottom;
+@message-info-icon-left: @message-icon-left;
 
 // Warning message
 @message-warning-color: @message-info-color;
@@ -728,6 +733,10 @@
 @message-warning-icon-color-inner: @message-info-icon-color-inner;
 @message-warning-icon-color-lateral: @message-info-icon-color-lateral;
 @message-warning-icon-background: @message-info-icon-background;
+@message-warning-icon-top: @message-icon-top;
+@message-warning-icon-right: @message-icon-right;
+@message-warning-icon-bottom: @message-icon-bottom;
+@message-warning-icon-left: @message-icon-left;
 
 // Error message
 @message-error-color: @color-error;
@@ -740,6 +749,10 @@
 @message-error-icon-color-inner: #b30000;
 @message-error-icon-color-lateral: #fff;
 @message-error-icon-background: #b30000;
+@message-error-icon-top: @message-icon-top;
+@message-error-icon-right: @message-icon-right;
+@message-error-icon-bottom: @message-icon-bottom;
+@message-error-icon-left: @message-icon-left;
 
 // Success message
 @message-success-color: #006400;
@@ -752,6 +765,10 @@
 @message-success-icon-color-inner: #006400;
 @message-success-icon-color-lateral: #fff;
 @message-success-icon-background: #006400;
+@message-success-icon-top: @message-icon-top;
+@message-success-icon-right: @message-icon-right;
+@message-success-icon-bottom: @message-icon-bottom;
+@message-success-icon-left: @message-icon-left;
 
 // Notice message
 @message-notice-color: @message-info-color;
@@ -764,6 +781,10 @@
 @message-notice-icon-color-inner: @message-info-icon-color-inner;
 @message-notice-icon-color-lateral: @message-info-icon-color-lateral;
 @message-notice-icon-background: @message-info-icon-background;
+@message-notice-icon-top: @message-icon-top;
+@message-notice-icon-right: @message-icon-right;
+@message-notice-icon-bottom: @message-icon-bottom;
+@message-notice-icon-left: @message-icon-left;
 
 //
 //    Tooltips variables
@@ -812,6 +833,7 @@
 //
 //    Forms variables
 //--------------------------------------
+
 // Form elements inputs default variables
 @form-element-input-type: ''; // input-text, select, textarea, input-radio, input-checkbox
 @form-element-input-background: #fff;
@@ -831,15 +853,18 @@
 @form-element-input-font-weight: false;
 @form-element-input-line-height: @line-height-base;
 @form-element-input-font-style: false;
+
 // Placeholder
 @form-element-input-placeholder-color: #c2c2c2;
 @form-element-input-placeholder-font-style: @form-element-input-font-style;
+
 // Disabled state
 @form-element-input-disabled-background: @form-element-input-background;
 @form-element-input-disabled-border: @form-element-input-border;
 @form-element-input-disabled-opacity: 0.5;
 @form-element-input-disabled-color: @form-element-input-color;
 @form-element-input-disabled-font-style: @form-element-input-font-style;
+
 // Focus state
 @form-element-input-focus-background: @form-element-input-background;
 @form-element-input-focus-border: @form-element-input-border;
@@ -869,15 +894,18 @@
 @input-text-font-weight: @form-element-input-font-weight;
 @input-text-line-height: @form-element-input-line-height;
 @input-text-font-style: @form-element-input-font-style;
+
 // Placeholder
 @input-text-placeholder-color: @form-element-input-placeholder-color;
 @input-text-placeholder-font-style: @form-element-input-placeholder-font-style;
+
 // Disabled state
 @input-text-disabled-background: @form-element-input-disabled-background;
 @input-text-disabled-border: @form-element-input-disabled-border;
 @input-text-disabled-opacity: @form-element-input-disabled-opacity;
 @input-text-disabled-color: @form-element-input-disabled-color;
 @input-text-disabled-font-style: @form-element-input-disabled-font-style;
+
 // Focus state
 @input-text-focus-background: @form-element-input-focus-background;
 @input-text-focus-border: @form-element-input-focus-border;
@@ -901,15 +929,18 @@
 @select-font-weight: @form-element-input-font-weight;
 @select-line-height: @form-element-input-line-height;
 @select-font-style: @form-element-input-font-style;
+
 // Placeholder
 @select-placeholder-color: false;
 @select-placeholder-font-style: false;
+
 // Disabled state
 @select-disabled-background: @form-element-input-disabled-background;
 @select-disabled-border: @form-element-input-disabled-border;
 @select-disabled-opacity: @form-element-input-disabled-opacity;
 @select-disabled-color: @form-element-input-disabled-color;
 @select-disabled-font-style: @form-element-input-disabled-font-style;
+
 // Focus state
 @select-focus-background: @form-element-input-focus-background;
 @select-focus-border: @form-element-input-focus-border;
@@ -933,16 +964,19 @@
 @textarea-font-weight: @form-element-input-font-weight;
 @textarea-line-height: @form-element-input-line-height;
 @textarea-font-style: @form-element-input-font-style;
-@textarea-resize: vertical; //none | both | horizontal | vertical | inherit
+@textarea-resize: vertical; // none | both | horizontal | vertical | inherit
+
 // Placeholder
 @textarea-placeholder-color: @form-element-input-placeholder-color;
 @textarea-placeholder-font-style: @form-element-input-placeholder-font-style;
+
 // Disabled state
 @textarea-disabled-background: @form-element-input-disabled-background;
 @textarea-disabled-border: @form-element-input-disabled-border;
 @textarea-disabled-opacity: @form-element-input-disabled-opacity;
 @textarea-disabled-color: @form-element-input-disabled-color;
 @textarea-disabled-font-style: @form-element-input-disabled-font-style;
+
 // Focus state
 @textarea-focus-background: @form-element-input-focus-background;
 @textarea-focus-border: @form-element-input-focus-border;
@@ -991,7 +1025,7 @@
 
 // Fieldset
 @form-fieldset-border: 0;
-@form-fieldset-margin: 0 0 40px; //30px 10px 30px 30px
+@form-fieldset-margin: 0 0 40px;
 @form-fieldset-padding: 0;
 @form-fieldset-legend-color: false;
 @form-fieldset-legend-font-size: 20px;
@@ -999,9 +1033,9 @@
 @form-fieldset-legend-font-weight: false;
 @form-fieldset-legend-font-style: false;
 @form-fieldset-legend-line-height: 1.2;
-@form-fieldset-legend-margin: 0 0 25px 0; //0 0 25px @form-field-type-inline-label-width
+@form-fieldset-legend-margin: 0 0 25px; // 0 0 25px @form-field-type-inline-label-width
 @form-fieldset-legend-padding: 0;
-@form-fieldset-legend-width: false; //@form-field-type-inline-control-width
+@form-fieldset-legend-width: false; // @form-field-type-inline-control-width
 
 // Field
 @form-field-type: block; //inline
@@ -1010,11 +1044,12 @@
 @form-field-column: false;
 @form-field-column-padding: 0 12px 0 0;
 @form-field-column-number: 2;
-@form-field-vertical-indent: 29px;
-@form-field-additional-vertical-indent: @form-field-vertical-indent;
+@form-field-vertical-indent: 20px;
+@form-field-additional-vertical-indent: @form-field-vertical-indent/2;
 @form-field-type-block-margin: 0 0 @form-field-vertical-indent;
 @form-field-type-inline-margin: 0 0 @form-field-vertical-indent;
-// form field label
+
+// Form field label
 @form-field-label-align: false;
 @form-field-label-color: false;
 @form-field-label-font-size: false;
@@ -1029,9 +1064,11 @@
 @form-field-type-block-label-margin: 0 0 5px;
 @form-field-type-block-label-padding: false;
 @form-field-type-block-label-align: @form-field-label-align;
-// form field control
+
+// Form field control
 @form-field-type-inline-control-width: 74.2%;
-// form field label asterisk
+
+// Form field label asterisk
 @form-field-label-asterisk-color: #e02b27; // also used in: @form-hasrequired-color
 @form-field-label-asterisk-font-size: @font-size-s;
 @form-field-label-asterisk-font-family: false;
@@ -1039,7 +1076,8 @@
 @form-field-label-asterisk-font-style: false;
 @form-field-label-asterisk-line-height: false;
 @form-field-label-asterisk-margin: 0 0 0 5px;
-// form field note
+
+// Form field note
 @form-field-note-color: false;
 @form-field-note-font-size: @font-size-s;
 @form-field-note-font-family: false;
@@ -1048,7 +1086,8 @@
 @form-field-note-font-style: false;
 @form-field-note-margin: 3px 0 0;
 @form-field-note-padding: 0;
-// form field note icon
+
+// Form field note icon
 @form-field-note-icon-font-content: @icon-pointer-up;
 @form-field-note-icon-font: @icon-font;
 @form-field-note-icon-font-size: @form-field-note-font-size * 2;
@@ -1194,6 +1233,7 @@
 //
 //    Dropdowns variables
 //--------------------------------------
+
 // Variables simple dropdown
 @dropdown-actions-padding: false;
 @dropdown-list-min-width: 100%; // Also used in: @dropdown-split-list-min-width
@@ -1232,7 +1272,7 @@
 
 // Variables split dropdown
 @dropdown-split-actions-padding: 0 5px;
-@dropdown-split-toggle-actions-padding: false;
+@dropdown-split-toggle-actions-padding: 4px 5px;
 @dropdown-split-button-actions-padding: false;
 @dropdown-split-toggle-position: right; // Also used in: @dropdown-split-list-pointer-position
 @dropdown-split-list-min-width: @dropdown-list-min-width;
@@ -1356,7 +1396,7 @@
 @breadcrumbs-link-gradient-end-color-active: false;
 
 //
-// Popups variables
+//    Popups variables
 //--------------------------------------
 @popup-width: auto;
 @popup-height: auto;
@@ -1396,7 +1436,7 @@
 @popup-button-close-position-bottom: '';
 @popup-button-close-position-left: '';
 
-//Actions toolbar variables
+// Actions toolbar variables
 @popup-actions-toolbar-actions-position: @actions-toolbar-actions-position;
 @popup-actions-toolbar-actions-reverse: @actions-toolbar-actions-reverse;
 @popup-actions-toolbar-margin: @actions-toolbar-margin;
@@ -1408,7 +1448,7 @@
 @popup-actions-toolbar-primary-actions-links-margin-top: @actions-toolbar-primary-actions-links-margin-top;
 @popup-actions-toolbar-secondary-actions-links-margin-top: @actions-toolbar-secondary-actions-links-margin-top;
 
-//  Popup Icons variables
+// Popup Icons variables
 @popup-icon-font-content: @icon-remove;
 @popup-icon-font: @button-icon-font;
 @popup-icon-font-size: @button-icon-font-size;
@@ -1421,7 +1461,7 @@
 @popup-icon-font-position: @button-icon-font-position;
 @popup-icon-font-text-hide: true;
 
-//  Window overlay variables
+// Window overlay variables
 @overlay-background: #000;
 @overlay-opacity: 0.5;
 @overlay-opacity-old: 50;
diff --git a/lib/web/mage/adminhtml/tools.js b/lib/web/mage/adminhtml/tools.js
index 8a969fb42712079f09538e2cdb210e318a63a142..d080c4c417c22faa674e9f9cdff6b852e7bd49bc 100644
--- a/lib/web/mage/adminhtml/tools.js
+++ b/lib/web/mage/adminhtml/tools.js
@@ -115,6 +115,18 @@ Event.observe(window, 'load', function() {
     }
 });
 
+function toggleSeveralValueElements(checkbox, containers, excludedElements, checked){
+    "use strict";
+    if(containers && checkbox){
+        if (Object.prototype.toString.call(containers) != '[object Array]') {
+            containers = [containers];
+        }
+        containers.each(function(container) {
+            toggleValueElements(checkbox, container, excludedElements, checked);
+        });
+    }
+}
+
 function toggleValueElements(checkbox, container, excludedElements, checked){
     if(container && checkbox){
         var ignoredElements = [checkbox];
@@ -127,7 +139,9 @@ function toggleValueElements(checkbox, container, excludedElements, checked){
             }
         }
         //var elems = container.select('select', 'input');
-        var elems = Element.select(container, ['select', 'input', 'textarea', 'button', 'img']);
+        var elems = Element.select(container, ['select', 'input', 'textarea', 'button', 'img']).filter(function(el){
+            return (el.readAttribute('type') != 'hidden');
+        });
         var isDisabled = (checked != undefined ? checked : checkbox.checked);
         elems.each(function (elem) {
             if (checkByProductPriceType(elem)) {
diff --git a/lib/web/mage/menu.js b/lib/web/mage/menu.js
index cc8061f60de1c9cbef742811cdb40154e47e6248..a6753de58fbf2aab8a58e85266faad960906d5d4 100644
--- a/lib/web/mage/menu.js
+++ b/lib/web/mage/menu.js
@@ -48,7 +48,7 @@ define([
 
             if(this.options.responsive === true){
                 mediaCheck({
-                    media: '(max-width: 768px)',
+                    media: '(max-width: 640px)',
                     entry: $.proxy(function() {
                         this._toggleMobileMode();
                     }, this),
@@ -64,8 +64,7 @@ define([
         _assignControls: function() {
             this.controls = {
                 toggleBtn: $('[data-action="toggle-nav"]'),
-                swipeArea: $('.panel.wrapper'),
-                wrapper: $('.page-wrapper')
+                swipeArea: $('.nav-sections')
             };
 
             return this;
@@ -80,7 +79,17 @@ define([
         },
 
         toggle: function() {
-            this.controls.wrapper.toggleClass('open');
+            if ($('html').hasClass('nav-open')) {
+                $('html').removeClass('nav-open');
+                setTimeout(function() {
+                    $('html').removeClass('nav-before-open');
+                },300);
+            } else {
+                $('html').addClass('nav-before-open');
+                setTimeout(function() {
+                    $('html').addClass('nav-open');
+                },42);
+            }
         },
 
         //Add class for expanded option
@@ -262,7 +271,7 @@ define([
         },
 
         _toggleMobileMode: function() {
-            $(this.element).unbind('mouseenter mouseleave'); 
+            $(this.element).unbind('mouseenter mouseleave');
             this._on({
                 "click .ui-menu-item:has(a)": function( event ) {
                     event.preventDefault();