diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4dff18dd67b5277c060ab2df7ffb8e0725eb78bb..547218c2a2430f34900a8db688dcf9d22e5fe4fc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,32 @@
+2.0.0.0-dev60
+=============
+* Fixed bugs:
+  * Fixed an issue with exceeding the memory limit when uploading very big images
+  * Fixed an issue in moving a category when $afterCategoryId is null
+  * Fixed an issue when products from a non-default website were not available as bundle items
+  * Fixed an issue when orders placed via Authorize.net had the wrong statuses
+  * Fixed an issue where orders placed via PayPal Express Checkout could not be placed if HTTPS was used on the frontend
+  * Fixed a security issue with a user session during registration
+  * Removed a CSRF vulnerability in checkout
+  * Fixed an issue with JavaScript static testing framework not handling corrupted paths in white/black lists properly
+  * Fixed an issue with Google Shopping synchronization
+  * Fixed the contextual help tooltip design
+  * Fixed an issue with the Authorize.net CC section UI on the Onepage Checkout page
+  * Fixed UI issues on the order pages in the backend
+  * Fixed UI issues in the backend for IE9
+  * Fixed UI issues on the Edit Customer page in the backend
+  * Fixed a UI issue with the image preview placeholder on the Edit Product page for IE9
+  * Fixed UI issues with forms in the backend
+  * Fixed UI issues with buttons in the backend
+  * Fixed an issue with a product status after a virtual product was duplicated
+  * Fixed a fatal error with attribute file from the customer account page in the backend
+  * Fixed a security issue when CURLOPT_SSL_VERIFYPEER and CURLOPT_SSL_VERIFYHOST where used with improper values sometimes
+  * Updated the field descriptions for Secure Base URL settings in the backend
+  * Fixed an issue in product duplication for multiple store views
+  * Consolidated several 3rd-party JavaScript libraries in the pub/lib directory, and fixed license notice texts to conform to the open source license requirements
+* Service Layer implementation:
+  * Implemented the initial set of services for the Customer module
+
 2.0.0.0-dev59
 =============
 * Fixed bugs:
@@ -103,6 +132,10 @@
   * Fixed date resetting to 1 Jan 1970 after saving a design change in the admin panel in case date format is DD/MM/YY
   * Fixed CAPTCHA on multi-address checkout flow
   * Fixed view files population tool
+  * Fixed DHL functionality of generation shipping labels
+  * Fixed target rule if it is applied for specific customer segment
+  * Fixed product importing that cleared price and weight
+  * Fixed fatal error when a file reference is added to HTML head
 * GitHub requests:
   * [#122](https://github.com/magento/magento2/pull/122) -- Added support of federal units of Brazil with 27 states
   * [#184](https://github.com/magento/magento2/issues/184) -- Removed unused blocks and methods in Magento_Wishlist module
diff --git a/app/code/Magento/Authorizenet/Model/Directpost/Observer.php b/app/code/Magento/Authorizenet/Model/Directpost/Observer.php
index a9091ad238770b4db0e217bfc653031ff5651880..3933a7ce5802d354afa42f2a27610ba7812dc681 100644
--- a/app/code/Magento/Authorizenet/Model/Directpost/Observer.php
+++ b/app/code/Magento/Authorizenet/Model/Directpost/Observer.php
@@ -57,9 +57,9 @@ class Observer
     protected $_authorizenetData;
 
     /**
-     * @var \Magento\Authorizenet\Model\DirectpostFactory
+     * @var \Magento\Authorizenet\Model\Directpost
      */
-    protected $_modelFactory;
+    protected $_payment;
 
     /**
      * @var \Magento\Authorizenet\Model\Directpost\Session
@@ -75,7 +75,7 @@ class Observer
      * @param \Magento\Authorizenet\Helper\Data $authorizenetData
      * @param \Magento\Core\Helper\Data $coreData
      * @param \Magento\Core\Model\Registry $coreRegistry
-     * @param \Magento\Authorizenet\Model\DirectpostFactory $modelFactory
+     * @param \Magento\Authorizenet\Model\Directpost $payment
      * @param \Magento\Authorizenet\Model\Directpost\Session $session
      * @param \Magento\Core\Model\StoreManagerInterface $storeManager
      */
@@ -83,14 +83,14 @@ class Observer
         \Magento\Authorizenet\Helper\Data $authorizenetData,
         \Magento\Core\Helper\Data $coreData,
         \Magento\Core\Model\Registry $coreRegistry,
-        \Magento\Authorizenet\Model\DirectpostFactory $modelFactory,
+        \Magento\Authorizenet\Model\Directpost $payment,
         \Magento\Authorizenet\Model\Directpost\Session $session,
         \Magento\Core\Model\StoreManagerInterface $storeManager
     ) {
         $this->_coreRegistry = $coreRegistry;
         $this->_authorizenetData = $authorizenetData;
         $this->_coreData = $coreData;
-        $this->_modelFactory = $modelFactory;
+        $this->_payment = $payment;
         $this->_session = $session;
         $this->_storeManager = $storeManager;
     }
@@ -123,9 +123,11 @@ class Observer
 
         if ($order && $order->getId()) {
             $payment = $order->getPayment();
-            if ($payment && $payment->getMethod() == $this->_modelFactory->create()->getCode()) {
-                $request = $observer->getEvent()->getRequest();
-                $response = $observer->getEvent()->getResponse();
+            if ($payment && $payment->getMethod() == $this->_payment->getCode()) {
+                /** @var \Magento\Checkout\Controller\Action $controller */
+                $controller = $observer->getEvent()->getData('controller_action');
+                $request = $controller->getRequest();
+                $response = $controller->getResponse();
                 $result = $this->_coreData->jsonDecode($response->getBody('default'));
 
                 if (empty($result['error'])) {
diff --git a/app/code/Magento/Backend/App/Response/Http/FileFactory.php b/app/code/Magento/Backend/App/Response/Http/FileFactory.php
index bdd5467f3eea403e0d0880f2f7d62bb6b19ac704..1d31691362280c1cfb59d95849c3742847b7d3ce 100644
--- a/app/code/Magento/Backend/App/Response/Http/FileFactory.php
+++ b/app/code/Magento/Backend/App/Response/Http/FileFactory.php
@@ -104,15 +104,21 @@ class FileFactory extends \Magento\App\Response\Http\FileFactory
      * @param string $fileName
      * @param string|array $content set to null to avoid starting output, $contentLength should be set explicitly in
      * that case
+     * @param string $baseDir
      * @param string $contentType
      * @param int $contentLength    explicit content length, if strlen($content) isn't applicable
      * @return \Magento\App\ResponseInterface
      */
-    public function create($fileName, $content, $contentType = 'application/octet-stream', $contentLength = null)
-    {
+    public function create(
+        $fileName,
+        $content,
+        $baseDir = \Magento\Filesystem::ROOT,
+        $contentType = 'application/octet-stream',
+        $contentLength = null
+    ) {
         if ($this->_auth->getAuthStorage()->isFirstPageAfterLogin()) {
             return $this->_redirect($this->_backendUrl->getStartupPageUrl());
         }
-        return parent::create($fileName, $content, $contentType, $contentLength);
+        return parent::create($fileName, $content, $baseDir, $contentType, $contentLength);
     }
 }
diff --git a/app/code/Magento/Backend/Block/Widget/Grid/Column/Renderer/Currency.php b/app/code/Magento/Backend/Block/Widget/Grid/Column/Renderer/Currency.php
index 8f7f5c740d4782464931bd1118c06116236391ea..d27929d23a4736d1fe474264b4fdf961fed230b8 100644
--- a/app/code/Magento/Backend/Block/Widget/Grid/Column/Renderer/Currency.php
+++ b/app/code/Magento/Backend/Block/Widget/Grid/Column/Renderer/Currency.php
@@ -63,21 +63,30 @@ class Currency
      */
     protected $_currencyLocator;
 
+    /**
+     * @var \Magento\Directory\Model\Currency
+     */
+    protected $_baseCurrency;
+
     /**
      * @param \Magento\Backend\Block\Context $context
      * @param \Magento\Core\Model\StoreManagerInterface $storeManager
      * @param \Magento\Directory\Model\Currency\DefaultLocator $currencyLocator
+     * @param \Magento\Directory\Model\CurrencyFactory $currencyFactory
      * @param array $data
      */
     public function __construct(
         \Magento\Backend\Block\Context $context,
         \Magento\Core\Model\StoreManagerInterface $storeManager,
         \Magento\Directory\Model\Currency\DefaultLocator $currencyLocator,
+        \Magento\Directory\Model\CurrencyFactory $currencyFactory,
         array $data = array()
     ) {
         parent::__construct($context, $data);
         $this->_storeManager = $storeManager;
         $this->_currencyLocator = $currencyLocator;
+        $baseCurrencyCode = $this->_app->getBaseCurrencyCode();
+        $this->_baseCurrency = $currencyFactory->create()->load($baseCurrencyCode);
     }
 
     /**
@@ -131,7 +140,7 @@ class Currency
         if ($rate = $row->getData($this->getColumn()->getRateField())) {
             return floatval($rate);
         }
-        return $this->_storeManager->getStore()->getBaseCurrency()->getRate($this->_getCurrencyCode($row));
+        return $this->_baseCurrency->getRate($this->_getCurrencyCode($row));
     }
 
     /**
diff --git a/app/code/Magento/Backend/Controller/Adminhtml/System/Config.php b/app/code/Magento/Backend/Controller/Adminhtml/System/Config.php
index 87dc52fe4cf44566df64c01f24fbf09cd6c93679..f52eeafb16267372aef95844497d2d3774132f81 100644
--- a/app/code/Magento/Backend/Controller/Adminhtml/System/Config.php
+++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Config.php
@@ -132,6 +132,6 @@ class Config extends \Magento\Backend\Controller\Adminhtml\System\AbstractConfig
         }
         $gridBlock->setWebsiteId($website->getId())->setConditionName($conditionName);
         $content = $gridBlock->getCsvFile();
-        return $this->_fileFactory->create($fileName, $content);
+        return $this->_fileFactory->create($fileName, $content, \Magento\Filesystem::VAR_DIR);
     }
 }
diff --git a/app/code/Magento/Backend/etc/adminhtml/system.xml b/app/code/Magento/Backend/etc/adminhtml/system.xml
index 116468e20ffd92b0aca0ef6818a07da5e9957f3d..51b94714722eeda27321f430e61df074691c6557 100644
--- a/app/code/Magento/Backend/etc/adminhtml/system.xml
+++ b/app/code/Magento/Backend/etc/adminhtml/system.xml
@@ -551,7 +551,7 @@
             </group>
             <group id="secure" translate="label" type="text" sortOrder="20" showInDefault="1" showInWebsite="1" showInStore="1">
                 <label>Base URLs (Secure)</label>
-                <comment>Any of the fields allow fully qualified URLs that end with '/' (slash) e.g. http://example.com/magento/</comment>
+                <comment>Any of the fields allow fully qualified URLs that end with '/' (slash) e.g. https://example.com/magento/</comment>
                 <field id="base_url" translate="label comment" type="text" sortOrder="10" showInDefault="1" showInWebsite="1" showInStore="1">
                     <label>Secure Base URL</label>
                     <backend_model>Magento\Backend\Model\Config\Backend\Baseurl</backend_model>
@@ -586,11 +586,13 @@
                     <label>Use Secure URLs in Frontend</label>
                     <source_model>Magento\Backend\Model\Config\Source\Yesno</source_model>
                     <backend_model>Magento\Backend\Model\Config\Backend\Secure</backend_model>
+                    <comment>Enter https protocol to use Secure URLs in Frontend.</comment>
                 </field>
                 <field id="use_in_adminhtml" translate="label" type="select" sortOrder="60" showInDefault="1" showInWebsite="0" showInStore="0">
                     <label>Use Secure URLs in Admin</label>
                     <source_model>Magento\Backend\Model\Config\Source\Yesno</source_model>
                     <backend_model>Magento\Backend\Model\Config\Backend\Secure</backend_model>
+                    <comment>Enter https protocol to use Secure URLs in Admin.</comment>
                 </field>
                 <field id="offloader_header" translate="label" type="text" sortOrder="70" showInDefault="1" showInWebsite="0" showInStore="0">
                     <label>Offloader header</label>
diff --git a/app/code/Magento/Backend/view/adminhtml/admin/login.phtml b/app/code/Magento/Backend/view/adminhtml/admin/login.phtml
index 870740c2c7d1dcb535e31e11b1f08f2f9bb7f6d0..6ab6f9a707dc23fbdde47047d217d52ba138ac54 100644
--- a/app/code/Magento/Backend/view/adminhtml/admin/login.phtml
+++ b/app/code/Magento/Backend/view/adminhtml/admin/login.phtml
@@ -26,7 +26,6 @@
 ?>
 <!doctype html>
 <html lang="en">
-
 <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     <title><?php echo __('Log into Magento Admin Page') ?></title>
@@ -38,10 +37,12 @@
     <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('mui/base.css') ?>" media="all" />
     <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('mui/elements.css') ?>" media="all" />
     <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('mui/form.css') ?>" media="all" />
-    <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('css/styles.css') ?>" media="all" />
+    <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('css/admin.css') ?>" media="all" />
+    <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('css/header.css') ?>" media="all" />
+    <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('css/pages.css') ?>" media="all" />
+    <?php /* <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('css/styles.css') ?>" media="all" /> */?>
     <link rel="stylesheet" href="<?php echo $this->getViewFileUrl('mui/utils.css') ?>" media="all" />
 
-
     <script src="<?php echo $this->getViewFileUrl('jquery/jquery.js') ?>"></script>
     <script src="<?php echo $this->getViewFileUrl('mage/jquery-no-conflict.js') ?>"></script>
     <script src="<?php echo $this->getViewFileUrl('jquery/jquery-ui.js') ?>"></script>
@@ -55,9 +56,9 @@
     <script src="<?php echo $this->getViewFileUrl('prototype/prototype.js') ?>"></script>
     <script src="<?php echo $this->getViewFileUrl('scriptaculous/effects.js') ?>"></script>
     <script src="<?php echo $this->getViewFileUrl('mage/captcha.js') ?>"></script>
-    <script src="<?php echo $this->getViewFileUrl('lib/modernizr.js') ?>"></script>
-    <script src="<?php echo $this->getViewFileUrl('js/head.js') ?>"></script>
-
+    <script src="<?php echo $this->getViewFileUrl('modernizr/modernizr.js') ?>"></script>
+    <script src="<?php echo $this->getViewFileUrl('headjs/head.min.js') ?>"></script>
+</head>
 <body id="page-login" class="page-login" onload="document.forms['login-form'].username.focus();">
     <div class="wrapper">
         <div class="wrapper-inner">
diff --git a/app/code/Magento/Backend/view/adminhtml/layout/default.xml b/app/code/Magento/Backend/view/adminhtml/layout/default.xml
index 2617de104d60a57b35fa944584d1c408c9746ad8..6ac8380a4c0c8fb0ac9db59a8284f3fad672abfd 100644
--- a/app/code/Magento/Backend/view/adminhtml/layout/default.xml
+++ b/app/code/Magento/Backend/view/adminhtml/layout/default.xml
@@ -46,7 +46,7 @@
             </block>
             <block class="Magento\Theme\Block\Html\Head\Script" name="head-load-min-js">
                 <arguments>
-                    <argument name="file" xsi:type="string">head.load.min.js</argument>
+                    <argument name="file" xsi:type="string">headjs/head.load.min.js</argument>
                 </arguments>
             </block>
             <block class="Magento\Theme\Block\Html\Head\Script" name="underscore-js">
@@ -300,4 +300,4 @@
         </block>
         <container name="before_body_end" as="before_body_end" label="Before Body End"/>
     </block>
-</layout>
\ No newline at end of file
+</layout>
diff --git a/app/code/Magento/Backend/view/adminhtml/layout/editor.xml b/app/code/Magento/Backend/view/adminhtml/layout/editor.xml
index c3b4b1594a8d0534a285e6f16f1f44bfef97dcc7..da3199561ac85f8984225f9fb06c8d758c44b093 100644
--- a/app/code/Magento/Backend/view/adminhtml/layout/editor.xml
+++ b/app/code/Magento/Backend/view/adminhtml/layout/editor.xml
@@ -40,7 +40,7 @@
         </block>
         <block class="Magento\Theme\Block\Html\Head\Script" name="lib-flex-js">
             <arguments>
-                <argument name="file" xsi:type="string">lib/flex.js</argument>
+                <argument name="file" xsi:type="string">mage/flex.js</argument>
             </arguments>
         </block>
         <block class="Magento\Theme\Block\Html\Head\Script" name="lib-fabridge-js">
diff --git a/app/code/Magento/Backup/Controller/Adminhtml/Index.php b/app/code/Magento/Backup/Controller/Adminhtml/Index.php
index 55e5ab38d71a89608e48b30ed7f46b94661ea2dc..7eaac4b66cdd891eb41f9b240b43b2d7fcfad2ce 100644
--- a/app/code/Magento/Backup/Controller/Adminhtml/Index.php
+++ b/app/code/Magento/Backup/Controller/Adminhtml/Index.php
@@ -212,7 +212,13 @@ class Index extends \Magento\Backend\App\Action
         $fileName = $this->_objectManager->get('Magento\Backup\Helper\Data')
             ->generateBackupDownloadName($backup);
 
-        $response = $this->_fileFactory->create($fileName, null, 'application/octet-stream', $backup->getSize());
+        $response = $this->_fileFactory->create(
+            $fileName,
+            null,
+            \Magento\Filesystem::VAR_DIR,
+            'application/octet-stream',
+            $backup->getSize()
+        );
 
         $response->sendHeaders();
 
diff --git a/app/code/Magento/Bundle/Block/Adminhtml/Catalog/Product/Edit/Tab/Bundle/Option/Search/Grid.php b/app/code/Magento/Bundle/Block/Adminhtml/Catalog/Product/Edit/Tab/Bundle/Option/Search/Grid.php
index 145af9ddf9f3009605c0cacb27649625a5cd2390..e16dc110396acbd01aeec50465d2137299c7b7ac 100644
--- a/app/code/Magento/Bundle/Block/Adminhtml/Catalog/Product/Edit/Tab/Bundle/Option/Search/Grid.php
+++ b/app/code/Magento/Bundle/Block/Adminhtml/Catalog/Product/Edit/Tab/Bundle/Option/Search/Grid.php
@@ -115,7 +115,6 @@ class Grid
     {
         $collection = $this->_productFactory->create()->getCollection()
             ->setOrder('id')
-            ->setStore($this->getStore())
             ->addAttributeToSelect('name')
             ->addAttributeToSelect('sku')
             ->addAttributeToSelect('price')
@@ -123,7 +122,7 @@ class Grid
             ->addAttributeToFilter('entity_id', array('nin' => $this->_getSelectedProducts()))
             ->addAttributeToFilter('type_id', array('in' => $this->getAllowedSelectionTypes()))
             ->addFilterByRequiredOptions()
-            ->addStoreFilter();
+            ->addStoreFilter(\Magento\Core\Model\Store::DEFAULT_STORE_ID);
 
         if ($this->getFirstShow()) {
             $collection->addIdFilter('-1');
@@ -169,8 +168,6 @@ class Grid
             'header'    => __('Price'),
             'align'     => 'center',
             'type'      => 'currency',
-            'currency_code' => $this->getStore()->getCurrentCurrencyCode(),
-            'rate'      => $this->getStore()->getBaseCurrency()->getRate($this->getStore()->getCurrentCurrencyCode()),
             'index'     => 'price',
             'header_css_class'=> 'col-price',
             'column_css_class'=> 'col-price'
@@ -208,11 +205,6 @@ class Grid
         }
     }
 
-    public function getStore()
-    {
-        return $this->_storeManager->getStore();
-    }
-
     /**
      * Retrieve array of allowed product types for bundle selection product
      *
diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Grid.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Grid.php
index c62e6b71d6ea3bf86be1f1b93db08bf9879d8724..ace24f16369238a9a67c7c6ce1c8990d42c6e800 100644
--- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Grid.php
+++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Grid.php
@@ -135,15 +135,18 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
             ->addAttributeToSelect('sku')
             ->addAttributeToSelect('name')
             ->addAttributeToSelect('attribute_set_id')
-            ->addAttributeToSelect('type_id');
+            ->addAttributeToSelect('type_id')
+            ->setStore($store);
 
         if ($this->_catalogData->isModuleEnabled('Magento_CatalogInventory')) {
-            $collection->joinField('qty',
+            $collection->joinField(
+                'qty',
                 'cataloginventory_stock_item',
                 'qty',
                 'product_id=entity_id',
                 '{{table}}.stock_id=1',
-                'left');
+                'left'
+            );
         }
         if ($store->getId()) {
             //$collection->setStoreId($store->getId());
@@ -188,8 +191,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
                 'left',
                 $store->getId()
             );
-        }
-        else {
+        } else {
             $collection->addAttributeToSelect('price');
             $collection->joinAttribute('status', 'catalog_product/status', 'entity_id', null, 'inner');
             $collection->joinAttribute('visibility', 'catalog_product/visibility', 'entity_id', null, 'inner');
@@ -206,12 +208,14 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
     {
         if ($this->getCollection()) {
             if ($column->getId() == 'websites') {
-                $this->getCollection()->joinField('websites',
+                $this->getCollection()->joinField(
+                    'websites',
                     'catalog_product_website',
                     'website_id',
                     'product_id=entity_id',
                     null,
-                    'left');
+                    'left'
+                );
             }
         }
         return parent::_addColumnFilterToCollection($column);
@@ -219,7 +223,8 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
 
     protected function _prepareColumns()
     {
-        $this->addColumn('entity_id',
+        $this->addColumn(
+            'entity_id',
             array(
                 'header'=> __('ID'),
                 'width' => '50px',
@@ -227,28 +232,34 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
                 'index' => 'entity_id',
                 'header_css_class'  => 'col-id',
                 'column_css_class'  => 'col-id'
-        ));
-        $this->addColumn('name',
+            )
+        );
+        $this->addColumn(
+            'name',
             array(
                 'header'=> __('Name'),
                 'index' => 'name',
                 'class' => 'xxx',
                 'header_css_class'  => 'col-name',
                 'column_css_class'  => 'col-name'
-        ));
+            )
+        );
 
         $store = $this->_getStore();
         if ($store->getId()) {
-            $this->addColumn('custom_name',
+            $this->addColumn(
+                'custom_name',
                 array(
                     'header'=> __('Name in %1', $store->getName()),
                     'index' => 'custom_name',
                     'header_css_class'  => 'col-name',
                     'column_css_class'  => 'col-name'
-            ));
+                )
+            );
         }
 
-        $this->addColumn('type',
+        $this->addColumn(
+            'type',
             array(
                 'header'=> __('Type'),
                 'width' => '60px',
@@ -257,14 +268,16 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
                 'options' => $this->_type->getOptionArray(),
                 'header_css_class'  => 'col-type',
                 'column_css_class'  => 'col-type'
-        ));
+            )
+        );
 
         $sets = $this->_setsFactory->create()
             ->setEntityTypeFilter($this->_productFactory->create()->getResource()->getTypeId())
             ->load()
             ->toOptionHash();
 
-        $this->addColumn('set_name',
+        $this->addColumn(
+            'set_name',
             array(
                 'header'=> __('Attribute Set'),
                 'width' => '100px',
@@ -273,19 +286,23 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
                 'options' => $sets,
                 'header_css_class'  => 'col-attr-name',
                 'column_css_class'  => 'col-attr-name'
-        ));
+            )
+        );
 
-        $this->addColumn('sku',
+        $this->addColumn(
+            'sku',
             array(
                 'header'=> __('SKU'),
                 'width' => '80px',
                 'index' => 'sku',
                 'header_css_class'  => 'col-sku',
                 'column_css_class'  => 'col-sku'
-        ));
+            )
+        );
 
         $store = $this->_getStore();
-        $this->addColumn('price',
+        $this->addColumn(
+            'price',
             array(
                 'header'=> __('Price'),
                 'type'  => 'price',
@@ -293,10 +310,12 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
                 'index' => 'price',
                 'header_css_class'  => 'col-price',
                 'column_css_class'  => 'col-price'
-        ));
+            )
+        );
 
         if ($this->_catalogData->isModuleEnabled('Magento_CatalogInventory')) {
-            $this->addColumn('qty',
+            $this->addColumn(
+                'qty',
                 array(
                     'header'=> __('Quantity'),
                     'width' => '100px',
@@ -304,10 +323,12 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
                     'index' => 'qty',
                     'header_css_class'  => 'col-qty',
                     'column_css_class'  => 'col-qty'
-            ));
+                )
+            );
         }
 
-        $this->addColumn('visibility',
+        $this->addColumn(
+            'visibility',
             array(
                 'header'=> __('Visibility'),
                 'width' => '70px',
@@ -316,9 +337,11 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
                 'options' => $this->_visibility->getOptionArray(),
                 'header_css_class'  => 'col-visibility',
                 'column_css_class'  => 'col-visibility'
-        ));
+            )
+        );
 
-        $this->addColumn('status',
+        $this->addColumn(
+            'status',
             array(
                 'header'=> __('Status'),
                 'width' => '70px',
@@ -327,10 +350,12 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
                 'options' => $this->_status->getOptionArray(),
                 'header_css_class'  => 'col-status',
                 'column_css_class'  => 'col-status'
-        ));
+            )
+        );
 
         if (!$this->_storeManager->isSingleStoreMode()) {
-            $this->addColumn('websites',
+            $this->addColumn(
+                'websites',
                 array(
                     'header'=> __('Websites'),
                     'width' => '100px',
@@ -340,10 +365,12 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
                     'options'   => $this->_websiteFactory->create()->getCollection()->toOptionHash(),
                     'header_css_class'  => 'col-websites',
                     'column_css_class'  => 'col-websites'
-            ));
+                )
+            );
         }
 
-        $this->addColumn('edit',
+        $this->addColumn(
+            'edit',
             array(
                 'header'    => __('Edit'),
                 'width'     => '50px',
@@ -364,7 +391,8 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
                 'index'     => 'stores',
                 'header_css_class'  => 'col-action',
                 'column_css_class'  => 'col-action'
-        ));
+            )
+        );
 
         if ($this->_catalogData->isModuleEnabled('Magento_Rss')) {
             $this->addRssList('rss/catalog/notifystock', __('Notify Low Stock RSS'));
@@ -402,7 +430,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
              )
         ));
 
-        if ($this->_authorization->isAllowed('Magento_Catalog::update_attributes')){
+        if ($this->_authorization->isAllowed('Magento_Catalog::update_attributes')) {
             $this->getMassactionBlock()->addItem('attributes', array(
                 'label' => __('Update Attributes'),
                 'url'   => $this->getUrl('catalog/product_action_attribute/edit', array('_current'=>true))
@@ -420,9 +448,12 @@ class Grid extends \Magento\Backend\Block\Widget\Grid\Extended
 
     public function getRowUrl($row)
     {
-        return $this->getUrl('catalog/*/edit', array(
-            'store'=>$this->getRequest()->getParam('store'),
-            'id'=>$row->getId())
+        return $this->getUrl(
+            'catalog/*/edit',
+            array(
+                'store'=>$this->getRequest()->getParam('store'),
+                'id'=>$row->getId()
+            )
         );
     }
 }
diff --git a/app/code/Magento/Catalog/Model/Category.php b/app/code/Magento/Catalog/Model/Category.php
index abc1bf0c2ef8bf2222e72c7ff063a3ab42d83d72..857a2c412eedd2ceb21f596d99f6f06588fc04a4 100644
--- a/app/code/Magento/Catalog/Model/Category.php
+++ b/app/code/Magento/Catalog/Model/Category.php
@@ -291,7 +291,7 @@ class Category extends \Magento\Catalog\Model\AbstractModel
      * Move category
      *
      * @param   int $parentId new parent category id
-     * @param   int $afterCategoryId category id after which we have put current category
+     * @param   null|int $afterCategoryId category id after which we have put current category
      * @return  \Magento\Catalog\Model\Category
      * @throws \Magento\Core\Exception|\Exception
      */
diff --git a/app/code/Magento/Catalog/Model/Product.php b/app/code/Magento/Catalog/Model/Product.php
index 63e0bae368b224ad28fe1b0e60af1583c799d21a..c1516b3bf3d49b715483a81aff701f64aa528aae 100644
--- a/app/code/Magento/Catalog/Model/Product.php
+++ b/app/code/Magento/Catalog/Model/Product.php
@@ -241,7 +241,7 @@ class Product extends \Magento\Catalog\Model\AbstractModel
      * @param \Magento\Data\CollectionFactory $collectionFactory
      * @param \Magento\Filesystem $filesystem
      * @param array $data
-     * 
+     *
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
@@ -1184,7 +1184,7 @@ class Product extends \Magento\Catalog\Model\AbstractModel
             ->setCreatedAt(null)
             ->setUpdatedAt(null)
             ->setId(null)
-            ->setStoreId($this->_storeManager->getStore()->getId());
+            ->setStoreId(\Magento\Core\Model\Store::DEFAULT_STORE_ID);
 
         $this->_eventManager->dispatch(
             'catalog_model_product_duplicate',
diff --git a/app/code/Magento/Catalog/Model/Resource/Category.php b/app/code/Magento/Catalog/Model/Resource/Category.php
index 48fa74ffe6b9c5ecb84d3d18b70116353f45ac3c..6ad68ce9e380887a2beaf5abbab8f5f7de57a05e 100644
--- a/app/code/Magento/Catalog/Model/Resource/Category.php
+++ b/app/code/Magento/Catalog/Model/Resource/Category.php
@@ -920,32 +920,19 @@ class Category extends \Magento\Catalog\Model\Resource\AbstractResource
                 ->from($table, 'position')
                 ->where('entity_id = :entity_id');
             $position = $adapter->fetchOne($select, array('entity_id' => $afterCategoryId));
-
-            $bind = array(
-                'position' => new \Zend_Db_Expr($positionField . ' + 1')
-            );
-            $where = array(
-                'parent_id = ?' => $newParent->getId(),
-                $positionField . ' > ?' => $position
-            );
-            $adapter->update($table, $bind, $where);
-        } elseif ($afterCategoryId !== null) {
-            $position = 0;
-            $bind = array(
-                'position' => new \Zend_Db_Expr($positionField . ' + 1')
-            );
-            $where = array(
-                'parent_id = ?' => $newParent->getId(),
-                $positionField . ' > ?' => $position
-            );
-            $adapter->update($table, $bind, $where);
+            $position += 1;
         } else {
-            $select = $adapter->select()
-                ->from($table, array('position' => new \Zend_Db_Expr('MIN(' . $positionField . ')')))
-                ->where('parent_id = :parent_id');
-            $position = $adapter->fetchOne($select, array('parent_id' => $newParent->getId()));
+            $position = 1;
         }
-        $position += 1;
+
+        $bind = array(
+            'position' => new \Zend_Db_Expr($positionField . ' + 1')
+        );
+        $where = array(
+            'parent_id = ?' => $newParent->getId(),
+            $positionField . ' >= ?' => $position
+        );
+        $adapter->update($table, $bind, $where);
 
         return $position;
     }
diff --git a/app/code/Magento/Checkout/Controller/Onepage.php b/app/code/Magento/Checkout/Controller/Onepage.php
index 10389798c247d855b44839f4e31a8875a207d58c..5e0eb30d8633782c8b8c8e7dd51127ff39f9a0ae 100644
--- a/app/code/Magento/Checkout/Controller/Onepage.php
+++ b/app/code/Magento/Checkout/Controller/Onepage.php
@@ -52,17 +52,25 @@ class Onepage extends \Magento\Checkout\Controller\Action
      */
     protected $_coreRegistry = null;
 
+    /**
+     * @var \Magento\Core\App\Action\FormKeyValidator
+     */
+    protected $_formKeyValidator;
+
     /**
      * @param \Magento\App\Action\Context $context
      * @param \Magento\Customer\Model\Session $customerSession
      * @param \Magento\Core\Model\Registry $coreRegistry
+     * @param \Magento\Core\App\Action\FormKeyValidator $formKeyValidator
      */
     public function __construct(
         \Magento\App\Action\Context $context,
         \Magento\Customer\Model\Session $customerSession,
-        \Magento\Core\Model\Registry $coreRegistry
+        \Magento\Core\Model\Registry $coreRegistry,
+        \Magento\Core\App\Action\FormKeyValidator $formKeyValidator
     ) {
         $this->_coreRegistry = $coreRegistry;
+        $this->_formKeyValidator = $formKeyValidator;
         parent::__construct($context, $customerSession);
     }
 
@@ -534,6 +542,11 @@ class Onepage extends \Magento\Checkout\Controller\Action
      */
     public function saveOrderAction()
     {
+        if (!$this->_formKeyValidator->validate($this->getRequest())) {
+            $this->_redirect('*/*/');
+            return;
+        }
+
         if ($this->_expireAjax()) {
             return;
         }
diff --git a/app/code/Magento/Checkout/view/frontend/onepage/payment.phtml b/app/code/Magento/Checkout/view/frontend/onepage/payment.phtml
index 07d27b92b3395ce1eed728162dc89b05bc65f626..1ac3170f3c5b5e0f03be0907f1508f7dd0d426ab 100644
--- a/app/code/Magento/Checkout/view/frontend/onepage/payment.phtml
+++ b/app/code/Magento/Checkout/view/frontend/onepage/payment.phtml
@@ -23,6 +23,7 @@
  */
 ?>
 <form id="co-payment-form" class="form payments">
+    <?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>
diff --git a/app/code/Magento/Core/Model/App.php b/app/code/Magento/Core/Model/App.php
index 57bede32828d2459c0f8b145e6ce9d29d149bc16..ccc76fe963684eb77b68196e4c9d6029e983cac6 100644
--- a/app/code/Magento/Core/Model/App.php
+++ b/app/code/Magento/Core/Model/App.php
@@ -53,7 +53,7 @@ class App implements \Magento\Core\Model\AppInterface
     /**
      * Magento version
      */
-    const VERSION = '2.0.0.0-dev59';
+    const VERSION = '2.0.0.0-dev60';
 
 
     /**
@@ -804,7 +804,7 @@ class App implements \Magento\Core\Model\AppInterface
             'revision'  => '0',
             'patch'     => '0',
             'stability' => 'dev',
-            'number'    => '59',
+            'number'    => '60',
         );
     }
 }
diff --git a/app/code/Magento/Core/view/adminhtml/prototype/magento.css b/app/code/Magento/Core/view/adminhtml/prototype/magento.css
index e0e01a343585dd9995771b59684d1114cba73cb0..602c127772f365d991cff3b037e91dfcb035a8d1 100644
--- a/app/code/Magento/Core/view/adminhtml/prototype/magento.css
+++ b/app/code/Magento/Core/view/adminhtml/prototype/magento.css
@@ -171,8 +171,8 @@
 .popup-window .page-actions {
     padding: 0;
     position: absolute;
-    right: 19px;
-    top: 29px;
+    right: 43px;
+    top: 30px;
     z-index: 2;
 }
 
@@ -185,90 +185,6 @@
     margin: 5px 0 0;
 }
 
-/*
-    Styles for tables in popup window
--------------------------------------- */
-
-.popup-window .data {
-    border-collapse: inherit; /* do not remove this! without this rule in FF when table has only 1 row bottom and side borders disappear */
-    width: 100%;
-}
-
-.popup-window .grid .data {
-    border-left: 1px solid #c0bbaf;
-    border-right: 1px solid #c0bbaf;
-}
-
-.popup-window .grid .data td:first-child {
-    border-left-width: 0;
-}
-
-.popup-window .grid .data td:last-child {
-    border-left-width: 0;
-    border-right-width: 0;
-}
-
-.popup-window .grid .data tr:last-child td {
-    border-bottom-color: #c0bbaf;
-}
-
-.popup-window .grid tr.headings th,
-.popup-window .grid tr.filter th {
-    background: #fff;
-    border-color: #c9c2b8;
-    border-width: 0 0 1px;
-    color: #666;
-    padding: 3px 7px;
-}
-
-.popup-window .grid tr.headings th a {
-    color: #666;
-}
-
-.popup-window .data tr.headings th:hover > span {
-    border-color: #cac2b5;
-}
-
-.popup-window .grid tr.headings th a:after {
-    color: #dbd6ce;
-}
-
-.popup-window .grid tr.headings th a:hover:after {
-    color: #cac2b5;
-}
-
-.popup-window .grid .filter input.input-text,
-.popup-window .grid .filter select {
-    background: #fff;
-    border: 1px solid #ccc;
-    color: #666;
-}
-
-.popup-window .grid tr th:first-child {
-    border: 0;
-}
-
-.popup-window .grid tbody tr:first-child td {
-    border-top: 1px solid #eae8e4;
-}
-
-.popup-window .grid tbody tr td,
-.popup-window .grid tbody tr td:hover {
-    border-bottom: 1px solid #eae8e4;
-    padding: 3px 7px;
-}
-
-.popup-window .grid tbody tr:nth-child(odd) td,
-.popup-window .grid tbody tr:nth-child(odd):hover td {
-    background: #fbfaf6;
-}
-
-.popup-window .grid tr.on-mouse td,
-.popup-window .grid table tbody tr.on-mouse:hover td,
-.popup-window .grid table tbody tr.on-mouse:nth-child(odd):hover td {
-    background-color: #f3efea;
-}
-
 .popup-window .data .col-id {
     width: 35px;
 }
@@ -325,6 +241,10 @@
     margin: 0 5px 0 0;
 }
 
+.magento_message #contents-uploader {
+    margin: 0 0 18px;
+}
+
 .magento_message .fileinput-button {
     display: inline-block;
     cursor: pointer;
@@ -332,6 +252,18 @@
     vertical-align: middle;
 }
 
+.magento_message .fileinput-button span {
+    display: none;
+}
+
+.magento_message .fileinput-button input {
+    position: static;
+    border: none;
+    opacity: 1;
+    filter: alpha(opacity=1);
+    -moz-transform: none;
+}
+
 .magento_message .file-row {
     background: #fff;
     border: 1px solid #cac2b5;
@@ -422,7 +354,8 @@
 
 .ui-dialog .ui-dialog-title {
     color: #676056;
-    font: normal 20px/1 'CallunaSans';
+    font-size: 20px;
+    line-height: 1;
     display: block;
     padding: 19px 0 19px 20px;
     cursor: move;
@@ -464,10 +397,6 @@
     border: none;
 }
 
-.ui-dialog .ui-dialog-content {
-    padding: 10px 10px 0;
-}
-
 .ui-dialog .ui-dialog-content .fieldset {
     border-radius: 0;
     border: none;
@@ -475,7 +404,7 @@
 
 .ui-dialog .ui-dialog-content {
     overflow: auto;
-    padding: 25px 25px 0;
+    padding: 25px 25px 20px;
 }
 
 .ui-dialog .ui-dialog-content label.mage-error {
@@ -489,7 +418,7 @@
 
 .ui-dialog .ui-dialog-buttonpane {
     margin: 0;
-    padding: 25px;
+    padding: 0 25px 25px;
     border: none;
 }
 
diff --git a/app/code/Magento/Customer/Block/Adminhtml/Form/Element/File.php b/app/code/Magento/Customer/Block/Adminhtml/Form/Element/File.php
index 16efc3174897d09f696fa004850cbb0ccb6ac5c4..78309d6b9d3cc2db63eae84059fa06b5c29ecc9e 100644
--- a/app/code/Magento/Customer/Block/Adminhtml/Form/Element/File.php
+++ b/app/code/Magento/Customer/Block/Adminhtml/Form/Element/File.php
@@ -194,7 +194,7 @@ class File extends \Magento\Data\Form\Element\AbstractElement
     protected function _getPreviewUrl()
     {
         return $this->_adminhtmlData->getUrl('customer/index/viewfile', array(
-            'file' => $this->_escaper->urlEncode($this->getValue()),
+            'file' => $this->_adminhtmlData->urlEncode($this->getValue()),
         ));
     }
 
diff --git a/app/code/Magento/Customer/Block/Adminhtml/Grid/Renderer/Multiaction.php b/app/code/Magento/Customer/Block/Adminhtml/Grid/Renderer/Multiaction.php
index ba91bb791fbd7a97132aaf7210e9d8c160235e3c..d56732b70273932a7877d1e19158674a0c736da0 100644
--- a/app/code/Magento/Customer/Block/Adminhtml/Grid/Renderer/Multiaction.php
+++ b/app/code/Magento/Customer/Block/Adminhtml/Grid/Renderer/Multiaction.php
@@ -71,7 +71,7 @@ class Multiaction
      *
      * @param  array $action
      * @param  \Magento\Object $row
-     * @return string
+     * @return bool|string
      */
     protected function _toLinkHtml($action, \Magento\Object $row)
     {
@@ -81,12 +81,10 @@ class Multiaction
             if ($product->canConfigure()) {
                 $style = '';
                 $onClick = sprintf('onclick="return %s.configureItem(%s)"', $action['control_object'], $row->getId());
+                return sprintf('<a href="%s" %s %s>%s</a>', $action['url'], $style, $onClick, $action['caption']);
             } else {
-                $style = 'style="color: #CCC;"';
-                $onClick = '';
+                return false;
             }
-
-            return sprintf('<a href="%s" %s %s>%s</a>', $action['url'], $style, $onClick, $action['caption']);
         } else {
             return parent::_toLinkHtml($action, $row);
         }
diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Index.php b/app/code/Magento/Customer/Controller/Adminhtml/Index.php
index 59ef90046cd89a3c22ccb96ad4d1f8bdc990f549..fa3cbeada28de9f770b55e3c28ebbf3aa32ba916 100644
--- a/app/code/Magento/Customer/Controller/Adminhtml/Index.php
+++ b/app/code/Magento/Customer/Controller/Adminhtml/Index.php
@@ -472,7 +472,7 @@ class Index extends \Magento\Backend\App\Action
         $fileName = 'customers.csv';
         $content = $this->_view->getLayout()->createBlock('Magento\Customer\Block\Adminhtml\Grid')->getCsvFile();
 
-        return $this->_fileFactory->create($fileName, $content);
+        return $this->_fileFactory->create($fileName, $content, \Magento\Filesystem::VAR_DIR);
     }
 
     /**
@@ -482,7 +482,7 @@ class Index extends \Magento\Backend\App\Action
     {
         $fileName = 'customers.xml';
         $content = $this->_view->getLayout()->createBlock('Magento\Customer\Block\Adminhtml\Grid')->getExcelFile();
-        return $this->_fileFactory->create($fileName, $content);
+        return $this->_fileFactory->create($fileName, $content, \Magento\Filesystem::VAR_DIR);
     }
 
     /**
@@ -851,8 +851,8 @@ class Index extends \Magento\Backend\App\Action
 
         /** @var \Magento\Filesystem $filesystem */
         $filesystem = $this->_objectManager->get('Magento\Filesystem');
-        $directory = $filesystem->getDirectoryRead(\Magento\Filesystem:: MEDIA);
-        $fileName = 'customer/' . $file;
+        $directory = $filesystem->getDirectoryRead(\Magento\Filesystem::MEDIA);
+        $fileName = 'customer' . '/' . ltrim($file, '/');
         $path = $directory->getAbsolutePath($fileName);
         if (!$directory->isFile($fileName)
             && !$this->_objectManager->get('Magento\Core\Helper\File\Storage')
@@ -877,7 +877,7 @@ class Index extends \Magento\Backend\App\Action
                     $contentType = 'application/octet-stream';
                     break;
             }
-            $stat = $directory->stat($fileName);
+            $stat = $directory->stat($path);
             $contentLength = $stat['size'];
             $contentModify = $stat['mtime'];
 
@@ -893,10 +893,14 @@ class Index extends \Magento\Backend\App\Action
             echo $directory->readFile($fileName);
         } else {
             $name = pathinfo($path, PATHINFO_BASENAME);
-            $this->_fileFactory->create($name, array(
-                'type'  => 'filename',
-                'value' => $fileName
-            ))->sendResponse();
+            $this->_fileFactory->create(
+                $name,
+                array(
+                    'type'  => 'filename',
+                    'value' => $fileName
+                ),
+                \Magento\Filesystem::MEDIA
+            )->sendResponse();
         }
 
         exit();
diff --git a/app/code/Magento/Customer/Model/Address.php b/app/code/Magento/Customer/Model/Address.php
index 5c717ae04860cf7d8852a2079200882f39120029..4165b79e5662bb0743a6f81fec5fa59e3f4d709c 100644
--- a/app/code/Magento/Customer/Model/Address.php
+++ b/app/code/Magento/Customer/Model/Address.php
@@ -160,7 +160,7 @@ class Address extends \Magento\Customer\Model\Address\AbstractAddress
     /**
      * Retrieve address entity attributes
      *
-     * @return array
+     * @return \Magento\Customer\Model\Attribute[]
      */
     public function getAttributes()
     {
@@ -174,6 +174,16 @@ class Address extends \Magento\Customer\Model\Address\AbstractAddress
         return $attributes;
     }
 
+    /**
+     * Get attributes created by default
+     *
+     * @return string[]
+     */
+    public function getDefaultAttributeCodes()
+    {
+        return $this->_getResource()->getDefaultAttributes();
+    }
+
     public function __clone()
     {
         $this->setId(null);
diff --git a/app/code/Magento/Customer/Model/Converter.php b/app/code/Magento/Customer/Model/Converter.php
new file mode 100644
index 0000000000000000000000000000000000000000..a3f039a7fc27c3f76d2412e73f3086e2ca9ca4aa
--- /dev/null
+++ b/app/code/Magento/Customer/Model/Converter.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\Customer\Model;
+
+use Magento\Customer\Service\Entity\V1\Exception;
+use Magento\Customer\Service\V1\CustomerMetadataServiceInterface;
+
+/**
+ * Customer Model converter.
+ *
+ * Converts a Customer Model to a DTO.
+ *
+ * TODO: Remove this class after service refactoring is done and the model
+ * TODO: is no longer needed outside of service.  Then this function could
+ * TODO: be moved to the service.
+ */
+class Converter
+{
+    /**
+     * @var \Magento\Customer\Service\V1\Dto\CustomerBuilder
+     */
+    protected $_customerBuilder;
+
+    /**
+     * @var CustomerFactory
+     */
+    protected $_customerFactory;
+
+    /**
+     * @param CustomerFactory $customerFactory
+     * @param \Magento\Customer\Service\V1\Dto\CustomerBuilder $customerBuilder
+     */
+    public function __construct(
+        \Magento\Customer\Service\V1\Dto\CustomerBuilder $customerBuilder,
+        \Magento\Customer\Model\CustomerFactory $customerFactory
+    ) {
+        $this->_customerBuilder = $customerBuilder;
+        $this->_customerFactory = $customerFactory;
+    }
+
+    /**
+     * Convert a customer model to a customer entity
+     *
+     * @param \Magento\Customer\Model\Customer $customerModel
+     * @throws \InvalidArgumentException
+     * @return \Magento\Customer\Service\V1\Dto\Customer
+     */
+    public function createCustomerFromModel($customerModel)
+    {
+        if (!($customerModel instanceof \Magento\Customer\Model\Customer)) {
+            throw new \InvalidArgumentException('customer model is invalid');
+        }
+        $this->_convertAttributesFromModel($this->_customerBuilder, $customerModel);
+        $this->_customerBuilder->setCustomerId($customerModel->getId());
+        $this->_customerBuilder->setFirstname($customerModel->getFirstname());
+        $this->_customerBuilder->setLastname($customerModel->getLastname());
+        $this->_customerBuilder->setEmail($customerModel->getEmail());
+        return $this->_customerBuilder->create();
+    }
+
+
+    /**
+     * @param int $customerId
+     * @throws Exception If customerId is not found or other error occurs.
+     * @return Customer
+     */
+    public function getCustomerModel($customerId)
+    {
+        try {
+            $customer = $this->_customerFactory->create()->load($customerId);
+        } catch (\Exception $e) {
+            throw new Exception($e->getMessage(), $e->getCode(), $e);
+        }
+
+        if (!$customer->getId()) {
+            // customer does not exist
+            throw new Exception(
+                'No customer with customerId ' . $customerId . ' exists.',
+                Exception::CODE_INVALID_CUSTOMER_ID
+            );
+        } else {
+            return $customer;
+        }
+    }
+
+
+    /**
+     * Creates a customer model from a customer entity.
+     *
+     * @param \Magento\Customer\Service\V1\Dto\Customer $customer
+     * @return Customer
+     */
+    public function createCustomerModel(\Magento\Customer\Service\V1\Dto\Customer $customer)
+    {
+        $customerModel = $this->_customerFactory->create();
+
+        $attributes = $customer->getAttributes();
+        foreach ($attributes as $attributeCode => $attributeValue) {
+            // avoid setting password through set attribute
+            if ($attributeCode == 'password') {
+                continue;
+            } else {
+                $customerModel->setData($attributeCode, $attributeValue);
+            }
+        }
+
+        $customerId = $customer->getCustomerId();
+        if ($customerId) {
+            $customerModel->setId($customerId);
+        }
+
+        // Need to use attribute set or future updates can cause data loss
+        if (!$customerModel->getAttributeSetId()) {
+            $customerModel->setAttributeSetId(CustomerMetadataServiceInterface::CUSTOMER_ATTRIBUTE_SET_ID);
+            return $customerModel;
+        }
+
+        return $customerModel;
+    }
+
+    /**
+     * Loads the values from a customer model
+     *
+     * @param \Magento\Customer\Service\V1\Dto\CustomerBuilder $customerBuilder
+     * @param \Magento\Customer\Model\Customer $customerModel
+     */
+    protected function _convertAttributesFromModel($customerBuilder, $customerModel)
+    {
+        $attributes = [];
+        foreach ($customerModel->getAttributes() as $attribute) {
+            $attrCode = $attribute->getAttributeCode();
+            $value = $customerModel->getData($attrCode);
+            if (null == $value) {
+                continue;
+            }
+            $attributes[$attrCode] = $value;
+        }
+
+        $customerBuilder->populateWithArray($attributes);
+    }
+
+}
diff --git a/app/code/Magento/Customer/Model/Customer.php b/app/code/Magento/Customer/Model/Customer.php
index f50926cd4c704c065ae45f6ea679b23fe21d71ce..ea8c6f2d5af197902915df67d4fc6c7c4f0822db 100644
--- a/app/code/Magento/Customer/Model/Customer.php
+++ b/app/code/Magento/Customer/Model/Customer.php
@@ -30,6 +30,7 @@ namespace Magento\Customer\Model;
  * Customer model
  *
  * @method int getWebsiteId() getWebsiteId()
+ * @method \Magento\Customer\Model\Customer setWebsiteId(int)
  * @method int getStoreId() getStoreId()
  * @method string getEmail() getEmail()
  * @method \Magento\Customer\Model\Resource\Customer _getResource()
@@ -170,14 +171,14 @@ class Customer extends \Magento\Core\Model\AbstractModel
     protected $_emailInfoFactory;
 
     /**
-     * @var \Magento\Customer\Model\GroupFactory
+     * @var \Magento\Customer\Model\AttributeFactory
      */
-    protected $_groupFactory;
+    protected $_attributeFactory;
 
     /**
-     * @var \Magento\Customer\Model\AttributeFactory
+     * @var \Magento\Customer\Service\V1\CustomerGroupServiceInterface
      */
-    protected $_attributeFactory;
+    protected $_groupService;
 
     /**
      * @var \Magento\Encryption\EncryptorInterface
@@ -208,7 +209,7 @@ class Customer extends \Magento\Core\Model\AbstractModel
      * @param \Magento\Customer\Model\Resource\Address\CollectionFactory $addressesFactory
      * @param \Magento\Email\Model\Template\MailerFactory $mailerFactory
      * @param \Magento\Email\Model\InfoFactory $emailInfoFactory
-     * @param \Magento\Customer\Model\GroupFactory $groupFactory
+     * @param \Magento\Customer\Service\V1\CustomerGroupServiceInterface $groupService
      * @param \Magento\Customer\Model\AttributeFactory $attributeFactory
      * @param \Magento\Encryption\EncryptorInterface $encryptor
      * @param \Magento\Math\Random $mathRandom
@@ -230,7 +231,7 @@ class Customer extends \Magento\Core\Model\AbstractModel
         \Magento\Customer\Model\Resource\Address\CollectionFactory $addressesFactory,
         \Magento\Email\Model\Template\MailerFactory $mailerFactory,
         \Magento\Email\Model\InfoFactory $emailInfoFactory,
-        \Magento\Customer\Model\GroupFactory $groupFactory,
+        \Magento\Customer\Service\V1\CustomerGroupServiceInterface $groupService,
         \Magento\Customer\Model\AttributeFactory $attributeFactory,
         \Magento\Encryption\EncryptorInterface $encryptor,
         \Magento\Math\Random $mathRandom,
@@ -248,7 +249,7 @@ class Customer extends \Magento\Core\Model\AbstractModel
         $this->_addressesFactory = $addressesFactory;
         $this->_mailerFactory = $mailerFactory;
         $this->_emailInfoFactory = $emailInfoFactory;
-        $this->_groupFactory = $groupFactory;
+        $this->_groupService = $groupService;
         $this->_attributeFactory = $attributeFactory;
         $this->_encryptor = $encryptor;
         $this->mathRandom = $mathRandom;
@@ -296,9 +297,9 @@ class Customer extends \Magento\Core\Model\AbstractModel
             );
         }
         $this->_eventManager->dispatch('customer_customer_authenticated', array(
-           'model'    => $this,
-           'password' => $password,
-        ));
+                'model'    => $this,
+                'password' => $password,
+            ));
 
         return true;
     }
@@ -445,14 +446,14 @@ class Customer extends \Magento\Core\Model\AbstractModel
     /**
      * Retrieve all customer attributes
      *
-     * @return array
+     * @return \Magento\Customer\Model\Attribute[]
      */
     public function getAttributes()
     {
         if ($this->_attributes === null) {
             $this->_attributes = $this->_getResource()
-            ->loadAllAttributes($this)
-            ->getSortedAttributes();
+                ->loadAllAttributes($this)
+                ->getSortedAttributes();
         }
         return $this->_attributes;
     }
@@ -821,7 +822,7 @@ class Customer extends \Magento\Core\Model\AbstractModel
     {
         if (!$this->hasData('group_id')) {
             $storeId = $this->getStoreId() ? $this->getStoreId() : $this->_storeManager->getStore()->getId();
-            $groupId = $this->_coreStoreConfig->getConfig(\Magento\Customer\Model\Group::XML_PATH_DEFAULT_ID, $storeId);
+            $groupId = $this->_groupService->getDefaultGroup($storeId)->getId();
             $this->setData('group_id', $groupId);
         }
         return $this->getData('group_id');
@@ -835,7 +836,8 @@ class Customer extends \Magento\Core\Model\AbstractModel
     public function getTaxClassId()
     {
         if (!$this->getData('tax_class_id')) {
-            $this->setTaxClassId($this->_createCustomerGroup()->getTaxClassId($this->getGroupId()));
+            $groupTaxClassId = $this->_groupService->getGroup($this->getGroupId())->getTaxClassId();
+            $this->setData('tax_class_id', $groupTaxClassId);
         }
         return $this->getData('tax_class_id');
     }
@@ -1256,14 +1258,6 @@ class Customer extends \Magento\Core\Model\AbstractModel
         return $this->_emailInfoFactory->create();
     }
 
-    /**
-     * @return \Magento\Customer\Model\Group
-     */
-    protected function _createCustomerGroup()
-    {
-        return $this->_groupFactory->create();
-    }
-
     /**
      * @return \Magento\Customer\Model\Attribute
      */
diff --git a/app/code/Magento/Customer/Model/Metadata/ElementFactory.php b/app/code/Magento/Customer/Model/Metadata/ElementFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..6c7b83f39c7458bb04b72d770bb1ba28cc1bf052
--- /dev/null
+++ b/app/code/Magento/Customer/Model/Metadata/ElementFactory.php
@@ -0,0 +1,91 @@
+<?php
+/**
+ * Customer Form Element Factory
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to 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_Customer
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Customer\Model\Metadata;
+
+class ElementFactory
+{
+    /**
+     * @var \Magento\ObjectManager
+     */
+    protected $_objectManager;
+
+    /**
+     * @var \Magento\Stdlib\String
+     */
+    protected $_string;
+
+    /**
+     * @param \Magento\ObjectManager $objectManager
+     * @param \Magento\Stdlib\String $string
+     */
+    public function __construct(\Magento\ObjectManager $objectManager, \Magento\Stdlib\String $string)
+    {
+        $this->_objectManager = $objectManager;
+        $this->_string = $string;
+    }
+
+    /**
+     * Create Form Element
+     *
+     * @param \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata $attribute
+     * @param $value
+     * @param $entityTypeCode
+     * @param bool $isAjax
+     * @return \Magento\Customer\Model\Metadata\Form\AbstractData
+     */
+    public function create(
+        \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata $attribute,
+        $value,
+        $entityTypeCode,
+        $isAjax = false
+    ) {
+        $dataModelClass = $attribute->getDataModel();
+        $params = [
+            'entityTypeCode' => $entityTypeCode,
+            'value' => is_null($value) ? false : $value,
+            'isAjax' => $isAjax,
+            'attribute' => $attribute
+        ];
+        /** TODO fix when Validation is implemented MAGETWO-17341 */
+        if ($dataModelClass == 'Magento\Customer\Model\Attribute\Data\Postcode') {
+            $dataModelClass = 'Magento\Customer\Model\Metadata\Form\Text';
+        }
+        if (!empty($dataModelClass)) {
+            $dataModel = $this->_objectManager->create($dataModelClass, $params);
+        } else {
+            $dataModelClass = sprintf(
+                'Magento\Customer\Model\Metadata\Form\%s',
+                $this->_string->upperCaseWords($attribute->getFrontendInput())
+            );
+            $dataModel = $this->_objectManager->create($dataModelClass, $params);
+        }
+
+        return $dataModel;
+    }
+}
diff --git a/app/code/Magento/Customer/Model/Metadata/Form/AbstractData.php b/app/code/Magento/Customer/Model/Metadata/Form/AbstractData.php
new file mode 100644
index 0000000000000000000000000000000000000000..2dde4619fea813693240a4fbf61f125dc6a77a07
--- /dev/null
+++ b/app/code/Magento/Customer/Model/Metadata/Form/AbstractData.php
@@ -0,0 +1,559 @@
+<?php
+/**
+ * Form Element Abstract Data Model
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Eav
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Customer\Model\Metadata\Form;
+
+abstract class AbstractData
+{
+    /**
+     * Request Scope name
+     *
+     * @var string
+     */
+    protected $_requestScope;
+
+    /**
+     * Scope visibility flag
+     *
+     * @var boolean
+     */
+    protected $_requestScopeOnly    = true;
+
+    /**
+     * Is AJAX request flag
+     *
+     * @var boolean
+     */
+    protected $_isAjax              = false;
+
+    /**
+     * Array of full extracted data
+     * Needed for depends attributes
+     *
+     * @var array
+     */
+    protected $_extractedData       = array();
+
+    /**
+     * \Magento\Core\Model\LocaleInterface FORMAT
+     *
+     * @var string
+     */
+    protected $_dateFilterFormat;
+
+    /**
+     * @var \Magento\Core\Model\LocaleInterface
+     */
+    protected $_locale;
+
+    /**
+     * @var \Magento\Logger
+     */
+    protected $_logger;
+
+    /**
+     * @var \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata
+     */
+    protected $_attribute;
+
+    /**
+     * @var string
+     */
+    protected $_value;
+
+    /** @var  string */
+    protected $_entityTypeCode;
+
+    /**
+     * @param \Magento\Core\Model\LocaleInterface $locale
+     * @param \Magento\Logger $logger
+     * @param \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata $attribute
+     * @param string $value
+     * @param $entityTypeCode
+     * @param bool $isAjax
+     */
+    public function __construct(
+        \Magento\Core\Model\LocaleInterface $locale,
+        \Magento\Logger $logger,
+        \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata $attribute,
+        $value = null,
+        $entityTypeCode,
+        $isAjax = false
+    ) {
+        $this->_locale = $locale;
+        $this->_logger = $logger;
+        $this->_attribute = $attribute;
+        $this->_value = $value;
+        $this->_entityTypeCode = $entityTypeCode;
+        $this->_isAjax = $isAjax;
+    }
+
+    /**
+     * Return Attribute instance
+     *
+     * @throws \Magento\Core\Exception
+     * @return \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata
+     */
+    public function getAttribute()
+    {
+        if (!$this->_attribute) {
+            throw new \Magento\Core\Exception(__('Attribute object is undefined'));
+        }
+        return $this->_attribute;
+    }
+
+    /**
+     * Set Request scope
+     *
+     * @param string $scope
+     * @return string
+     */
+    public function setRequestScope($scope)
+    {
+        $this->_requestScope = $scope;
+        return $this;
+    }
+
+    /**
+     * Set scope visibility
+     * Search value only in scope or search value in scope and global
+     *
+     * @param boolean $flag
+     * @return \Magento\Customer\Model\Metadata\Form\AbstractData
+     */
+    public function setRequestScopeOnly($flag)
+    {
+        $this->_requestScopeOnly = (bool)$flag;
+        return $this;
+    }
+
+    /**
+     * Returns entity instance
+     *
+     * @return \Magento\Customer\Service\V1\Dto\Eav\EntityInterface
+     */
+    public function getEntity()
+    {
+        if (!$this->_entity) {
+            throw new \Magento\Core\Exception(__('Entity object is undefined'));
+        }
+        return $this->_entity;
+    }
+
+    /**
+     * Set array of full extracted data
+     *
+     * @param array $data
+     * @return \Magento\Customer\Model\Metadata\Form\AbstractData
+     */
+    public function setExtractedData(array $data)
+    {
+        $this->_extractedData = $data;
+        return $this;
+    }
+
+    /**
+     * Return extracted data
+     *
+     * @param string $index
+     * @return mixed
+     */
+    public function getExtractedData($index = null)
+    {
+        if (!is_null($index)) {
+            if (isset($this->_extractedData[$index])) {
+                return $this->_extractedData[$index];
+            }
+            return null;
+        }
+        return $this->_extractedData;
+    }
+
+    /**
+     * Apply attribute input filter to value
+     *
+     * @param string $value
+     * @return string
+     */
+    protected function _applyInputFilter($value)
+    {
+        if ($value === false) {
+            return false;
+        }
+
+        $filter = $this->_getFormFilter();
+        if ($filter) {
+            $value = $filter->inputFilter($value);
+        }
+
+        return $value;
+    }
+
+    /**
+     * Return Data Form Input/Output Filter
+     *
+     * @return \Magento\Data\Form\Filter\FilterInterface|false
+     */
+    protected function _getFormFilter()
+    {
+        $filterCode = $this->getAttribute()->getInputFilter();
+        if ($filterCode) {
+            $filterClass = 'Magento\Data\Form\Filter\\' . ucfirst($filterCode);
+            if ($filterCode == 'date') {
+                $filter = new $filterClass($this->_dateFilterFormat(), $this->_locale->getLocale());
+            } else {
+                $filter = new $filterClass();
+            }
+            return $filter;
+        }
+        return false;
+    }
+
+    /**
+     * Get/Set/Reset date filter format
+     *
+     * @param string|null|false $format
+     * @return \Magento\Customer\Model\Metadata\Form\AbstractData|string
+     */
+    protected function _dateFilterFormat($format = null)
+    {
+        if (is_null($format)) {
+            // get format
+            if (is_null($this->_dateFilterFormat)) {
+                $this->_dateFilterFormat = \Magento\Core\Model\LocaleInterface::FORMAT_TYPE_SHORT;
+            }
+            return $this->_locale->getDateFormat($this->_dateFilterFormat);
+        } else if ($format === false) {
+            // reset value
+            $this->_dateFilterFormat = null;
+            return $this;
+        }
+
+        $this->_dateFilterFormat = $format;
+        return $this;
+    }
+
+    /**
+     * Apply attribute output filter to value
+     *
+     * @param string $value
+     * @return string
+     */
+    protected function _applyOutputFilter($value)
+    {
+        $filter = $this->_getFormFilter();
+        if ($filter) {
+            $value = $filter->outputFilter($value);
+        }
+
+        return $value;
+    }
+
+    /**
+     * Validate value by attribute input validation rule
+     *
+     * @param string $value
+     * @return string|bool
+     */
+    protected function _validateInputRule($value)
+    {
+        // skip validate empty value
+        if (empty($value)) {
+            return true;
+        }
+
+        $label         = $this->getAttribute()->getStoreLabel();
+        $validateRules = $this->getAttribute()->getValidationRules();
+
+        if (!empty($validateRules['input_validation'])) {
+            switch ($validateRules['input_validation']) {
+                case 'alphanumeric':
+                    $validator = new \Zend_Validate_Alnum(true);
+                    $validator->setMessage(
+                        __('"%1" invalid type entered.', $label),
+                        \Zend_Validate_Alnum::INVALID
+                    );
+                    $validator->setMessage(
+                        __('"%1" contains non-alphabetic or non-numeric characters.', $label),
+                        \Zend_Validate_Alnum::NOT_ALNUM
+                    );
+                    $validator->setMessage(
+                        __('"%1" is an empty string.', $label),
+                        \Zend_Validate_Alnum::STRING_EMPTY
+                    );
+                    if (!$validator->isValid($value)) {
+                        return $validator->getMessages();
+                    }
+                    break;
+                case 'numeric':
+                    $validator = new \Zend_Validate_Digits();
+                    $validator->setMessage(
+                        __('"%1" invalid type entered.', $label),
+                        \Zend_Validate_Digits::INVALID
+                    );
+                    $validator->setMessage(
+                        __('"%1" contains non-numeric characters.', $label),
+                        \Zend_Validate_Digits::NOT_DIGITS
+                    );
+                    $validator->setMessage(
+                        __('"%1" is an empty string.', $label),
+                        \Zend_Validate_Digits::STRING_EMPTY
+                    );
+                    if (!$validator->isValid($value)) {
+                        return $validator->getMessages();
+                    }
+                    break;
+                case 'alpha':
+                    $validator = new \Zend_Validate_Alpha(true);
+                    $validator->setMessage(
+                        __('"%1" invalid type entered.', $label),
+                        \Zend_Validate_Alpha::INVALID
+                    );
+                    $validator->setMessage(
+                        __('"%1" contains non-alphabetic characters.', $label),
+                        \Zend_Validate_Alpha::NOT_ALPHA
+                    );
+                    $validator->setMessage(
+                        __('"%1" is an empty string.', $label),
+                        \Zend_Validate_Alpha::STRING_EMPTY
+                    );
+                    if (!$validator->isValid($value)) {
+                        return $validator->getMessages();
+                    }
+                    break;
+                case 'email':
+        /**
+        __("'%value%' appears to be a DNS hostname but the given punycode notation cannot be decoded")
+        __("Invalid type given. String expected")
+        __("'%value%' appears to be a DNS hostname but contains a dash in an invalid position")
+        __("'%value%' does not match the expected structure for a DNS hostname")
+        __("'%value%' appears to be a DNS hostname but cannot match against hostname schema for TLD '%tld%'")
+        __("'%value%' does not appear to be a valid local network name")
+        __("'%value%' does not appear to be a valid URI hostname")
+        __("'%value%' appears to be an IP address, but IP addresses are not allowed")
+        __("'%value%' appears to be a local network name but local network names are not allowed")
+        __("'%value%' appears to be a DNS hostname but cannot extract TLD part")
+        __("'%value%' appears to be a DNS hostname but cannot match TLD against known list")
+        */
+                    $validator = new \Zend_Validate_EmailAddress();
+                    $validator->setMessage(
+                        __('"%1" invalid type entered.', $label),
+                        \Zend_Validate_EmailAddress::INVALID
+                    );
+                    $validator->setMessage(
+                        __('"%1" is not a valid email address.', $label),
+                        \Zend_Validate_EmailAddress::INVALID_FORMAT
+                    );
+                    $validator->setMessage(
+                        __('"%1" is not a valid hostname.', $label),
+                        \Zend_Validate_EmailAddress::INVALID_HOSTNAME
+                    );
+                    $validator->setMessage(
+                        __('"%1" is not a valid hostname.', $label),
+                        \Zend_Validate_EmailAddress::INVALID_MX_RECORD
+                    );
+                    $validator->setMessage(
+                        __('"%1" is not a valid hostname.', $label),
+                        \Zend_Validate_EmailAddress::INVALID_MX_RECORD
+                    );
+                    $validator->setMessage(
+                        __('"%1" is not a valid email address.', $label),
+                        \Zend_Validate_EmailAddress::DOT_ATOM
+                    );
+                    $validator->setMessage(
+                        __('"%1" is not a valid email address.', $label),
+                        \Zend_Validate_EmailAddress::QUOTED_STRING
+                    );
+                    $validator->setMessage(
+                        __('"%1" is not a valid email address.', $label),
+                        \Zend_Validate_EmailAddress::INVALID_LOCAL_PART
+                    );
+                    $validator->setMessage(
+                        __('"%1" exceeds the allowed length.', $label),
+                        \Zend_Validate_EmailAddress::LENGTH_EXCEEDED
+                    );
+                    $validator->setMessage(
+                        __("'%value%' appears to be an IP address, but IP addresses are not allowed."),
+                        \Zend_Validate_Hostname::IP_ADDRESS_NOT_ALLOWED
+                    );
+                    $validator->setMessage(
+                        __("'%value%' appears to be a DNS hostname but cannot match TLD against known list."),
+                        \Zend_Validate_Hostname::UNKNOWN_TLD
+                    );
+                    $validator->setMessage(
+                        __("'%value%' appears to be a DNS hostname but contains a dash in an invalid position."),
+                        \Zend_Validate_Hostname::INVALID_DASH
+                    );
+                    $validator->setMessage(
+                        __("'%value%' appears to be a DNS hostname but cannot match against hostname schema for TLD '%tld%'."),
+                        \Zend_Validate_Hostname::INVALID_HOSTNAME_SCHEMA
+                    );
+                    $validator->setMessage(
+                        __("'%value%' appears to be a DNS hostname but cannot extract TLD part."),
+                        \Zend_Validate_Hostname::UNDECIPHERABLE_TLD
+                    );
+                    $validator->setMessage(
+                        __("'%value%' does not appear to be a valid local network name."),
+                        \Zend_Validate_Hostname::INVALID_LOCAL_NAME
+                    );
+                    $validator->setMessage(
+                        __("'%value%' appears to be a local network name but local network names are not allowed."),
+                        \Zend_Validate_Hostname::LOCAL_NAME_NOT_ALLOWED
+                    );
+                    $validator->setMessage(
+                        __("'%value%' appears to be a DNS hostname but the given punycode notation cannot be decoded."),
+                        \Zend_Validate_Hostname::CANNOT_DECODE_PUNYCODE
+                    );
+                    if (!$validator->isValid($value)) {
+                        return array_unique($validator->getMessages());
+                    }
+                    break;
+                case 'url':
+                    $parsedUrl = parse_url($value);
+                    if ($parsedUrl === false || empty($parsedUrl['scheme']) || empty($parsedUrl['host'])) {
+                        return array(__('"%1" is not a valid URL.', $label));
+                    }
+                    $validator = new \Zend_Validate_Hostname();
+                    if (!$validator->isValid($parsedUrl['host'])) {
+                        return array(__('"%1" is not a valid URL.', $label));
+                    }
+                    break;
+                case 'date':
+                    $validator = new \Zend_Validate_Date(\Magento\Stdlib\DateTime::DATE_INTERNAL_FORMAT);
+                    $validator->setMessage(
+                        __('"%1" invalid type entered.', $label),
+                        \Zend_Validate_Date::INVALID
+                    );
+                    $validator->setMessage(
+                        __('"%1" is not a valid date.', $label),
+                        \Zend_Validate_Date::INVALID_DATE
+                    );
+                    $validator->setMessage(
+                        __('"%1" does not fit the entered date format.', $label),
+                        \Zend_Validate_Date::FALSEFORMAT
+                    );
+                    if (!$validator->isValid($value)) {
+                       return array_unique($validator->getMessages());
+                    }
+
+                    break;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Return is AJAX Request
+     *
+     * @return boolean
+     */
+    public function getIsAjaxRequest()
+    {
+        return $this->_isAjax;
+    }
+
+    /**
+     * Return Original Attribute value from Request
+     *
+     * @param \Magento\App\RequestInterface $request
+     * @return mixed
+     */
+    protected function _getRequestValue(\Magento\App\RequestInterface $request)
+    {
+        $attrCode  = $this->getAttribute()->getAttributeCode();
+        if ($this->_requestScope) {
+            if (strpos($this->_requestScope, '/') !== false) {
+                $params = $request->getParams();
+                $parts = explode('/', $this->_requestScope);
+                foreach ($parts as $part) {
+                    if (isset($params[$part])) {
+                        $params = $params[$part];
+                    } else {
+                        $params = array();
+                    }
+                }
+            } else {
+                $params = $request->getParam($this->_requestScope);
+            }
+
+            if (isset($params[$attrCode])) {
+                $value = $params[$attrCode];
+            } else {
+                $value = false;
+            }
+
+            if (!$this->_requestScopeOnly && $value === false) {
+                $value = $request->getParam($attrCode, false);
+            }
+        } else {
+            $value = $request->getParam($attrCode, false);
+        }
+        return $value;
+    }
+
+    /**
+     * Extract data from request and return value
+     *
+     * @param \Magento\App\RequestInterface $request
+     * @return array|string
+     */
+    abstract public function extractValue(\Magento\App\RequestInterface $request);
+
+    /**
+     * Validate data
+     *
+     * @param array|string $value
+     * @throws \Magento\Core\Exception
+     * @return boolean
+     */
+    abstract public function validateValue($value);
+
+    /**
+     * Export attribute value to entity model
+     *
+     * @param array|string $value
+     * @return string|bool
+     */
+    abstract public function compactValue($value);
+
+    /**
+     * Restore attribute value from SESSION to entity model
+     *
+     * @param array|string $value
+     * @return string|bool
+     */
+    abstract public function restoreValue($value);
+
+    /**
+     * Return formated attribute value from entity model
+     *
+     * @param string $format
+     * @return string|array
+     */
+    abstract public function outputValue($format = \Magento\Eav\Model\AttributeDataFactory::OUTPUT_FORMAT_TEXT);
+}
diff --git a/app/code/Magento/Customer/Model/Metadata/Validator.php b/app/code/Magento/Customer/Model/Metadata/Validator.php
new file mode 100644
index 0000000000000000000000000000000000000000..b727a6e85fb95ff3fd5073cc45675f3af244fe24
--- /dev/null
+++ b/app/code/Magento/Customer/Model/Metadata/Validator.php
@@ -0,0 +1,94 @@
+<?php
+/**
+ * Attribute data validator
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @category    Magento
+ * @package     Magento_Customer
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Customer\Model\Metadata;
+
+class Validator extends \Magento\Eav\Model\Validator\Attribute\Data
+{
+    /**
+     * @var string
+     */
+    protected $_entityType;
+
+    /**
+     * @param \Magento\Customer\Model\Metadata\ElementFactory $attrDataFactory
+     */
+    public function __construct(\Magento\Customer\Model\Metadata\ElementFactory $attrDataFactory)
+    {
+        $this->_attrDataFactory = $attrDataFactory;
+    }
+
+    /**
+     * Validate EAV model attributes with data models
+     *
+     * @param \Magento\Core\Model\AbstractModel $entity
+     * @return bool
+     */
+    public function isValid($entity)
+    {
+        $data = array();
+        if ($this->_data) {
+            $data = $this->_data;
+        } elseif ($entity instanceof \Magento\Object) {
+            $data = $entity->getData();
+        }
+        $this->validateData($data, $this->_attributes, $this->_entityType);
+    }
+
+    public function validateData($data, $attributes, $entityType)
+    {
+        foreach ($attributes as $attribute) {
+            $attributeCode = $attribute->getAttributeCode();
+            if (!$attribute->getDataModel() && !$attribute->getFrontendInput()) {
+                continue;
+            }
+            if (!isset($data[$attributeCode])) {
+                $data[$attributeCode] = null;
+            }
+            $dataModel = $this->_attrDataFactory->create(
+                $attribute, $entityType, $data[$attributeCode]
+            );
+            $dataModel->setExtractedData($data);
+            $result = $dataModel->validateValue($data[$attributeCode]);
+            if (true !== $result) {
+                $this->_addErrorMessages($attributeCode, (array)$result);
+            }
+        }
+        return count($this->_messages) == 0;
+    }
+
+    /**
+     * Set type of the entity
+     *
+     * @param string $entityType
+     * @return null
+     */
+    public function setEntityType($entityType)
+    {
+        $this->_entityType = $entityType;
+    }
+}
diff --git a/app/code/Magento/Customer/Model/Session.php b/app/code/Magento/Customer/Model/Session.php
index f0171b5904e89bb9e109d00f6893cb6c39a3e734..6c971a51859f434f6ac0997efafae69401398d49 100644
--- a/app/code/Magento/Customer/Model/Session.php
+++ b/app/code/Magento/Customer/Model/Session.php
@@ -292,16 +292,20 @@ class Session extends \Magento\Session\SessionManager
 
         if ($customer->authenticate($username, $password)) {
             $this->setCustomerAsLoggedIn($customer);
-            $this->regenerateId();
             return true;
         }
         return false;
     }
 
+    /**
+     * @param \Magento\Customer\Model\Customer $customer
+     * @return $this
+     */
     public function setCustomerAsLoggedIn($customer)
     {
         $this->setCustomer($customer);
         $this->_eventManager->dispatch('customer_login', array('customer' => $customer));
+        $this->regenerateId();
         return $this;
     }
 
@@ -316,7 +320,6 @@ class Session extends \Magento\Session\SessionManager
         $customer = $this->_createCustomer()->load($customerId);
         if ($customer->getId()) {
             $this->setCustomerAsLoggedIn($customer);
-            $this->regenerateId();
             return true;
         }
         return false;
diff --git a/app/code/Magento/Customer/Service/Customer.php b/app/code/Magento/Customer/Service/Customer.php
index 110cd07febab1365ef4fd2db0003d00a0067c1eb..ff922d06d93cdda283771f37933eb227a658b8f8 100644
--- a/app/code/Magento/Customer/Service/Customer.php
+++ b/app/code/Magento/Customer/Service/Customer.php
@@ -386,7 +386,8 @@ class Customer
                 $address = $customer->getAddressItemById($addressId);
                 if (!$address || !$address->getId()) {
                     throw new \Magento\Core\Exception(
-                        __('The address with the specified ID not found.'));
+                        __('The address with the specified ID not found.')
+                    );
                 }
             } else {
                 $address = $this->_addressFactory->create();
diff --git a/app/code/Magento/Customer/Service/Entity/V1/AggregateException.php b/app/code/Magento/Customer/Service/Entity/V1/AggregateException.php
new file mode 100644
index 0000000000000000000000000000000000000000..aff94b4f4f51576e2df6f3bb904247f8d15e4078
--- /dev/null
+++ b/app/code/Magento/Customer/Service/Entity/V1/AggregateException.php
@@ -0,0 +1,58 @@
+<?php
+/**
+ * Aggregate of multiple service exceptions
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Customer\Service\Entity\V1;
+
+class AggregateException extends Exception
+{
+    protected $_listOfExceptions = [];
+
+    /**
+     * Returns the list of exceptions.
+     * @return array of exceptions that are stored
+     */
+    public function getExceptions()
+    {
+        return $this->_listOfExceptions;
+    }
+
+    /**
+     * Add an exception to the aggregate list.
+     * @param Exception $exception
+     */
+    public function pushException(Exception $exception)
+    {
+        $this->_listOfExceptions[] = $exception;
+    }
+
+    /**
+     * Returns true if the aggregate list contains exceptions.
+     * @return bool
+     */
+    public function hasExceptions()
+    {
+        return !empty($this->_listOfExceptions);
+    }
+}
\ No newline at end of file
diff --git a/app/code/Magento/Customer/Service/Entity/V1/Exception.php b/app/code/Magento/Customer/Service/Entity/V1/Exception.php
new file mode 100644
index 0000000000000000000000000000000000000000..97596d6121a9e9666b0265fc8df6ea54494c903b
--- /dev/null
+++ b/app/code/Magento/Customer/Service/Entity/V1/Exception.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Base service exception
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Customer\Service\Entity\V1;
+
+class Exception extends \Exception
+{
+    /** Error codes */
+    const CODE_UNKNOWN                              = 0;
+    const CODE_ACCT_ALREADY_ACTIVE                  = 1;
+    const CODE_INVALID_RESET_TOKEN                  = 2;
+    const CODE_RESET_TOKEN_EXPIRED                  = 3;
+    const CODE_EMAIL_NOT_FOUND                      = 4;
+    const CODE_CONFIRMATION_NOT_NEEDED              = 5;
+    const CODE_CUSTOMER_ID_MISMATCH                 = 6;
+    const CODE_EMAIL_NOT_CONFIRMED                  = 7;
+    const CODE_INVALID_EMAIL_OR_PASSWORD            = 8;
+    const CODE_EMAIL_EXISTS                         = 9;
+    const CODE_INVALID_RESET_PASSWORD_LINK_TOKEN    = 10;
+    const CODE_ADDRESS_NOT_FOUND                    = 11;
+    const CODE_INVALID_ADDRESS_ID                   = 12;
+    const CODE_VALIDATION_FAILED                    = 13;
+    const CODE_INVALID_CUSTOMER_ID                  = 14;
+}
diff --git a/app/code/Magento/Customer/Service/V1/CustomerAccountService.php b/app/code/Magento/Customer/Service/V1/CustomerAccountService.php
new file mode 100644
index 0000000000000000000000000000000000000000..bf3f4e52e5c929ed5a7a2ddd32b36d4fbba9e219
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/CustomerAccountService.php
@@ -0,0 +1,341 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Customer\Service\V1;
+use Magento\Customer\Service\Entity\V1\Exception;
+
+/**
+ * Manipulate Customer Address Entities *
+ */
+class CustomerAccountService implements CustomerAccountServiceInterface
+{
+
+    /** @var \Magento\Customer\Model\CustomerFactory */
+    private $_customerFactory;
+    /**
+     * Core event manager proxy
+     *
+     * @var \Magento\Event\ManagerInterface
+     */
+    private $_eventManager = null;
+
+    /** @var \Magento\Core\Model\StoreManagerInterface */
+    private $_storeManager;
+
+    /**
+     * @var \Magento\Math\Random
+     */
+    private $_mathRandom;
+
+    /**
+     * @var \Magento\Customer\Model\Converter
+     */
+    private $_converter;
+
+    /**
+     * @var \Magento\Customer\Model\Metadata\Validator
+     */
+    private $_validator;
+
+    /**
+     * @var \Magento\Customer\Service\V1\Dto\Response\CreateCustomerAccountResponseBuilder
+     */
+    private $_createCustomerAccountResponseBuilder;
+
+    /**
+     * @var CustomerServiceInterface
+     */
+    private $_customerService;
+
+    /**
+     * @var CustomerAddressServiceInterface
+     */
+    private $_customerAddressService;
+
+    /**
+     * Constructor
+     *
+     * @param \Magento\Customer\Model\CustomerFactory $customerFactory
+     * @param \Magento\Customer\Model\AddressFactory $addressFactory
+     * @param \Magento\Customer\Service\V1\CustomerMetadataServiceInterface $eavMetadataService
+     * @param \Magento\Event\ManagerInterface $eventManager
+     * @param \Magento\Core\Model\StoreManagerInterface $storeManager
+     * @param \Magento\Math\Random $mathRandom
+     * @param \Magento\Customer\Model\Converter $converter
+     * @param \Magento\Customer\Model\Metadata\Validator $validator
+     * @param \Magento\Customer\Service\V1\Dto\RegionBuilder $regionBuilder
+     * @param \Magento\Customer\Service\V1\Dto\AddressBuilder $addressBuilder
+     * @param \Magento\Customer\Service\V1\Dto\Response\CreateCustomerAccountResponseBuilder $createCustomerAccountResponseBuilder
+     */
+    public function __construct(
+        \Magento\Customer\Model\CustomerFactory $customerFactory,
+        \Magento\Event\ManagerInterface $eventManager,
+        \Magento\Core\Model\StoreManagerInterface $storeManager,
+        \Magento\Math\Random $mathRandom,
+        \Magento\Customer\Model\Converter $converter,
+        \Magento\Customer\Model\Metadata\Validator $validator,
+        Dto\Response\CreateCustomerAccountResponseBuilder $createCustomerAccountResponseBuilder,
+        CustomerServiceInterface $customerService,
+        CustomerAddressServiceInterface $customerAddressService
+    ) {
+        $this->_customerFactory = $customerFactory;
+        $this->_eventManager = $eventManager;
+        $this->_storeManager = $storeManager;
+        $this->_mathRandom = $mathRandom;
+        $this->_converter = $converter;
+        $this->_validator = $validator;
+        $this->_createCustomerAccountResponseBuilder = $createCustomerAccountResponseBuilder;
+        $this->_customerService = $customerService;
+        $this->_customerAddressService = $customerAddressService;
+    }
+
+
+    /**
+     * @inheritdoc
+     */
+    public function sendConfirmation($email)
+    {
+        $customer = $this->_customerFactory->create();
+        $customer->setWebsiteId($this->_storeManager->getStore()->getWebsiteId())->loadByEmail($email);
+        if (!$customer->getId()) {
+            throw new Exception('Wrong email.', Exception::CODE_EMAIL_NOT_FOUND);
+        }
+        if ($customer->getConfirmation()) {
+            $customer->sendNewAccountEmail('confirmation', '', $this->_storeManager->getStore()->getId());
+        } else {
+            throw new Exception(
+                'This email does not require confirmation.',
+                Exception::CODE_CONFIRMATION_NOT_NEEDED
+            );
+        }
+    }
+
+
+    /**
+     * @inheritdoc
+     */
+    public function activateAccount($customerId, $key)
+    {
+        // load customer by id
+        $customer = $this->_converter->getCustomerModel($customerId);
+
+        // check if customer is inactive
+        if ($customer->getConfirmation()) {
+            if ($customer->getConfirmation() !== $key) {
+                throw new \Magento\Core\Exception('Wrong confirmation key.');
+            }
+
+            // activate customer
+            try {
+                $customer->setConfirmation(null);
+                $customer->save();
+            } catch (\Exception $e) {
+                throw new \Magento\Core\Exception('Failed to confirm customer account.');
+            }
+            $customer->sendNewAccountEmail('confirmed', '', $this->_storeManager->getStore()->getId());
+        } else {
+            throw new Exception(
+                'Customer account is already active.',
+                Exception::CODE_ACCT_ALREADY_ACTIVE
+            );
+        }
+
+        return $this->_converter->createCustomerFromModel($customer);
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function authenticate($username, $password)
+    {
+        $customerModel = $this->_customerFactory->create();
+        $customerModel->setWebsiteId($this->_storeManager->getStore()->getWebsiteId());
+        try {
+            $customerModel->authenticate($username, $password);
+        } catch (\Magento\Core\Exception $e) {
+            switch ($e->getCode()) {
+                case \Magento\Customer\Model\Customer::EXCEPTION_EMAIL_NOT_CONFIRMED:
+                    $code = Exception::CODE_EMAIL_NOT_CONFIRMED;
+                    break;
+                case \Magento\Customer\Model\Customer::EXCEPTION_INVALID_EMAIL_OR_PASSWORD:
+                    $code = Exception::CODE_INVALID_EMAIL_OR_PASSWORD;
+                    break;
+                default:
+                    $code = Exception::CODE_UNKNOWN;
+            }
+            throw new Exception($e->getMessage(), $code, $e);
+        }
+
+        $this->_eventManager->dispatch('customer_login', array('customer'=>$customerModel));
+
+        return $this->_converter->createCustomerFromModel($customerModel);
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function validateResetPasswordLinkToken($customerId, $resetPasswordLinkToken)
+    {
+        $this->_validateResetPasswordToken($customerId, $resetPasswordLinkToken);
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function sendPasswordResetLink($email, $websiteId)
+    {
+        $customer = $this->_customerFactory->create()
+            ->setWebsiteId($websiteId)
+            ->loadByEmail($email);
+
+        if (!$customer->getId()) {
+            throw new Exception(
+                'No customer found for the provided email and website ID.', Exception::CODE_EMAIL_NOT_FOUND);
+        }
+        try {
+            $newPasswordToken = $this->_mathRandom->getUniqueHash();
+            $customer->changeResetPasswordLinkToken($newPasswordToken);
+            $customer->sendPasswordResetConfirmationEmail();
+        } catch (\Exception $exception) {
+            throw new Exception($exception->getMessage(), Exception::CODE_UNKNOWN, $exception);
+        }
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function resetPassword($customerId, $password, $resetToken)
+    {
+        $customerModel = $this->_validateResetPasswordToken($customerId, $resetToken);
+        $customerModel->setRpToken(null);
+        $customerModel->setRpTokenCreatedAt(null);
+        $customerModel->setPassword($password);
+        $customerModel->save();
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function createAccount(
+        Dto\Customer $customer,
+        array $addresses,
+        $password = null,
+        $confirmationBackUrl = '',
+        $registeredBackUrl = '',
+        $storeId = 0
+    ) {
+        $customerId = $customer->getCustomerId();
+        if ($customerId) {
+            $customerModel = $this->_converter->getCustomerModel($customerId);
+            if ($customerModel->isInStore($storeId)) {
+                return $this->_createCustomerAccountResponseBuilder->setCustomerId($customerId)
+                    ->setStatus('')
+                    ->create();
+            }
+        }
+        $customerId = $this->_customerService->saveCustomer($customer, $password);
+        $this->_customerAddressService->saveAddresses($customerId, $addresses);
+
+        $customerModel = $this->_converter->getCustomerModel($customerId);
+
+        $newLinkToken = $this->_mathRandom->getUniqueHash();
+        $customerModel->changeResetPasswordLinkToken($newLinkToken);
+
+        if (!$storeId) {
+            $storeId = $this->_storeManager->getStore()->getId();
+        }
+
+        if ($customerModel->isConfirmationRequired()) {
+            $customerModel->sendNewAccountEmail('confirmation', $confirmationBackUrl, $storeId);
+            return $this->_createCustomerAccountResponseBuilder->setCustomerId($customerId)
+                ->setStatus(self::ACCOUNT_CONFIRMATION)
+                ->create();
+        } else {
+            $customerModel->sendNewAccountEmail('registered', $registeredBackUrl, $storeId);
+            return $this->_createCustomerAccountResponseBuilder->setCustomerId($customerId)
+                ->setStatus(self::ACCOUNT_REGISTERED)
+                ->create();
+        }
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function validateCustomerData(Dto\Customer $customer, array $attributes)
+    {
+        $customerErrors = $this->_validator->validateData(
+            $customer->__toArray(),
+            $attributes,
+            'customer'
+        );
+
+        if ($customerErrors !== true) {
+            return array(
+                'error'     => -1,
+                'message'   => implode(', ', $customerErrors)
+            );
+        }
+
+        $customerModel = $this->_converter->createCustomerModel($customer);
+
+        $result = $customerModel->validate();
+        if (true !== $result && is_array($result)) {
+            return array(
+                'error'   => -1,
+                'message' => implode(', ', $result)
+            );
+        }
+        return true;
+    }
+
+
+    /**
+     * @param $customerId
+     * @param $resetPasswordLinkToken
+     * @return \Magento\Customer\Model\Customer
+     * @throws Exception
+     */
+    private function _validateResetPasswordToken($customerId, $resetPasswordLinkToken)
+    {
+        if (!is_int($customerId)
+            || !is_string($resetPasswordLinkToken)
+            || empty($resetPasswordLinkToken)
+            || empty($customerId)
+            || $customerId < 0
+        ) {
+            throw new Exception('Invalid password reset token.', Exception::CODE_INVALID_RESET_TOKEN);
+        }
+
+        $customerModel = $this->_converter->getCustomerModel($customerId);
+
+        $customerToken = $customerModel->getRpToken();
+        if (strcmp($customerToken, $resetPasswordLinkToken) !== 0
+            || $customerModel->isResetPasswordLinkTokenExpired($customerId)
+        ) {
+            throw new Exception('Your password reset link has expired.', Exception::CODE_RESET_TOKEN_EXPIRED);
+        }
+
+        return $customerModel;
+    }
+}
diff --git a/app/code/Magento/Customer/Service/V1/CustomerAccountServiceInterface.php b/app/code/Magento/Customer/Service/V1/CustomerAccountServiceInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..510cb3a97423b1a09f491f18e7a763f8adb3b112
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/CustomerAccountServiceInterface.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\Customer\Service\V1;
+
+/**
+ * Manipulate Customer Address Entities *
+ */
+interface CustomerAccountServiceInterface
+{
+    /** account response status */
+    const ACCOUNT_CONFIRMATION = "confirmation";
+    const ACCOUNT_REGISTERED = "registered";
+
+    // Constants for the type of new account email to be sent
+    const NEW_ACCOUNT_EMAIL_REGISTERED = 'registered';     // welcome email, when confirmation is disabled
+    const NEW_ACCOUNT_EMAIL_CONFIRMED = 'confirmed';       // welcome email, when confirmation is enabled
+    const NEW_ACCOUNT_EMAIL_CONFIRMATION = 'confirmation'; // email with confirmation link
+
+    /**
+     * Create Customer Account
+     *
+     * @param \Magento\Customer\Service\V1\Dto\Customer $customer
+     * @param \Magento\Customer\Service\V1\Dto\Address[] $addresses
+     * @param string $password
+     * @param string $confirmationBackUrl
+     * @param string $registeredBackUrl
+     * @param int $storeId
+     * @return Dto\Response\CreateCustomerAccountResponse
+     */
+    public function createAccount(
+        Dto\Customer $customer,
+        array $addresses,
+        $password = null,
+        $confirmationBackUrl = '',
+        $registeredBackUrl = '',
+        $storeId = 0
+    );
+
+    /**
+     * Used to activate a customer account using a key that was sent in a confirmation e-mail.
+     *
+     * @param int $customerId
+     * @param string $key
+     * @throws \Magento\Customer\Service\Entity\V1\Exception If customerId is invalid, does not exist, or customer account was already active
+     * @throws \Magento\Core\Exception If there is an issue with supplied $customerId or $key
+     * @return \Magento\Customer\Service\V1\Dto\Customer
+     */
+    public function activateAccount($customerId, $key);
+
+    /**
+     * Login a customer account using username and password
+     *
+     * @param string $username username in plain-text
+     * @param string $password password in plain-text
+     * @throws \Magento\Customer\Service\Entity\V1\Exception if unable to login due to issue with username or password or others
+     * @return \Magento\Customer\Service\V1\Dto\Customer
+     */
+    public function authenticate($username, $password);
+
+    /**
+     * Check if password reset token is valid
+     *
+     * @param int $customerId
+     * @param string $resetPasswordLinkToken
+     * @throws \Magento\Customer\Service\Entity\V1\Exception if expired or invalid
+     */
+    public function validateResetPasswordLinkToken($customerId, $resetPasswordLinkToken);
+
+    /**
+     * Send an email to the customer with a password reset link.
+     *
+     * @param string $email
+     * @param int $websiteId
+     * @throws \Magento\Customer\Service\Entity\V1\Exception
+     */
+    public function sendPasswordResetLink($email, $websiteId);
+
+
+    /**
+     * Reset customer password.
+     *
+     * @param int $customerId
+     * @param string $password
+     * @param string $resetToken
+     */
+    public function resetPassword($customerId, $password, $resetToken);
+
+    /*
+     * Send Confirmation email
+     *
+     * @param string $email email address of customer
+     * @throws Entity\V1\Exception if error occurs getting customerId
+     */
+    public function sendConfirmation($email);
+
+    /**
+     * Validate customer entity
+     *
+     * @param \Magento\Customer\Service\V1\Dto\Customer $customer
+     * @param \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata[] $attributes
+     * @return array|bool
+     */
+    public function validateCustomerData(Dto\Customer $customer, array $attributes);
+
+}
diff --git a/app/code/Magento/Customer/Service/V1/CustomerAddressService.php b/app/code/Magento/Customer/Service/V1/CustomerAddressService.php
new file mode 100644
index 0000000000000000000000000000000000000000..cc385b75d36308eb23588a209e175ebc677f01f1
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/CustomerAddressService.php
@@ -0,0 +1,323 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Customer\Service\V1;
+
+use Magento\Customer\Service\Entity\V1\AggregateException;
+use Magento\Customer\Service\Entity\V1\Exception;
+
+class CustomerAddressService implements CustomerAddressServiceInterface
+{
+    /** @var \Magento\Customer\Model\AddressFactory */
+    private $_addressFactory;
+
+    /**
+     * @var \Magento\Customer\Model\Converter
+     */
+    private $_converter;
+
+    /**
+     * @var \Magento\Customer\Service\V1\Dto\RegionBuilder
+     */
+    private $_regionBuilder;
+
+    /**
+     * @var \Magento\Customer\Service\V1\Dto\AddressBuilder
+     */
+    private $_addressBuilder;
+
+
+    /**
+     * Constructor
+     *
+     * @param \Magento\Customer\Model\CustomerFactory $customerFactory
+     * @param \Magento\Customer\Model\AddressFactory $addressFactory
+     * @param \Magento\Customer\Service\V1\CustomerMetadataServiceInterface $eavMetadataService
+     * @param \Magento\Event\ManagerInterface $eventManager
+     * @param \Magento\Core\Model\StoreManagerInterface $storeManager
+     * @param \Magento\Math\Random $mathRandom
+     * @param \Magento\Customer\Model\Converter $converter
+     * @param \Magento\Customer\Model\Metadata\Validator $validator
+     * @param \Magento\Customer\Service\V1\Dto\RegionBuilder $regionBuilder
+     * @param \Magento\Customer\Service\V1\Dto\AddressBuilder $addressBuilder
+     * @param \Magento\Customer\Service\V1\Dto\Response\CreateCustomerAccountResponseBuilder $createCustomerAccountResponseBuilder
+     */
+    public function __construct(
+        \Magento\Customer\Model\AddressFactory $addressFactory,
+        \Magento\Customer\Model\Converter $converter,
+        Dto\RegionBuilder $regionBuilder,
+        Dto\AddressBuilder $addressBuilder
+    ) {
+        $this->_addressFactory = $addressFactory;
+        $this->_converter = $converter;
+        $this->_regionBuilder = $regionBuilder;
+        $this->_addressBuilder = $addressBuilder;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function getAddresses($customerId)
+    {
+        //TODO: use cache MAGETWO-16862
+        $customer = $this->_converter->getCustomerModel($customerId);
+        $addresses = $customer->getAddresses();
+        $defaultBillingId = $customer->getDefaultBilling();
+        $defaultShippingId = $customer->getDefaultShipping();
+
+        $result = array();
+        /** @var $address \Magento\Customer\Model\Address */
+        foreach ($addresses as $address) {
+            $result[] = $this->_createAddress(
+                $address,
+                $defaultBillingId,
+                $defaultShippingId
+            );
+        }
+        return $result;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function getDefaultBillingAddress($customerId)
+    {
+        //TODO: use cache MAGETWO-16862
+        $customer = $this->_converter->getCustomerModel($customerId);
+        $address = $customer->getDefaultBillingAddress();
+        if ($address === false) {
+            return null;
+        }
+        return $this->_createAddress(
+            $address,
+            $customer->getDefaultBilling(),
+            $customer->getDefaultShipping()
+        );
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function getDefaultShippingAddress($customerId)
+    {
+        //TODO: use cache MAGETWO-16862
+        $customer = $this->_converter->getCustomerModel($customerId);
+        $address = $customer->getDefaultShippingAddress();
+        if ($address === false) {
+            return null;
+        }
+        return $this->_createAddress($address,
+            $customer->getDefaultBilling(),
+            $customer->getDefaultShipping()
+        );
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function getAddressById($customerId, $addressId)
+    {
+        //TODO: use cache MAGETWO-16862
+        $customer = $this->_converter->getCustomerModel($customerId);
+        $address = $customer->getAddressById($addressId);
+        if (!$address->getId()) {
+            throw new Exception(
+                'Address id ' . $addressId . ' not found',
+                Exception::CODE_ADDRESS_NOT_FOUND
+            );
+        }
+        return $this->_createAddress(
+            $address,
+            $customer->getDefaultBilling(),
+            $customer->getDefaultShipping()
+        );
+    }
+
+    /**
+     * Create address based on model
+     *
+     * @param \Magento\Customer\Model\Address $addressModel
+     * @param int $defaultBillingId
+     * @param int $defaultShippingId
+     * @return \Magento\Customer\Service\V1\Dto\Address
+     */
+    private function _createAddress(\Magento\Customer\Model\Address $addressModel,
+                                      $defaultBillingId, $defaultShippingId
+    ) {
+        $addressId = $addressModel->getId();
+        $validAttributes = array_merge(
+            $addressModel->getDefaultAttributeCodes(),
+            [
+                'id', 'region_id', 'region', 'street', 'vat_is_valid',
+                'default_billing', 'default_shipping',
+                //TODO: create VAT object at MAGETWO-16860
+                'vat_request_id', 'vat_request_date', 'vat_request_success'
+            ]
+        );
+        $addressData = [];
+        foreach ($addressModel->getAttributes() as $attribute) {
+            $code = $attribute->getAttributeCode();
+            if (!in_array($code, $validAttributes) && $addressModel->getData($code) !== null) {
+                $addressData[$code] = $addressModel->getData($code);
+            }
+        }
+
+        $region = $this->_regionBuilder->setRegionCode($addressModel->getRegionCode())
+            ->setRegion($addressModel->getRegion())
+            ->setRegionId($addressModel->getRegionId())
+            ->create();
+        $this->_addressBuilder->populateWithArray(array_merge($addressData, [
+            'street' => $addressModel->getStreet(),
+            'id' => $addressId,
+            'default_billing' => $addressId === $defaultBillingId,
+            'default_shipping' => $addressId === $defaultShippingId,
+            'customer_id' => $addressModel->getCustomerId(),
+            'region' => $region
+        ]));
+
+        $retValue = $this->_addressBuilder->create();
+        return $retValue;
+    }
+
+
+    /**
+     * @inheritdoc
+     */
+    public function deleteAddressFromCustomer($customerId, $addressId)
+    {
+        if (!$addressId) {
+            throw new Exception('Invalid addressId', Exception::CODE_INVALID_ADDRESS_ID);
+        }
+
+        $address = $this->_addressFactory->create();
+        $address->load($addressId);
+
+        if (!$address->getId()) {
+            throw new Exception(
+                'Address id ' . $addressId . ' not found',
+                Exception::CODE_ADDRESS_NOT_FOUND
+            );
+        }
+
+        // Validate address_id <=> customer_id
+        if ($address->getCustomerId() != $customerId) {
+            throw new Exception(
+                'The address does not belong to this customer',
+                Exception::CODE_CUSTOMER_ID_MISMATCH
+            );
+        }
+
+        $address->delete();
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function saveAddresses($customerId, array $addresses)
+    {
+        $customerModel = $this->_converter->getCustomerModel($customerId);
+        $addressModels = [];
+
+        $aggregateException = new AggregateException("All validation exceptions for all addresses.",
+            Exception::CODE_VALIDATION_FAILED);
+        foreach ($addresses as $address) {
+            $addressModel = null;
+            if ($address->getId()) {
+                $addressModel = $customerModel->getAddressItemById($address->getId());
+            }
+            if (is_null($addressModel)) {
+                $addressModel = $this->_addressFactory->create();
+                $addressModel->setCustomer($customerModel);
+            }
+            $this->_updateAddressModel($addressModel, $address);
+
+            $validationErrors = $addressModel->validate();
+            if ($validationErrors !== true) {
+                $aggregateException->pushException(
+                    new Exception(
+                        'There were one or more errors validating the address with id ' . $address->getId(),
+                        Exception::CODE_VALIDATION_FAILED,
+                        new \Magento\Validator\ValidatorException([$validationErrors])
+                    )
+                );
+                continue;
+            }
+            $addressModels[] = $addressModel;
+        }
+        if ($aggregateException->hasExceptions()) {
+            throw $aggregateException;
+        }
+        $addressIds = [];
+
+        foreach ($addressModels as $addressModel) {
+            try {
+                $addressModel->save();
+                $addressIds[] = $addressModel->getId();
+            } catch (\Exception $e) {
+                switch ($e->getCode()) {
+                    case \Magento\Customer\Model\Customer::EXCEPTION_EMAIL_EXISTS:
+                        $code = Exception::CODE_EMAIL_EXISTS;
+                        break;
+                    default:
+                        $code = Exception::CODE_UNKNOWN;
+                }
+                throw new Exception($e->getMessage(), $code, $e);
+            }
+        }
+
+        return $addressIds;
+    }
+
+    /**
+     * Updates an Address Model based on information from an Address DTO.
+     *
+     * @param \Magento\Customer\Model\Address $addressModel
+     * @param \Magento\Customer\Service\V1\Dto\Address $address
+     * return null
+     */
+    private function _updateAddressModel(\Magento\Customer\Model\Address $addressModel, Dto\Address $address)
+    {
+        // Set all attributes
+        foreach ($address->getAttributes() as $attributeCode => $attributeData) {
+            if ('region' == $attributeCode
+                && $address->getRegion() instanceof Dto\Region
+            ) {
+                $addressModel->setData('region', $address->getRegion()->getRegion());
+                $addressModel->setData('region_code', $address->getRegion()->getRegionCode());
+                $addressModel->setData('region_id', $address->getRegion()->getRegionId());
+            } else {
+                $addressModel->setData($attributeCode, $attributeData);
+            }
+        }
+        // Set customer related data
+        $isBilling = $address->isDefaultBilling();
+        $addressModel->setIsDefaultBilling($isBilling);
+        $addressModel->setIsDefaultShipping($address->isDefaultShipping());
+        // Need to use attribute set or future updates can cause data loss
+        if (!$addressModel->getAttributeSetId()) {
+            $addressModel->setAttributeSetId(CustomerMetadataServiceInterface::ADDRESS_ATTRIBUTE_SET_ID);
+        }
+    }
+
+}
diff --git a/app/code/Magento/Customer/Service/V1/CustomerAddressServiceInterface.php b/app/code/Magento/Customer/Service/V1/CustomerAddressServiceInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..7f4a619a0b7c261e5b2a1de2b22b0ba239912531
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/CustomerAddressServiceInterface.php
@@ -0,0 +1,101 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Customer\Service\V1;
+use Magento\Customer\Service\Entity\V1\AggregateException;
+use Magento\Customer\Service\Entity\V1\Exception;
+
+/**
+ * Manipulate Customer Address Entities *
+ */
+interface CustomerAddressServiceInterface
+{
+    /**
+     * Retrieve all Customer Addresses
+     *
+     * @param int $customerId,
+     * @return \Magento\Customer\Service\V1\Dto\Address[]
+     * @throws Exception
+     */
+    public function getAddresses($customerId);
+
+    /**
+     * Retrieve default billing address
+     *
+     * @param int $customerId
+     * @return \Magento\Customer\Service\V1\Dto\Address
+     * @throws Exception
+     */
+    public function getDefaultBillingAddress($customerId);
+
+    /**
+     * Retrieve default shipping address
+     *
+     * @param int $customerId
+     * @return \Magento\Customer\Service\V1\Dto\Address
+     * @throws Exception
+     */
+    public function getDefaultShippingAddress($customerId);
+
+    /**
+     * Retrieve address by id
+     *
+     * @param int $customerId
+     * @param int $addressId
+     * @return \Magento\Customer\Service\V1\Dto\Address
+     * @throws Exception
+     */
+    public function getAddressById($customerId, $addressId);
+
+    /**
+     * Removes an address by id.
+     *
+     * @param int $customerId
+     * @param int $addressId
+     * @throws Exception if the address does not belong to the given customer
+     */
+    public function deleteAddressFromCustomer($customerId, $addressId);
+
+    /**
+     * Insert and/or update a list of addresses.
+     *
+     * This will add the addresses to the provided customerId.
+     * Only one address can be the default billing or shipping
+     * so if more than one is set, or if one was already set
+     * then the last address in this provided list will take
+     * over as the new default.
+     *
+     * This doesn't support partial updates to addresses, meaning
+     * that a full set of data must be provided with each Address
+     *
+     * @param int                 $customerId
+     * @param \Magento\Customer\Service\V1\Dto\Address[] $addresses
+     *
+     * @throws AggregateException if there are validation errors.
+     * @throws Exception If customerId is not found or other error occurs.
+     * @return int[] address ids
+     */
+    public function saveAddresses($customerId, array $addresses);
+
+}
diff --git a/app/code/Magento/Customer/Service/V1/CustomerGroupService.php b/app/code/Magento/Customer/Service/V1/CustomerGroupService.php
new file mode 100644
index 0000000000000000000000000000000000000000..e001c415359271f42a994f2a97d3c96911174973
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/CustomerGroupService.php
@@ -0,0 +1,203 @@
+<?php
+/**
+ * Customer service is responsible for customer business workflow encapsulation
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Customer\Service\V1;
+
+use Magento\Customer\Service\V1\Dto\SearchCriteria;
+use Magento\Customer\Service\Entity\V1\Exception;
+
+class CustomerGroupService implements CustomerGroupServiceInterface
+{
+    /**
+     * @var \Magento\Customer\Model\GroupFactory
+     */
+    private $_groupFactory;
+
+    /**
+     * @var \Magento\Core\Model\Store\Config
+     */
+    private $_storeConfig;
+
+    /**
+     * @var \Magento\Customer\Service\V1\Dto\SearchResultsBuilder
+     */
+    private $_searchResultsBuilder;
+
+    /**
+     * @var \Magento\Customer\Service\V1\Dto\CustomerGroupBuilder
+     */
+    private $_customerGroupBuilder;
+
+    /**
+     * @param \Magento\Customer\Model\GroupFactory $groupFactory
+     * @param \Magento\Core\Model\Store\Config $storeConfig
+     * @param \Magento\Customer\Service\V1\Dto\SearchResultsBuilder $searchResultsBuilder
+     * @param \Magento\Customer\Service\V1\Dto\CustomerGroupBuilder $customerGroupBuilder
+     */
+    public function __construct(
+        \Magento\Customer\Model\GroupFactory $groupFactory,
+        \Magento\Core\Model\Store\Config $storeConfig,
+        Dto\SearchResultsBuilder $searchResultsBuilder,
+        Dto\CustomerGroupBuilder $customerGroupBuilder
+    ) {
+        $this->_groupFactory = $groupFactory;
+        $this->_storeConfig = $storeConfig;
+        $this->_searchResultsBuilder = $searchResultsBuilder;
+        $this->_customerGroupBuilder = $customerGroupBuilder;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function getGroups($includeNotLoggedIn = true, $taxClassId = null)
+    {
+        $groups = array();
+        /** @var \Magento\Customer\Model\Resource\Group\Collection $collection */
+        $collection = $this->_groupFactory->create()->getCollection();
+        if (!$includeNotLoggedIn) {
+            $collection->setRealGroupsFilter();
+        }
+        if (!is_null($taxClassId)) {
+            $collection->addFieldToFilter('tax_class_id', $taxClassId);
+        }
+        /** @var \Magento\Customer\Model\Group $group */
+        foreach ($collection as $group) {
+            $this->_customerGroupBuilder->setId($group->getId())
+                ->setCode($group->getCode())
+                ->setTaxClassId($group->getTaxClassId());
+            $groups[] = $this->_customerGroupBuilder->create();
+        }
+        return $groups;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function searchGroups(SearchCriteria $searchCriteria)
+    {
+        $this->_searchResultsBuilder->setSearchCriteria($searchCriteria);
+
+        $groups = array();
+        /** @var \Magento\Customer\Model\Resource\Group\Collection $collection */
+        $collection = $this->_groupFactory->create()->getCollection();
+        foreach ($searchCriteria->getFilters() as $filter) {
+            $collection->addFilter($filter->getField(), $filter->getValue(), $filter->getConditionType());
+        }
+        $this->_searchResultsBuilder->setTotalCount($collection->getSize());
+        foreach ($searchCriteria->getSortOrders() as $field => $direction) {
+            switch($field) {
+                case 'id' :
+                    $field = 'customer_group_id';
+                    break;
+                case 'code':
+                    $field = 'customer_group_code';
+                    break;
+                case "tax_class_id":
+                default:
+                    break;
+            }
+            $collection->addOrder($field, $direction == SearchCriteria::SORT_ASC ? 'ASC' : 'DESC');
+        }
+        $collection->setCurPage($searchCriteria->getCurrentPage());
+        $collection->setPageSize($searchCriteria->getPageSize());
+
+        /** @var \Magento\Customer\Model\Group $group */
+        foreach ($collection as $group) {
+            $this->_customerGroupBuilder->setId($group->getId())
+                ->setCode($group->getCode())
+                ->setTaxClassId($group->getTaxClassId());
+            $groups[] = $this->_customerGroupBuilder->create();
+        }
+        $this->_searchResultsBuilder->setItems($groups);
+        return $this->_searchResultsBuilder->create();
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function getGroup($groupId)
+    {
+        $customerGroup = $this->_groupFactory->create();
+        $customerGroup->load($groupId);
+        // Throw exception if a customer group does not exist
+        if (is_null($customerGroup->getId())) {
+            throw new Exception(__('groupId ' . $groupId . ' does not exist.'));
+        }
+        $this->_customerGroupBuilder->setId($customerGroup->getId())
+            ->setCode($customerGroup->getCode())
+            ->setTaxClassId($customerGroup->getTaxClassId());
+        return $this->_customerGroupBuilder->create();
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function getDefaultGroup($storeId)
+    {
+        $groupId = $this->_storeConfig->getConfig(\Magento\Customer\Model\Group::XML_PATH_DEFAULT_ID, $storeId);
+        return $this->getGroup($groupId);
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function canDelete($groupId)
+    {
+        $customerGroup = $this->_groupFactory->create();
+        $customerGroup->load($groupId);
+        return $groupId > 0 && !$customerGroup->usesAsDefault();
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function saveGroup(Dto\CustomerGroup $group)
+    {
+        $customerGroup = $this->_groupFactory->create();
+        if ($group->getId()) {
+            $customerGroup->load($group->getId());
+        }
+        $customerGroup->setCode($group->getCode());
+        $customerGroup->setTaxClassId($group->getTaxClassId());
+        $customerGroup->save();
+        return $customerGroup->getId();
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function deleteGroup($groupId)
+    {
+        try {
+            // Get group so we can throw an exception if it doesn't exist
+            $this->getGroup($groupId);
+            $customerGroup = $this->_groupFactory->create();
+            $customerGroup->setId($groupId);
+            $customerGroup->delete();
+        } catch (\Exception $e) {
+            throw new Exception($e->getMessage(), $e->getCode(), $e);
+        }
+    }
+}
diff --git a/app/code/Magento/Customer/Service/V1/CustomerGroupServiceInterface.php b/app/code/Magento/Customer/Service/V1/CustomerGroupServiceInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..fae88d4d955353f1a60f4a8462589fc2f712971c
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/CustomerGroupServiceInterface.php
@@ -0,0 +1,94 @@
+<?php
+/**
+ * Customer Service 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\Customer\Service\V1;
+
+use Magento\Customer\Service\V1\Dto\CustomerGroup;
+use Magento\Customer\Service\V1\Dto\SearchCriteria;
+use Magento\Validator\Test\True;
+
+interface CustomerGroupServiceInterface
+{
+    const NOT_LOGGED_IN_ID          = 0;
+    const CUST_GROUP_ALL            = 32000;
+    const GROUP_CODE_MAX_LENGTH     = 32;
+
+    /**
+     * Retrieve Customer Groups
+     *
+     * The list of groups can be filtered to exclude the NOT_LOGGED_IN group using the first parameter and/or it can
+     * be filtered by tax class.
+     *
+     * @param boolean $includeNotLoggedIn
+     * @param int $taxClassId
+     *
+     * @return \Magento\Customer\Service\V1\Dto\CustomerGroup[]
+     */
+    public function getGroups($includeNotLoggedIn = true, $taxClassId = null);
+
+    /**
+     * @param \Magento\Customer\Service\V1\Dto\SearchCriteria $searchCriteria
+     *
+     * @return \Magento\Customer\Service\V1\Dto\SearchResults
+     */
+    public function searchGroups(Dto\SearchCriteria $searchCriteria);
+
+    /**
+     * Get a customer group by group ID.
+     *
+     * @param int $groupId
+     * @throws \Magento\Customer\Service\Entity\V1\Exception if groupId is not found
+     * @return \Magento\Customer\Service\V1\Dto\CustomerGroup
+     */
+    public function getGroup($groupId);
+
+    /**
+     * @param int $storeId
+     *
+     * @return \Magento\Customer\Service\V1\Dto\CustomerGroup
+     */
+    public function getDefaultGroup($storeId);
+
+    /**
+     * @param int $groupId
+     *
+     * @return boolean true, if this group can be deleted
+     */
+    public function canDelete($groupId);
+
+    /**
+     * @param \Magento\Customer\Service\V1\Dto\CustomerGroup $group
+     *
+     * @return int customer group ID
+     */
+    public function saveGroup(CustomerGroup $group);
+
+    /**
+     * @param int $groupId
+     *
+     * @return null
+     */
+    public function deleteGroup($groupId);
+}
diff --git a/app/code/Magento/Customer/Service/V1/CustomerMetadataService.php b/app/code/Magento/Customer/Service/V1/CustomerMetadataService.php
new file mode 100644
index 0000000000000000000000000000000000000000..695b5cf701b62039e3d719ea7b6260774402ede2
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/CustomerMetadataService.php
@@ -0,0 +1,241 @@
+<?php
+/**
+ * EAV attribute metadata 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\Customer\Service\V1;
+
+use Magento\Customer\Service\V1\CustomerMetadataServiceInterface;
+use Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata;
+use Magento\Customer\Service\V1\Dto\Eav\OptionBuilder;
+
+class CustomerMetadataService implements CustomerMetadataServiceInterface
+{
+    /**
+     * @var \Magento\Eav\Model\Config
+     */
+    private $_eavConfig;
+
+    /** @var array Cache of DTOs - entityType => attributeCode => DTO */
+    private $_cache;
+
+    /**
+     * @var \Magento\Customer\Model\Resource\Form\Attribute\Collection
+     */
+    private $_attrFormCollection;
+
+    /**
+     * @var \Magento\Core\Model\StoreManager
+     */
+    private $_storeManager;
+
+    /**
+     * @var \Magento\Customer\Service\V1\Dto\Eav\OptionBuilder
+     */
+    private $_optionBuilder;
+
+    /**
+     * @var \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadataBuilder
+     */
+    private $_attributeMetadataBuilder;
+
+    /**
+     * @param \Magento\Eav\Model\Config $eavConfig
+     * @param \Magento\Customer\Model\Resource\Form\Attribute\Collection $attrFormCollection
+     * @param \Magento\Core\Model\StoreManager $storeManager
+     * @param \Magento\Customer\Service\V1\Dto\Eav\OptionBuilder $optionBuilder
+     * @param \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadataBuilder $attributeMetadataBuilder
+     */
+    public function __construct(
+        \Magento\Eav\Model\Config $eavConfig,
+        \Magento\Customer\Model\Resource\Form\Attribute\Collection $attrFormCollection,
+        \Magento\Core\Model\StoreManager $storeManager,
+        \Magento\Customer\Service\V1\Dto\Eav\OptionBuilder $optionBuilder,
+        \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadataBuilder $attributeMetadataBuilder
+    ) {
+        $this->_eavConfig = $eavConfig;
+        $this->_cache = [];
+        $this->_attrFormCollection = $attrFormCollection;
+        $this->_storeManager = $storeManager;
+        $this->_optionBuilder = $optionBuilder;
+        $this->_attributeMetadataBuilder = $attributeMetadataBuilder;
+    }
+
+    /**
+     * Retrieve EAV attribute metadata
+     *
+     * @param   mixed $entityType
+     * @param   mixed $attributeCode
+     * @return \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata
+     */
+    public function getAttributeMetadata($entityType, $attributeCode)
+    {
+        $dtoCache = $this->_getEntityCache($entityType);
+        if (isset($dtoCache[$attributeCode])) {
+            return $dtoCache[$attributeCode];
+        }
+
+        /** @var \Magento\Eav\Model\Entity\Attribute\AbstractAttribute $attribute */
+        $attribute = $this->_eavConfig->getAttribute($entityType, $attributeCode);
+        $attributeMetadata = $this->_createMetadataAttribute($attribute);
+        $dtoCache[$attributeCode] = $attributeMetadata;
+        return $attributeMetadata;
+    }
+
+    /**
+     * Returns all known attributes metadata for a given entity type and attribute set
+     *
+     * @param string $entityType
+     * @param int $attributeSetId
+     * @param int $storeId
+     * @return AttributeMetadata[]
+     */
+    public function getAllAttributeSetMetadata($entityType, $attributeSetId = 0, $storeId = null)
+    {
+        if (null === $storeId) {
+            $storeId = $this->_storeManager->getStore()->getId();
+        }
+        $object = new \Magento\Object([
+            'store_id'          => $storeId,
+            'attribute_set_id'  => $attributeSetId,
+        ]);
+        $attributeCodes = $this->_eavConfig->getEntityAttributeCodes($entityType, $object);
+
+        $attributesMetadata = [];
+        foreach ($attributeCodes as $attributeCode) {
+            $attributesMetadata[] = $this->getAttributeMetadata($entityType, $attributeCode);
+        }
+        return $attributesMetadata;
+    }
+
+    /**
+     * Retrieve all attributes for entityType filtered by form code
+     *
+     * @param $entityType
+     * @param $formCode
+     * @return \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata[]
+     */
+    public function getAttributes($entityType, $formCode)
+    {
+        $attributes = [];
+        $this->_loadAttributesCollection($entityType, $formCode);
+        foreach ($this->_attrFormCollection as $attribute) {
+            $attributes[$attribute->getAttributeCode()] = $this->_createMetadataAttribute($attribute);
+        }
+        return $attributes;
+    }
+
+    /**
+     * Load collection with filters applied
+     *
+     * @param $entityType
+     * @param $formCode
+     * @return null
+     */
+    private function _loadAttributesCollection($entityType, $formCode)
+    {
+         $this->_attrFormCollection
+            ->setStore($this->_storeManager->getStore())
+            ->setEntityType($entityType)
+            ->addFormCodeFilter($formCode)
+            ->setSortOrder()
+            ->load();
+    }
+
+    /**
+     * @param \Magento\Eav\Model\Entity\Attribute\AbstractAttribute $attribute
+     * @return AttributeMetadata
+     */
+    private function _createMetadataAttribute($attribute)
+    {
+        $options = [];
+        try {
+            foreach ($attribute->getSource()->getAllOptions() as $option) {
+                $options[$option['label']] = $this->_optionBuilder->setLabel($option['label'])
+                    ->setValue($option['value'])
+                    ->create();
+            }
+        } catch (\Exception $e) {
+            // There is no source for this attribute
+        }
+        $this->_attributeMetadataBuilder->setAttributeCode($attribute->getAttributeCode())
+            ->setFrontendInput($attribute->getFrontendInput())
+            ->setInputFilter($attribute->getInputFilter())
+            ->setStoreLabel($attribute->getStoreLabel())
+            ->setValidationRules($attribute->getValidateRules())
+            ->setIsVisible($attribute->getIsVisible())
+            ->setIsRequired($attribute->getIsRequired())
+            ->setMultilineCount($attribute->getMultilineCount())
+            ->setDataModel($attribute->getDataModel())
+            ->setOptions($options);
+
+        return $this->_attributeMetadataBuilder->create();
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function getCustomerAttributeMetadata($attributeCode)
+    {
+        return $this->getAttributeMetadata('customer', $attributeCode);
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function getAllCustomerAttributeMetadata()
+    {
+        return $this->getAllAttributeSetMetadata('customer', self::CUSTOMER_ATTRIBUTE_SET_ID);
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function getAddressAttributeMetadata($attributeCode)
+    {
+        return $this->getAttributeMetadata('customer_address', $attributeCode);
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function getAllAddressAttributeMetadata()
+    {
+        return $this->getAllAttributeSetMetadata('customer_address', self::ADDRESS_ATTRIBUTE_SET_ID);
+    }
+
+
+    /**
+     * Helper for getting access to an entity types DTO cache.
+     *
+     * @param $entityType
+     * @return \ArrayAccess
+     */
+    private function _getEntityCache($entityType)
+    {
+        if (!isset($this->_cache[$entityType])) {
+            $this->_cache[$entityType] = new \ArrayObject();
+        }
+        return $this->_cache[$entityType];
+    }
+}
diff --git a/app/code/Magento/Customer/Service/V1/CustomerMetadataServiceInterface.php b/app/code/Magento/Customer/Service/V1/CustomerMetadataServiceInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..d0619bb0da4d83b521a4546f102a4d7e28eeec8f
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/CustomerMetadataServiceInterface.php
@@ -0,0 +1,95 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Customer\Service\V1;
+
+use Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata;
+
+/**
+ * Manipulate Customer Metadata Attributes *
+ */
+interface CustomerMetadataServiceInterface
+{
+    const CUSTOMER_ATTRIBUTE_SET_ID = 1;
+    const ADDRESS_ATTRIBUTE_SET_ID = 2;
+
+    /**
+     * Retrieve Attribute Metadata
+     *
+     * @param   mixed $entityType
+     * @param   mixed $attributeCode
+     * @return AttributeMetadata
+     */
+    public function getAttributeMetadata($entityType, $attributeCode);
+
+    /**
+     * Returns all known attributes metadata for a given entity type
+     *
+     * @param string $entityType
+     * @param int $attributeSetId
+     * @param int $storeId
+     * @return AttributeMetadata[]
+     */
+    public function getAllAttributeSetMetadata($entityType, $attributeSetId = 0, $storeId = null);
+
+    /**
+     * Retrieve all attributes for entityType filtered by form code
+     *
+     * @param $entityType
+     * @param $formCode
+     * @return AttributeMetadata[]
+     */
+    public function getAttributes($entityType, $formCode);
+
+    /**
+     * Retrieve Customer EAV attribute metadata
+     *
+     * @param string $attributeCode
+     * @return \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata
+     */
+    public function getCustomerAttributeMetadata($attributeCode);
+
+    /**
+     * Returns all attribute metadata for customers
+     *
+     * @return \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata[]
+     */
+    public function getAllCustomerAttributeMetadata();
+
+    /**
+     * Retrieve Customer Addresses EAV attribute metadata
+     *
+     * @param string $attributeCode
+     * @return \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata
+     */
+    public function getAddressAttributeMetadata($attributeCode);
+
+    /**
+     * Returns all attribute metadata for Addresses
+     *
+     * @return \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata[]
+     */
+    public function getAllAddressAttributeMetadata();
+
+}
diff --git a/app/code/Magento/Customer/Service/V1/CustomerService.php b/app/code/Magento/Customer/Service/V1/CustomerService.php
new file mode 100644
index 0000000000000000000000000000000000000000..7f53131bfe711410341d2877666524aba14b2deb
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/CustomerService.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\Customer\Service\V1;
+
+use Magento\Customer\Service\Entity\V1\Exception;
+use Magento\Customer\Model\Customer;
+use Magento\Validator\ValidatorException;
+
+/**
+ * Manipulate Customer Address Entities *
+ */
+class CustomerService implements CustomerServiceInterface
+{
+
+    /** @var array Cache of DTOs */
+    private $_cache = [];
+
+
+    /**
+     * @var \Magento\Customer\Model\Converter
+     */
+    private $_converter;
+
+
+    /**
+     * Constructor
+     *
+     * @param \Magento\Customer\Model\CustomerFactory $customerFactory
+     * @param \Magento\Customer\Model\AddressFactory $addressFactory
+     * @param \Magento\Customer\Service\V1\CustomerMetadataServiceInterface $eavMetadataService
+     * @param \Magento\Event\ManagerInterface $eventManager
+     * @param \Magento\Core\Model\StoreManagerInterface $storeManager
+     * @param \Magento\Math\Random $mathRandom
+     * @param \Magento\Customer\Model\Converter $converter
+     * @param \Magento\Customer\Model\Metadata\Validator $validator
+     * @param \Magento\Customer\Service\V1\Dto\RegionBuilder $regionBuilder
+     * @param \Magento\Customer\Service\V1\Dto\AddressBuilder $addressBuilder
+     * @param \Magento\Customer\Service\V1\Dto\Response\CreateCustomerAccountResponseBuilder $createCustomerAccountResponseBuilder
+     */
+    public function __construct(
+        \Magento\Customer\Model\Converter $converter
+    ) {
+        $this->_converter = $converter;
+    }
+
+
+    /**
+     * @inheritdoc
+     */
+    public function getCustomer($customerId)
+    {
+        if (!isset($this->_cache[$customerId])) {
+            $customerModel = $this->_converter->getCustomerModel($customerId);
+            $customerEntity = $this->_converter->createCustomerFromModel($customerModel);
+            $this->_cache[$customerId] = $customerEntity;
+        }
+
+        return $this->_cache[$customerId];
+    }
+
+
+    /**
+     * @inheritdoc
+     */
+    public function saveCustomer(Dto\Customer $customer, $password = null)
+    {
+        $customerModel = $this->_converter->createCustomerModel($customer);
+
+        if ($password) {
+            $customerModel->setPassword($password);
+        }
+
+        $validationErrors = $customerModel->validate();
+        if ($validationErrors !== true) {
+            throw new Exception(
+                'There were one or more errors validating the customer object.',
+                Exception::CODE_VALIDATION_FAILED,
+                new ValidatorException([$validationErrors])
+            );
+        }
+
+        try {
+            $customerModel->save();
+            unset($this->_cache[$customerModel->getId()]);
+        } catch (\Exception $e) {
+            switch ($e->getCode()) {
+                case Customer::EXCEPTION_EMAIL_EXISTS:
+                    $code = Exception::CODE_EMAIL_EXISTS;
+                    break;
+                default:
+                    $code = Exception::CODE_UNKNOWN;
+            }
+            throw new Exception($e->getMessage(), $code, $e);
+        }
+
+        return $customerModel->getId();
+    }
+}
diff --git a/app/code/Magento/Customer/Service/V1/CustomerServiceInterface.php b/app/code/Magento/Customer/Service/V1/CustomerServiceInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..6d12afb3c3dbcb1fdb9fcecffb6a212d129d4d7d
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/CustomerServiceInterface.php
@@ -0,0 +1,50 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Customer\Service\V1;
+
+/**
+ * Manipulate Customer Address Entities *
+ */
+interface CustomerServiceInterface
+{
+    /**
+     * Create or update customer information
+     *
+     * @param \Magento\Customer\Service\V1\Dto\Customer $customer
+     * @param string $password
+     * @throws \Magento\Customer\Service\Entity\V1\Exception
+     * @return int customer ID
+     */
+    public function saveCustomer(Dto\Customer $customer, $password = null);
+
+    /**
+     * Retrieve Customer
+     *
+     * @param int $customerId
+     * @return \Magento\Customer\Service\V1\Dto\Customer
+     */
+    public function getCustomer($customerId);
+
+}
diff --git a/app/code/Magento/Customer/Service/V1/Dto/Address.php b/app/code/Magento/Customer/Service/V1/Dto/Address.php
new file mode 100644
index 0000000000000000000000000000000000000000..771209452dc0c729dd6141757e364e2f47f77c3b
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/Dto/Address.php
@@ -0,0 +1,214 @@
+<?php
+/**
+ * Address class acts as a DTO for the Customer 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\Customer\Service\V1\Dto;
+
+use Magento\Customer\Service\V1\Dto\Region;
+
+class Address extends \Magento\Service\Entity\AbstractDto implements Eav\EntityInterface
+{
+    /**
+     * @var array
+     */
+    private static $_nonAttributes = ['id', 'customer_id', 'region', 'default_billing', 'default_shipping'];
+
+    /**
+     * @return int|null
+     */
+    public function getId()
+    {
+        return $this->_get('id');
+    }
+
+    /**
+     * @return boolean|null
+     */
+    public function isDefaultShipping()
+    {
+        return $this->_get('default_shipping');
+    }
+
+    /**
+     * @return boolean|null
+     */
+    public function isDefaultBilling()
+    {
+        return $this->_get('default_billing');
+    }
+
+    /**
+     * @return string[]
+     */
+    public function getAttributes()
+    {
+        $attributes = $this->_data;
+        foreach (self::$_nonAttributes as $keyName) {
+            unset ($attributes[$keyName]);
+        }
+
+        /** This triggers some code in _updateAddressModel in CustomerV1 Service */
+        if (!is_null($this->getRegion())) {
+            $attributes['region_id'] = $this->getRegion()->getRegionId();
+
+            $attributes['region'] = $this->getRegion()->getRegion();
+        }
+
+        return $attributes;
+    }
+
+    /**
+     * @param string $attributeCode
+     * @return string|null
+     */
+    public function getAttribute($attributeCode)
+    {
+        $attributes = $this->getAttributes();
+        if (isset($attributes[$attributeCode])
+            && !in_array($attributeCode, self::$_nonAttributes)) {
+            return $attributes[$attributeCode];
+        }
+        return null;
+    }
+
+    /**
+     * @return Region
+     */
+    public function getRegion()
+    {
+        return $this->_get('region');
+    }
+
+    /**
+     * @return int|null
+     */
+    public function getCountryId()
+    {
+        return $this->_get('country_id');
+    }
+
+    /**
+     * @return \string[]|null
+     */
+    public function getStreet()
+    {
+        return $this->_get('street');
+    }
+
+    /**
+     * @return string|null
+     */
+    public function getCompany()
+    {
+        return $this->_get('company');
+    }
+
+    /**
+     * @return string|null
+     */
+    public function getTelephone()
+    {
+        return $this->_get('telephone');
+    }
+
+    /**
+     * @return string|null
+     */
+    public function getFax()
+    {
+        return $this->_get('fax');
+    }
+
+    /**
+     * @return string|null
+     */
+    public function getPostcode()
+    {
+        return $this->_get('postcode');
+    }
+
+    /**
+     * @return string|null
+     */
+    public function getCity()
+    {
+        return $this->_get('city');
+    }
+
+    /**
+     * @return string|null
+     */
+    public function getFirstname()
+    {
+        return $this->_get('firstname');
+    }
+
+    /**
+     * @return string|null
+     */
+    public function getLastname()
+    {
+        return $this->_get('lastname');
+    }
+
+    /**
+     * @return string|null
+     */
+    public function getMiddlename()
+    {
+        return $this->_get('middlename');
+    }
+
+    /**
+     * @return string|null
+     */
+    public function getPrefix()
+    {
+        return $this->_get('prefix');
+    }
+
+    /**
+     * @return string|null
+     */
+    public function getSuffix()
+    {
+        return $this->_get('suffix');
+    }
+
+    /**
+     * @return string|null
+     */
+    public function getVatId()
+    {
+        return $this->_get('vat_id');
+    }
+
+    /**
+     * @return string|null
+     */
+    public function getCustomerId()
+    {
+        return $this->_get('customer_id');
+    }
+}
diff --git a/app/code/Magento/Customer/Service/V1/Dto/AddressBuilder.php b/app/code/Magento/Customer/Service/V1/Dto/AddressBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..e5b6eb54f060b8f31b2945b5f46ac7fca5a62819
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/Dto/AddressBuilder.php
@@ -0,0 +1,226 @@
+<?php
+/**
+ * Address class acts as a DTO for the Customer 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\Customer\Service\V1\Dto;
+
+use Magento\Customer\Service\V1\Dto\Region;
+
+class AddressBuilder extends \Magento\Service\Entity\AbstractDtoBuilder
+{
+    protected $_regionBuilder;
+
+    /**
+     * @param \Magento\Customer\Service\V1\Dto\RegionBuilder $regionBuilder
+     */
+    public function __construct(
+      \Magento\Customer\Service\V1\Dto\RegionBuilder $regionBuilder
+    ) {
+        parent::__construct();
+        $this->_regionBuilder = $regionBuilder;
+        $this->_data['region'] = $regionBuilder->create();
+    }
+
+    /**
+     * @param int $id
+     * @return AddressBuilder
+     */
+    public function setId($id)
+    {
+        return $this->_set('id', (string)$id);
+    }
+
+    /**
+     * @param boolean $defaultShipping
+     * @return AddressBuilder
+     */
+    public function setDefaultShipping($defaultShipping)
+    {
+        return $this->_set('default_shipping', (bool)$defaultShipping);
+    }
+
+    /**
+     * @param boolean $defaultBilling
+     * @return AddressBuilder
+     */
+    public function setDefaultBilling($defaultBilling)
+    {
+        return $this->_set('default_billing', (bool)$defaultBilling);
+    }
+
+    /**
+     * @param string[] $data
+     * @return AddressBuilder
+     */
+    public function populateWithArray(array $data)
+    {
+        unset($data['region_id']);
+        if (isset($data['region'])) {
+            $region = $data['region'];
+            if (!($region instanceof Region)) {
+                unset($data['region']);
+            }
+        }
+
+        parent::populateWithArray($data);
+
+        return $this;
+    }
+
+    /**
+     * @param Region $region
+     * @return AddressBuilder
+     */
+    public function setRegion(Region $region)
+    {
+        return $this->_set('region', $region);
+    }
+
+    /**
+     * @param int $countryId
+     * @return AddressBuilder
+     */
+    public function setCountryId($countryId)
+    {
+        return $this->_set('country_id', $countryId);
+    }
+
+    /**
+     * @param \string[] $street
+     * @return AddressBuilder
+     */
+    public function setStreet($street)
+    {
+        return $this->_set('street', $street);
+    }
+
+    /**
+     * @param string $company
+     * @return AddressBuilder
+     */
+    public function setCompany($company)
+    {
+        return $this->_set('company', $company);
+    }
+
+    /**
+     * @param string $telephone
+     * @return AddressBuilder
+     */
+    public function setTelephone($telephone)
+    {
+        return $this->_set('telephone', $telephone);
+    }
+
+    /**
+     * @param string $fax
+     * @return AddressBuilder
+     */
+    public function setFax($fax)
+    {
+        return $this->_set('fax', $fax);
+    }
+
+    /**
+     * @param string $postcode
+     * @return AddressBuilder
+     */
+    public function setPostcode($postcode)
+    {
+        return $this->_set('postcode', $postcode);
+    }
+
+    /**
+     * @param string $city
+     * @return AddressBuilder
+     */
+    public function setCity($city)
+    {
+        return $this->_set('city', $city);
+    }
+
+    /**
+     * @param string $firstname
+     * @return AddressBuilder
+     */
+    public function setFirstname($firstname)
+    {
+        return $this->_set('firstname', $firstname);
+    }
+
+    /**
+     * @param string $lastname
+     * @return AddressBuilder
+     */
+    public function setLastname($lastname)
+    {
+        return $this->_set('lastname', $lastname);
+    }
+
+    /**
+     * @param string $middlename
+     * @return AddressBuilder
+     */
+    public function setMiddlename($middlename)
+    {
+        return $this->_set('middlename', $middlename);
+    }
+
+    /**
+     * @param string $prefix
+     * @return AddressBuilder
+     */
+    public function setPrefix($prefix)
+    {
+        return $this->_set('prefix', $prefix);
+    }
+
+    /**
+     * @param string $suffix
+     * @return AddressBuilder
+     */
+    public function setSuffix($suffix)
+    {
+        return $this->_set('suffix', $suffix);
+    }
+
+    /**
+     * @param string $vatId
+     * @return AddressBuilder
+     */
+    public function setVatId($vatId)
+    {
+        return $this->_set('vat_id', $vatId);
+    }
+
+    /**
+     * @param string $customerId
+     * @return AddressBuilder
+     */
+    public function setCustomerId($customerId)
+    {
+        /** XXX: (string) Needed for tests to pass */
+        return $this->_set('customer_id', (string)$customerId);
+    }
+}
diff --git a/app/code/Magento/Customer/Service/V1/Dto/Customer.php b/app/code/Magento/Customer/Service/V1/Dto/Customer.php
new file mode 100644
index 0000000000000000000000000000000000000000..323759306b7da14a2fd5bb483ccce5ee5ccf6961
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/Dto/Customer.php
@@ -0,0 +1,248 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Customer\Service\V1\Dto;
+
+/**
+ * Class Customer
+ * Uses array to hold data, setters return $this so they can be chained.
+ *
+ * @package Magento\Customer\Service\Entity\V1
+ */
+class Customer extends \Magento\Service\Entity\AbstractDto implements Eav\EntityInterface
+{
+
+    /**
+     * @var array  Special attribute codes which cannot be set or gotten
+     * they are used by the model but should not be exposed in the DTO
+     */
+    private static $_nonAttributes = [self::ID];
+
+    /**
+     * name of field containing entity id, used to exclude this field from list of attributes.
+     */
+    const ID = 'id';
+
+    /**
+     * constants defined for keys of array, makes typos less likely
+     */
+    const CONFIRMATION = 'confirmation';
+    const CREATED_AT = 'created_at';
+    const CREATED_IN = 'created_in';
+    const DOB = 'dob';
+    const EMAIL = 'email';
+    const FIRSTNAME = 'firstname';
+    const GENDER = 'gender';
+    const GROUP_ID = 'group_id';
+    const LASTNAME = 'lastname';
+    const MIDDLENAME = 'middlename';
+    const PREFIX = 'prefix';
+    const STORE_ID = 'store_id';
+    const SUFFIX = 'suffix';
+    const TAXVAT = 'taxvat';
+    const WEBSITE_ID = 'website_id';
+    const DEFAULT_BILLING = 'default_billing';
+    const DEFAULT_SHIPPING = 'default_shipping';
+
+    /**
+     * Retrieve array of all attributes, in the form of 'attribute code' => <attribute value'
+     *
+     * @return array|\ArrayAccess|\string[]
+     */
+    public function getAttributes()
+    {
+        $attributes = $this->__toArray();
+        foreach (self::$_nonAttributes as $keyName) {
+            unset ($attributes[$keyName]);
+        }
+        return $attributes;
+    }
+
+    /**
+     * Gets an attribute value.
+     *
+     * @param string $attributeCode
+     * @return mixed The attribute value or null if the attribute has not been set
+     */
+    public function getAttribute($attributeCode)
+    {
+        if (isset($this->_data[$attributeCode])) {
+            return $this->_data[$attributeCode];
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * @return string
+     */
+    public function getDefaultBilling()
+    {
+        return $this->_get(self::DEFAULT_BILLING);
+    }
+
+    /**
+     * @return string
+     */
+    public function getDefaultShipping()
+    {
+        return $this->_get(self::DEFAULT_SHIPPING);
+    }
+
+    /**
+     * @return string
+     */
+    public function getConfirmation()
+    {
+        return $this->_get(self::CONFIRMATION);
+    }
+
+    /**
+     * @param string $confirmation
+     * @return Customer
+     */
+    public function setConfirmation($confirmation)
+    {
+        return $this->_set(self::CONFIRMATION, $confirmation);
+    }
+
+    /**
+     * @return string
+     */
+    public function getCreatedAt()
+    {
+        return $this->_get(self::CREATED_AT);
+    }
+
+    /**
+     * @return string
+     */
+    public function getCreatedIn()
+    {
+        return $this->_get(self::CREATED_IN);
+    }
+
+    /**
+     * @return string
+     */
+    public function getDob()
+    {
+        return $this->_get(self::DOB);
+    }
+
+    /**
+     * @return string
+     */
+    public function getEmail()
+    {
+        return $this->_get(self::EMAIL);
+    }
+
+    /**
+     * @return string
+     */
+    public function getFirstname()
+    {
+        return $this->_get(self::FIRSTNAME);
+    }
+
+    /**
+     * @return string
+     */
+    public function getGender()
+    {
+        return $this->_get(self::GENDER);
+    }
+
+    /**
+     * @return string
+     */
+    public function getGroupId()
+    {
+        return $this->_get(self::GROUP_ID);
+    }
+
+    /**
+     * @return int
+     */
+    public function getCustomerId()
+    {
+        return $this->_get(self::ID);
+    }
+
+    /**
+     * @return string
+     */
+    public function getLastname()
+    {
+        return $this->_get(self::LASTNAME);
+    }
+
+    /**
+     * @return string
+     */
+    public function getMiddlename()
+    {
+        return $this->_get(self::MIDDLENAME);
+    }
+
+    /**
+     * @return string
+     */
+    public function getPrefix()
+    {
+        return $this->_get(self::PREFIX);
+    }
+
+    /**
+     * @return int
+     */
+    public function getStoreId()
+    {
+        return $this->_get(self::STORE_ID);
+    }
+
+    /**
+     * @return string
+     */
+    public function getSuffix()
+    {
+        return $this->_get(self::SUFFIX);
+    }
+
+    /**
+     * @return string
+     */
+    public function getTaxvat()
+    {
+        return $this->_get(self::TAXVAT);
+    }
+
+    /**
+     * @return int
+     */
+    public function getWebsiteId()
+    {
+        return $this->_get(self::WEBSITE_ID, 0);
+    }
+}
diff --git a/app/code/Magento/Customer/Service/V1/Dto/CustomerBuilder.php b/app/code/Magento/Customer/Service/V1/Dto/CustomerBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..150e4a474ff06a515941daeef69005c70cbbad03
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/Dto/CustomerBuilder.php
@@ -0,0 +1,179 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Customer\Service\V1\Dto;
+use Magento\Customer\Service\V1\Dto\Customer;
+
+/**
+ * Class Customer
+ * Uses array to hold data, setters return $this so they can be chained.
+ *
+ * @package Magento\Customer\Service\Entity\V1
+ */
+class CustomerBuilder extends \Magento\Service\Entity\AbstractDtoBuilder
+{
+
+    /**
+     * @param string $confirmation
+     * @return CustomerBuilder
+     */
+    public function setConfirmation($confirmation)
+    {
+        return $this->_set(Customer::CONFIRMATION, $confirmation);
+    }
+
+    /**
+     * @param string $createdAt
+     * @return CustomerBuilder
+     */
+    public function setCreatedAt($createdAt)
+    {
+        return $this->_set(Customer::CREATED_AT, $createdAt);
+    }
+
+    /**
+     * @param string $createdIn
+     * @return CustomerBuilder
+     */
+    public function setCreatedIn($createdIn)
+    {
+        return $this->_set(Customer::CREATED_IN, $createdIn);
+    }
+
+    /**
+     * @param string $dob
+     * @return CustomerBuilder
+     */
+    public function setDob($dob)
+    {
+        return $this->_set(Customer::DOB, $dob);
+    }
+
+    /**
+     * @param string $email
+     * @return CustomerBuilder
+     */
+    public function setEmail($email)
+    {
+        return $this->_set(Customer::EMAIL, $email);
+    }
+
+    /**
+     * @param string $firstname
+     * @return CustomerBuilder
+     */
+    public function setFirstname($firstname)
+    {
+        return $this->_set(Customer::FIRSTNAME, $firstname);
+    }
+
+    /**
+     * @param string $gender
+     * @return CustomerBuilder
+     */
+    public function setGender($gender)
+    {
+        return $this->_set(Customer::GENDER, $gender);
+    }
+
+    /**
+     * @param string $groupId
+     * @return CustomerBuilder
+     */
+    public function setGroupId($groupId)
+    {
+        return $this->_set(Customer::GROUP_ID, $groupId);
+    }
+
+    /**
+     * @param int $id
+     * @return CustomerBuilder
+     */
+    public function setCustomerId($id)
+    {
+        return $this->_set(Customer::ID, $id);
+    }
+
+    /**
+     * @param string $lastname
+     * @return CustomerBuilder
+     */
+    public function setLastname($lastname)
+    {
+        return $this->_set(Customer::LASTNAME, $lastname);
+    }
+
+    /**
+     * @param string $middlename
+     * @return CustomerBuilder
+     */
+    public function setMiddlename($middlename)
+    {
+        return $this->_set(Customer::MIDDLENAME, $middlename);
+    }
+
+    /**
+     * @param string $prefix
+     * @return CustomerBuilder
+     */
+    public function setPrefix($prefix)
+    {
+        return $this->_set(Customer::PREFIX, $prefix);
+    }
+
+    /**
+     * @param int $storeId
+     * @return CustomerBuilder
+     */
+    public function setStoreId($storeId)
+    {
+        return $this->_set(Customer::STORE_ID, $storeId);
+    }
+
+    /**
+     * @param string $suffix
+     * @return CustomerBuilder
+     */
+    public function setSuffix($suffix)
+    {
+        return $this->_set(Customer::SUFFIX, $suffix);
+    }
+
+    /**
+     * @param string $taxvat
+     * @return CustomerBuilder
+     */
+    public function setTaxvat($taxvat)
+    {
+        return $this->_set(Customer::TAXVAT, $taxvat);
+    }
+
+    /**
+     * @param int $websiteId
+     * @return CustomerBuilder
+     */
+    public function setWebsiteId($websiteId)
+    {
+        return $this->_set(Customer::WEBSITE_ID, $websiteId);
+    }
+}
diff --git a/app/code/Magento/Customer/Service/V1/Dto/CustomerGroup.php b/app/code/Magento/Customer/Service/V1/Dto/CustomerGroup.php
new file mode 100644
index 0000000000000000000000000000000000000000..550278599f494fd4e2857d8f058ff9162b8e999e
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/Dto/CustomerGroup.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * Customer Service Address 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\Customer\Service\V1\Dto;
+
+class CustomerGroup extends \Magento\Service\Entity\AbstractDto
+{
+    /**
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->_get('id');
+    }
+
+    /**
+     * @return string
+     */
+    public function getCode()
+    {
+        return $this->_get('code');
+    }
+
+    /**
+     * @return int
+     */
+    public function getTaxClassId()
+    {
+        return $this->_get('tax_class_id');
+    }
+}
diff --git a/app/code/Magento/Customer/Service/V1/Dto/CustomerGroupBuilder.php b/app/code/Magento/Customer/Service/V1/Dto/CustomerGroupBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..0c81be242f5a9d76ceda41fe3c355aa27bfe4210
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/Dto/CustomerGroupBuilder.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Customer Service Address 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\Customer\Service\V1\Dto;
+
+class CustomerGroupBuilder extends \Magento\Service\Entity\AbstractDtoBuilder
+{
+    /**
+     * @param string $id
+     *
+     * @return CustomerGroupBuilder
+     */
+    public function setId($id)
+    {
+        return $this->_set('id', $id);
+    }
+
+    /**
+     * @param string $code
+     *
+     * @return CustomerGroupBuilder
+     */
+    public function setCode($code)
+    {
+        return $this->_set('code', $code);
+    }
+
+    /**
+     * @param string $taxClassId
+     *
+     * @return CustomerGroupBuilder
+     */
+    public function setTaxClassId($taxClassId)
+    {
+        return $this->_set('tax_class_id', $taxClassId);
+    }
+}
diff --git a/app/code/Magento/Customer/Service/V1/Dto/Eav/Attribute.php b/app/code/Magento/Customer/Service/V1/Dto/Eav/Attribute.php
new file mode 100644
index 0000000000000000000000000000000000000000..1b475810b8c676f9281ecea6857f4ec90708bb4e
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/Dto/Eav/Attribute.php
@@ -0,0 +1,51 @@
+<?php
+/**
+ * Eav Attribute
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Customer\Service\V1\Dto\Eav;
+
+class Attribute extends \Magento\Service\Entity\AbstractDto
+{
+    /**
+     * Constants used as keys into $_data
+     */
+    const ATTRIBUTE_CODE = 'attribute_code';
+    const VALUE = 'value';
+
+    /**
+     * @return string the attribute code
+     */
+    public function getAttributeCode()
+    {
+        return $this->_get(self::ATTRIBUTE_CODE);
+    }
+
+    /**
+     * @return string the attribute value
+     */
+    public function getValue()
+    {
+        return $this->_get(self::VALUE);
+    }
+}
diff --git a/app/code/Magento/Customer/Service/V1/Dto/Eav/AttributeBuilder.php b/app/code/Magento/Customer/Service/V1/Dto/Eav/AttributeBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..0f067c1f21d97c512847e42b77b36106281f1395
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/Dto/Eav/AttributeBuilder.php
@@ -0,0 +1,49 @@
+<?php
+/**
+ * Eav Attribute
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Customer\Service\V1\Dto\Eav;
+
+use Magento\Customer\Service\V1\Dto\Eav\Attribute;
+
+class AttributeBuilder extends \Magento\Service\Entity\AbstractDtoBuilder
+{
+    /**
+     * @param string $attributeCode
+     * @return AttributeBuilder
+     */
+    public function setAttributeCode($attributeCode)
+    {
+        return $this->_set(Attribute::ATTRIBUTE_CODE, $attributeCode);
+    }
+
+    /**
+     * @param string $value
+     * @return AttributeBuilder
+     */
+    public function setValue($value)
+    {
+        return $this->_set(Attribute::VALUE, $value);
+    }
+}
diff --git a/app/code/Magento/Customer/Service/V1/Dto/Eav/AttributeMetadata.php b/app/code/Magento/Customer/Service/V1/Dto/Eav/AttributeMetadata.php
new file mode 100644
index 0000000000000000000000000000000000000000..7c1c05328af526ff1d8414a84f51aa932bbac97d
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/Dto/Eav/AttributeMetadata.php
@@ -0,0 +1,125 @@
+<?php
+/**
+ * Eav Attribute Metadata
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Customer\Service\V1\Dto\Eav;
+
+use Magento\Customer\Service\V1\Dto\Eav\Option;
+
+class AttributeMetadata extends \Magento\Service\Entity\AbstractDto
+{
+    /**
+     * Constants used as keys into $_data
+     */
+    const ATTRIBUTE_CODE = 'attribute_code';
+    const FRONT_END_INPUT = 'front_end_input';
+    const INPUT_FILTER = 'input_filter';
+    const STORE_LABEL = 'store_label';
+    const VALIDATION_RULES = 'validation_rules';
+    const OPTIONS = 'options';
+    const VISIBLE = 'is_visible';
+    const REQUIRED = 'is_required';
+    const MULTILINE_COUNT = 'multiline_count';
+    const DATA_MODEL = 'data_model';
+
+    /**
+     * @return string
+     */
+    public function getAttributeCode()
+    {
+        return $this->_get(self::ATTRIBUTE_CODE);
+    }
+
+    /**
+     * @return string
+     */
+    public function getFrontendInput()
+    {
+        return $this->_get(self::FRONT_END_INPUT);
+    }
+
+    /**
+     * @return string
+     */
+    public function getInputFilter()
+    {
+        return $this->_get(self::INPUT_FILTER);
+    }
+
+    /**
+     * @return string
+     */
+    public function getStoreLabel()
+    {
+        return $this->_get(self::STORE_LABEL);
+    }
+
+    /**
+     * @return string
+     */
+    public function getValidationRules()
+    {
+        return $this->_get(self::VALIDATION_RULES);
+    }
+
+    /**
+     * @return int
+     */
+    public function getMultilineCount()
+    {
+        return $this->_get(self::MULTILINE_COUNT);
+    }
+
+    /**
+     * @return boolean
+     */
+    public function getIsVisible()
+    {
+        return $this->_get(self::VISIBLE);
+    }
+
+    /**
+     * @return boolean
+     */
+    public function getIsRequired()
+    {
+        return $this->_get(self::REQUIRED);
+    }
+
+    /**
+     * @return string
+     */
+    public function getDataModel()
+    {
+        return $this->_get(self::DATA_MODEL);
+    }
+
+    /**
+     * @return Option[]
+     */
+    public function getOptions()
+    {
+        return $this->_get(self::OPTIONS);
+    }
+}
diff --git a/app/code/Magento/Customer/Service/V1/Dto/Eav/AttributeMetadataBuilder.php b/app/code/Magento/Customer/Service/V1/Dto/Eav/AttributeMetadataBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..72792c4292fd73664acbce60e0844fe5f15f37bd
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/Dto/Eav/AttributeMetadataBuilder.php
@@ -0,0 +1,131 @@
+<?php
+/**
+ * Eav Attribute Metadata
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Customer\Service\V1\Dto\Eav;
+
+use Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata;
+
+class AttributeMetadataBuilder extends \Magento\Service\Entity\AbstractDtoBuilder
+{
+    /**
+     * Initializes builder.
+     */
+    public function __construct()
+    {
+        parent::__construct();
+        $this->_data[AttributeMetadata::OPTIONS] = array();
+    }
+
+    /**
+     * @param $attributeCode
+     * @return AttributeMetadataBuilder
+     */
+    public function setAttributeCode($attributeCode)
+    {
+        return $this->_set(AttributeMetadata::ATTRIBUTE_CODE, $attributeCode);
+    }
+
+    /**
+     * @param $frontendInput
+     * @return AttributeMetadataBuilder
+     */
+    public function setFrontendInput($frontendInput)
+    {
+        return $this->_set(AttributeMetadata::FRONT_END_INPUT, $frontendInput);
+    }
+
+    /**
+     * @param $inputFilter
+     * @return AttributeMetadataBuilder
+     */
+    public function setInputFilter($inputFilter)
+    {
+        return $this->_set(AttributeMetadata::INPUT_FILTER, $inputFilter);
+    }
+
+    /**
+     * @param $storeLabel
+     * @return AttributeMetadataBuilder
+     */
+    public function setStoreLabel($storeLabel)
+    {
+        return $this->_set(AttributeMetadata::STORE_LABEL, $storeLabel);
+    }
+
+    /**
+     * @param string $validationRules
+     * @return AttributeMetadataBuilder
+     */
+    public function setValidationRules($validationRules)
+    {
+        return $this->_set(AttributeMetadata::VALIDATION_RULES, $validationRules);
+    }
+
+    /**
+     * @param \Magento\Customer\Service\V1\Dto\Eav\Option[] $options
+     * @return AttributeMetadataBuilder
+     */
+    public function setOptions($options)
+    {
+        $this->_set(AttributeMetadata::OPTIONS, $options);
+    }
+
+    /**
+     * @param boolean $visible
+     * @return AttributeMetadataBuilder
+     */
+    public function setIsVisible($visible)
+    {
+        return $this->_set(AttributeMetadata::VISIBLE, $visible);
+    }
+
+    /**
+     * @param boolean $required
+     * @return AttributeMetadataBuilder
+     */
+    public function setIsRequired($required)
+    {
+        return $this->_set(AttributeMetadata::REQUIRED, $required);
+    }
+
+
+    /**
+     * @param int $count
+     * @return AttributeMetadataBuilder
+     */
+    public function setMultilineCount($count)
+    {
+        return $this->_set(AttributeMetadata::MULTILINE_COUNT, $count);
+    }
+
+    /**
+     * @param string
+     * @return AttributeMetadataBuilder
+     */
+    public function setDataModel($dataModel)
+    {
+        return $this->_set(AttributeMetadata::DATA_MODEL, $dataModel);
+    }
+}
diff --git a/app/code/Magento/Customer/Service/V1/Dto/Eav/EntityInterface.php b/app/code/Magento/Customer/Service/V1/Dto/Eav/EntityInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..9375c6d00e4e7257d57853093a348d3a3a41d5ea
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/Dto/Eav/EntityInterface.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * Eav Attribute
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Customer\Service\V1\Dto\Eav;
+
+interface EntityInterface
+{
+    /**
+     * @return string[]
+     */
+    public function getAttributes();
+
+    /**
+     * @param string $attributeCode
+     * @return string|null
+     */
+    public function getAttribute($attributeCode);
+
+}
diff --git a/app/code/Magento/Customer/Service/V1/Dto/Eav/Option.php b/app/code/Magento/Customer/Service/V1/Dto/Eav/Option.php
new file mode 100644
index 0000000000000000000000000000000000000000..077539ae37c63c44c0aa68485879bccadc9909f3
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/Dto/Eav/Option.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Eav attribute option
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Customer\Service\V1\Dto\Eav;
+
+class Option extends \Magento\Service\Entity\AbstractDto
+{
+    /**
+     * Constants used as keys into $_data
+     */
+    const LABEL = 'label';
+    const VALUE = 'value';
+
+    /**
+     * Get option label
+     *
+     * @return string
+     */
+    public function getLabel()
+    {
+        return $this->_get(self::LABEL);
+    }
+
+    /**
+     * Get option value
+     *
+     * @return string
+     */
+    public function getValue()
+    {
+        return $this->_get(self::VALUE);
+    }
+}
diff --git a/app/code/Magento/Customer/Service/V1/Dto/Eav/OptionBuilder.php b/app/code/Magento/Customer/Service/V1/Dto/Eav/OptionBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..045cfad463ad0ea4251f3f091265307adedbf466
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/Dto/Eav/OptionBuilder.php
@@ -0,0 +1,51 @@
+<?php
+/**
+ * Eav attribute option
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Customer\Service\V1\Dto\Eav;
+
+use Magento\Customer\Service\V1\Dto\Eav\Option;
+
+class OptionBuilder extends \Magento\Service\Entity\AbstractDtoBuilder
+{
+    /**
+     * Set option label
+     *
+     * @return OptionBuilder
+     */
+    public function setLabel($label)
+    {
+        return $this->_set(Option::LABEL, $label);
+    }
+
+    /**
+     * Set option value
+     *
+     * @return OptionBuilder
+     */
+    public function setValue($value)
+    {
+        return $this->_set(Option::VALUE, $value);
+    }
+}
diff --git a/app/code/Magento/Customer/Service/V1/Dto/Filter.php b/app/code/Magento/Customer/Service/V1/Dto/Filter.php
new file mode 100644
index 0000000000000000000000000000000000000000..be4afba2ec1cf93cac16dd3500ded24bac53103b
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/Dto/Filter.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * Customer Service Address 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\Customer\Service\V1\Dto;
+
+class Filter extends \Magento\Service\Entity\AbstractDto
+{
+    /**
+     * @return string
+     */
+    public function getField()
+    {
+        return $this->_get('field');
+    }
+
+    /**
+     * @return string
+     */
+    public function getValue()
+    {
+        return $this->_get('value');
+    }
+
+    /**
+     * @return string
+     */
+    public function getConditionType()
+    {
+        return $this->_get('condition_type');
+    }
+}
diff --git a/app/code/Magento/Customer/Service/V1/Dto/FilterBuilder.php b/app/code/Magento/Customer/Service/V1/Dto/FilterBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..f6f1c37619dcf3119221f86f9728c91f7eb97702
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/Dto/FilterBuilder.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * Customer Service Address 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\Customer\Service\V1\Dto;
+
+class FilterBuilder extends \Magento\Service\Entity\AbstractDtoBuilder
+{
+    /**
+     * Initializes the builder.
+     */
+    public function __construct()
+    {
+        parent::__construct();
+
+        /* XXX: special constructor to set default values */
+        $this->_data['condition_type'] = 'and';
+    }
+
+    /**
+     * @param string $field
+     * @return FilterBuilder
+     */
+    public function setField($field)
+    {
+        $this->_data['field'] = $field;
+        return $this;
+    }
+
+    /**
+     * @param string $value
+     * @return FilterBuilder
+     */
+    public function setValue($value)
+    {
+        $this->_data['value'] = $value;
+        return $this;
+    }
+
+    /**
+     * @param string $conditionType
+     * @return FilterBuilder
+     */
+    public function setConditionType($conditionType)
+    {
+        $this->_data['condition_type'] = $conditionType;
+        return $this;
+    }
+}
diff --git a/app/code/Magento/Customer/Service/V1/Dto/Region.php b/app/code/Magento/Customer/Service/V1/Dto/Region.php
new file mode 100644
index 0000000000000000000000000000000000000000..475602a5e774d50d3d7c05aceb8c96b2ab083ee4
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/Dto/Region.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * Class Region
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Customer\Service\V1\Dto;
+
+class Region extends \Magento\Service\Entity\AbstractDto
+{
+    /**
+     * @return string
+     */
+    public function getRegionCode()
+    {
+        return $this->_get('region_code');
+    }
+
+    /**
+     * @return string
+     */
+    public function getRegion()
+    {
+        return $this->_get('region');
+    }
+
+    /**
+     * @return int
+     */
+    public function getRegionId()
+    {
+        return $this->_get('region_id');
+    }
+}
diff --git a/app/code/Magento/Customer/Service/V1/Dto/RegionBuilder.php b/app/code/Magento/Customer/Service/V1/Dto/RegionBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..1f1d0bbdde0f25be112ff4e892a5bbb4b1c1f13f
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/Dto/RegionBuilder.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Customer Service Address 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\Customer\Service\V1\Dto;
+
+class RegionBuilder extends \Magento\Service\Entity\AbstractDtoBuilder
+{
+    /**
+     * @param string $regionCode
+     * @return RegionBuilder
+     */
+    public function setRegionCode($regionCode)
+    {
+        $this->_data['region_code'] = $regionCode;
+        return $this;
+    }
+
+    /**
+     * @param string $regionName
+     * @return RegionBuilder
+     */
+    public function setRegion($regionName)
+    {
+        $this->_data['region'] = $regionName;
+        return $this;
+    }
+
+    /**
+     * @param string $regionId
+     * @return RegionBuilder
+     */
+    public function setRegionId($regionId)
+    {
+        $this->_data['region_id'] = $regionId;
+        return $this;
+    }
+}
diff --git a/app/code/Magento/Customer/Service/V1/Dto/Response/CreateCustomerAccountResponse.php b/app/code/Magento/Customer/Service/V1/Dto/Response/CreateCustomerAccountResponse.php
new file mode 100644
index 0000000000000000000000000000000000000000..e9b88ac826c1edef220f6dafa76317f3b7dc8ca9
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/Dto/Response/CreateCustomerAccountResponse.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Class CreateCustomerAccountResponse
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Customer\Service\V1\Dto\Response;
+
+class CreateCustomerAccountResponse extends \Magento\Service\Entity\AbstractDto
+{
+    /**
+     * @return int
+     */
+    public function getCustomerId()
+    {
+        return $this->_get('customer_id');
+    }
+
+    /**
+     * @return string
+     */
+    public function getStatus()
+    {
+        return $this->_get('status');
+    }
+}
diff --git a/app/code/Magento/Customer/Service/V1/Dto/Response/CreateCustomerAccountResponseBuilder.php b/app/code/Magento/Customer/Service/V1/Dto/Response/CreateCustomerAccountResponseBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..4e5236b66f5a42fb6d75412b6085af06e817a109
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/Dto/Response/CreateCustomerAccountResponseBuilder.php
@@ -0,0 +1,47 @@
+<?php
+/**
+ * Class CreateCustomerAccountResponse
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Customer\Service\V1\Dto\Response;
+
+class CreateCustomerAccountResponseBuilder extends \Magento\Service\Entity\AbstractDtoBuilder
+{
+    /**
+     * @param int $customerId
+     * @return CreateCustomerAccountResponseBuilder
+     */
+    public function setCustomerId($customerId)
+    {
+        return $this->_set('customer_id', $customerId);
+    }
+
+    /**
+     * @param string $status
+     * @return CreateCustomerAccountResponseBuilder
+     */
+    public function setStatus($status)
+    {
+        return $this->_set('status', $status);
+    }
+}
diff --git a/app/code/Magento/Customer/Service/V1/Dto/SearchCriteria.php b/app/code/Magento/Customer/Service/V1/Dto/SearchCriteria.php
new file mode 100644
index 0000000000000000000000000000000000000000..87136556f6fd8ba359328b9ffe46472995acfe0e
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/Dto/SearchCriteria.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * Customer Service Address 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\Customer\Service\V1\Dto;
+
+use Magento\Customer\Service\V1\Dto\Filter;
+
+class SearchCriteria extends \Magento\Service\Entity\AbstractDto
+{
+    const SORT_ASC = 1;
+    const SORT_DESC = -1;
+
+    /**
+     * @return Filter[]
+     */
+    public function getFilters()
+    {
+        return $this->_get('filters', $this->_createArray());
+    }
+
+    /**
+     * @return array
+     */
+    public function getSortOrders()
+    {
+        return $this->_get('sort_orders', $this->_createArray());
+    }
+
+    /**
+     * @return int
+     */
+    public function getPageSize()
+    {
+        return $this->_get('page_size');
+    }
+
+    /**
+     * @return int
+     */
+    public function getCurrentPage()
+    {
+        return $this->_get('current_page');
+    }
+}
diff --git a/app/code/Magento/Customer/Service/V1/Dto/SearchCriteriaBuilder.php b/app/code/Magento/Customer/Service/V1/Dto/SearchCriteriaBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..559135790f3eac1bbdf6b6de1b318b7503bd1d37
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/Dto/SearchCriteriaBuilder.php
@@ -0,0 +1,82 @@
+<?php
+/**
+ * Customer Service Address 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\Customer\Service\V1\Dto;
+
+use Magento\Customer\Service\V1\Dto\Filter;
+
+class SearchCriteriaBuilder extends \Magento\Service\Entity\AbstractDtoBuilder
+{
+    /**
+     * @param Filter $filter
+     *
+     * @return SearchCriteriaBuilder
+     */
+    public function addFilter($filter)
+    {
+        if (!isset($this->_data['filters'])) {
+            $this->_data['filters'] = array();
+        }
+
+        $this->_data['filters'][] = $filter;
+        return $this;
+    }
+
+    /**
+     * @param string $field
+     * @param int $direction
+     *
+     * @return SearchCriteriaBuilder
+     */
+    public function addSortOrder($field, $direction)
+    {
+        if (!isset($this->_data['sort_orders'])) {
+            $this->_data['sort_orders'] = array();
+        }
+
+        $this->_data['sort_orders'][$field] = $direction;
+        return $this;
+    }
+
+    /**
+     * @param int $pageSize
+     *
+     * @return SearchCriteriaBuilder
+     */
+    public function setPageSize($pageSize)
+    {
+        return $this->_set('page_size', $pageSize);
+    }
+
+    /**
+     * @param int $currentPage
+     *
+     * @return SearchCriteriaBuilder
+     */
+    public function setCurrentPage($currentPage)
+    {
+        return $this->_set('current_page', $currentPage);
+    }
+}
diff --git a/app/code/Magento/Customer/Service/V1/Dto/SearchResults.php b/app/code/Magento/Customer/Service/V1/Dto/SearchResults.php
new file mode 100644
index 0000000000000000000000000000000000000000..27f53ba92e5af8348641401fa177cdafc534b490
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/Dto/SearchResults.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * Customer Service Address 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\Customer\Service\V1\Dto;
+
+
+use Magento\Customer\Service\V1\Dto\SearchCriteria;
+
+class SearchResults extends \Magento\Service\Entity\AbstractDto
+{
+    /**
+     * @return array
+     */
+    public function getItems()
+    {
+        return $this->_get('items');
+    }
+
+    /**
+     * @return SearchCriteria
+     */
+    public function getSearchCriteria()
+    {
+        return $this->_get('search_criteria');
+    }
+
+    /**
+     * @return int
+     */
+    public function getTotalCount()
+    {
+        return $this->_get('total_count');
+    }
+}
diff --git a/app/code/Magento/Customer/Service/V1/Dto/SearchResultsBuilder.php b/app/code/Magento/Customer/Service/V1/Dto/SearchResultsBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..356703d11c54e49fb7522dd15a54518d5c4d482b
--- /dev/null
+++ b/app/code/Magento/Customer/Service/V1/Dto/SearchResultsBuilder.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * Customer Service Address 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\Customer\Service\V1\Dto;
+
+use Magento\Customer\Service\V1\Dto\SearchCriteria;
+
+class SearchResultsBuilder extends \Magento\Service\Entity\AbstractDtoBuilder
+{
+    /**
+     * @param \Magento\Customer\Service\V1\Dto\SearchCriteria $searchCriteria
+     *
+     * @return SearchResultsBuilder
+     */
+    public function setSearchCriteria(SearchCriteria $searchCriteria)
+    {
+        return $this->_set('search_criteria', $searchCriteria);
+    }
+
+    /**
+     * @param int $totalCount
+     *
+     * @return SearchResultsBuilder
+     */
+    public function setTotalCount($totalCount)
+    {
+        return $this->_set('total_count', $totalCount);
+    }
+
+    /**
+     * @param array $items
+     *
+     * @return SearchResultsBuilder
+     */
+    public function setItems($items)
+    {
+        return $this->_set('items', $items);
+    }
+}
diff --git a/app/code/Magento/Customer/etc/di.xml b/app/code/Magento/Customer/etc/di.xml
index 95daf16f147a1ce500600fb7bf3cff4cc084cbb7..dfb7026534a0e9f723c0b35307557e52d4ba9366 100644
--- a/app/code/Magento/Customer/etc/di.xml
+++ b/app/code/Magento/Customer/etc/di.xml
@@ -24,6 +24,16 @@
  */
 -->
 <config>
+    <preference for="Magento\Customer\Service\V1\CustomerServiceInterface"
+                type="Magento\Customer\Service\V1\CustomerService" />
+    <preference for="Magento\Customer\Service\V1\CustomerAddressServiceInterface"
+                type="Magento\Customer\Service\V1\CustomerAddressService" />
+    <preference for="Magento\Customer\Service\V1\CustomerGroupServiceInterface"
+                type="Magento\Customer\Service\V1\CustomerGroupService" />
+    <preference for="Magento\Customer\Service\V1\CustomerAccountServiceInterface"
+                type="Magento\Customer\Service\V1\CustomerAccountService" />
+    <preference for="Magento\Customer\Service\V1\CustomerMetadataServiceInterface"
+                type="Magento\Customer\Service\V1\CustomerMetadataService" />
     <type name="Magento\Customer\Model\Session">
         <param name="configShare">
             <instance type="Magento\Customer\Model\Config\Share\Proxy" />
@@ -60,4 +70,15 @@
             <instance type="Magento\Customer\Helper\Data\Proxy" />
         </param>
     </type>
+    <type name="Magento\Customer\Service\V1\Dto\AddressBuilder" shared="false" />
+    <type name="Magento\Customer\Service\V1\Dto\CustomerBuilder" shared="false" />
+    <type name="Magento\Customer\Service\V1\Dto\CustomerGroupBuilder" shared="false" />
+    <type name="Magento\Customer\Service\V1\Dto\Eav\AttributeBuilder" shared="false" />
+    <type name="Magento\Customer\Service\V1\Dto\Eav\AttributeMetadataBuilder" shared="false" />
+    <type name="Magento\Customer\Service\V1\Dto\Eav\OptionBuilder" shared="false" />
+    <type name="Magento\Customer\Service\V1\Dto\FilterBuilder" shared="false" />
+    <type name="Magento\Customer\Service\V1\Dto\RegionBuilder" shared="false" />
+    <type name="Magento\Customer\Service\V1\Dto\Response\CreateCustomerAccountResponseBuilder" shared="false" />
+    <type name="Magento\Customer\Service\V1\Dto\SearchCriteriaBuilder" shared="false" />
+    <type name="Magento\Customer\Service\V1\Dto\SearchResultsBuilder" shared="false" />
 </config>
diff --git a/app/code/Magento/Customer/etc/validation.xml b/app/code/Magento/Customer/etc/validation.xml
index 6e0813f81bc2aaa27d227b0c6b0c83947ffe4ac7..9bd9094cc9a465d9147be8575998d71370788529 100644
--- a/app/code/Magento/Customer/etc/validation.xml
+++ b/app/code/Magento/Customer/etc/validation.xml
@@ -33,6 +33,11 @@
                     <constraint alias="eav_data_validator" class="Magento\Eav\Model\Validator\Attribute\Data" />
                 </entity_constraints>
             </rule>
+            <rule name="metadata_form_data">
+                <entity_constraints>
+                    <constraint alias="metadata_data_validator" class="Magento\Customer\Model\Metadata\Validator" />
+                </entity_constraints>
+            </rule>
         </rules>
         <groups>
             <group name="save">
@@ -40,6 +45,11 @@
                     <use rule="check_eav"/>
                 </uses>
             </group>
+            <group name="form">
+                <uses>
+                    <use rule="metadata_form_data"/>
+                </uses>
+            </group>
         </groups>
     </entity>
 
diff --git a/app/code/Magento/Directory/Model/Currency/DefaultLocator.php b/app/code/Magento/Directory/Model/Currency/DefaultLocator.php
index 65980fc452475c18ffd2603296f03afa22126946..c7293304413c9292871255c75fb190713b597137 100644
--- a/app/code/Magento/Directory/Model/Currency/DefaultLocator.php
+++ b/app/code/Magento/Directory/Model/Currency/DefaultLocator.php
@@ -63,7 +63,7 @@ class DefaultLocator
             $group = $request->getParam('group');
             $currencyCode =  $this->_app->getGroup($group)->getWebsite()->getBaseCurrencyCode();
         } else {
-            $currencyCode = $this->_app->getStore()->getBaseCurrencyCode();
+            $currencyCode = $this->_app->getBaseCurrencyCode();
         }
 
         return $currencyCode;
diff --git a/app/code/Magento/Eav/Model/Resource/Entity/Attribute/Collection.php b/app/code/Magento/Eav/Model/Resource/Entity/Attribute/Collection.php
index 27de52a584350e036315e016ee1d72778c4ffb70..f9c2abcfecd8e6eece40b9b9e768ce90ec57b17f 100644
--- a/app/code/Magento/Eav/Model/Resource/Entity/Attribute/Collection.php
+++ b/app/code/Magento/Eav/Model/Resource/Entity/Attribute/Collection.php
@@ -135,7 +135,7 @@ class Collection extends \Magento\Core\Model\Resource\Db\Collection\AbstractColl
                 'entity_attribute.attribute_id = main_table.attribute_id'
             );
             $this->addFieldToFilter('entity_attribute.attribute_set_id', $setId);
-            $this->setOrder('sort_order', self::SORT_ORDER_ASC);
+            $this->setOrder('entity_attribute.sort_order', self::SORT_ORDER_ASC);
         }
 
         return $this;
diff --git a/app/code/Magento/GiftMessage/view/adminhtml/sales/order/create/giftoptions.phtml b/app/code/Magento/GiftMessage/view/adminhtml/sales/order/create/giftoptions.phtml
index 875818a9e24b1697281e995ab698094468338274..3525079772c20c177d0f0e2b3c431c833d415eec 100644
--- a/app/code/Magento/GiftMessage/view/adminhtml/sales/order/create/giftoptions.phtml
+++ b/app/code/Magento/GiftMessage/view/adminhtml/sales/order/create/giftoptions.phtml
@@ -31,7 +31,7 @@
     <?php if ($_childHtml): ?>
         <tr class="border">
             <td colspan="8">
-                <a class="action-link" href="#" id="gift_options_link_<?php echo $_item->getId() ?>"><?php echo __('Gift Options') ?></a></strong>
+                <a class="action-link" href="#" id="gift_options_link_<?php echo $_item->getId() ?>"><?php echo __('Gift Options') ?></a>
                 <script type="text/javascript">
                     giftOptionsTooltip.addTargetLink('gift_options_link_<?php echo $_item->getId() ?>', <?php echo $_item->getId() ?>);
                 </script>
diff --git a/app/code/Magento/GoogleShopping/Model/Observer.php b/app/code/Magento/GoogleShopping/Model/Observer.php
index 44826071f98b32d62e28363dfe26832e6218446c..7a71ecaf6b78553e199a6bbedf6978d9d997bae5 100644
--- a/app/code/Magento/GoogleShopping/Model/Observer.php
+++ b/app/code/Magento/GoogleShopping/Model/Observer.php
@@ -165,13 +165,13 @@ class Observer
      */
     public function checkSynchronizationOperations(\Magento\Event\Observer $observer)
     {
-        $flag = $this->_flag->loadSelf();
-        if ($flag->isExpired()) {
+        $this->_flag->loadSelf();
+        if ($this->_flag->isExpired()) {
             $this->_inboxFactory->create()->addMajor(
                 __('Google Shopping operation has expired.'),
                 __('One or more google shopping synchronization operations failed because of timeout.')
             );
-            $flag->unlock();
+            $this->_flag->unlock();
         }
         return $this;
     }
diff --git a/app/code/Magento/ImportExport/Controller/Adminhtml/Export.php b/app/code/Magento/ImportExport/Controller/Adminhtml/Export.php
index 770832a391450e7fdc239197e7ba0778d5b46ee6..1f423a0a46e9533554e6c85d9ad01fa28005d662 100644
--- a/app/code/Magento/ImportExport/Controller/Adminhtml/Export.php
+++ b/app/code/Magento/ImportExport/Controller/Adminhtml/Export.php
@@ -91,6 +91,7 @@ class Export extends \Magento\Backend\App\Action
 
                 return $this->_fileFactory->create(
                     $model->getFileName(),
+                    \Magento\Filesystem::VAR_DIR,
                     $model->export(),
                     $model->getContentType()
                 );
diff --git a/app/code/Magento/Install/view/install/page.phtml b/app/code/Magento/Install/view/install/page.phtml
index 0869785b199e8a9105f97678541bb94f00baa6f9..60bd43b8308e796a66a7bd5e395445dfd7d59528 100644
--- a/app/code/Magento/Install/view/install/page.phtml
+++ b/app/code/Magento/Install/view/install/page.phtml
@@ -40,7 +40,7 @@
 
     <script type="text/javascript" src="<?php echo $this->getViewFileUrl('jquery/jquery.js') ?>"></script>
     <script type="text/javascript" src="<?php echo $this->getViewFileUrl('jquery/jquery-ui.js') ?>"></script>
-    <script type="text/javascript" src="<?php echo $this->getViewFileUrl('head.load.min.js') ?>"></script>
+    <script type="text/javascript" src="<?php echo $this->getViewFileUrl('headjs/head.load.min.js') ?>"></script>
     <script type="text/javascript" src="<?php echo $this->getViewFileUrl('mage/mage.js') ?>"></script>
     <script type="text/javascript" src="<?php echo $this->getViewFileUrl('mage/translate.js') ?>"></script>
 
diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber.php
index 1016c5d79a8662484380a26964cf7ac6258eeb45..1735bdb1359e6277d745d0269591d988518b9f1b 100644
--- a/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber.php
+++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Subscriber.php
@@ -82,7 +82,7 @@ class Subscriber extends \Magento\Backend\App\Action
         $fileName = 'subscribers.csv';
         $content = $this->_view->getLayout()->getChildBlock('adminhtml.newslettrer.subscriber.grid', 'grid.export');
 
-        return $this->_fileFactory->create($fileName, $content->getCsvFile($fileName));
+        return $this->_fileFactory->create($fileName, $content->getCsvFile($fileName), \Magento\Filesystem::VAR_DIR);
     }
 
     /**
@@ -93,7 +93,7 @@ class Subscriber extends \Magento\Backend\App\Action
         $this->_view->loadLayout();
         $fileName = 'subscribers.xml';
         $content = $this->_view->getLayout()->getChildBlock('adminhtml.newslettrer.subscriber.grid', 'grid.export');
-        return $this->_fileFactory->create($fileName, $content->getExcelFile($fileName));
+        return $this->_fileFactory->create($fileName, $content->getExcelFile($fileName), \Magento\Filesystem::VAR_DIR);
     }
 
     public function massUnsubscribeAction()
diff --git a/app/code/Magento/Paygate/view/frontend/info/cc.phtml b/app/code/Magento/Paygate/view/frontend/info/cc.phtml
index 5c722a71191d794149a78077679285ecfa13de9d..6d818bec2cabd0bf9478715adf3b436d83e86ad8 100644
--- a/app/code/Magento/Paygate/view/frontend/info/cc.phtml
+++ b/app/code/Magento/Paygate/view/frontend/info/cc.phtml
@@ -27,30 +27,28 @@
 
 <?php if (!$this->getHideTitle()): ?>
     <p><strong><?php echo $this->escapeHtml($this->getMethod()->getTitle()) ?></strong></p>
-<?php endif;?>
+<?php endif; ?>
 
 <?php
     $cards = $this->getCards();
     $showCount = count($cards) > 1;
 ?>
 
-<dl class="cards-list">
+<dl class="cards items">
 <?php foreach ($cards as $key => $card): ?>
+
     <?php if ($showCount): ?>
         <dt><?php echo sprintf(__('Credit Card %s'), $key + 1); ?></dt>
-    <?php endif;?>
+    <?php endif; ?>
 
-    <dd <?php if ($showCount):?> class="offset"<?php endif;?>>
-    <table class="info-table">
-        <tbody>
-        <?php foreach ($card as $_label => $_value):?>
-        <tr>
-            <th><?php echo $this->escapeHtml($_label)?>:</th>
-            <td><?php echo nl2br(implode($this->getValueAsArray($_value, true), "\n"))?></td>
-        </tr>
+    <dd>
+        <dl class="card item">
+        <?php foreach ($card as $_label => $_value): ?>
+            <dt><?php echo $this->escapeHtml($_label); ?>:</dt>
+            <dd><?php echo nl2br(implode($this->getValueAsArray($_value, true), "\n")); ?></dd>
         <?php endforeach; ?>
-        </tbody>
-    </table>
+        </dl>
     </dd>
+
 <?php endforeach; ?>
 </dl>
diff --git a/app/code/Magento/Payment/view/adminhtml/form/cc.phtml b/app/code/Magento/Payment/view/adminhtml/form/cc.phtml
index 740d205c29e2618d70d9618ff3cf0b90e8e69db4..a959fe651697589bbccb3985e587fc2eaef6dfe7 100644
--- a/app/code/Magento/Payment/view/adminhtml/form/cc.phtml
+++ b/app/code/Magento/Payment/view/adminhtml/form/cc.phtml
@@ -25,93 +25,95 @@
  */
 ?>
 <?php $_code=$this->getMethodCode() ?>
-<ul id="payment_form_<?php echo $_code ?>" style="display:none">
-    <li>
-        <div class="input-box">
-            <label for="<?php echo $_code ?>_cc_type"><?php echo __('Credit Card Type') ?> <span class="required">*</span></label><br/>
+<fieldset class="fieldset payment method" id="payment_form_<?php echo $_code ?>" style="display:none">
+    <div class="field field-type required">
+        <label class="label" for="<?php echo $_code ?>_cc_type"><span><?php echo __('Credit Card Type') ?></span></label>
+        <div class="control">
             <select id="<?php echo $_code ?>_cc_type" name="payment[cc_type]" class="required-entry validate-cc-type-select">
-            <?php $_ccType = $this->getInfoData('cc_type') ?>
+                <?php $_ccType = $this->getInfoData('cc_type') ?>
                 <option value=""></option>
-            <?php foreach ($this->getCcAvailableTypes() as $_typeCode => $_typeName): ?>
-                <option value="<?php echo $_typeCode ?>" <?php if($_typeCode==$_ccType): ?>selected="selected"<?php endif ?>><?php echo $_typeName ?></option>
-            <?php endforeach ?>
+                <?php foreach ($this->getCcAvailableTypes() as $_typeCode => $_typeName): ?>
+                    <option value="<?php echo $_typeCode ?>" <?php if($_typeCode==$_ccType): ?>selected="selected"<?php endif ?>><?php echo $_typeName ?></option>
+                <?php endforeach ?>
             </select>
         </div>
-    </li>
-    <li>
-        <div class="input-box">
-            <label for="<?php echo $_code ?>_cc_number"><?php echo __('Credit Card Number') ?> <span class="required">*</span></label><br/>
+    </div>
+    <div class="field field-number required">
+        <label  class="label" for="<?php echo $_code ?>_cc_number"><span><?php echo __('Credit Card Number') ?></span></label>
+        <div class="control">
             <input type="text" id="<?php echo $_code ?>_cc_number" name="payment[cc_number]" title="<?php echo __('Credit Card Number') ?>" class="input-text validate-cc-number" value="<?php echo $this->getInfoData('cc_number')?>"/>
         </div>
-    </li>
-    <li>
-        <div class="input-box">
-            <label for="<?php echo $_code ?>_expiration"><?php echo __('Expiration Date') ?> <span class="required">*</span></label><br/>
+    </div>
+    <div class="field field-date required">
+        <label class="label" for="<?php echo $_code ?>_expiration"><span><?php echo __('Expiration Date') ?></span></label>
+        <div class="control">
             <select id="<?php echo $_code ?>_expiration" style="width:140px;" name="payment[cc_exp_month]" class="validate-cc-exp required-entry">
-            <?php $_ccExpMonth = $this->getInfoData('cc_exp_month') ?>
-            <?php foreach ($this->getCcMonths() as $k=>$v): ?>
-                <option value="<?php echo $k ?>" <?php if($k==$_ccExpMonth): ?>selected="selected"<?php endif ?>><?php echo $v ?></option>
-            <?php endforeach ?>
+                <?php $_ccExpMonth = $this->getInfoData('cc_exp_month') ?>
+                <?php foreach ($this->getCcMonths() as $k=>$v): ?>
+                    <option value="<?php echo $k ?>" <?php if($k==$_ccExpMonth): ?>selected="selected"<?php endif ?>><?php echo $v ?></option>
+                <?php endforeach ?>
             </select>
             <?php $_ccExpYear = $this->getInfoData('cc_exp_year') ?>
             <select id="<?php echo $_code ?>_expiration_yr" style="width:103px;" name="payment[cc_exp_year]" class="required-entry">
-            <?php foreach ($this->getCcYears() as $k=>$v): ?>
-                <option value="<?php echo $k ? $k : '' ?>" <?php if($k==$_ccExpYear): ?>selected="selected"<?php endif ?>><?php echo $v ?></option>
-            <?php endforeach ?>
+                <?php foreach ($this->getCcYears() as $k=>$v): ?>
+                    <option value="<?php echo $k ? $k : '' ?>" <?php if($k==$_ccExpYear): ?>selected="selected"<?php endif ?>><?php echo $v ?></option>
+                <?php endforeach ?>
             </select>
         </div>
-    </li>
+    </div>
+
     <?php if($this->hasVerification()): ?>
-    <li>
-        <div class="input-box">
-            <label for="<?php echo $_code ?>_cc_cid"><?php echo __('Card Verification Number') ?> <span class="required">*</span></label><br/>
-            <input type="text" title="<?php echo __('Card Verification Number') ?>" class="required-entry input-text validate-cc-cvn" id="<?php echo $_code ?>_cc_cid" name="payment[cc_cid]" style="width:3em;" value="<?php echo $this->getInfoData('cc_cid')?>"/>
+        <div class="field field-number required">
+            <label class="label" for="<?php echo $_code ?>_cc_cid"><span><?php echo __('Card Verification Number') ?></span></label>
+            <div class="control">
+                <input type="text" title="<?php echo __('Card Verification Number') ?>" class="required-entry input-text validate-cc-cvn" id="<?php echo $_code ?>_cc_cid" name="payment[cc_cid]" style="width:3em;" value="<?php echo $this->getInfoData('cc_cid')?>"/>
+            </div>
         </div>
-    </li>
     <?php endif; ?>
 
     <?php if ($this->hasSsCardType()): ?>
-    <li id="<?php echo $_code ?>_cc_type_ss_div">
-        <ul class="inner-form">
-            <li class="form-alt"><label for="<?php echo $_code ?>_cc_issue" class="required"><em>*</em><?php echo __('Switch/Solo/Maestro Only') ?></label></li>
-            <li>
-                <label for="<?php echo $_code ?>_cc_issue"><?php echo __('Issue Number') ?>:</label>
-                <span class="input-box">
+        <div id="<?php echo $_code ?>_cc_type_ss_div">
+            <div class="field field-type required">
+                <label class="label" for="<?php echo $_code ?>_cc_issue"><span><?php echo __('Switch/Solo/Maestro Only') ?></span></label>
+            </div>
+            <div class="field field-issue">
+                <label class="label" for="<?php echo $_code ?>_cc_issue"><span><?php echo __('Issue Number') ?>:</span></label>
+                <div class="control">
                     <input type="text" title="<?php echo __('Issue Number') ?>" class="input-text validate-cc-ukss cvv" id="<?php echo $_code ?>_cc_issue" name="payment[cc_ss_issue]" value="" />
-                </span>
-            </li>
-
-            <li>
-                <label for="<?php echo $_code ?>_start_month"><?php echo __('Start Date') ?>:</label>
-                <div class="input-box">
-                        <select id="<?php echo $_code ?>_start_month" name="payment[cc_ss_start_month]" class="validate-cc-ukss month">
+                </div>
+            </div>
+            <div class="field field-date">
+                <label class="label" for="<?php echo $_code ?>_start_month"><span><?php echo __('Start Date') ?>:</span></label>
+                <div class="control">
+                    <select id="<?php echo $_code ?>_start_month" name="payment[cc_ss_start_month]" class="validate-cc-ukss month">
                         <?php foreach ($this->getCcMonths() as $k=>$v): ?>
                             <option value="<?php echo $k?$k:'' ?>"<?php if($k==$this->getInfoData('cc_ss_start_month')): ?> selected="selected"<?php endif ?>><?php echo $v ?></option>
                         <?php endforeach ?>
-                        </select>
-                        <select id="<?php echo $_code ?>_start_year" name="payment[cc_ss_start_year]" class="validate-cc-ukss year">
+                    </select>
+                    <select id="<?php echo $_code ?>_start_year" name="payment[cc_ss_start_year]" class="validate-cc-ukss year">
                         <?php foreach ($this->getSsStartYears() as $k=>$v): ?>
                             <option value="<?php echo $k?$k:'' ?>"<?php if($k==$this->getInfoData('cc_ss_start_year')): ?> selected="selected"<?php endif ?>><?php echo $v ?></option>
                         <?php endforeach ?>
-                        </select>
+                    </select>
                 </div>
-            </li>
-            <li class="adv-container">&nbsp;</li>
-        </ul>
-        <script type="text/javascript">
-        //<![CDATA[
-        var SSChecked<?php echo $_code ?> = function() {
-            var elm = $('<?php echo $_code ?>_cc_type');
-            if (['SS','SM','SO'].indexOf(elm.value) != -1) {
-                $('<?php echo $_code ?>_cc_type_ss_div').show();
-            } else {
-                $('<?php echo $_code ?>_cc_type_ss_div').hide();
-            }
-        };
-        Event.observe($('<?php echo $_code ?>_cc_type'), 'change', SSChecked<?php echo $_code ?>);
-        SSChecked<?php echo $_code ?>();
-        //]]>
-        </script>
-    </li>
+            </div>
+
+            <div class="adv-container">&nbsp;</div>
+
+            <script type="text/javascript">
+                //<![CDATA[
+                var SSChecked<?php echo $_code ?> = function() {
+                    var elm = $('<?php echo $_code ?>_cc_type');
+                    if (['SS','SM','SO'].indexOf(elm.value) != -1) {
+                        $('<?php echo $_code ?>_cc_type_ss_div').show();
+                    } else {
+                        $('<?php echo $_code ?>_cc_type_ss_div').hide();
+                    }
+                };
+                Event.observe($('<?php echo $_code ?>_cc_type'), 'change', SSChecked<?php echo $_code ?>);
+                SSChecked<?php echo $_code ?>();
+                //]]>
+            </script>
+        </div>
     <?php endif; ?>
-</ul>
+</fieldset>
diff --git a/app/code/Magento/Payment/view/adminhtml/form/ccsave.phtml b/app/code/Magento/Payment/view/adminhtml/form/ccsave.phtml
index 02ed20f1d74647a73827ca6f82433c88cce8e42e..f6d632f930b6732e2255a1cd30b07906fdac166e 100644
--- a/app/code/Magento/Payment/view/adminhtml/form/ccsave.phtml
+++ b/app/code/Magento/Payment/view/adminhtml/form/ccsave.phtml
@@ -25,98 +25,106 @@
  */
 ?>
 <?php $_code=$this->getMethodCode() ?>
-<ul id="payment_form_<?php echo $_code ?>" style="display:none">
-    <li>
-        <div class="input-box">
-            <label for="<?php echo $_code ?>_cc_owner"><?php echo __('Name on Card') ?> <span class="required">*</span></label><br/>
+<fieldset class="fieldset payment method" id="payment_form_<?php echo $_code ?>" style="display:none">
+    <div class="field field-name required">
+        <label class="label" for="<?php echo $_code ?>_cc_owner"><span><?php echo __('Name on Card') ?></span></label>
+        <div class="control">
             <input type="text" title="<?php echo __('Name on Card') ?>" class="required-entry input-text" id="<?php echo $_code ?>_cc_owner" name="payment[cc_owner]" value="<?php echo $this->getInfoData('cc_owner') ?>"/>
         </div>
-    </li>
-    <li>
-        <div class="input-box">
-            <label for="<?php echo $_code ?>_cc_type"><?php echo __('Credit Card Type') ?> <span class="required">*</span></label><br/>
+    </div>
+
+    <div class="field field-type required">
+        <label class="label" for="<?php echo $_code ?>_cc_type"><span><?php echo __('Credit Card Type') ?></span></label>
+        <div class="control">
             <select id="<?php echo $_code ?>_cc_type" name="payment[cc_type]" class="required-entry validate-cc-type-select">
-            <?php $_ccType = $this->getInfoData('cc_type') ?>
+                <?php $_ccType = $this->getInfoData('cc_type') ?>
                 <option value=""></option>
-            <?php foreach ($this->getCcAvailableTypes() as $_typeCode => $_typeName): ?>
-                <option value="<?php echo $_typeCode ?>" <?php if($_typeCode==$_ccType): ?>selected="selected"<?php endif ?>><?php echo $_typeName ?></option>
-            <?php endforeach ?>
+                <?php foreach ($this->getCcAvailableTypes() as $_typeCode => $_typeName): ?>
+                    <option value="<?php echo $_typeCode ?>" <?php if($_typeCode==$_ccType): ?>selected="selected"<?php endif ?>><?php echo $_typeName ?></option>
+                <?php endforeach ?>
             </select>
         </div>
-    </li>
-    <li>
-        <div class="input-box">
-            <label for="<?php echo $_code ?>_cc_number"><?php echo __('Credit Card Number') ?> <span class="required">*</span></label><br/>
+    </div>
+
+    <div class="field field-number required">
+        <label class="label" for="<?php echo $_code ?>_cc_number"><span><?php echo __('Credit Card Number') ?></span></label>
+        <div class="control">
             <input type="text" id="<?php echo $_code ?>_cc_number" name="payment[cc_number]" title="<?php echo __('Credit Card Number') ?>" class="input-text validate-cc-number" value="<?php echo $this->getInfoData('cc_number')?>"/>
         </div>
-    </li>
-    <li>
-        <div class="input-box">
-            <label for="<?php echo $_code ?>_expiration"><?php echo __('Expiration Date') ?> <span class="required">*</span></label><br/>
+    </div>
+
+    <div class="field field-date required">
+        <label class="label" for="<?php echo $_code ?>_expiration"><span><?php echo __('Expiration Date') ?></span></label>
+        <div class="control">
             <select id="<?php echo $_code ?>_expiration" style="width:140px;" name="payment[cc_exp_month]" class="validate-cc-exp required-entry">
-            <?php $_ccExpMonth = $this->getInfoData('cc_exp_month') ?>
-            <?php foreach ($this->getCcMonths() as $k=>$v): ?>
-                <option value="<?php echo $k ?>" <?php if($k==$_ccExpMonth): ?>selected="selected"<?php endif ?>><?php echo $v ?></option>
-            <?php endforeach ?>
+                <?php $_ccExpMonth = $this->getInfoData('cc_exp_month') ?>
+                <?php foreach ($this->getCcMonths() as $k=>$v): ?>
+                    <option value="<?php echo $k ?>" <?php if($k==$_ccExpMonth): ?>selected="selected"<?php endif ?>><?php echo $v ?></option>
+                <?php endforeach ?>
             </select>
             <?php $_ccExpYear = $this->getInfoData('cc_exp_year') ?>
             <select id="<?php echo $_code ?>_expiration_yr" style="width:103px;" name="payment[cc_exp_year]" class="required-entry">
-            <?php foreach ($this->getCcYears() as $k=>$v): ?>
-                <option value="<?php echo $k ? $k : '' ?>" <?php if($k==$_ccExpYear): ?>selected="selected"<?php endif ?>><?php echo $v ?></option>
-            <?php endforeach ?>
+                <?php foreach ($this->getCcYears() as $k=>$v): ?>
+                    <option value="<?php echo $k ? $k : '' ?>" <?php if($k==$_ccExpYear): ?>selected="selected"<?php endif ?>><?php echo $v ?></option>
+                <?php endforeach ?>
             </select>
         </div>
-    </li>
+    </div>
+
     <?php if($this->hasVerification()): ?>
-    <li>
-        <div class="input-box">
-            <label for="<?php echo $_code ?>_cc_cid"><?php echo __('Card Verification Number') ?> <span class="required">*</span></label><br/>
-            <input type="text" title="<?php echo __('Card Verification Number') ?>" class="required-entry input-text validate-cc-cvn" id="<?php echo $_code ?>_cc_cid" name="payment[cc_cid]" style="width:3em;" value="<?php echo $this->getInfoData('cc_cid')?>"/>
+        <div class="field field-number required">
+            <label class="label" for="<?php echo $_code ?>_cc_cid"><span><?php echo __('Card Verification Number') ?></span></label>
+            <div class="control">
+                <input type="text" title="<?php echo __('Card Verification Number') ?>" class="required-entry input-text validate-cc-cvn" id="<?php echo $_code ?>_cc_cid" name="payment[cc_cid]" style="width:3em;" value="<?php echo $this->getInfoData('cc_cid')?>"/>
+            </div>
         </div>
-    </li>
     <?php endif; ?>
+
     <?php if ($this->hasSsCardType()): ?>
-    <li id="<?php echo $_code ?>_cc_type_ss_div">
-        <ul class="inner-form">
-            <li class="form-alt"><label for="<?php echo $_code ?>_cc_issue" class="required"><em>*</em><?php echo __('Switch/Solo/Maestro Only') ?></label></li>
-            <li>
-                <label for="<?php echo $_code ?>_cc_issue"><?php echo __('Issue Number') ?>:</label>
-                <span class="input-box">
+        <div id="<?php echo $_code ?>_cc_type_ss_div">
+            <div class="field field-type required">
+                <label for="<?php echo $_code ?>_cc_issue"><span><?php echo __('Switch/Solo/Maestro Only') ?></span></label>
+            </div>
+
+            <div class="field field-issue">
+                <label class="label" for="<?php echo $_code ?>_cc_issue"><span><?php echo __('Issue Number') ?>:</span></label>
+                <div class="control">
                     <input type="text" title="<?php echo __('Issue Number') ?>" class="input-text validate-cc-ukss cvv" id="<?php echo $_code ?>_cc_issue" name="payment[cc_ss_issue]" value="" />
-                </span>
-            </li>
+                </div>
+            </div>
 
-            <li>
-                <label for="<?php echo $_code ?>_start_month"><?php echo __('Start Date') ?>:</label>
-                <div class="input-box">
-                        <select id="<?php echo $_code ?>_start_month" name="payment[cc_ss_start_month]" class="validate-cc-ukss month">
+            <div class="field field-date">
+                <label class="label" for="<?php echo $_code ?>_start_month"><span><?php echo __('Start Date') ?>:</span></label>
+                <div class="control">
+                    <select id="<?php echo $_code ?>_start_month" name="payment[cc_ss_start_month]" class="validate-cc-ukss month">
                         <?php foreach ($this->getCcMonths() as $k=>$v): ?>
                             <option value="<?php echo $k?$k:'' ?>"<?php if($k==$this->getInfoData('cc_ss_start_month')): ?> selected="selected"<?php endif ?>><?php echo $v ?></option>
                         <?php endforeach ?>
-                        </select>
-                        <select id="<?php echo $_code ?>_start_year" name="payment[cc_ss_start_year]" class="validate-cc-ukss year">
+                    </select>
+                    <select id="<?php echo $_code ?>_start_year" name="payment[cc_ss_start_year]" class="validate-cc-ukss year">
                         <?php foreach ($this->getSsStartYears() as $k=>$v): ?>
                             <option value="<?php echo $k?$k:'' ?>"<?php if($k==$this->getInfoData('cc_ss_start_year')): ?> selected="selected"<?php endif ?>><?php echo $v ?></option>
                         <?php endforeach ?>
-                        </select>
+                    </select>
                 </div>
-            </li>
-            <li class="adv-container">&nbsp;</li>
-        </ul>
-        <script type="text/javascript">
-        //<![CDATA[
-        var SSChecked<?php echo $_code ?> = function() {
-            var elm = $('<?php echo $_code ?>_cc_type');
-            if (['SS','SM','SO'].indexOf(elm.value) != -1) {
-                $('<?php echo $_code ?>_cc_type_ss_div').show();
-            } else {
-                $('<?php echo $_code ?>_cc_type_ss_div').hide();
-            }
-        };
-        Event.observe($('<?php echo $_code ?>_cc_type'), 'change', SSChecked<?php echo $_code ?>);
-        SSChecked<?php echo $_code ?>();
-        //]]>
-        </script>
-    </li>
+            </div>
+
+            <div class="adv-container">&nbsp;</div>
+
+            <script type="text/javascript">
+                //<![CDATA[
+                var SSChecked<?php echo $_code ?> = function() {
+                    var elm = $('<?php echo $_code ?>_cc_type');
+                    if (['SS','SM','SO'].indexOf(elm.value) != -1) {
+                        $('<?php echo $_code ?>_cc_type_ss_div').show();
+                    } else {
+                        $('<?php echo $_code ?>_cc_type_ss_div').hide();
+                    }
+                };
+                Event.observe($('<?php echo $_code ?>_cc_type'), 'change', SSChecked<?php echo $_code ?>);
+                SSChecked<?php echo $_code ?>();
+                //]]>
+            </script>
+        </div>
     <?php endif; ?>
-</ul>
+</fieldset>
diff --git a/app/code/Magento/Payment/view/adminhtml/form/checkmo.phtml b/app/code/Magento/Payment/view/adminhtml/form/checkmo.phtml
index e4d1417abdf5567822f0e6a0ae62a78bda38d637..9f5d0cc4517fd21b32069b878a63993158381ab1 100644
--- a/app/code/Magento/Payment/view/adminhtml/form/checkmo.phtml
+++ b/app/code/Magento/Payment/view/adminhtml/form/checkmo.phtml
@@ -24,18 +24,16 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 ?>
-<ul id="payment_form_<?php echo $this->getMethodCode() ?>" style="display:none">
-    <li>
-        <div class="input-box">
-            <?php if ($this->getMethod()->getPayableTo()): ?>
-                <?php echo __('<label>Make Check payable to:</label> %1', $this->escapeHtml($this->getMethod()->getPayableTo())) ?><br />
-            <?php endif; ?>
-            <?php if ($this->getMethod()->getMailingAddress()): ?>
-                <label><?php echo __('Send Check to:') ?></label>
-                <div class="checkmo-mailing-address">
-                    <?php echo nl2br($this->escapeHtml($this->getMethod()->getMailingAddress())) ?>
-                </div>
-            <?php endif; ?>
+<fieldset class="fieldset payment method" id="payment_form_<?php echo $this->getMethodCode() ?>" style="display:none">
+    <?php if ($this->getMethod()->getPayableTo()): ?>
+        <?php echo __('<label class="label"><span>Make Check payable to:</span></label> %1', $this->escapeHtml($this->getMethod()->getPayableTo())) ?>
+    <?php endif; ?>
+    <?php if ($this->getMethod()->getMailingAddress()): ?>
+        <div class="field field-check">
+            <label class="label"><span><?php echo __('Send Check to:') ?></span></label>
+            <div class="control checkmo-mailing-address">
+                <?php echo nl2br($this->escapeHtml($this->getMethod()->getMailingAddress())) ?>
+            </div>
         </div>
-    </li>
-</ul>
+    <?php endif; ?>
+</fieldset>
diff --git a/app/code/Magento/Payment/view/adminhtml/form/purchaseorder.phtml b/app/code/Magento/Payment/view/adminhtml/form/purchaseorder.phtml
index 907cff225fd257e716f8add2b328c3fca38e942f..51675035d87ff5b3e7b5a80205890da6b3f61cc0 100644
--- a/app/code/Magento/Payment/view/adminhtml/form/purchaseorder.phtml
+++ b/app/code/Magento/Payment/view/adminhtml/form/purchaseorder.phtml
@@ -24,11 +24,11 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 ?>
-<ul id="payment_form_<?php echo $this->getMethodCode() ?>" style="display:none">
-    <li>
-        <div class="input-box">
-            <label for="po_number"><?php echo __('Purchase Order Number') ?> <span class="required">*</span></label><br/>
+<fieldset class="fieldset payment method" id="payment_form_<?php echo $this->getMethodCode() ?>" style="display:none">
+    <div class="field field-number required">
+        <label for="po_number" class="label"><span><?php echo __('Purchase Order Number') ?></span></label>
+        <div class="control">
             <input type="text" id="po_number" name="payment[po_number]" title="<?php echo __("Purchase Order Number") ?>" class="required-entry input-text" value="<?php echo $this->getInfoData('po_number') ?>"/>
         </div>
-    </li>
-</ul>
+    </div>
+</fieldset>
\ No newline at end of file
diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Index.php b/app/code/Magento/Reports/Controller/Adminhtml/Index.php
index 3b320b9e8ee6c7254540d13aa45a3d84bcd71a6b..bfe3bf7a9bccf34693ce194729b7d9098b9ee215 100644
--- a/app/code/Magento/Reports/Controller/Adminhtml/Index.php
+++ b/app/code/Magento/Reports/Controller/Adminhtml/Index.php
@@ -79,7 +79,7 @@ class Index extends \Magento\Backend\App\Action
     {
         $this->_view->loadLayout(false);
         $content = $this->_view->getLayout()->getChildBlock('adminhtml.report.search.grid', 'grid.export');
-        return $this->_fileFactory->create('search.csv', $content->getCsvFile());
+        return $this->_fileFactory->create('search.csv', $content->getCsvFile(), \Magento\Filesystem::VAR_DIR);
     }
 
     /**
@@ -89,7 +89,7 @@ class Index extends \Magento\Backend\App\Action
     {
         $this->_view->loadLayout(false);
         $content = $this->_view->getLayout()->getChildBlock('adminhtml.report.search.grid', 'grid.export');
-        return $this->_fileFactory->create('search.xml', $content->getExcelFile());
+        return $this->_fileFactory->create('search.xml', $content->getExcelFile(), \Magento\Filesystem::VAR_DIR);
     }
 
     protected function _isAllowed()
diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer.php
index 0edf0e421c85756815ac0d65962bcfc581677e1b..84a840000f8947647c595bc60d8d9875735b2de0 100644
--- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer.php
+++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Customer.php
@@ -94,7 +94,7 @@ class Customer extends \Magento\Backend\App\Action
         $fileName = 'new_accounts.csv';
         /** @var \Magento\Backend\Block\Widget\Grid\ExportInterface $exportBlock  */
         $exportBlock = $this->_view->getLayout()->getChildBlock('adminhtml.report.grid', 'grid.export');
-        return $this->_fileFactory->create($fileName, $exportBlock->getCsvFile());
+        return $this->_fileFactory->create($fileName, $exportBlock->getCsvFile(), \Magento\Filesystem::VAR_DIR);
     }
 
     /**
@@ -106,7 +106,11 @@ class Customer extends \Magento\Backend\App\Action
         $fileName = 'new_accounts.xml';
         /** @var \Magento\Backend\Block\Widget\Grid\ExportInterface $exportBlock  */
         $exportBlock = $this->_view->getLayout()->getChildBlock('adminhtml.report.grid', 'grid.export');
-        return $this->_fileFactory->create($fileName, $exportBlock->getExcelFile($fileName));
+        return $this->_fileFactory->create(
+            $fileName,
+            $exportBlock->getExcelFile($fileName),
+            \Magento\Filesystem::VAR_DIR
+        );
     }
 
     public function ordersAction()
diff --git a/app/code/Magento/Reports/Controller/Adminhtml/Report/Review.php b/app/code/Magento/Reports/Controller/Adminhtml/Report/Review.php
index 6ef34439d8cc919986c4c4efc2df7ef0cf2d41d4..91d9307fed24da63d85092cd84ad97cc71cdece6 100644
--- a/app/code/Magento/Reports/Controller/Adminhtml/Report/Review.php
+++ b/app/code/Magento/Reports/Controller/Adminhtml/Report/Review.php
@@ -86,8 +86,10 @@ class Review extends \Magento\Backend\App\Action
     {
         $this->_view->loadLayout(false);
         $fileName = 'review_customer.csv';
-        $exportBlock = $this->_view->getLayout()->getChildBlock('adminhtml.block.report.review.customer.grid','grid.export');
-        return $this->_fileFactory->create($fileName, $exportBlock->getCsvFile());
+        $exportBlock = $this->_view
+            ->getLayout()
+            ->getChildBlock('adminhtml.block.report.review.customer.grid', 'grid.export');
+        return $this->_fileFactory->create($fileName, $exportBlock->getCsvFile(), \Magento\Filesystem::VAR_DIR);
     }
 
     /**
@@ -97,8 +99,10 @@ class Review extends \Magento\Backend\App\Action
     {
         $this->_view->loadLayout(false);
         $fileName = 'review_customer.xml';
-        $exportBlock = $this->_view->getLayout()->getChildBlock('adminhtml.block.report.review.customer.grid','grid.export');
-        return $this->_fileFactory->create($fileName, $exportBlock->getExcelFile());
+        $exportBlock = $this->_view
+            ->getLayout()
+            ->getChildBlock('adminhtml.block.report.review.customer.grid', 'grid.export');
+        return $this->_fileFactory->create($fileName, $exportBlock->getExcelFile(), \Magento\Filesystem::VAR_DIR);
 
     }
 
@@ -109,9 +113,9 @@ class Review extends \Magento\Backend\App\Action
         $this->_initAction()
             ->_setActiveMenu('Magento_Review::report_review_product')
             ->_addBreadcrumb(
-            __('Products Report'),
-            __('Products Report')
-        );
+                __('Products Report'),
+                __('Products Report')
+            );
             $this->_view->renderLayout();
     }
 
@@ -122,8 +126,10 @@ class Review extends \Magento\Backend\App\Action
     {
         $this->_view->loadLayout(false);
         $fileName = 'review_product.csv';
-        $exportBlock = $this->_view->getLayout()->getChildBlock('adminhtml.block.report.review.product.grid','grid.export');
-        return $this->_fileFactory->create($fileName, $exportBlock->getCsvFile());
+        $exportBlock = $this->_view
+            ->getLayout()
+            ->getChildBlock('adminhtml.block.report.review.product.grid', 'grid.export');
+        return $this->_fileFactory->create($fileName, $exportBlock->getCsvFile(), \Magento\Filesystem::VAR_DIR);
     }
 
     /**
@@ -133,8 +139,10 @@ class Review extends \Magento\Backend\App\Action
     {
         $this->_view->loadLayout(false);
         $fileName = 'review_product.xml';
-        $exportBlock = $this->_view->getLayout()->getChildBlock('adminhtml.block.report.review.product.grid','grid.export');
-        return $this->_fileFactory->create($fileName, $exportBlock->getExcelFile());
+        $exportBlock = $this->_view
+            ->getLayout()
+            ->getChildBlock('adminhtml.block.report.review.product.grid', 'grid.export');
+        return $this->_fileFactory->create($fileName, $exportBlock->getExcelFile(), \Magento\Filesystem::VAR_DIR);
     }
 
     public function productDetailAction()
@@ -160,7 +168,7 @@ class Review extends \Magento\Backend\App\Action
         $content    = $this->_view->getLayout()->createBlock('Magento\Reports\Block\Adminhtml\Review\Detail\Grid')
             ->getCsv();
 
-        return $this->_fileFactory->create($fileName, $content);
+        return $this->_fileFactory->create($fileName, $content, \Magento\Filesystem::VAR_DIR);
     }
 
     /**
@@ -172,7 +180,7 @@ class Review extends \Magento\Backend\App\Action
         $content    = $this->_view->getLayout()->createBlock('Magento\Reports\Block\Adminhtml\Review\Detail\Grid')
             ->getExcel($fileName);
 
-        return $this->_fileFactory->create($fileName, $content);
+        return $this->_fileFactory->create($fileName, $content, \Magento\Filesystem::VAR_DIR);
     }
 
     protected function _isAllowed()
diff --git a/app/code/Magento/Reports/Model/Resource/Report/Collection/AbstractCollection.php b/app/code/Magento/Reports/Model/Resource/Report/Collection/AbstractCollection.php
index 9ebf45ed5554175db9463cda31f91356518d6d6b..be5030fb15657a2757fa579ebd557862afd675c1 100644
--- a/app/code/Magento/Reports/Model/Resource/Report/Collection/AbstractCollection.php
+++ b/app/code/Magento/Reports/Model/Resource/Report/Collection/AbstractCollection.php
@@ -185,8 +185,6 @@ class AbstractCollection extends \Magento\Core\Model\Resource\Db\Collection\Abst
             $nullCheck = true;
         }
 
-        $storeIds[0] = ($storeIds[0] == '') ? 0 : $storeIds[0];
-
         if ($nullCheck) {
             $select->where('store_id IN(?) OR store_id IS NULL', $storeIds);
         } else {
diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo.php b/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo.php
index 18092ade67288aa7604a1b2c624c3e739dcef46c..9b703cfebe4409c166b937f87e6b85d4e679c80f 100644
--- a/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo.php
+++ b/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo.php
@@ -124,11 +124,16 @@ class AbstractCreditmemo extends \Magento\Backend\App\Action
                 $pdf = $this->_objectManager->create('Magento\Sales\Model\Order\Pdf\Creditmemo')->getPdf($invoices);
             } else {
                 $pages = $this->_objectManager->create('Magento\Sales\Model\Order\Pdf\Creditmemo')->getPdf($invoices);
-                $pdf->pages = array_merge ($pdf->pages, $pages->pages);
+                $pdf->pages = array_merge($pdf->pages, $pages->pages);
             }
             $date = $this->_objectManager->get('Magento\Core\Model\Date')->date('Y-m-d_H-i-s');
 
-            return $this->_fileFactory->create('creditmemo' . $date . '.pdf', $pdf->render(), 'application/pdf');
+            return $this->_fileFactory->create(
+                'creditmemo' . $date . '.pdf',
+                $pdf->render(),
+                \Magento\Filesystem::VAR_DIR,
+                'application/pdf'
+            );
         }
         $this->_redirect('sales/*/');
     }
@@ -143,7 +148,12 @@ class AbstractCreditmemo extends \Magento\Backend\App\Action
                 $pdf = $this->_objectManager->create('Magento\Sales\Model\Order\Pdf\Creditmemo')
                     ->getPdf(array($creditmemo));
                 $date = $this->_objectManager->get('Magento\Core\Model\Date')->date('Y-m-d_H-i-s');
-                return $this->_fileFactory->create('creditmemo' . $date . '.pdf', $pdf->render(), 'application/pdf');
+                return $this->_fileFactory->create(
+                    'creditmemo' . $date . '.pdf',
+                    $pdf->render(),
+                    \Magento\Filesystem::VAR_DIR,
+                    'application/pdf'
+                );
             }
         } else {
             $this->_forward('noroute');
diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice.php b/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice.php
index ff57034fb879fd92092d7ae1807f1bb0c44150ba..282aa1dc44e03e1d2d0145b3fd454b909fbfe695 100644
--- a/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice.php
+++ b/app/code/Magento/Sales/Controller/Adminhtml/Invoice/AbstractInvoice.php
@@ -130,7 +130,12 @@ class AbstractInvoice
             if ($invoice) {
                 $pdf = $this->_objectManager->create('Magento\Sales\Model\Order\Pdf\Invoice')->getPdf(array($invoice));
                 $date = $this->_objectManager->get('Magento\Core\Model\Date')->date('Y-m-d_H-i-s');
-                return $this->_fileFactory->create('invoice' . $date . '.pdf', $pdf->render(), 'application/pdf');
+                return $this->_fileFactory->create(
+                    'invoice' . $date . '.pdf',
+                    $pdf->render(),
+                    \Magento\Filesystem::VAR_DIR,
+                    'application/pdf'
+                );
             }
         } else {
             $this->_forward('noroute');
@@ -153,7 +158,12 @@ class AbstractInvoice
             }
             $date = $this->_objectManager->get('Magento\Core\Model\Date')->date('Y-m-d_H-i-s');
 
-            return $this->_fileFactory->create('invoice' . $date . '.pdf', $pdf->render(), 'application/pdf');
+            return $this->_fileFactory->create(
+                'invoice' . $date . '.pdf',
+                $pdf->render(),
+                \Magento\Filesystem::VAR_DIR,
+                'application/pdf'
+            );
         }
         $this->_redirect('sales/*/');
     }
diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order.php b/app/code/Magento/Sales/Controller/Adminhtml/Order.php
index d1849e99f048c6344103576d162517d3e707b712..e580e81b29eaa239b68cdc0406086cf86edbbb9c 100644
--- a/app/code/Magento/Sales/Controller/Adminhtml/Order.php
+++ b/app/code/Magento/Sales/Controller/Adminhtml/Order.php
@@ -62,7 +62,7 @@ class Order extends \Magento\Backend\App\Action
     protected $_translator;
 
     /**
-     * @param \Magento\Backend\App\Action\Context $context
+     * @param Action\Context $context
      * @param \Magento\Core\Model\Registry $coreRegistry
      * @param \Magento\App\Response\Http\FileFactory $fileFactory
      * @param \Magento\Core\Model\Translate $translator
@@ -529,6 +529,7 @@ class Order extends \Magento\Backend\App\Action
                 return $this->_fileFactory->create(
                     'invoice' . $this->_objectManager->get('Magento\Core\Model\Date')->date('Y-m-d_H-i-s') . '.pdf',
                     $pdf->render(),
+                    \Magento\Filesystem::VAR_DIR,
                     'application/pdf'
                 );
             } else {
@@ -567,6 +568,7 @@ class Order extends \Magento\Backend\App\Action
                 return $this->_fileFactory->create(
                     'packingslip' . $this->_objectManager->get('Magento\Core\Model\Date')->date('Y-m-d_H-i-s') . '.pdf',
                     $pdf->render(),
+                    \Magento\Filesystem::VAR_DIR,
                     'application/pdf'
                 );
             } else {
@@ -605,6 +607,7 @@ class Order extends \Magento\Backend\App\Action
                 return $this->_fileFactory->create(
                     'creditmemo' . $this->_objectManager->get('Magento\Core\Model\Date')->date('Y-m-d_H-i-s') . '.pdf',
                     $pdf->render(),
+                    \Magento\Filesystem::VAR_DIR,
                     'application/pdf'
                 );
             } else {
@@ -669,6 +672,7 @@ class Order extends \Magento\Backend\App\Action
                 return $this->_fileFactory->create(
                     'docs' . $this->_objectManager->get('Magento\Core\Model\Date')->date('Y-m-d_H-i-s') . '.pdf',
                     $pdf->render(),
+                    \Magento\Filesystem::VAR_DIR,
                     'application/pdf'
                 );
             } else {
@@ -757,7 +761,7 @@ class Order extends \Magento\Backend\App\Action
         $fileName = 'orders.csv';
         /** @var \Magento\Backend\Block\Widget\Grid\ExportInterface $exportBlock  */
         $exportBlock = $this->_view->getLayout()->getChildBlock('sales.order.grid', 'grid.export');
-        return $this->_fileFactory->create($fileName, $exportBlock->getCsvFile());
+        return $this->_fileFactory->create($fileName, $exportBlock->getCsvFile(), \Magento\Filesystem::VAR_DIR);
     }
 
     /**
@@ -769,7 +773,11 @@ class Order extends \Magento\Backend\App\Action
         $fileName = 'orders.xml';
         /** @var \Magento\Backend\Block\Widget\Grid\ExportInterface $exportBlock  */
         $exportBlock = $this->_view->getLayout()->getChildBlock('sales.order.grid', 'grid.export');
-        return $this->_fileFactory->create($fileName, $exportBlock->getExcelFile($fileName));
+        return $this->_fileFactory->create(
+            $fileName,
+            $exportBlock->getExcelFile($fileName),
+            \Magento\Filesystem::VAR_DIR
+        );
     }
 
     /**
diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Shipment.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Shipment.php
index 5514f6a2ef7a0b0c07ff9ab802072824ed75842a..051f034840df5e2e4dea29257cb9a76406706818 100644
--- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Shipment.php
+++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Shipment.php
@@ -584,6 +584,7 @@ class Shipment extends \Magento\Sales\Controller\Adminhtml\Shipment\AbstractShip
                 return $this->_fileFactory->create(
                     'ShippingLabel(' . $shipment->getIncrementId() . ').pdf',
                     $pdfContent,
+                    \Magento\Filesystem::VAR_DIR,
                     'application/pdf'
                 );
             }
@@ -612,6 +613,7 @@ class Shipment extends \Magento\Sales\Controller\Adminhtml\Shipment\AbstractShip
             return $this->_fileFactory->create(
                 'packingslip' . $this->_objectManager->get('Magento\Core\Model\Date')->date('Y-m-d_H-i-s') . '.pdf',
                 $pdf->render(),
+                \Magento\Filesystem::VAR_DIR,
                 'application/pdf'
             );
         } else {
@@ -662,7 +664,12 @@ class Shipment extends \Magento\Sales\Controller\Adminhtml\Shipment\AbstractShip
 
         if (!empty($labelsContent)) {
             $outputPdf = $this->_combineLabelsPdf($labelsContent);
-            return $this->_fileFactory->create('ShippingLabels.pdf', $outputPdf->render(), 'application/pdf');
+            return $this->_fileFactory->create(
+                'ShippingLabels.pdf',
+                $outputPdf->render(),
+                \Magento\Filesystem::VAR_DIR,
+                'application/pdf'
+            );
         }
 
         if ($createdFromOrders) {
diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Shipment/AbstractShipment.php b/app/code/Magento/Sales/Controller/Adminhtml/Shipment/AbstractShipment.php
index c30f0fecdc1c2fa570f2138967ad936d1cff8cf2..15456ce7a7eaa4d28a3cfe8775a27122c53d41da 100644
--- a/app/code/Magento/Sales/Controller/Adminhtml/Shipment/AbstractShipment.php
+++ b/app/code/Magento/Sales/Controller/Adminhtml/Shipment/AbstractShipment.php
@@ -99,10 +99,15 @@ class AbstractShipment extends \Magento\Backend\App\Action
                 $pdf = $this->_objectManager->create('Magento\Sales\Model\Order\Pdf\Shipment')->getPdf($shipments);
             } else {
                 $pages = $this->_objectManager->create('Magento\Sales\Model\Order\Pdf\Shipment')->getPdf($shipments);
-                $pdf->pages = array_merge ($pdf->pages, $pages->pages);
+                $pdf->pages = array_merge($pdf->pages, $pages->pages);
             }
             $date = $this->_objectManager->get('Magento\Core\Model\Date')->date('Y-m-d_H-i-s');
-            return $this->_fileFactory->create('packingslip' . $date . '.pdf', $pdf->render(), 'application/pdf');
+            return $this->_fileFactory->create(
+                'packingslip' . $date . '.pdf',
+                $pdf->render(),
+                \Magento\Filesystem::VAR_DIR,
+                'application/pdf'
+            );
         }
         $this->_redirect('sales/*/');
     }
@@ -118,7 +123,10 @@ class AbstractShipment extends \Magento\Backend\App\Action
                     ->getPdf(array($shipment));
                 $date = $this->_objectManager->get('Magento\Core\Model\Date')->date('Y-m-d_H-i-s');
                 return $this->_fileFactory->create(
-                    'packingslip' . $date . '.pdf', $pdf->render(), 'application/pdf'
+                    'packingslip' . $date . '.pdf',
+                    $pdf->render(),
+                    \Magento\Filesystem::VAR_DIR,
+                    'application/pdf'
                 );
             }
         } else {
diff --git a/app/code/Magento/Sales/Controller/Download.php b/app/code/Magento/Sales/Controller/Download.php
index 9753e8f62a77d7bd25c47bafffe77df3d4005bc6..14c38e37d5fc5facfa7b0729a6c3ac8271f45fd2 100644
--- a/app/code/Magento/Sales/Controller/Download.php
+++ b/app/code/Magento/Sales/Controller/Download.php
@@ -93,10 +93,14 @@ class Download extends \Magento\App\Action\Action
                     throw new \Exception();
                 }
             }
-            $this->_fileResponseFactory->create($info['title'], array(
-               'value' => $filePath,
-               'type'  => 'filename'
-            ));
+            $this->_fileResponseFactory->create(
+                $info['title'],
+                array(
+                    'value' => $filePath,
+                    'type'  => 'filename'
+                ),
+                \Magento\Filesystem::ROOT
+            );
         } catch (\Exception $e) {
             $this->_forward('noroute');
         }
diff --git a/app/code/Magento/Sales/view/adminhtml/order/creditmemo/create/form.phtml b/app/code/Magento/Sales/view/adminhtml/order/creditmemo/create/form.phtml
index d55a002445a2a3f460a2ab23e3105a7b508f30b3..10a7347f03ff5805aeda481961cfd3d4734a7677 100644
--- a/app/code/Magento/Sales/view/adminhtml/order/creditmemo/create/form.phtml
+++ b/app/code/Magento/Sales/view/adminhtml/order/creditmemo/create/form.phtml
@@ -27,13 +27,19 @@
 <form id="edit_form" method="post" action="<?php echo $this->getSaveUrl() ?>">
     <?php echo $this->getBlockHtml('formkey')?>
     <?php  $_order = $this->getCreditmemo()->getOrder() ?>
+
     <?php echo $this->getChildHtml('order_info') ?>
+
+    <?php if (!$_order->getIsVirtual()): ?>
     <div class="clearfix">
+    <?php endif; ?>
+
         <?php if (!$_order->getIsVirtual()): ?>
         <div class="order-payment-method">
         <?php else: ?>
         <div class="order-payment-method order-payment-method-virtual">
         <?php endif; ?>
+
             <?php /* Billing Address */ ?>
             <div class="fieldset-wrapper">
                 <div class="fieldset-wrapper-title">
@@ -46,7 +52,9 @@
                 <label for="creditmemo_do_refund" class="normal"><?php echo __('Refund Amount') ?></label>
                 <?php endif;*/ ?>
             </div>
+
         </div>
+
         <?php if (!$_order->getIsVirtual()): ?>
         <div class="order-shipping-address">
             <?php /* Shipping Address */ ?>
@@ -75,9 +83,10 @@
             </div>
         </div>
         <?php endif; ?>
-    </div>
+
+    </div><?php /* opening div can be in app\code\Magento\Sales\view\adminhtml\order\view\info.phtml or above */?>
 
     <div id="creditmemo_item_container">
-      <?php echo $this->getChildHtml('order_items') ?>
+        <?php echo $this->getChildHtml('order_items') ?>
     </div>
 </form>
diff --git a/app/code/Magento/Sales/view/adminhtml/order/creditmemo/create/items.phtml b/app/code/Magento/Sales/view/adminhtml/order/creditmemo/create/items.phtml
index c3f9ed7e23c769fccd411e440c0481b4485933e7..784a7669f9b53621d11999f910ed4d8fc3098cd4 100644
--- a/app/code/Magento/Sales/view/adminhtml/order/creditmemo/create/items.phtml
+++ b/app/code/Magento/Sales/view/adminhtml/order/creditmemo/create/items.phtml
@@ -25,10 +25,12 @@
  */
 ?>
 <?php $_items = $this->getCreditmemo()->getAllItems() ?>
+
 <div class="fieldset-wrapper">
     <div class="fieldset-wrapper-title">
         <span class="title"><?php echo __('Items to Refund') ?></span>
     </div>
+
     <?php if (count($_items)) : ?>
     <div class="grid">
         <table cellspacing="0" class="data order-tables">
@@ -67,16 +69,21 @@
             <?php endforeach; ?>
         </table>
     </div>
-
     <?php else : ?>
     <div class="no-items">
         <?php echo __('No Items To Refund') ?>
     </div>
-<?php endif; ?>
+    <?php endif; ?>
 </div>
+
+<?php $orderTotalBar = $this->getChildHtml('order_totalbar'); ?>
+
+<?php if (!empty($orderTotalBar)): ?>
 <div class="fieldset-wrapper">
-    <?php echo $this->getChildHtml('order_totalbar') ?>
+    <?php echo $orderTotalBar; ?>
 </div>
+<?php endif; ?>
+
 <div class="clearfix">
     <input type="hidden" name="creditmemo[do_offline]" id="creditmemo_do_offline" value="0" />
     <div class="order-comments-history">
diff --git a/app/code/Magento/Sales/view/adminhtml/order/invoice/create/items.phtml b/app/code/Magento/Sales/view/adminhtml/order/invoice/create/items.phtml
index cce963b9c96aeca35d4c9b9ca3c8462a1adbf568..925d811bc5dd918641ee1da4dcb65b9bf74853c6 100644
--- a/app/code/Magento/Sales/view/adminhtml/order/invoice/create/items.phtml
+++ b/app/code/Magento/Sales/view/adminhtml/order/invoice/create/items.phtml
@@ -24,6 +24,7 @@
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
 ?>
+
 <div class="fieldset-wrapper">
     <div class="fieldset-wrapper-title">
         <?php $_itemsGridLabel = $this->getForcedShipmentCreate()?'Items to Invoice and Ship':'Items to Invoice'; ?>
@@ -63,9 +64,15 @@
         </table>
     </div>
 </div>
+
+<?php $orderTotalBar = $this->getChildHtml('order_totalbar'); ?>
+
+<?php if (!empty($orderTotalBar)): ?>
 <div class="fieldset-wrapper">
-    <?php echo $this->getChildHtml('order_totalbar') ?>
+    <?php echo $orderTotalBar; ?>
 </div>
+<?php endif; ?>
+
 <div class="clearfix">
     <div class="order-comments-history">
         <div class="fieldset-wrapper">
@@ -78,6 +85,7 @@
             </div>
         </div>
     </div>
+
     <div class="order-totals">
         <div class="fieldset-wrapper" id="invoice_totals">
             <div class="fieldset-wrapper-title">
diff --git a/app/code/Magento/Sales/view/adminhtml/order/view/info.phtml b/app/code/Magento/Sales/view/adminhtml/order/view/info.phtml
index 17e539db5d18f9e69a2b5158180f566a450f6a92..68cafe39a1500232199ec6b6e13d2c69530daefc 100644
--- a/app/code/Magento/Sales/view/adminhtml/order/view/info.phtml
+++ b/app/code/Magento/Sales/view/adminhtml/order/view/info.phtml
@@ -183,4 +183,11 @@ $orderStoreDate = $this->formatDate($_order->getCreatedAtStoreDate(), 'medium',
 </div>
     <?php endif; ?>
 
-<?php /* closing div of this opening div are in app\code\Magento\Sales\view\adminhtml\order\invoice\view\form.phtml */?>
+<?php
+/*
+    closing div of this opening div are in
+    app\code\Magento\Sales\view\adminhtml\order\invoice\view\form.phtml
+    or
+    app\code\Magento\Sales\view\adminhtml\order\view\tab\info.phtml
+*/
+?>
\ No newline at end of file
diff --git a/app/code/Magento/Sales/view/adminhtml/order/view/tab/info.phtml b/app/code/Magento/Sales/view/adminhtml/order/view/tab/info.phtml
index 3cee82a4fee82e7c8e45e27e5d064f687aef1b90..d602315e91b7c3308fc74c9b16872ef48bab9591 100644
--- a/app/code/Magento/Sales/view/adminhtml/order/view/tab/info.phtml
+++ b/app/code/Magento/Sales/view/adminhtml/order/view/tab/info.phtml
@@ -26,14 +26,18 @@
 ?>
 <?php /** @var $this \Magento\Sales\Block\Adminhtml\Order\View\Tab\Info */ ?>
 <?php $_order = $this->getOrder() ?>
+
 <div id="order-messages">
-        <?php echo $this->getChildHtml('order_messages') ?>
-    </div>
-    <?php echo $this->getChildHtml('order_info') ?>
-    <input type="hidden" name="order_id" value="<?php echo $_order->getId() ?>"/>
+    <?php echo $this->getChildHtml('order_messages') ?>
+</div>
+
+<?php echo $this->getChildHtml('order_info') ?>
+<input type="hidden" name="order_id" value="<?php echo $_order->getId() ?>"/>
+
 <?php if (!$_order->getIsVirtual()): ?>
 <div class="clearfix">
 <?php endif; ?>
+
     <div class="order-payment-method<?php if ($_order->getIsVirtual()): ?> order-payment-method-virtual<?php endif; ?>">
         <?php /* Payment Method */ ?>
         <div class="fieldset-wrapper">
@@ -44,6 +48,11 @@
             <div class="order-payment-currency"><?php echo __('The order was placed using %1.', $_order->getOrderCurrencyCode()) ?></div>
         </div>
     </div>
+
+<?php if ($_order->getIsVirtual()): ?>
+</div><?php /* opening div is in app\code\Magento\Sales\view\adminhtml\order\view\info.phtml */ ?>
+<?php endif; ?>
+
     <?php if (!$_order->getIsVirtual()): ?>
     <div class="order-shipping-method">
         <!--Shipping Method-->
@@ -76,16 +85,20 @@
         </div>
     </div>
     <?php endif; ?>
+
 <?php if (!$_order->getIsVirtual()): ?>
 </div>
 <?php endif; ?>
-    <?php echo $this->getGiftOptionsHtml() ?>
-    <div class="fieldset-wrapper">
-        <div class="fieldset-wrapper-title">
-            <span class="title"><?php echo __('Items Ordered') ?></span>
-        </div>
-        <?php echo $this->getItemsHtml() ?>
+
+<?php echo $this->getGiftOptionsHtml() ?>
+
+<div class="fieldset-wrapper">
+    <div class="fieldset-wrapper-title">
+        <span class="title"><?php echo __('Items Ordered') ?></span>
     </div>
+    <?php echo $this->getItemsHtml() ?>
+</div>
+
 <div class="clearfix">
     <div class="order-comments-history">
         <div class="fieldset-wrapper">
@@ -95,6 +108,7 @@
             <fieldset><?php echo $this->getChildHtml('order_history') ?></fieldset>
         </div>
     </div>
+
     <div class="order-totals">
         <div class="fieldset-wrapper">
             <div class="fieldset-wrapper-title">
@@ -104,7 +118,9 @@
         </div>
     </div>
 </div>
+
 <?php echo $this->getChildHtml('popup_window');?>
+
 <script type="text/javascript">
 //<![CDATA[
     /**
diff --git a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote.php b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote.php
index 191d1f16fd2afd7a4a0df666b5c1e87a05c2fdac..7caa6a9e2356e9fb1f810f11bf4aeb2f0f8bfd54 100644
--- a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote.php
+++ b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote.php
@@ -332,7 +332,7 @@ class Quote extends \Magento\Backend\App\Action
             $content = $this->_view->getLayout()
                 ->createBlock('Magento\SalesRule\Block\Adminhtml\Promo\Quote\Edit\Tab\Coupons\Grid')
                 ->getExcelFile($fileName);
-            return $this->_fileFactory->create($fileName, $content);
+            return $this->_fileFactory->create($fileName, $content, \Magento\Filesystem::VAR_DIR);
         } else {
             $this->_redirect('sales_rule/*/detail', array('_current' => true));
             return;
@@ -353,7 +353,7 @@ class Quote extends \Magento\Backend\App\Action
             $content = $this->_view->getLayout()
                 ->createBlock('Magento\SalesRule\Block\Adminhtml\Promo\Quote\Edit\Tab\Coupons\Grid')
                 ->getCsvFile();
-            return $this->_fileFactory->create($fileName, $content);
+            return $this->_fileFactory->create($fileName, $content, \Magento\Filesystem::VAR_DIR);
         } else {
             $this->_redirect('sales_rule/*/detail', array('_current' => true));
             return;
diff --git a/app/code/Magento/Tax/Controller/Adminhtml/Rate.php b/app/code/Magento/Tax/Controller/Adminhtml/Rate.php
index cd9fc0d5055d32ba04d803178a8b194a90375819..74976baf8936d773ba6e92d35fd70bbfb6c7ffef 100644
--- a/app/code/Magento/Tax/Controller/Adminhtml/Rate.php
+++ b/app/code/Magento/Tax/Controller/Adminhtml/Rate.php
@@ -299,8 +299,8 @@ class Rate extends \Magento\Backend\App\Action
     public function exportCsvAction()
     {
         $this->_view->loadLayout(false);
-        $content = $this->_view->getLayout()->getChildBlock('adminhtml.tax.rate.grid','grid.export');
-        return $this->_fileFactory->create('rates.csv', $content->getCsvFile());
+        $content = $this->_view->getLayout()->getChildBlock('adminhtml.tax.rate.grid', 'grid.export');
+        return $this->_fileFactory->create('rates.csv', $content->getCsvFile(), \Magento\Filesystem::VAR_DIR);
     }
 
     /**
@@ -309,8 +309,8 @@ class Rate extends \Magento\Backend\App\Action
     public function exportXmlAction()
     {
         $this->_view->loadLayout(false);
-        $content = $this->_view->getLayout()->getChildBlock('adminhtml.tax.rate.grid','grid.export');
-        return $this->_fileFactory->create('rates.xml', $content->getExcelFile());
+        $content = $this->_view->getLayout()->getChildBlock('adminhtml.tax.rate.grid', 'grid.export');
+        return $this->_fileFactory->create('rates.xml', $content->getExcelFile(), \Magento\Filesystem::VAR_DIR);
     }
 
     /**
@@ -431,7 +431,7 @@ class Rate extends \Magento\Backend\App\Action
             $content .= $rate->toString($template) . "\n";
         }
         $this->_view->loadLayout();
-        return $this->_fileFactory->create('tax_rates.csv', $content);
+        return $this->_fileFactory->create('tax_rates.csv', $content, \Magento\Filesystem::VAR_DIR);
     }
 
     protected function _isAllowed()
diff --git a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme.php b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme.php
index 04d57ed4518e9521607d9bb018a2e3fc1b37e4a3..0df09c9d81267a9bf7db8f9ec9262abc72762ce3 100644
--- a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme.php
+++ b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Theme.php
@@ -296,7 +296,8 @@ class Theme extends \Magento\Backend\App\Action
                     array(
                         'type'  => 'filename',
                         'value' => $customCssFile->getFullPath()
-                    )
+                    ),
+                    \Magento\Filesystem::ROOT
                 );
             }
         } catch (\Exception $e) {
@@ -331,10 +332,14 @@ class Theme extends \Magento\Backend\App\Action
                 );
             }
 
-            return $this->_fileFactory->create($fileName, array(
-                'type'  => 'filename',
-                'value' => $themeCss[$fileName]['path']
-            ));
+            return $this->_fileFactory->create(
+                $fileName,
+                array(
+                    'type'  => 'filename',
+                    'value' => $themeCss[$fileName]['path']
+                ),
+                \Magento\Filesystem::ROOT
+            );
         } catch (\Exception $e) {
             $this->messageManager->addException($e, __('We cannot find file "%1".', $fileName));
             $this->getResponse()->setRedirect($this->_redirect->getRefererUrl());
diff --git a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files.php b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files.php
index 50aabe0721908f24cfddd6ef0e0937cd829677af..c8999ca2272d59d018d629042ad6425360b5c116 100644
--- a/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files.php
+++ b/app/code/Magento/Theme/Controller/Adminhtml/System/Design/Wysiwyg/Files.php
@@ -147,10 +147,14 @@ class Files extends \Magento\Backend\App\Action
         /** @var $helper \Magento\Theme\Helper\Storage */
         $helper = $this->_objectManager->get('Magento\Theme\Helper\Storage');
         try {
-            return $this->_fileFactory->create($file, array(
-                'type'  => 'filename',
-                'value' => $helper->getThumbnailPath($file)
-            ));
+            return $this->_fileFactory->create(
+                $file,
+                array(
+                    'type'  => 'filename',
+                    'value' => $helper->getThumbnailPath($file)
+                ),
+                \Magento\Filesystem::MEDIA
+            );
         } catch (\Exception $e) {
             $this->_objectManager->get('Magento\Logger')->logException($e);
             $this->_redirect('core/index/notfound');
diff --git a/app/code/Magento/Theme/view/frontend/layout/default_head_blocks.xml b/app/code/Magento/Theme/view/frontend/layout/default_head_blocks.xml
index 425c9c0a056b1ec37a9d7464f3282951cbf6a826..5f553e70450bb1d5661fb551902442daf6b164ad 100644
--- a/app/code/Magento/Theme/view/frontend/layout/default_head_blocks.xml
+++ b/app/code/Magento/Theme/view/frontend/layout/default_head_blocks.xml
@@ -45,7 +45,7 @@
         </block>
         <block class="Magento\Theme\Block\Html\Head\Script" name="head-load-min-js">
             <arguments>
-                <argument name="file" xsi:type="string">head.load.min.js</argument>
+                <argument name="file" xsi:type="string">headjs/head.load.min.js</argument>
             </arguments>
         </block>
         <block class="Magento\Theme\Block\Html\Head\Script" name="magento-magento-js">
diff --git a/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl.php b/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl.php
index 364c94ac5caa2b12f4666ce8da8695cc8e397bf8..a580b1e8681c1410f9e2612ed3e605dc0071db88 100644
--- a/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl.php
+++ b/app/code/Magento/Usa/Model/Shipping/Carrier/Dhl.php
@@ -637,8 +637,8 @@ class Dhl
                 $ch = curl_init();
                 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                 curl_setopt($ch, CURLOPT_URL, $url);
-                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
-                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
+                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
+                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
                 curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
                 $responseBody = curl_exec($ch);
                 curl_close($ch);
@@ -1135,8 +1135,8 @@ class Dhl
             $ch = curl_init();
             curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
             curl_setopt($ch, CURLOPT_URL, $url);
-            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
-            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
+            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
+            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
             curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
             $responseBody = curl_exec($ch);
             $debugData['result'] = $responseBody;
diff --git a/app/code/Magento/Usa/Model/Shipping/Carrier/Fedex.php b/app/code/Magento/Usa/Model/Shipping/Carrier/Fedex.php
index 58068a67492fe5eba70ede5f6eb95469c78ba572..9209bb6d86fa4a5426ccaba6bf57d4d2db9ec134 100644
--- a/app/code/Magento/Usa/Model/Shipping/Carrier/Fedex.php
+++ b/app/code/Magento/Usa/Model/Shipping/Carrier/Fedex.php
@@ -699,8 +699,8 @@ class Fedex
                 $ch = curl_init();
                 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                 curl_setopt($ch, CURLOPT_URL, $url);
-                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
-                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
+                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
+                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
                 curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
                 $responseBody = curl_exec($ch);
                 curl_close ($ch);
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 80eef8ffd62aea020c8e031eefa133554594edd1..3b0504e8bdf9227d7f6b8b8db3420c02ec479dcb 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
@@ -171,7 +171,8 @@ if (!$installer->getConnection()->isTableExists($installer->getTable('admin_user
             ), 'User Password')
         ->addColumn('created', \Magento\DB\Ddl\Table::TYPE_TIMESTAMP, null, array(
             'nullable'  => false,
-            ), 'User Created Time')
+            'default'   => \Magento\DB\Ddl\Table::TIMESTAMP_INIT,
+        ), 'User Created Time')
         ->addColumn('modified', \Magento\DB\Ddl\Table::TYPE_TIMESTAMP, null, array(
             ), 'User Modified Time')
         ->addColumn('logdate', \Magento\DB\Ddl\Table::TYPE_TIMESTAMP, null, array(
diff --git a/app/code/Magento/User/view/adminhtml/admin/forgotpassword.phtml b/app/code/Magento/User/view/adminhtml/admin/forgotpassword.phtml
index 83e28865b458b34ebd1bbcb82d6fd7ce1a7ea92b..bf1630a5ec8210f3d08c0d37bee861ee4d733422 100644
--- a/app/code/Magento/User/view/adminhtml/admin/forgotpassword.phtml
+++ b/app/code/Magento/User/view/adminhtml/admin/forgotpassword.phtml
@@ -54,8 +54,8 @@
     <script src="<?php echo $this->getViewFileUrl('mage/adminhtml/events.js'); ?>"></script>
     <script src="<?php echo $this->getViewFileUrl('scriptaculous/effects.js'); ?>"></script>
     <script src="<?php echo $this->getViewFileUrl('mage/captcha.js') ?>"></script>
-    <script src="<?php echo $this->getViewFileUrl('lib/modernizr.js') ?>"></script>
-    <script src="<?php echo $this->getViewFileUrl('js/head.js') ?>"></script>
+    <script src="<?php echo $this->getViewFileUrl('modernizr/modernizr.js') ?>"></script>
+    <script src="<?php echo $this->getViewFileUrl('headjs/head.min.js') ?>"></script>
 
 <body id="page-login" class="page-login page-forgotpassword">
     <div class="wrapper">
diff --git a/app/code/Magento/User/view/adminhtml/admin/resetforgottenpassword.phtml b/app/code/Magento/User/view/adminhtml/admin/resetforgottenpassword.phtml
index 0ac89ee2e3e9d0c8ce9e763f5a43ed63f7bf8dae..fbc2eb909b07cb4f785085f33e603b3d6e461d28 100644
--- a/app/code/Magento/User/view/adminhtml/admin/resetforgottenpassword.phtml
+++ b/app/code/Magento/User/view/adminhtml/admin/resetforgottenpassword.phtml
@@ -52,8 +52,8 @@
     <script src="<?php echo $this->getViewFileUrl('prototype/prototype.js') ?>"></script>
     <script src="<?php echo $this->getViewFileUrl('scriptaculous/effects.js') ?>"></script>
     <script src="<?php echo $this->getViewFileUrl('mage/captcha.js') ?>"></script>
-    <script src="<?php echo $this->getViewFileUrl('lib/modernizr.js') ?>"></script>
-    <script src="<?php echo $this->getViewFileUrl('js/head.js') ?>"></script>
+    <script src="<?php echo $this->getViewFileUrl('modernizr/modernizr.js') ?>"></script>
+    <script src="<?php echo $this->getViewFileUrl('headjs/head.min.js') ?>"></script>
 
 <body id="page-login" class="page-login page-resetpass">
     <div class="wrapper">
diff --git a/app/code/Magento/Wishlist/Controller/Index.php b/app/code/Magento/Wishlist/Controller/Index.php
index 9fa8deae722d88c17219b984a7c210f55d2fe898..29465301b4e7b17714c4943a79d88c28ec037992 100644
--- a/app/code/Magento/Wishlist/Controller/Index.php
+++ b/app/code/Magento/Wishlist/Controller/Index.php
@@ -256,8 +256,7 @@ class Index
             $helper = $this->_objectManager->get('Magento\Wishlist\Helper\Data')->calculate();
             $message = __('%1 has been added to your wishlist. Click <a href="%2">here</a> to continue shopping.', $this->_objectManager->get('Magento\Escaper')->escapeHtml($product->getName()), $this->_objectManager->get('Magento\Escaper')->escapeUrl($referer));
             $this->messageManager->addSuccess($message);
-        }
-        catch (\Magento\Core\Exception $e) {
+        } catch (\Magento\Core\Exception $e) {
             $this->messageManager->addError(
                 __('An error occurred while adding item to wish list: %1', $e->getMessage())
             );
@@ -354,8 +353,11 @@ class Index
                 ->save();
 
             $this->_objectManager->get('Magento\Wishlist\Helper\Data')->calculate();
-            $this->_eventManager->dispatch('wishlist_update_item', array(
-                'wishlist' => $wishlist, 'product' => $product, 'item' => $wishlist->getItem($id))
+            $this->_eventManager->dispatch(
+                'wishlist_update_item',
+                array(
+                    'wishlist' => $wishlist, 'product' => $product, 'item' => $wishlist->getItem($id)
+                )
             );
 
             $this->_objectManager->get('Magento\Wishlist\Helper\Data')->calculate();
@@ -446,8 +448,7 @@ class Index
                 try {
                     $wishlist->save();
                     $this->_objectManager->get('Magento\Wishlist\Helper\Data')->calculate();
-                }
-                catch (\Exception $e) {
+                } catch (\Exception $e) {
                     $this->messageManager->addError(__('Can\'t update wish list'));
                 }
             }
@@ -554,14 +555,14 @@ class Index
 
             if ($this->_objectManager->get('Magento\Checkout\Helper\Cart')->getShouldRedirectToCart()) {
                 $redirectUrl = $this->_objectManager->get('Magento\Checkout\Helper\Cart')->getCartUrl();
-            } else if ($this->_redirect->getRefererUrl()) {
+            } elseif ($this->_redirect->getRefererUrl()) {
                 $redirectUrl = $this->_redirect->getRefererUrl();
             }
             $this->_objectManager->get('Magento\Wishlist\Helper\Data')->calculate();
         } catch (\Magento\Core\Exception $e) {
             if ($e->getCode() == \Magento\Wishlist\Model\Item::EXCEPTION_CODE_NOT_SALABLE) {
                 $this->messageManager->addError(__('This product(s) is out of stock.'));
-            } else if ($e->getCode() == \Magento\Wishlist\Model\Item::EXCEPTION_CODE_HAS_REQUIRED_OPTIONS) {
+            } elseif ($e->getCode() == \Magento\Wishlist\Model\Item::EXCEPTION_CODE_HAS_REQUIRED_OPTIONS) {
                 $this->messageManager->addNotice($e->getMessage());
                 $redirectUrl = $this->_url->getUrl('*/*/configure/', array('id' => $item->getId()));
             } else {
@@ -594,7 +595,7 @@ class Index
         $cart = $this->_objectManager->get('Magento\Checkout\Model\Cart');
         $session = $this->_objectManager->get('Magento\Checkout\Model\Session');
 
-        try{
+        try {
             $item = $cart->getQuote()->getItemById($itemId);
             if (!$item) {
                 throw new \Magento\Core\Exception(
@@ -623,7 +624,9 @@ class Index
             $this->messageManager->addException($e, __('We can\'t move the item to the wish list.'));
         }
 
-        return $this->getResponse()->setRedirect($this->_objectManager->get('Magento\Checkout\Helper\Cart')->getCartUrl());
+        return $this->getResponse()->setRedirect(
+            $this->_objectManager->get('Magento\Checkout\Helper\Cart')->getCartUrl()
+        );
     }
 
     /**
@@ -704,7 +707,10 @@ class Index
                     ->toHtml();
                 $message .= $rss_url;
             }
-            $wishlistBlock = $this->_view->getLayout()->createBlock('Magento\Wishlist\Block\Share\Email\Items')->toHtml();
+            $wishlistBlock = $this->_view
+                ->getLayout()
+                ->createBlock('Magento\Wishlist\Block\Share\Email\Items')
+                ->toHtml();
 
             $emails = array_unique($emails);
             /* @var $emailModel \Magento\Email\Model\Template */
@@ -715,8 +721,12 @@ class Index
             try {
                 foreach ($emails as $email) {
                     $emailModel->sendTransactional(
-                        $this->_objectManager->get('Magento\Core\Model\Store\Config')->getConfig('wishlist/email/email_template'),
-                        $this->_objectManager->get('Magento\Core\Model\Store\Config')->getConfig('wishlist/email/email_identity'),
+                        $this->_objectManager
+                            ->get('Magento\Core\Model\Store\Config')
+                            ->getConfig('wishlist/email/email_template'),
+                        $this->_objectManager
+                            ->get('Magento\Core\Model\Store\Config')
+                            ->getConfig('wishlist/email/email_identity'),
                         $email,
                         null,
                         array(
@@ -767,7 +777,11 @@ class Index
 
         $optionId = null;
         if (strpos($option->getCode(), \Magento\Catalog\Model\Product\Type\AbstractType::OPTION_PREFIX) === 0) {
-            $optionId = str_replace(\Magento\Catalog\Model\Product\Type\AbstractType::OPTION_PREFIX, '', $option->getCode());
+            $optionId = str_replace(
+                \Magento\Catalog\Model\Product\Type\AbstractType::OPTION_PREFIX,
+                '',
+                $option->getCode()
+            );
             if ((int)$optionId != $optionId) {
                 return $this->_forward('noroute');
             }
@@ -789,13 +803,17 @@ class Index
             $secretKey = $this->getRequest()->getParam('key');
 
             if ($secretKey == $info['secret_key']) {
-                $this->_fileResponseFactory->create($info['title'], array(
-                    'value' => $filePath,
-                    'type'  => 'filename'
-                ));
+                $this->_fileResponseFactory->create(
+                    $info['title'],
+                    array(
+                        'value' => $filePath,
+                        'type'  => 'filename'
+                    ),
+                    \Magento\Filesystem::ROOT
+                );
             }
 
-        } catch(\Exception $e) {
+        } catch (\Exception $e) {
             $this->_forward('noroute');
         }
         exit(0);
diff --git a/app/design/adminhtml/magento_backend/Magento_Backend/layout/default.xml b/app/design/adminhtml/magento_backend/Magento_Backend/layout/default.xml
index 2c6ba794548164c23119fec250183eae82445e83..ddb75229007bd366caee5f8217350ad3f7d6ecfd 100644
--- a/app/design/adminhtml/magento_backend/Magento_Backend/layout/default.xml
+++ b/app/design/adminhtml/magento_backend/Magento_Backend/layout/default.xml
@@ -50,10 +50,33 @@
                 <argument name="file" xsi:type="string">mui/components.css</argument>
             </arguments>
         </block>
-        <block class="Magento\Theme\Block\Html\Head\Css" name="css-styles-css">
+        <!--<block class="Magento\Theme\Block\Html\Head\Css" name="css-styles-css">
             <arguments>
                 <argument name="file" xsi:type="string">css/styles.css</argument>
             </arguments>
+        </block>-->
+        <block class="Magento\Theme\Block\Html\Head\Css" name="css-styles-admin">
+            <arguments>
+                <argument name="file" xsi:type="string">css/admin.css</argument>
+            </arguments>
+        </block>
+        <block class="Magento\Theme\Block\Html\Head\Css" name="css-styles-header">
+            <arguments>
+                <argument name="file" xsi:type="string">css/header.css</argument>
+            </arguments>
+        </block>
+        <block class="Magento\Theme\Block\Html\Head\Css" name="css-styles-pages">
+            <arguments>
+                <argument name="file" xsi:type="string">css/pages.css</argument>
+            </arguments>
+        </block>
+        <block class="Magento\Theme\Block\Html\Head\Css" name="css-styles-ie8">
+            <arguments>
+                <argument name="file" xsi:type="string">css/styles-ie8.css</argument>
+                <argument name="properties" xsi:type="array">
+                    <item name="ie_condition" xsi:type="string">lt IE 9</item>
+                </argument>
+            </arguments>
         </block>
         <block class="Magento\Theme\Block\Html\Head\Css" name="jquery-farbtastic-css-farbtastic-css">
             <arguments>
@@ -81,12 +104,12 @@
         </block>
         <block class="Magento\Theme\Block\Html\Head\Script" name="lib-modernizr-js">
             <arguments>
-                <argument name="file" xsi:type="string">lib/modernizr.js</argument>
+                <argument name="file" xsi:type="string">modernizr/modernizr.js</argument>
             </arguments>
         </block>
         <block class="Magento\Theme\Block\Html\Head\Script" name="js-head-js">
             <arguments>
-                <argument name="file" xsi:type="string">js/head.js</argument>
+                <argument name="file" xsi:type="string">headjs/head.min.js</argument>
             </arguments>
         </block>
         <block class="Magento\Theme\Block\Html\Head\Script" name="magento-dropdown-js">
@@ -109,9 +132,14 @@
                 <argument name="file" xsi:type="string">js/theme.js</argument>
             </arguments>
         </block>
+        <block class="Magento\Theme\Block\Html\Head\Script" name="js-modernizr-details-js">
+            <arguments>
+                <argument name="file" xsi:type="string">modernizr/modernizr.details.js</argument>
+            </arguments>
+        </block>
         <block class="Magento\Theme\Block\Html\Head\Script" name="js-jquery-details-js">
             <arguments>
-                <argument name="file" xsi:type="string">js/jquery.details.js</argument>
+                <argument name="file" xsi:type="string">jquery/jquery.details.js</argument>
             </arguments>
         </block>
     </referenceBlock>
diff --git a/app/design/adminhtml/magento_backend/css/admin.css b/app/design/adminhtml/magento_backend/css/admin.css
new file mode 100644
index 0000000000000000000000000000000000000000..1a9e681520953945522358424367d4c8ec0eff35
--- /dev/null
+++ b/app/design/adminhtml/magento_backend/css/admin.css
@@ -0,0 +1,6720 @@
+/**
+  * 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)
+  */
+@font-face {
+  font-family: 'admin-icons';
+  src: url('../fonts/icons/admin-icons.eot');
+  src: url('../fonts/icons/admin-icons.eot?#iefix') format('embedded-opentype'), url('../fonts/icons/admin-icons.svg#admin-icons') format('svg'), url('../fonts/icons/admin-icons.woff') format('woff'), url('../fonts/icons/admin-icons.ttf') format('truetype');
+  font-weight: normal;
+  font-style: normal;
+}
+@font-face {
+  font-family: 'MUI-Icons';
+  src: url('../mui/fonts/MUI-Icons.eot');
+  src: url('../mui/fonts/MUI-Icons.eot?#iefix') format('embedded-opentype'), url('../mui/fonts/MUI-Icons.svg#MUI-Icons') format('svg'), url('../mui/fonts/MUI-Icons.woff') format('woff'), url('../mui/fonts/MUI-Icons.ttf') format('truetype');
+  font-weight: normal;
+  font-style: normal;
+}
+/* @import url(http://fonts.googleapis.com/css?family=Open+Sans:400italic,400,600,700 <http://fonts.googleapis.com/css?family=Open+Sans:400italic%2c400%2c600%2c700>); */
+@font-face {
+  font-family: 'Open Sans';
+  font-style: normal;
+  font-weight: 400;
+  src: local('Open Sans'), local('OpenSans'), url(//themes.googleusercontent.com/static/fonts/opensans/v6/cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff) format('woff');
+}
+@font-face {
+  font-family: 'Open Sans';
+  font-style: normal;
+  font-weight: 600;
+  src: local('Open Sans Semibold'), local('OpenSans-Semibold'), url(//themes.googleusercontent.com/static/fonts/opensans/v6/MTP_ySUJH_bn48VBG8sNSnhCUOGz7vYGh680lGh-uXM.woff) format('woff');
+}
+@font-face {
+  font-family: 'Open Sans';
+  font-style: normal;
+  font-weight: 700;
+  src: local('Open Sans Bold'), local('OpenSans-Bold'), url(//themes.googleusercontent.com/static/fonts/opensans/v6/k3k702ZOKiLJc3WVjuplzHhCUOGz7vYGh680lGh-uXM.woff) format('woff');
+}
+@font-face {
+  font-family: 'Open Sans';
+  font-style: italic;
+  font-weight: 400;
+  src: local('Open Sans Italic'), local('OpenSans-Italic'), url(//themes.googleusercontent.com/static/fonts/opensans/v6/xjAJXh38I15wypJXxuGMBobN6UDyHWBl620a-IRfuBk.woff) format('woff');
+}
+body,
+html {
+  min-height: 100%;
+  height: 100%;
+}
+body {
+  color: #676056;
+  font: 400 14px/1.33 'Open Sans', sans-serif;
+  background: #f2ebde;
+  position: relative;
+  height: auto;
+}
+h1 {
+  color: #676056;
+  font: 400 28px/1.2 'Open Sans', sans-serif;
+}
+h2 {
+  color: #676056;
+  font: 400 20px/1.2 'Open Sans', sans-serif;
+}
+h3 {
+  color: #676056;
+  font: 600 16px/1.2 'Open Sans', sans-serif;
+}
+h4 {
+  color: #676056;
+  font: 600 14px/1.2 'Open Sans', sans-serif;
+}
+h5 {
+  color: #676056;
+  font: 600 13px/1.2 'Open Sans', sans-serif;
+}
+h6 {
+  color: #676056;
+  font: 600 12px/1.2 'Open Sans', sans-serif;
+}
+a {
+  display: inline;
+  color: #026294;
+  text-decoration: none;
+}
+a:visited,
+a:active {
+  color: #026294;
+}
+a:focus,
+a:hover {
+  color: #026294;
+  text-decoration: underline;
+}
+.DefaultButton,
+.PrimaryButton,
+input[type=button],
+input[type=submit],
+input[type=reset],
+button,
+[class^="action-"],
+.popup-window .add-widget,
+.PrimaryAddButton,
+.PrimarySplitButton > .action-toggle.primary,
+input[type=button].primary,
+input[type=submit].primary,
+input[type=reset].primary,
+button.primary,
+[class^="action-"].primary,
+.popup-window .add-widget.primary,
+.PrimarySplitButton.btn-round .action-default.primary,
+.sales-order-index .page-actions .add,
+.adminhtml-rma-index .page-actions .add,
+.adminhtml-catalog-event-index .page-actions .add,
+.adminhtml-urlrewrite-index .page-actions .add,
+.catalog-search-index .page-actions .add,
+.catalog-product-review-index .page-actions .add,
+.catalog-rule-promo-catalog-index .page-actions .add,
+.sales-rule-promo-quote-index .page-actions .add,
+.adminhtml-reminder-index .page-actions .add,
+.newsletter-template-index .page-actions .add,
+.adminhtml-system-email-template-index .page-actions .add,
+.adminhtml-sitemap-index .page-actions .add,
+.adminhtml-googleshopping-types-index .page-actions .add,
+.customer-index-index .page-actions .add,
+.adminhtml-cms-page-index .page-actions .add,
+.cms-block-index .page-actions .add,
+.adminhtml-banner-index .page-actions .add,
+.adminhtml-widget-instance-index .page-actions .add,
+.cms-page-index .page-actions .add,
+.adminhtml-webapi-user-index .page-actions .add,
+.adminhtml-webapi-role-index .page-actions .add,
+.adminhtml-system-variable-index .page-actions .add,
+.adminhtml-user-index .page-actions .add,
+.adminhtml-user-role-index .page-actions .add,
+.adminhtml-integration-index .page-actions .add,
+.adminhtml-system-design-theme-index .page-actions .add,
+.adminhtml-system-design-index .page-actions .add,
+.adminhtml-customer-attribute-index .page-actions .add,
+.adminhtml-customer-address-attribute-index .page-actions .add,
+.rating-index-index .page-actions .add,
+.tax-rule-index .page-actions .add,
+.tax-rate-index .page-actions .add,
+.adminhtml-rma-item-attribute-index .page-actions .add,
+.adminhtml-reward-rate-index .page-actions .add,
+.customer-group-index .page-actions .add,
+.checkout-agreement-index .page-actions .add,
+.catalog-product-attribute-index .page-actions .add,
+.catalog-product-set-index .page-actions .add,
+.catalog-product-new .actions-split > .action-toggle.primary,
+.catalog-product-edit .actions-split > .action-toggle.primary,
+.catalog-product-index .actions-split > .action-toggle.primary,
+.adminhtml-integration-new .actions-split > .action-toggle.primary,
+.catalog-product-new .actions-split.btn-round .action-default.primary,
+.catalog-product-edit .actions-split.btn-round .action-default.primary,
+.catalog-product-index .actions-split.btn-round .action-default.primary,
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary {
+  font: 14px/19px 'Open Sans', sans-serif;
+  font-weight: 500;
+  background: #f2ebde;
+  border: 1px solid #ada89e;
+  color: #676056;
+  display: inline-block;
+  padding: 5px 14px;
+  text-align: center;
+  text-decoration: none;
+  vertical-align: top;
+  cursor: pointer;
+  border-radius: 2px;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.DefaultButton:hover,
+.DefaultButton:focus,
+.DefaultButton:active,
+.PrimaryButton:hover,
+.PrimaryButton:focus,
+.PrimaryButton:active,
+input[type=button]:hover,
+input[type=button]:focus,
+input[type=button]:active,
+input[type=submit]:hover,
+input[type=submit]:focus,
+input[type=submit]:active,
+input[type=reset]:hover,
+input[type=reset]:focus,
+input[type=reset]:active,
+button:hover,
+button:focus,
+button:active,
+[class^="action-"]:hover,
+[class^="action-"]:focus,
+[class^="action-"]:active,
+.popup-window .add-widget:hover,
+.popup-window .add-widget:focus,
+.popup-window .add-widget:active,
+.PrimaryAddButton:hover,
+.PrimaryAddButton:focus,
+.PrimaryAddButton:active,
+.PrimarySplitButton > .action-toggle.primary:hover,
+.PrimarySplitButton > .action-toggle.primary:focus,
+.PrimarySplitButton > .action-toggle.primary:active,
+input[type=button].primary:hover,
+input[type=button].primary:focus,
+input[type=button].primary:active,
+input[type=submit].primary:hover,
+input[type=submit].primary:focus,
+input[type=submit].primary:active,
+input[type=reset].primary:hover,
+input[type=reset].primary:focus,
+input[type=reset].primary:active,
+button.primary:hover,
+button.primary:focus,
+button.primary:active,
+[class^="action-"].primary:hover,
+[class^="action-"].primary:focus,
+[class^="action-"].primary:active,
+.popup-window .add-widget.primary:hover,
+.popup-window .add-widget.primary:focus,
+.popup-window .add-widget.primary:active,
+.PrimarySplitButton.btn-round .action-default.primary:hover,
+.PrimarySplitButton.btn-round .action-default.primary:focus,
+.PrimarySplitButton.btn-round .action-default.primary:active,
+.sales-order-index .page-actions .add:hover,
+.sales-order-index .page-actions .add:focus,
+.sales-order-index .page-actions .add:active,
+.adminhtml-rma-index .page-actions .add:hover,
+.adminhtml-rma-index .page-actions .add:focus,
+.adminhtml-rma-index .page-actions .add:active,
+.adminhtml-catalog-event-index .page-actions .add:hover,
+.adminhtml-catalog-event-index .page-actions .add:focus,
+.adminhtml-catalog-event-index .page-actions .add:active,
+.adminhtml-urlrewrite-index .page-actions .add:hover,
+.adminhtml-urlrewrite-index .page-actions .add:focus,
+.adminhtml-urlrewrite-index .page-actions .add:active,
+.catalog-search-index .page-actions .add:hover,
+.catalog-search-index .page-actions .add:focus,
+.catalog-search-index .page-actions .add:active,
+.catalog-product-review-index .page-actions .add:hover,
+.catalog-product-review-index .page-actions .add:focus,
+.catalog-product-review-index .page-actions .add:active,
+.catalog-rule-promo-catalog-index .page-actions .add:hover,
+.catalog-rule-promo-catalog-index .page-actions .add:focus,
+.catalog-rule-promo-catalog-index .page-actions .add:active,
+.sales-rule-promo-quote-index .page-actions .add:hover,
+.sales-rule-promo-quote-index .page-actions .add:focus,
+.sales-rule-promo-quote-index .page-actions .add:active,
+.adminhtml-reminder-index .page-actions .add:hover,
+.adminhtml-reminder-index .page-actions .add:focus,
+.adminhtml-reminder-index .page-actions .add:active,
+.newsletter-template-index .page-actions .add:hover,
+.newsletter-template-index .page-actions .add:focus,
+.newsletter-template-index .page-actions .add:active,
+.adminhtml-system-email-template-index .page-actions .add:hover,
+.adminhtml-system-email-template-index .page-actions .add:focus,
+.adminhtml-system-email-template-index .page-actions .add:active,
+.adminhtml-sitemap-index .page-actions .add:hover,
+.adminhtml-sitemap-index .page-actions .add:focus,
+.adminhtml-sitemap-index .page-actions .add:active,
+.adminhtml-googleshopping-types-index .page-actions .add:hover,
+.adminhtml-googleshopping-types-index .page-actions .add:focus,
+.adminhtml-googleshopping-types-index .page-actions .add:active,
+.customer-index-index .page-actions .add:hover,
+.customer-index-index .page-actions .add:focus,
+.customer-index-index .page-actions .add:active,
+.adminhtml-cms-page-index .page-actions .add:hover,
+.adminhtml-cms-page-index .page-actions .add:focus,
+.adminhtml-cms-page-index .page-actions .add:active,
+.cms-block-index .page-actions .add:hover,
+.cms-block-index .page-actions .add:focus,
+.cms-block-index .page-actions .add:active,
+.adminhtml-banner-index .page-actions .add:hover,
+.adminhtml-banner-index .page-actions .add:focus,
+.adminhtml-banner-index .page-actions .add:active,
+.adminhtml-widget-instance-index .page-actions .add:hover,
+.adminhtml-widget-instance-index .page-actions .add:focus,
+.adminhtml-widget-instance-index .page-actions .add:active,
+.cms-page-index .page-actions .add:hover,
+.cms-page-index .page-actions .add:focus,
+.cms-page-index .page-actions .add:active,
+.adminhtml-webapi-user-index .page-actions .add:hover,
+.adminhtml-webapi-user-index .page-actions .add:focus,
+.adminhtml-webapi-user-index .page-actions .add:active,
+.adminhtml-webapi-role-index .page-actions .add:hover,
+.adminhtml-webapi-role-index .page-actions .add:focus,
+.adminhtml-webapi-role-index .page-actions .add:active,
+.adminhtml-system-variable-index .page-actions .add:hover,
+.adminhtml-system-variable-index .page-actions .add:focus,
+.adminhtml-system-variable-index .page-actions .add:active,
+.adminhtml-user-index .page-actions .add:hover,
+.adminhtml-user-index .page-actions .add:focus,
+.adminhtml-user-index .page-actions .add:active,
+.adminhtml-user-role-index .page-actions .add:hover,
+.adminhtml-user-role-index .page-actions .add:focus,
+.adminhtml-user-role-index .page-actions .add:active,
+.adminhtml-integration-index .page-actions .add:hover,
+.adminhtml-integration-index .page-actions .add:focus,
+.adminhtml-integration-index .page-actions .add:active,
+.adminhtml-system-design-theme-index .page-actions .add:hover,
+.adminhtml-system-design-theme-index .page-actions .add:focus,
+.adminhtml-system-design-theme-index .page-actions .add:active,
+.adminhtml-system-design-index .page-actions .add:hover,
+.adminhtml-system-design-index .page-actions .add:focus,
+.adminhtml-system-design-index .page-actions .add:active,
+.adminhtml-customer-attribute-index .page-actions .add:hover,
+.adminhtml-customer-attribute-index .page-actions .add:focus,
+.adminhtml-customer-attribute-index .page-actions .add:active,
+.adminhtml-customer-address-attribute-index .page-actions .add:hover,
+.adminhtml-customer-address-attribute-index .page-actions .add:focus,
+.adminhtml-customer-address-attribute-index .page-actions .add:active,
+.rating-index-index .page-actions .add:hover,
+.rating-index-index .page-actions .add:focus,
+.rating-index-index .page-actions .add:active,
+.tax-rule-index .page-actions .add:hover,
+.tax-rule-index .page-actions .add:focus,
+.tax-rule-index .page-actions .add:active,
+.tax-rate-index .page-actions .add:hover,
+.tax-rate-index .page-actions .add:focus,
+.tax-rate-index .page-actions .add:active,
+.adminhtml-rma-item-attribute-index .page-actions .add:hover,
+.adminhtml-rma-item-attribute-index .page-actions .add:focus,
+.adminhtml-rma-item-attribute-index .page-actions .add:active,
+.adminhtml-reward-rate-index .page-actions .add:hover,
+.adminhtml-reward-rate-index .page-actions .add:focus,
+.adminhtml-reward-rate-index .page-actions .add:active,
+.customer-group-index .page-actions .add:hover,
+.customer-group-index .page-actions .add:focus,
+.customer-group-index .page-actions .add:active,
+.checkout-agreement-index .page-actions .add:hover,
+.checkout-agreement-index .page-actions .add:focus,
+.checkout-agreement-index .page-actions .add:active,
+.catalog-product-attribute-index .page-actions .add:hover,
+.catalog-product-attribute-index .page-actions .add:focus,
+.catalog-product-attribute-index .page-actions .add:active,
+.catalog-product-set-index .page-actions .add:hover,
+.catalog-product-set-index .page-actions .add:focus,
+.catalog-product-set-index .page-actions .add:active,
+.catalog-product-new .actions-split > .action-toggle.primary:hover,
+.catalog-product-new .actions-split > .action-toggle.primary:focus,
+.catalog-product-new .actions-split > .action-toggle.primary:active,
+.catalog-product-edit .actions-split > .action-toggle.primary:hover,
+.catalog-product-edit .actions-split > .action-toggle.primary:focus,
+.catalog-product-edit .actions-split > .action-toggle.primary:active,
+.catalog-product-index .actions-split > .action-toggle.primary:hover,
+.catalog-product-index .actions-split > .action-toggle.primary:focus,
+.catalog-product-index .actions-split > .action-toggle.primary:active,
+.adminhtml-integration-new .actions-split > .action-toggle.primary:hover,
+.adminhtml-integration-new .actions-split > .action-toggle.primary:focus,
+.adminhtml-integration-new .actions-split > .action-toggle.primary:active,
+.catalog-product-new .actions-split.btn-round .action-default.primary:hover,
+.catalog-product-new .actions-split.btn-round .action-default.primary:focus,
+.catalog-product-new .actions-split.btn-round .action-default.primary:active,
+.catalog-product-edit .actions-split.btn-round .action-default.primary:hover,
+.catalog-product-edit .actions-split.btn-round .action-default.primary:focus,
+.catalog-product-edit .actions-split.btn-round .action-default.primary:active,
+.catalog-product-index .actions-split.btn-round .action-default.primary:hover,
+.catalog-product-index .actions-split.btn-round .action-default.primary:focus,
+.catalog-product-index .actions-split.btn-round .action-default.primary:active,
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary:hover,
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary:focus,
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary:active {
+  text-decoration: none;
+  background: #cac3b4;
+  color: #676056;
+}
+.DefaultButton:active,
+.PrimaryButton:active,
+input[type=button]:active,
+input[type=submit]:active,
+input[type=reset]:active,
+button:active,
+[class^="action-"]:active,
+.popup-window .add-widget:active,
+.PrimaryAddButton:active,
+.PrimarySplitButton > .action-toggle.primary:active,
+input[type=button].primary:active,
+input[type=submit].primary:active,
+input[type=reset].primary:active,
+button.primary:active,
+[class^="action-"].primary:active,
+.popup-window .add-widget.primary:active,
+.PrimarySplitButton.btn-round .action-default.primary:active,
+.sales-order-index .page-actions .add:active,
+.adminhtml-rma-index .page-actions .add:active,
+.adminhtml-catalog-event-index .page-actions .add:active,
+.adminhtml-urlrewrite-index .page-actions .add:active,
+.catalog-search-index .page-actions .add:active,
+.catalog-product-review-index .page-actions .add:active,
+.catalog-rule-promo-catalog-index .page-actions .add:active,
+.sales-rule-promo-quote-index .page-actions .add:active,
+.adminhtml-reminder-index .page-actions .add:active,
+.newsletter-template-index .page-actions .add:active,
+.adminhtml-system-email-template-index .page-actions .add:active,
+.adminhtml-sitemap-index .page-actions .add:active,
+.adminhtml-googleshopping-types-index .page-actions .add:active,
+.customer-index-index .page-actions .add:active,
+.adminhtml-cms-page-index .page-actions .add:active,
+.cms-block-index .page-actions .add:active,
+.adminhtml-banner-index .page-actions .add:active,
+.adminhtml-widget-instance-index .page-actions .add:active,
+.cms-page-index .page-actions .add:active,
+.adminhtml-webapi-user-index .page-actions .add:active,
+.adminhtml-webapi-role-index .page-actions .add:active,
+.adminhtml-system-variable-index .page-actions .add:active,
+.adminhtml-user-index .page-actions .add:active,
+.adminhtml-user-role-index .page-actions .add:active,
+.adminhtml-integration-index .page-actions .add:active,
+.adminhtml-system-design-theme-index .page-actions .add:active,
+.adminhtml-system-design-index .page-actions .add:active,
+.adminhtml-customer-attribute-index .page-actions .add:active,
+.adminhtml-customer-address-attribute-index .page-actions .add:active,
+.rating-index-index .page-actions .add:active,
+.tax-rule-index .page-actions .add:active,
+.tax-rate-index .page-actions .add:active,
+.adminhtml-rma-item-attribute-index .page-actions .add:active,
+.adminhtml-reward-rate-index .page-actions .add:active,
+.customer-group-index .page-actions .add:active,
+.checkout-agreement-index .page-actions .add:active,
+.catalog-product-attribute-index .page-actions .add:active,
+.catalog-product-set-index .page-actions .add:active,
+.catalog-product-new .actions-split > .action-toggle.primary:active,
+.catalog-product-edit .actions-split > .action-toggle.primary:active,
+.catalog-product-index .actions-split > .action-toggle.primary:active,
+.adminhtml-integration-new .actions-split > .action-toggle.primary:active,
+.catalog-product-new .actions-split.btn-round .action-default.primary:active,
+.catalog-product-edit .actions-split.btn-round .action-default.primary:active,
+.catalog-product-index .actions-split.btn-round .action-default.primary:active,
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary:active {
+  border: 1px solid #989287;
+}
+.DefaultButton:visited,
+.PrimaryButton:visited,
+input[type=button]:visited,
+input[type=submit]:visited,
+input[type=reset]:visited,
+button:visited,
+[class^="action-"]:visited,
+.popup-window .add-widget:visited,
+.PrimaryAddButton:visited,
+.PrimarySplitButton > .action-toggle.primary:visited,
+input[type=button].primary:visited,
+input[type=submit].primary:visited,
+input[type=reset].primary:visited,
+button.primary:visited,
+[class^="action-"].primary:visited,
+.popup-window .add-widget.primary:visited,
+.PrimarySplitButton.btn-round .action-default.primary:visited,
+.sales-order-index .page-actions .add:visited,
+.adminhtml-rma-index .page-actions .add:visited,
+.adminhtml-catalog-event-index .page-actions .add:visited,
+.adminhtml-urlrewrite-index .page-actions .add:visited,
+.catalog-search-index .page-actions .add:visited,
+.catalog-product-review-index .page-actions .add:visited,
+.catalog-rule-promo-catalog-index .page-actions .add:visited,
+.sales-rule-promo-quote-index .page-actions .add:visited,
+.adminhtml-reminder-index .page-actions .add:visited,
+.newsletter-template-index .page-actions .add:visited,
+.adminhtml-system-email-template-index .page-actions .add:visited,
+.adminhtml-sitemap-index .page-actions .add:visited,
+.adminhtml-googleshopping-types-index .page-actions .add:visited,
+.customer-index-index .page-actions .add:visited,
+.adminhtml-cms-page-index .page-actions .add:visited,
+.cms-block-index .page-actions .add:visited,
+.adminhtml-banner-index .page-actions .add:visited,
+.adminhtml-widget-instance-index .page-actions .add:visited,
+.cms-page-index .page-actions .add:visited,
+.adminhtml-webapi-user-index .page-actions .add:visited,
+.adminhtml-webapi-role-index .page-actions .add:visited,
+.adminhtml-system-variable-index .page-actions .add:visited,
+.adminhtml-user-index .page-actions .add:visited,
+.adminhtml-user-role-index .page-actions .add:visited,
+.adminhtml-integration-index .page-actions .add:visited,
+.adminhtml-system-design-theme-index .page-actions .add:visited,
+.adminhtml-system-design-index .page-actions .add:visited,
+.adminhtml-customer-attribute-index .page-actions .add:visited,
+.adminhtml-customer-address-attribute-index .page-actions .add:visited,
+.rating-index-index .page-actions .add:visited,
+.tax-rule-index .page-actions .add:visited,
+.tax-rate-index .page-actions .add:visited,
+.adminhtml-rma-item-attribute-index .page-actions .add:visited,
+.adminhtml-reward-rate-index .page-actions .add:visited,
+.customer-group-index .page-actions .add:visited,
+.checkout-agreement-index .page-actions .add:visited,
+.catalog-product-attribute-index .page-actions .add:visited,
+.catalog-product-set-index .page-actions .add:visited,
+.catalog-product-new .actions-split > .action-toggle.primary:visited,
+.catalog-product-edit .actions-split > .action-toggle.primary:visited,
+.catalog-product-index .actions-split > .action-toggle.primary:visited,
+.adminhtml-integration-new .actions-split > .action-toggle.primary:visited,
+.catalog-product-new .actions-split.btn-round .action-default.primary:visited,
+.catalog-product-edit .actions-split.btn-round .action-default.primary:visited,
+.catalog-product-index .actions-split.btn-round .action-default.primary:visited,
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary:visited {
+  color: #676056;
+}
+.DefaultButton[disabled],
+.DefaultButton.disabled,
+.PrimaryButton[disabled],
+.PrimaryButton.disabled,
+input[type=button][disabled],
+input[type=button].disabled,
+input[type=submit][disabled],
+input[type=submit].disabled,
+input[type=reset][disabled],
+input[type=reset].disabled,
+button[disabled],
+button.disabled,
+[class^="action-"][disabled],
+[class^="action-"].disabled,
+.popup-window .add-widget[disabled],
+.popup-window .add-widget.disabled,
+.PrimaryAddButton[disabled],
+.PrimaryAddButton.disabled,
+.PrimarySplitButton > .action-toggle.primary[disabled],
+.PrimarySplitButton > .action-toggle.primary.disabled,
+input[type=button].primary[disabled],
+input[type=button].primary.disabled,
+input[type=submit].primary[disabled],
+input[type=submit].primary.disabled,
+input[type=reset].primary[disabled],
+input[type=reset].primary.disabled,
+button.primary[disabled],
+button.primary.disabled,
+[class^="action-"].primary[disabled],
+[class^="action-"].primary.disabled,
+.popup-window .add-widget.primary[disabled],
+.popup-window .add-widget.primary.disabled,
+.PrimarySplitButton.btn-round .action-default.primary[disabled],
+.PrimarySplitButton.btn-round .action-default.primary.disabled,
+.sales-order-index .page-actions .add[disabled],
+.sales-order-index .page-actions .add.disabled,
+.adminhtml-rma-index .page-actions .add[disabled],
+.adminhtml-rma-index .page-actions .add.disabled,
+.adminhtml-catalog-event-index .page-actions .add[disabled],
+.adminhtml-catalog-event-index .page-actions .add.disabled,
+.adminhtml-urlrewrite-index .page-actions .add[disabled],
+.adminhtml-urlrewrite-index .page-actions .add.disabled,
+.catalog-search-index .page-actions .add[disabled],
+.catalog-search-index .page-actions .add.disabled,
+.catalog-product-review-index .page-actions .add[disabled],
+.catalog-product-review-index .page-actions .add.disabled,
+.catalog-rule-promo-catalog-index .page-actions .add[disabled],
+.catalog-rule-promo-catalog-index .page-actions .add.disabled,
+.sales-rule-promo-quote-index .page-actions .add[disabled],
+.sales-rule-promo-quote-index .page-actions .add.disabled,
+.adminhtml-reminder-index .page-actions .add[disabled],
+.adminhtml-reminder-index .page-actions .add.disabled,
+.newsletter-template-index .page-actions .add[disabled],
+.newsletter-template-index .page-actions .add.disabled,
+.adminhtml-system-email-template-index .page-actions .add[disabled],
+.adminhtml-system-email-template-index .page-actions .add.disabled,
+.adminhtml-sitemap-index .page-actions .add[disabled],
+.adminhtml-sitemap-index .page-actions .add.disabled,
+.adminhtml-googleshopping-types-index .page-actions .add[disabled],
+.adminhtml-googleshopping-types-index .page-actions .add.disabled,
+.customer-index-index .page-actions .add[disabled],
+.customer-index-index .page-actions .add.disabled,
+.adminhtml-cms-page-index .page-actions .add[disabled],
+.adminhtml-cms-page-index .page-actions .add.disabled,
+.cms-block-index .page-actions .add[disabled],
+.cms-block-index .page-actions .add.disabled,
+.adminhtml-banner-index .page-actions .add[disabled],
+.adminhtml-banner-index .page-actions .add.disabled,
+.adminhtml-widget-instance-index .page-actions .add[disabled],
+.adminhtml-widget-instance-index .page-actions .add.disabled,
+.cms-page-index .page-actions .add[disabled],
+.cms-page-index .page-actions .add.disabled,
+.adminhtml-webapi-user-index .page-actions .add[disabled],
+.adminhtml-webapi-user-index .page-actions .add.disabled,
+.adminhtml-webapi-role-index .page-actions .add[disabled],
+.adminhtml-webapi-role-index .page-actions .add.disabled,
+.adminhtml-system-variable-index .page-actions .add[disabled],
+.adminhtml-system-variable-index .page-actions .add.disabled,
+.adminhtml-user-index .page-actions .add[disabled],
+.adminhtml-user-index .page-actions .add.disabled,
+.adminhtml-user-role-index .page-actions .add[disabled],
+.adminhtml-user-role-index .page-actions .add.disabled,
+.adminhtml-integration-index .page-actions .add[disabled],
+.adminhtml-integration-index .page-actions .add.disabled,
+.adminhtml-system-design-theme-index .page-actions .add[disabled],
+.adminhtml-system-design-theme-index .page-actions .add.disabled,
+.adminhtml-system-design-index .page-actions .add[disabled],
+.adminhtml-system-design-index .page-actions .add.disabled,
+.adminhtml-customer-attribute-index .page-actions .add[disabled],
+.adminhtml-customer-attribute-index .page-actions .add.disabled,
+.adminhtml-customer-address-attribute-index .page-actions .add[disabled],
+.adminhtml-customer-address-attribute-index .page-actions .add.disabled,
+.rating-index-index .page-actions .add[disabled],
+.rating-index-index .page-actions .add.disabled,
+.tax-rule-index .page-actions .add[disabled],
+.tax-rule-index .page-actions .add.disabled,
+.tax-rate-index .page-actions .add[disabled],
+.tax-rate-index .page-actions .add.disabled,
+.adminhtml-rma-item-attribute-index .page-actions .add[disabled],
+.adminhtml-rma-item-attribute-index .page-actions .add.disabled,
+.adminhtml-reward-rate-index .page-actions .add[disabled],
+.adminhtml-reward-rate-index .page-actions .add.disabled,
+.customer-group-index .page-actions .add[disabled],
+.customer-group-index .page-actions .add.disabled,
+.checkout-agreement-index .page-actions .add[disabled],
+.checkout-agreement-index .page-actions .add.disabled,
+.catalog-product-attribute-index .page-actions .add[disabled],
+.catalog-product-attribute-index .page-actions .add.disabled,
+.catalog-product-set-index .page-actions .add[disabled],
+.catalog-product-set-index .page-actions .add.disabled,
+.catalog-product-new .actions-split > .action-toggle.primary[disabled],
+.catalog-product-new .actions-split > .action-toggle.primary.disabled,
+.catalog-product-edit .actions-split > .action-toggle.primary[disabled],
+.catalog-product-edit .actions-split > .action-toggle.primary.disabled,
+.catalog-product-index .actions-split > .action-toggle.primary[disabled],
+.catalog-product-index .actions-split > .action-toggle.primary.disabled,
+.adminhtml-integration-new .actions-split > .action-toggle.primary[disabled],
+.adminhtml-integration-new .actions-split > .action-toggle.primary.disabled,
+.catalog-product-new .actions-split.btn-round .action-default.primary[disabled],
+.catalog-product-new .actions-split.btn-round .action-default.primary.disabled,
+.catalog-product-edit .actions-split.btn-round .action-default.primary[disabled],
+.catalog-product-edit .actions-split.btn-round .action-default.primary.disabled,
+.catalog-product-index .actions-split.btn-round .action-default.primary[disabled],
+.catalog-product-index .actions-split.btn-round .action-default.primary.disabled,
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary[disabled],
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary.disabled {
+  cursor: not-allowed;
+  opacity: 0.5;
+  filter: progid:DXImageTransform.Microsoft.Alpha(opacity=50);
+}
+.DefaultButton[disabled]:hover,
+.DefaultButton.disabled:hover,
+.DefaultButton[disabled]:active,
+.DefaultButton.disabled:active,
+.PrimaryButton[disabled]:hover,
+.PrimaryButton.disabled:hover,
+.PrimaryButton[disabled]:active,
+.PrimaryButton.disabled:active,
+input[type=button][disabled]:hover,
+input[type=button].disabled:hover,
+input[type=button][disabled]:active,
+input[type=button].disabled:active,
+input[type=submit][disabled]:hover,
+input[type=submit].disabled:hover,
+input[type=submit][disabled]:active,
+input[type=submit].disabled:active,
+input[type=reset][disabled]:hover,
+input[type=reset].disabled:hover,
+input[type=reset][disabled]:active,
+input[type=reset].disabled:active,
+button[disabled]:hover,
+button.disabled:hover,
+button[disabled]:active,
+button.disabled:active,
+[class^="action-"][disabled]:hover,
+[class^="action-"].disabled:hover,
+[class^="action-"][disabled]:active,
+[class^="action-"].disabled:active,
+.popup-window .add-widget[disabled]:hover,
+.popup-window .add-widget.disabled:hover,
+.popup-window .add-widget[disabled]:active,
+.popup-window .add-widget.disabled:active,
+.PrimaryAddButton[disabled]:hover,
+.PrimaryAddButton.disabled:hover,
+.PrimaryAddButton[disabled]:active,
+.PrimaryAddButton.disabled:active,
+.PrimarySplitButton > .action-toggle.primary[disabled]:hover,
+.PrimarySplitButton > .action-toggle.primary.disabled:hover,
+.PrimarySplitButton > .action-toggle.primary[disabled]:active,
+.PrimarySplitButton > .action-toggle.primary.disabled:active,
+input[type=button].primary[disabled]:hover,
+input[type=button].primary.disabled:hover,
+input[type=button].primary[disabled]:active,
+input[type=button].primary.disabled:active,
+input[type=submit].primary[disabled]:hover,
+input[type=submit].primary.disabled:hover,
+input[type=submit].primary[disabled]:active,
+input[type=submit].primary.disabled:active,
+input[type=reset].primary[disabled]:hover,
+input[type=reset].primary.disabled:hover,
+input[type=reset].primary[disabled]:active,
+input[type=reset].primary.disabled:active,
+button.primary[disabled]:hover,
+button.primary.disabled:hover,
+button.primary[disabled]:active,
+button.primary.disabled:active,
+[class^="action-"].primary[disabled]:hover,
+[class^="action-"].primary.disabled:hover,
+[class^="action-"].primary[disabled]:active,
+[class^="action-"].primary.disabled:active,
+.popup-window .add-widget.primary[disabled]:hover,
+.popup-window .add-widget.primary.disabled:hover,
+.popup-window .add-widget.primary[disabled]:active,
+.popup-window .add-widget.primary.disabled:active,
+.PrimarySplitButton.btn-round .action-default.primary[disabled]:hover,
+.PrimarySplitButton.btn-round .action-default.primary.disabled:hover,
+.PrimarySplitButton.btn-round .action-default.primary[disabled]:active,
+.PrimarySplitButton.btn-round .action-default.primary.disabled:active,
+.sales-order-index .page-actions .add[disabled]:hover,
+.sales-order-index .page-actions .add.disabled:hover,
+.sales-order-index .page-actions .add[disabled]:active,
+.sales-order-index .page-actions .add.disabled:active,
+.adminhtml-rma-index .page-actions .add[disabled]:hover,
+.adminhtml-rma-index .page-actions .add.disabled:hover,
+.adminhtml-rma-index .page-actions .add[disabled]:active,
+.adminhtml-rma-index .page-actions .add.disabled:active,
+.adminhtml-catalog-event-index .page-actions .add[disabled]:hover,
+.adminhtml-catalog-event-index .page-actions .add.disabled:hover,
+.adminhtml-catalog-event-index .page-actions .add[disabled]:active,
+.adminhtml-catalog-event-index .page-actions .add.disabled:active,
+.adminhtml-urlrewrite-index .page-actions .add[disabled]:hover,
+.adminhtml-urlrewrite-index .page-actions .add.disabled:hover,
+.adminhtml-urlrewrite-index .page-actions .add[disabled]:active,
+.adminhtml-urlrewrite-index .page-actions .add.disabled:active,
+.catalog-search-index .page-actions .add[disabled]:hover,
+.catalog-search-index .page-actions .add.disabled:hover,
+.catalog-search-index .page-actions .add[disabled]:active,
+.catalog-search-index .page-actions .add.disabled:active,
+.catalog-product-review-index .page-actions .add[disabled]:hover,
+.catalog-product-review-index .page-actions .add.disabled:hover,
+.catalog-product-review-index .page-actions .add[disabled]:active,
+.catalog-product-review-index .page-actions .add.disabled:active,
+.catalog-rule-promo-catalog-index .page-actions .add[disabled]:hover,
+.catalog-rule-promo-catalog-index .page-actions .add.disabled:hover,
+.catalog-rule-promo-catalog-index .page-actions .add[disabled]:active,
+.catalog-rule-promo-catalog-index .page-actions .add.disabled:active,
+.sales-rule-promo-quote-index .page-actions .add[disabled]:hover,
+.sales-rule-promo-quote-index .page-actions .add.disabled:hover,
+.sales-rule-promo-quote-index .page-actions .add[disabled]:active,
+.sales-rule-promo-quote-index .page-actions .add.disabled:active,
+.adminhtml-reminder-index .page-actions .add[disabled]:hover,
+.adminhtml-reminder-index .page-actions .add.disabled:hover,
+.adminhtml-reminder-index .page-actions .add[disabled]:active,
+.adminhtml-reminder-index .page-actions .add.disabled:active,
+.newsletter-template-index .page-actions .add[disabled]:hover,
+.newsletter-template-index .page-actions .add.disabled:hover,
+.newsletter-template-index .page-actions .add[disabled]:active,
+.newsletter-template-index .page-actions .add.disabled:active,
+.adminhtml-system-email-template-index .page-actions .add[disabled]:hover,
+.adminhtml-system-email-template-index .page-actions .add.disabled:hover,
+.adminhtml-system-email-template-index .page-actions .add[disabled]:active,
+.adminhtml-system-email-template-index .page-actions .add.disabled:active,
+.adminhtml-sitemap-index .page-actions .add[disabled]:hover,
+.adminhtml-sitemap-index .page-actions .add.disabled:hover,
+.adminhtml-sitemap-index .page-actions .add[disabled]:active,
+.adminhtml-sitemap-index .page-actions .add.disabled:active,
+.adminhtml-googleshopping-types-index .page-actions .add[disabled]:hover,
+.adminhtml-googleshopping-types-index .page-actions .add.disabled:hover,
+.adminhtml-googleshopping-types-index .page-actions .add[disabled]:active,
+.adminhtml-googleshopping-types-index .page-actions .add.disabled:active,
+.customer-index-index .page-actions .add[disabled]:hover,
+.customer-index-index .page-actions .add.disabled:hover,
+.customer-index-index .page-actions .add[disabled]:active,
+.customer-index-index .page-actions .add.disabled:active,
+.adminhtml-cms-page-index .page-actions .add[disabled]:hover,
+.adminhtml-cms-page-index .page-actions .add.disabled:hover,
+.adminhtml-cms-page-index .page-actions .add[disabled]:active,
+.adminhtml-cms-page-index .page-actions .add.disabled:active,
+.cms-block-index .page-actions .add[disabled]:hover,
+.cms-block-index .page-actions .add.disabled:hover,
+.cms-block-index .page-actions .add[disabled]:active,
+.cms-block-index .page-actions .add.disabled:active,
+.adminhtml-banner-index .page-actions .add[disabled]:hover,
+.adminhtml-banner-index .page-actions .add.disabled:hover,
+.adminhtml-banner-index .page-actions .add[disabled]:active,
+.adminhtml-banner-index .page-actions .add.disabled:active,
+.adminhtml-widget-instance-index .page-actions .add[disabled]:hover,
+.adminhtml-widget-instance-index .page-actions .add.disabled:hover,
+.adminhtml-widget-instance-index .page-actions .add[disabled]:active,
+.adminhtml-widget-instance-index .page-actions .add.disabled:active,
+.cms-page-index .page-actions .add[disabled]:hover,
+.cms-page-index .page-actions .add.disabled:hover,
+.cms-page-index .page-actions .add[disabled]:active,
+.cms-page-index .page-actions .add.disabled:active,
+.adminhtml-webapi-user-index .page-actions .add[disabled]:hover,
+.adminhtml-webapi-user-index .page-actions .add.disabled:hover,
+.adminhtml-webapi-user-index .page-actions .add[disabled]:active,
+.adminhtml-webapi-user-index .page-actions .add.disabled:active,
+.adminhtml-webapi-role-index .page-actions .add[disabled]:hover,
+.adminhtml-webapi-role-index .page-actions .add.disabled:hover,
+.adminhtml-webapi-role-index .page-actions .add[disabled]:active,
+.adminhtml-webapi-role-index .page-actions .add.disabled:active,
+.adminhtml-system-variable-index .page-actions .add[disabled]:hover,
+.adminhtml-system-variable-index .page-actions .add.disabled:hover,
+.adminhtml-system-variable-index .page-actions .add[disabled]:active,
+.adminhtml-system-variable-index .page-actions .add.disabled:active,
+.adminhtml-user-index .page-actions .add[disabled]:hover,
+.adminhtml-user-index .page-actions .add.disabled:hover,
+.adminhtml-user-index .page-actions .add[disabled]:active,
+.adminhtml-user-index .page-actions .add.disabled:active,
+.adminhtml-user-role-index .page-actions .add[disabled]:hover,
+.adminhtml-user-role-index .page-actions .add.disabled:hover,
+.adminhtml-user-role-index .page-actions .add[disabled]:active,
+.adminhtml-user-role-index .page-actions .add.disabled:active,
+.adminhtml-integration-index .page-actions .add[disabled]:hover,
+.adminhtml-integration-index .page-actions .add.disabled:hover,
+.adminhtml-integration-index .page-actions .add[disabled]:active,
+.adminhtml-integration-index .page-actions .add.disabled:active,
+.adminhtml-system-design-theme-index .page-actions .add[disabled]:hover,
+.adminhtml-system-design-theme-index .page-actions .add.disabled:hover,
+.adminhtml-system-design-theme-index .page-actions .add[disabled]:active,
+.adminhtml-system-design-theme-index .page-actions .add.disabled:active,
+.adminhtml-system-design-index .page-actions .add[disabled]:hover,
+.adminhtml-system-design-index .page-actions .add.disabled:hover,
+.adminhtml-system-design-index .page-actions .add[disabled]:active,
+.adminhtml-system-design-index .page-actions .add.disabled:active,
+.adminhtml-customer-attribute-index .page-actions .add[disabled]:hover,
+.adminhtml-customer-attribute-index .page-actions .add.disabled:hover,
+.adminhtml-customer-attribute-index .page-actions .add[disabled]:active,
+.adminhtml-customer-attribute-index .page-actions .add.disabled:active,
+.adminhtml-customer-address-attribute-index .page-actions .add[disabled]:hover,
+.adminhtml-customer-address-attribute-index .page-actions .add.disabled:hover,
+.adminhtml-customer-address-attribute-index .page-actions .add[disabled]:active,
+.adminhtml-customer-address-attribute-index .page-actions .add.disabled:active,
+.rating-index-index .page-actions .add[disabled]:hover,
+.rating-index-index .page-actions .add.disabled:hover,
+.rating-index-index .page-actions .add[disabled]:active,
+.rating-index-index .page-actions .add.disabled:active,
+.tax-rule-index .page-actions .add[disabled]:hover,
+.tax-rule-index .page-actions .add.disabled:hover,
+.tax-rule-index .page-actions .add[disabled]:active,
+.tax-rule-index .page-actions .add.disabled:active,
+.tax-rate-index .page-actions .add[disabled]:hover,
+.tax-rate-index .page-actions .add.disabled:hover,
+.tax-rate-index .page-actions .add[disabled]:active,
+.tax-rate-index .page-actions .add.disabled:active,
+.adminhtml-rma-item-attribute-index .page-actions .add[disabled]:hover,
+.adminhtml-rma-item-attribute-index .page-actions .add.disabled:hover,
+.adminhtml-rma-item-attribute-index .page-actions .add[disabled]:active,
+.adminhtml-rma-item-attribute-index .page-actions .add.disabled:active,
+.adminhtml-reward-rate-index .page-actions .add[disabled]:hover,
+.adminhtml-reward-rate-index .page-actions .add.disabled:hover,
+.adminhtml-reward-rate-index .page-actions .add[disabled]:active,
+.adminhtml-reward-rate-index .page-actions .add.disabled:active,
+.customer-group-index .page-actions .add[disabled]:hover,
+.customer-group-index .page-actions .add.disabled:hover,
+.customer-group-index .page-actions .add[disabled]:active,
+.customer-group-index .page-actions .add.disabled:active,
+.checkout-agreement-index .page-actions .add[disabled]:hover,
+.checkout-agreement-index .page-actions .add.disabled:hover,
+.checkout-agreement-index .page-actions .add[disabled]:active,
+.checkout-agreement-index .page-actions .add.disabled:active,
+.catalog-product-attribute-index .page-actions .add[disabled]:hover,
+.catalog-product-attribute-index .page-actions .add.disabled:hover,
+.catalog-product-attribute-index .page-actions .add[disabled]:active,
+.catalog-product-attribute-index .page-actions .add.disabled:active,
+.catalog-product-set-index .page-actions .add[disabled]:hover,
+.catalog-product-set-index .page-actions .add.disabled:hover,
+.catalog-product-set-index .page-actions .add[disabled]:active,
+.catalog-product-set-index .page-actions .add.disabled:active,
+.catalog-product-new .actions-split > .action-toggle.primary[disabled]:hover,
+.catalog-product-new .actions-split > .action-toggle.primary.disabled:hover,
+.catalog-product-new .actions-split > .action-toggle.primary[disabled]:active,
+.catalog-product-new .actions-split > .action-toggle.primary.disabled:active,
+.catalog-product-edit .actions-split > .action-toggle.primary[disabled]:hover,
+.catalog-product-edit .actions-split > .action-toggle.primary.disabled:hover,
+.catalog-product-edit .actions-split > .action-toggle.primary[disabled]:active,
+.catalog-product-edit .actions-split > .action-toggle.primary.disabled:active,
+.catalog-product-index .actions-split > .action-toggle.primary[disabled]:hover,
+.catalog-product-index .actions-split > .action-toggle.primary.disabled:hover,
+.catalog-product-index .actions-split > .action-toggle.primary[disabled]:active,
+.catalog-product-index .actions-split > .action-toggle.primary.disabled:active,
+.adminhtml-integration-new .actions-split > .action-toggle.primary[disabled]:hover,
+.adminhtml-integration-new .actions-split > .action-toggle.primary.disabled:hover,
+.adminhtml-integration-new .actions-split > .action-toggle.primary[disabled]:active,
+.adminhtml-integration-new .actions-split > .action-toggle.primary.disabled:active,
+.catalog-product-new .actions-split.btn-round .action-default.primary[disabled]:hover,
+.catalog-product-new .actions-split.btn-round .action-default.primary.disabled:hover,
+.catalog-product-new .actions-split.btn-round .action-default.primary[disabled]:active,
+.catalog-product-new .actions-split.btn-round .action-default.primary.disabled:active,
+.catalog-product-edit .actions-split.btn-round .action-default.primary[disabled]:hover,
+.catalog-product-edit .actions-split.btn-round .action-default.primary.disabled:hover,
+.catalog-product-edit .actions-split.btn-round .action-default.primary[disabled]:active,
+.catalog-product-edit .actions-split.btn-round .action-default.primary.disabled:active,
+.catalog-product-index .actions-split.btn-round .action-default.primary[disabled]:hover,
+.catalog-product-index .actions-split.btn-round .action-default.primary.disabled:hover,
+.catalog-product-index .actions-split.btn-round .action-default.primary[disabled]:active,
+.catalog-product-index .actions-split.btn-round .action-default.primary.disabled:active,
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary[disabled]:hover,
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary.disabled:hover,
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary[disabled]:active,
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary.disabled:active {
+  color: #676056;
+  background: #f2ebde;
+  border: 1px solid #ada89e;
+}
+.PrimaryButton,
+.PrimaryAddButton,
+.PrimarySplitButton > .action-toggle.primary,
+input[type=button].primary,
+input[type=submit].primary,
+input[type=reset].primary,
+button.primary,
+[class^="action-"].primary,
+.popup-window .add-widget.primary,
+.PrimarySplitButton.btn-round .action-default.primary,
+.sales-order-index .page-actions .add,
+.adminhtml-rma-index .page-actions .add,
+.adminhtml-catalog-event-index .page-actions .add,
+.adminhtml-urlrewrite-index .page-actions .add,
+.catalog-search-index .page-actions .add,
+.catalog-product-review-index .page-actions .add,
+.catalog-rule-promo-catalog-index .page-actions .add,
+.sales-rule-promo-quote-index .page-actions .add,
+.adminhtml-reminder-index .page-actions .add,
+.newsletter-template-index .page-actions .add,
+.adminhtml-system-email-template-index .page-actions .add,
+.adminhtml-sitemap-index .page-actions .add,
+.adminhtml-googleshopping-types-index .page-actions .add,
+.customer-index-index .page-actions .add,
+.adminhtml-cms-page-index .page-actions .add,
+.cms-block-index .page-actions .add,
+.adminhtml-banner-index .page-actions .add,
+.adminhtml-widget-instance-index .page-actions .add,
+.cms-page-index .page-actions .add,
+.adminhtml-webapi-user-index .page-actions .add,
+.adminhtml-webapi-role-index .page-actions .add,
+.adminhtml-system-variable-index .page-actions .add,
+.adminhtml-user-index .page-actions .add,
+.adminhtml-user-role-index .page-actions .add,
+.adminhtml-integration-index .page-actions .add,
+.adminhtml-system-design-theme-index .page-actions .add,
+.adminhtml-system-design-index .page-actions .add,
+.adminhtml-customer-attribute-index .page-actions .add,
+.adminhtml-customer-address-attribute-index .page-actions .add,
+.rating-index-index .page-actions .add,
+.tax-rule-index .page-actions .add,
+.tax-rate-index .page-actions .add,
+.adminhtml-rma-item-attribute-index .page-actions .add,
+.adminhtml-reward-rate-index .page-actions .add,
+.customer-group-index .page-actions .add,
+.checkout-agreement-index .page-actions .add,
+.catalog-product-attribute-index .page-actions .add,
+.catalog-product-set-index .page-actions .add,
+.catalog-product-new .actions-split > .action-toggle.primary,
+.catalog-product-edit .actions-split > .action-toggle.primary,
+.catalog-product-index .actions-split > .action-toggle.primary,
+.adminhtml-integration-new .actions-split > .action-toggle.primary,
+.catalog-product-new .actions-split.btn-round .action-default.primary,
+.catalog-product-edit .actions-split.btn-round .action-default.primary,
+.catalog-product-index .actions-split.btn-round .action-default.primary,
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary,
+.PrimaryAddButton,
+.PrimarySplitButton > .action-toggle.primary,
+input[type=button].primary,
+input[type=submit].primary,
+input[type=reset].primary,
+button.primary,
+[class^="action-"].primary,
+.popup-window .add-widget.primary,
+.PrimarySplitButton.btn-round .action-default.primary,
+.sales-order-index .page-actions .add,
+.adminhtml-rma-index .page-actions .add,
+.adminhtml-catalog-event-index .page-actions .add,
+.adminhtml-urlrewrite-index .page-actions .add,
+.catalog-search-index .page-actions .add,
+.catalog-product-review-index .page-actions .add,
+.catalog-rule-promo-catalog-index .page-actions .add,
+.sales-rule-promo-quote-index .page-actions .add,
+.adminhtml-reminder-index .page-actions .add,
+.newsletter-template-index .page-actions .add,
+.adminhtml-system-email-template-index .page-actions .add,
+.adminhtml-sitemap-index .page-actions .add,
+.adminhtml-googleshopping-types-index .page-actions .add,
+.customer-index-index .page-actions .add,
+.adminhtml-cms-page-index .page-actions .add,
+.cms-block-index .page-actions .add,
+.adminhtml-banner-index .page-actions .add,
+.adminhtml-widget-instance-index .page-actions .add,
+.cms-page-index .page-actions .add,
+.adminhtml-webapi-user-index .page-actions .add,
+.adminhtml-webapi-role-index .page-actions .add,
+.adminhtml-system-variable-index .page-actions .add,
+.adminhtml-user-index .page-actions .add,
+.adminhtml-user-role-index .page-actions .add,
+.adminhtml-integration-index .page-actions .add,
+.adminhtml-system-design-theme-index .page-actions .add,
+.adminhtml-system-design-index .page-actions .add,
+.adminhtml-customer-attribute-index .page-actions .add,
+.adminhtml-customer-address-attribute-index .page-actions .add,
+.rating-index-index .page-actions .add,
+.tax-rule-index .page-actions .add,
+.tax-rate-index .page-actions .add,
+.adminhtml-rma-item-attribute-index .page-actions .add,
+.adminhtml-reward-rate-index .page-actions .add,
+.customer-group-index .page-actions .add,
+.checkout-agreement-index .page-actions .add,
+.catalog-product-attribute-index .page-actions .add,
+.catalog-product-set-index .page-actions .add,
+.catalog-product-new .actions-split > .action-toggle.primary,
+.catalog-product-edit .actions-split > .action-toggle.primary,
+.catalog-product-index .actions-split > .action-toggle.primary,
+.adminhtml-integration-new .actions-split > .action-toggle.primary,
+.catalog-product-new .actions-split.btn-round .action-default.primary,
+.catalog-product-edit .actions-split.btn-round .action-default.primary,
+.catalog-product-index .actions-split.btn-round .action-default.primary,
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary {
+  color: #fff;
+  background: #007dbd;
+  border: 1px solid #0574ad;
+}
+.PrimaryButton:focus,
+.PrimaryButton:hover,
+.PrimaryAddButton:focus,
+.PrimaryAddButton:hover,
+.PrimarySplitButton > .action-toggle.primary:focus,
+.PrimarySplitButton > .action-toggle.primary:hover,
+input[type=button].primary:focus,
+input[type=button].primary:hover,
+input[type=submit].primary:focus,
+input[type=submit].primary:hover,
+input[type=reset].primary:focus,
+input[type=reset].primary:hover,
+button.primary:focus,
+button.primary:hover,
+[class^="action-"].primary:focus,
+[class^="action-"].primary:hover,
+.popup-window .add-widget.primary:focus,
+.popup-window .add-widget.primary:hover,
+.PrimarySplitButton.btn-round .action-default.primary:focus,
+.PrimarySplitButton.btn-round .action-default.primary:hover,
+.sales-order-index .page-actions .add:focus,
+.sales-order-index .page-actions .add:hover,
+.adminhtml-rma-index .page-actions .add:focus,
+.adminhtml-rma-index .page-actions .add:hover,
+.adminhtml-catalog-event-index .page-actions .add:focus,
+.adminhtml-catalog-event-index .page-actions .add:hover,
+.adminhtml-urlrewrite-index .page-actions .add:focus,
+.adminhtml-urlrewrite-index .page-actions .add:hover,
+.catalog-search-index .page-actions .add:focus,
+.catalog-search-index .page-actions .add:hover,
+.catalog-product-review-index .page-actions .add:focus,
+.catalog-product-review-index .page-actions .add:hover,
+.catalog-rule-promo-catalog-index .page-actions .add:focus,
+.catalog-rule-promo-catalog-index .page-actions .add:hover,
+.sales-rule-promo-quote-index .page-actions .add:focus,
+.sales-rule-promo-quote-index .page-actions .add:hover,
+.adminhtml-reminder-index .page-actions .add:focus,
+.adminhtml-reminder-index .page-actions .add:hover,
+.newsletter-template-index .page-actions .add:focus,
+.newsletter-template-index .page-actions .add:hover,
+.adminhtml-system-email-template-index .page-actions .add:focus,
+.adminhtml-system-email-template-index .page-actions .add:hover,
+.adminhtml-sitemap-index .page-actions .add:focus,
+.adminhtml-sitemap-index .page-actions .add:hover,
+.adminhtml-googleshopping-types-index .page-actions .add:focus,
+.adminhtml-googleshopping-types-index .page-actions .add:hover,
+.customer-index-index .page-actions .add:focus,
+.customer-index-index .page-actions .add:hover,
+.adminhtml-cms-page-index .page-actions .add:focus,
+.adminhtml-cms-page-index .page-actions .add:hover,
+.cms-block-index .page-actions .add:focus,
+.cms-block-index .page-actions .add:hover,
+.adminhtml-banner-index .page-actions .add:focus,
+.adminhtml-banner-index .page-actions .add:hover,
+.adminhtml-widget-instance-index .page-actions .add:focus,
+.adminhtml-widget-instance-index .page-actions .add:hover,
+.cms-page-index .page-actions .add:focus,
+.cms-page-index .page-actions .add:hover,
+.adminhtml-webapi-user-index .page-actions .add:focus,
+.adminhtml-webapi-user-index .page-actions .add:hover,
+.adminhtml-webapi-role-index .page-actions .add:focus,
+.adminhtml-webapi-role-index .page-actions .add:hover,
+.adminhtml-system-variable-index .page-actions .add:focus,
+.adminhtml-system-variable-index .page-actions .add:hover,
+.adminhtml-user-index .page-actions .add:focus,
+.adminhtml-user-index .page-actions .add:hover,
+.adminhtml-user-role-index .page-actions .add:focus,
+.adminhtml-user-role-index .page-actions .add:hover,
+.adminhtml-integration-index .page-actions .add:focus,
+.adminhtml-integration-index .page-actions .add:hover,
+.adminhtml-system-design-theme-index .page-actions .add:focus,
+.adminhtml-system-design-theme-index .page-actions .add:hover,
+.adminhtml-system-design-index .page-actions .add:focus,
+.adminhtml-system-design-index .page-actions .add:hover,
+.adminhtml-customer-attribute-index .page-actions .add:focus,
+.adminhtml-customer-attribute-index .page-actions .add:hover,
+.adminhtml-customer-address-attribute-index .page-actions .add:focus,
+.adminhtml-customer-address-attribute-index .page-actions .add:hover,
+.rating-index-index .page-actions .add:focus,
+.rating-index-index .page-actions .add:hover,
+.tax-rule-index .page-actions .add:focus,
+.tax-rule-index .page-actions .add:hover,
+.tax-rate-index .page-actions .add:focus,
+.tax-rate-index .page-actions .add:hover,
+.adminhtml-rma-item-attribute-index .page-actions .add:focus,
+.adminhtml-rma-item-attribute-index .page-actions .add:hover,
+.adminhtml-reward-rate-index .page-actions .add:focus,
+.adminhtml-reward-rate-index .page-actions .add:hover,
+.customer-group-index .page-actions .add:focus,
+.customer-group-index .page-actions .add:hover,
+.checkout-agreement-index .page-actions .add:focus,
+.checkout-agreement-index .page-actions .add:hover,
+.catalog-product-attribute-index .page-actions .add:focus,
+.catalog-product-attribute-index .page-actions .add:hover,
+.catalog-product-set-index .page-actions .add:focus,
+.catalog-product-set-index .page-actions .add:hover,
+.catalog-product-new .actions-split > .action-toggle.primary:focus,
+.catalog-product-new .actions-split > .action-toggle.primary:hover,
+.catalog-product-edit .actions-split > .action-toggle.primary:focus,
+.catalog-product-edit .actions-split > .action-toggle.primary:hover,
+.catalog-product-index .actions-split > .action-toggle.primary:focus,
+.catalog-product-index .actions-split > .action-toggle.primary:hover,
+.adminhtml-integration-new .actions-split > .action-toggle.primary:focus,
+.adminhtml-integration-new .actions-split > .action-toggle.primary:hover,
+.catalog-product-new .actions-split.btn-round .action-default.primary:focus,
+.catalog-product-new .actions-split.btn-round .action-default.primary:hover,
+.catalog-product-edit .actions-split.btn-round .action-default.primary:focus,
+.catalog-product-edit .actions-split.btn-round .action-default.primary:hover,
+.catalog-product-index .actions-split.btn-round .action-default.primary:focus,
+.catalog-product-index .actions-split.btn-round .action-default.primary:hover,
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary:focus,
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary:hover {
+  color: #fff;
+  background: #026294;
+  border: 1px solid #026294;
+}
+.PrimaryButton:active,
+.PrimaryAddButton:active,
+.PrimarySplitButton > .action-toggle.primary:active,
+input[type=button].primary:active,
+input[type=submit].primary:active,
+input[type=reset].primary:active,
+button.primary:active,
+[class^="action-"].primary:active,
+.popup-window .add-widget.primary:active,
+.PrimarySplitButton.btn-round .action-default.primary:active,
+.sales-order-index .page-actions .add:active,
+.adminhtml-rma-index .page-actions .add:active,
+.adminhtml-catalog-event-index .page-actions .add:active,
+.adminhtml-urlrewrite-index .page-actions .add:active,
+.catalog-search-index .page-actions .add:active,
+.catalog-product-review-index .page-actions .add:active,
+.catalog-rule-promo-catalog-index .page-actions .add:active,
+.sales-rule-promo-quote-index .page-actions .add:active,
+.adminhtml-reminder-index .page-actions .add:active,
+.newsletter-template-index .page-actions .add:active,
+.adminhtml-system-email-template-index .page-actions .add:active,
+.adminhtml-sitemap-index .page-actions .add:active,
+.adminhtml-googleshopping-types-index .page-actions .add:active,
+.customer-index-index .page-actions .add:active,
+.adminhtml-cms-page-index .page-actions .add:active,
+.cms-block-index .page-actions .add:active,
+.adminhtml-banner-index .page-actions .add:active,
+.adminhtml-widget-instance-index .page-actions .add:active,
+.cms-page-index .page-actions .add:active,
+.adminhtml-webapi-user-index .page-actions .add:active,
+.adminhtml-webapi-role-index .page-actions .add:active,
+.adminhtml-system-variable-index .page-actions .add:active,
+.adminhtml-user-index .page-actions .add:active,
+.adminhtml-user-role-index .page-actions .add:active,
+.adminhtml-integration-index .page-actions .add:active,
+.adminhtml-system-design-theme-index .page-actions .add:active,
+.adminhtml-system-design-index .page-actions .add:active,
+.adminhtml-customer-attribute-index .page-actions .add:active,
+.adminhtml-customer-address-attribute-index .page-actions .add:active,
+.rating-index-index .page-actions .add:active,
+.tax-rule-index .page-actions .add:active,
+.tax-rate-index .page-actions .add:active,
+.adminhtml-rma-item-attribute-index .page-actions .add:active,
+.adminhtml-reward-rate-index .page-actions .add:active,
+.customer-group-index .page-actions .add:active,
+.checkout-agreement-index .page-actions .add:active,
+.catalog-product-attribute-index .page-actions .add:active,
+.catalog-product-set-index .page-actions .add:active,
+.catalog-product-new .actions-split > .action-toggle.primary:active,
+.catalog-product-edit .actions-split > .action-toggle.primary:active,
+.catalog-product-index .actions-split > .action-toggle.primary:active,
+.adminhtml-integration-new .actions-split > .action-toggle.primary:active,
+.catalog-product-new .actions-split.btn-round .action-default.primary:active,
+.catalog-product-edit .actions-split.btn-round .action-default.primary:active,
+.catalog-product-index .actions-split.btn-round .action-default.primary:active,
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary:active {
+  color: #fff;
+  background: #026294;
+  border: 1px solid #004c74;
+}
+.PrimaryButton:visited,
+.PrimaryAddButton:visited,
+.PrimarySplitButton > .action-toggle.primary:visited,
+input[type=button].primary:visited,
+input[type=submit].primary:visited,
+input[type=reset].primary:visited,
+button.primary:visited,
+[class^="action-"].primary:visited,
+.popup-window .add-widget.primary:visited,
+.PrimarySplitButton.btn-round .action-default.primary:visited,
+.sales-order-index .page-actions .add:visited,
+.adminhtml-rma-index .page-actions .add:visited,
+.adminhtml-catalog-event-index .page-actions .add:visited,
+.adminhtml-urlrewrite-index .page-actions .add:visited,
+.catalog-search-index .page-actions .add:visited,
+.catalog-product-review-index .page-actions .add:visited,
+.catalog-rule-promo-catalog-index .page-actions .add:visited,
+.sales-rule-promo-quote-index .page-actions .add:visited,
+.adminhtml-reminder-index .page-actions .add:visited,
+.newsletter-template-index .page-actions .add:visited,
+.adminhtml-system-email-template-index .page-actions .add:visited,
+.adminhtml-sitemap-index .page-actions .add:visited,
+.adminhtml-googleshopping-types-index .page-actions .add:visited,
+.customer-index-index .page-actions .add:visited,
+.adminhtml-cms-page-index .page-actions .add:visited,
+.cms-block-index .page-actions .add:visited,
+.adminhtml-banner-index .page-actions .add:visited,
+.adminhtml-widget-instance-index .page-actions .add:visited,
+.cms-page-index .page-actions .add:visited,
+.adminhtml-webapi-user-index .page-actions .add:visited,
+.adminhtml-webapi-role-index .page-actions .add:visited,
+.adminhtml-system-variable-index .page-actions .add:visited,
+.adminhtml-user-index .page-actions .add:visited,
+.adminhtml-user-role-index .page-actions .add:visited,
+.adminhtml-integration-index .page-actions .add:visited,
+.adminhtml-system-design-theme-index .page-actions .add:visited,
+.adminhtml-system-design-index .page-actions .add:visited,
+.adminhtml-customer-attribute-index .page-actions .add:visited,
+.adminhtml-customer-address-attribute-index .page-actions .add:visited,
+.rating-index-index .page-actions .add:visited,
+.tax-rule-index .page-actions .add:visited,
+.tax-rate-index .page-actions .add:visited,
+.adminhtml-rma-item-attribute-index .page-actions .add:visited,
+.adminhtml-reward-rate-index .page-actions .add:visited,
+.customer-group-index .page-actions .add:visited,
+.checkout-agreement-index .page-actions .add:visited,
+.catalog-product-attribute-index .page-actions .add:visited,
+.catalog-product-set-index .page-actions .add:visited,
+.catalog-product-new .actions-split > .action-toggle.primary:visited,
+.catalog-product-edit .actions-split > .action-toggle.primary:visited,
+.catalog-product-index .actions-split > .action-toggle.primary:visited,
+.adminhtml-integration-new .actions-split > .action-toggle.primary:visited,
+.catalog-product-new .actions-split.btn-round .action-default.primary:visited,
+.catalog-product-edit .actions-split.btn-round .action-default.primary:visited,
+.catalog-product-index .actions-split.btn-round .action-default.primary:visited,
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary:visited {
+  color: #fff;
+}
+.PrimaryButton[disabled]:hover,
+.PrimaryButton.disabled:hover,
+.PrimaryButton[disabled]:active,
+.PrimaryButton.disabled:active,
+.PrimaryAddButton[disabled]:hover,
+.PrimaryAddButton.disabled:hover,
+.PrimaryAddButton[disabled]:active,
+.PrimaryAddButton.disabled:active,
+.PrimarySplitButton > .action-toggle.primary[disabled]:hover,
+.PrimarySplitButton > .action-toggle.primary.disabled:hover,
+.PrimarySplitButton > .action-toggle.primary[disabled]:active,
+.PrimarySplitButton > .action-toggle.primary.disabled:active,
+input[type=button].primary[disabled]:hover,
+input[type=button].primary.disabled:hover,
+input[type=button].primary[disabled]:active,
+input[type=button].primary.disabled:active,
+input[type=submit].primary[disabled]:hover,
+input[type=submit].primary.disabled:hover,
+input[type=submit].primary[disabled]:active,
+input[type=submit].primary.disabled:active,
+input[type=reset].primary[disabled]:hover,
+input[type=reset].primary.disabled:hover,
+input[type=reset].primary[disabled]:active,
+input[type=reset].primary.disabled:active,
+button.primary[disabled]:hover,
+button.primary.disabled:hover,
+button.primary[disabled]:active,
+button.primary.disabled:active,
+[class^="action-"].primary[disabled]:hover,
+[class^="action-"].primary.disabled:hover,
+[class^="action-"].primary[disabled]:active,
+[class^="action-"].primary.disabled:active,
+.popup-window .add-widget.primary[disabled]:hover,
+.popup-window .add-widget.primary.disabled:hover,
+.popup-window .add-widget.primary[disabled]:active,
+.popup-window .add-widget.primary.disabled:active,
+.PrimarySplitButton.btn-round .action-default.primary[disabled]:hover,
+.PrimarySplitButton.btn-round .action-default.primary.disabled:hover,
+.PrimarySplitButton.btn-round .action-default.primary[disabled]:active,
+.PrimarySplitButton.btn-round .action-default.primary.disabled:active,
+.sales-order-index .page-actions .add[disabled]:hover,
+.sales-order-index .page-actions .add.disabled:hover,
+.sales-order-index .page-actions .add[disabled]:active,
+.sales-order-index .page-actions .add.disabled:active,
+.adminhtml-rma-index .page-actions .add[disabled]:hover,
+.adminhtml-rma-index .page-actions .add.disabled:hover,
+.adminhtml-rma-index .page-actions .add[disabled]:active,
+.adminhtml-rma-index .page-actions .add.disabled:active,
+.adminhtml-catalog-event-index .page-actions .add[disabled]:hover,
+.adminhtml-catalog-event-index .page-actions .add.disabled:hover,
+.adminhtml-catalog-event-index .page-actions .add[disabled]:active,
+.adminhtml-catalog-event-index .page-actions .add.disabled:active,
+.adminhtml-urlrewrite-index .page-actions .add[disabled]:hover,
+.adminhtml-urlrewrite-index .page-actions .add.disabled:hover,
+.adminhtml-urlrewrite-index .page-actions .add[disabled]:active,
+.adminhtml-urlrewrite-index .page-actions .add.disabled:active,
+.catalog-search-index .page-actions .add[disabled]:hover,
+.catalog-search-index .page-actions .add.disabled:hover,
+.catalog-search-index .page-actions .add[disabled]:active,
+.catalog-search-index .page-actions .add.disabled:active,
+.catalog-product-review-index .page-actions .add[disabled]:hover,
+.catalog-product-review-index .page-actions .add.disabled:hover,
+.catalog-product-review-index .page-actions .add[disabled]:active,
+.catalog-product-review-index .page-actions .add.disabled:active,
+.catalog-rule-promo-catalog-index .page-actions .add[disabled]:hover,
+.catalog-rule-promo-catalog-index .page-actions .add.disabled:hover,
+.catalog-rule-promo-catalog-index .page-actions .add[disabled]:active,
+.catalog-rule-promo-catalog-index .page-actions .add.disabled:active,
+.sales-rule-promo-quote-index .page-actions .add[disabled]:hover,
+.sales-rule-promo-quote-index .page-actions .add.disabled:hover,
+.sales-rule-promo-quote-index .page-actions .add[disabled]:active,
+.sales-rule-promo-quote-index .page-actions .add.disabled:active,
+.adminhtml-reminder-index .page-actions .add[disabled]:hover,
+.adminhtml-reminder-index .page-actions .add.disabled:hover,
+.adminhtml-reminder-index .page-actions .add[disabled]:active,
+.adminhtml-reminder-index .page-actions .add.disabled:active,
+.newsletter-template-index .page-actions .add[disabled]:hover,
+.newsletter-template-index .page-actions .add.disabled:hover,
+.newsletter-template-index .page-actions .add[disabled]:active,
+.newsletter-template-index .page-actions .add.disabled:active,
+.adminhtml-system-email-template-index .page-actions .add[disabled]:hover,
+.adminhtml-system-email-template-index .page-actions .add.disabled:hover,
+.adminhtml-system-email-template-index .page-actions .add[disabled]:active,
+.adminhtml-system-email-template-index .page-actions .add.disabled:active,
+.adminhtml-sitemap-index .page-actions .add[disabled]:hover,
+.adminhtml-sitemap-index .page-actions .add.disabled:hover,
+.adminhtml-sitemap-index .page-actions .add[disabled]:active,
+.adminhtml-sitemap-index .page-actions .add.disabled:active,
+.adminhtml-googleshopping-types-index .page-actions .add[disabled]:hover,
+.adminhtml-googleshopping-types-index .page-actions .add.disabled:hover,
+.adminhtml-googleshopping-types-index .page-actions .add[disabled]:active,
+.adminhtml-googleshopping-types-index .page-actions .add.disabled:active,
+.customer-index-index .page-actions .add[disabled]:hover,
+.customer-index-index .page-actions .add.disabled:hover,
+.customer-index-index .page-actions .add[disabled]:active,
+.customer-index-index .page-actions .add.disabled:active,
+.adminhtml-cms-page-index .page-actions .add[disabled]:hover,
+.adminhtml-cms-page-index .page-actions .add.disabled:hover,
+.adminhtml-cms-page-index .page-actions .add[disabled]:active,
+.adminhtml-cms-page-index .page-actions .add.disabled:active,
+.cms-block-index .page-actions .add[disabled]:hover,
+.cms-block-index .page-actions .add.disabled:hover,
+.cms-block-index .page-actions .add[disabled]:active,
+.cms-block-index .page-actions .add.disabled:active,
+.adminhtml-banner-index .page-actions .add[disabled]:hover,
+.adminhtml-banner-index .page-actions .add.disabled:hover,
+.adminhtml-banner-index .page-actions .add[disabled]:active,
+.adminhtml-banner-index .page-actions .add.disabled:active,
+.adminhtml-widget-instance-index .page-actions .add[disabled]:hover,
+.adminhtml-widget-instance-index .page-actions .add.disabled:hover,
+.adminhtml-widget-instance-index .page-actions .add[disabled]:active,
+.adminhtml-widget-instance-index .page-actions .add.disabled:active,
+.cms-page-index .page-actions .add[disabled]:hover,
+.cms-page-index .page-actions .add.disabled:hover,
+.cms-page-index .page-actions .add[disabled]:active,
+.cms-page-index .page-actions .add.disabled:active,
+.adminhtml-webapi-user-index .page-actions .add[disabled]:hover,
+.adminhtml-webapi-user-index .page-actions .add.disabled:hover,
+.adminhtml-webapi-user-index .page-actions .add[disabled]:active,
+.adminhtml-webapi-user-index .page-actions .add.disabled:active,
+.adminhtml-webapi-role-index .page-actions .add[disabled]:hover,
+.adminhtml-webapi-role-index .page-actions .add.disabled:hover,
+.adminhtml-webapi-role-index .page-actions .add[disabled]:active,
+.adminhtml-webapi-role-index .page-actions .add.disabled:active,
+.adminhtml-system-variable-index .page-actions .add[disabled]:hover,
+.adminhtml-system-variable-index .page-actions .add.disabled:hover,
+.adminhtml-system-variable-index .page-actions .add[disabled]:active,
+.adminhtml-system-variable-index .page-actions .add.disabled:active,
+.adminhtml-user-index .page-actions .add[disabled]:hover,
+.adminhtml-user-index .page-actions .add.disabled:hover,
+.adminhtml-user-index .page-actions .add[disabled]:active,
+.adminhtml-user-index .page-actions .add.disabled:active,
+.adminhtml-user-role-index .page-actions .add[disabled]:hover,
+.adminhtml-user-role-index .page-actions .add.disabled:hover,
+.adminhtml-user-role-index .page-actions .add[disabled]:active,
+.adminhtml-user-role-index .page-actions .add.disabled:active,
+.adminhtml-integration-index .page-actions .add[disabled]:hover,
+.adminhtml-integration-index .page-actions .add.disabled:hover,
+.adminhtml-integration-index .page-actions .add[disabled]:active,
+.adminhtml-integration-index .page-actions .add.disabled:active,
+.adminhtml-system-design-theme-index .page-actions .add[disabled]:hover,
+.adminhtml-system-design-theme-index .page-actions .add.disabled:hover,
+.adminhtml-system-design-theme-index .page-actions .add[disabled]:active,
+.adminhtml-system-design-theme-index .page-actions .add.disabled:active,
+.adminhtml-system-design-index .page-actions .add[disabled]:hover,
+.adminhtml-system-design-index .page-actions .add.disabled:hover,
+.adminhtml-system-design-index .page-actions .add[disabled]:active,
+.adminhtml-system-design-index .page-actions .add.disabled:active,
+.adminhtml-customer-attribute-index .page-actions .add[disabled]:hover,
+.adminhtml-customer-attribute-index .page-actions .add.disabled:hover,
+.adminhtml-customer-attribute-index .page-actions .add[disabled]:active,
+.adminhtml-customer-attribute-index .page-actions .add.disabled:active,
+.adminhtml-customer-address-attribute-index .page-actions .add[disabled]:hover,
+.adminhtml-customer-address-attribute-index .page-actions .add.disabled:hover,
+.adminhtml-customer-address-attribute-index .page-actions .add[disabled]:active,
+.adminhtml-customer-address-attribute-index .page-actions .add.disabled:active,
+.rating-index-index .page-actions .add[disabled]:hover,
+.rating-index-index .page-actions .add.disabled:hover,
+.rating-index-index .page-actions .add[disabled]:active,
+.rating-index-index .page-actions .add.disabled:active,
+.tax-rule-index .page-actions .add[disabled]:hover,
+.tax-rule-index .page-actions .add.disabled:hover,
+.tax-rule-index .page-actions .add[disabled]:active,
+.tax-rule-index .page-actions .add.disabled:active,
+.tax-rate-index .page-actions .add[disabled]:hover,
+.tax-rate-index .page-actions .add.disabled:hover,
+.tax-rate-index .page-actions .add[disabled]:active,
+.tax-rate-index .page-actions .add.disabled:active,
+.adminhtml-rma-item-attribute-index .page-actions .add[disabled]:hover,
+.adminhtml-rma-item-attribute-index .page-actions .add.disabled:hover,
+.adminhtml-rma-item-attribute-index .page-actions .add[disabled]:active,
+.adminhtml-rma-item-attribute-index .page-actions .add.disabled:active,
+.adminhtml-reward-rate-index .page-actions .add[disabled]:hover,
+.adminhtml-reward-rate-index .page-actions .add.disabled:hover,
+.adminhtml-reward-rate-index .page-actions .add[disabled]:active,
+.adminhtml-reward-rate-index .page-actions .add.disabled:active,
+.customer-group-index .page-actions .add[disabled]:hover,
+.customer-group-index .page-actions .add.disabled:hover,
+.customer-group-index .page-actions .add[disabled]:active,
+.customer-group-index .page-actions .add.disabled:active,
+.checkout-agreement-index .page-actions .add[disabled]:hover,
+.checkout-agreement-index .page-actions .add.disabled:hover,
+.checkout-agreement-index .page-actions .add[disabled]:active,
+.checkout-agreement-index .page-actions .add.disabled:active,
+.catalog-product-attribute-index .page-actions .add[disabled]:hover,
+.catalog-product-attribute-index .page-actions .add.disabled:hover,
+.catalog-product-attribute-index .page-actions .add[disabled]:active,
+.catalog-product-attribute-index .page-actions .add.disabled:active,
+.catalog-product-set-index .page-actions .add[disabled]:hover,
+.catalog-product-set-index .page-actions .add.disabled:hover,
+.catalog-product-set-index .page-actions .add[disabled]:active,
+.catalog-product-set-index .page-actions .add.disabled:active,
+.catalog-product-new .actions-split > .action-toggle.primary[disabled]:hover,
+.catalog-product-new .actions-split > .action-toggle.primary.disabled:hover,
+.catalog-product-new .actions-split > .action-toggle.primary[disabled]:active,
+.catalog-product-new .actions-split > .action-toggle.primary.disabled:active,
+.catalog-product-edit .actions-split > .action-toggle.primary[disabled]:hover,
+.catalog-product-edit .actions-split > .action-toggle.primary.disabled:hover,
+.catalog-product-edit .actions-split > .action-toggle.primary[disabled]:active,
+.catalog-product-edit .actions-split > .action-toggle.primary.disabled:active,
+.catalog-product-index .actions-split > .action-toggle.primary[disabled]:hover,
+.catalog-product-index .actions-split > .action-toggle.primary.disabled:hover,
+.catalog-product-index .actions-split > .action-toggle.primary[disabled]:active,
+.catalog-product-index .actions-split > .action-toggle.primary.disabled:active,
+.adminhtml-integration-new .actions-split > .action-toggle.primary[disabled]:hover,
+.adminhtml-integration-new .actions-split > .action-toggle.primary.disabled:hover,
+.adminhtml-integration-new .actions-split > .action-toggle.primary[disabled]:active,
+.adminhtml-integration-new .actions-split > .action-toggle.primary.disabled:active,
+.catalog-product-new .actions-split.btn-round .action-default.primary[disabled]:hover,
+.catalog-product-new .actions-split.btn-round .action-default.primary.disabled:hover,
+.catalog-product-new .actions-split.btn-round .action-default.primary[disabled]:active,
+.catalog-product-new .actions-split.btn-round .action-default.primary.disabled:active,
+.catalog-product-edit .actions-split.btn-round .action-default.primary[disabled]:hover,
+.catalog-product-edit .actions-split.btn-round .action-default.primary.disabled:hover,
+.catalog-product-edit .actions-split.btn-round .action-default.primary[disabled]:active,
+.catalog-product-edit .actions-split.btn-round .action-default.primary.disabled:active,
+.catalog-product-index .actions-split.btn-round .action-default.primary[disabled]:hover,
+.catalog-product-index .actions-split.btn-round .action-default.primary.disabled:hover,
+.catalog-product-index .actions-split.btn-round .action-default.primary[disabled]:active,
+.catalog-product-index .actions-split.btn-round .action-default.primary.disabled:active,
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary[disabled]:hover,
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary.disabled:hover,
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary[disabled]:active,
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary.disabled:active {
+  color: #fff;
+  background: #007dbd;
+  border: 1px solid #0574ad;
+}
+.PrimaryAddButton,
+.PrimarySplitButton.btn-round .action-default.primary,
+.sales-order-index .page-actions .add,
+.adminhtml-rma-index .page-actions .add,
+.adminhtml-catalog-event-index .page-actions .add,
+.adminhtml-urlrewrite-index .page-actions .add,
+.catalog-search-index .page-actions .add,
+.catalog-product-review-index .page-actions .add,
+.catalog-rule-promo-catalog-index .page-actions .add,
+.sales-rule-promo-quote-index .page-actions .add,
+.adminhtml-reminder-index .page-actions .add,
+.newsletter-template-index .page-actions .add,
+.adminhtml-system-email-template-index .page-actions .add,
+.adminhtml-sitemap-index .page-actions .add,
+.adminhtml-googleshopping-types-index .page-actions .add,
+.customer-index-index .page-actions .add,
+.adminhtml-cms-page-index .page-actions .add,
+.cms-block-index .page-actions .add,
+.adminhtml-banner-index .page-actions .add,
+.adminhtml-widget-instance-index .page-actions .add,
+.cms-page-index .page-actions .add,
+.adminhtml-webapi-user-index .page-actions .add,
+.adminhtml-webapi-role-index .page-actions .add,
+.adminhtml-system-variable-index .page-actions .add,
+.adminhtml-user-index .page-actions .add,
+.adminhtml-user-role-index .page-actions .add,
+.adminhtml-integration-index .page-actions .add,
+.adminhtml-system-design-theme-index .page-actions .add,
+.adminhtml-system-design-index .page-actions .add,
+.adminhtml-customer-attribute-index .page-actions .add,
+.adminhtml-customer-address-attribute-index .page-actions .add,
+.rating-index-index .page-actions .add,
+.tax-rule-index .page-actions .add,
+.tax-rate-index .page-actions .add,
+.adminhtml-rma-item-attribute-index .page-actions .add,
+.adminhtml-reward-rate-index .page-actions .add,
+.customer-group-index .page-actions .add,
+.checkout-agreement-index .page-actions .add,
+.catalog-product-attribute-index .page-actions .add,
+.catalog-product-set-index .page-actions .add,
+.catalog-product-new .actions-split.btn-round .action-default.primary,
+.catalog-product-edit .actions-split.btn-round .action-default.primary,
+.catalog-product-index .actions-split.btn-round .action-default.primary,
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary,
+.PrimarySplitButton.btn-round .action-default.primary,
+.sales-order-index .page-actions .add,
+.adminhtml-rma-index .page-actions .add,
+.adminhtml-catalog-event-index .page-actions .add,
+.adminhtml-urlrewrite-index .page-actions .add,
+.catalog-search-index .page-actions .add,
+.catalog-product-review-index .page-actions .add,
+.catalog-rule-promo-catalog-index .page-actions .add,
+.sales-rule-promo-quote-index .page-actions .add,
+.adminhtml-reminder-index .page-actions .add,
+.newsletter-template-index .page-actions .add,
+.adminhtml-system-email-template-index .page-actions .add,
+.adminhtml-sitemap-index .page-actions .add,
+.adminhtml-googleshopping-types-index .page-actions .add,
+.customer-index-index .page-actions .add,
+.adminhtml-cms-page-index .page-actions .add,
+.cms-block-index .page-actions .add,
+.adminhtml-banner-index .page-actions .add,
+.adminhtml-widget-instance-index .page-actions .add,
+.cms-page-index .page-actions .add,
+.adminhtml-webapi-user-index .page-actions .add,
+.adminhtml-webapi-role-index .page-actions .add,
+.adminhtml-system-variable-index .page-actions .add,
+.adminhtml-user-index .page-actions .add,
+.adminhtml-user-role-index .page-actions .add,
+.adminhtml-integration-index .page-actions .add,
+.adminhtml-system-design-theme-index .page-actions .add,
+.adminhtml-system-design-index .page-actions .add,
+.adminhtml-customer-attribute-index .page-actions .add,
+.adminhtml-customer-address-attribute-index .page-actions .add,
+.rating-index-index .page-actions .add,
+.tax-rule-index .page-actions .add,
+.tax-rate-index .page-actions .add,
+.adminhtml-rma-item-attribute-index .page-actions .add,
+.adminhtml-reward-rate-index .page-actions .add,
+.customer-group-index .page-actions .add,
+.checkout-agreement-index .page-actions .add,
+.catalog-product-attribute-index .page-actions .add,
+.catalog-product-set-index .page-actions .add,
+.catalog-product-new .actions-split.btn-round .action-default.primary,
+.catalog-product-edit .actions-split.btn-round .action-default.primary,
+.catalog-product-index .actions-split.btn-round .action-default.primary,
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary {
+  width: 36px;
+  height: 31px;
+  overflow: hidden;
+  position: relative;
+  z-index: 1;
+  padding: 0;
+}
+.PrimaryAddButton:focus,
+.PrimarySplitButton.btn-round .action-default.primary:focus,
+.sales-order-index .page-actions .add:focus,
+.adminhtml-rma-index .page-actions .add:focus,
+.adminhtml-catalog-event-index .page-actions .add:focus,
+.adminhtml-urlrewrite-index .page-actions .add:focus,
+.catalog-search-index .page-actions .add:focus,
+.catalog-product-review-index .page-actions .add:focus,
+.catalog-rule-promo-catalog-index .page-actions .add:focus,
+.sales-rule-promo-quote-index .page-actions .add:focus,
+.adminhtml-reminder-index .page-actions .add:focus,
+.newsletter-template-index .page-actions .add:focus,
+.adminhtml-system-email-template-index .page-actions .add:focus,
+.adminhtml-sitemap-index .page-actions .add:focus,
+.adminhtml-googleshopping-types-index .page-actions .add:focus,
+.customer-index-index .page-actions .add:focus,
+.adminhtml-cms-page-index .page-actions .add:focus,
+.cms-block-index .page-actions .add:focus,
+.adminhtml-banner-index .page-actions .add:focus,
+.adminhtml-widget-instance-index .page-actions .add:focus,
+.cms-page-index .page-actions .add:focus,
+.adminhtml-webapi-user-index .page-actions .add:focus,
+.adminhtml-webapi-role-index .page-actions .add:focus,
+.adminhtml-system-variable-index .page-actions .add:focus,
+.adminhtml-user-index .page-actions .add:focus,
+.adminhtml-user-role-index .page-actions .add:focus,
+.adminhtml-integration-index .page-actions .add:focus,
+.adminhtml-system-design-theme-index .page-actions .add:focus,
+.adminhtml-system-design-index .page-actions .add:focus,
+.adminhtml-customer-attribute-index .page-actions .add:focus,
+.adminhtml-customer-address-attribute-index .page-actions .add:focus,
+.rating-index-index .page-actions .add:focus,
+.tax-rule-index .page-actions .add:focus,
+.tax-rate-index .page-actions .add:focus,
+.adminhtml-rma-item-attribute-index .page-actions .add:focus,
+.adminhtml-reward-rate-index .page-actions .add:focus,
+.customer-group-index .page-actions .add:focus,
+.checkout-agreement-index .page-actions .add:focus,
+.catalog-product-attribute-index .page-actions .add:focus,
+.catalog-product-set-index .page-actions .add:focus,
+.catalog-product-new .actions-split.btn-round .action-default.primary:focus,
+.catalog-product-edit .actions-split.btn-round .action-default.primary:focus,
+.catalog-product-index .actions-split.btn-round .action-default.primary:focus,
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary:focus {
+  outline: none;
+}
+.PrimaryAddButton > span,
+.PrimarySplitButton.btn-round .action-default.primary > span,
+.sales-order-index .page-actions .add > span,
+.adminhtml-rma-index .page-actions .add > span,
+.adminhtml-catalog-event-index .page-actions .add > span,
+.adminhtml-urlrewrite-index .page-actions .add > span,
+.catalog-search-index .page-actions .add > span,
+.catalog-product-review-index .page-actions .add > span,
+.catalog-rule-promo-catalog-index .page-actions .add > span,
+.sales-rule-promo-quote-index .page-actions .add > span,
+.adminhtml-reminder-index .page-actions .add > span,
+.newsletter-template-index .page-actions .add > span,
+.adminhtml-system-email-template-index .page-actions .add > span,
+.adminhtml-sitemap-index .page-actions .add > span,
+.adminhtml-googleshopping-types-index .page-actions .add > span,
+.customer-index-index .page-actions .add > span,
+.adminhtml-cms-page-index .page-actions .add > span,
+.cms-block-index .page-actions .add > span,
+.adminhtml-banner-index .page-actions .add > span,
+.adminhtml-widget-instance-index .page-actions .add > span,
+.cms-page-index .page-actions .add > span,
+.adminhtml-webapi-user-index .page-actions .add > span,
+.adminhtml-webapi-role-index .page-actions .add > span,
+.adminhtml-system-variable-index .page-actions .add > span,
+.adminhtml-user-index .page-actions .add > span,
+.adminhtml-user-role-index .page-actions .add > span,
+.adminhtml-integration-index .page-actions .add > span,
+.adminhtml-system-design-theme-index .page-actions .add > span,
+.adminhtml-system-design-index .page-actions .add > span,
+.adminhtml-customer-attribute-index .page-actions .add > span,
+.adminhtml-customer-address-attribute-index .page-actions .add > span,
+.rating-index-index .page-actions .add > span,
+.tax-rule-index .page-actions .add > span,
+.tax-rate-index .page-actions .add > span,
+.adminhtml-rma-item-attribute-index .page-actions .add > span,
+.adminhtml-reward-rate-index .page-actions .add > span,
+.customer-group-index .page-actions .add > span,
+.checkout-agreement-index .page-actions .add > span,
+.catalog-product-attribute-index .page-actions .add > span,
+.catalog-product-set-index .page-actions .add > span,
+.catalog-product-new .actions-split.btn-round .action-default.primary > span,
+.catalog-product-edit .actions-split.btn-round .action-default.primary > span,
+.catalog-product-index .actions-split.btn-round .action-default.primary > span,
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary > span {
+  text-indent: -999em;
+  display: block;
+  width: 34px;
+  height: 29px;
+}
+.PrimaryAddButton > span:before,
+.PrimarySplitButton.btn-round .action-default.primary > span:before,
+.sales-order-index .page-actions .add > span:before,
+.adminhtml-rma-index .page-actions .add > span:before,
+.adminhtml-catalog-event-index .page-actions .add > span:before,
+.adminhtml-urlrewrite-index .page-actions .add > span:before,
+.catalog-search-index .page-actions .add > span:before,
+.catalog-product-review-index .page-actions .add > span:before,
+.catalog-rule-promo-catalog-index .page-actions .add > span:before,
+.sales-rule-promo-quote-index .page-actions .add > span:before,
+.adminhtml-reminder-index .page-actions .add > span:before,
+.newsletter-template-index .page-actions .add > span:before,
+.adminhtml-system-email-template-index .page-actions .add > span:before,
+.adminhtml-sitemap-index .page-actions .add > span:before,
+.adminhtml-googleshopping-types-index .page-actions .add > span:before,
+.customer-index-index .page-actions .add > span:before,
+.adminhtml-cms-page-index .page-actions .add > span:before,
+.cms-block-index .page-actions .add > span:before,
+.adminhtml-banner-index .page-actions .add > span:before,
+.adminhtml-widget-instance-index .page-actions .add > span:before,
+.cms-page-index .page-actions .add > span:before,
+.adminhtml-webapi-user-index .page-actions .add > span:before,
+.adminhtml-webapi-role-index .page-actions .add > span:before,
+.adminhtml-system-variable-index .page-actions .add > span:before,
+.adminhtml-user-index .page-actions .add > span:before,
+.adminhtml-user-role-index .page-actions .add > span:before,
+.adminhtml-integration-index .page-actions .add > span:before,
+.adminhtml-system-design-theme-index .page-actions .add > span:before,
+.adminhtml-system-design-index .page-actions .add > span:before,
+.adminhtml-customer-attribute-index .page-actions .add > span:before,
+.adminhtml-customer-address-attribute-index .page-actions .add > span:before,
+.rating-index-index .page-actions .add > span:before,
+.tax-rule-index .page-actions .add > span:before,
+.tax-rate-index .page-actions .add > span:before,
+.adminhtml-rma-item-attribute-index .page-actions .add > span:before,
+.adminhtml-reward-rate-index .page-actions .add > span:before,
+.customer-group-index .page-actions .add > span:before,
+.checkout-agreement-index .page-actions .add > span:before,
+.catalog-product-attribute-index .page-actions .add > span:before,
+.catalog-product-set-index .page-actions .add > span:before,
+.catalog-product-new .actions-split.btn-round .action-default.primary > span:before,
+.catalog-product-edit .actions-split.btn-round .action-default.primary > span:before,
+.catalog-product-index .actions-split.btn-round .action-default.primary > span:before,
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary > span:before {
+  text-indent: 0;
+  font-family: 'MUI-Icons';
+  font-weight: normal;
+  font-size: 22px;
+  content: '\e02d';
+  color: #fff;
+  position: absolute;
+  width: 34px;
+  height: 29px;
+  line-height: 29px;
+  text-align: center;
+  vertical-align: middle;
+  top: 0;
+  left: 0;
+  overflow: hidden;
+}
+.eq-ie9 .PrimaryAddButton > span:before,
+.eq-ie9 .PrimarySplitButton.btn-round .action-default.primary > span:before,
+.eq-ie9 .sales-order-index .page-actions .add > span:before,
+.eq-ie9 .adminhtml-rma-index .page-actions .add > span:before,
+.eq-ie9 .adminhtml-catalog-event-index .page-actions .add > span:before,
+.eq-ie9 .adminhtml-urlrewrite-index .page-actions .add > span:before,
+.eq-ie9 .catalog-search-index .page-actions .add > span:before,
+.eq-ie9 .catalog-product-review-index .page-actions .add > span:before,
+.eq-ie9 .catalog-rule-promo-catalog-index .page-actions .add > span:before,
+.eq-ie9 .sales-rule-promo-quote-index .page-actions .add > span:before,
+.eq-ie9 .adminhtml-reminder-index .page-actions .add > span:before,
+.eq-ie9 .newsletter-template-index .page-actions .add > span:before,
+.eq-ie9 .adminhtml-system-email-template-index .page-actions .add > span:before,
+.eq-ie9 .adminhtml-sitemap-index .page-actions .add > span:before,
+.eq-ie9 .adminhtml-googleshopping-types-index .page-actions .add > span:before,
+.eq-ie9 .customer-index-index .page-actions .add > span:before,
+.eq-ie9 .adminhtml-cms-page-index .page-actions .add > span:before,
+.eq-ie9 .cms-block-index .page-actions .add > span:before,
+.eq-ie9 .adminhtml-banner-index .page-actions .add > span:before,
+.eq-ie9 .adminhtml-widget-instance-index .page-actions .add > span:before,
+.eq-ie9 .cms-page-index .page-actions .add > span:before,
+.eq-ie9 .adminhtml-webapi-user-index .page-actions .add > span:before,
+.eq-ie9 .adminhtml-webapi-role-index .page-actions .add > span:before,
+.eq-ie9 .adminhtml-system-variable-index .page-actions .add > span:before,
+.eq-ie9 .adminhtml-user-index .page-actions .add > span:before,
+.eq-ie9 .adminhtml-user-role-index .page-actions .add > span:before,
+.eq-ie9 .adminhtml-integration-index .page-actions .add > span:before,
+.eq-ie9 .adminhtml-system-design-theme-index .page-actions .add > span:before,
+.eq-ie9 .adminhtml-system-design-index .page-actions .add > span:before,
+.eq-ie9 .adminhtml-customer-attribute-index .page-actions .add > span:before,
+.eq-ie9 .adminhtml-customer-address-attribute-index .page-actions .add > span:before,
+.eq-ie9 .rating-index-index .page-actions .add > span:before,
+.eq-ie9 .tax-rule-index .page-actions .add > span:before,
+.eq-ie9 .tax-rate-index .page-actions .add > span:before,
+.eq-ie9 .adminhtml-rma-item-attribute-index .page-actions .add > span:before,
+.eq-ie9 .adminhtml-reward-rate-index .page-actions .add > span:before,
+.eq-ie9 .customer-group-index .page-actions .add > span:before,
+.eq-ie9 .checkout-agreement-index .page-actions .add > span:before,
+.eq-ie9 .catalog-product-attribute-index .page-actions .add > span:before,
+.eq-ie9 .catalog-product-set-index .page-actions .add > span:before,
+.eq-ie9 .catalog-product-new .actions-split.btn-round .action-default.primary > span:before,
+.eq-ie9 .catalog-product-edit .actions-split.btn-round .action-default.primary > span:before,
+.eq-ie9 .catalog-product-index .actions-split.btn-round .action-default.primary > span:before,
+.eq-ie9 .adminhtml-integration-new .actions-split.btn-round .action-default.primary > span:before {
+  line-height: 31px;
+}
+.PrimarySplitButton.btn-round .action-default.primary,
+.catalog-product-new .actions-split.btn-round .action-default.primary,
+.catalog-product-edit .actions-split.btn-round .action-default.primary,
+.catalog-product-index .actions-split.btn-round .action-default.primary,
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary,
+.catalog-product-new .actions-split.btn-round .action-default.primary,
+.catalog-product-edit .actions-split.btn-round .action-default.primary,
+.catalog-product-index .actions-split.btn-round .action-default.primary,
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary {
+  border-radius: 2px 0 0 2px;
+}
+.PrimarySplitButton.btn-round .action-default.primary:focus,
+.catalog-product-new .actions-split.btn-round .action-default.primary:focus,
+.catalog-product-edit .actions-split.btn-round .action-default.primary:focus,
+.catalog-product-index .actions-split.btn-round .action-default.primary:focus,
+.adminhtml-integration-new .actions-split.btn-round .action-default.primary:focus {
+  outline: none;
+}
+.PrimarySplitButton > .action-default.primary,
+.catalog-product-new .actions-split > .action-default.primary,
+.catalog-product-edit .actions-split > .action-default.primary,
+.catalog-product-index .actions-split > .action-default.primary,
+.adminhtml-integration-new .actions-split > .action-default.primary {
+  border-radius: 2px 0 0 2px;
+}
+.PrimarySplitButton > .action-default.primary:focus,
+.catalog-product-new .actions-split > .action-default.primary:focus,
+.catalog-product-edit .actions-split > .action-default.primary:focus,
+.catalog-product-index .actions-split > .action-default.primary:focus,
+.adminhtml-integration-new .actions-split > .action-default.primary:focus {
+  outline: none;
+}
+.PrimarySplitButton > .action-toggle.primary,
+.catalog-product-new .actions-split > .action-toggle.primary,
+.catalog-product-edit .actions-split > .action-toggle.primary,
+.catalog-product-index .actions-split > .action-toggle.primary,
+.adminhtml-integration-new .actions-split > .action-toggle.primary,
+.catalog-product-new .actions-split > .action-toggle.primary,
+.catalog-product-edit .actions-split > .action-toggle.primary,
+.catalog-product-index .actions-split > .action-toggle.primary,
+.adminhtml-integration-new .actions-split > .action-toggle.primary {
+  overflow: hidden;
+  z-index: 1;
+  padding: 0;
+  border-radius: 0 2px 2px 0;
+  font-size: 15px;
+  width: 30px;
+  height: 31px;
+  line-height: 30px;
+  margin-left: -1px;
+  position: relative;
+  z-index: 2;
+  filter: none;
+}
+.PrimarySplitButton > .action-toggle.primary:focus,
+.catalog-product-new .actions-split > .action-toggle.primary:focus,
+.catalog-product-edit .actions-split > .action-toggle.primary:focus,
+.catalog-product-index .actions-split > .action-toggle.primary:focus,
+.adminhtml-integration-new .actions-split > .action-toggle.primary:focus {
+  outline: none;
+}
+.PrimarySplitButton > .action-toggle.primary:before,
+.catalog-product-new .actions-split > .action-toggle.primary:before,
+.catalog-product-edit .actions-split > .action-toggle.primary:before,
+.catalog-product-index .actions-split > .action-toggle.primary:before,
+.adminhtml-integration-new .actions-split > .action-toggle.primary:before {
+  text-align: center;
+}
+.PrimarySplitButton .dropdown-menu,
+.catalog-product-new .actions-split .dropdown-menu,
+.catalog-product-edit .actions-split .dropdown-menu,
+.catalog-product-index .actions-split .dropdown-menu,
+.adminhtml-integration-new .actions-split .dropdown-menu {
+  left: 0;
+  right: auto;
+  z-index: 1;
+}
+.PrimarySplitButton .dropdown-menu > li > .item,
+.catalog-product-new .actions-split .dropdown-menu > li > .item,
+.catalog-product-edit .actions-split .dropdown-menu > li > .item,
+.catalog-product-index .actions-split .dropdown-menu > li > .item,
+.adminhtml-integration-new .actions-split .dropdown-menu > li > .item {
+  padding: 9px 10px 10px;
+}
+.PrimarySplitButton.active > .action-toggle.primary,
+.PrimarySplitButton.active > .action-toggle.primary:hover,
+.catalog-product-new .actions-split.active > .action-toggle.primary,
+.catalog-product-new .actions-split.active > .action-toggle.primary:hover,
+.catalog-product-edit .actions-split.active > .action-toggle.primary,
+.catalog-product-edit .actions-split.active > .action-toggle.primary:hover,
+.catalog-product-index .actions-split.active > .action-toggle.primary,
+.catalog-product-index .actions-split.active > .action-toggle.primary:hover,
+.adminhtml-integration-new .actions-split.active > .action-toggle.primary,
+.adminhtml-integration-new .actions-split.active > .action-toggle.primary:hover {
+  background: #026294;
+  border: 1px solid #004c74;
+}
+.dont-use-this-class-big-size {
+  font-size: 18px;
+  line-height: 24px;
+  padding: 8px 19px;
+}
+/*
+    Reset 'button view' for actions
+-------------------------------------- */
+.customer-current-activity .action-refresh,
+.pager .action-next,
+.pager .action-previous,
+.pager .action-next:hover,
+.pager .action-previous:hover,
+.pager .action-next.disabled:focus,
+.pager .action-previous.disabled:focus,
+.pager .action-next.disabled:active,
+.pager .action-previous.disabled:active,
+.data-table .action-.delete,
+.data-table .action-.delete:hover,
+.data-table .action-.delete:active,
+.data-table .action-.delete.active,
+.data-table .action-delete,
+.data-table .action-delete:hover,
+.data-table .action-delete:active,
+.data-table .action-delete.active,
+.data-table .action-locked,
+.data-table .action-locked:hover,
+.data-table .action-locked:active,
+.data-table .action-locked.active,
+.data-table .action-locked[disabled],
+#product-variations-matrix .action-choose,
+#product-variations-matrix .action-choose:hover,
+#product-variations-matrix .action-choose:active,
+#product-variations-matrix .action-choose.active,
+#product-variations-matrix .action-choose[disabled],
+.action-manage-images,
+.action-manage-images:hover,
+.action-manage-images:active,
+.action-manage-images.active,
+.action-manage-images[disabled],
+.image-panel .action-close,
+.image-panel .action-close:hover,
+.image-panel .action-close:active,
+.image-panel .action-close.active,
+.image-panel .action-close[disabled],
+.image-panel-controls .action-remove,
+.image-panel-controls .action-remove:hover,
+.image-panel-controls .action-remove:active,
+.image-panel-controls .action-remove.active,
+.image-panel-controls .action-remove[disabled],
+.vde-image-sizing .action-connect,
+.vde-image-sizing .action-connect:hover,
+.vde-image-sizing .action-connect:active,
+.vde-image-sizing .action-connect.active,
+.vde-image-sizing .action-connect[disabled],
+.suggest-expandable .action-show-all,
+.suggest-expandable .action-show-all:hover,
+.suggest-expandable .action-show-all:active,
+.suggest-expandable .action-show-all.active,
+.suggest-expandable .action-show-all[disabled],
+.custom-file > .action-add,
+.custom-file > .action-add:hover,
+.custom-file > .action-add:active,
+.custom-file > .action-add.active,
+.custom-file > .action-add[disabled],
+.vde-tools-header .action-close,
+.vde-tools-header .action-close:hover,
+.vde-tools-header .action-close:active,
+.vde-tools-header .action-close.active,
+.image .action-delete,
+.image .action-delete:hover,
+.image .action-delete:active,
+.image .action-delete.active,
+.fieldset-wrapper-title .actions .action-delete,
+.fieldset-wrapper-title .actions .action-delete:hover,
+.fieldset-wrapper-title .actions .action-delete:active,
+.fieldset-wrapper-title .actions .action-delete.active,
+.address-list-item-actions .action-delete,
+.address-list-item-actions .action-delete:hover,
+.address-list-item-actions .action-delete:active,
+.address-list-item-actions .action-delete.active,
+.notification .action-close,
+.notification .action-close:hover,
+.notification .action-close:active,
+.notification .action-close.active,
+.page-login .action-forgotpassword,
+.page-login .action-forgotpassword:hover,
+.page-login .action-forgotpassword:active,
+.page-login .action-forgotpassword.active,
+.page-login .action-back,
+.page-login .action-back:hover,
+.page-login .action-back:active,
+.page-login .action-back.active,
+.attribute-popup .page-actions #reset,
+.attribute-popup .page-actions #reset:hover,
+.attribute-popup .page-actions #reset:active,
+.attribute-popup .page-actions #reset.active,
+.attribute-popup .page-actions #reset[disabled] {
+  border: none;
+  border-radius: 0;
+  background: none;
+  margin: 0;
+  padding: 0;
+  box-shadow: none;
+  text-shadow: none;
+  filter: none;
+}
+.attribute-popup .messages {
+  margin: 0 15px;
+}
+.data-table .action-.delete[disabled],
+.data-table .action-delete[disabled],
+.data-table .action-locked[disabled],
+#product-variations-matrix .action-choose[disabled],
+.image-panel .action-close[disabled],
+.image-panel-controls .action-remove[disabled],
+.suggest-expandable .action-show-all[disabled],
+#store-view-window [class^='action-close'],
+#store-view-window [class^='action-close']:hover,
+#store-view-window [class^='action-close']:active,
+#store-view-window [class^='action-close'].active,
+#store-view-window [class^='action-close'][disabled],
+.custom-file > .action-add[disabled],
+.image .action-delete,
+.image .action-delete:hover,
+.image .action-delete:active,
+.image .action-delete.active,
+.fieldset-wrapper-title .actions .action-delete,
+.fieldset-wrapper-title .actions .action-delete:hover,
+.fieldset-wrapper-title .actions .action-delete:active,
+.fieldset-wrapper-title .actions .action-delete.active,
+.address-list-item-actions .action-delete,
+.address-list-item-actions .action-delete:hover,
+.address-list-item-actions .action-delete:active,
+.address-list-item-actions .action-delete.active,
+.notification .action-close,
+.notification .action-close:hover,
+.notification .action-close:active,
+.notification .action-close.active {
+  border: none;
+  border-radius: 0;
+  background: none;
+  margin: 0;
+  padding: 0;
+  box-shadow: none;
+  text-shadow: none;
+  filter: none;
+}
+.fade.critical-notification {
+  display: block;
+}
+.fade.critical-notification .popup {
+  top: 200px;
+}
+.data-table .action-.delete[disabled],
+.data-table .action-delete[disabled],
+.data-table .action-locked[disabled],
+#product-variations-matrix .action-choose[disabled],
+.image-panel .action-close[disabled],
+.image-panel-controls .action-remove[disabled],
+.suggest-expandable .action-show-all[disabled],
+#store-view-window [class^='action-close'],
+#store-view-window [class^='action-close']:hover,
+#store-view-window [class^='action-close']:active,
+#store-view-window [class^='action-close'].active,
+#store-view-window [class^='action-close'][disabled],
+.custom-file > .action-add[disabled],
+.vde-tools-header .action-close[disabled],
+.vde-image-sizing .action-reset,
+.vde-image-sizing .action-reset:hover,
+.vde-image-sizing .action-reset:active,
+.vde-image-sizing .action-reset.active,
+.vde-image-sizing .action-reset[disabled],
+.image .action-delete[disabled],
+.fieldset-wrapper-title .actions .action-delete[disabled],
+.address-list-item-actions .action-delete[disabled],
+[class^=" catalog-product-"] .page-actions .action-back,
+[class^=" catalog-product-"] .page-actions .action-back:hover,
+[class^=" catalog-product-"] .page-actions .action-back:active,
+[class^=" catalog-product-"] .page-actions .action-back.active,
+[class^=" catalog-product-"] .page-actions .action-back[disabled],
+[class^=" newsletter-"] .page-actions .action-back,
+[class^=" newsletter-"] .page-actions .action-back:hover,
+[class^=" newsletter-"] .page-actions .action-back:active,
+[class^=" newsletter-"] .page-actions .action-back.active,
+[class^=" newsletter-"] .page-actions .action-back[disabled],
+.notifications [class^="action-"],
+.notifications [class^="action-"]:hover,
+.notifications [class^="action-"]:active,
+.notifications [class^="action-"].active,
+.notifications [class^="action-"][disabled],
+.notification .action-close,
+.notification .action-close:hover,
+.notification .action-close:active,
+.notification .action-close.active,
+.notification .action-close[disabled],
+.sales-order-create-index .page-actions-inner .cancel,
+.sales-order-create-index .page-actions-inner .cancel:hover,
+.sales-order-create-index .page-actions-inner .cancel:active,
+.sales-order-create-index .page-actions-inner .cancel.active,
+.sales-order-create-index .page-actions-inner .cancel[disabled] {
+  border: 0;
+  border-radius: 0;
+  background: none;
+  margin: 0;
+  padding: 0;
+  box-shadow: none;
+  text-shadow: none;
+  filter: none;
+}
+.vde-image-sizing .action-connect,
+.vde-image-sizing .action-connect:hover,
+.vde-image-sizing .action-connect:active,
+.vde-image-sizing .action-connect.active,
+.vde-image-sizing .action-connect[disabled],
+.vde-tab-data .action-download,
+.vde-tab-data .action-download:hover,
+.vde-tab-data .action-download:active,
+.vde-tab-data .action-download.active,
+.vde-tab-data .action-download[disabled],
+.vde-tab-data .action-delete,
+.vde-tab-data .action-delete:hover,
+.vde-tab-data .action-delete:active,
+.vde-tab-data .action-delete.active,
+.vde-tab-data .action-delete[disabled],
+.vde-tab-data .action-edit,
+.vde-tab-data .action-edit:hover,
+.vde-tab-data .action-edit:active,
+.vde-tab-data .action-edit.active,
+.vde-tab-data .action-edit[disabled] {
+  border: none;
+  border-radius: 0;
+  background: none;
+  margin: 0;
+  padding: 0;
+  box-shadow: none;
+  text-shadow: none;
+}
+/*
+    Actions as links
+-------------------------------------- */
+.notification-entry-dialog .action-cancel,
+.attribute-popup .page-actions #reset {
+  background: none;
+  border: none;
+  color: #6d665e;
+  font-weight: normal;
+  font-size: 12px;
+  cursor: pointer;
+  text-decoration: underline;
+}
+.notification-entry-dialog .action-cancel:hover,
+.attribute-popup .page-actions #reset:hover {
+  color: #000;
+  border-bottom-color: #000;
+  filter: none;
+}
+/*
+    Fileupload button
+-------------------------------------- */
+.action-upload {
+  position: relative;
+}
+.action-upload > input[type="file"] {
+  position: absolute;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  opacity: 0;
+  font-size: 10em;
+}
+/*
+    Dropdown menu
+-------------------------------------- */
+.dropdown-menu,
+.ui-autocomplete {
+  position: absolute;
+  display: none;
+  list-style: none;
+  min-width: 100px;
+  margin: 3px 0 0 0;
+  padding: 0;
+  right: 0;
+  top: 100%;
+  border: 1px solid #cac2b5;
+  border-radius: 3px;
+  background: #fff;
+  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
+  z-index: 990;
+}
+.dropdown-menu > li,
+.ui-autocomplete > li {
+  padding: 5px;
+  border-bottom: 1px solid #e5e5e5;
+}
+.dropdown-menu > li.selected,
+.ui-autocomplete > li.selected {
+  background: #eef8fc;
+}
+.dropdown-menu > li:hover,
+.ui-autocomplete > li:hover {
+  background: #eef8fc;
+}
+.dropdown-menu > li:last-child,
+.ui-autocomplete > li:last-child {
+  border-bottom: none;
+}
+.dropdown-menu > li > .item,
+.ui-autocomplete > li > .item {
+  cursor: pointer;
+}
+.dropdown-menu-top {
+  margin: 0 0 3px 0;
+  top: auto;
+  bottom: 100%;
+}
+.ui-autocomplete {
+  right: auto;
+}
+.ui-autocomplete > li {
+  padding: 0;
+}
+.ui-autocomplete > li > a {
+  display: block;
+  padding: 5px;
+}
+.ui-autocomplete > li > a.level-0 {
+  padding-left: 5px !important;
+}
+.ui-autocomplete .ui-state-focus {
+  background: #f5f5f5;
+}
+/*
+    Suggest
+-------------------------------------- */
+.mage-suggest {
+  position: relative;
+  display: inline-block;
+  vertical-align: top;
+  width: 100%;
+  background-color: #fff;
+  border: 1px solid #ccc;
+  border-radius: 3px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+.mage-suggest:after {
+  position: absolute;
+  top: 0;
+  right: 3px;
+  bottom: 0;
+  width: 22px;
+  text-align: center;
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  speak: none;
+  font-weight: normal;
+  -webkit-font-smoothing: antialiased;
+  content: '\e01f';
+  /* search icon */
+
+  font-size: 20px;
+  color: #b2b2b2;
+}
+.mage-suggest input[type="search"],
+.mage-suggest input.search {
+  width: 100%;
+  border: none;
+  background: none;
+  padding-right: 30px;
+}
+.mage-suggest-dropdown {
+  position: absolute;
+  left: 0;
+  right: 0;
+  top: 100%;
+  margin: 3px -1px 0 -1px;
+  border: 1px solid #cac2b5;
+  border-radius: 3px;
+  background: #fff;
+  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
+  z-index: 990;
+}
+.mage-suggest-dropdown ul {
+  margin: 0;
+  padding: 0;
+  list-style: none;
+}
+.mage-suggest-dropdown li {
+  border-bottom: 1px solid #e5e5e5;
+  padding: 0;
+}
+.field-category_ids .mage-suggest-dropdown,
+.field-new_category_parent .mage-suggest-dropdown {
+  max-height: 200px;
+  overflow: auto;
+}
+.mage-suggest-dropdown li a {
+  display: block;
+}
+.mage-suggest-dropdown li a,
+.mage-suggest-dropdown .jstree li a:hover,
+.mage-suggest-dropdown .jstree .jstree-hovered,
+.mage-suggest-dropdown .jstree .jstree-clicked {
+  padding: 6px 12px 5px;
+  text-decoration: none;
+  color: #333;
+}
+.mage-suggest-dropdown .jstree li a:hover,
+.mage-suggest-dropdown .jstree .jstree-hovered,
+.mage-suggest-dropdown .jstree .jstree-clicked {
+  border: none;
+}
+.mage-suggest-dropdown li a.ui-state-focus {
+  background: #f5f5f5;
+}
+.mage-suggest-dropdown .jstree li {
+  border-bottom: 0;
+}
+.mage-suggest-dropdown .jstree li a {
+  display: inline-block;
+}
+.mage-suggest-dropdown .jstree .mage-suggest-selected > a {
+  color: #000000;
+  background: #F1FFEB;
+}
+.mage-suggest-dropdown .jstree .mage-suggest-selected > a:hover,
+.mage-suggest-dropdown .jstree .mage-suggest-selected > .jstree-hovered,
+.mage-suggest-dropdown .jstree .mage-suggest-selected > .jstree-clicked,
+.mage-suggest-dropdown .jstree .mage-suggest-selected.mage-suggest-not-active > .jstree-hovered,
+.mage-suggest-dropdown .jstree .mage-suggest-selected.mage-suggest-not-active > .jstree-clicked {
+  background: #E5FFD9;
+}
+.mage-suggest-dropdown .jstree .mage-suggest-not-active > a {
+  color: #D4D4D4;
+}
+.mage-suggest-dropdown .jstree .mage-suggest-not-active > a:hover,
+.mage-suggest-dropdown .jstree .mage-suggest-not-active > .jstree-hovered,
+.mage-suggest-dropdown .jstree .mage-suggest-not-active > .jstree-clicked {
+  background: #F5F5F5;
+}
+.mage-suggest-dropdown .category-path {
+  font-size: 11px;
+  margin-left: 10px;
+  color: #9ba8b5;
+}
+.suggest-expandable .actions-split .action-toggle {
+  display: inline-block;
+  max-width: 500px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  background: none;
+  border: none;
+  box-shadow: none;
+  color: #676056;
+  font-size: 12px;
+  padding: 5px 4px;
+  filter: none;
+}
+.suggest-expandable .actions-split .action-toggle span {
+  display: inline;
+}
+.suggest-expandable .actions-split .action-toggle:before {
+  display: inline-block;
+  float: right;
+  margin-left: 4px;
+  font-size: 13px;
+  color: #b2b0ad;
+}
+.suggest-expandable .actions-split .action-toggle:hover:before {
+  color: #7e7e7e;
+}
+.suggest-expandable .dropdown-menu {
+  margin: 1px 0 0;
+  left: 0;
+  right: auto;
+  width: 221px;
+}
+.suggest-expandable .mage-suggest {
+  border: none;
+}
+.suggest-expandable .mage-suggest:after {
+  top: 6px;
+  right: 6px;
+}
+.suggest-expandable .mage-suggest-inner .title {
+  margin: 0;
+  padding: 0 10px 4px;
+  text-transform: uppercase;
+  color: #a6a098;
+  font-size: 12px;
+  border-bottom: 1px solid #e5e5e5;
+}
+.suggest-expandable .mage-suggest-inner > input[type="search"],
+.suggest-expandable .mage-suggest-inner > input.search {
+  position: relative;
+  margin: 6px 5px 5px;
+  padding-right: 20px;
+  border: 1px solid #ccc;
+  width: 211px;
+  z-index: 1;
+}
+.suggest-expandable .mage-suggest-inner > input.ui-autocomplete-loading,
+.suggest-expandable .mage-suggest-inner > input.mage-suggest-state-loading {
+  background: #ffffff url(../mui/images/ajax-loader-small.gif) no-repeat 190px 50%;
+}
+.suggest-expandable .mage-suggest {
+  border-radius: 3px 3px 0 0;
+}
+.suggest-expandable .mage-suggest-dropdown {
+  margin-top: 0;
+  border-top: 0;
+  border-radius: 0 0 3px 3px;
+  max-height: 300px;
+  overflow: auto;
+  width: 100%;
+  float: left;
+}
+.suggest-expandable .mage-suggest-dropdown ul {
+  margin: 0;
+  padding: 0;
+  list-style: none;
+}
+.suggest-expandable .action-show-all,
+.suggest-expandable .action-show-all:hover,
+.suggest-expandable .action-show-all:active,
+.suggest-expandable .action-show-all:focus,
+.suggest-expandable .action-show-all[disabled] {
+  border-top: 1px solid #e5e5e5;
+  display: block;
+  width: 100%;
+  padding: 8px 10px 10px;
+  text-align: left;
+  font: 12px/1.333 Arial, Verdana, sans-serif;
+  color: #676056;
+}
+.page-actions .suggest-expandable {
+  max-width: 500px;
+  float: left;
+  margin-top: 1px;
+}
+.page-actions.fixed #product-template-suggest-container {
+  display: none;
+}
+/*
+    Actions Split
+-------------------------------------- */
+.actions-split {
+  text-align: left;
+  position: relative;
+  display: inline-block;
+}
+.actions-split > [class^='action-'] {
+  float: left;
+  border-radius: 0;
+}
+.actions-split > .action-default {
+  border-radius: 5px 0 0 5px;
+}
+.actions-split > .action-toggle {
+  border-left: 1px solid #c5c0b9;
+  border-radius: 0 5px 5px 0;
+  margin-left: -1px;
+  padding: 4px 7px;
+}
+.actions-split > .action-toggle > span {
+  display: none;
+}
+.actions-split > .action-toggle:before {
+  display: block;
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  speak: none;
+  font-weight: normal;
+  -webkit-font-smoothing: antialiased;
+  content: '\e02c';
+  /* arrow down */
+
+  font-size: 11px;
+}
+.actions-split > .action-toggle.active:before {
+  content: '\e029';
+  /* arrow up */
+
+}
+.actions-split > .action-toggle.primary {
+  border-left: 1px solid #e1721d;
+}
+.actions-split > .action-toggle.primary:hover {
+  background: #e2701a;
+  margin-left: -1px;
+}
+.actions-split.active .dropdown-menu {
+  display: block;
+  white-space: nowrap;
+}
+.actions-split.active .dropdown-menu > li {
+  padding: 0;
+}
+.actions-split .dropdown-menu > li > .item {
+  display: block;
+  padding: 6px 10px 5px;
+  color: #333;
+  text-decoration: none;
+}
+/* Variations Image Uploader */
+.actions-image-uploader > img {
+  float: left;
+  border: solid #b7b2a7;
+  border-width: 1px 0 1px 1px;
+  width: 32px;
+  height: 31px;
+}
+.actions-image-uploader .action-toggle,
+.actions-image-uploader .action-toggle:hover,
+.actions-image-uploader .action-toggle:active,
+.actions-image-uploader .action-toggle:focus,
+.actions-image-uploader .action-toggle[disabled] {
+  position: relative;
+  height: 33px;
+  padding-left: 2px;
+  padding-right: 2px;
+  background: #fff;
+  filter: none;
+  color: #888;
+}
+.actions-image-uploader.active .action-toggle {
+  border-radius: 0 5px 0 0;
+}
+.actions-image-uploader.active .action-toggle:after {
+  position: absolute;
+  left: 0;
+  right: 0;
+  bottom: -1px;
+  height: 1px;
+  background: #fff;
+  z-index: 991;
+  content: '';
+}
+.actions-image-uploader .dropdown-menu {
+  margin-top: -1px;
+  border-radius: 3px 0 3px 3px;
+}
+/*
+    Action delete icon
+-------------------------------------- */
+/* TODO: replase ".action-.delete" to ".action-delete" after buttons refactoring */
+.data-table .action-.delete span,
+.data-table .action-delete span,
+.data-table .action-locked span,
+.image .action-delete span,
+.fieldset-wrapper-title .actions .action-delete span,
+.address-list-item-actions .action-delete span {
+  display: none;
+}
+.data-table .action-.delete:before,
+.data-table .action-delete:before,
+.image .action-delete:before,
+.fieldset-wrapper-title .actions .action-delete:before,
+.address-list-item-actions .action-delete:before {
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  speak: none;
+  font-weight: normal;
+  font-size: 18px;
+  -webkit-font-smoothing: antialiased;
+  content: '\e07f';
+  /* delete icon */
+
+  color: #b7b3ad;
+}
+/*
+    Locked action icon
+-------------------------------------- */
+.data-table .action-locked:before {
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  speak: none;
+  font-weight: normal;
+  font-size: 20px;
+  -webkit-font-smoothing: antialiased;
+  content: '\e03e';
+  /* lock icon */
+
+  color: #b7b3ad;
+}
+.data-table .action-.delete:hover:before,
+.data-table .action-delete:hover:before,
+.data-table .action-locked:hover:before,
+.image .action-delete:hover:before,
+.fieldset-wrapper-title .actions .action-delete:hover:before,
+.address-list-item-actions .action-delete:hover:before {
+  color: #7e7e7e;
+}
+.data-table input.action-.delete[type="button"],
+.data-table input.action-.delete[type="submit"],
+.data-table input.action-.delete[type="reset"],
+.data-table button.action-.delete,
+.data-table input.action-.delete[type="button"]:visited,
+.data-table input.action-.delete[type="submit"]:visited,
+.data-table input.action-.delete[type="reset"]:visited,
+.data-table button.action-.delete:visited,
+.data-table input.action-.delete[type="button"]:hover,
+.data-table input.action-.delete[type="submit"]:hover,
+.data-table input.action-.delete[type="reset"]:hover,
+.data-table button.action-.delete:hover,
+.data-table input.action-.delete[type="button"]:active,
+.data-table input.action-.delete[type="submit"]:active,
+.data-table input.action-.delete[type="reset"]:active,
+.data-table button.action-.delete:active {
+  background: transparent;
+  padding: 3px 7px 0;
+}
+.data-table input.action-.delete[type=button]:hover:before,
+.data-table input.action-.delete[type=submit]:hover:before,
+.data-table input.action-.delete[type=reset]:hover:before,
+.data-table button.action-.delete:hover:before,
+.data-table input.action-.delete[type=button]:focus:before,
+.data-table input.action-.delete[type=submit]:focus:before,
+.data-table input.action-.delete[type=reset]:focus:before,
+.data-table button.action-.delete:focus:before {
+  background: transparent;
+  color: #a5a29d;
+}
+/*
+    Forms
+-------------------------------------- */
+fieldset {
+  border: 1px solid #ccc;
+  padding: 20px;
+}
+legend {
+  padding: 0 10px;
+  margin: 0 -10px;
+}
+fieldset legend + br {
+  display: none;
+}
+label {
+  display: inline-block;
+}
+label > input[type="radio"],
+label > input[type="checkbox"] {
+  margin: -3px 3px 0 0;
+  vertical-align: middle;
+}
+input[type=text],
+input[type=password],
+input[type=datetime],
+input[type=datetime-local],
+input[type=date],
+input[type=month],
+input[type=time],
+input[type=week],
+input[type=number],
+input[type=range],
+input[type=email],
+input[type=url],
+input[type=search],
+input.search,
+input[type=tel],
+input[type=color],
+textarea,
+.input-text {
+  display: inline-block;
+  padding: 4px;
+  margin: 0;
+  background-color: #fff;
+  height: 28px;
+  color: #676056;
+  font-size: 14px;
+  font-weight: 400;
+  border: 1px solid #ccc;
+  -moz-box-sizing: border-box;
+  -webkit-box-sizing: border-box;
+  box-sizing: border-box;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+}
+textarea,
+.input-text {
+  height: auto;
+}
+textarea {
+  resize: vertical;
+}
+select {
+  height: 28px;
+  padding: 4px 4px 5px;
+  margin: 0 0 8px;
+  border: 1px solid #ccc;
+  border-radius: 4px;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  -ms-box-sizing: border-box;
+  box-sizing: border-box;
+}
+select[multiple],
+select[size] {
+  height: auto;
+}
+input[type=text]:focus,
+input[type=password]:focus,
+input[type=datetime]:focus,
+input[type=datetime-local]:focus,
+input[type=date]:focus,
+input[type=month]:focus,
+input[type=time]:focus,
+input[type=week]:focus,
+input[type=number]:focus,
+input[type=range]:focus,
+input[type=email]:focus,
+input[type=url]:focus,
+input[type=search]:focus,
+input.search:focus,
+input[type=tel]:focus,
+input[type=color]:focus,
+textarea:focus,
+select:focus {
+  outline: 0;
+  border-color: #75b9f0;
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+}
+input[type="radio"],
+input[type="checkbox"] {
+  margin: 3px 0;
+  line-height: normal;
+}
+input[disabled],
+select[disabled],
+textarea[disabled],
+input[readonly],
+select[readonly],
+textarea[readonly] {
+  cursor: not-allowed;
+  background-color: #fff;
+  border-color: #eee;
+  box-shadow: none;
+  color: #999;
+}
+select[disabled].multiselect > option[selected] {
+  color: #fff;
+  background: #6d6d6d;
+}
+textarea:-moz-placeholder,
+input:-moz-placeholder {
+  color: #999 !important;
+  font-style: italic;
+}
+option.placeholder {
+  color: #999 !important;
+  font-style: italic !important;
+}
+:-ms-input-placeholder {
+  color: #999 !important;
+  font-style: italic;
+}
+::-webkit-input-placeholder {
+  color: #999 !important;
+}
+:-moz-placeholder {
+  color: #999 !important;
+}
+.form-inline .control {
+  width: 100%;
+}
+.form-inline .label {
+  width: 20%;
+  padding-top: 6px;
+}
+.form-inline .label ~ .control {
+  width: 60%;
+}
+.form-inline .no-label .control {
+  margin-left: 20%;
+  width: 60%;
+}
+fieldset.field [class^='fields-group-'] .field .control {
+  width: auto;
+  margin: 0 0 0 20px;
+}
+.form-inline .field-service {
+  -moz-box-sizing: border-box;
+  -webkit-box-sizing: border-box;
+  box-sizing: border-box;
+  float: left;
+  width: 20%;
+  padding: 7px 0 0 15px;
+  color: #999;
+  font-size: 12px;
+  letter-spacing: 0.05em;
+}
+.form-inline .field-service[value-scope]:before {
+  content: attr(value-scope) !important;
+  white-space: nowrap;
+  display: block;
+  margin-bottom: 5px;
+}
+.form-inline .field-service .checkbox {
+  margin: 0;
+  vertical-align: middle;
+}
+.control > input {
+  width: 100%;
+}
+.control > input[type="button"] {
+  width: auto;
+}
+.control > input.hasDatepicker {
+  width: 130px;
+}
+.control > input[type="radio"],
+.control > input[type="checkbox"],
+.control > input[type="file"] {
+  width: auto;
+}
+.control > table {
+  width: 100%;
+}
+.multi-input {
+  margin: 0 0 20px;
+}
+.multi-input > input {
+  width: 100%;
+}
+.control .input-file {
+  margin-top: 4px;
+}
+/* TODO: remove styles for images when images will be replaced by font icons */
+.control .hasDatepicker + img {
+  margin: -3px 0 0 5px;
+  vertical-align: middle;
+}
+.nobr {
+  white-space: nowrap;
+}
+/*
+    Form Validation
+-------------------------------------- */
+label.mage-error {
+  display: block;
+  color: red;
+  text-align: left;
+  clear: both;
+  margin: 3px 0 0 0;
+}
+textarea.mage-error,
+select.mage-error,
+input.mage-error {
+  border-color: #fa7973 !important;
+  box-shadow: 0 0 8px rgba(250, 121, 115, 0.6) !important;
+}
+input.mage-error ~ .addafter {
+  border-color: #fa7973 !important;
+  box-shadow: 0 0 8px rgba(250, 121, 115, 0.6) !important;
+}
+/*
+    Forms for Store Scope
+-------------------------------------- */
+.form-inline .field-store_id .label + .control,
+.form-inline .field-store_ids .label + .control,
+.form-inline .field-website_ids .label + .control,
+.form-inline .field-website_id .label + .control,
+.form-inline .field-select_stores .label + .control,
+.form-inline .field-stores .label + .control {
+  width: auto;
+}
+/*
+    Forms styles
+-------------------------------------- */
+.page-content-inner {
+  position: relative;
+  background: #f5f2ed;
+  border: 1px solid #b7b2a6;
+  border-radius: 5px;
+  padding: 20px;
+}
+.fieldset-wrapper,
+.fieldset {
+  background: #fff;
+  border: 1px solid #eae6e0;
+  border-radius: 5px;
+  margin: 0 0 8px;
+  padding: 5px 18px 18px;
+  position: relative;
+}
+.fieldset-wrapper > .fieldset-wrapper-title,
+.fieldset > .legend {
+  position: static;
+  float: left;
+  width: 100%;
+  -moz-box-sizing: border-box;
+  -webkit-box-sizing: border-box;
+  box-sizing: border-box;
+  padding: 0;
+  border-bottom: 1px solid #ededed;
+  margin: 0 0 18px;
+}
+.fieldset-wrapper > .fieldset-wrapper-title {
+  float: none;
+}
+.fieldset-wrapper > .fieldset-wrapper-title .title,
+.fieldset > .legend span {
+  color: #676056;
+  font-size: 20px;
+  font-weight: 400;
+  padding: 7px 0 10px;
+  display: inline-block;
+}
+/* Collapsable fieldset-wrapper */
+.collapsable-wrapper {
+  padding-bottom: 2px;
+}
+.collapsable-wrapper.opened {
+  padding-bottom: 18px;
+}
+.collapsable-wrapper > .fieldset-wrapper-title {
+  border-bottom: none;
+  margin-bottom: 0;
+}
+.collapsable-wrapper.opened > .fieldset-wrapper-title {
+  border-bottom: 1px solid #ededed;
+  margin-bottom: 18px;
+}
+.collapsable-wrapper .fieldset-wrapper-title > .title {
+  position: relative;
+  padding-left: 22px;
+  cursor: pointer;
+  float: left;
+}
+.collapsable-wrapper .fieldset-wrapper-title > .title:before {
+  position: absolute;
+  left: 0;
+  top: 7px;
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  speak: none;
+  font-weight: normal;
+  -webkit-font-smoothing: antialiased;
+  content: '\e02a';
+  /* arrow right icon */
+
+  color: #b2b0ad;
+}
+.collapsable-wrapper.opened > .fieldset-wrapper-title > .title:before {
+  content: '\e02c';
+  /* arrow down icon */
+
+}
+.collapsable-wrapper .fieldset-wrapper-title > .title:hover:before {
+  color: #7e7e7e;
+}
+/* Fieldset styles in another fieldset */
+.fieldset .fieldset-wrapper,
+.fieldset-wrapper .fieldset-wrapper {
+  border-color: #cccbca;
+  padding: 0;
+}
+.fieldset .fieldset-wrapper .fieldset-wrapper-title,
+.fieldset-wrapper .fieldset-wrapper .fieldset-wrapper-title {
+  background: #f4f2ef;
+  background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y0ZjJlZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNlZWViZTYiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
+  background: -moz-linear-gradient(top, #f4f2ef 0%, #eeebe6 100%);
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f4f2ef), color-stop(100%, #eeebe6));
+  background: -webkit-linear-gradient(top, #f4f2ef 0%, #eeebe6 100%);
+  background: -o-linear-gradient(top, #f4f2ef 0%, #eeebe6 100%);
+  background: -ms-linear-gradient(top, #f4f2ef 0%, #eeebe6 100%);
+  background: linear-gradient(to bottom, #f4f2ef 0%, #eeebe6 100%);
+  padding: 0 18px;
+  border-radius: 5px;
+}
+.fieldset .fieldset-wrapper.opened .fieldset-wrapper-title,
+.fieldset-wrapper .fieldset-wrapper.opened .fieldset-wrapper-title {
+  border-radius: 5px 5px 0 0;
+  border-bottom: 1px solid #cccbca;
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -khtml-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  min-height: 39px;
+}
+.fieldset .fieldset-wrapper .fieldset-wrapper-title .actions,
+.fieldset-wrapper .fieldset-wrapper .fieldset-wrapper-title .actions {
+  padding: 10px 2px 0 0;
+}
+.fieldset .fieldset-wrapper .fieldset-wrapper-title .title,
+.fieldset-wrapper .fieldset-wrapper .fieldset-wrapper-title .title {
+  padding-top: 9px;
+  padding-bottom: 8px;
+  color: #555;
+  font: normal 16px/1.333 Arial, Verdana, sans-serif;
+}
+.fieldset .fieldset-wrapper .fieldset-wrapper-title .title:before,
+.fieldset-wrapper .fieldset-wrapper .fieldset-wrapper-title .title:before {
+  top: 9px;
+}
+.fieldset-wrapper-content .fieldset > .title {
+  margin-top: 0;
+  padding-left: 22px;
+}
+.fieldset-wrapper .draggable-handle,
+.fieldset .draggable-handle {
+  width: 8px;
+  height: 14px;
+  line-height: 14px;
+  background: url(Magento_Backend::images/draggable-handle-vertical.gif) no-repeat 0 0;
+  cursor: ns-resize;
+  color: #b2b0ad;
+}
+.fieldset-wrapper-title > .draggable-handle {
+  position: absolute;
+  left: 10px;
+  top: 12px;
+}
+.fieldset .fieldset-wrapper .fieldset-wrapper-content,
+.fieldset-wrapper .fieldset-wrapper .fieldset-wrapper-content {
+  padding: 0 10px;
+}
+/* Sortable fieldsets */
+.ui-sortable .entry-edit .fieldset-wrapper-title,
+#product_options_container_top .fieldset-wrapper-title {
+  padding-left: 30px;
+}
+.fieldset-wrapper-title > .actions,
+.fieldset .legend > .actions {
+  float: right;
+  padding-top: 8px;
+}
+.fieldset > .legend + br {
+  display: block;
+  height: 0;
+  overflow: hidden;
+  clear: left;
+}
+.fieldset-wrapper .fieldset,
+.fieldset .fieldset {
+  background: transparent;
+  padding: 9px 0;
+  border: none;
+  border-radius: 0;
+  margin: 0 0 29px;
+}
+.fieldset .comment {
+  margin: 0 0 29px 10px;
+}
+.fieldset .field {
+  margin: 0 0 29px;
+}
+.with-note .note,
+.field .note {
+  color: #676056;
+  font-size: 12px;
+  font-weight: 400;
+}
+.fieldset .field .options-list {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+.fieldset .field .options-list input[type="checkbox"],
+.fieldset .field .options-list input[type="radio"] {
+  margin-right: 5px;
+}
+[class^="fields-group-"] .field {
+  margin-bottom: 0;
+}
+.fieldset-wrapper .fieldset:last-child,
+.fieldset .fieldset:last-child,
+.fieldset .field:last-child {
+  margin-bottom: 0;
+}
+.fieldset .label {
+  color: #676056;
+  font-size: 13px;
+  font-weight: 600;
+}
+.fieldset .control .label {
+  color: #676056;
+  font-size: 14px;
+  font-weight: 400;
+}
+.field.required > .label:after {
+  color: #e22626;
+  font-size: 13px;
+  font-weight: 400;
+}
+.with-addon .textarea {
+  margin: 0 0 6px;
+}
+.fieldset .control .textarea,
+.fieldset .control .addon .textarea {
+  border-radius: 4px;
+  width: 100%;
+}
+.fieldset > .field > input[type="checkbox"] {
+  margin-top: 12px;
+}
+.fieldset-alt {
+  position: relative;
+  display: table-row;
+  border: 0;
+  padding: 0;
+  margin-bottom: 20px;
+  width: 100%;
+}
+.fieldset-alt > .field {
+  display: table-cell;
+  vertical-align: top;
+  padding-right: 4%;
+}
+.fieldset-alt > .field.no-display {
+  display: none;
+}
+.fieldset-alt .field > .label {
+  display: block;
+  width: 100%;
+  clear: both;
+  text-align: left;
+  margin: 0 0 10px;
+}
+.fieldset-alt .label + .control {
+  width: 100%;
+}
+.fieldset-alt .field-option-title {
+  width: 50%;
+}
+.fieldset .tooltip .help {
+  margin: 7px 0 0 15px;
+}
+.fieldset-alt .field-option-store-view {
+  width: 20%;
+}
+.fieldset-alt .field-option-input-type {
+  width: 20%;
+}
+.fieldset-alt .field-option-input-type select {
+  width: 100%;
+}
+.fieldset-alt .field-option-req {
+  width: 105px;
+  white-space: nowrap;
+}
+.fieldset-alt .field-option-req .control {
+  position: relative;
+  top: 32px;
+}
+.fieldset-alt .field-option-position,
+.fieldset-alt .field-option-position .control {
+  width: 60px;
+}
+/* "Use default" checkbox */
+.use-default-control {
+  display: none;
+}
+.use-default-label {
+  cursor: pointer;
+  text-decoration: underline;
+  font-size: 11px;
+  color: #a29c94;
+}
+.use-default-label:hover {
+  color: #7e7e7e;
+}
+/*
+    Custom Multiselect
+-------------------------------------- */
+.multiselect-alt {
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  border: 1px solid #ccc;
+  border-radius: 5px;
+  color: #333;
+}
+.multiselect-alt .item {
+  position: relative;
+  border-top: 1px solid #fff;
+  cursor: pointer;
+}
+.multiselect-alt .item:first-child {
+  border-top: 0;
+}
+.multiselect-alt .item.selected {
+  background: #d7ebf5;
+}
+.multiselect-alt .item.selected:hover {
+  background: #afdef2;
+}
+.multiselect-alt label {
+  display: block;
+  cursor: pointer;
+  padding: 6px 25px 5px;
+}
+.multiselect-alt .item.selected label:before {
+  position: absolute;
+  left: 8px;
+  top: 1px;
+  bottom: 0;
+  width: 10px;
+  line-height: 28px;
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  speak: none;
+  font-weight: normal;
+  -webkit-font-smoothing: antialiased;
+  content: '\e01e';
+  /* checked icon */
+
+  text-align: center;
+  color: #7ba4b1;
+  font-size: 9px;
+  text-shadow: 0 -1px 1px #60727b;
+}
+.multiselect-alt input[type="checkbox"] {
+  width: 0;
+  height: 0;
+  opacity: 0;
+  margin: 0;
+  padding: 0;
+}
+/*
+    Form item with table
+-------------------------------------- */
+.with-table .label {
+  float: none;
+  text-align: left;
+  width: 100%;
+}
+.with-table .control {
+  clear: left;
+  float: none;
+  width: 100%;
+}
+/*
+    Form currency label
+-------------------------------------- */
+.addon input {
+  border-width: 1px 0 1px 1px;
+}
+.addon input:focus ~ .addafter {
+  border-color: #75b9f0;
+  box-shadow: 0 0 8px rgba(82, 168, 236, 0.6);
+}
+.addon input ~ .addafter strong {
+  display: inline-block;
+  background: #fff;
+  line-height: 24px;
+  margin: 0 3px 0 -2px;
+  padding-left: 4px;
+  padding-right: 4px;
+  position: relative;
+  font-size: 12px;
+  top: 0;
+}
+.addon input:focus ~ .addafter strong {
+  margin-top: 0;
+}
+.addon .addafter {
+  background: none;
+  color: #a6a6a6;
+  border-width: 1px 1px 1px 0;
+  border-radius: 4px 4px 0 0;
+  padding: 0;
+  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.075) inset;
+}
+.field .control input[type='text'][disabled],
+.field .control input[type='text'][disabled] ~ .addafter,
+.field .control select[disabled],
+.field .control select[disabled] ~ .addafter {
+  background-color: #fff;
+  border-color: #eee;
+  box-shadow: none;
+  color: #999;
+}
+.field .control input[type='text'][disabled] ~ .addafter strong,
+.field .control select[disabled] ~ .addafter strong {
+  background-color: #fff;
+}
+.field.type-price .addon,
+.field-price .addon,
+.field-special_price .addon,
+.field-msrp .addon {
+  direction: rtl;
+}
+.field.type-price .addon > *,
+.field-price .addon > *,
+.field-special_price .addon > *,
+.field-msrp .addon > * {
+  direction: ltr;
+}
+.field.type-price .addon .addafter,
+.field-price .addon .addafter,
+.field-special_price .addon .addafter,
+.field-msrp .addon .addafter {
+  border-width: 1px 0 1px 1px;
+  border-radius: 4px 0 0 4px;
+}
+.field.type-price .addon input:first-child,
+.field-price .addon input:first-child,
+.field-special_price .addon input:first-child,
+.field-msrp .addon input:first-child {
+  border-radius: 0 4px 4px 0;
+}
+.field.type-price input,
+.field-price input,
+.field-special_price input,
+.field-msrp input {
+  border-width: 1px 1px 1px 0;
+  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.075) inset;
+}
+.field.type-price input:focus,
+.field-price input:focus,
+.field-special_price input:focus,
+.field-msrp input:focus {
+  box-shadow: 0 0 8px rgba(82, 168, 236, 0.6);
+}
+.field.type-price input:focus ~ label.addafter,
+.field-price input:focus ~ label.addafter,
+.field-special_price input:focus ~ label.addafter,
+.field-msrp input:focus ~ label.addafter {
+  box-shadow: 0 0 8px rgba(82, 168, 236, 0.6);
+}
+.field.type-price input ~ label.addafter strong,
+.field-price input ~ label.addafter strong,
+.field-special_price input ~ label.addafter strong,
+.field-msrp input ~ label.addafter strong {
+  margin-left: 2px;
+  margin-right: -2px;
+}
+/*
+    Calendar
+-------------------------------------- */
+.ui-datepicker {
+  z-index: 998 !important;
+}
+.ui-datepicker .ui-datepicker-calendar td {
+  padding: 0;
+}
+.ui-datepicker .ui-datepicker-calendar th {
+  background: #efefef;
+  border: 1px solid #cfcfcf;
+  padding: 4px;
+  color: #676056;
+  font-weight: bold;
+}
+.ui-datepicker-calendar tbody tr td,
+.ui-datepicker-calendar tbody tr:nth-child(2n+1) td {
+  background: #fff;
+}
+.ui-datepicker .ui-datepicker-prev span,
+.ui-datepicker .ui-datepicker-next span {
+  margin-top: -1px;
+}
+/*
+    Details element
+-------------------------------------- */
+summary {
+  cursor: pointer;
+  display: inline-block;
+}
+.no-details details > * {
+  display: none;
+}
+.no-details details > summary:before {
+  float: left;
+  width: 20px;
+  content: 'â–º ';
+}
+.no-details details.open > summary:before {
+  content: 'â–¼ ';
+}
+.no-details details summary {
+  display: block;
+}
+/*
+    Blockquotes
+-------------------------------------- */
+blockquote {
+  border-left: 2px solid #ccc;
+  padding-left: 5px;
+}
+blockquote small:before {
+  content: '\2014 \00A0';
+}
+/*
+    Addresses
+-------------------------------------- */
+address {
+  font-style: normal;
+}
+/*
+    Tables
+-------------------------------------- */
+table > caption {
+  margin-bottom: 5px;
+}
+table tfoot,
+table th {
+  background: #e6e6e6;
+}
+table tfoot,
+table thead {
+  background: #666158;
+  color: #cac3b4;
+}
+table thead.active {
+  /*background:#F37B21;*/
+
+}
+table th {
+  text-align: left;
+  background: transparent;
+  font-weight: normal;
+}
+table th,
+table td {
+  border: 1px solid #C0BBAF;
+  padding: 6px 10px 7px;
+}
+table tbody tr td {
+  background: #F5F2ED;
+  color: #676056;
+  padding-top: 12px;
+}
+table tbody tr:not(:last-child) td {
+  border-top: 1px solid transparent;
+  border-bottom: 1px solid transparent;
+}
+table .dropdown-menu li {
+  padding: 7px 15px;
+  line-height: 14px;
+  cursor: pointer;
+}
+table tbody tr td:first-child input[type="checkbox"] {
+  margin: 0;
+}
+table tbody tr:nth-child(odd) td,
+table tbody tr:nth-child(odd) th {
+  background-color: #E6E3DE;
+}
+table tbody tr.selected td,
+table tbody tr.selected th {
+  border: 1px solid #C0BBAF;
+}
+table tbody tr.selected td,
+table tbody tr.selected th,
+table tbody tr:hover td,
+table tbody tr:hover th,
+table tbody tr:nth-child(odd):hover td,
+table tbody tr:nth-child(odd):hover th {
+  background-color: #fff;
+}
+/*
+    X-tree styles
+-------------------------------------- */
+.x-tree-node .leaf .x-tree-node-icon {
+  background-image: url(../images/fam_leaf.png);
+}
+.x-tree-node .system-leaf .x-tree-node-icon {
+  background-image: url(../images/fam_application_form_delete.png);
+}
+.x-tree-node-ct {
+  overflow: hidden;
+}
+/*
+    Styles for "js" tooltip with positionings
+-------------------------------------- */
+.tipsy {
+  padding: 11px;
+}
+.tipsy-inner {
+  padding: 12px 15px;
+  max-width: 185px;
+  background: #faf8f6;
+  border: 1px solid #dcd8ce;
+  box-shadow: 0 2px 5px rgba(49, 48, 43, 0.4);
+}
+.tipsy-inner .error {
+  width: 158px;
+}
+.tipsy-inner .error h5 {
+  color: #be0a0a;
+  font-size: 16px;
+  font-weight: 500;
+  margin: 0 0 6px 0;
+}
+.tipsy-inner .error p {
+  color: #676056;
+  line-height: 1.5;
+  margin: 0;
+}
+.tipsy-e .tipsy-arrow {
+  top: 50%;
+  left: 1px;
+  margin-top: -10px;
+  border-top: 10px solid transparent;
+  border-right: 10px solid #dcd8ce;
+  border-bottom: 10px solid transparent;
+  border-left: none;
+}
+.tipsy-w .tipsy-arrow {
+  top: 50%;
+  right: 0;
+  margin-top: -10px;
+  border-top: 10px solid transparent;
+  border-right: none;
+  border-bottom: 10px solid transparent;
+  border-left: 10px solid #dcd8ce;
+}
+.tipsy-n .tipsy-arrow,
+.tipsy-ne .tipsy-arrow,
+.tipsy-nw .tipsy-arrow {
+  bottom: 1px;
+  border-top: 10px solid #dcd8ce;
+  border-right: 10px solid transparent;
+  border-bottom: none;
+  border-left: 10px solid transparent;
+}
+.tipsy-ne .tipsy-arrow {
+  left: 16px;
+}
+.tipsy-nw .tipsy-arrow {
+  right: 16px;
+}
+.tipsy-s .tipsy-arrow,
+.tipsy-se .tipsy-arrow,
+.tipsy-sw .tipsy-arrow {
+  top: 1px;
+  border-left: 10px solid transparent;
+  border-right: 10px solid transparent;
+  border-bottom: 10px solid #dcd8ce;
+  border-top: none;
+}
+.tipsy-se .tipsy-arrow {
+  left: 16px;
+}
+.tipsy-sw .tipsy-arrow {
+  right: 16px;
+}
+.tipsy-arrow:after,
+.tipsy-arrow:before {
+  position: absolute;
+  width: 0;
+  height: 0;
+  content: '';
+}
+.tipsy-e .tipsy-arrow:after {
+  top: -5px;
+  left: 2px;
+  margin-top: -4px;
+  border-top: 9px solid transparent;
+  border-right: 9px solid #faf8f6;
+  border-bottom: 9px solid transparent;
+}
+.tipsy-e .tipsy-arrow:before {
+  top: -8px;
+  margin-top: 0;
+  border-top: 10px solid transparent;
+  border-right: 10px solid rgba(49, 48, 43, 0.1);
+  border-bottom: 10px solid transparent;
+}
+.tipsy-w .tipsy-arrow:after {
+  top: -5px;
+  left: -12px;
+  margin-top: -4px;
+  border-top: 9px solid transparent;
+  border-right: none;
+  border-bottom: 9px solid transparent;
+  border-left: 9px solid #faf8f6;
+}
+.tipsy-w .tipsy-arrow:before {
+  top: -8px;
+  left: -10px;
+  margin-top: 0;
+  border-top: 10px solid transparent;
+  border-right: none;
+  border-bottom: 10px solid transparent;
+  border-left: 10px solid rgba(49, 48, 43, 0.1);
+}
+.tipsy-n .tipsy-arrow:after,
+.tipsy-ne .tipsy-arrow:after,
+.tipsy-nw .tipsy-arrow:after {
+  margin-top: -4px;
+  left: -9px;
+  top: -7px;
+  border-top: 9px solid #faf8f6;
+  border-right: 9px solid transparent;
+  border-left: 9px solid transparent;
+}
+.tipsy-n .tipsy-arrow:before,
+.tipsy-ne .tipsy-arrow:before,
+.tipsy-nw .tipsy-arrow:before {
+  left: -10px;
+  top: -8px;
+  margin-top: 0;
+  border-top: 10px solid rgba(49, 48, 43, 0.1);
+  border-right: 10px solid transparent;
+  border-left: 10px solid transparent;
+}
+.tipsy-s .tipsy-arrow:after,
+.tipsy-sw .tipsy-arrow:after,
+.tipsy-se .tipsy-arrow:after {
+  left: -9px;
+  top: 6px;
+  margin-top: -4px;
+  border-top: none;
+  border-right: 9px solid transparent;
+  border-bottom: 9px solid #faf8f6;
+  border-left: 9px solid transparent;
+}
+.tipsy-inner dl {
+  margin: 0;
+}
+.tipsy-inner dt {
+  margin: 0 0 4px;
+  font-size: 16px;
+  font-weight: 400;
+  color: #f47b20;
+}
+.tipsy-inner dd {
+  margin: 0;
+  color: #676056;
+  font-size: 12px;
+  line-height: 18px;
+  font-family: Arial, Helvetica, sans-serif;
+}
+/*
+    Popups
+-------------------------------------- */
+.fade .popup {
+  padding: 0;
+  border: 5px solid #969288;
+  border-radius: 8px;
+}
+.wrapper-popup {
+  padding: 0 10px;
+}
+.fade .popup .popup-inner {
+  padding: 20px;
+  border-radius: 3px;
+}
+.fade .popup .popup-title {
+  margin: 0 0 10px;
+}
+.popup-loading {
+  position: fixed;
+  z-index: 1003;
+  width: 200px;
+  background: rgba(255, 255, 255, 0.8);
+  left: 50%;
+  top: 40%;
+  margin-left: -100px;
+  color: #d85909;
+  border-color: #d85909;
+  font-size: 14px;
+  font-weight: bold;
+  text-align: center;
+  padding: 100px 0 10px;
+}
+.popup-loading:after {
+  position: absolute;
+  left: 50%;
+  top: 40%;
+  background-image: url(../mui/images/ajax-loader-big.gif);
+  width: 64px;
+  height: 64px;
+  margin: -32px 0 0 -32px;
+  content: '';
+  z-index: 2;
+}
+/* Loading mask */
+.loading-old,
+.loading-mask {
+  background: rgba(255, 255, 255, 0.4);
+  z-index: 999;
+}
+.loading-old,
+.loading-mask {
+  position: fixed;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+}
+.loading-old .loader,
+.loading-mask .loader {
+  position: absolute;
+  margin: auto;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  width: 160px;
+  height: 160px;
+  color: #5e5b56;
+  font-size: 14px;
+  font-weight: bold;
+  text-align: center;
+  background: #e5e2dd url(../mui/images/ajax-loader-big.gif) no-repeat 50% 30%;
+  border-radius: 5px;
+  opacity: .95;
+}
+.loading-mask img {
+  display: none;
+}
+.loading-old p,
+.loading-mask p {
+  margin-top: 118px;
+}
+/* Backup popup */
+/* TODO: remove after backups page js refactoring */
+.backup-dialog {
+  margin-top: inherit !important;
+}
+/*
+    Global Navigation
+-------------------------------------- */
+.navigation {
+  position: relative;
+  border-bottom: 1px solid #aaa69c;
+  background: #726c62;
+  background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzcyNmM2MiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiM2NTYwNTciIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
+  background: -moz-linear-gradient(top, #726c62 0%, #656057 100%);
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #726c62), color-stop(100%, #656057));
+  background: -webkit-linear-gradient(top, #726c62 0%, #656057 100%);
+  background: -o-linear-gradient(top, #726c62 0%, #656057 100%);
+  background: -ms-linear-gradient(top, #726c62 0%, #656057 100%);
+  background: linear-gradient(to bottom, #726c62 0%, #656057 100%);
+  padding: 0 20px;
+}
+.navigation:before {
+  position: absolute;
+  left: 0;
+  top: 0;
+  right: 0;
+  height: 5px;
+  box-shadow: 0 2px 4px #46433d inset;
+  content: '';
+  z-index: 991;
+}
+.navigation:after {
+  position: absolute;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  height: 1px;
+  background: #4e483f;
+  content: '';
+  z-index: 1;
+}
+.navigation .level-0.reverse > .submenu {
+  right: 1px;
+}
+.navigation > ul {
+  position: relative;
+  min-width: 960px;
+  max-width: 1300px;
+  margin: 0 auto;
+  text-align: right;
+  z-index: 900;
+}
+.navigation .level-0 > .submenu {
+  display: none;
+  position: absolute;
+  top: 100%;
+  padding: 19px 10px;
+}
+.navigation .level-0 > .submenu a {
+  display: block;
+  color: #007dbd;
+  font-size: 13px;
+  font-weight: 400;
+  line-height: 1.385;
+  padding: 5px 20px 4px;
+  text-decoration: none;
+  -webkit-transition: color 0.15s ease-out;
+  -moz-transition: color 0.15s ease-out;
+}
+.navigation .level-0 > .submenu a:focus,
+.navigation .level-0 > .submenu a:hover {
+  text-decoration: underline;
+}
+.navigation .level-0 > .submenu li {
+  margin-bottom: 1px;
+}
+.navigation .level-0 > .submenu a[href="#"] {
+  cursor: default;
+  display: block;
+  color: #676056;
+  font-size: 14px;
+  font-weight: 600;
+  line-height: 1;
+  margin: 7px 0 6px;
+  padding: 0 20px;
+}
+.navigation .level-0 > .submenu a[href="#"]:focus,
+.navigation .level-0 > .submenu a[href="#"]:hover {
+  text-decoration: none;
+}
+.navigation .level-0 {
+  display: inline-block;
+  float: left;
+  text-align: left;
+  -webkit-transition: display 0.15s ease-out;
+  -moz-transition: display 0.15s ease-out;
+}
+.navigation .level-0 > a {
+  background: none;
+  position: relative;
+  display: inline-block;
+  padding: 37px 21px 11px;
+  color: #f2ebde;
+  font-size: 13px;
+  font-weight: 400;
+  text-shadow: 0 1px 3px #222;
+  text-transform: uppercase;
+  text-decoration: none;
+  -webkit-transition: background 0.15s ease-out;
+  -moz-transition: background 0.15s ease-out;
+}
+.navigation .level-0.active > a {
+  background: #625d54;
+  background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIxJSIgc3RvcC1jb2xvcj0iIzYyNWQ1NCIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiM1NjUyNDkiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
+  background: -moz-linear-gradient(top, #625d54 1%, #565249 100%);
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(1%, #625d54), color-stop(100%, #565249));
+  background: -webkit-linear-gradient(top, #625d54 1%, #565249 100%);
+  background: -o-linear-gradient(top, #625d54 1%, #565249 100%);
+  background: -ms-linear-gradient(top, #625d54 1%, #565249 100%);
+  background: linear-gradient(to bottom, #625d54 1%, #565249 100%);
+}
+.navigation .level-0.hover.recent > a {
+  background: #fff;
+  color: #676056;
+  font-size: 13px;
+  font-weight: 400;
+  text-shadow: 0 1px 3px #c1bfbb;
+}
+.navigation .level-0 > a:focus {
+  outline: none;
+}
+.navigation .level-0 > .submenu {
+  opacity: 0;
+  visibility: hidden;
+}
+.navigation .level-0.recent.hover > .submenu {
+  opacity: 1;
+  visibility: visible;
+}
+.no-js .navigation .level-0:hover > .submenu,
+.no-js .navigation .level-0.hover > .submenu,
+.no-js .navigation .level-0 > a:focus + .submenu {
+  display: block;
+}
+.navigation .level-0 > a:before {
+  position: absolute;
+  left: 0;
+  right: 0;
+  top: 12px;
+  text-align: center;
+  height: 20px;
+  content: '';
+  font-family: 'admin-icons';
+  font-size: 18px;
+  speak: none;
+  font-weight: normal;
+  line-height: 1;
+  -webkit-font-smoothing: antialiased;
+  text-shadow: none;
+}
+.navigation .level-0.item-dashboard > a:before,
+.navigation .level-0.item-hub > a:before {
+  content: '\e007';
+  font-size: 17px;
+}
+.navigation .level-0.item-sales > a:before,
+.navigation .level-0.item-sales-and-orders > a:before {
+  content: '\e008';
+}
+.navigation .level-0.item-catalog > a:before {
+  content: '\e00b';
+}
+.navigation .level-0.item-customer > a:before,
+.navigation .level-0.item-customers > a:before {
+  content: '\e009';
+  font-size: 24px;
+  top: 10px;
+}
+.navigation .level-0.item-promo > a:before,
+.navigation .level-0.item-marketing > a:before {
+  content: '\e00a';
+  font-size: 17px;
+  top: 13px;
+}
+.navigation .level-0.item-cms > a:before,
+.navigation .level-0.item-content > a:before {
+  content: '\e006';
+  font-size: 16px;
+}
+.navigation .level-0.item-report > a:before,
+.navigation .level-0.item-reports > a:before {
+  content: '\e00c';
+  font-size: 16px;
+  top: 13px;
+}
+.navigation .level-0.item-newsletter > a:before {
+  font-family: 'MUI-Icons';
+  content: '\e03c';
+  font-size: 22px;
+  top: 9px;
+}
+.navigation .level-0 > .submenu {
+  background: #fff;
+  box-shadow: 0 3px 3px rgba(49, 48, 43, 0.5);
+  border-radius: 0 0 5px 5px;
+}
+.no-boxshadow .navigation .level-0 > .submenu {
+  border: 1px solid #cbc1b4;
+  border-width: 0 1px 1px;
+  margin-left: -1px;
+}
+.navigation .level-0 > .submenu li {
+  max-width: 200px;
+}
+.navigation .level-0 > .submenu > ul {
+  white-space: nowrap;
+}
+.navigation .level-0 > .submenu .column {
+  display: inline-block;
+  vertical-align: top;
+}
+.navigation .level-0 .submenu .level-1 {
+  white-space: normal;
+}
+.navigation .level-0.parent .submenu .level-1.parent {
+  margin: 17px 0;
+}
+.navigation .level-0.parent .level-1.parent:first-child {
+  margin-top: 0;
+}
+.navigation .level-2 .submenu {
+  margin-left: 7px;
+}
+.navigation .level-0 > .submenu .level-2 > a[href="#"] {
+  font-size: 13px;
+  margin-top: 10px;
+  margin-left: 7px;
+}
+.navigation .level-2 > .submenu a {
+  font-size: 12px;
+  line-height: 1.231;
+}
+.navigation .level-0 > .submenu .level-3 > a[href="#"],
+.navigation .level-3 .submenu {
+  margin-left: 15px;
+}
+/*
+    Admin and Store Settings
+-------------------------------------- */
+.navigation .level-0.item-system,
+.navigation .level-0.item-stores {
+  float: none;
+  margin: 21px 0 0;
+}
+.navigation .level-0.item-system > .submenu,
+.navigation .level-0.item-stores > .submenu {
+  left: auto;
+  right: 1px;
+}
+.navigation .level-0.item-system.hover:after,
+.navigation .level-0.item-stores.hover:after {
+  color: #c2b59c;
+}
+.navigation .level-0.item-system > a,
+.navigation .level-0.item-stores > a {
+  position: relative;
+  padding: 0;
+}
+.navigation .level-0.item-system:hover > a,
+.navigation .level-0.item-system.hover > a,
+.navigation .level-0.item-stores:hover > a,
+.navigation .level-0.item-stores.hover > a {
+  background: transparent;
+}
+.no-js .navigation .level-0.item-system:hover > a:before,
+.navigation .level-0.item-system:hover > a:before,
+.navigation .level-0.item-system.hover > a:before,
+.no-js .navigation .level-0.item-stores:hover > a:before,
+.navigation .level-0.item-stores:hover > a:before,
+.navigation .level-0.item-stores.hover > a:before {
+  display: none;
+  position: absolute;
+  top: 1.4em;
+  left: auto;
+  right: -19px;
+  height: 20px;
+  width: 20px;
+  content: '';
+  border: 10px solid #fff;
+  border-width: 0 0 10px 10px;
+  border-radius: 0 0 0 20px;
+  z-index: 2;
+}
+.navigation .level-0.item-system > a:after,
+.navigation .level-0.item-stores > a:after {
+  display: none;
+  position: absolute;
+  top: 2em;
+  left: -20px;
+  margin-top: -1px;
+  width: 20px;
+  height: 20px;
+  content: '';
+  border: 10px solid #fff;
+  border-width: 0 10px 10px 0;
+  border-radius: 0 0 20px;
+  z-index: 1;
+}
+.no-js .navigation .level-0.item-system:hover > a:after,
+.navigation .level-0.item-system.hover > a:after,
+.no-js .navigation .level-0.item-system:hover > a:before,
+.navigation .level-0.item-system.hover > a:before,
+.no-js .navigation .level-0.item-stores:hover > a:after,
+.navigation .level-0.item-stores.hover > a:after,
+.no-js .navigation .level-0.item-stores:hover > a:before,
+.navigation .level-0.item-stores.hover > a:before {
+  display: block;
+}
+.no-js .navigation .level-0.last:hover > a:before,
+.navigation .level-0.last.hover > a:before {
+  display: none;
+}
+.navigation .level-0.item-system > a span,
+.navigation .level-0.item-stores > a span {
+  display: block;
+  position: relative;
+  padding: 4px 20px 5px 10px;
+  border: 1px solid #4c483f;
+  border-left: 0;
+  font: 12px/1.333 "Helvetica", Arial, serif;
+  text-transform: none;
+  text-shadow: none;
+  background: #58534a;
+  color: #f2ebde;
+  height: 1.333em;
+}
+.navigation .level-0.item-system:hover > a span,
+.navigation .level-0.item-stores:hover > a span {
+  background: #31302B;
+}
+.navigation .level-0.item-system:hover > a span:after,
+.navigation .level-0.item-stores:hover > a span:after {
+  color: #58534a;
+}
+.no-js .navigation .level-0.item-system:hover > a span,
+.navigation .level-0.item-system.hover > a span,
+.no-js .navigation .level-0.item-stores:hover > a span,
+.navigation .level-0.item-stores.hover > a span {
+  background: #fff;
+  color: #676056;
+  text-shadow: none;
+  border-bottom: 0;
+  border-right: 0;
+  padding-right: 21px;
+  padding-bottom: 2em;
+  margin-bottom: -2em;
+}
+.no-js .navigation .level-0.last:hover > a span,
+.navigation .level-0.last.hover > a span {
+  background: #fff;
+  color: #676056;
+  text-shadow: none;
+  border-bottom: 0;
+  border-right: 0;
+  padding-right: 21px;
+  padding-bottom: 2em;
+  margin-bottom: -2em;
+}
+.no-js .navigation .level-0.last:hover > a span,
+.navigation .level-0.last.hover > a span {
+  border-right: 1px solid;
+  padding-right: 20px;
+}
+.navigation .level-0.item-system > a span:after,
+.navigation .level-0.item-stores > a span:after {
+  position: absolute;
+  top: 7px;
+  right: 7px;
+  width: 10px;
+  height: 10px;
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  speak: none;
+  font-weight: normal;
+  -webkit-font-smoothing: antialiased;
+  content: "\e02c";
+  font-size: 8px;
+  text-align: center;
+  color: #31302b;
+  z-index: 2;
+}
+.navigation .level-0.item-stores > a span:before {
+  position: absolute;
+  left: -22px;
+  top: -1px;
+  bottom: -1px;
+  height: 1.333em;
+  padding: 0 0 9px;
+  width: 21px;
+  border: 1px solid #4c483f;
+  border-right: 0;
+  border-radius: 5px 0 0 5px;
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  font-size: 12px;
+  line-height: 2;
+  speak: none;
+  font-weight: normal;
+  -webkit-font-smoothing: antialiased;
+  content: '\e07e';
+  text-align: center;
+  color: #31302b;
+}
+.navigation .level-0.last > a,
+.navigation .level-0.last > a span {
+  border-radius: 0 5px 5px 0;
+}
+.no-js .navigation .level-0.last:hover > a span,
+.navigation .level-0.last.hover > a span,
+.navigation .level-0.last > a:focus span {
+  border-radius: 0;
+}
+/*
+    Login page
+-------------------------------------- */
+.page-login {
+  height: 100%;
+}
+.page-login .wrapper {
+  min-height: 100%;
+  padding: 0;
+}
+.page-login .wrapper-inner {
+  overflow: auto;
+  padding-bottom: 140px;
+}
+.page-login .footer {
+  clear: both;
+  height: 140px;
+  margin-top: -140px;
+  position: relative;
+}
+.page-login .footer-content {
+  max-width: none;
+  min-width: 0;
+}
+.page-login .footer-copyright {
+  text-align: right;
+}
+.page-login .form-login {
+  width: 280px;
+  margin: 160px auto 60px;
+  padding: 30px 25px;
+  border: 1px solid #e3ded5;
+  border-radius: 5px;
+  background: #f7f2ec;
+}
+.page-login .fieldset {
+  background: transparent;
+  border: 0;
+  border-radius: 0;
+  margin: 0;
+  padding: 0;
+}
+.page-login .fieldset > .legend {
+  border-bottom: 0;
+  margin-bottom: 15px;
+}
+.page-login .fieldset > .legend span {
+  font-size: 32px;
+  line-height: 32px;
+  padding: 0;
+  color: #8a847c;
+  display: inline;
+}
+.page-login .fieldset .field {
+  margin: 0 0 13px;
+}
+.page-login .form-inline .label {
+  width: auto;
+  padding: 0;
+  margin-bottom: 13px;
+}
+.page-login .field-username label,
+.page-login .field-password label,
+.page-login .field-confirmation label {
+  display: none;
+}
+.page-login .form-inline .label + .control {
+  width: auto;
+  float: none;
+}
+.page-login .header {
+  margin-bottom: 30px;
+  background: transparent;
+  padding: 0;
+  z-index: auto;
+  position: static;
+}
+.page-login .header .logo {
+  display: block;
+  width: 262px;
+  height: 64px;
+  text-indent: -999em;
+  background: url(Magento_Backend::images/logo-magento.png) no-repeat;
+}
+.page-login .form-actions {
+  padding: 0;
+  margin: 0;
+  -moz-box-sizing: border-box;
+  -webkit-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.page-login .actions,
+.page-login .links {
+  display: inline-block;
+  vertical-align: middle;
+}
+.page-login input[type=text],
+.page-login input[type=password] {
+  border-color: #cac3b4;
+  font-size: 18px;
+  padding: 12px 12px 14px;
+  height: auto;
+}
+.page-login :-ms-input-placeholder {
+  color: #bebab1 !important;
+}
+.page-login ::-webkit-input-placeholder {
+  color: #bebab1 !important;
+}
+.page-login :-moz-placeholder {
+  color: #bebab1 !important;
+}
+.page-login .action-login,
+.page-login .action-retrieve {
+  font-size: 22px;
+  padding: 14px 22px 16px;
+}
+.page-login .action-retrieve,
+.page-login .action-reset {
+  font-size: 18px;
+  padding: 10px 17px 10px;
+}
+.page-login .action-forgotpassword,
+.page-login .action-back {
+  font-size: 12px;
+  color: #1c8bb8;
+  text-decoration: underline;
+  position: absolute;
+  left: 0;
+  bottom: -70px;
+}
+.page-login .action-forgotpassword:hover,
+.page-login .action-back:hover {
+  text-decoration: none;
+}
+/*
+    Page title
+-------------------------------------- */
+.page-title {
+  position: relative;
+  margin: 20px 0;
+}
+.page-content > .page-title {
+  max-width: 1300px;
+  min-width: 960px;
+  margin-left: auto;
+  margin-right: auto;
+}
+.page-title-inner > .title {
+  color: #676056;
+  font-size: 28px;
+  font-weight: 400;
+  display: inline-block;
+  margin: 0;
+  width: 100%;
+  word-wrap: break-word;
+}
+.page-title-inner .title > h3 {
+  margin: 0;
+}
+.page-title-inner .actions {
+  float: right;
+}
+.page-title-inner .actions form {
+  display: inline-block;
+}
+/*
+    Messages (Global)
+-------------------------------------- */
+.message {
+  margin: 0;
+  padding: 10px 26px 10px 32px;
+  background: #f9f5ec;
+  border: 0;
+  -moz-border-radius: 0;
+  -webkit-border-radius: 0;
+  border-radius: 0;
+  color: #676056;
+  text-shadow: none;
+  border-bottom: 1px solid #c7c2b6;
+}
+.wrapper > .message {
+  padding: 0 20px;
+}
+.page-content > #messages {
+  max-width: 1300px;
+  min-width: 960px;
+  margin: 0 auto;
+}
+.message:before,
+.message-system .message-inner:before {
+  position: absolute;
+  left: 8px;
+  top: 50%;
+  margin-top: -8px;
+  background: none;
+  text-shadow: none;
+  width: auto;
+  height: auto;
+  border: 0;
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  speak: none;
+  font-weight: normal;
+  -webkit-font-smoothing: antialiased;
+  font-size: 16px;
+  content: '\e006';
+  /* notification icon */
+
+  color: #6e685e;
+}
+.messages-inbox {
+  float: right;
+}
+.messages-inbox .critical {
+  color: red;
+}
+/* System Messages */
+.message-system {
+  padding: 0;
+}
+.message-system:before {
+  display: none;
+}
+.message-system .message-inner {
+  position: relative;
+  min-width: 960px;
+  max-width: 1300px;
+  margin: 0 auto;
+}
+.message-system .message-inner:before {
+  margin-top: -10px;
+}
+.message-system .message-content {
+  padding: 10px 26px 10px 32px;
+}
+/*
+    No-javaScript-Enabled message
+-------------------------------------- */
+.message-noscript {
+  background: #ff9;
+  padding: 0;
+  border: 0;
+  box-shadow: 0 1px 2px #46433d;
+  z-index: 994;
+}
+.message-noscript .message-content {
+  margin: 0 auto;
+  max-width: 1300px;
+  min-width: 960px;
+  padding: 3px 0;
+  position: relative;
+  text-align: center;
+}
+.message-noscript:before {
+  content: '';
+}
+.message-noscript .message-content:before {
+  position: relative;
+  background: none;
+  text-shadow: none;
+  width: auto;
+  height: auto;
+  vertical-align: middle;
+  border: 0;
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  speak: none;
+  font-weight: normal;
+  -webkit-font-smoothing: antialiased;
+  font-size: 32px;
+  content: '\e006';
+  /* notification icon */
+
+  color: #6e685e;
+}
+.message-demo-mode {
+  background: #d75f07;
+  border: 0;
+  color: #fff;
+  text-align: center;
+  padding: 5px 0;
+  box-shadow: 0 1px 2px #46433d;
+  z-index: 993;
+}
+.message-demo-mode:before {
+  content: '';
+}
+.message-demo-mode .message-content {
+  margin: 0 auto;
+  max-width: 1300px;
+  min-width: 960px;
+  position: relative;
+  text-align: center;
+}
+.message-demo-mode .message-content:before {
+  position: relative;
+  background: none;
+  text-shadow: none;
+  width: auto;
+  height: auto;
+  vertical-align: middle;
+  border: 0;
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  speak: none;
+  font-weight: normal;
+  -webkit-font-smoothing: antialiased;
+  font-size: 16px;
+  content: '\e006';
+  /* notification icon */
+
+}
+/*
+    Information message
+-------------------------------------- */
+.message-info {
+  background: #fffbf0;
+  border: 1px solid #d87e34;
+  margin-bottom: 20px;
+}
+.message-info:before {
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  speak: none;
+  font-weight: normal;
+  -webkit-font-smoothing: antialiased;
+  content: '\e046';
+  /* icon-info  */
+
+  color: #d87e34;
+}
+/*
+    Error message
+-------------------------------------- */
+.message-error {
+  color: #963535;
+  background: #f3dcd8;
+  border: 1px solid #963535;
+  margin-bottom: 20px;
+}
+.message-error:before {
+  content: '\e069';
+  color: #963535;
+}
+/*
+    Store Switcher
+-------------------------------------- */
+.store-switcher-alt {
+  position: relative;
+  display: inline-block;
+}
+.store-switcher-alt .dropdown-menu {
+  white-space: nowrap;
+  margin-top: 2px;
+}
+.store-switcher-alt.active .dropdown-menu {
+  display: block;
+}
+.store-switcher-alt .dropdown-menu ul {
+  margin: 0;
+  padding: 0;
+  list-style: none;
+}
+.store-switcher-alt strong {
+  display: block;
+  font-size: 14px;
+  font-weight: 500;
+  line-height: 1.333;
+  color: #a6a098;
+  padding: 5px 10px;
+}
+.store-switcher-alt .store-selected {
+  font-size: 12px;
+  font-weight: 400;
+  line-height: 1.333;
+  color: #676056;
+  cursor: pointer;
+}
+.store-switcher-alt .store-selected:after {
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  speak: none;
+  font-weight: normal;
+  -webkit-font-smoothing: antialiased;
+  content: '\e02c';
+  /* arrow down icon */
+
+  color: #b3b0ad;
+  margin: 0 0 0 3px;
+  vertical-align: text-top;
+}
+.store-switcher-alt .store-switcher-website,
+.store-switcher-alt .store-switcher-store {
+  padding: 0;
+}
+.store-switcher-alt .store-switcher-website:hover,
+.store-switcher-alt .store-switcher-store:hover {
+  background: none;
+}
+.store-switcher-website {
+  margin: 5px 0 0;
+}
+.store-switcher-website > strong {
+  padding-left: 13px;
+}
+.store-switcher-store {
+  margin: 1px 0 0;
+}
+.store-switcher-store > strong {
+  padding-left: 20px;
+}
+.store-switcher-alt .store-switcher-store > ul {
+  margin-top: 1px;
+}
+.store-switcher-alt .store-switcher-store-view {
+  padding: 0;
+}
+.store-switcher-store-view:first-child {
+  border-top: 1px solid #e5e5e5;
+}
+.store-switcher-store-view > a {
+  display: block;
+  padding: 5px 15px 5px 24px;
+  color: #333;
+  font-size: 13px;
+  text-decoration: none;
+}
+.store-switcher-alt .store-switcher-all,
+.store-switcher-alt .manage-stores {
+  padding: 0;
+}
+.store-switcher-alt .store-switcher-all > a,
+.store-switcher-alt .manage-stores > a {
+  display: block;
+  padding: 8px 15px;
+  color: #676056;
+  text-decoration: none;
+  font-size: 12px;
+}
+/*
+    Page Structure
+-------------------------------------- */
+.wrapper {
+  padding: 0 0 60px;
+  min-width: 1000px;
+}
+.page-content {
+  margin: 0 auto;
+  padding: 0 20px;
+}
+.page-title.complex .title {
+  float: left;
+  width: 70%;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.page-title.complex .store-switcher-alt {
+  float: right;
+  margin: 12px 0 0;
+}
+.side-col {
+  position: relative;
+  width: 20%;
+}
+.main-col {
+  position: relative;
+  width: 80%;
+  padding: 0 20px 20px;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  -ms-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.col-left {
+  float: left;
+}
+.col-right {
+  float: right;
+}
+.col-1-layout .main-col {
+  width: auto;
+}
+.col-2-left-layout .main-col,
+.col-2-right-layout .side-col {
+  float: right;
+}
+.col-2-right-layout .main-col,
+.col-2-left-layout .side-col {
+  float: left;
+}
+.col-2-left-layout,
+.col-1-layout {
+  position: relative;
+  background: #f5f2ed;
+  border: 1px solid #d5d0ca;
+  border-radius: 5px;
+  min-width: 960px;
+  max-width: 1300px;
+  margin: 0 auto;
+}
+.col-1-layout {
+  padding: 20px;
+  min-width: 920px;
+  max-width: 1260px;
+}
+.col-2-left-layout:before {
+  position: absolute;
+  display: block;
+  left: 20%;
+  top: 0;
+  bottom: 0;
+  width: 6px;
+  margin-left: -7px;
+  content: '';
+  background: -moz-linear-gradient(left, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.06) 100%);
+  /* FF3.6+ */
+
+  background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(0, 0, 0, 0)), color-stop(100%, rgba(0, 0, 0, 0.06)));
+  /* Chrome,Safari4+ */
+
+  background: -webkit-linear-gradient(left, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.06) 100%);
+  /* Chrome10+,Safari5.1+ */
+
+  background: -o-linear-gradient(left, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.06) 100%);
+  /* Opera 11.10+ */
+
+  background: -ms-linear-gradient(left, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.06) 100%);
+  /* IE10+ */
+
+  background: linear-gradient(to right, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.06) 100%);
+  /* W3C */
+
+  z-index: 2;
+}
+/* Sidebar and main column vertical separator */
+.main-col:after,
+.side-col:after {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  width: 1px;
+  background: #ded9d3;
+  content: '';
+}
+.col-2-left-layout .side-col:after {
+  right: 0;
+}
+.col-2-right-layout .side-col:after {
+  left: 0;
+}
+.col-2-right-layout .main-col:after {
+  right: -1px;
+}
+.col-2-left-layout .main-col:after {
+  left: -1px;
+}
+.col-2-left-layout .main-col,
+.col-2-right-layout .main-col {
+  min-width: 730px;
+}
+/* Sidebar title and store view switcher*/
+/* TODO: temporary styles */
+.side-col h3 {
+  padding: 0 17px;
+  margin-top: 16px;
+}
+.field-store-switcher {
+  padding: 0 0 20px;
+  margin: 0;
+}
+.side-col .ui-tabs h3 {
+  margin-bottom: 5px;
+  color: #524c44;
+  text-shadow: 0 1px 0 #fff;
+}
+.side-col > .store-switcher {
+  padding-top: 6px;
+}
+.field-store-switcher,
+.field-store-switcher > .label + .control {
+  display: inline-block;
+}
+.field-store-switcher > .tooltip + div > a {
+  color: #007dbd;
+  font-size: 12px;
+  font-weight: 400;
+}
+.field-store-switcher > .tooltip + div > a:focus,
+.field-store-switcher > .tooltip + div > a:hover {
+  text-decoration: underline;
+}
+.field-store-switcher > .label {
+  margin: 0;
+}
+.side-col > .field-store-switcher {
+  padding: 19px 18px 0;
+}
+.side-col > .field-store-switcher > .label {
+  margin: 0 0 6px;
+  display: block;
+}
+.dashboard-container .field-store-switcher {
+  padding: 20px 0;
+}
+.toolbar .field-store-switcher {
+  padding: 0;
+  margin-right: 20px;
+}
+/*
+    Universal Sidebar Tabs
+-------------------------------------- */
+.side-col .ui-tabs .ui-accordion-header {
+  position: relative;
+  margin: 10px 0 0;
+  padding: 5px 20px;
+  cursor: pointer;
+  color: #524c44;
+  text-shadow: 0 1px 0 #fff;
+}
+.side-col .ui-tabs .ui-accordion-header:focus {
+  outline: none;
+}
+.side-col .ui-accordion-header:before {
+  position: absolute;
+  left: 4px;
+  top: 7px;
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  speak: none;
+  font-weight: normal;
+  -webkit-font-smoothing: antialiased;
+  content: '\e02a';
+  /* arrow right icon */
+
+  font-size: 14px;
+  color: #ada79e;
+}
+.side-col .ui-accordion-header:hover:before {
+  color: #777;
+}
+.side-col .ui-accordion-header-active:before {
+  content: '\e02c';
+  /* arrow down icon */
+
+}
+.side-col .tabs {
+  margin: 0 0 30px;
+  padding: 0;
+  list-style: none;
+  font-weight: 500;
+}
+.side-col > .ui-tabs > .tabs:first-child > li:first-child > a {
+  border-top-left-radius: 5px;
+}
+.side-col .tabs > li {
+  border-bottom: 1px solid #e5e1db;
+}
+.side-col .tabs > li:first-child {
+  border-top: 1px solid #e5e1db;
+}
+.side-col .tabs > li a {
+  position: relative;
+  display: block;
+  padding: 8px 18px;
+  text-decoration: none;
+  color: #676056;
+  -webkit-transition: background 0.3s ease-in-out;
+  -moz-transition: background 0.3s ease-in-out;
+  transition: background 0.3s ease-in-out;
+}
+.side-col .tabs > li a:active,
+.side-col .tabs > li a:focus {
+  outline: none;
+}
+.side-col .tabs > li a:hover {
+  background: #fff;
+}
+.side-col .tabs > .ui-state-active a {
+  border-left: 3px solid #d87e34;
+  padding-left: 15px;
+  background: #dedcd8;
+  box-shadow: 0 1px 2px #ccc inset;
+}
+.side-col .tabs > .ui-state-active a:after,
+.side-col .tabs > .ui-state-active a:before {
+  position: absolute;
+  top: 50%;
+  right: 0;
+  width: 14px;
+  margin-top: -14px;
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  speak: none;
+  font-weight: normal;
+  -webkit-font-smoothing: antialiased;
+  content: '\e02b';
+  /* left turned triangle icon */
+
+  font-size: 22px;
+  color: #f5f2ed;
+  overflow: hidden;
+  z-index: 4;
+}
+.side-col .tabs > .ui-state-active a:before {
+  color: #bdbbb7;
+  margin-top: -13px;
+  z-index: 3;
+}
+.side-col .tabs span.error,
+.side-col .tabs span.loader {
+  display: none;
+  position: absolute;
+  right: 12px;
+  top: 7px;
+  width: 16px;
+  height: 16px;
+  font-size: 16px;
+}
+.side-col .tab-item-link.changed {
+  font-style: italic;
+}
+.side-col .tab-item-link.error span.error,
+.side-col .ui-tabs-loading span.loader {
+  display: block;
+}
+.side-col .tab-item-link.error span.error:after {
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  speak: none;
+  font-weight: normal;
+  -webkit-font-smoothing: antialiased;
+  content: '\e006';
+  /* warning icon */
+
+  color: #d87e34;
+}
+.side-col .ui-tabs-loading span.loader:after {
+  background: url(../mui/images/ajax-loader-small.gif) no-repeat 50% 50%;
+  display: block;
+  content: '';
+  width: 16px;
+  height: 16px;
+}
+/* TODO: styles for navigation on System > Configuration page */
+/*
+    Horizontal Tabs
+-------------------------------------- */
+.tabs-horiz {
+  list-style: none;
+  margin: 0;
+  padding: 3px 0 0;
+}
+.tabs-horiz > li {
+  float: left;
+  border: 1px solid #e9e4db;
+  border-bottom-width: 0;
+  margin: 0 -1px 0 0;
+}
+.tabs-horiz > li a {
+  position: relative;
+  display: block;
+  padding: 7px 18px 9px;
+  text-decoration: none;
+  font-size: 12px;
+  line-height: 1.666;
+  color: #676056;
+}
+.tabs-horiz > .ui-state-active a {
+  background: #fff;
+  border-top: 3px solid #f3771e;
+  margin-top: -3px;
+  box-shadow: 1px 0 3px #e9e4db;
+}
+/*
+    System -> Configuration page navigation in sidebar
+-------------------------------------- */
+.config-nav,
+.config-nav .items {
+  margin: 0;
+  padding: 0;
+  list-style: none;
+}
+.config-nav-block:last-child {
+  margin-bottom: 30px;
+}
+.config-nav .item {
+  border-top: 1px solid #E5E1DB;
+}
+.config-nav .item:first-child {
+  border-top: 0;
+}
+.config-nav .title {
+  margin-bottom: 0;
+  text-transform: uppercase;
+  color: #444;
+  border: solid #CCC;
+  border-width: 1px 0;
+  opacity: .8;
+  padding: 7px 17px;
+  background: #E6E3DE;
+}
+.config-nav .item-nav {
+  display: block;
+  padding: 8px 18px;
+  text-decoration: none;
+  color: #676056;
+  -webkit-transition: background 0.3s ease-in-out;
+  -moz-transition: background 0.3s ease-in-out;
+  transition: background 0.3s ease-in-out;
+}
+.config-nav .item-nav:hover {
+  background: #fff;
+}
+.config-nav .item-nav.active {
+  position: relative;
+  border-left: 3px solid #d87e34;
+  padding-left: 15px;
+  background: #dedcd8;
+  box-shadow: 0 1px 2px #ccc inset;
+}
+.config-nav .item-nav.active:after {
+  position: absolute;
+  top: 50%;
+  right: 0;
+  width: 14px;
+  margin-top: -14px;
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  speak: none;
+  font-weight: normal;
+  -webkit-font-smoothing: antialiased;
+  content: '\e02b';
+  /* left turned triangle icon */
+
+  font-size: 22px;
+  text-shadow: -1px 1px 0 #bdbbb7;
+  color: #f5f2ed;
+  overflow: hidden;
+  z-index: 3;
+}
+/*
+    Footer
+-------------------------------------- */
+.footer {
+  position: absolute;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  color: #989288;
+  font-size: 11px;
+}
+.footer-content {
+  margin: 0 auto;
+  max-width: 1300px;
+  min-width: 960px;
+  padding: 20px;
+}
+/*
+    Switcher
+-------------------------------------- */
+.switcher {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -khtml-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  cursor: pointer;
+  display: inline-block;
+  overflow: hidden;
+}
+.switcher input[type="checkbox"] {
+  position: absolute;
+  left: -999em;
+}
+.switcher-label {
+  color: #676056;
+  font-size: 13px;
+  font-weight: 600;
+  text-transform: uppercase;
+}
+.switcher-label:before {
+  content: attr(data-text-off);
+}
+.switcher-label:after {
+  display: inline-block;
+  margin-left: 10px;
+  vertical-align: bottom;
+  width: 34px;
+  height: 17px;
+  background: url(../images/switcher.png) no-repeat;
+  content: '';
+}
+.switcher input[type="checkbox"]:focus + .switcher-label:after {
+  border-color: #75b9f0;
+}
+.switcher input[type="checkbox"]:checked + .switcher-label:after {
+  background-position: -34px 0;
+}
+.switcher input[type="checkbox"]:checked + .switcher-label:before {
+  content: attr(data-text-on);
+}
+/*
+    Content actions panel (with buttons, switchers...)
+-------------------------------------- */
+.page-actions {
+  padding: 0 0 20px;
+  text-align: right;
+}
+.page-actions .buttons-group {
+  vertical-align: top;
+  text-align: left;
+}
+.page-actions > .switcher {
+  display: inline-block;
+  vertical-align: top;
+  margin: 6px 10px 0 0;
+}
+.main-col .page-actions {
+  padding: 20px 0;
+}
+.page-actions .store-switcher {
+  float: left;
+}
+.catalog-product-index .page-actions {
+  padding-top: 0;
+}
+/* TODO: refactor trees */
+.x-tree ul {
+  margin: 0;
+  padding: 0;
+}
+.page-actions.fixed {
+  padding: 0 21px;
+  position: fixed;
+  top: 0;
+  left: 0;
+  right: 0;
+  z-index: 998;
+}
+.page-actions.fixed .page-actions-inner {
+  background: -moz-linear-gradient(top, #f5f2ed 0%, #f5f2ed 56%, rgba(245, 242, 237, 0) 100%);
+  /* FF3.6+ */
+
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f2ed), color-stop(56%, #f5f2ed), color-stop(100%, rgba(245, 242, 237, 0)));
+  /* Chrome,Safari4+ */
+
+  background: -webkit-linear-gradient(top, #f5f2ed 0%, #f5f2ed 56%, rgba(245, 242, 237, 0) 100%);
+  /* Chrome10+,Safari5.1+ */
+
+  background: -o-linear-gradient(top, #f5f2ed 0%, #f5f2ed 56%, rgba(245, 242, 237, 0) 100%);
+  /* Opera 11.10+ */
+
+  background: -ms-linear-gradient(top, #f5f2ed 0%, #f5f2ed 56%, rgba(245, 242, 237, 0) 100%);
+  /* IE10+ */
+
+  background: linear-gradient(to bottom, #f5f2ed 0%, #f5f2ed 56%, rgba(245, 242, 237, 0) 100%);
+  /* W3C */
+
+  padding: 11px 20px 11px;
+  min-height: 36px;
+  margin: 0 auto;
+  min-width: 916px;
+  max-width: 1259px;
+}
+.lt-ie10 .page-actions.fixed .page-actions-inner {
+  background: #f5f2ed;
+}
+.page-actions.fixed .page-actions-inner:before {
+  content: attr(data-title);
+  float: left;
+  font-size: 20px;
+  max-width: 50%;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+/*
+    Table Grid
+-------------------------------------- */
+/* Grid - General */
+.grid-container {
+  margin-bottom: 10px;
+}
+.grid {
+  border-bottom: 0;
+  color: #676056;
+  font-size: 13px;
+  font-weight: 400;
+  padding-bottom: .5em;
+}
+.grid table {
+  border-collapse: collapse;
+  border: none;
+  width: 100%;
+}
+.grid table.border {
+  border: 1px solid #c0bbaf;
+}
+.grid tbody {
+  background: #e6e3de;
+}
+.grid tr.even,
+.grid tr.even tr {
+  background: #f5f2ed;
+}
+.grid tr.on-mouse {
+  cursor: pointer;
+}
+.grid tr.on-mouse td,
+.grid table tbody tr.on-mouse:hover td,
+.grid table tbody tr.on-mouse:hover th,
+.grid table tbody tr.on-mouse:nth-child(odd):hover td,
+.grid table tbody tr.on-mouse:nth-child(odd):hover th {
+  background-color: #fff;
+}
+/* Rows mouse-over */
+.grid tr.invalid {
+  background-color: #f5d6c7;
+}
+.grid th,
+.grid td {
+  padding: 2px 4px 2px 4px;
+  vertical-align: top;
+}
+.grid th {
+  border: none;
+}
+.grid td.editable input.input-text {
+  width: 50px;
+  margin-left: 4px;
+}
+.grid td input.input-text {
+  width: 86%;
+}
+.grid td input.input-inactive {
+  background: #eee;
+}
+.grid table td {
+  border: solid #c0bbaf;
+  border-width: 0 1px 1px;
+  padding: 5px;
+}
+.grid table.border td {
+  background: #fff;
+}
+.grid table td.product {
+  text-align: right;
+}
+.grid table td.empty-text {
+  border: solid #c0bbaf;
+  border-width: 0 1px;
+  color: #676056;
+  font-size: 16px;
+  font-weight: 400;
+  text-align: center;
+  padding: 15px;
+}
+.grid table tr:last-child td.empty-text {
+  border-width: 0 1px 1px;
+}
+.grid table td.empty-text:hover {
+  background: #e6e3de;
+}
+.grid table td .action-select {
+  width: 100%;
+}
+.grid tbody.odd tr {
+  background: #fff;
+}
+.grid tbody.even tr {
+  background: #f6f6f6;
+}
+.grid tbody.odd tr td,
+.grid tbody.even tr td {
+  border-bottom: 0;
+}
+.grid tbody.odd tr.border td,
+.grid tbody.even tr.border td {
+  border-bottom: 1px solid #dadfe0;
+}
+/*
+    Grid - Pager and Buttons row
+-------------------------------------- */
+.grid-actions {
+  border: 1px solid #c0bbaf;
+  border-bottom: 0;
+  background: #f6f3ec;
+  background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y2ZjNlYyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNlZGVhZTEiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
+  background: -moz-linear-gradient(top, #f6f3ec 0%, #edeae1 100%);
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f6f3ec), color-stop(100%, #edeae1));
+  background: -webkit-linear-gradient(top, #f6f3ec 0%, #edeae1 100%);
+  background: -o-linear-gradient(top, #f6f3ec 0%, #edeae1 100%);
+  background: -ms-linear-gradient(top, #f6f3ec 0%, #edeae1 100%);
+  background: linear-gradient(to bottom, #f6f3ec 0%, #edeae1 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f6f3ec', endColorstr='#edeae1', GradientType=0);
+  padding: 7px 8px 8px;
+  position: relative;
+}
+[id$='Grid'] .separator {
+  padding: 0 4px;
+  color: #b9b9b9;
+}
+.grid-actions select {
+  margin: 0 5px;
+}
+.grid-actions .export,
+.grid-actions .filter-actions {
+  float: right;
+  margin-left: 30px;
+}
+.grid-actions .filter-actions button {
+  float: left;
+  margin-left: 4px;
+}
+.grid-actions .pager {
+  color: #676056;
+  font-size: 13px;
+  font-weight: 400;
+}
+.grid-actions .pager select {
+  width: 5em;
+  margin: 0 4px;
+}
+.grid-actions .pager input.page {
+  width: 2em;
+}
+.pager .action-next,
+.pager .action-previous {
+  display: inline-block;
+  position: relative;
+  text-indent: 100%;
+  overflow: hidden;
+  height: 16px;
+  width: 16px;
+  vertical-align: middle;
+  text-decoration: none;
+}
+.pager .action-next:after,
+.pager .action-previous:after {
+  font-family: 'MUI-Icons';
+  content: "\e02a";
+  font-size: 16px;
+  color: #333;
+  position: absolute;
+  top: 0;
+  left: 0;
+  line-height: 1;
+  text-indent: 0;
+}
+.pager .action-previous:after {
+  content: "\e02b";
+}
+.pager span.action-next:after,
+.pager span.action-previous:after {
+  color: #7f7f7f;
+}
+.grid-actions .date {
+  float: left;
+  margin: 0 15px 0 0;
+  position: relative;
+}
+.grid-actions .date input {
+  margin: 0 5px;
+  width: 80px;
+}
+.grid-actions .required:after {
+  content: '*';
+  color: #f00;
+}
+[class^=" reports-report-"] .grid-actions .required:after {
+  content: '';
+}
+[class^=" reports-report-"] .grid-actions .required .label span:after {
+  content: '*';
+  color: #f00;
+}
+.grid-actions img {
+  vertical-align: middle;
+  height: 22px;
+  width: 22px;
+}
+.grid-actions .pager img {
+  width: auto;
+  height: auto;
+}
+.grid-actions .validation-advice {
+  background: #f3dcd8;
+  border: 1px solid #963535;
+  border-radius: 3px;
+  color: #963535;
+  margin: 5px 0 0;
+  padding: 3px 7px;
+  position: absolute;
+  white-space: nowrap;
+  z-index: 5;
+}
+.grid-actions .validation-advice:before {
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  speak: none;
+  font-weight: normal;
+  -webkit-font-smoothing: antialiased;
+  content: '\e029';
+  /* user icon */
+
+  position: absolute;
+  top: -12px;
+  left: 50%;
+  margin-left: -3px;
+}
+.grid-actions .link-feed {
+  white-space: nowrap;
+}
+.grid-actions input[type="text"].validation-failed {
+  border-color: #fa7973;
+  box-shadow: 0 0 8px rgba(250, 121, 115, 0.6);
+}
+/*
+    Grid - Headings
+-------------------------------------- */
+.grid tr.headings th {
+  color: #ffffff;
+  font-size: 13px;
+  font-weight: 700;
+  border-right: 1px solid #837f79;
+  padding: 0;
+  vertical-align: bottom;
+}
+.grid tr th:first-child {
+  border-left: 1px solid #837f79;
+}
+.grid tr.headings th > span {
+  display: block;
+  border-bottom: 2px solid transparent;
+  padding: 5px 5px 2px;
+  white-space: nowrap;
+}
+.grid tr.headings th:hover > span {
+  border-color: #504841;
+}
+.grid tr.headings th.no-link:hover > span,
+.grid tr.headings th.col-select:hover > span {
+  border-color: transparent;
+}
+.grid tr.headings th a label {
+  display: block;
+  padding-right: 20px;
+}
+.grid tr.headings th a {
+  display: block;
+  color: #ffffff;
+  font-size: 13px;
+  font-weight: 700;
+  position: relative;
+  text-decoration: none;
+}
+.grid tr.headings th a:after {
+  display: none;
+  height: 8px;
+  width: 15px;
+  position: absolute;
+  bottom: 4px;
+  right: 0;
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  speak: none;
+  font-weight: normal;
+  font-size: 20px;
+  line-height: 8px;
+  -webkit-font-smoothing: antialiased;
+  content: '\e038';
+  /* arrow down icon */
+
+  color: #8c8172;
+}
+.grid tr.headings th a:hover:after {
+  display: block;
+}
+.grid tr.headings th a.sort-arrow-desc:after {
+  color: #c7b299;
+  display: block;
+}
+.grid tr.headings th a.sort-arrow-asc:after {
+  color: #c7b299;
+  content: '\e035';
+  /* arrow up icon */
+
+  display: block;
+}
+.grid tr.headings th a.sort-arrow-desc:hover:after,
+.grid tr.headings th a.sort-arrow-asc:hover:after {
+  color: #fff;
+}
+/* Grid - Filter */
+.grid .filter {
+  cursor: default;
+}
+.grid .filter th {
+  padding: 5px;
+  border-right: 1px solid #837F79;
+  vertical-align: top;
+  white-space: normal;
+}
+.grid .filter input.input-text {
+  background: #5e5a52;
+  border-radius: 2px;
+  border: none;
+  color: #bcb795;
+  padding: 0 5px;
+  height: 20px;
+  width: 99%;
+}
+.grid .filter input.input-text::-webkit-input-placeholder {
+  color: #858376 !important;
+  text-transform: lowercase;
+}
+.grid .filter input.input-text:-moz-placeholder {
+  color: #858376 !important;
+  text-transform: lowercase;
+}
+.grid .filter input.input-text::-moz-placeholder {
+  color: #858376 !important;
+  text-transform: lowercase;
+}
+:-ms-input-placeholder {
+  color: #858376 !important;
+  text-transform: lowercase;
+}
+.grid .filter select {
+  background: #5e5a52;
+  border-radius: 2px;
+  border: none;
+  color: #bcb795;
+  margin: 0;
+  padding: 0;
+  height: 20px;
+  width: 99%;
+}
+.grid td select {
+  font-family: Arial, Helvetica, sans-serif;
+  font-size: 13px;
+  padding: 4px 4px 5px;
+  text-align: left;
+}
+.grid .action-select {
+  background: #fff;
+  border: 1px solid #ccc;
+  margin: 0;
+}
+.grid .filter .range .range-line {
+  margin-bottom: 3px;
+}
+.grid .filter .range div.date {
+  min-width: 121px;
+}
+.grid .filter .range .date input {
+  margin-top: 0;
+  vertical-align: middle;
+  width: 80%;
+}
+.grid .filter .range select {
+  margin: 0;
+  color: #676056;
+  font-size: 11px;
+  font-weight: 400;
+  color: #bcb795;
+}
+.grid .filter .date {
+  position: relative;
+}
+.grid .filter .date img {
+  width: 15px;
+  height: 15px;
+  cursor: pointer;
+  vertical-align: middle;
+  margin-left: 5px;
+  position: relative;
+  z-index: 2;
+  opacity: 0;
+}
+.grid .filter .date:before {
+  position: absolute;
+  left: 80%;
+  top: 1px;
+  margin-left: 5px;
+  text-shadow: none;
+  width: 16px;
+  height: 16px;
+  line-height: 16px;
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  speak: none;
+  font-weight: normal;
+  -webkit-font-smoothing: antialiased;
+  font-size: 16px;
+  content: '\e06a';
+  /* icon calendar  */
+
+  color: #cac3b4;
+  z-index: 1;
+}
+.grid .head-massaction select {
+  width: 50px;
+}
+/* Grid - Mass Action */
+.massaction {
+  color: #cac3b4;
+  padding: 7px 8px;
+  background: #666158;
+  box-shadow: 0 1px 2px 0 #504d46 inset, 0 -1px 2px 0 #504d46 inset;
+  overflow: hidden;
+}
+.massaction ul {
+  list-style: none;
+  margin: 0;
+  padding: 6px 0 0;
+}
+.massaction li {
+  display: inline-block;
+}
+.massaction li:before {
+  color: #837F79;
+  content: '|';
+  display: inline-block;
+  margin: 0 5px;
+}
+.massaction li:first-child:before {
+  display: none;
+}
+.massaction .entry-edit {
+  float: right;
+  display: inline-block;
+}
+.massaction .entry-edit fieldset {
+  margin: 0;
+  padding: 0;
+  background: none;
+  border: none;
+}
+.massaction .entry-edit fieldset select {
+  border-radius: 2px;
+  margin: 0;
+}
+.massaction .entry-edit fieldset select.validation-failed {
+  border: 1px dashed #eb340a;
+  background: #faebe7;
+}
+.massaction .entry-edit .field-row {
+  display: inline-block;
+  vertical-align: middle;
+}
+.massaction .entry-edit .outer-span .entry-edit {
+  float: none;
+}
+.massaction .entry-edit .field-row label {
+  color: #cac3b4;
+  line-height: 26px;
+  margin: 0 5px 0 20px;
+  padding: 0;
+  vertical-align: middle;
+  width: auto;
+  float: none;
+}
+.massaction .entry-edit .validation-advice {
+  display: none !important;
+}
+.massaction a {
+  color: #e7e2d7;
+  text-decoration: none;
+}
+.massaction a:hover {
+  color: #fff;
+}
+/* Grid Footer */
+.grid table tfoot tr {
+  background: #656156;
+}
+.grid table tfoot tr th,
+.grid table tfoot tr td {
+  border-right: 1px solid #837f79;
+  line-height: 1.7em;
+  padding: 3px 10px;
+}
+.grid table tfoot tr th:first-child,
+.grid table tfoot tr td:first-child {
+  border-left: 1px solid #837f79;
+}
+.grid table.border tfoot tr td {
+  background: #656156;
+}
+.grid .col-price,
+.grid .col-number {
+  text-align: right;
+}
+/* Dynamic Grid */
+/* Used in pages like Catalog -> Attributes */
+.dynamic-grid th {
+  padding: 2px;
+  width: 100px;
+}
+.dynamic-grid td {
+  padding: 2px;
+}
+.dynamic-grid td input {
+  width: 94px;
+}
+tr.dynamic-grid td,
+tr.dynamic-grid th {
+  padding: 2px 10px 2px 0;
+  width: auto;
+}
+tr.dynamic-grid input.input-text {
+  width: 154px;
+}
+.available {
+  color: #080;
+  font-weight: bold;
+}
+.not-available {
+  color: #800;
+}
+.categories-side-col {
+  padding: 0 3%;
+}
+/*
+    TODO: change ids to 'table.data' after refactoring of all templates for grids
+    Manage Products Grid
+-------------------------------------- */
+#cross_sell_product_grid table.data,
+#up_sell_product_grid table.data,
+#related_product_grid table.data,
+#productGrid_table,
+#setGrid_table,
+#attributeGrid_table,
+.custom-options .data-table,
+.ui-dialog .data {
+  word-wrap: break-word;
+  table-layout: fixed;
+}
+#cross_sell_product_grid table.data th,
+#up_sell_product_grid table.data th,
+#related_product_grid table.data th,
+#productGrid_table th,
+#setGrid_table th,
+#attributeGrid_table th,
+.custom-options .data-table th,
+.ui-dialog .data th {
+  word-wrap: normal;
+  overflow: hidden;
+  vertical-align: top;
+}
+#cross_sell_product_grid table.data th > span,
+#up_sell_product_grid table.data th > span,
+#related_product_grid table.data th > span,
+#productGrid_table th > span,
+#customerGrid_table th > span,
+#setGrid_table th > span,
+#attributeGrid_table th > span,
+.custom-options .data-table th > span,
+.ui-dialog .data th > span {
+  white-space: normal;
+}
+table .col-draggable .draggable-handle {
+  position: relative;
+  top: 0;
+  float: left;
+}
+.grid table .col-id {
+  text-align: left;
+}
+/*
+    Data table
+-------------------------------------- */
+.data-table {
+  border-collapse: separate;
+  /* do not remove this! without this rule in FF when table has only 1 row bottom and side borders disappear*/
+
+  width: 100%;
+}
+.data-table thead,
+.data-table tfoot,
+.data-table th,
+.accordion .config .data-table thead th,
+.accordion .config .data-table tfoot td {
+  background: #fff;
+  color: #676056;
+  font-size: 13px;
+  font-weight: 600;
+}
+.data-table th {
+  border-color: #c9c2b8;
+  border-width: 0 0 1px;
+  padding: 7px;
+}
+.data-table td,
+.data-table tbody tr td,
+.accordion .config .data-table td {
+  background: #fff;
+  padding: 5px 7px;
+  color: #676056;
+  font-size: 14px;
+  font-weight: 400;
+  vertical-align: middle;
+  border: solid #eae8e4;
+  border-width: 0 0 1px;
+}
+.data-table tbody tr.selected td,
+.data-table tbody tr.selected th,
+.data-table tbody tr:hover td,
+.data-table tbody tr:hover th {
+  background: #fff;
+}
+.data-table tbody tr:nth-child(odd) td,
+.data-table tbody tr:nth-child(odd):hover td,
+.accordion .config .data-table tbody tr:nth-child(odd) td {
+  background: #fbfaf6;
+}
+.data-table tbody tr.odd td {
+  background: #fbfaf6;
+}
+.data-table tfoot tr:last-child td,
+.data-table tfoot tr:last-child th,
+.accordion .config .data-table tfoot tr:last-child td {
+  border: 0;
+}
+.data-table input[type="text"] {
+  width: 98%;
+  padding-left: 1%;
+  padding-right: 1%;
+}
+.data-table select {
+  margin: 0;
+  -moz-box-sizing: border-box;
+  -webkit-box-sizing: border-box;
+  box-sizing: border-box;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+.data-table th.required-entry:after,
+.data-table td.required-entry:after {
+  content: '*';
+  color: red;
+}
+.data-table .col-actions .actions-split {
+  margin-top: 4px;
+}
+.data-table .col-actions .actions-split [class^='action-'] {
+  background: none;
+  border: 1px solid #c8c3b5;
+  padding: 3px 5px;
+  color: #bbb3a6;
+  font-size: 12px;
+}
+.data-table .col-actions .actions-split [class^='action-']:first-child {
+  border-right: 0;
+}
+.data-table .col-actions .actions-split .dropdown-menu {
+  margin-top: -1px;
+}
+.data-table .col-actions .actions-split .dropdown-menu a {
+  display: block;
+  color: #333;
+  text-decoration: none;
+}
+.data-table .col-actions .actions-split.active .action-toggle {
+  position: relative;
+  border-bottom-right-radius: 0;
+  box-shadow: none;
+  background: #fff;
+}
+.data-table .col-actions .actions-split.active .action-toggle:after {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  right: 0;
+  height: 2px;
+  margin-top: -1px;
+  background: #fff;
+  content: '';
+  z-index: 2;
+}
+.data-table .col-actions .actions-split.active .dropdown-menu {
+  border-top-right-radius: 0;
+}
+/*
+    Data table - alternative view
+-------------------------------------- */
+.customer-information .data-table,
+.order-information .data-table,
+.order-account-information .data-table,
+.adminhtml-rma-new .data-table {
+  width: 100%;
+}
+.customer-information .data-table tbody tr th,
+.order-information .data-table tbody tr th,
+.order-account-information .data-table tbody tr th,
+.adminhtml-rma-new .data-table tbody tr th,
+.adminhtml-logging-details .log-details .data-table th,
+[class^=" sales-transactions-"] .data-table tbody tr th,
+[class^=" sales-"] .order-payment-method .data-table tbody tr th,
+[class^=" sales-billing-agreement-"] .log-details .data-table tbody tr th {
+  font-weight: bold;
+}
+.customer-information .data-table tbody tr td,
+.customer-information .data-table tbody tr th,
+.order-information .data-table tbody tr td,
+.order-information .data-table tbody tr th,
+.order-account-information .data-table tbody tr td,
+.order-account-information .data-table tbody tr th,
+.adminhtml-logging-details .log-details .data-table td,
+.adminhtml-logging-details .log-details .data-table th,
+[class^=" adminhtml-rma-"] .data-table tbody tr td,
+[class^=" adminhtml-rma-"] .data-table tbody tr th,
+[class^=" sales-transactions-"] .data-table tbody tr th,
+[class^=" sales-transactions-"] .data-table tbody tr td,
+[class^=" sales-"] .order-payment-method .data-table tbody tr th,
+[class^=" sales-"] .order-payment-method .data-table tbody tr td,
+[class^=" sales-billing-agreement-"] .log-details .data-table tbody tr th,
+[class^=" sales-billing-agreement-"] .log-details .data-table tbody tr td {
+  background-color: #fff;
+  border: 0;
+  padding: 9px 10px 10px;
+  color: #666;
+  vertical-align: top;
+}
+.customer-information .data-table tbody tr:nth-child(2n+1) td,
+.customer-information .data-table tbody tr:nth-child(2n+1) th,
+.order-information .data-table tbody tr:nth-child(2n+1) td,
+.order-information .data-table tbody tr:nth-child(2n+1) th,
+.order-account-information .data-table tbody tr:nth-child(2n+1) td,
+.order-account-information .data-table tbody tr:nth-child(2n+1) th,
+.adminhtml-logging-details .log-details .data-table tr:nth-child(odd) td,
+.adminhtml-logging-details .log-details .data-table tr:nth-child(odd) th,
+[class^=" adminhtml-rma-"] .data-table tbody tr:nth-child(2n+1) td,
+[class^=" adminhtml-rma-"] .data-table tbody tr:nth-child(2n+1) th,
+[class^=" sales-transactions-"] .data-table tbody tr:nth-child(2n+1) th,
+[class^=" sales-transactions-"] .data-table tbody tr:nth-child(2n+1) td,
+[class^=" sales-"] .order-payment-method .data-table tbody tr:nth-child(2n+1) th,
+[class^=" sales-"] .order-payment-method .data-table tbody tr:nth-child(2n+1) td,
+[class^=" sales-billing-agreement-"] .log-details .data-table tbody tr:nth-child(2n+1) th,
+[class^=" sales-billing-agreement-"] .log-details .data-table tbody tr:nth-child(2n+1) td {
+  background-color: #fbfaf6;
+}
+/*
+    Content alignments in tables
+-------------------------------------- */
+/* left */
+.col-website,
+.col-name,
+.col-sku,
+.col-color,
+.col-size,
+.col-product,
+.col-comment,
+.col-actions,
+.col-status {
+  text-align: left;
+}
+/* center */
+.col-include,
+.col-display,
+.col-image,
+.col-no-records,
+.col-select,
+.col-default,
+.col-uqty {
+  text-align: center;
+}
+/* right */
+.col-qty,
+.col-weight,
+.col-price,
+.col-price > input,
+.col-id,
+.col-total,
+.col-average {
+  text-align: right;
+}
+/*
+    Attribute Information
+-------------------------------------- */
+.data-table .col-default {
+  white-space: nowrap;
+  text-align: center;
+  vertical-align: middle;
+}
+.data-table .col-delete {
+  text-align: center;
+  width: 32px;
+}
+.data-table .col-file {
+  white-space: nowrap;
+}
+.data-table .col-file input {
+  margin: 0 5px;
+  width: 40%;
+}
+.data-table .col-file input:first-child {
+  margin-left: 0;
+}
+/*
+    Website store views tree
+-------------------------------------- */
+.store-tree .website-name {
+  font-size: 14px;
+  font-weight: bold;
+}
+.store-tree .webiste-groups {
+  margin: 5px 0 20px 18px;
+}
+.store-tree .webiste-groups dt {
+  font-weight: bold;
+}
+.store-tree .webiste-groups dd {
+  margin: 5px 0 15px 15px;
+}
+.store-tree .webiste-groups dd > ul {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+.store-tree .webiste-groups dd > ul > li {
+  margin: 0 0 5px;
+}
+/*
+    Customer Reviews
+-------------------------------------- */
+.field-detailed_rating .control-value {
+  padding: 0;
+}
+.field-detailed_rating .nested {
+  padding: 0;
+}
+.field-detailed_rating .field-rating {
+  margin: 15px 0 0 0;
+}
+.field-detailed_rating .field-rating:first-child {
+  margin-top: 0;
+}
+.field-detailed_rating .field-rating .label {
+  width: 75px;
+}
+.field-detailed_rating .field-rating .control {
+  unicode-bidi: bidi-override;
+  direction: rtl;
+  width: 125px;
+}
+.field-detailed_rating input[type="radio"] {
+  display: none;
+}
+.field-detailed_rating .field-rating .control label {
+  color: #ccc;
+  cursor: pointer;
+  font-size: 18px;
+  float: right;
+  overflow: hidden;
+  white-space: nowrap;
+  width: 18px;
+  -webkit-transition: color 150ms linear;
+  -moz-transition: color 150ms linear;
+  -o-transition: color 150ms linear;
+  -ms-transition: color 150ms linear;
+  transition: color 150ms linear;
+}
+/*
+    Tree Store Scope
+-------------------------------------- */
+.tree-store-scope .buttons-set {
+  margin-bottom: 9px;
+}
+.tree-store-scope .buttons-set button {
+  margin-right: 4px;
+}
+.tree-store-scope .field {
+  margin: 0 0 5px;
+}
+.tree-store-scope [class^="field field-website_"] .label,
+.tree-store-scope [class^="field field-group_"] .label,
+.tree-store-scope [class^="field field-w_"] .label,
+.tree-store-scope [class^="field field-sg_"] .label {
+  text-align: left;
+  font-size: 18px;
+  padding-right: 0;
+  width: auto;
+}
+.tree-store-scope [class^="field field-group_"] .label,
+.tree-store-scope [class^="field field-sg_"] .label {
+  padding-left: 20px;
+}
+.tree-store-scope .field input[type="checkbox"] {
+  margin-right: 3px;
+  position: relative;
+  top: 2px;
+}
+.tree-store-scope .field .addafter {
+  display: inline-block;
+  padding-top: 6px;
+}
+.tree-store-scope .tooltip .help {
+  margin-top: 11px;
+}
+/*
+    Product Massaction page
+    TODO: css code below should be removed after element.html refactoring
+-------------------------------------- */
+.attributes-edit-form .attribute-change-checkbox {
+  white-space: nowrap;
+  display: block;
+}
+.attributes-edit-form .attribute-change-checkbox > label > input {
+  width: auto;
+}
+.attributes-edit-form .field:last-child,
+.attributes-edit-form .field-name,
+.attributes-edit-form .field.type-price,
+.attributes-edit-form .field-price,
+.attributes-edit-form .field-special_price,
+.attributes-edit-form .field-meta_title,
+.attributes-edit-form .field-visibility,
+.attributes-edit-form .field-custom_design,
+.attributes-edit-form .field-page_layout,
+.attributes-edit-form .field-options_container,
+.attributes-edit-form .field-country_of_manufacture,
+.attributes-edit-form .field-msrp_display_actual_price_type,
+.attributes-edit-form .field-tax_class_id,
+.attributes-edit-form .field-is_returnable,
+.attributes-edit-form .field-msrp,
+.attributes-edit-form .field-gift_wrapping_price {
+  margin-bottom: 50px;
+}
+.attributes-edit-form .field .control {
+  position: relative;
+}
+.attributes-edit-form .field-name .attribute-change-checkbox,
+.attributes-edit-form .field-meta_title .attribute-change-checkbox,
+.attributes-edit-form .field-gift_wrapping_price .attribute-change-checkbox,
+.attributes-edit-form .field .control select + .addafter {
+  position: absolute;
+  left: 0;
+  top: 35px;
+}
+.attributes-edit-form .field.type-price .attribute-change-checkbox,
+.attributes-edit-form .field-price .attribute-change-checkbox,
+.attributes-edit-form .field-special_price .attribute-change-checkbox,
+.attributes-edit-form .field-msrp .attribute-change-checkbox {
+  position: absolute;
+  top: 35px;
+}
+.attributes-edit-form .field-special_from_date > .control .input-text,
+.attributes-edit-form .field-special_to_date > .control .input-text,
+.attributes-edit-form .field-news_from_date > .control .input-text,
+.attributes-edit-form .field-news_to_date > .control .input-text,
+.attributes-edit-form .field-custom_design_from > .control .input-text,
+.attributes-edit-form .field-custom_design_to > .control .input-text {
+  border-width: 1px;
+  border-radius: 4px;
+  width: 130px;
+}
+.attributes-edit-form .field-special_from_date .attribute-change-checkbox,
+.attributes-edit-form .field-special_to_date .attribute-change-checkbox,
+.attributes-edit-form .field-news_from_date .attribute-change-checkbox,
+.attributes-edit-form .field-news_to_date .attribute-change-checkbox,
+.attributes-edit-form .field-custom_design_from .attribute-change-checkbox,
+.attributes-edit-form .field-custom_design_to .attribute-change-checkbox {
+  margin-top: 5px;
+}
+.attributes-edit-form .field-weight .fields-group-2 .control {
+  width: 160px;
+}
+.attributes-edit-form .field-weight .fields-group-2 .control > input {
+  width: 130px;
+  float: left;
+}
+.attributes-edit-form .field-weight .fields-group-2 .control > input + .addafter {
+  position: absolute;
+  top: 35px;
+}
+.attributes-edit-form .field-weight .fields-group-2 .control .addafter strong {
+  line-height: 26px;
+}
+.attributes-edit-form .field .control select {
+  border-radius: 4px;
+}
+.attributes-edit-form .field-gift_message_available .addon > .select,
+.attributes-edit-form .field-gift_wrapping_available .addon > .select {
+  margin-bottom: 25px;
+}
+.attributes-edit-form .field-gift_message_available .addon > input[type="checkbox"],
+.attributes-edit-form .field-gift_wrapping_available .addon > input[type="checkbox"] {
+  width: auto;
+  margin-right: 5px;
+}
+/*
+    Widgets
+-------------------------------------- */
+.widget-layout-updates .fieldset-wrapper,
+.widget-layout-updates .data-table {
+  margin: 0 0 18px;
+}
+.widget-layout-updates .fieldset-wrapper-title label {
+  padding: 10px 0 0;
+}
+.widget-layout-updates .fieldset-wrapper-title select {
+  margin: 3px 10px 5px;
+}
+.widget-layout-updates .fieldset-wrapper-title span,
+.widget-layout-updates .fieldset-wrapper-title select {
+  vertical-align: middle;
+}
+.widget-layout-updates .data-table {
+  table-layout: fixed;
+}
+.widget-layout-updates .data-table,
+.widget-layout-updates .data-table tr:nth-child(odd) td,
+.widget-layout-updates .data-table tr:nth-child(odd):hover td {
+  background: none;
+  border: none;
+}
+.widget-layout-updates .data-table th,
+.widget-layout-updates .data-table tbody td {
+  border: none;
+  padding: 5px 10px;
+  vertical-align: top;
+}
+.widget-layout-updates .data-table select {
+  margin: 0;
+  max-width: 99%;
+  overflow: hidden;
+}
+.widget-layout-updates .chooser_container {
+  padding: 0 10px;
+  margin-bottom: 18px;
+}
+.widget-layout-updates .chooser_container p {
+  margin: 0 0 18px;
+}
+.widget-layout-updates .chooser_container p img,
+.widget-layout-updates .chooser_container p input {
+  vertical-align: middle;
+}
+/*
+    Preview window
+-------------------------------------- */
+.preview-window {
+  background: #fff;
+}
+.preview-window .toolbar {
+  background: #f5f2ed;
+  padding: 20px;
+}
+.preview-window .toolbar .switcher {
+  margin: 0;
+}
+.preview-window .toolbar .switcher span {
+  background: none;
+  width: auto;
+}
+/*
+    Global 'No Products found' block
+-------------------------------------- */
+.no-products-message {
+  background: #fbfaf6;
+  padding: 12px;
+  text-align: center;
+  font-size: 12px;
+  color: #666;
+  margin-bottom: 13px;
+}
+/*
+    WYSIWYG
+-------------------------------------- */
+.action-wysiwyg {
+  margin: 10px 0;
+}
+#catalog-wysiwyg-editor .buttons-set {
+  margin-bottom: 9px;
+}
+#catalog-wysiwyg-editor .buttons-set button {
+  margin-right: 4px;
+}
+/*
+    System Messages
+-------------------------------------- */
+.message-system {
+  min-width: 960px;
+  max-width: 1300px;
+  margin: 0 auto;
+  overflow: hidden;
+}
+.message-system-inner {
+  background: #f7f3eb;
+  border: 1px solid #c0bbaf;
+  border-top: 0;
+  border-radius: 0 0 5px 5px;
+  float: right;
+  overflow: hidden;
+}
+.message-system-unread .message-system-inner {
+  float: none;
+}
+.message-system-list {
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  float: left;
+}
+.message-system .message-system-list {
+  width: 75%;
+}
+.message-system-list li {
+  padding: 5px 13px 7px 36px;
+  position: relative;
+}
+.message-system-short {
+  padding: 5px 13px 7px;
+  float: right;
+}
+.message-system-short span {
+  display: inline-block;
+  margin-left: 7px;
+  border-left: 1px #d1ccc3 solid;
+}
+.message-system-short span:first-child {
+  border: 0;
+  margin-left: 0;
+}
+.message-system-short a {
+  padding-left: 27px;
+  position: relative;
+  height: 16px;
+}
+.message-system .message-system-short a:before,
+.message-system-list li:before {
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  speak: none;
+  font-weight: normal;
+  -webkit-font-smoothing: antialiased;
+  height: 16px;
+  width: 16px;
+  font-size: 16px;
+  line-height: 16px;
+  text-align: center;
+  position: absolute;
+  left: 7px;
+  top: 2px;
+}
+.message-system-list li:before {
+  top: 5px;
+  left: 13px;
+}
+.message-system .message-system-short .warning a:before,
+.message-system-list li.warning:before {
+  content: "\e006";
+  color: #f2a825;
+}
+.message-system .message-system-short .error a:before,
+.message-system-list li.error:before {
+  content: "\e086";
+  font-family: 'MUI-Icons';
+  color: #c00815;
+}
+.ui-dialog .message-system-list {
+  margin-bottom: 25px;
+}
+/*
+    Add Attribute Popup
+-------------------------------------- */
+#create_new_attribute {
+  overflow: hidden;
+}
+#create_new_attribute > .loading-mask {
+  left: -25px;
+  top: -50px;
+}
+.attribute-popup {
+  background: none;
+}
+.attribute-popup #edit_form > .fieldset > .legend {
+  display: none;
+}
+.attribute-popup .wrapper-popup {
+  padding: 0;
+  height: 511px;
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+.attribute-popup .fieldset,
+.attribute-popup .fieldset-wrapper {
+  border: none;
+  border-radius: 0;
+  padding: 4px 0 20px;
+  margin: 0 23px 20px;
+}
+.attribute-popup .fieldset-wrapper {
+  border-top: none;
+}
+.attribute-popup .fieldset-wrapper .fieldset-wrapper-title {
+  border-bottom: none;
+}
+.attribute-popup .fieldset-wrapper .fieldset-wrapper-content > .fieldset {
+  margin-left: 0;
+  margin-right: 0;
+}
+.attribute-popup .fieldset > .field > input[type="checkbox"] {
+  margin-top: 7px;
+}
+.attribute-popup .fieldset .label {
+  width: 35%;
+}
+.attribute-popup .collapsable-wrapper,
+#manage-titles-wrapper .fieldset-wrapper-title {
+  margin-bottom: 0;
+  padding-bottom: 0;
+}
+.attribute-popup .collapsable-wrapper .fieldset-wrapper-title > .title:before {
+  color: #797269;
+  font-size: 14px;
+  top: 9px;
+}
+.attribute-popup form .entry-edit:first-child .fieldset {
+  border-bottom: 1px solid #dfdcd7;
+}
+.attribute-popup .fieldset .legend {
+  border: none;
+}
+.attribute-popup .page-actions {
+  position: fixed;
+  top: auto !important;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  background: #fff;
+  padding: 27px 50px 25px 23px;
+  border-top: 1px solid #dfdcd7;
+}
+.attribute-popup .page-actions [class^='action-'] {
+  margin-left: 18px;
+}
+.attribute-popup #base_fieldset {
+  padding-top: 20px;
+}
+.attribute-popup #base_fieldset > .legend {
+  display: none;
+}
+.attribute-popup .page-actions #reset,
+.attribute-popup .page-actions #reset:hover,
+.attribute-popup .page-actions #reset:active,
+.attribute-popup .page-actions #reset:focus {
+  float: right;
+  vertical-align: middle;
+  margin: 5px 0 0 18px;
+}
+.attribute-popup .page-actions-placeholder {
+  display: none;
+}
+.attribute-popup .page-actions.fixed .page-actions-inner {
+  background: #fff;
+  padding: 0;
+  min-width: 100%;
+  max-width: 100%;
+  min-height: 100%;
+  margin: 0;
+}
+.attribute-popup .footer {
+  display: none;
+}
+#manage-options-panel > .data-table {
+  clear: both;
+}
+.CustomGridView .col-1-layout,
+.sales-order-index .col-1-layout,
+.adminhtml-rma-index .col-1-layout,
+.adminhtml-catalog-event-index .col-1-layout,
+.adminhtml-urlrewrite-index .col-1-layout,
+.catalog-search-index .col-1-layout,
+.catalog-product-review-index .col-1-layout,
+.catalog-rule-promo-catalog-index .col-1-layout,
+.sales-rule-promo-quote-index .col-1-layout,
+.adminhtml-reminder-index .col-1-layout,
+.newsletter-template-index .col-1-layout,
+.adminhtml-system-email-template-index .col-1-layout,
+.adminhtml-sitemap-index .col-1-layout,
+.adminhtml-googleshopping-types-index .col-1-layout,
+.customer-index-index .col-1-layout,
+.adminhtml-cms-page-index .col-1-layout,
+.cms-block-index .col-1-layout,
+.adminhtml-banner-index .col-1-layout,
+.adminhtml-widget-instance-index .col-1-layout,
+.cms-page-index .col-1-layout,
+.adminhtml-webapi-user-index .col-1-layout,
+.adminhtml-webapi-role-index .col-1-layout,
+.adminhtml-system-variable-index .col-1-layout,
+.adminhtml-user-index .col-1-layout,
+.adminhtml-user-role-index .col-1-layout,
+.adminhtml-integration-index .col-1-layout,
+.adminhtml-system-design-theme-index .col-1-layout,
+.adminhtml-system-design-index .col-1-layout,
+.adminhtml-customer-attribute-index .col-1-layout,
+.adminhtml-customer-address-attribute-index .col-1-layout,
+.rating-index-index .col-1-layout,
+.tax-rule-index .col-1-layout,
+.tax-rate-index .col-1-layout,
+.adminhtml-rma-item-attribute-index .col-1-layout,
+.adminhtml-reward-rate-index .col-1-layout,
+.customer-group-index .col-1-layout,
+.checkout-agreement-index .col-1-layout,
+.catalog-product-attribute-index .col-1-layout,
+.catalog-product-set-index .col-1-layout,
+.catalog-product-index .col-1-layout,
+.sales-invoice-index .col-1-layout,
+.sales-shipment-index .col-1-layout,
+.sales-creditmemo-index .col-1-layout,
+.sales-billing-agreement-index .col-1-layout,
+.sales-transactions-index .col-1-layout,
+.sales-recurring-profile-index .col-1-layout,
+.adminhtml-googleshopping-items-index .col-1-layout,
+.customer-online-index .col-1-layout,
+.newsletter-queue-index .col-1-layout,
+.newsletter-subscriber-index .col-1-layout,
+.adminhtml-report-shopcart-product .col-1-layout,
+.adminhtml-report-shopcart-abandoned .adminhtml-report-product-downloads .col-1-layout,
+.adminhtml-report-product-sold .col-1-layout,
+.adminhtml-report-product-lowstock .col-1-layout,
+.adminhtml-report-customer-accounts .col-1-layout,
+.adminhtml-report-customer-totals .col-1-layout,
+.adminhtml-report-customer-orders .col-1-layout,
+.adminhtml-report-customer-wishlist-wishlist .col-1-layout,
+.adminhtml-report-review-customer .col-1-layout,
+.adminhtml-report-review-product .col-1-layout,
+.adminhtml-report-search .col-1-layout,
+.adminhtml-report-statistics-index .col-1-layout,
+.newsletter-problem-index .col-1-layout,
+.adminhtml-system-store-index .col-1-layout,
+.sales-order-status-index .col-1-layout,
+.adminhtml-system-currency-index .col-1-layout,
+.adminhtml-system-currencysymbol-index .col-1-layout,
+.adminhtml-scheduled-operation-index .col-1-layout,
+.adminhtml-cache-index .col-1-layout,
+.adminhtml-system-backup-index .col-1-layout,
+.adminhtml-locks-index .col-1-layout,
+.adminhtml-notification-index .col-1-layout,
+.adminhtml-logging-archive .col-1-layout,
+.adminhtml-logging-index .col-1-layout,
+.adminhtml-process-list .col-1-layout,
+.catalog-product-index .col-1-layout {
+  padding: 0;
+  background: transparent;
+  border: 0;
+  border-radius: 0;
+  max-width: 1300px;
+  min-width: 960px;
+}
+.CustomGridAction .grid-actions,
+.sales-order-index .grid-actions,
+.adminhtml-rma-index .grid-actions,
+.adminhtml-catalog-event-index .grid-actions,
+.adminhtml-urlrewrite-index .grid-actions,
+.catalog-search-index .grid-actions,
+.catalog-product-review-index .grid-actions,
+.catalog-rule-promo-catalog-index .grid-actions,
+.sales-rule-promo-quote-index .grid-actions,
+.adminhtml-reminder-index .grid-actions,
+.newsletter-template-index .grid-actions,
+.adminhtml-system-email-template-index .grid-actions,
+.adminhtml-sitemap-index .grid-actions,
+.adminhtml-googleshopping-types-index .grid-actions,
+.customer-index-index .grid-actions,
+.adminhtml-cms-page-index .grid-actions,
+.cms-block-index .grid-actions,
+.adminhtml-banner-index .grid-actions,
+.adminhtml-widget-instance-index .grid-actions,
+.cms-page-index .grid-actions,
+.adminhtml-webapi-user-index .grid-actions,
+.adminhtml-webapi-role-index .grid-actions,
+.adminhtml-system-variable-index .grid-actions,
+.adminhtml-user-index .grid-actions,
+.adminhtml-user-role-index .grid-actions,
+.adminhtml-integration-index .grid-actions,
+.adminhtml-system-design-theme-index .grid-actions,
+.adminhtml-system-design-index .grid-actions,
+.adminhtml-customer-attribute-index .grid-actions,
+.adminhtml-customer-address-attribute-index .grid-actions,
+.rating-index-index .grid-actions,
+.tax-rule-index .grid-actions,
+.tax-rate-index .grid-actions,
+.adminhtml-rma-item-attribute-index .grid-actions,
+.adminhtml-reward-rate-index .grid-actions,
+.customer-group-index .grid-actions,
+.checkout-agreement-index .grid-actions,
+.catalog-product-attribute-index .grid-actions,
+.catalog-product-set-index .grid-actions,
+.catalog-product-index .grid-actions {
+  border-radius: 5px 5px 0 0;
+  margin-top: 20px;
+  padding: 9px 16px 9px 65px;
+}
+.CustomGridAction .page-actions.fixed,
+.sales-order-index .page-actions.fixed,
+.adminhtml-rma-index .page-actions.fixed,
+.adminhtml-catalog-event-index .page-actions.fixed,
+.adminhtml-urlrewrite-index .page-actions.fixed,
+.catalog-search-index .page-actions.fixed,
+.catalog-product-review-index .page-actions.fixed,
+.catalog-rule-promo-catalog-index .page-actions.fixed,
+.sales-rule-promo-quote-index .page-actions.fixed,
+.adminhtml-reminder-index .page-actions.fixed,
+.newsletter-template-index .page-actions.fixed,
+.adminhtml-system-email-template-index .page-actions.fixed,
+.adminhtml-sitemap-index .page-actions.fixed,
+.adminhtml-googleshopping-types-index .page-actions.fixed,
+.customer-index-index .page-actions.fixed,
+.adminhtml-cms-page-index .page-actions.fixed,
+.cms-block-index .page-actions.fixed,
+.adminhtml-banner-index .page-actions.fixed,
+.adminhtml-widget-instance-index .page-actions.fixed,
+.cms-page-index .page-actions.fixed,
+.adminhtml-webapi-user-index .page-actions.fixed,
+.adminhtml-webapi-role-index .page-actions.fixed,
+.adminhtml-system-variable-index .page-actions.fixed,
+.adminhtml-user-index .page-actions.fixed,
+.adminhtml-user-role-index .page-actions.fixed,
+.adminhtml-integration-index .page-actions.fixed,
+.adminhtml-system-design-theme-index .page-actions.fixed,
+.adminhtml-system-design-index .page-actions.fixed,
+.adminhtml-customer-attribute-index .page-actions.fixed,
+.adminhtml-customer-address-attribute-index .page-actions.fixed,
+.rating-index-index .page-actions.fixed,
+.tax-rule-index .page-actions.fixed,
+.tax-rate-index .page-actions.fixed,
+.adminhtml-rma-item-attribute-index .page-actions.fixed,
+.adminhtml-reward-rate-index .page-actions.fixed,
+.customer-group-index .page-actions.fixed,
+.checkout-agreement-index .page-actions.fixed,
+.catalog-product-attribute-index .page-actions.fixed,
+.catalog-product-set-index .page-actions.fixed,
+.catalog-product-index .page-actions.fixed {
+  left: 0;
+  margin: 0;
+  padding: 0 21px;
+  position: fixed;
+}
+.CustomGridAction .page-actions,
+.sales-order-index .page-actions,
+.adminhtml-rma-index .page-actions,
+.adminhtml-catalog-event-index .page-actions,
+.adminhtml-urlrewrite-index .page-actions,
+.catalog-search-index .page-actions,
+.catalog-product-review-index .page-actions,
+.catalog-rule-promo-catalog-index .page-actions,
+.sales-rule-promo-quote-index .page-actions,
+.adminhtml-reminder-index .page-actions,
+.newsletter-template-index .page-actions,
+.adminhtml-system-email-template-index .page-actions,
+.adminhtml-sitemap-index .page-actions,
+.adminhtml-googleshopping-types-index .page-actions,
+.customer-index-index .page-actions,
+.adminhtml-cms-page-index .page-actions,
+.cms-block-index .page-actions,
+.adminhtml-banner-index .page-actions,
+.adminhtml-widget-instance-index .page-actions,
+.cms-page-index .page-actions,
+.adminhtml-webapi-user-index .page-actions,
+.adminhtml-webapi-role-index .page-actions,
+.adminhtml-system-variable-index .page-actions,
+.adminhtml-user-index .page-actions,
+.adminhtml-user-role-index .page-actions,
+.adminhtml-integration-index .page-actions,
+.adminhtml-system-design-theme-index .page-actions,
+.adminhtml-system-design-index .page-actions,
+.adminhtml-customer-attribute-index .page-actions,
+.adminhtml-customer-address-attribute-index .page-actions,
+.rating-index-index .page-actions,
+.tax-rule-index .page-actions,
+.tax-rate-index .page-actions,
+.adminhtml-rma-item-attribute-index .page-actions,
+.adminhtml-reward-rate-index .page-actions,
+.customer-group-index .page-actions,
+.checkout-agreement-index .page-actions,
+.catalog-product-attribute-index .page-actions,
+.catalog-product-set-index .page-actions,
+.catalog-product-index .page-actions {
+  position: absolute;
+  z-index: 2;
+  margin-top: 10px;
+  margin-left: 15px;
+  padding: 0;
+}
+.adminhtml-googleshopping-items-index .grid-title,
+.adminhtml-system-backup-index .page-actions,
+.adminhtml-scheduled-operation-index .page-actions,
+.adminhtml-system-currency-index .page-actions,
+.adminhtml-system-currencysymbol-index .page-actions,
+.adminhtml-cache-index .page-actions,
+.adminhtml-system-store-index .page-actions,
+.sales-order-status-index .page-actions {
+  border: 1px solid #c0bbaf;
+  border-bottom: 0;
+  background: #f6f3ec;
+  background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y2ZjNlYyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNlZGVhZTEiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
+  background: -moz-linear-gradient(top, #f6f3ec 0%, #edeae1 100%);
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f6f3ec), color-stop(100%, #edeae1));
+  background: -webkit-linear-gradient(top, #f6f3ec 0%, #edeae1 100%);
+  background: -o-linear-gradient(top, #f6f3ec 0%, #edeae1 100%);
+  background: -ms-linear-gradient(top, #f6f3ec 0%, #edeae1 100%);
+  background: linear-gradient(to bottom, #f6f3ec 0%, #edeae1 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f6f3ec', endColorstr='#edeae1', GradientType=0);
+  padding: 7px 8px 8px;
+  position: relative;
+  float: none;
+}
+.adminhtml-googleshopping-items-index .grid {
+  padding-bottom: 25px;
+}
+.adminhtml-googleshopping-items-index .grid-title .title {
+  font-size: 18px;
+}
+.adminhtml-googleshopping-items-index .page-actions {
+  float: right;
+}
+.adminhtml-system-backup-index .page-actions.fixed,
+.adminhtml-scheduled-operation-index .page-actions.fixed,
+.adminhtml-system-currency-index .page-actions.fixed,
+.adminhtml-system-currencysymbol-index .page-actions.fixed,
+.adminhtml-cache-index .page-actions.fixed,
+.adminhtml-system-store-index .page-actions.fixed,
+.sales-order-status-index .page-actions.fixed {
+  background-image: none;
+  padding: 0 21px;
+  position: fixed;
+}
+.catalog-product-index .grid-actions {
+  padding-left: 90px;
+}
+.catalog-rule-promo-catalog-index .grid-actions {
+  padding-left: 210px;
+}
+.catalog-rule-promo-catalog-index .page-actions .apply {
+  float: right;
+  margin: 0 0 0 10px;
+}
+.catalog-product-index .field-store-switcher {
+  padding: 0;
+}
+.sidebar-actions {
+  padding: 14px 0;
+}
+.sidebar-actions button {
+  margin: 0 0 5px;
+}
+.sales-order-create-index .grid table .action-configure {
+  float: right;
+}
+.adminhtml-system-currency-index .import-service {
+  float: left;
+}
+.adminhtml-system-currency-index .page-actions.fixed .import-service {
+  display: inline-block;
+  float: none;
+}
+.fpt-item-container select {
+  width: 100%;
+}
+.fpt-item-container select:first-child {
+  margin-bottom: 8px;
+}
+.clearfix:before,
+.clearfix:after,
+[class$="-layout"]:after,
+.footer-content:before,
+.footer-content:after,
+.page-title-inner:before,
+.page-title-inner:after,
+.tabs-horiz:before,
+.tabs-horiz:after,
+.navigation > ul:before,
+.navigation > ul:after,
+.actions-split:before,
+.actions-split:after,
+.page-create-order:before,
+.page-create-order:after,
+.order-addresses:before,
+.order-addresses:after,
+.order-methods:before,
+.order-methods:after,
+.order-summary:before,
+.order-summary:after,
+.order-methods:before,
+.order-methods:after,
+.grid-actions:before,
+.grid-actions:after,
+.fieldset-wrapper-title:before,
+.fieldset-wrapper-title:after {
+  content: "";
+  display: table;
+}
+.clearfix:after,
+[class$="-layout"]:after,
+.footer-content:after,
+.page-title-inner:after,
+.tabs-horiz:after,
+.navigation > ul:after,
+.actions-split:after,
+.page-create-order:after,
+.order-addresses:after,
+.order-methods:after,
+.order-summary:after,
+.order-methods:after,
+.grid-actions:after,
+.fieldset-wrapper-title:after {
+  clear: both;
+}
diff --git a/app/design/adminhtml/magento_backend/css/header.css b/app/design/adminhtml/magento_backend/css/header.css
new file mode 100644
index 0000000000000000000000000000000000000000..7ea154188d004d2ee803c5958ce263aa34492802
--- /dev/null
+++ b/app/design/adminhtml/magento_backend/css/header.css
@@ -0,0 +1,710 @@
+/**
+ * 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)
+ */
+/*
+    Header
+-------------------------------------- */
+.header {
+  position: relative;
+  background: #f5f2ea;
+  background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y1ZjJlYSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmMWVkZTMiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
+  background: -moz-linear-gradient(top, #f5f2ea 0%, #f1ede3 100%);
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f2ea), color-stop(100%, #f1ede3));
+  background: -webkit-linear-gradient(top, #f5f2ea 0%, #f1ede3 100%);
+  background: -o-linear-gradient(top, #f5f2ea 0%, #f1ede3 100%);
+  background: -ms-linear-gradient(top, #f5f2ea 0%, #f1ede3 100%);
+  background: linear-gradient(to bottom, #f5f2ea 0%, #f1ede3 100%);
+  z-index: 992;
+  padding: 0 20px;
+}
+.header-inner {
+  min-width: 960px;
+  max-width: 1300px;
+  margin: 0 auto;
+  padding: 7px 0;
+}
+.header .logo {
+  display: block;
+  width: 109px;
+  height: 27px;
+  text-indent: -999em;
+  background: url(Magento_Backend::images/logo-magento-small.png) no-repeat;
+  margin: 0;
+}
+.header-panel {
+  float: right;
+  font-size: 12px;
+}
+/*
+    Header Dropdown
+-------------------------------------- */
+.header-panel .dropdown-menu {
+  display: none;
+  width: 195px;
+  margin: 8px -87px 0 0;
+  border: 0;
+  -moz-border-radius: 5px;
+  -webkit-border-radius: 5px;
+  border-radius: 5px;
+  -moz-box-shadow: 0 2px 7px 2px rgba(0, 0, 0, 0.2);
+  -webkit-box-shadow: 0 2px 7px 2px rgba(0, 0, 0, 0.2);
+  box-shadow: 0 2px 7px 2px rgba(0, 0, 0, 0.2);
+}
+.header-panel .dropdown-menu > li {
+  position: relative;
+  padding: 20px 30px 13px 18px;
+  background: #f7f3eb;
+  border-bottom: 1px solid #f7e4d0;
+  white-space: normal;
+}
+.header-panel .dropdown-menu > li:hover {
+  background: #fff;
+}
+.header-panel .dropdown-menu > li:first-child:hover:before,
+.header-panel .dropdown-menu > li.first:hover:before {
+  color: #fff;
+}
+.header-panel .dropdown-menu > li a {
+  display: block;
+  text-decoration: none;
+  color: #8c867e;
+  margin: 0 0 10px;
+}
+.header-panel .dropdown-menu > li a:hover {
+  text-decoration: underline;
+}
+.header-panel .dropdown-menu > li:first-child,
+.header-panel .dropdown-menu > li.first {
+  -moz-border-radius: 5px 5px 0 0;
+  -webkit-border-radius: 5px 5px 0 0;
+  border-radius: 5px 5px 0 0;
+}
+.header-panel .dropdown-menu > li:last-child,
+.header-panel .dropdown-menu > li.last {
+  border-bottom: 0;
+  -moz-border-radius: 0 0 5px 5px;
+  -webkit-border-radius: 0 0 5px 5px;
+  border-radius: 0 0 5px 5px;
+}
+/*
+    Account
+-------------------------------------- */
+.header-panel .account {
+  position: relative;
+  float: left;
+  margin: 0 0 0 30px;
+  padding: 6px 0 0;
+}
+.header-panel .account > a {
+  color: #656057;
+  position: relative;
+  display: inline-block;
+  min-width: 20px;
+  text-decoration: none;
+  padding: 0 10px 0 0;
+}
+.header-panel .account > a:before {
+  position: absolute;
+  top: 2px;
+  right: 0;
+  bottom: 0;
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  speak: none;
+  font-weight: normal;
+  font-size: 9px;
+  -webkit-font-smoothing: antialiased;
+  content: '\e02c';
+  /*  icon point down */
+
+}
+.header-panel .account img {
+  position: relative;
+  border-radius: 3px;
+  z-index: 1;
+}
+.no-js .header-panel .account:hover > a {
+  padding-bottom: 5px;
+  margin-bottom: -5px;
+}
+.header-panel .account.active .dropdown-menu,
+.no-js .header-panel .account:hover .dropdown-menu,
+.no-js .header-panel .account > a:focus + .dropdown-menu {
+  display: block;
+}
+/*
+    Link to store front
+-------------------------------------- */
+.header-panel .store-front {
+  color: #676056;
+  text-decoration: none;
+  position: relative;
+  padding: 6px 0 0 20px;
+  float: left;
+  margin: 0 0 0 30px;
+}
+.header-panel .store-front:before {
+  font-family: 'admin-icons';
+  font-style: normal;
+  speak: none;
+  font-weight: normal;
+  -webkit-font-smoothing: antialiased;
+  content: '\e005';
+  /* icon store info */
+
+  font-size: 17px;
+  position: absolute;
+  left: 0;
+  top: 4px;
+}
+/*
+    Messages
+-------------------------------------- */
+.header-panel .notifications {
+  position: relative;
+  float: left;
+  margin: 0 6px 0 21px;
+  padding: 9px 0 0;
+}
+.header-panel .notifications-icon {
+  position: relative;
+  display: inline-block;
+  height: 12px;
+  width: 17px;
+  text-decoration: none;
+  text-align: center;
+  background: #cac2b5;
+  box-shadow: 0 1px 0 #fff;
+  border-radius: 2px;
+}
+.header-panel .notifications-icon:hover,
+.header-panel .notifications-icon:active {
+  background: #b0a798;
+}
+.header-panel .notifications-icon:before {
+  position: absolute;
+  left: 0;
+  right: 0;
+  bottom: -7px;
+  margin-top: -5px;
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  speak: none;
+  font-weight: normal;
+  -webkit-font-smoothing: antialiased;
+  content: '\e02c';
+  /* user icon */
+
+  font-size: 8px;
+  color: #cac2b5;
+  text-shadow: 0 1px 0 #fff;
+}
+.header-panel .notifications-icon:hover:before,
+.header-panel .notifications-icon:active:before {
+  color: #b0a798;
+}
+.header-panel .notifications .value {
+  color: #ffffff;
+  font-size: 12px;
+  font-weight: 600;
+  line-height: 11px;
+  padding: 1px 3px;
+  min-width: 10px;
+  background: #f58220;
+  border: 1px solid #bd5100;
+  border-radius: 4px;
+  box-shadow: 0 1px 0 #31302b;
+  left: 6px;
+  top: -5px;
+  position: absolute;
+}
+.header-panel .notifications.active .dropdown-menu {
+  display: block;
+  margin-top: 12px;
+  border: 2px solid #676056;
+  width: 288px;
+  margin: 8px -52px 0 0;
+}
+.header-panel .dropdown-menu > li {
+  background: #fff;
+  border-bottom: 0;
+  position: relative;
+  padding: 13px 26px 14px 16px;
+  white-space: normal;
+}
+.header-panel .dropdown-menu > li:after {
+  border-bottom: 1px solid #f7e4d0;
+  display: block;
+  position: absolute;
+  bottom: 0;
+  left: 2px;
+  content: '';
+  width: 284px;
+}
+.header-panel .dropdown-menu > li:last-child:after,
+.header-panel .dropdown-menu > li.last:after {
+  display: none;
+}
+.header-panel .notifications > .dropdown-menu .notification-description {
+  max-height: 43px;
+  overflow: hidden;
+  display: block;
+  color: #676056;
+  font-size: 11px;
+  font-weight: 400;
+}
+.header-panel .notifications > .dropdown-menu .notification-entry {
+  display: none;
+}
+.header-panel .notifications .dropdown-menu:before,
+.header-panel .notifications .dropdown-menu:after {
+  position: absolute;
+  width: 10px;
+  height: 10px;
+  right: 55px;
+  top: -10px;
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  font-weight: normal;
+  font-size: 13px;
+  speak: none;
+  -webkit-font-smoothing: antialiased;
+  content: '\e029';
+  /* user icon */
+
+  color: #fff;
+  z-index: 2;
+}
+.header-panel .notifications .dropdown-menu:after {
+  color: #676056;
+  font-size: 17px;
+  height: 12px;
+  right: 57px;
+  top: -14px;
+  z-index: 1;
+}
+.header-panel .notifications > .dropdown-menu .notification-entry:first-child {
+  display: block;
+}
+.header-panel .notifications > .dropdown-menu .notification-entry:first-child + .notification-entry {
+  display: block;
+}
+.header-panel .notifications > .dropdown-menu .notification-entry:first-child + .notification-entry + .notification-entry {
+  display: block;
+}
+.header-panel .notifications > .dropdown-menu .notification-entry:first-child + .notification-entry + .notification-entry + .notification-entry {
+  display: block;
+}
+.header-panel .notifications > .dropdown-menu .notification-entry:first-child + .notification-entry + .notification-entry + .notification-entry + .notification-entry {
+  display: block;
+}
+.header-panel .notifications > .dropdown-menu .notification-entry:nth-child(-n+5) {
+  display: block;
+}
+.header-panel .notifications > .dropdown-menu .notification-entry .notification-dialog-content {
+  display: none;
+}
+/*
+    Notification entry dialog
+-------------------------------------- */
+.notification-entry-dialog .notification-dialog-content,
+.notification-entry-dialog .ui-dialog-buttonpane {
+  background: #fefaf6;
+}
+.notification-entry-dialog .ui-dialog-titlebar {
+  background: #f9f1e8;
+}
+.notification-entry-dialog .ui-dialog-title {
+  font-size: 22px;
+  padding-left: 24px;
+}
+.notification-entry-dialog-critical .ui-dialog-titlebar {
+  background: #fee4d0;
+}
+.notification-entry-dialog-critical .ui-dialog-title {
+  padding-left: 54px;
+}
+.notification-entry-dialog-critical .ui-dialog-title:before {
+  content: "\e086";
+  font-family: 'MUI-Icons';
+  color: #c00815;
+  font-style: normal;
+  font-weight: normal;
+  font-size: 26px;
+  speak: none;
+  -webkit-font-smoothing: antialiased;
+  left: 21px;
+  position: absolute;
+  top: 16px;
+}
+.notification-entry-dialog .ui-dialog-titlebar-close:before {
+  font-size: 15px;
+}
+.notification-entry-dialog .notification-dialog-content {
+  padding-top: 19px;
+  padding-bottom: 16px;
+}
+.notification-entry-dialog .notification-dialog-content strong {
+  display: block;
+  color: #f58220;
+  font-size: 18px;
+  font-weight: 500;
+}
+.notification-entry-dialog .notification-dialog-content .notification-description {
+  display: block;
+  font-family: Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.42;
+  padding: 3px 0 7px;
+}
+.notification-entry-dialog .notification-dialog-content time {
+  color: #8c867e;
+  font-size: 13px;
+  font-family: Helvetica, Arial, sans-serif;
+  position: absolute;
+  right: 17px;
+  bottom: 27px;
+  text-align: right;
+}
+.notification-entry-dialog .notification-dialog-content .actions {
+  margin-bottom: 22px;
+}
+.notification-entry-dialog .notification-dialog-content .actions a {
+  color: #676056;
+  position: relative;
+  margin-right: 20px;
+}
+.notification-entry-dialog .notification-dialog-content .actions a:after {
+  content: "\e084";
+  font-family: 'MUI-Icons';
+  color: #6a5f54;
+  font-size: 12px;
+  speak: none;
+  -webkit-font-smoothing: antialiased;
+  position: absolute;
+  right: -17px;
+  top: -2px;
+}
+.notification-entry-dialog .ui-dialog-buttonset {
+  text-align: left;
+}
+.notification-entry-dialog .ui-dialog-buttonpane {
+  margin: 0;
+  padding: 0 24px 22px;
+}
+.notification-entry-dialog .ui-dialog-buttonset button[class^="action-"] {
+  background-image: none;
+  margin: 0 16px 0 0;
+  vertical-align: middle;
+  text-shadow: none;
+  box-shadow: none;
+  border: 0;
+}
+.notification-entry-dialog .ui-dialog-buttonset .action-acknowledge {
+  background-color: #f47b20;
+  border: 0;
+  padding: 5px 15px;
+}
+.notification-entry-dialog .ui-dialog-buttonset .action-acknowledge:hover {
+  background-color: #e47821;
+}
+.notification-entry-dialog .ui-dialog-buttonset .action-cancel {
+  background-color: #dbd6ce;
+  border: 0;
+  padding: 5px 15px;
+}
+.notification-entry-dialog .ui-dialog-buttonset .action-cancel:hover {
+  background-color: #d3cdc4;
+}
+.header-panel .account > .dropdown-menu a,
+.header-panel .search .autocomplete-results .title {
+  display: block;
+  color: #f58220;
+  font-size: 14px;
+  font-weight: 500;
+  margin-bottom: 5px;
+}
+.header-panel .notifications > .dropdown-menu li > strong {
+  display: block;
+  color: #026294;
+  font-size: 12px;
+  font-weight: 600;
+  max-height: 32px;
+  overflow: hidden;
+  line-height: 1.4;
+  margin-bottom: 4px;
+}
+.header-panel .notifications > .dropdown-menu li > strong:focus,
+.header-panel .notifications > .dropdown-menu li > strong:hover {
+  text-decoration: underline;
+}
+.header-panel .notifications > .dropdown-menu li.notification-critical strong {
+  padding-left: 30px;
+  position: relative;
+}
+.header-panel .notifications > .dropdown-menu li.notification-critical > strong:before {
+  display: block;
+  content: "\e086";
+  font-family: 'MUI-Icons';
+  color: #c00815;
+  font-size: 19px;
+  speak: none;
+  -webkit-font-smoothing: antialiased;
+  position: absolute;
+  left: 0;
+  top: 5px;
+}
+.header-panel .notifications > .dropdown-menu > li:hover {
+  background: #f7f3eb;
+  cursor: pointer;
+  margin-top: -1px;
+  padding-top: 14px;
+  z-index: 2;
+}
+.header-panel .notifications > .dropdown-menu > li:first-child:hover,
+.header-panel .notifications > .dropdown-menu > li.first:hover,
+.header-panel .notifications > .dropdown-menu > li:last-child:hover,
+.header-panel .notifications > .dropdown-menu > li.last:hover {
+  margin-top: 0;
+  padding-top: 13px;
+}
+.header-panel .dropdown-menu > li:hover:after {
+  display: none;
+}
+.header-panel .notifications > .dropdown-menu > li:hover .action-close {
+  display: block;
+}
+.header-panel .notifications > .dropdown-menu > .new,
+.header-panel .notifications > .dropdown-menu > .new:hover {
+  background: #f47b20;
+  color: #fff;
+}
+.header-panel .notifications > .dropdown-menu > li.new:first-child:before,
+.header-panel .notifications > .dropdown-menu > li.new.first:before,
+.header-panel .notifications > .dropdown-menu > li.new:first-child:hover:before,
+.header-panel .notifications > .dropdown-menu > li.new.first:hover:before {
+  color: #f47b20;
+}
+.header-panel .notifications > .dropdown-menu > .new strong,
+.header-panel .notifications > .dropdown-menu > .new div,
+.header-panel .notifications > .dropdown-menu > .new a,
+.header-panel .notifications > .dropdown-menu > .new time,
+.header-panel .notifications > .dropdown-menu .new .action-close:hover,
+.header-panel .notifications > .dropdown-menu .new .action-close:focus {
+  color: #fff;
+}
+.header-panel .notifications > .dropdown-menu time {
+  color: #676056;
+  font-size: 11px;
+  font-weight: 400;
+  display: block;
+  margin-top: 7px;
+}
+.header-panel .notifications > .dropdown-menu a:focus ~ .action-close,
+.header-panel .notifications > .dropdown-menu .action-close:focus {
+  display: block;
+}
+.header-panel .notifications > .dropdown-menu .action-close {
+  position: absolute;
+  display: none;
+  top: 8px;
+  right: 4px;
+  width: 20px;
+  height: 20px;
+  text-indent: -999em;
+  overflow: hidden;
+  color: #cac2b5;
+}
+.header-panel .notifications > .dropdown-menu .action-close:hover {
+  color: #b0a789;
+}
+.header-panel .notifications > .dropdown-menu .action-close:before {
+  display: block;
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  font-weight: normal;
+  font-size: 19px;
+  speak: none;
+  -webkit-font-smoothing: antialiased;
+  content: '\e07f';
+  /* trashbin icon */
+
+  text-indent: 0;
+}
+.header .header-panel .notifications .dropdown-menu > li.last {
+  padding: 0;
+}
+.header .header-panel .notifications .action-more {
+  display: block;
+  background: #676056;
+  border: 0;
+  color: #f7f3eb;
+  font-size: 13px;
+  font-weight: bold;
+  height: 23px;
+  width: 100%;
+  line-height: 23px;
+  text-shadow: none;
+  text-align: center;
+  margin: 0;
+}
+.header .header-panel .notifications .action-more:hover {
+  text-decoration: none;
+}
+/*
+    Help
+-------------------------------------- */
+.header-panel .help {
+  float: left;
+  margin: 0 0 0 30px;
+  padding: 6px 0 0;
+}
+/*
+    Search
+-------------------------------------- */
+.search {
+  position: relative;
+  float: left;
+  margin: -4px 0 -5px 50px;
+}
+.search form {
+  position: relative;
+}
+.search input {
+  position: relative;
+  display: none;
+  width: 50px;
+  height: 36px;
+  line-height: 2;
+  margin: 0;
+  padding: 4px 25px 4px 4px;
+  background: #fff;
+}
+.header .search .ajax-loading:before {
+  display: block;
+  content: '';
+  position: absolute;
+  top: 10px;
+  left: -20px;
+  margin: 0;
+  width: 16px;
+  height: 16px;
+  line-height: 16px;
+  background-image: url(../mui/images/ajax-loader-small.gif);
+}
+.header .search .mage-suggest {
+  border: none;
+}
+.header .search .mage-suggest::after {
+  content: '';
+}
+.search .dropdown-menu {
+  display: block;
+  right: auto;
+  margin-right: 0;
+  width: 100%;
+}
+.autocomplete-results {
+  left: 0 !important;
+  right: 0;
+}
+.autocomplete-results .title {
+  display: block;
+}
+.autocomplete-results .type {
+  margin: 0 0 10px;
+}
+.header.active .search {
+  margin-left: 30px;
+}
+.header.active .search input {
+  display: inline-block;
+}
+.no-js .search input {
+  display: inline-block;
+  width: 350px;
+}
+.search button[type="submit"],
+.search button[type="submit"]:hover,
+.search button[type="submit"]:active,
+.search button[type="submit"]:focus {
+  position: absolute;
+  top: 2px;
+  right: 0;
+  width: 32px;
+  height: 32px;
+  background: none;
+  border: none;
+  overflow: hidden;
+  text-indent: -999em;
+  color: #676056;
+  text-shadow: 0 1px 0 #fff;
+  box-shadow: none;
+  filter: none;
+}
+.search button[type="submit"]:hover,
+.header.active .search button[type="submit"],
+.header.active .search button[type="submit"]:hover,
+.header.active .search button[type="submit"]:active,
+.header.active .search button[type="submit"]:focus {
+  color: #201f1c;
+}
+.eq-ie9 .search button[type="submit"] {
+  top: 4px;
+}
+.search button[type="submit"]:before {
+  position: absolute;
+  display: block;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  speak: none;
+  font-weight: normal;
+  -webkit-font-smoothing: antialiased;
+  content: '\e01f';
+  /* user icon */
+
+  text-indent: 0;
+  font-size: 18px;
+  line-height: 1.7;
+  text-align: center;
+}
+/*
+    Clearfix
+-------------------------------------- */
+.header-panel:before,
+.header-panel:after,
+.header-inner:before,
+.header-inner:after,
+.clearfix:before,
+.clearfix:after {
+  content: "";
+  display: table;
+}
+.header-panel:after,
+.header-inner:after,
+.clearfix:after {
+  clear: both;
+}
diff --git a/app/design/adminhtml/magento_backend/css/pages.css b/app/design/adminhtml/magento_backend/css/pages.css
new file mode 100644
index 0000000000000000000000000000000000000000..ba9d1a2a10c5e6af0ece6aaefbd766dd0afd956f
--- /dev/null
+++ b/app/design/adminhtml/magento_backend/css/pages.css
@@ -0,0 +1,3053 @@
+/**
+ * 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)
+ */
+/*
+    Product Creation
+-------------------------------------- */
+/* Action "Back" as cross  */
+[class^=" catalog-product-"] .page-actions .action-back,
+[class^=" catalog-product-"] .page-actions .action-back:hover,
+[class^=" catalog-product-"] .page-actions .action-back:active,
+[class^=" newsletter-"] .page-actions .action-back,
+[class^=" newsletter-"] .page-actions .action-back:hover,
+[class^=" newsletter-"] .page-actions .action-back:active {
+  overflow: hidden;
+  padding: 5px 6px 3px;
+  margin-left: 12px;
+  color: #7a7976;
+}
+.sales-order-create-index .page-actions-inner .cancel,
+.sales-order-create-index .page-actions-inner .cancel:hover,
+.sales-order-create-index .page-actions-inner .cancel:active {
+  filter: none;
+  border: 0;
+}
+[class^=" catalog-product-"] .page-actions .action-back:hover,
+[class^=" newsletter-"] .page-actions .action-back:hover,
+.sales-order-create-index .page-actions-inner .cancel:hover {
+  color: #000;
+}
+[class^=" catalog-product-"] .page-actions .action-back.mage-error,
+[class^=" newsletter-"] .page-actions .action-back.mage-error {
+  color: #b57c72;
+}
+[class^=" catalog-product-"] .page-actions .action-back:before,
+[class^=" newsletter-"] .page-actions .action-back:before,
+.sales-order-create-index .page-actions-inner .cancel:before {
+  display: inline-block;
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  speak: none;
+  font-weight: normal;
+  -webkit-font-smoothing: antialiased;
+  content: '\e07d';
+  /* close icon */
+
+  font-size: 16px;
+}
+[class^=" catalog-product-"] .page-actions .action-back span,
+[class^=" newsletter-"] .page-actions .action-back span,
+.sales-order-create-index .page-actions-inner .cancel span {
+  display: inline-block;
+  overflow: hidden;
+  text-indent: -999em;
+}
+.page-actions .switcher {
+  display: inline-block;
+  vertical-align: top;
+  margin: 6px 17px 6px 6px;
+}
+.field-weight .control .field:first-child {
+  width: 36%;
+  margin-right: 15px;
+}
+#allow_open_amount {
+  margin-top: 8px;
+}
+.catalog-product-new .user-defined.type-select select,
+.catalog-product-edit .user-defined.type-select select {
+  width: 100%;
+}
+#tab_content_downloadableInfo .data-table td {
+  vertical-align: top;
+}
+#tab_content_downloadableInfo .data-table td .row {
+  margin-bottom: 10px;
+}
+/*
+    Customer
+---------------------------------------*/
+.customer-index-edit .grid tr.headings th > span {
+  white-space: normal;
+}
+#customer_info_tabs_account_content #_accountsendemail {
+  margin-top: 8px;
+}
+.customer-information:before,
+.customer-information:after {
+  content: "";
+  display: table;
+}
+.customer-information:after {
+  clear: both;
+}
+.customer-information .data-table,
+.customer-information address {
+  width: 48.5%;
+}
+.customer-information .data-table {
+  float: left;
+  width: 48.5%;
+}
+.customer-information address {
+  padding-top: 4px;
+  line-height: 2.2;
+  float: right;
+}
+.address-list {
+  list-style: none;
+  width: 278px;
+  margin: 0 0 10px;
+  padding: 0;
+  float: left;
+}
+.address-list li {
+  border: 1px solid #d9d2ca;
+  background: #f7f2ec;
+  padding: 10px 10px 15px;
+  cursor: pointer;
+  margin-bottom: -1px;
+}
+.address-list li.ui-state-active {
+  background: #fff;
+  position: relative;
+  box-shadow: 0 1px 1px 0 #d9d2ca;
+  margin-left: -2px;
+  padding-left: 12px;
+}
+.address-list li.ui-state-active:before,
+.address-list li.ui-state-active:after {
+  position: absolute;
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  font-weight: normal;
+  font-size: 18px;
+  color: #fff;
+  content: "\e02a";
+  speak: none;
+  line-height: 11px;
+  width: 10px;
+  right: -9px;
+  text-indent: -6px;
+  top: 50%;
+  margin-top: -5px;
+  z-index: 2;
+}
+.address-list li.ui-state-active:before {
+  color: #d9d2ca;
+  right: -11px;
+  z-index: 1;
+}
+.address-list li.address-list-actions:before,
+.address-list li.address-list-actions:after {
+  display: none;
+}
+.address-list li.address-list-actions {
+  padding: 20px 0 0 0;
+  border: 0;
+  background: none;
+  box-shadow: none;
+  cursor: default;
+}
+.address-list li.address-list-actions:first-child {
+  padding: 0;
+}
+.address-list .label {
+  float: none;
+  width: auto;
+  padding: 0 0 0 10px;
+}
+.address-list input[type="checkbox"] {
+  float: left;
+}
+.address-list address:first-line {
+  /*  its not work  if First Name and Last Name in two lines */
+
+  font-weight: bold;
+}
+.address-list address {
+  margin: 0 20px 15px 0;
+  line-height: 1.5;
+}
+.address-list-item-actions {
+  float: right;
+}
+.address-list .action-edit {
+  display: none;
+}
+.address-list .field {
+  margin-bottom: 15px;
+}
+.ui-tabs-nav .address-list-item a {
+  text-decoration: none;
+  color: #676056;
+}
+.address-item-edit {
+  margin-left: 277px;
+}
+.address-item-edit-content {
+  border: 1px solid #dad1c8;
+  background: #fff;
+  box-shadow: 0 2px 1px 0 rgba(217, 210, 202, 0.5);
+  padding-left: 10px;
+}
+.address-item-edit-content .fieldset:last-child {
+  margin-bottom: 29px;
+}
+.address-item-edit .legend {
+  border-bottom: 0;
+  margin: 0 0 18px;
+  padding-left: 20%;
+}
+.address-item-edit .legend span {
+  padding-left: 0;
+}
+.address-item-edit-actions {
+  padding: 0 0 18px 20%;
+}
+/*
+    Configuration -> Design
+-------------------------------------- */
+#row_design_theme_ua_regexp .design_theme_ua_regexp {
+  float: left;
+  width: 100%;
+}
+#row_design_theme_ua_regexp .tooltip {
+  margin-top: 8px;
+}
+#row_design_theme_ua_regexp .note {
+  clear: both;
+}
+/*
+    Configuration -> Payment Methods
+-------------------------------------- */
+.adminhtml-system-config-edit .payflow-settings-notice .important-label {
+  color: #e22626;
+  font-size: 14px;
+  font-weight: 700;
+}
+.adminhtml-system-config-edit .payflow-settings-notice ul.options-list strong {
+  color: #676056;
+  font-size: 14px;
+  font-weight: 700;
+}
+/*
+    CMS -> Banners
+-------------------------------------- */
+/* Banner Properties */
+#banner_properties_customer_segment_ids {
+  min-width: 20%;
+}
+/* Content */
+.field-store_default_content .buttons-set {
+  margin-bottom: 9px;
+}
+.field-store_default_content .buttons-set button {
+  margin-right: 4px;
+}
+.field-store_0_content_use input[type="checkbox"] {
+  margin-right: 3px;
+  position: relative;
+  top: 2px;
+}
+/*
+    CMS -> Manage Hierarchy
+-------------------------------------- */
+.cms-hierarchy .cms-scope {
+  float: right;
+  margin-right: 25px;
+  position: relative;
+  top: 2px;
+}
+.cms-hierarchy #tree-container {
+  margin-top: 25px;
+  overflow: auto;
+  padding-bottom: 10px;
+}
+.cms-hierarchy .buttons-set {
+  margin-bottom: 10px;
+}
+.cms-hierarchy .cms-hierarchy-tree {
+  width: 48.93617020799999%;
+  float: left;
+  margin: 10px 0 8px 0;
+}
+.cms-hierarchy .cms-hierarchy-node {
+  width: 48.93617020799999%;
+  float: left;
+  margin: 10px 0 8px 2.127659574%;
+}
+.cms-hierarchy #cms_page_grid_container {
+  clear: both;
+}
+.cms-hierarchy .store-switcher {
+  position: relative;
+  top: 10px;
+}
+.cms-hierarchy .store-switcher label {
+  margin-right: 8px;
+}
+.cms-hierarchy-node #node_properties_fieldset #node_preview {
+  position: relative;
+  top: 6px;
+}
+.cms-hierarchy-node .form-inline .label {
+  width: 30%;
+}
+/*
+    CMS -> Widgets
+-------------------------------------- */
+#widget_instace_tabs_properties_section_content .widget-option-label {
+  margin-top: 6px;
+}
+/*
+    CMS -> Static Blocks
+-------------------------------------- */
+#buttonsblock_content.buttons-set {
+  margin-bottom: 9px;
+}
+#buttonsblock_content.buttons-set button {
+  margin-right: 4px;
+}
+/*
+    CMS -> Manage Content
+-------------------------------------- */
+/* Content */
+.cms-manage-content-actions .buttons-set {
+  margin-bottom: 9px;
+}
+.cms-manage-content-actions .buttons-set button {
+  margin-right: 4px;
+}
+.cms-manage-content-actions textarea {
+  width: 100%;
+}
+/*
+    System -> Action Log -> Report
+-------------------------------------- */
+.adminhtml-logging-details .log-details-grid table th {
+  border: 1px solid #c9c2b8;
+  border-width: 0 0 1px;
+  padding: 6px 10px 7px;
+  background: #fff;
+  color: #676056;
+  font-size: 13px;
+  font-weight: 600;
+}
+.adminhtml-logging-details .log-details-grid table th span {
+  border: 0;
+  padding: 0;
+}
+.adminhtml-logging-details .log-details-grid table td {
+  border: none;
+  padding: 6px 10px 7px;
+  background: #fff;
+}
+.adminhtml-logging-details .log-details-grid table tr:last-child td {
+  border: 1px solid #eae8e4;
+  border-width: 0 0 1px;
+}
+.adminhtml-logging-details .log-details-grid table tr.on-mouse {
+  cursor: inherit;
+}
+.adminhtml-logging-details .log-details-grid table tr:nth-child(odd) td,
+.adminhtml-logging-details .log-details-grid table tr.on-mouse:nth-child(odd):hover td {
+  background: #fbfaf6;
+}
+/*
+    System -> Export
+-------------------------------------- */
+#export_filter_grid .grid td .input-text-range-date {
+  vertical-align: middle;
+}
+#export_filter_grid .grid td .ui-datepicker-trigger {
+  vertical-align: middle;
+  margin-left: 5px;
+}
+#export_filter_grid .grid select {
+  margin-bottom: 0;
+  width: 86%;
+}
+#export_filter_grid .grid table td:first-child,
+#export_filter_grid .grid tr th:first-child {
+  border-left: 0;
+}
+#export_filter_grid .data thead {
+  border-left: 1px solid #837F79;
+}
+#export_filter_grid .data tbody {
+  border-left: 1px solid #c0bbaf;
+}
+/*
+    System -> Roles
+-------------------------------------- */
+#gws_container ul {
+  padding: 0;
+  margin: 0;
+  list-style: none;
+}
+#gws_container ul ul {
+  margin: .8em 0 .8em 1.4em;
+}
+#gws_container input[type="checkbox"] {
+  margin-right: 3px;
+  position: relative;
+  top: -1px;
+}
+/*
+    Reports
+-------------------------------------- */
+.reports-title .page-actions {
+  float: right;
+}
+.reports-title .store-switcher {
+  padding: 14px 0 18px;
+}
+.reports-content select {
+  width: 160px;
+}
+.reports-content input.hasDatepicker {
+  width: 133px;
+}
+/* TODO: refactor when validation design is ready */
+.reports-content .required .control {
+  position: relative;
+}
+.reports-content input.hasDatepicker + label.mage-error {
+  left: 0;
+  position: absolute;
+  top: 30px;
+}
+.reports-title:before,
+.reports-title:after {
+  content: "";
+  display: table;
+}
+.reports-title:after {
+  clear: both;
+}
+/*
+    Reports - Customer Reviews
+-------------------------------------- */
+.reports-report-review-customer .col-qty,
+.reports-report-review-customer .col-actions {
+  width: 85px;
+}
+/*
+    Reports - Product Reviews
+-------------------------------------- */
+.reports-report-review-product .col-id {
+  width: 35px;
+}
+.reports-report-review-product .col-qty,
+.reports-report-review-product .col-rating,
+.reports-report-review-product .col-avg-rating,
+.reports-report-review-product .col-actions {
+  text-align: right;
+  width: 85px;
+}
+.reports-report-review-product .col-date {
+  width: 140px;
+}
+.reports-report-review-product .col-rating {
+  width: 104px;
+}
+/*
+    Reports - New Accounts
+-------------------------------------- */
+.reports-report-customer-accounts .col-period {
+  white-space: nowrap;
+  width: 70px;
+}
+/*
+    Reports - Refresh Statistics
+-------------------------------------- */
+.reports-report-statistics-index .col-period {
+  white-space: nowrap;
+  width: 140px;
+}
+.reports-report-statistics-index .col-select {
+  width: 25px;
+}
+/*
+    Reports - Products Ordered
+-------------------------------------- */
+.reports-report-product-sold .col-period {
+  white-space: nowrap;
+  width: 70px;
+}
+.reports-report-product-sold .col-qty {
+  width: 110px;
+}
+/*
+    Reports - Customers by Orders Total
+-------------------------------------- */
+.reports-report-customer-totals .col-period {
+  white-space: nowrap;
+  width: 70px;
+}
+.reports-report-customer-totals .col-qty {
+  width: 65px;
+}
+.reports-report-customer-totals .col-rating {
+  width: 100px;
+}
+/*
+    Reports - Tag by popular
+-------------------------------------- */
+.reports-report-tag-popular .col-qty,
+.reports-report-tag-popular .col-actions {
+  width: 80px;
+}
+/*
+    Reports - Tag by customer
+-------------------------------------- */
+.reports-report-tag-customer .col-id {
+  width: 35px;
+}
+.reports-report-tag-customer .col-qty,
+.reports-report-tag-customer .col-actions {
+  width: 80px;
+}
+/*
+    Reports - Tag by product
+-------------------------------------- */
+.reports-report-tag-product .col-id {
+  width: 35px;
+}
+.reports-report-tag-product .col-actions {
+  width: 70px;
+}
+.reports-report-tag-product .col-unique-numbers,
+.reports-report-tag-product .col-total-numbers {
+  text-align: right;
+  width: 95px;
+}
+/*
+    Reports - Customers by Number of Orders
+-------------------------------------- */
+.reports-report-customer-orders .col-period {
+  white-space: nowrap;
+  width: 70px;
+}
+.reports-report-customer-orders .col-qty,
+.reports-report-customer-orders .col-average,
+.reports-report-customer-orders .col-total {
+  width: 105px;
+}
+/*
+   Reports - Customers by Orders Total
+-------------------------------------- */
+.reports-report-customer-totals .col-period {
+  white-space: nowrap;
+  width: 70px;
+}
+.reports-report-customer-totals .col-qty,
+.reports-report-customer-totals .col-average,
+.reports-report-customer-totals .col-total {
+  width: 105px;
+}
+/*
+    Reports - Customer's wishlists
+-------------------------------------- */
+.adminhtml-report-customer-wishlist-wishlist .col-period {
+  width: 70px;
+}
+.adminhtml-report-customer-wishlist-wishlist .col-whishlist-qty,
+.adminhtml-report-customer-wishlist-wishlist .col-available-qty,
+.adminhtml-report-customer-wishlist-wishlist .col-qty-diff {
+  text-align: right;
+  width: 100px;
+}
+.adminhtml-report-customer-wishlist-wishlist .grid .range {
+  text-align: left;
+}
+/*
+    Reports - Most Viewed
+-------------------------------------- */
+.reports-report-product-viewed .col-period {
+  white-space: nowrap;
+  width: 70px;
+}
+.reports-report-product-viewed .col-qty,
+.reports-report-product-viewed .col-price {
+  white-space: nowrap;
+  width: 80px;
+}
+/*
+    Reports - Search Terms
+-------------------------------------- */
+.reports-index-search .col-id {
+  width: 35px;
+}
+.reports-index-search th.col-results,
+.reports-index-search th.col-hits {
+  text-align: left;
+  width: 117px;
+}
+.reports-index-search td.col-results,
+.reports-index-search td.col-hits {
+  text-align: right;
+  width: 117px;
+}
+.reports-index-search .col-results .range-line:first-child,
+.reports-index-search .col-hits .range-line:first-child {
+  float: left;
+  margin-right: 3px;
+}
+/*
+    Reports - Bestsellers
+-------------------------------------- */
+.reports-report-sales-bestsellers .col-period {
+  white-space: nowrap;
+  width: 70px;
+}
+.reports-report-sales-bestsellers .col-qty,
+.reports-report-sales-bestsellers .col-price {
+  width: 80px;
+}
+/*
+    Reports - Downloads
+-------------------------------------- */
+.reports-report-product-downloads .col-qty,
+.reports-report-product-downloads .col-price {
+  width: 80px;
+}
+/*
+    Reports - Abandoned Carts
+-------------------------------------- */
+.reports-report-shopcart-abandoned .col-ip,
+.reports-report-shopcart-abandoned .col-subtotal,
+.reports-report-shopcart-abandoned .col-number,
+.reports-report-shopcart-abandoned .col-coupon {
+  text-align: right;
+}
+.reports-report-shopcart-abandoned .col-ip {
+  width: 105px;
+}
+.reports-report-shopcart-abandoned .col-subtotal {
+  width: 65px;
+}
+/*
+    Reports - Products in Carts
+-------------------------------------- */
+.reports-report-shopcart-product .col-id {
+  width: 35px;
+}
+.reports-report-shopcart-product .col-carts,
+.reports-report-shopcart-product .col-qty,
+.reports-report-shopcart-product .col-price {
+  text-align: right;
+  width: 80px;
+}
+/*
+    Reports - Refunds
+-------------------------------------- */
+.reports-report-sales-refunded .col-period {
+  white-space: nowrap;
+  width: 70px;
+}
+.reports-report-sales-refunded .col-ref-total,
+.reports-report-sales-refunded .col-ref-online,
+.reports-report-sales-refunded .col-ref-offline {
+  text-align: right;
+  width: 23%;
+}
+/*
+    Reports - Shipping
+-------------------------------------- */
+.reports-report-sales-shipping .col-period {
+  white-space: nowrap;
+  width: 70px;
+}
+.reports-report-sales-shipping .col-qty,
+.reports-report-sales-shipping .col-total-sales-shipping,
+.reports-report-sales-shipping .col-total-shipping {
+  text-align: right;
+  width: 115px;
+}
+/*
+    Reports - Invoiced
+-------------------------------------- */
+.reports-report-sales-invoiced .col-period {
+  white-space: nowrap;
+  width: 70px;
+}
+.reports-report-sales-invoiced .col-qty,
+.reports-report-sales-invoiced .col-invoiced,
+.reports-report-sales-invoiced .col-total-invoiced,
+.reports-report-sales-invoiced .col-total-invoiced-paid,
+.reports-report-sales-invoiced .col-total-invoiced-not-paid {
+  text-align: right;
+  width: 19%;
+}
+/*
+    Reports - Tax
+-------------------------------------- */
+.reports-report-sales-tax .col-period {
+  white-space: nowrap;
+  width: 70px;
+}
+.reports-report-sales-tax .col-rate,
+.reports-report-sales-tax .col-qty,
+.reports-report-sales-tax .col-tax-amount {
+  text-align: right;
+  width: 105px;
+}
+/*
+    Reports - Orders
+-------------------------------------- */
+.reports-report-sales-sales .col-period {
+  white-space: nowrap;
+  width: 70px;
+}
+.reports-report-sales-sales .col-orders,
+.reports-report-sales-sales .col-sales-items,
+.reports-report-sales-sales .col-sales-total,
+.reports-report-sales-sales .col-invoiced,
+.reports-report-sales-sales .col-refunded,
+.reports-report-sales-sales .col-sales-tax,
+.reports-report-sales-sales .col-sales-shipping,
+.reports-report-sales-sales .col-sales-discount,
+.reports-report-sales-sales .col-canceled {
+  text-align: right;
+  width: 10.5%;
+}
+/*
+    Reports - Coupons
+-------------------------------------- */
+/* TODO: re-check styles for coupons table after coupons functionality will have been repaired */
+.reports-report-sales-coupons .col-period {
+  white-space: nowrap;
+  width: 70px;
+}
+.reports-report-sales-coupons .col-sales,
+.reports-report-sales-coupons .col-users,
+.reports-report-sales-coupons .col-sales-discount,
+.reports-report-sales-coupons .col-total-amount,
+.reports-report-sales-coupons .col-subtotal,
+.reports-report-sales-coupons .col-discount,
+.reports-report-sales-coupons .col-total {
+  text-align: right;
+}
+/*
+    Reports - Low Stock
+-------------------------------------- */
+.reports-report-product-lowstock .col-qty {
+  width: 10%;
+}
+.reports-report-product-lowstock .range-line {
+  display: inline-block;
+}
+.reports-report-product-lowstock .col-product {
+  width: 65%;
+}
+.reports-report-product-lowstock .col-sku {
+  width: 25%;
+}
+/*
+    Reports - PayPal Settlement Reports
+-------------------------------------- */
+.adminhtml-paypal-reports-index .grid tr.headings th > span {
+  white-space: normal;
+}
+.adminhtml-paypal-reports-index .col-transaction_event_code {
+  max-width: 150px;
+}
+.adminhtml-paypal-reports-index .col-amount,
+.adminhtml-paypal-reports-index .col-fee-amount {
+  text-align: right;
+}
+/*
+    Newsletter
+-------------------------------------- */
+[class^=" newsletter-"] .page-actions .action-back {
+  float: right;
+}
+/*
+    Newsletter Templates
+-------------------------------------- */
+.newsletter-template-index .col-id {
+  width: 35px;
+}
+.newsletter-template-index .col-actions {
+  width: 80px;
+}
+.newsletter-template-index .col-type {
+  width: 100px;
+}
+.newsletter-template-index .col-added,
+.newsletter-template-index .col-updated {
+  width: 140px;
+}
+[class^=' newsletter-'] .buttons-set {
+  margin: 0 0 15px;
+}
+[class^=" newsletter-"] .buttons-set button {
+  margin-right: 4px;
+}
+/*
+    Newsletter - Queue
+-------------------------------------- */
+.newsletter-queue-index .col-id {
+  width: 35px;
+}
+.newsletter-queue-index .col-finish,
+.newsletter-queue-index .col-start {
+  width: 130px;
+}
+.newsletter-queue-index .col-status,
+.newsletter-queue-index .col-processed,
+.newsletter-queue-index .col-recipients {
+  white-space: nowrap;
+  width: 85px;
+}
+.newsletter-queue-index td.col-processed,
+.newsletter-queue-index td.col-recipients {
+  text-align: right;
+}
+.newsletter-queue-index .col-actions {
+  width: 80px;
+}
+/*
+    Newsletter - Subscribers
+-------------------------------------- */
+.newsletter-subscriber-index .col-id {
+  width: 35px;
+}
+.newsletter-subscriber-index .col-type {
+  width: 75px;
+}
+.newsletter-subscriber-index .col-status {
+  white-space: nowrap;
+  width: 85px;
+}
+/*
+    Newsletter - Problems
+-------------------------------------- */
+.newsletter-problem-index .col-select {
+  width: 25px;
+}
+.newsletter-problem-index .col-id {
+  width: 35px;
+}
+.newsletter-problem-index .col-start {
+  width: 130px;
+}
+.newsletter-problem-index .col-error-code {
+  width: 150px;
+}
+.table-fieldset-alt,
+.type-options {
+  margin-bottom: 20px;
+}
+.table-fieldset-alt thead th,
+.table-fieldset-alt tbody tr td {
+  border-width: 0;
+}
+.table-fieldset-alt tbody tr:nth-child(odd) td,
+.table-fieldset-alt tbody tr:nth-child(odd):hover td {
+  background: #fff;
+}
+/*
+    System - Tax
+--------------------------------------*/
+.tax-rate-popup .ui-dialog-content.ui-widget-content {
+  padding: 10px 10px 0;
+}
+.tax-rate-popup .fieldset {
+  margin: 0;
+}
+.tax-rate-popup .field {
+  margin-bottom: 20px;
+}
+.tax-rate-popup .field .label {
+  margin: 5px 0 0 0;
+  width: 26%;
+  padding: 0 20px 0 0;
+  float: left;
+  text-align: right;
+  box-sizing: content-box;
+  -webkit-box-sizing: content-box;
+  -moz-box-sizing: content-box;
+  -ms-box-sizing: content-box;
+}
+.tax-rate-popup .field .control {
+  width: 58%;
+  margin: 0;
+  float: left;
+}
+.tax-rate-popup .field .control select,
+.tax-rate-popup .field .control .input-text {
+  width: 100%;
+}
+.tax-rate-popup .field-rate .control .input-text {
+  width: 50%;
+}
+.tax-rate-popup .field-rate label.mage-error {
+  display: block;
+}
+.tax-rate-popup .tax-rate-titles-note-td {
+  margin-left: 26%;
+  padding-left: 20px;
+}
+.field-tax_rate,
+.field-tax_customer_class,
+.field-tax_product_class {
+  position: relative;
+}
+.mselect-hidden + .mage-error {
+  position: absolute;
+  top: 100%;
+}
+/*
+    Tags
+-------------------------------------- */
+.tag-title {
+  overflow: hidden;
+}
+.tag-title .page-actions {
+  float: right;
+}
+/*
+    Attribute Mapping
+-------------------------------------- */
+.field-attributes_box .control-value {
+  width: 100%;
+}
+.adminhtml-googleshopping-types-new #attribute_set {
+  padding: 0;
+}
+.adminhtml-googleshopping-types-new #gcontent_attributes_container {
+  margin-top: -6px;
+}
+/*
+    Dashboard
+-------------------------------------- */
+.adminhtml-dashboard-index .col-2-left-layout,
+.adminhtml-dashboard-index .col-1-layout {
+  min-width: 0;
+}
+.adminhtml-dashboard-index .side-col {
+  width: 38%;
+  padding: 1%;
+}
+.adminhtml-dashboard-index .side-col .entry-edit {
+  padding: 10px 15px 10px 10px;
+  margin-bottom: 5px;
+}
+.adminhtml-dashboard-index .side-col .entry-edit .entry-edit-head {
+  margin-bottom: 20px;
+}
+.adminhtml-dashboard-index .side-col .entry-edit .entry-edit-head h4 {
+  margin: 0;
+}
+.adminhtml-dashboard-index .side-col .entry-edit fieldset {
+  padding: 0;
+  border: 0;
+}
+.adminhtml-dashboard-index .side-col .entry-edit fieldset .grid {
+  padding-bottom: 0;
+}
+.adminhtml-dashboard-index .col-2-left-layout .main-col {
+  min-width: 0;
+  width: 60%;
+  padding: 16px 30px 30px;
+}
+.adminhtml-dashboard-index .col-2-left-layout .main-col .store-switcher-alt {
+  margin-bottom: 15px;
+}
+.adminhtml-dashboard-index .col-2-left-layout .main-col .store-switcher-alt > strong {
+  padding-left: 0;
+}
+.dashboard-container {
+  border-radius: 0;
+}
+.dashboard-container.col-2-left-layout:before {
+  left: 40%;
+}
+.dashboard-inner .tabs-horiz > li a {
+  padding-left: 14px;
+  padding-right: 14px;
+}
+.dashboard-container #diagram_tab_content {
+  background: #fff;
+  border: 1px solid #eae6e0;
+  border-radius: 5px;
+  border-top-left-radius: 0;
+  margin: 0 0 20px;
+  padding: 18px;
+  position: relative;
+}
+.dashboard-container .dashboard-diagram .store-switcher + div {
+  /* loader under a diagram */
+
+  background: url(../mui/images/ajax-loader-small.gif) no-repeat 50% 50%;
+  min-height: 75px;
+  text-align: center;
+}
+.dashboard-container .dashboard-diagram .store-switcher + div img {
+  max-width: 100%;
+}
+.dashboard-container .dashboard-diagram .store-switcher + div.dashboard-diagram-nodata {
+  /* when there is no data to display the diagram */
+
+  background-image: none;
+  min-height: 15px;
+}
+.dashboard-container #grid_tab_content {
+  background: #ffffff url(../mui/images/ajax-loader-small.gif) no-repeat 50% 50%;
+  border: 1px solid #eae6e0;
+  border-radius: 5px;
+  border-top-left-radius: 0;
+  min-height: 50px;
+}
+.dashboard-container #grid_tab_content .grid {
+  padding: 0;
+}
+.dashboard-container .store-switcher {
+  margin: 20px 0 10px;
+}
+.dashboard-container .dashboard-diagram .store-switcher {
+  margin-top: 0;
+}
+.dashboard-diagram-nodata {
+  border: 1px solid #ccc;
+  padding: 20px 0;
+  text-align: center;
+}
+.action-switch-to-analytics:link,
+.action-switch-to-analytics:visited,
+.action-switch-to-hub:link,
+.action-switch-to-hub:visited {
+  font-weight: 400;
+  font-size: 16px;
+  color: #19a3d1;
+  position: relative;
+  padding: 0 0 0 20px;
+  margin: 11px 0 0 20px;
+  background: none;
+  box-shadow: none;
+}
+.action-switch-to-hub:before,
+.action-switch-to-analytics:before {
+  position: absolute;
+  width: 17px;
+  height: 12px;
+  background: url(../images/icons-dashboard-switcher.png) 0 0 no-repeat;
+  left: 0;
+  top: 4px;
+  content: '';
+}
+.action-switch-to-hub:before {
+  top: 2px;
+}
+.action-switch-to-analytics:before {
+  background-position: 0 -13px;
+}
+/*
+    Sales
+-------------------------------------- */
+#order-totals strong {
+  color: #676056;
+  font-size: 14px;
+  font-weight: 700;
+}
+#order-shipping-method-summary a {
+  color: #007dbd;
+  font-size: 14px;
+  font-weight: 400;
+}
+#order-shipping-method-summary a:focus,
+#order-shipping-method-summary a:hover {
+  text-decoration: underline;
+}
+.customer-current-activity {
+  float: left;
+  width: 22%;
+}
+.customer-current-activity-inner {
+  background: #fff;
+  border: 1px solid #eae6e0;
+  padding: 18px;
+  border-radius: 5px;
+}
+.order-details-existing-customer {
+  padding-left: 1%;
+  position: relative;
+  width: 77%;
+  float: right;
+}
+.order-billing-address,
+.order-billing-method,
+[class^=" sales-order-"] .order-history,
+[class^=" sales-order-"] .order-comments-history,
+[class^=" sales-order-"] .order-information,
+[class^=" sales-order-"] .order-billing-address,
+[class^=" sales-order-"] .order-payment-method,
+[class^=" adminhtml-rma-"] .order-comments-history,
+[class^=" adminhtml-rma-"] .order-shipping-address,
+[class^=" adminhtml-rma-"] .rma-request-details {
+  float: left;
+  width: 49.5%;
+}
+.order-shipping-address,
+.order-shipping-method,
+[class^=" sales-order-"] .order-totals,
+[class^=" sales-order-"] .order-account-information,
+[class^=" sales-order-"] .order-shipping-address,
+[class^=" sales-order-"] .order-payment-method-virtual,
+[class^=" sales-order-"] .order-shipping-method,
+[class^=" adminhtml-rma-"] .rma-confirmation,
+[class^=" adminhtml-rma-"] .order-shipping-method,
+[class^=" adminhtml-rma-"] .order-return-address {
+  float: right;
+  width: 49%;
+}
+#order-data .order-account-information {
+  float: none;
+  width: auto;
+}
+[class^=" sales-"] .order-information .fieldset-wrapper > .fieldset-wrapper-title .title {
+  width: 100%;
+}
+#order-data .actions .action-add,
+#order-data .actions .action-delete,
+#order-customer-selector .actions .action-add {
+  margin: 0 0 0 20px;
+}
+#order-data .order-methods ul {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+#order-data .order-methods dl,
+#order-data .order-methods dt,
+#order-data .order-methods dd,
+#order-data .payment-methods dl,
+#order-data .payment-methods dt,
+#order-data .payment-methods dd {
+  margin: 0;
+  padding: 0;
+}
+#order-data .order-methods dd + dt,
+#order-data .payment-methods dd + dt {
+  margin-top: 17px;
+}
+#order-data .order-methods dt,
+#order-data .payment-methods dt {
+  margin: 0 0 8px;
+}
+.order-coupons .box-left,
+.order-gift-options .box-left {
+  float: left;
+  width: 49%;
+}
+.order-coupons .box-right,
+.order-gift-options .box-right {
+  float: right;
+  width: 49%;
+}
+.order-gift-options .box-left:last-child,
+.order-gift-options .fieldset-wrapper-title + .box-right {
+  float: none;
+  width: auto;
+}
+.order-gift-options fieldset {
+  border-radius: 5px;
+}
+.order-gift-options .gift-wrapping-form select {
+  margin-left: 10px;
+}
+.order-gift-options .giftmessage-entire-order textarea {
+  height: 6em;
+  width: 100%;
+}
+.order-gift-options .giftmessage-whole-order-container textarea {
+  height: 6em;
+  width: 100%;
+}
+.order-gift-options .giftmessage-whole-order-container .actions {
+  margin-left: 20%;
+}
+.ui-dialog.gift-options-popup .ui-dialog-content {
+  padding: 25px;
+}
+.ui-dialog.gift-options-popup .ui-dialog-content h4 {
+  margin: 0 0 17px;
+}
+.gift-options-tooltip {
+  background: #fff;
+  border-radius: 5px;
+  padding: 10px;
+  box-shadow: 0 0 3px rgba(0, 0, 0, 0.3);
+}
+#order-data .box-left fieldset,
+#order-data .box-right fieldset {
+  border-radius: 5px;
+}
+#order-data .order-items td[colspan="8"] {
+  border: 1px solid #c0bbaf;
+}
+.order-search-items thead th:nth-child(1) {
+  width: 60px;
+}
+.order-search-items thead th:nth-child(3) {
+  width: 80px;
+}
+.order-search-items thead th:nth-child(4) {
+  width: 100px;
+}
+.order-search-items thead th:nth-child(5) {
+  width: 55px;
+}
+.order-search-items thead th:nth-child(6) {
+  width: 1px;
+}
+.adminhtml-rma-new .order-totals,
+.order-comments-history .order-comments-history,
+[class^=" adminhtml-rma-"] .rma-comments-history {
+  float: none;
+  width: 100%;
+}
+[class^=" sales-order-"] .order-billing-address .actions,
+[class^=" sales-order-"] .order-shipping-address .actions {
+  margin: 17px 0;
+}
+[class^=" sales-order-"] .order-billing-address .control + label,
+[class^=" sales-order-"] .order-shipping-address .control + label {
+  margin: 17px 0 0;
+}
+.sales-order-create-index .page-actions-inner .cancel,
+.sales-order-create-index .page-actions-inner .cancel:hover,
+.sales-order-create-index .page-actions-inner .cancel:active {
+  float: right;
+  margin: 0 0 0 12px;
+  padding: 3px 0 3px 6px;
+}
+.sales-order-create-index #order-message ul.messages > li,
+.sales-order-edit-index #order-message ul.messages > li {
+  margin: 0 0 60px;
+}
+.sales-order-create-index thead .col-entity_id,
+.sales-order-create-index .col-entity_id,
+.sales-order-create-index .col-qty,
+.checkout-index-index .col-qty {
+  width: 50px;
+}
+.sales-order-create-index .col-in_products,
+.checkout-index-index .col-in_products {
+  text-align: center;
+}
+.sales-order-create-index .col-sku,
+.sales-order-create-index .col-remove,
+.checkout-index-index .col-remove {
+  width: 120px;
+}
+.sales-order-create-index .col-price {
+  width: 70px;
+}
+.sales-order-create-index .order-search-items .col-name,
+.checkout-index-index #source_products_table .col-name {
+  width: 50%;
+}
+.sales-order-create-index .order-items.fieldset-wrapper .fieldset-wrapper-title,
+.sales-order-create-index .order-search-items.fieldset-wrapper .fieldset-wrapper-title,
+.sales-order-create-index .order-additional-area.fieldset-wrapper .fieldset-wrapper-title,
+.sales-order-create-index .order-errors .fieldset-wrapper-title,
+.checkout-index-index .checkout-errors .fieldset-wrapper-title {
+  border-bottom: 0;
+  margin: 0;
+}
+.sales-order-create-index #order-data .fieldset-wrapper-title .actions .action-add {
+  margin-left: 0;
+  margin-right: 20px;
+}
+.sales-order-create-index .order-items.fieldset-wrapper .title,
+.sales-order-create-index .order-additional-area.fieldset-wrapper .title,
+.sales-order-create-index .order-search-items.fieldset-wrapper .title,
+.sales-order-create-index .order-errors .title,
+.checkout-index-index .checkout-errors .title {
+  border-bottom: 1px solid #ededed;
+  float: none;
+  margin: 0 0 18px;
+  width: 100%;
+}
+.sales-order-create-index .order-items.fieldset-wrapper .actions,
+.sales-order-create-index .order-search-items.fieldset-wrapper .actions,
+.sales-order-create-index #order-errors .actions,
+.checkout-index-index .checkout-errors .fieldset-wrapper-title .actions {
+  float: none;
+  border: 1px solid #c0bbaf;
+  border-bottom: 0;
+  background: #f6f3ec;
+  background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y2ZjNlYyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNlZGVhZTEiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
+  background: -moz-linear-gradient(top, #f6f3ec 0%, #edeae1 100%);
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f6f3ec), color-stop(100%, #edeae1));
+  background: -webkit-linear-gradient(top, #f6f3ec 0%, #edeae1 100%);
+  background: -o-linear-gradient(top, #f6f3ec 0%, #edeae1 100%);
+  background: -ms-linear-gradient(top, #f6f3ec 0%, #edeae1 100%);
+  background: linear-gradient(to bottom, #f6f3ec 0%, #edeae1 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f6f3ec', endColorstr='#edeae1', GradientType=0);
+  margin: 0;
+  padding: 0 8px;
+  position: relative;
+}
+.sales-order-create-index #order-data .fieldset-wrapper .actions .action-add,
+.checkout-index-index .checkout-errors .fieldset-wrapper-title .actions .action-add {
+  margin: 7px 8px 8px 0;
+}
+.sales-order-create-index .order-additional-area.fieldset-wrapper .actions {
+  float: none;
+  margin: 0 0 8px;
+  padding: 0;
+}
+.sales-order-create-index #order-data .fieldset-wrapper .actions .action-delete,
+.checkout-index-index .checkout-errors .fieldset-wrapper-title .actions .action-delete {
+  margin: 13px 0 0;
+}
+.sales-order-create-index .ui-dialog .downloadable.information .link .label {
+  margin-left: 0;
+}
+.sales-order-create-index .ui-dialog .downloadable.information .link .nested {
+  margin-left: 8px;
+}
+.sales-order-create-index .ui-dialog .fieldset.bundle .nested {
+  padding-left: 6px;
+}
+.sales-order-create-index .ui-dialog .fieldset.bundle .nested .field {
+  margin: 0 0 5px;
+}
+.sales-order-create-index .ui-dialog .fieldset.bundle .nested .label {
+  font-size: 13px;
+  margin: 0;
+}
+.sales-order-create-index .ui-dialog .fieldset.bundle .nested .qty .control {
+  display: inline-block;
+  margin: 0 0 0 10px;
+  width: 60px;
+}
+.sales-order-create-index .order-billing-method .payment-methods .fieldset {
+  padding: 0;
+  margin: 0;
+}
+.sales-order-create-index .order-billing-method .payment-methods .fieldset .field {
+  margin: 0 0 12px 0;
+}
+.tax.summary-total .summary-collapse {
+  cursor: pointer;
+  display: inline-block;
+}
+.tax.summary-total .summary-collapse:before {
+  content: "\e02d";
+  color: #816063;
+  background: #f2ebde;
+  display: inline-block;
+  text-indent: 0;
+  font-size: 16px;
+  width: 16px;
+  height: 16px;
+  line-height: 16px;
+  overflow: hidden;
+  font-family: 'MUI-Icons';
+  border: 1px solid #ada89e;
+  font-style: normal;
+  vertical-align: top;
+  margin-right: 7px;
+  font-weight: normal;
+  speak: none;
+  -webkit-font-smoothing: antialiased;
+  border-radius: 2px;
+}
+.tax.summary-total .summary-collapse:hover:before {
+  background: #cac3b4;
+}
+.tax.summary-total.show-details .summary-collapse:before {
+  content: "\e03a";
+}
+tr.row-totals:nth-child(even) + tr.summary-details ~ tr.summary-total:not(.show-details):nth-child(even) td,
+tr.row-totals:nth-child(even) + tr.summary-details ~ tr.summary-total:not(.show-details):nth-child(even) ~ tr.row-totals:nth-child(even) td,
+tr.row-totals:nth-child(odd) + tr.summary-details ~ tr.summary-total:not(.show-details):nth-child(odd) ~ tr.row-totals:nth-child(even) td {
+  background: #fbfaf6;
+}
+tr.row-totals:nth-child(odd) + tr.summary-details ~ tr.summary-total:not(.show-details):nth-child(odd) ~ tr.row-totals:nth-child(odd) td,
+tr.row-totals:nth-child(even) + tr.summary-details ~ tr.summary-total:not(.show-details):nth-child(even) ~ tr.row-totals:nth-child(odd) td,
+tr.row-totals:nth-child(odd) + tr.summary-details ~ tr.summary-total:not(.show-details):nth-child(odd) td {
+  background: #fff;
+}
+/* ----------------------------------- */
+#order-data .page-actions {
+  padding-top: 0;
+}
+#order-data .store-switcher {
+  margin: -46px 0 0;
+  position: relative;
+  width: 50%;
+}
+.create-order-sidebar-container > div + div {
+  border-top: 1px solid #ededed;
+  margin-top: 35px;
+}
+.create-order-sidebar-container > div .head h5 {
+  color: #676056;
+  font-size: 14px;
+  font-weight: 400;
+  margin: 17px 0 7px;
+}
+.customer-current-activity-inner > h4 {
+  color: #676056;
+  font-size: 20px;
+  font-weight: 400;
+  border-bottom: 1px solid #ededed;
+  margin-top: 0;
+  padding: 0 0 16px;
+}
+.customer-current-activity-inner .data-table th {
+  color: #676056;
+  font-size: 13px;
+  font-weight: 400;
+}
+.customer-current-activity-inner .data-table td {
+  color: #676056;
+  font-size: 12px;
+  font-weight: 400;
+}
+.customer-current-activity .action-refresh {
+  float: right;
+}
+.customer-current-activity .action-refresh,
+.customer-current-activity .data-table .icon {
+  display: inline-block;
+  text-indent: 100%;
+  overflow: hidden;
+  height: 16px;
+  width: 16px;
+  white-space: nowrap;
+}
+.customer-current-activity .action-refresh:before,
+.customer-current-activity .data-table .icon:before {
+  content: "\e010";
+  color: #c3c2be;
+  display: block;
+  text-indent: 0;
+  font-size: 16px;
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  font-weight: normal;
+  speak: none;
+  -webkit-font-smoothing: antialiased;
+}
+.customer-current-activity .data-table .icon-remove:before {
+  content: "\e07f";
+}
+.customer-current-activity .data-table .icon-add:before {
+  content: "\e071";
+}
+.customer-current-activity .auto-scroll {
+  color: #676056;
+  font-size: 13px;
+  font-weight: 400;
+  overflow: auto;
+  max-height: 150px;
+}
+.customer-current-activity .auto-scroll + button {
+  margin: 22px 0 0;
+}
+.customer-current-activity .actions {
+  border-top: none;
+  margin: 20px 0 0;
+  padding: 0;
+}
+.overlay {
+  background: rgba(255, 255, 255, 0.5);
+  border-radius: 5px;
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  right: 0;
+}
+.overlay span {
+  color: #111;
+  font-weight: bold;
+  position: absolute;
+  top: 56px;
+  left: 0;
+  margin: 0 8px;
+  padding: 10px;
+  background: #ffffff;
+}
+/*
+    Order view
+-------------------------------------- */
+[class^=" sales-order-"] .fieldset-wrapper-title .actions {
+  float: right;
+  font-size: 12px;
+  margin: 8px 20px 0 0;
+}
+[class^=" sales-order-"] .fieldset-wrapper-title .actions a:link,
+[class^=" sales-order-"] .fieldset-wrapper-title .actions a:visited,
+[class^=" sales-order-"] .fieldset-wrapper-title .actions a:hover,
+[class^=" sales-order-"] .fieldset-wrapper-title .actions a:active {
+  color: #a29c94;
+}
+.order-comments-history fieldset {
+  border: 0;
+  margin: 0;
+  padding: 0;
+}
+.order-comments-history textarea,
+.rma-history-form textarea {
+  height: 6em;
+  margin: 5px 0 10px;
+  resize: vertical;
+  width: 100%;
+}
+.order-comments-history input[type="checkbox"] {
+  margin-right: 5px;
+}
+.order-history-comments-options {
+  float: left;
+}
+.order-comments-history .actions {
+  float: right;
+}
+[class^=" sales-order-"] .fieldset-wrapper address {
+  overflow: auto;
+}
+/*
+    Orders comments
+-------------------------------------- */
+.note-list {
+  list-style: none;
+  padding: 0;
+}
+.note-list li {
+  border-top: 1px solid #ededed;
+  padding: 9px 0;
+}
+.note-list li:first-child {
+  border: 0;
+  padding-top: 13px;
+}
+.note-list div {
+  font-size: 12px;
+}
+.note-list .note-list-date,
+.note-list .note-list-status,
+.note-list .note-list-customer span {
+  font-weight: bold;
+}
+.note-list .note-list-time,
+.note-list .note-list-status {
+  border-right: 1px solid #676056;
+  padding: 0 5px 0 0;
+  margin: 0 5px 0 0;
+}
+.note-list .note-list-customer {
+  white-space: nowrap;
+}
+.note-list .note-list-comment {
+  margin: 5px 0 0;
+}
+.note-list .note-list-customer-notapplicable {
+  color: #d87e34;
+}
+.note-list .note-list-customer-notified {
+  color: #185b00;
+}
+.note-list .note-list-customer-not-notified {
+  color: #963535;
+}
+.checkout-agreement-index .col-id,
+[class^=" sales-billing-"] .col-id,
+[class^=" sales-transactions-"] .col-id {
+  width: 35px;
+}
+[class^=" sales-order-shipment-"] .col-ship,
+[class^=" sales-"] .col-return-to-stock,
+.adminhtml-rma-new .col-select {
+  text-align: center;
+  width: 35px;
+}
+[class^=" sales-order-"] .col-price-original,
+[class^=" sales-order-"] .col-tax-amount,
+[class^=" sales-order-"] .col-tax-percent,
+[class^=" sales-order-"] .col-discont,
+[class^=" sales-order-"] .col-total,
+[class^=" sales-order-"] .col-discount,
+[class^=" sales-order-"] .col-tax,
+[class^=" sales-"] .col-refunded,
+[class^=" adminhtml-rma-"] .col-order,
+[class^=" adminhtml-rma-"] .col-required,
+[class^=" adminhtml-rma-"] .col-system,
+[class^=" adminhtml-rma-"] .col-visible-on-front,
+.checkout-agreement-index .col-status,
+.adminhtml-rma-item-attribute-edit .col-position {
+  text-align: right;
+  white-space: nowrap;
+  width: 50px;
+}
+[class^=" sales-order-"] .col-subtotal,
+[class^=" sales-order-"] .col-price,
+[class^=" adminhtml-rma-"] .col-price {
+  text-align: right;
+  width: 50px;
+}
+.sales-order-invoice-view .col-subtotal,
+.sales-order-invoice-view .col-price {
+  width: 10%;
+}
+[class^=" sales-"] .col-actions,
+[class^=" adminhtml-rma-"] .col-actions,
+[class^=" adminhtml-rma-"] .col-default {
+  width: 50px;
+}
+[class^=" sales-"] .col-select,
+[class^=" adminhtml-rma-"] .col-select {
+  width: 60px;
+}
+[class^=" sales-"] .col-qty,
+[class^=" sales-order-"] .col-qty-invoice,
+[class^=" sales-order-"] .col-ordered-qty,
+[class^=" adminhtml-rma-"] .col-qty,
+[class^=" adminhtml-rma-"] .col-condition {
+  width: 70px;
+}
+[class^=" sales-"] .col-refund,
+[class^=" sales-transactions-"] .col-closed,
+.sales-order-view .col-closed {
+  text-align: center;
+  width: 70px;
+}
+[class^=" sales-"] .col-order-number,
+[class^=" sales-"] .col-invoice-number,
+[class^=" sales-"] .col-memo-number,
+[class^=" sales-"] .col-shipment-number,
+[class^=" sales-"] .col-rma-number,
+[class^=" sales-"] .col-status,
+[class^=" adminhtml-rma-"] .col-order-number,
+[class^=" adminhtml-rma-"] .col-rma-number,
+[class^=" sales-transactions-"] .col-order-id,
+.sales-order-view .col-refunded {
+  white-space: normal;
+  width: 75px;
+}
+[class^=" sales-"] .col-gtbase,
+[class^=" sales-"] .col-gtpurchased {
+  text-align: right;
+  white-space: normal;
+  width: 75px;
+}
+[class^=" sales-"] .col-order-number,
+[class^=" sales-"] .col-rma-number,
+[class^=" adminhtml-rma-"] .col-order-number,
+[class^=" adminhtml-rma-"] .col-rma-number {
+  text-align: left;
+}
+[class^=" adminhtml-rma-"] .col-status,
+[class^=" adminhtml-rma-"] .col-reason,
+[class^=" adminhtml-rma-"] .col-resolution,
+[class^=" sales-transactions-"] .col-transaction-type,
+.sales-order-view .col-memo {
+  width: 100px;
+}
+[class^=" sales-"] tr.headings .col-parent-transaction-id > span,
+[class^=" sales-"] tr.headings .col-method > span,
+[class^=" sales-"] tr.headings .col-transaction-id > span,
+[class^=" sales-"] tr.headings .col-transaction-type > span,
+[class^=" sales-"] tr.headings .col-gtbase > span,
+[class^=" sales-"] tr.headings .col-gtpurchased > span,
+[class^=" sales-order-"] tr.headings .col-discont > span {
+  white-space: normal;
+}
+[class^=" sales-"] .col-period,
+[class^=" adminhtml-rma-"] .col-period {
+  width: 150px;
+}
+[class^=" sales-order-shipment-"] .col-carrier {
+  width: 190px;
+}
+.checkout-agreement-index .col-store-view {
+  white-space: nowrap;
+  width: 200px;
+}
+[class^=" sales-transactions-"] .log-details .data-table tbody tr th,
+[class^=" sales-transactions-"] .col-key {
+  width: 22%;
+}
+.sales-order-index .col-1-layout table.data {
+  table-layout: fixed;
+  word-wrap: break-word;
+}
+[class^=" sales-"] .col-from-store {
+  width: 15%;
+}
+[class^=" sales-"] .col-2-left-layout .hor-scroll {
+  margin-bottom: -4px;
+  overflow: auto;
+  padding-bottom: 4px;
+  width: 100%;
+}
+[class^=" sales-order-"] .order-totals .actions,
+[class^=" adminhtml-rma-"] .col-qty,
+[class^=" adminhtml-rma-"] .col-qty_ordered,
+.sales-order-view .col-refunded {
+  text-align: right;
+}
+[class^=" sales-order-"] .col-price .label,
+[class^=" sales-order-"] .col-subtotal .label {
+  display: inline-block;
+  min-width: 60px;
+  white-space: nowrap;
+}
+[class^=" sales-order-"] .col-price .price-excl-tax .price,
+[class^=" sales-order-"] .col-price .price-incl-tax .price,
+[class^=" sales-order-"] .col-subtotal .price-excl-tax .price,
+[class^=" sales-order-"] .col-subtotal .price-incl-tax .price {
+  font-weight: bold;
+}
+[class^=" sales-order-"] .grid .col-qty table,
+[class^=" sales-order-"] .grid .col-qty tbody,
+[class^=" sales-order-"] .grid .col-qty tr,
+[class^=" sales-order-"] .grid .col-qty td,
+[class^=" sales-order-"] .grid .col-ordered-qty table,
+[class^=" sales-order-"] .grid .col-ordered-qty tbody,
+[class^=" sales-order-"] .grid .col-ordered-qty tr,
+[class^=" sales-order-"] .grid .col-ordered-qty td {
+  background: none;
+  border: 0;
+}
+[class^=" sales-order-"] .col-ordered-qty td {
+  padding: 0 5px 3px;
+}
+[class^=" sales-order-"] .grid .product-title {
+  font-weight: bold;
+}
+[class^=" sales-order-"] .item-options {
+  margin: 5px 0 5px 10px;
+}
+[class^=" sales-order-"] .item-options dt {
+  font-weight: bold;
+}
+[class^=" sales-order-"] .item-options dd {
+  margin: 0 0 0 10px;
+}
+.adminhtml-rma-item-attribute-edit .col-position input {
+  text-align: center;
+}
+.order-subtotal .label {
+  text-align: right;
+}
+.items-to-invoice {
+  border: 1px solid #c0bbaf;
+  margin-top: 13px;
+  width: 100%;
+}
+.items-to-invoice td,
+table.items-to-invoice tbody tr:hover td {
+  background-color: #e6e3de;
+  border: 0;
+  text-align: center;
+}
+[class^=" sales-order-creditmemo-"] .no-items {
+  padding-top: 13px;
+  text-align: center;
+}
+.items-to-invoice .grand-total {
+  color: #19a3d1;
+  font-weight: bold;
+}
+.sales-order-shipment-new .order-totals .fieldset-wrapper {
+  padding-top: 18px;
+}
+.sales-order-shipment-new .actions {
+  float: right;
+}
+.creditmemo-totals .data-table input[type="text"] {
+  text-align: right;
+  width: 60px;
+}
+[class^=" sales-order-"] .order-subtotal .label {
+  width: 80%;
+}
+.adminhtml-rma-new .rma-confirmation .actions {
+  margin-top: 10px;
+  text-align: right;
+}
+[class^=" adminhtml-rma-"] .rma-items th.col-qty span,
+.adminhtml-rma-edit .rma-items th.col-qty span {
+  text-align: left;
+  white-space: normal;
+}
+.adminhtml-rma-edit .data-table .col-carrier,
+[class^=" sales-billing-agreement-"] .log-details .data-table th {
+  width: 20%;
+}
+.adminhtml-rma-edit .data-table .col-title {
+  width: 35%;
+}
+.adminhtml-rma-edit .data-table .col-number {
+  width: 25%;
+}
+[class^=" sales-order-"] .order-shipping-address .price,
+.order-shipping-address .shipping-description-title {
+  font-weight: bold;
+}
+[class^=" adminhtml-rma-"] .col-actions a {
+  cursor: pointer;
+  white-space: nowrap;
+}
+[class^=" adminhtml-rma-"] .col-reason input[type="text"] {
+  margin: 5px 0 0;
+  width: 100%;
+}
+[class^=" adminhtml-rma-"] .col-actions .separator {
+  margin: 0 3px;
+}
+[class^=" sales-"] .order-payment-method .data-table {
+  margin-top: 15px;
+}
+[class^=" sales-"] .order-payment-currency {
+  margin-top: 15px;
+}
+[class^=" sales-"] .grid tbody td {
+  vertical-align: top;
+}
+[class^=" sales-"] .grid tbody.even tr td {
+  background: #e6e3de;
+}
+[class^=" sales-"] .grid tbody.odd tr td {
+  border-bottom: 0;
+  background: #f5f2ed;
+}
+[class^=" sales-"] .grid .data {
+  border-bottom: 1px solid #c0bbaf;
+}
+[class^=" sales-"] .grid td .option-label {
+  font-weight: bold;
+}
+[class^=" sales-"] .grid td .option-value {
+  margin: 0 0 0 10px;
+}
+.col-product .product_to_add {
+  float: right;
+}
+[class^=" adminhtml-extension-custom-"] #authors_fieldset .data-table td {
+  vertical-align: top;
+}
+/*
+    Packaging for Shipping Popup
+-------------------------------------- */
+#popup-window-mask,
+.popup-window-mask {
+  background: rgba(0, 0, 0, 0.5);
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 999;
+}
+.packaging-window,
+.packed-window {
+  background: #fff;
+  -webkit-box-shadow: 0 3px 6px rgba(0, 0, 0, 0.4);
+  box-shadow: 0 3px 6px rgba(0, 0, 0, 0.4);
+  left: 50%;
+  margin: -200px 0 0 -471px;
+  position: fixed;
+  top: 50%;
+  width: 1000px;
+  z-index: 1000;
+}
+.packaging-window .entry-edit-head {
+  padding: 3px 5px;
+}
+.packaging-window .messages {
+  padding: 10px 26px 10px 32px;
+  border: 0;
+  -moz-border-radius: 0;
+  -webkit-border-radius: 0;
+  border-radius: 0;
+  color: #963535;
+  text-shadow: none;
+  position: relative;
+  background: #f3dcd8;
+  border: 1px solid #963535;
+  margin-top: -1px;
+}
+.packaging-window .messages:before {
+  position: absolute;
+  left: 8px;
+  top: 50%;
+  margin-top: -11px;
+  background: none;
+  text-shadow: none;
+  width: auto;
+  height: auto;
+  border: 0;
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  speak: none;
+  font-weight: normal;
+  -webkit-font-smoothing: antialiased;
+  font-size: 16px;
+  content: '\e069';
+  color: #963535;
+}
+.packaging-window .validation-failed {
+  background: #fef0ed;
+  border: 1px dashed #d6340e;
+}
+.packaging-window .packaging-content {
+  overflow: auto;
+  overflow-x: hidden;
+  height: auto !important;
+  max-height: 400px;
+}
+.packaging-window .package-options {
+  width: 100%;
+  border-top: 1px solid #ccc;
+  padding: 10px 0 0;
+  margin: 3px 0 0;
+}
+.packaging-window .package-options td {
+  vertical-align: middle;
+}
+.packaging-window .package-options .input-text {
+  width: 50px;
+}
+.packaging-window .package_prapare {
+  margin-bottom: 15px;
+}
+.packaging-window .package-options .customs-value {
+  width: 80px;
+}
+.packaging-window .package-options .options-weight {
+  width: 75px;
+}
+.packaging-window .package-options .options-units-weight {
+  width: 45px;
+}
+.packaging-window .package-options .options-units-dimensions {
+  width: 45px;
+}
+.packaging-window .package-options .options-content-type {
+  width: 120px;
+}
+.packaging-window .package-options input[type=text].disabled,
+.packaging-window .package-options select.disabled {
+  background: #eee;
+}
+.packaging-window .package-options-contents {
+  border-top: 0;
+}
+.packaging-window .package-add-products {
+  margin: 20px 0 0;
+}
+.packaging-window .package-add-products .grid {
+  padding: 0;
+}
+.packaging-window .package-add-products .grid button {
+  vertical-align: middle;
+}
+.packaging-window .package-number {
+  font-weight: bold;
+}
+.packaging-window .package-number span {
+  margin-left: 5px;
+}
+.packed-window .entry-edit-head {
+  padding: 3px 5px;
+}
+.packed-window .packed-content {
+  padding: 10px 10px 0;
+  overflow: auto;
+  max-height: 400px;
+}
+.packed-window .package {
+  border-top: 1px solid #ededed;
+  margin-bottom: 30px;
+  padding: 10px;
+}
+.packed-window .package:first-child {
+  border-top: 0;
+}
+.package-info {
+  background: #e6e3de;
+  border: 1px solid #c0bbaf;
+}
+.package-info th {
+  font-weight: bold;
+}
+.packed-window .package-info table tbody tr td,
+.packed-window .package-info table tbody tr th,
+.package-info table tbody tr:nth-child(2n+1) td,
+.package-info table tbody tr:nth-child(2n+1) th {
+  background: none;
+  border: 0;
+  padding: 5px 5px 2px;
+}
+.packed-window .package .grid {
+  padding: 0;
+}
+.packed-window .package-options {
+  width: 60%;
+}
+.packed-window .package-options td,
+.packed-window .package-options th {
+  padding: 1px 0;
+}
+.grid .popup-window {
+  text-align: left;
+}
+.grid tr.on-mouse td .popup-window .data-table tbody tr:nth-child(2n+1) td,
+.grid table tbody tr.on-mouse:nth-child(odd):hover td .popup-window .data-table tbody tr:nth-child(2n+1) td,
+.grid table tbody tr.on-mouse:nth-child(odd):hover td .popup-window .data-table tbody tr:nth-child(2n+1):hover td,
+.grid table tbody tr.on-mouse:nth-child(2n+1):hover td .popup-window .data-table tbody tr:nth-child(2n+1) td,
+.grid table tbody tr.on-mouse:nth-child(2n+1):hover td .popup-window .data-table tbody tr:nth-child(2n+1):hover td,
+.grid table tbody tr.on-mouse:hover td .popup-window .data-table tbody tr:nth-child(2n+1),
+.grid table tbody tr.on-mouse:hover th .popup-window .data-table tbody tr:nth-child(2n+1) {
+  background-color: #fbfaf6;
+}
+.grid .popup-window {
+  text-align: left;
+}
+.popup-window-buttons-set {
+  text-align: right;
+  padding: 25px;
+}
+.popup-window-title {
+  background: #f3efea;
+  padding: 19px 20px;
+}
+.popup-window-title .title {
+  color: #676056;
+  display: block;
+  font-size: 20px;
+  line-height: 1;
+}
+.popup-window-title .actions {
+  float: right;
+}
+.popup-window-content {
+  padding: 25px 25px 0;
+}
+.popup-window-content > ul {
+  list-style: none;
+  padding: 0;
+}
+.packaging-window .col-weight {
+  text-align: left;
+  width: 60px;
+}
+.packaging-window .col-qty {
+  text-align: left;
+  width: 80px;
+}
+.packed-window .col-qty,
+.packed-window .col-weight,
+.packed-window .col-qty_ordered {
+  text-align: right;
+  width: 70px;
+}
+.packaging-window .col-select,
+.packaging-window .col-measure {
+  text-align: center;
+  width: 35px;
+}
+.popup-fieldset-title .title {
+  color: #666;
+  display: inline-block;
+  font-size: 18px;
+  font-weight: normal;
+  padding: 7px 0 10px;
+}
+.popup-fieldset-title .actions {
+  float: right;
+}
+.packaging-window select {
+  margin-bottom: 0;
+}
+.packaging-window .col-width,
+.packaging-window .col-height,
+.packaging-window .col-length,
+.packaging-window .data-table .col-total-weight input[type="text"] {
+  width: 60px;
+}
+.packaging-window .col-total-weight {
+  white-space: nowrap;
+  width: 100px;
+}
+.packaging-window .col-signature {
+  width: 160px;
+}
+.packaging-window .data-table .col-actions,
+.packaging-window .col-total-weight {
+  white-space: nowrap;
+}
+.packaging-window .data-table .action-delete {
+  margin: 5px 0 0 5px;
+}
+.packaging-window .grid tr th {
+  border-bottom: 1px solid #c9c2b8;
+}
+.packaging-window .grid tr th:first-child,
+.packaging-window .grid td:first-child,
+.packaging-window .grid td:last-child {
+  border-left: 0;
+  border-right: 0;
+}
+.packaging-window .data-table .col-qty-edit {
+  white-space: nowrap;
+  width: 50px;
+}
+.packaging-window .data-table .col-qty-edit input[type="text"] {
+  width: 50px;
+}
+.sp-methods > dt {
+  font-weight: bold;
+}
+.sp-methods > dd {
+  margin: 5px 0 5px 15px;
+}
+.sp-methods > dd > ul {
+  list-style: none;
+  padding: 0;
+}
+[class^=" sales-order-"] .order-billing-address .packaging-window .actions,
+[class^=" sales-order-"] .order-shipping-address .packaging-window .actions {
+  margin: 0;
+}
+/*
+    Popup Configuration Popup
+-------------------------------------- */
+#product_composite_configure_messages {
+  margin-left: 0 !important;
+  padding: 10px 15px;
+}
+.rma-popup,
+.cms-popup {
+  background: #fff;
+  box-shadow: 0 3px 6px rgba(0, 0, 0, 0.4);
+  cursor: default;
+  position: fixed;
+  left: 50%;
+  top: 50%;
+  z-index: 1000;
+}
+.rma-popup {
+  width: 540px;
+  margin: 0 0 0 -271px;
+}
+.rma-popup .entry-edit .fieldset {
+  border: none;
+}
+.rma-popup .validation-advice,
+.rma-popup label.mage-error {
+  margin-left: 0;
+}
+.rma-popup .content {
+  background: #fff;
+  border-bottom: 1px solid #ccc;
+  max-height: 400px;
+  overflow: auto;
+}
+.rma-popup .content .grid {
+  padding: 0;
+}
+.rma-popup .content .grid table {
+  border-bottom: 1px solid #cbd3d4;
+}
+.rma-popup .product-options {
+  border-bottom: 1px solid #e7e7e7;
+  margin: 0 0 15px;
+  padding: 0 0 12px;
+}
+.rma-popup .product-options .required {
+  color: #333 !important;
+  font-weight: normal !important;
+}
+.rma-popup .product-options .required em {
+  color: #d40707;
+}
+.rma-popup .last-fieldset .product-options {
+  border: 0 none;
+  margin-bottom: 0;
+  padding-bottom: 0;
+}
+.rma-popup .buttons-set {
+  text-align: right;
+  margin: 0;
+  overflow: hidden;
+  padding: 7px 10px 8px;
+}
+.rma-popup .buttons-set {
+  width: 518px;
+}
+.cms-popup .buttons-set {
+  width: 289px;
+}
+.rma-popup .buttons-set button {
+  margin: 0 0 0 5px;
+}
+.grid .rma-popup .form-list tr,
+.grid tr.even .rma-popup .form-list tr,
+.grid tr.on-mouse .rma-popup .form-list tr {
+  background: #fff !important;
+}
+/*
+    URL rewrite
+-------------------------------------- */
+.adminhtml-urlrewrite-edit .field-url-rewrite-option-select .label {
+  width: auto;
+}
+/*
+    Shopping Cart Price Rule
+-------------------------------------- */
+.fieldset .field-coupon_code,
+.fieldset .field-rule_use_auto_generation {
+  margin-bottom: 0;
+}
+.field-rule_use_auto_generation .label {
+  margin-left: 5px;
+}
+.field-rule_use_auto_generation .nested {
+  margin-bottom: 29px;
+}
+/*
+    Product Image Placeholders
+-------------------------------------- */
+#catalog_placeholder .input-file,
+#catalog_placeholder .delete-image > input {
+  margin-right: 5px;
+}
+/* Permanent Redirect for old URL */
+.control > [name="product[url_key_create_redirect]"],
+.control > [name="general[url_key_create_redirect]"] {
+  float: left;
+  margin: 8px 5px 0 0;
+}
+.control > [name="product[url_key_create_redirect]"] + .label,
+.control > [name="general[url_key_create_redirect]"] + .label {
+  width: auto;
+}
+/*
+    New Product Attribute Set
+-------------------------------------- */
+.field-skeleton_set .select {
+  width: 100%;
+}
+/*
+    Cache Management
+-------------------------------------- */
+.additional-cache-management .label {
+  margin-top: 5px;
+}
+/*
+    Currency Symbols
+-------------------------------------- */
+.adminhtml-system-currencysymbol-index th.col-symbol .required:after {
+  content: '*';
+  margin-left: 3px;
+}
+.adminhtml-system-currencysymbol-index td.col-currency .label {
+  margin-top: 5px;
+}
+/*
+    Categories
+-------------------------------------- */
+.category-content .form-inline.permissions-custom-options .messages li {
+  margin-top: 0;
+}
+.category-content .form-inline.permissions-custom-options .data-table {
+  margin-bottom: 25px;
+}
+/*
+    Marketing - Email Reminders
+-------------------------------------- */
+.lt-1280 .adminhtml-reminder-edit #customerGrid .grid .filter .range div.date {
+  min-width: 0;
+}
+/*
+    Customers - Manage Shopping Cart
+-------------------------------------- */
+.checkout-index-index .products-search {
+  margin-top: 35px;
+}
+.checkout-index-index .products-search > .actions {
+  text-align: right;
+  margin: 10px 0;
+}
+.checkout-index-index .shopping-cart-items > .actions {
+  margin-bottom: 15px;
+}
+.checkout-index-index .shopping-cart-items .box-left,
+.checkout-index-index .shopping-cart-items .box.right {
+  width: 49%;
+}
+.checkout-index-index .shopping-cart-items .box-left fieldset,
+.checkout-index-index .shopping-cart-items .box.right fieldset {
+  border-radius: 5px;
+}
+.checkout-index-index .shopping-cart-items .box-left {
+  float: left;
+}
+.checkout-index-index .shopping-cart-items .box.right {
+  float: right;
+}
+.checkout-index-index .grid table .action-configure {
+  float: right;
+}
+/*
+    Clearfix
+-------------------------------------- */
+.shopping-cart-items:before,
+.shopping-cart-items:after,
+.image-panel:before,
+.image-panel:after,
+.images:before,
+.images:after,
+.tax-rate-popup .field:before,
+.tax-rate-popup .field:after,
+.clearfix:before,
+.clearfix:after,
+#tab_content_downloadableInfo .data-table td .row:before,
+#tab_content_downloadableInfo .data-table td .row:after {
+  content: "";
+  display: table;
+}
+.shopping-cart-items:after,
+.image-panel:after,
+.images:after,
+.tax-rate-popup .field:after,
+.clearfix:after,
+#tab_content_downloadableInfo .data-table td .row:after {
+  clear: both;
+}
+.debug {
+  border: 1px solid red !important;
+}
+.messages ul,
+ul.messages {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+ul.messages > li {
+  margin: 20px 0;
+}
+ul.messages li li {
+  padding: 10px 26px 10px 35px;
+  border-radius: 5px;
+  color: #676056;
+  text-shadow: none;
+  position: relative;
+  background: #fffbf0;
+  border: 1px solid #d87e34;
+  margin-top: -1px;
+}
+ul.messages li li:first-child {
+  margin-top: 0;
+}
+ul.messages li li:before {
+  position: absolute;
+  left: 11px;
+  top: 50%;
+  margin-top: -11px;
+  background: none;
+  text-shadow: none;
+  width: auto;
+  height: auto;
+  border: 0;
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  speak: none;
+  font-weight: normal;
+  -webkit-font-smoothing: antialiased;
+  font-size: 16px;
+  content: '\e046';
+  /* icon-info  */
+
+  color: #d87e34;
+}
+ul.messages li.error-msg li {
+  color: #963535;
+  border-color: #963535;
+  background: #f3dcd8;
+}
+ul.messages li.error-msg li:before {
+  content: '\e069';
+  color: #963535;
+}
+ul.messages li.success-msg li {
+  border-color: #ceceb6;
+  background: #e4eecb;
+  color: #185b00;
+}
+ul.messages li.success-msg li:before {
+  content: '\e067';
+  color: #185b00;
+}
+/*
+    Accordion
+------------------------*/
+.accordion {
+  margin: 0 0 8px;
+  padding: 0;
+}
+.accordion > dt,
+.accordion > dd.open,
+.accordion .collapseable,
+.section-config.active > .collapseable + input + fieldset,
+.accordion .collapseable.open + input + fieldset {
+  background: #fff;
+  border: 1px solid #eae6e0;
+  border-radius: 5px;
+  margin: 0 0 8px;
+  padding: 5px 18px 2px;
+  position: relative;
+}
+.accordion > dt + dd {
+  display: none;
+}
+.accordion > dt.open,
+.section-config.active > .collapseable,
+.accordion .collapseable.open {
+  margin: 0;
+  border-bottom: 0;
+  border-radius: 5px 5px 0 0;
+}
+.section-config.active > .collapseable + input + fieldset,
+.accordion > dt + dd.open,
+.accordion .collapseable.open + input + fieldset {
+  padding: 25px 18px 18px;
+  display: block;
+  border-top: 0;
+  border-radius: 0 0 5px 5px;
+}
+.section-config > .collapseable > a,
+.accordion > dt a,
+.accordion .collapseable > a {
+  color: #676056;
+  font-size: 20px;
+  font-weight: 400;
+  display: block;
+  padding: 7px 0 10px 22px;
+  text-decoration: none;
+  position: relative;
+  cursor: pointer;
+}
+.section-config > .collapseable > a i,
+.accordion > dt a i,
+.accordion .collapseable > a i {
+  color: #676056;
+  font-size: 20px;
+  font-style: italic;
+  font-weight: 400;
+}
+.section-config.active > .collapseable > a,
+.accordion .collapseable.open a,
+.accordion dt.open a {
+  border-bottom: 1px solid #ededed;
+}
+.section-config > .collapseable > a:before,
+.accordion > dt a:before,
+.accordion .collapseable > a:before {
+  position: absolute;
+  left: 0;
+  top: 7px;
+  font-family: 'MUI-Icons';
+  font-style: normal;
+  speak: none;
+  font-weight: normal;
+  -webkit-font-smoothing: antialiased;
+  content: '\e02a';
+  /* arrow right icon */
+
+  color: #b2b0ad;
+}
+.section-config.active > .collapseable > a:before,
+.accordion > dt.open a:before,
+.accordion .collapseable.open a:before {
+  content: '\e02c';
+  /* arrow down icon */
+
+}
+.section-config > .collapseable > a:hover:before,
+.accordion > dt a:hover:before,
+.accordion .collapseable > a:hover:before {
+  color: #7e7e7e;
+}
+/* PayPal connected */
+.section-config.complex .section-config.with-button {
+  padding: 20px 15px;
+  margin: 0 -30px 0 -15px;
+  border-bottom: 1px solid #eae6e0;
+}
+.section-config.complex tr:last-child .section-config.with-button {
+  border-bottom: 0;
+}
+.section-config.complex .section-config.with-button > .entry-edit-head {
+  padding: 0;
+  padding-left: 25px;
+  border: 0;
+}
+.section-config.complex .section-config.with-button.enabled > .entry-edit-head:before {
+  content: "\e01e";
+  color: #fff;
+  background: #65940a;
+  font-family: "MUI-Icons";
+  font-weight: normal;
+  padding: 3px;
+  font-size: 10px;
+  width: 10px;
+  height: 10px;
+  line-height: 10px;
+  overflow: hidden;
+  border-radius: 8px;
+  display: block;
+  float: left;
+  margin-left: -25px;
+  margin-top: 0;
+}
+.section-config.complex .section-config.with-button > .config {
+  margin: 10px -10px;
+  border: 1px solid #d1d0ce;
+  border-radius: 5px;
+  padding: 5px 0;
+}
+.section-config.complex .section-config.with-button > .config > table > tbody > tr > td {
+  padding: 0;
+}
+.section-config.complex .section-config.with-button > .config > table > tbody > tr > td > .section-config > .entry-edit-head {
+  border: 0;
+  border-radius: 0;
+  margin-bottom: 0;
+  padding: 5px 10px 2px;
+  border-bottom: 1px solid #d1d0ce;
+  background: transparent;
+}
+.section-config.complex .section-config.with-button > .config > table > tbody > tr:last-child > td > .section-config > .entry-edit-head {
+  border: 0;
+}
+.section-config.complex .section-config.with-button > .config > table > tbody > tr > td > .section-config > .entry-edit-head a {
+  border-bottom: 0;
+}
+.section-config.complex .section-config.with-button > .config > table > tbody > tr > td > .section-config > .config {
+  border: 0;
+  border-bottom: 1px solid #d1d0ce;
+  border-radius: 0;
+  margin: 0;
+  padding-bottom: 50px;
+}
+.section-config.complex .section-config.with-button > .config > table > tbody > tr:last-child > td > .section-config > .config {
+  border-bottom: 0;
+}
+.section-config .config h4 {
+  padding-left: 25%;
+  font-size: 18px;
+}
+.section-config .config td.label label.enabled:before {
+  content: "\e01e";
+  color: #fff;
+  background: #65940a;
+  font-family: "MUI-Icons";
+  font-weight: normal;
+  padding: 3px;
+  font-size: 10px;
+  width: 10px;
+  height: 10px;
+  line-height: 10px;
+  overflow: hidden;
+  border-radius: 8px;
+  display: block;
+  float: left;
+  margin-right: 5px;
+}
+.section-config.complex .section-config.with-button > .config:before {
+  content: '';
+  height: 9px;
+  width: 20px;
+  overflow: hidden;
+  display: block;
+  position: absolute;
+  bottom: 100%;
+  left: 50%;
+  zoom: 1;
+  z-index: 2;
+  margin-left: -10px;
+  background: url(../images/subconfig-bg.png) no-repeat 0 0;
+}
+.section-config.config-advanced {
+  padding: 30px 0 0;
+}
+.section-config.config-advanced > .entry-edit-head {
+  border: 0;
+  padding: 0;
+  padding-left: 25%;
+}
+.section-config.config-advanced > .entry-edit-head a {
+  border: 0 !important;
+}
+.section-config.config-advanced > .config {
+  padding-left: 0!important;
+  padding-right: 0!important;
+  border: 0!important;
+  border-radius: 0!important;
+}
+.section-config.config-advanced > .entry-edit-head a {
+  margin-left: -22px;
+}
+.section-config.with-button .config-heading strong {
+  display: block;
+  color: #676056;
+  font-size: 14px;
+  font-weight: 700;
+  margin-bottom: 5px;
+}
+.section-config.with-button .config-heading .button-container {
+  margin: 15px 0 0;
+}
+.section-config.with-button .button-container {
+  line-height: 28px;
+}
+.section-config.with-button .button-container a {
+  margin-left: 20px;
+}
+.section-config.with-button .action-configure span {
+  display: block;
+  position: relative;
+  text-align: center;
+}
+.section-config.with-button .action-configure .state-opened {
+  visibility: hidden;
+  height: 0;
+  overflow: hidden;
+}
+.section-config.with-button .action-configure.open .state-opened {
+  visibility: visible;
+  height: auto;
+  overflow: auto;
+}
+.section-config.with-button .action-configure.open .state-closed {
+  visibility: hidden;
+  height: 0;
+  overflow: hidden;
+}
+.accordion > dt + dd {
+  display: none;
+}
+.accordion > dt + .open:empty {
+  background: #ffffff url(../mui/images/ajax-loader-big.gif) no-repeat center;
+  height: 100px;
+}
+/* TODO: arrange configuration tables */
+.accordion .collapseable.disabled {
+  background: #f1f1f1;
+}
+.accordion .collapseable.disabled > a {
+  cursor: not-allowed;
+}
+.accordion .collapseable.disabled > a:before {
+  content: '';
+}
+.accordion .config {
+  border: 0;
+}
+.accordion .config .comment a {
+  color: #007dbd;
+  font-size: 14px;
+  font-weight: 400;
+}
+.accordion .config .comment a:focus,
+.accordion .config .comment a:hover {
+  text-decoration: underline;
+}
+.accordion .config legend {
+  display: none;
+}
+.accordion .config table {
+  width: 100%;
+}
+.accordion .config .label {
+  float: none;
+  width: 25%;
+  text-align: right;
+  color: #676056;
+  font-size: 13px;
+  font-weight: 600;
+}
+.accordion .config .value .label {
+  padding: 6px 5px 0 15px;
+  vertical-align: top;
+  width: auto;
+}
+.accordion .config .value .label:first-child {
+  padding-left: 0;
+}
+.accordion .config .label label {
+  padding-top: 6px;
+}
+.accordion .config td {
+  background: none;
+  border: 0;
+  padding: 8px 15px 0 0;
+  vertical-align: top;
+}
+.accordion .paypal-selection-simplified {
+  padding-left: 30px;
+}
+.accordion .paypal-selection input[type="checkbox"] {
+  margin: -4px 7px 0 0;
+}
+.accordion .config input[type="text"],
+.accordion .config input[type="password"],
+.accordion .config select,
+.accordion .config textarea {
+  width: 100%;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+.accordion .config input.input-file {
+  margin-top: 4px;
+}
+.accordion .config select.select-date {
+  width: 20%;
+}
+.accordion .config .value {
+  width: 50%;
+  padding-right: 40px;
+}
+.accordion .config .value.with-tooltip {
+  padding-top: 5px;
+}
+.accordion .config .value.with-tooltip .tooltip {
+  position: relative;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  margin: 0;
+  float: right;
+  margin-right: -20px;
+  margin-top: 6px;
+}
+.accordion .config .value.with-tooltip .tooltip-content {
+  padding: 18px;
+  margin: 0 -17px 10px 0;
+  right: 0;
+  bottom: 100%;
+  width: 239px;
+  max-width: 239px;
+  font-size: 13px;
+  line-height: 1.4;
+  background: #31302b;
+  background: rgba(49, 48, 43, 0.8);
+  border-radius: 5px;
+}
+.accordion .config .value.with-tooltip .tooltip-content:before {
+  content: '';
+  position: absolute;
+  width: 0;
+  height: 0;
+  top: auto;
+  bottom: -5px;
+  left: auto;
+  right: 20px;
+  border-left: 5px solid transparent;
+  border-right: 5px solid transparent;
+  border-top: 5px solid #31302b;
+  border-bottom: 0;
+  opacity: .8;
+}
+.accordion .config .value.with-tooltip .help {
+  position: relative;
+  width: auto;
+  margin: 0;
+}
+.accordion .config .scope-label {
+  color: #999;
+  font-size: 12px;
+  letter-spacing: 0.05em;
+  padding: 15px 15px 0 0;
+}
+.accordion .config .note {
+  color: #676056;
+  font-size: 12px;
+  font-weight: 400;
+  padding-left: 15px;
+  margin: 5px 0;
+}
+.accordion .config .note a {
+  color: #007dbd;
+  font-size: 12px;
+  font-weight: 400;
+}
+.accordion .config .note a:focus,
+.accordion .config .note a:hover {
+  text-decoration: underline;
+}
+.accordion .config .note:before {
+  position: absolute;
+  margin: 4px 0 0 -14px;
+  content: '';
+  display: inline-block;
+  vertical-align: top;
+  font-size: 0;
+  line-height: 0;
+  width: 0;
+  border-bottom: 5px solid #666;
+  border-left: 5px solid transparent;
+  border-right: 5px solid transparent;
+}
+.accordion .config .system-tooltip-box {
+  position: absolute;
+}
+.accordion .paypal-selection {
+  margin: 10px;
+  width: 98%;
+}
+.accordion .paypal-selection th {
+  padding: 6px 10px 7px;
+}
+.accordion .paypal-selection {
+  border-bottom: 2px solid #c0bbaf;
+}
+.accordion .paypal-payment-notice {
+  margin: 10px;
+}
+.accordion .custom-options {
+  border: 1px solid #999;
+  padding: 0 10px;
+  margin: 0 0 20px;
+}
+/* TODO: arrange range inputs width in tables */
+.grid td input.input-text-range {
+  width: 35%;
+}
+.grid td input.input-text-range-date {
+  width: 31%;
+}
+/* TODO: styles for required TH fields */
+th.required:after {
+  color: red;
+  content: "*";
+  margin-left: 5px;
+}
+/* TODO: set color for messages in Cache Storage Management */
+.grid-severity-critical,
+.grid-severity-major,
+.grid-severity-notice,
+.grid-severity-minor {
+  display: block;
+  border: 1px solid #c76f35;
+  background: #fffbf0;
+  text-align: center;
+}
+.grid-severity-critical {
+  border-color: #6e1313;
+  background: #f7bfbf;
+  color: #6e1313;
+}
+.grid-severity-major {
+  border-color: #963535;
+  background: #f3dcd8;
+  color: #963535;
+}
+.grid-severity-notice {
+  border-color: #185b00;
+  background: #e6ecc0;
+  color: #185b00;
+}
+/*
+    Sales
+-------------------------------------- */
+.order-items .entry-edit-head .form-buttons {
+  float: right;
+}
+.order-items .entry-edit-head .icon-head {
+  display: inline;
+}
+.order-items .entry-edit-head {
+  margin-bottom: 20px;
+}
+.order-items .entry-edit-head:before,
+.order-items .entry-edit-head:after {
+  content: "";
+  display: table;
+}
+.order-items .entry-edit-head:after {
+  clear: both;
+}
+/*
+    Import-export tax rates
+-------------------------------------- */
+.import-export-tax-rates input[type=file] {
+  margin-right: 10px;
+}
+.import-tax-rates,
+.export-tax-rates {
+  float: left;
+  width: 48.9362%;
+}
+.export-tax-rates {
+  margin-left: 2.12766%;
+}
+.import-export-tax-rates:before,
+.import-export-tax-rates:after {
+  content: "";
+  display: table;
+}
+.import-export-tax-rates:after {
+  clear: both;
+}
+/*
+    Product
+-------------------------------------- */
+.tier {
+  margin: 20px 0 0;
+}
+/*
+    Edit attribute set
+-------------------------------------- */
+.attribute-set-col {
+  display: block;
+  float: left;
+  width: 100%;
+  margin-left: 2.127659574%;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  -ms-box-sizing: border-box;
+  box-sizing: border-box;
+  width: 31.9149%;
+}
+.attribute-set-col:first-child {
+  margin-left: 0;
+}
+.attribute-set-tree {
+  margin-top: 5px;
+  overflow: auto;
+  height: 400px;
+  width: 100%;
+}
+.attribute-set:before,
+.attribute-set:after {
+  content: "";
+  display: table;
+}
+.attribute-set:after {
+  clear: both;
+}
+/*
+    Manage Categories
+-------------------------------------- */
+.catalog-category-edit .category-edit-title {
+  float: left;
+}
+/*
+    Catalog Price Rule
+-------------------------------------- */
+.rule-tree-wrapper {
+  line-height: 28px;
+}
+.rule-tree ul {
+  list-style: none;
+  padding-left: 16px;
+  border-left: dotted 1px #888;
+}
+.rule-tree li {
+  margin: 0 0 10px;
+}
+.rule-tree .x-tree ul {
+  padding-left: 0 !important;
+  border-left: none !important;
+}
+.rule-param .label {
+  color: #000;
+  float: none;
+  text-align: left;
+  padding: 0;
+  vertical-align: baseline;
+  width: auto;
+}
+.rule-param .label-disabled {
+  color: #eee;
+  cursor: default;
+  text-decoration: none;
+}
+.rule-chooser,
+.rule-param .element,
+.rule-param-edit .label {
+  display: none;
+}
+.rule-param input,
+.rule-param select {
+  width: auto !important;
+  margin: 0;
+  min-width: 170px;
+}
+.rule-param-edit .element {
+  display: inline;
+}
+.rule-param-edit .element .addafter {
+  padding-left: 5px;
+}
+[class^="rule-param-"] img,
+.rule-chooser-trigger img {
+  vertical-align: middle;
+}
+.rule-chooser {
+  border: solid 1px #CCC;
+  margin: 20px;
+  padding: 15px 10px 5px;
+}
+.rule-param-wait {
+  background: url(../mui/images/ajax-loader-small.gif) no-repeat left center;
+  padding-left: 20px;
+}
+/*
+
+    URL Rewrite
+-------------------------------------- */
+.field-url-rewrite-option-select {
+  padding-top: 13px;
+}
+/* jstree */
+.jstree-default .disabled > a {
+  color: #a29c94;
+}
+/*  File brouser */
diff --git a/app/design/adminhtml/magento_backend/css/styles-ie8.css b/app/design/adminhtml/magento_backend/css/styles-ie8.css
new file mode 100644
index 0000000000000000000000000000000000000000..12df12f742abe93b23129e6f4e05299cddc0cfef
--- /dev/null
+++ b/app/design/adminhtml/magento_backend/css/styles-ie8.css
@@ -0,0 +1,300 @@
+/**
+ * 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)
+ */
+.eq-ie8 .customer-current-activity .action-refresh,
+.eq-ie8 .pager .action-next,
+.eq-ie8 .pager .action-previous,
+.eq-ie8 .pager .action-next:hover,
+.eq-ie8 .pager .action-previous:hover,
+.eq-ie8 .pager .action-next.disabled:focus,
+.eq-ie8 .pager .action-previous.disabled:focus,
+.eq-ie8 .pager .action-next.disabled:active,
+.eq-ie8 .pager .action-previous.disabled:active,
+.eq-ie8 .data-table .action-.delete,
+.eq-ie8 .data-table .action-.delete:hover,
+.eq-ie8 .data-table .action-.delete:active,
+.eq-ie8 .data-table .action-.delete.active,
+.eq-ie8 .data-table .action-delete,
+.eq-ie8 .data-table .action-delete:hover,
+.eq-ie8 .data-table .action-delete:active,
+.eq-ie8 .data-table .action-delete.active,
+.eq-ie8 .data-table .action-locked,
+.eq-ie8 .data-table .action-locked:hover,
+.eq-ie8 .data-table .action-locked:active,
+.eq-ie8 .data-table .action-locked.active,
+.eq-ie8 #product-variations-matrix .action-choose,
+.eq-ie8 #product-variations-matrix .action-choose:hover,
+.eq-ie8 #product-variations-matrix .action-choose:active,
+.eq-ie8 #product-variations-matrix .action-choose.active,
+.eq-ie8 .image-panel .action-close,
+.eq-ie8 .eq-ie8 .image-panel .action-close:hover,
+.eq-ie8 .image-panel .action-close:active,
+.eq-ie8 .image-panel .action-close.active,
+.eq-ie8 .image-panel-controls .action-remove,
+.eq-ie8 .image-panel-controls .action-remove:hover,
+.eq-ie8 .image-panel-controls .action-remove:active,
+.eq-ie8 .image-panel-controls .action-remove.active,
+.eq-ie8 .suggest-expandable .action-show-all,
+.eq-ie8 .suggest-expandable .action-show-all:hover,
+.eq-ie8 .suggest-expandable .action-show-all:active,
+.eq-ie8 .suggest-expandable .action-show-all.active,
+.eq-ie8 .vde-tools-header .action-close,
+.eq-ie8 .vde-tools-header .action-close:hover,
+.eq-ie8 .vde-tools-header .action-close:active,
+.eq-ie8 .vde-tools-header .action-close.active,
+.eq-ie8 .image .action-delete,
+.eq-ie8 .image .action-delete:hover,
+.eq-ie8 .image .action-delete:active,
+.eq-ie8 .image .action-delete.active,
+.eq-ie8 .fieldset-wrapper-title .actions .action-delete,
+.eq-ie8 .fieldset-wrapper-title .actions .action-delete:hover,
+.eq-ie8 .fieldset-wrapper-title .actions .action-delete:active,
+.eq-ie8 .fieldset-wrapper-title .actions .action-delete.active,
+.eq-ie8 .address-list-item-actions .action-delete,
+.eq-ie8 .address-list-item-actions .action-delete:hover,
+.eq-ie8 .address-list-item-actions .action-delete:active,
+.eq-ie8 .address-list-item-actions .action-delete.active,
+.eq-ie8 .notification .action-close,
+.eq-ie8 .notification .action-close:hover,
+.eq-ie8 .notification .action-close:active,
+.eq-ie8 .notification .action-close.active,
+.eq-ie8 .page-login .action-forgotpassword,
+.eq-ie8 .page-login .action-forgotpassword:hover,
+.eq-ie8 .page-login .action-forgotpassword:active,
+.eq-ie8 .page-login .action-forgotpassword.active,
+.eq-ie8 .page-login .action-back,
+.eq-ie8 .page-login .action-back:hover,
+.eq-ie8 .page-login .action-back:active,
+.eq-ie8 .page-login .action-back.active {
+  border: none;
+  border-radius: 0;
+  background: none;
+  margin: 0;
+  padding: 0;
+  box-shadow: none;
+  text-shadow: none;
+  filter: none;
+}
+.eq-ie8 .actions-image-uploader .action-upload {
+  filter: none;
+}
+.eq-ie8 select[disabled="disabled"][multiple="multiple"] option[selected="selected"] {
+  background-color: #ddd;
+}
+.eq-ie8 .fieldset {
+  border-width: 0 0 1px;
+}
+.eq-ie8 .fieldset .fieldset-wrapper .fieldset-wrapper-title,
+.eq-ie8 .fieldset-wrapper .fieldset-wrapper .fieldset-wrapper-title {
+  background: #f4f2ef;
+}
+.eq-ie8 .fieldset-alt,
+.eq-ie8 .fieldset-alt > .fieldset {
+  display: block;
+  width: 100%;
+}
+.eq-ie8 .fieldset-alt > .field {
+  display: inline-block;
+}
+.eq-ie8 .field.type-price .addon .addafter,
+.eq-ie8 .field-price .addon .addafter,
+.eq-ie8 .field-special_price .addon .addafter,
+.eq-ie8 .field-msrp .addon .addafter {
+  border-width: 1px 1px 1px 0;
+}
+.eq-ie8 .field-apply_to .multiselect {
+  height: 120px;
+}
+.eq-ie8 .popup-loading {
+  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";
+}
+.eq-ie8 .loading-old,
+.eq-ie8 .loading-mask {
+  background: #fff;
+  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";
+}
+.eq-ie8 .navigation {
+  background: #726c62;
+}
+.eq-ie8 .navigation:before {
+  border-top: 1px solid #46433d;
+}
+.eq-ie8 .navigation .level-0.active > a {
+  background: #625d54;
+}
+.eq-ie8 .navigation .level-0.active > a,
+.eq-ie8 .navigation .level-0:hover > a,
+.eq-ie8 .navigation .level-0.hover > a {
+  border-top: 1px solid #46433d;
+  padding-top: 36px;
+}
+.eq-ie8 .navigation .level-0 > .submenu .column {
+  float: left;
+}
+.eq-ie8 .navigation .level-0.item-system > a,
+.eq-ie8 .navigation .level-0.item-system:hover > a,
+.eq-ie8 .navigation .level-0.item-system.hover > a,
+.eq-ie8 .navigation .level-0.item-stores > a,
+.eq-ie8 .navigation .level-0.item-stores:hover > a,
+.eq-ie8 .navigation .level-0.item-stores.hover > a {
+  border-top: 0;
+  padding-top: 0;
+}
+.eq-ie8 .navigation .level-0.item-system > a:before,
+.eq-ie8 .navigation .level-0.item-system > a:after,
+.eq-ie8 .navigation .level-0.item-stores > a:before,
+.eq-ie8 .navigation .level-0.item-stores > a:after {
+  display: none;
+}
+.eq-ie8 .page-login .field-username label,
+.eq-ie8 .page-login .field-password label,
+.eq-ie8 .page-login .field-confirmation label {
+  display: block;
+}
+.eq-ie8 .message-noscript,
+.eq-ie8 .message-demo-mode {
+  border-bottom: 1px solid #46433d;
+}
+.eq-ie8 .store-switcher-alt .store-selected:after {
+  vertical-align: middle;
+}
+.eq-ie8 .store-switcher-website {
+  border-bottom: 0;
+}
+.eq-ie8 .store-switcher-store-view {
+  border-bottom: 0;
+  border-top: 1px solid #e5e5e5;
+}
+.eq-ie8 .switcher-label:after {
+  content: 'off';
+  overflow: hidden;
+  white-space: nowrap;
+  text-indent: 100%;
+}
+.eq-ie8 .switcher.checked .switcher-label:after {
+  background-position: -34px 0;
+  content: 'on';
+}
+.eq-ie8 .switcher.checked .switcher-label:before {
+  content: attr(data-text-on);
+}
+.eq-ie8 .grid table td.empty-text {
+  border-width: 0 1px 1px;
+}
+.eq-ie8 .grid table tr td.empty-text {
+  border-width: 0 1px 1px;
+}
+.eq-ie8 .grid .filter .date img {
+  filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0);
+}
+.eq-ie8 .massaction .entry-edit .field-row:first-child {
+  margin-right: 1px;
+}
+.eq-ie8 .massaction .entry-edit .field-row {
+  display: inline;
+}
+.eq-ie8 .data-table td,
+.eq-ie8 .data-table tbody tr td {
+  border-width: 0 0 1px;
+}
+.eq-ie8 .data-table td > .field {
+  margin-bottom: 0;
+}
+.eq-ie8 .data-table tfoot tr td {
+  border: none;
+}
+.eq-ie8 .customer-information .data-table tbody tr td,
+.eq-ie8 .customer-information .data-table tbody tr th,
+.eq-ie8 .order-information .data-table tbody tr td,
+.eq-ie8 .order-information .data-table tbody tr th,
+.eq-ie8 .order-account-information .data-table tbody tr td,
+.eq-ie8 .order-account-information .data-table tbody tr th,
+.eq-ie8 [class^=" adminhtml-rma-"] .data-table tbody tr td,
+.eq-ie8 [class^=" adminhtml-rma-"] .data-table tbody tr th,
+.eq-ie8 [class^=" sales-transactions-"] .data-table tbody tr th,
+.eq-ie8 [class^=" sales-transactions-"] .data-table tbody tr td,
+.eq-ie8 [class^=" sales-"] .order-payment-method .data-table tbody tr th,
+.eq-ie8 [class^=" sales-"] .order-payment-method .data-table tbody tr td,
+.eq-ie8 [class^=" sales-billing-agreement-"] .log-details .data-table tbody tr th,
+.eq-ie8 [class^=" sales-billing-agreement-"] .log-details .data-table tbody tr td {
+  border-bottom: 1px solid #ededed;
+}
+.eq-ie8 .widget-layout-updates .data-table {
+  table-layout: auto;
+}
+.eq-ie8 .massaction {
+  border-bottom: 2px solid #504d46;
+}
+.eq-ie8 .header {
+  background: #f5f2ea;
+}
+.eq-ie8 .header-panel .dropdown-menu {
+  border: 1px solid #c3bcaf;
+}
+.eq-ie8 .header-panel .notifications-icon:before {
+  bottom: -6px;
+}
+.eq-ie8 .header-panel .notifications > .dropdown-menu > li:hover {
+  margin-top: 0;
+  padding-top: 13px;
+}
+.eq-ie8 .header-panel .dropdown-menu > li:hover:after {
+  display: block;
+}
+.eq-ie8 .header-panel .notifications > .dropdown-menu .action-close {
+  filter: none;
+}
+.eq-ie8 .header .header-panel .notifications .action-more {
+  filter: none;
+}
+.eq-ie8 .header .header-panel .notifications .action-more {
+  margin-bottom: -1px;
+}
+.eq-ie8 .autocomplete-results {
+  margin-top: -10px;
+}
+.eq-ie8 .search button[type="submit"]:before {
+  line-height: 1.3;
+}
+.eq-ie8 [class^=" catalog-product-"] .page-actions .action-back,
+.eq-ie8 [class^=" catalog-product-"] .page-actions .action-back:hover,
+.eq-ie8 [class^=" catalog-product-"] .page-actions .action-back:active,
+.eq-ie8 [class^=" newsletter-"] .page-actions .action-back,
+.eq-ie8 [class^=" newsletter-"] .page-actions .action-back:hover,
+.eq-ie8 [class^=" newsletter-"] .page-actions .action-back:active {
+  filter: none;
+  border: 0;
+}
+.eq-ie8 .sales-order-index .col-1-layout table.data {
+  table-layout: auto;
+  word-wrap: normal;
+}
+.eq-ie8 .accordion .config legend {
+  position: absolute;
+  left: -999em;
+  display: block;
+  width: 0;
+  height: 0;
+  padding: 0;
+  margin: 0;
+  overflow: hidden;
+}
diff --git a/app/design/adminhtml/magento_backend/css/styles.css b/app/design/adminhtml/magento_backend/css/styles.css
index 6c1cab91a97a8840f159beacd2de6253a3e027c2..3387b22a778b4450be0ff515708463636a5ffb44 100644
--- a/app/design/adminhtml/magento_backend/css/styles.css
+++ b/app/design/adminhtml/magento_backend/css/styles.css
@@ -9273,7 +9273,7 @@ tr.row-totals:nth-child(odd) + tr.summary-details ~ tr.summary-total:not(.show-d
   padding: 0;
 }
 .overlay {
-  background: rgba(0, 0, 0, 0.3);
+  background: rgba(255, 255, 255, 0.5);
   border-radius: 5px;
   position: absolute;
   top: 0;
@@ -9285,10 +9285,11 @@ tr.row-totals:nth-child(odd) + tr.summary-details ~ tr.summary-total:not(.show-d
   color: #111;
   font-weight: bold;
   position: absolute;
-  top: 50%;
-  left: 50%;
-  margin: -25px 0 0 -100px;
-  width: 200px;
+  top: 56px;
+  left: 0;
+  margin: 0 8px;
+  padding: 10px;
+  background: #ffffff;
 }
 /*
     Order view
@@ -10583,17 +10584,17 @@ ul.messages li.success-msg li:before {
   margin-top: 6px;
 }
 .accordion .config .value.with-tooltip .tooltip-content {
-  padding: 15px;
+  padding: 18px;
+  margin: 0 -17px 10px 0;
   right: 0;
-  margin-left: 0;
-  margin-right: -19px;
-  margin-bottom: 10px;
-  left: auto;
-  top: auto;
   bottom: 100%;
-  width: 400px;
-  max-width: 400px;
-  line-height: 1.333;
+  width: 239px;
+  max-width: 239px;
+  font-size: 13px;
+  line-height: 1.4;
+  background: #31302b;
+  background: rgba(49, 48, 43, 0.8);
+  border-radius: 5px;
 }
 .accordion .config .value.with-tooltip .tooltip-content:before {
   content: '';
@@ -10606,7 +10607,7 @@ ul.messages li.success-msg li:before {
   right: 20px;
   border-left: 5px solid transparent;
   border-right: 5px solid transparent;
-  border-top: 5px solid #000;
+  border-top: 5px solid #31302b;
   border-bottom: 0;
   opacity: .8;
 }
diff --git a/app/design/adminhtml/magento_backend/less/lib/buttons.less b/app/design/adminhtml/magento_backend/less/lib/buttons.less
index d6d4958cca97c42715b01df61ae1a1eca126b989..d8ddfec8ae45505ea14562c20f806f4903839fef 100644
--- a/app/design/adminhtml/magento_backend/less/lib/buttons.less
+++ b/app/design/adminhtml/magento_backend/less/lib/buttons.less
@@ -43,6 +43,7 @@
     &:hover,
     &:focus,
     &:active {
+        text-decoration: none;
         background: @defaultButton4;
         color: @defaultButton3;
     }
diff --git a/app/design/adminhtml/magento_backend/less/styles/admin.less b/app/design/adminhtml/magento_backend/less/styles/admin.less
index 8a9e235e1fd42cca576af275accaf0e5344ed0e0..faa49622af006fc6cd5e4732a13d73c2c249f2d6 100644
--- a/app/design/adminhtml/magento_backend/less/styles/admin.less
+++ b/app/design/adminhtml/magento_backend/less/styles/admin.less
@@ -1,5 +1,5 @@
-// /**
-//  * Magento
+/**
+  * Magento
  *
  * NOTICE OF LICENSE
  *
@@ -16,10 +16,14 @@
  * Do not edit or add to this file if you wish to upgrade Magento to newer
  * versions in the future. If you wish to customize Magento for your
  * needs please refer 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)
-//  */
+  *
+  * @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)
+  */
+
+@import "vars.less";
+@import "base.less";
+@import "../lib/buttons.less";
 
 .dont-use-this-class-big-size {
     font-size: 18px;
@@ -133,81 +137,6 @@
     margin: 0 15px;
 }
 
-.eq-ie8 .customer-current-activity .action-refresh,
-.eq-ie8 .pager .action-next,
-.eq-ie8 .pager .action-previous,
-.eq-ie8 .pager .action-next:hover,
-.eq-ie8 .pager .action-previous:hover,
-.eq-ie8 .pager .action-next.disabled:focus,
-.eq-ie8 .pager .action-previous.disabled:focus,
-.eq-ie8 .pager .action-next.disabled:active,
-.eq-ie8 .pager .action-previous.disabled:active,
-.eq-ie8 .data-table .action-.delete,
-.eq-ie8 .data-table .action-.delete:hover,
-.eq-ie8 .data-table .action-.delete:active,
-.eq-ie8 .data-table .action-.delete.active,
-.eq-ie8 .data-table .action-delete,
-.eq-ie8 .data-table .action-delete:hover,
-.eq-ie8 .data-table .action-delete:active,
-.eq-ie8 .data-table .action-delete.active,
-.eq-ie8 .data-table .action-locked,
-.eq-ie8 .data-table .action-locked:hover,
-.eq-ie8 .data-table .action-locked:active,
-.eq-ie8 .data-table .action-locked.active,
-.eq-ie8 #product-variations-matrix .action-choose,
-.eq-ie8 #product-variations-matrix .action-choose:hover,
-.eq-ie8 #product-variations-matrix .action-choose:active,
-.eq-ie8 #product-variations-matrix .action-choose.active,
-.eq-ie8 .image-panel .action-close,
-.eq-ie8 .eq-ie8 .image-panel .action-close:hover,
-.eq-ie8 .image-panel .action-close:active,
-.eq-ie8 .image-panel .action-close.active,
-.eq-ie8 .image-panel-controls .action-remove,
-.eq-ie8 .image-panel-controls .action-remove:hover,
-.eq-ie8 .image-panel-controls .action-remove:active,
-.eq-ie8 .image-panel-controls .action-remove.active,
-.eq-ie8 .suggest-expandable .action-show-all,
-.eq-ie8 .suggest-expandable .action-show-all:hover,
-.eq-ie8 .suggest-expandable .action-show-all:active,
-.eq-ie8 .suggest-expandable .action-show-all.active,
-.eq-ie8 .vde-tools-header .action-close,
-.eq-ie8 .vde-tools-header .action-close:hover,
-.eq-ie8 .vde-tools-header .action-close:active,
-.eq-ie8 .vde-tools-header .action-close.active,
-.eq-ie8 .image .action-delete,
-.eq-ie8 .image .action-delete:hover,
-.eq-ie8 .image .action-delete:active,
-.eq-ie8 .image .action-delete.active,
-.eq-ie8 .fieldset-wrapper-title .actions .action-delete,
-.eq-ie8 .fieldset-wrapper-title .actions .action-delete:hover,
-.eq-ie8 .fieldset-wrapper-title .actions .action-delete:active,
-.eq-ie8 .fieldset-wrapper-title .actions .action-delete.active,
-.eq-ie8 .address-list-item-actions .action-delete,
-.eq-ie8 .address-list-item-actions .action-delete:hover,
-.eq-ie8 .address-list-item-actions .action-delete:active,
-.eq-ie8 .address-list-item-actions .action-delete.active,
-.eq-ie8 .notification .action-close,
-.eq-ie8 .notification .action-close:hover,
-.eq-ie8 .notification .action-close:active,
-.eq-ie8 .notification .action-close.active,
-.eq-ie8 .page-login .action-forgotpassword,
-.eq-ie8 .page-login .action-forgotpassword:hover,
-.eq-ie8 .page-login .action-forgotpassword:active,
-.eq-ie8 .page-login .action-forgotpassword.active,
-.eq-ie8 .page-login .action-back,
-.eq-ie8 .page-login .action-back:hover,
-.eq-ie8 .page-login .action-back:active,
-.eq-ie8 .page-login .action-back.active {
-    border: none;
-    border-radius: 0;
-    background: none;
-    margin: 0;
-    padding: 0;
-    box-shadow: none;
-    text-shadow: none;
-    filter: none;
-}
-
 .data-table .action-.delete[disabled],
 .data-table .action-delete[disabled],
 .data-table .action-locked[disabled],
@@ -779,10 +708,6 @@
     height: 31px;
 }
 
-.eq-ie8 .actions-image-uploader .action-upload {
-    filter: none;
-}
-
 .actions-image-uploader .action-toggle,
 .actions-image-uploader .action-toggle:hover,
 .actions-image-uploader .action-toggle:active,
@@ -1033,10 +958,6 @@ select[disabled].multiselect > option[selected] {
     background: #6d6d6d;
 }
 
-.eq-ie8 select[disabled="disabled"][multiple="multiple"] option[selected="selected"] {
-    background-color: #ddd;
-}
-
 textarea:-moz-placeholder,
 input:-moz-placeholder {
     color: #999 !important;
@@ -1208,10 +1129,6 @@ input.mage-error ~ .addafter {
     position: relative;
 }
 
-.eq-ie8 .fieldset {
-    border-width: 0 0 1px;
-}
-
 .fieldset-wrapper > .fieldset-wrapper-title,
 .fieldset > .legend {
     position: static;
@@ -1304,11 +1221,6 @@ input.mage-error ~ .addafter {
     border-radius: 5px;
 }
 
-.eq-ie8 .fieldset .fieldset-wrapper .fieldset-wrapper-title,
-.eq-ie8 .fieldset-wrapper .fieldset-wrapper .fieldset-wrapper-title {
-    background: #f4f2ef;
-}
-
 .fieldset .fieldset-wrapper.opened .fieldset-wrapper-title,
 .fieldset-wrapper .fieldset-wrapper.opened .fieldset-wrapper-title {
     border-radius: 5px 5px 0 0;
@@ -1396,16 +1308,6 @@ input.mage-error ~ .addafter {
     margin: 0 0 29px;
 }
 
-.eq-ie8 .fieldset-alt,
-.eq-ie8 .fieldset-alt > .fieldset {
-    display: block;
-    width: 100%;
-}
-
-.eq-ie8 .fieldset-alt > .field {
-    display: inline-block;
-}
-
 .fieldset .comment {
     margin: 0 0 29px 10px;
 }
@@ -1712,13 +1614,6 @@ input.mage-error ~ .addafter {
     border-radius: 0 4px 4px 0;
 }
 
-.eq-ie8 .field.type-price .addon .addafter,
-.eq-ie8 .field-price .addon .addafter,
-.eq-ie8 .field-special_price .addon .addafter,
-.eq-ie8 .field-msrp .addon .addafter {
-    border-width: 1px 1px 1px 0;
-}
-
 .field.type-price input,
 .field-price input,
 .field-special_price input,
@@ -1749,10 +1644,6 @@ input.mage-error ~ .addafter {
     margin-right: -2px;
 }
 
-.eq-ie8 .field-apply_to .multiselect {
-    height: 120px;
-}
-
 /*
     Calendar
 -------------------------------------- */
@@ -2153,10 +2044,6 @@ table tbody tr:nth-child(odd):hover th {
     z-index: 2;
 }
 
-.eq-ie8 .popup-loading {
-    -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";
-}
-
 /* Loading mask */
 .loading-old,
 .loading-mask {
@@ -2201,18 +2088,6 @@ table tbody tr:nth-child(odd):hover th {
     margin-top: 118px;
 }
 
-.eq-ie8 .loading-old,
-.eq-ie8 .loading-mask {
-    background: #fff;
-    -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";
-}
-
-/* Backup popup */
-/* TODO: remove after backups page js refactoring */
-.backup-dialog {
-    margin-top: inherit !important;
-}
-
 /* Backup popup */
 /* TODO: remove after backups page js refactoring */
 .backup-dialog {
@@ -2237,14 +2112,6 @@ table tbody tr:nth-child(odd):hover th {
     padding: 0 20px;
 }
 
-.navigation:hover .level-0 > a {
-    /*background: red !important;*/
-}
-
-.eq-ie8 .navigation {
-    background: #726c62;
-}
-
 .navigation:before {
     position: absolute;
     left: 0;
@@ -2256,10 +2123,6 @@ table tbody tr:nth-child(odd):hover th {
     z-index: 991;
 }
 
-.eq-ie8 .navigation:before {
-    border-top: 1px solid #46433d;
-}
-
 .navigation:after {
     position: absolute;
     left: 0;
@@ -2351,12 +2214,7 @@ table tbody tr:nth-child(odd):hover th {
     background: linear-gradient(to bottom, #625d54 1%, #565249 100%);
 }
 
-.eq-ie8 .navigation .level-0.active > a {
-    background: #625d54;
-}
-
-/*.navigation .level-0:hover > a,
-.eq-ie8 .navigation .level-0:hover > a,*/
+//.navigation .level-0:hover > a,
 .navigation .level-0.hover.recent > a {
     background: #fff;
     .style15I();
@@ -2383,13 +2241,6 @@ table tbody tr:nth-child(odd):hover th {
     display: block;
 }
 
-.eq-ie8 .navigation .level-0.active > a,
-.eq-ie8 .navigation .level-0:hover > a,
-.eq-ie8 .navigation .level-0.hover > a {
-    border-top: 1px solid #46433d;
-    padding-top: 36px;
-}
-
 .navigation .level-0 > a:before {
     position: absolute;
     left: 0;
@@ -2481,10 +2332,6 @@ table tbody tr:nth-child(odd):hover th {
     vertical-align: top;
 }
 
-.eq-ie8 .navigation .level-0 > .submenu .column {
-    float: left;
-}
-
 .navigation .level-0 .submenu .level-1 {
     white-space: normal;
 }
@@ -2543,16 +2390,6 @@ table tbody tr:nth-child(odd):hover th {
     padding: 0;
 }
 
-.eq-ie8 .navigation .level-0.item-system > a,
-.eq-ie8 .navigation .level-0.item-system:hover > a,
-.eq-ie8 .navigation .level-0.item-system.hover > a,
-.eq-ie8 .navigation .level-0.item-stores > a,
-.eq-ie8 .navigation .level-0.item-stores:hover > a,
-.eq-ie8 .navigation .level-0.item-stores.hover > a {
-    border-top: 0;
-    padding-top: 0;
-}
-
 .navigation .level-0.item-system:hover > a,
 .navigation .level-0.item-system.hover > a,
 .navigation .level-0.item-stores:hover > a,
@@ -2608,11 +2445,7 @@ table tbody tr:nth-child(odd):hover th {
 }
 
 .no-js .navigation .level-0.last:hover > a:before,
-.navigation .level-0.last.hover > a:before,
-.eq-ie8 .navigation .level-0.item-system > a:before,
-.eq-ie8 .navigation .level-0.item-system > a:after,
-.eq-ie8 .navigation .level-0.item-stores > a:before,
-.eq-ie8 .navigation .level-0.item-stores > a:after {
+.navigation .level-0.last.hover > a:before {
     display: none;
 }
 
@@ -2805,12 +2638,6 @@ table tbody tr:nth-child(odd):hover th {
     display: none;
 }
 
-.eq-ie8 .page-login .field-username label,
-.eq-ie8 .page-login .field-password label,
-.eq-ie8 .page-login .field-confirmation label {
-    display: block;
-}
-
 .page-login .form-inline .label + .control {
     width: auto;
     float: none;
@@ -2832,55 +2659,56 @@ table tbody tr:nth-child(odd):hover th {
     background: url(Magento_Backend::images/logo-magento.png) no-repeat;
 }
 
-/*
-.page-login .logo {
-    display: block;
-    width: 100px;
-    height: 65px;
-    margin: 0;
-    text-indent: -999em;
-    position: relative;
-    z-index: 1;
-}
-
-.page-login .logo:before,
-.page-login .logo:after {
-    font-family: 'admin-icons';
-    font-size: 65px;
-    content: '\e00d';
-    position: absolute;
-    bottom: 0;
-    left: 0;
-    text-indent: 0;
-    line-height: 1;
-    font-weight: normal;
-}
-
-.page-login .logo:before {
-    content: '\e00d';
-    color: #f37b20;
-}
-
-.page-login .logo:after {
-    content: '\e00e';
-    color: #fab57f;
-}
-
-.page-login .logo span:before {
-    font-family: 'admin-icons';
-    content: '\e00f';
-    display: block;
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    left: 70px;
-    font-size: 154px;
-    margin-top: -42px;
-    text-indent: 0;
-    line-height: 1;
-    font-weight: normal;
-    color: #000;
-}*/
+///*
+//.page-login .logo {
+//    display: block;
+//    width: 100px;
+//    height: 65px;
+//    margin: 0;
+//    text-indent: -999em;
+//    position: relative;
+//    z-index: 1;
+//}
+//
+//.page-login .logo:before,
+//.page-login .logo:after {
+//    font-family: 'admin-icons';
+//    font-size: 65px;
+//    content: '\e00d';
+//    position: absolute;
+//    bottom: 0;
+//    left: 0;
+//    text-indent: 0;
+//    line-height: 1;
+//    font-weight: normal;
+//}
+//
+//.page-login .logo:before {
+//    content: '\e00d';
+//    color: #f37b20;
+//}
+//
+//.page-login .logo:after {
+//    content: '\e00e';
+//    color: #fab57f;
+//}
+//
+//.page-login .logo span:before {
+//    font-family: 'admin-icons';
+//    content: '\e00f';
+//    display: block;
+//    position: absolute;
+//    top: 0;
+//    bottom: 0;
+//    left: 70px;
+//    font-size: 154px;
+//    margin-top: -42px;
+//    text-indent: 0;
+//    line-height: 1;
+//    font-weight: normal;
+//    color: #000;
+//}
+//*/
 
 .page-login .form-actions {
     padding: 0;
@@ -3068,10 +2896,6 @@ table tbody tr:nth-child(odd):hover th {
     z-index: 994;
 }
 
-.eq-ie8 .message-noscript {
-    border-bottom: 1px solid #46433d;
-}
-
 .message-noscript .message-content {
     margin: 0 auto;
     max-width: 1300px;
@@ -3113,10 +2937,6 @@ table tbody tr:nth-child(odd):hover th {
     z-index: 993;
 }
 
-.eq-ie8 .message-demo-mode {
-    border-bottom: 1px solid #46433d;
-}
-
 .message-demo-mode:before {
     content: '';
 }
@@ -3232,14 +3052,9 @@ table tbody tr:nth-child(odd):hover th {
     vertical-align: text-top;
 }
 
-.eq-ie8 .store-switcher-alt .store-selected:after {
-    vertical-align: middle;
-}
-
 .store-switcher-alt .store-switcher-website,
 .store-switcher-alt .store-switcher-store {
     padding: 0;
-
 }
 
 .store-switcher-alt .store-switcher-website:hover,
@@ -3275,15 +3090,6 @@ table tbody tr:nth-child(odd):hover th {
     border-top: 1px solid #e5e5e5;
 }
 
-.eq-ie8 .store-switcher-website {
-    border-bottom: 0;
-}
-
-.eq-ie8 .store-switcher-store-view {
-    border-bottom: 0;
-    border-top: 1px solid #e5e5e5;
-}
-
 .store-switcher-store-view > a {
     display: block;
     padding: 5px 15px 5px 24px;
@@ -3492,7 +3298,7 @@ table tbody tr:nth-child(odd):hover th {
 /*
     Universal Sidebar Tabs
 -------------------------------------- */
-/* TODO: for "Product" page only while refactoring */
+// TODO: for "Product" page only while refactoring */
 
 .side-col .ui-tabs .ui-accordion-header {
     position: relative;
@@ -3821,22 +3627,6 @@ table tbody tr:nth-child(odd):hover th {
     content: attr(data-text-on);
 }
 
-.eq-ie8 .switcher-label:after {
-    content: 'off';
-    overflow: hidden;
-    white-space: nowrap;
-    text-indent: 100%;
-}
-
-.eq-ie8 .switcher.checked .switcher-label:after {
-    background-position: -34px 0;
-    content: 'on';
-}
-
-.eq-ie8 .switcher.checked .switcher-label:before {
-    content: attr(data-text-on);
-}
-
 /*
     Content actions panel (with buttons, switchers...)
 -------------------------------------- */
@@ -4004,19 +3794,10 @@ table tbody tr:nth-child(odd):hover th {
     text-align: center;
     padding: 15px;
 }
-
-.eq-ie8 .grid table td.empty-text {
-    border-width: 0 1px 1px;
-}
-
 .grid table tr:last-child td.empty-text {
     border-width: 0 1px 1px;
 }
 
-.eq-ie8 .grid table tr td.empty-text {
-    border-width: 0 1px 1px;
-}
-
 .grid table td.empty-text:hover {
     background: #e6e3de;
 }
@@ -4381,10 +4162,6 @@ table tbody tr:nth-child(odd):hover th {
     opacity: 0;
 }
 
-.eq-ie8 .grid .filter .date img {
-    filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0);
-}
-
 .grid .filter .date:before {
     position: absolute;
     left: 80%;
@@ -4418,10 +4195,6 @@ table tbody tr:nth-child(odd):hover th {
     overflow: hidden;
 }
 
-.eq-ie8 .massaction {
-    border-bottom: 2px solid #504d46;
-}
-
 .massaction ul {
     list-style: none;
     margin: 0;
@@ -4470,14 +4243,6 @@ table tbody tr:nth-child(odd):hover th {
     vertical-align: middle;
 }
 
-.eq-ie8 .massaction .entry-edit .field-row:first-child {
-    margin-right: 1px;
-}
-
-.eq-ie8 .massaction .entry-edit .field-row {
-    display: inline;
-}
-
 .massaction .entry-edit .outer-span .entry-edit {
     float: none;
 }
@@ -4610,48 +4375,48 @@ tr.dynamic-grid input.input-text {
     white-space: normal;
 }
 
-/* will be deleted after checking entire back-end
-table .col-draggable {
-    width: 1%;
-}
-
-table .col-default,
-table .col-select,
-table .col-qty,
-table .col-actions,
-table .col-action,
-table .col-id,
-table .col-uqty.qty-box {
-    width: 5%;
-}
-
-table .col-visibility,
-table .col-status,
-table .col-websites,
-table .col-position {
-    width: 7%;
-}
-
-table .col-type,
-table .col-price,
-table .col-attr-name {
-    width: 8%;
-}
-
-table .col-name,
-table .col-sku {
-    width: 15%;
-}
-
-table .col-attribute_code,
-table .col-frontend_label {
-    width: 25%;
-}
-
-.ui-dialog .selection-search table .col-select {
-    width: 25%;
-}
-*/
+///* will be deleted after checking entire back-end
+//table .col-draggable {
+//    width: 1%;
+//}
+//
+//table .col-default,
+//table .col-select,
+//table .col-qty,
+//table .col-actions,
+//table .col-action,
+//table .col-id,
+//table .col-uqty.qty-box {
+//    width: 5%;
+//}
+//
+//table .col-visibility,
+//table .col-status,
+//table .col-websites,
+//table .col-position {
+//    width: 7%;
+//}
+//
+//table .col-type,
+//table .col-price,
+//table .col-attr-name {
+//    width: 8%;
+//}
+//
+//table .col-name,
+//table .col-sku {
+//    width: 15%;
+//}
+//
+//table .col-attribute_code,
+//table .col-frontend_label {
+//    width: 25%;
+//}
+//
+//.ui-dialog .selection-search table .col-select {
+//    width: 25%;
+//}
+//*/
 
 table .col-draggable .draggable-handle {
     position: relative;
@@ -4697,15 +4462,6 @@ table .col-draggable .draggable-handle {
     border-width: 0 0 1px;
 }
 
-.eq-ie8 .data-table td,
-.eq-ie8 .data-table tbody tr td {
-    border-width: 0 0 1px;
-}
-
-.eq-ie8 .data-table td > .field {
-    margin-bottom: 0;
-}
-
 .data-table tbody tr.selected td,
 .data-table tbody tr.selected th,
 .data-table tbody tr:hover td,
@@ -4729,10 +4485,6 @@ table .col-draggable .draggable-handle {
     border: 0;
 }
 
-.eq-ie8 .data-table tfoot tr td {
-    border: none;
-}
-
 .data-table input[type="text"] {
     width: 98%;
     padding-left: 1%;
@@ -4866,23 +4618,6 @@ table .col-draggable .draggable-handle {
     background-color: #fbfaf6;
 }
 
-.eq-ie8 .customer-information .data-table tbody tr td,
-.eq-ie8 .customer-information .data-table tbody tr th,
-.eq-ie8 .order-information .data-table tbody tr td,
-.eq-ie8 .order-information .data-table tbody tr th,
-.eq-ie8 .order-account-information .data-table tbody tr td,
-.eq-ie8 .order-account-information .data-table tbody tr th,
-.eq-ie8 [class^=" adminhtml-rma-"] .data-table tbody tr td,
-.eq-ie8 [class^=" adminhtml-rma-"] .data-table tbody tr th,
-.eq-ie8 [class^=" sales-transactions-"] .data-table tbody tr th,
-.eq-ie8 [class^=" sales-transactions-"] .data-table tbody tr td,
-.eq-ie8 [class^=" sales-"] .order-payment-method .data-table tbody tr th,
-.eq-ie8 [class^=" sales-"] .order-payment-method .data-table tbody tr td,
-.eq-ie8 [class^=" sales-billing-agreement-"] .log-details .data-table tbody tr th,
-.eq-ie8 [class^=" sales-billing-agreement-"] .log-details .data-table tbody tr td {
-    border-bottom: 1px solid #ededed;
-}
-
 /*
     Content alignments in tables
 -------------------------------------- */
@@ -5203,10 +4938,6 @@ table .col-draggable .draggable-handle {
     table-layout: fixed;
 }
 
-.eq-ie8 .widget-layout-updates .data-table {
-    table-layout: auto;
-}
-
 .widget-layout-updates .data-table,
 .widget-layout-updates .data-table tr:nth-child(odd) td,
 .widget-layout-updates .data-table tr:nth-child(odd):hover td {
diff --git a/app/design/adminhtml/magento_backend/less/styles/base.less b/app/design/adminhtml/magento_backend/less/styles/base.less
index 8d3b401d83d648a39407ad5ecb53943f3fa62dce..a46576eb670fc0133506261cc95cfca684af186a 100644
--- a/app/design/adminhtml/magento_backend/less/styles/base.less
+++ b/app/design/adminhtml/magento_backend/less/styles/base.less
@@ -21,253 +21,6 @@
 // * @license    http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 // */
 
-.actionLink() {
-    display: inline;
-    color: @linkColor;
-    text-decoration: none;
-    &:visited,
-    &:active {
-        color: @linkColor;
-    }
-    &:focus,
-    &:hover {
-        color: @linkColor;
-        text-decoration: underline;
-    }
-}
-
-.actionLinkI() {
-    display: inline;
-    color: @linkColor2;
-    text-decoration: underline;
-    &:visited,
-    &:active {
-        color: @linkColor2;
-    }
-    &:focus,
-    &:hover {
-        color: @linkColor2;
-        text-decoration: underline;
-    }
-}
-
-.style1() { // absent in design
-}
-
-.style2 {
-    color: @primary1;
-    font-size: 13px;
-    font-weight: @baseFontWeightSemibold;
-}
-
-.style3() {
-    color: @primary5;
-    font-size: 14px;
-    font-weight: @baseFontWeight;
-
-    &:focus,
-    &:hover {
-        text-decoration: underline;
-    }
-}
-
-.style4() { // absent in design
-}
-
-.style5() { // absent in design
-}
-
-.style6() {
-    color: @primary5;
-    font-size: 13px;
-    font-weight: @baseFontWeight;
-
-    &:focus,
-    &:hover {
-        text-decoration: underline;
-    }
-}
-
-.style7() {
-    color: @primary1;
-    font-size: 16px;
-    font-weight: @baseFontWeight;
-}
-
-.style8() {
-    color: @primary6;
-    font-size: 13px;
-    font-weight: @baseFontWeight;
-}
-
-.style9() {
-    color: @primary1;
-    font-size: 14px;
-    font-weight: @baseFontWeight;
-}
-
-.style10() {
-    color: @primary1;
-    font-size: 20px;
-    font-weight: @baseFontWeight;
-}
-
-.style11() { // absent in design
-}
-
-.style12() { // absent in design
-}
-
-.style13() { // absent in design
-}
-
-.style14() {
-    color: @primary1;
-    font-size: 11px;
-    font-weight: @baseFontWeight;
-}
-
-.style15() {
-    color: @primary7;
-    font-size: 13px;
-    font-weight: @baseFontWeight;
-}
-
-.style15I() {
-    color: @primary1;
-    font-size: 13px;
-    font-weight: @baseFontWeight;
-}
-
-.style16() {
-    color: @primary4;
-    font-size: 12px;
-    font-weight: @baseFontWeightSemibold;
-}
-
-.style17() { // absent in design
-}
-
-.style18() {
-    color: @primary1;
-    font-size: 13px;
-    font-weight: @baseFontWeight;
-}
-
-.style19() {
-    color: @primary1;
-    font-size: 12px;
-    font-weight: @baseFontWeight;
-}
-
-.style20() { // absent in design
-    color: @primary2;
-    font-size: 12px;
-    font-weight: @baseFontWeightSemibold;
-}
-
-.style21() { // absent in design
-    color: @primary1;
-    font-size: 11px;
-    font-weight: @baseFontWeight;
-}
-
-.style22() {
-    color: @primary5;
-    font-size: 12px;
-    font-weight: @baseFontWeight;
-    &:focus,
-    &:hover {
-        text-decoration: underline;
-    }
-}
-
-.style23() {
-    color: @primary1;
-    font-size: 28px;
-    font-weight: @baseFontWeight;
-}
-
-.style24() { // absent in design
-    color: @primary1;
-    font-size: 12px;
-    font-weight: @baseFontWeight;
-}
-
-.style25() { // absent in design
-    color: @primary8;
-    font-size: 14px;
-    font-weight: @baseFontWeight;
-    &:focus,
-    &:hover {
-        text-decoration: underline;
-    }
-}
-
-.style26() { // absent in design
-    color: @primary4;
-    font-size: 30px;
-    font-weight: @baseFontWeightBold;
-}
-
-.style27() { // absent in design
-    color: @primary9;
-    font-size: 20px;
-    font-weight: @baseFontWeightBold;
-}
-
-.style28() {
-    color: @primary1;
-    font-size: 14px;
-    font-weight: @baseFontWeightBold;
-}
-
-.style29() {
-    color: @primary4;
-    font-size: 13px;
-    font-weight: @baseFontWeightBold;
-}
-
-.style30() {
-    color: @primary1;
-    font-size: 14px;
-    font-weight: @baseFontWeightSemibold;
-}
-
-.style31() {
-    color: @primary1;
-    font-size: 20px;
-    font-style: italic;
-    font-weight: @baseFontWeight;
-}
-
-.style32() {
-    color: @primary6;
-    font-size: 14px;
-    font-weight: @baseFontWeightBold;
-}
-
-.style33() {
-    color: @primary3;
-    font-size: 12px;
-    font-weight: @baseFontWeightSemibold;
-
-    &:focus,
-    &:hover {
-        text-decoration: underline;
-    }
-}
-
-.style34() { // no such html yet
-    color: @primary2;
-    font-size: 12px;
-    font-weight: @baseFontWeight;
-    &:focus,
-    &:hover {
-        text-decoration: underline;
-    }
-}
-
 // Fonts
 
 @font-face {
@@ -289,28 +42,28 @@
 /* @import url(http://fonts.googleapis.com/css?family=Open+Sans:400italic,400,600,700 <http://fonts.googleapis.com/css?family=Open+Sans:400italic%2c400%2c600%2c700>); */
 
 @font-face {
-  font-family: 'Open Sans';
-  font-style: normal;
-  font-weight: 400;
-  src: local('Open Sans'), local('OpenSans'), url(//themes.googleusercontent.com/static/fonts/opensans/v6/cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff) format('woff');
+    font-family: 'Open Sans';
+    font-style: normal;
+    font-weight: 400;
+    src: local('Open Sans'), local('OpenSans'), url(//themes.googleusercontent.com/static/fonts/opensans/v6/cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff) format('woff');
 }
 @font-face {
-  font-family: 'Open Sans';
-  font-style: normal;
-  font-weight: 600;
-  src: local('Open Sans Semibold'), local('OpenSans-Semibold'), url(//themes.googleusercontent.com/static/fonts/opensans/v6/MTP_ySUJH_bn48VBG8sNSnhCUOGz7vYGh680lGh-uXM.woff) format('woff');
+    font-family: 'Open Sans';
+    font-style: normal;
+    font-weight: 600;
+    src: local('Open Sans Semibold'), local('OpenSans-Semibold'), url(//themes.googleusercontent.com/static/fonts/opensans/v6/MTP_ySUJH_bn48VBG8sNSnhCUOGz7vYGh680lGh-uXM.woff) format('woff');
 }
 @font-face {
-  font-family: 'Open Sans';
-  font-style: normal;
-  font-weight: 700;
-  src: local('Open Sans Bold'), local('OpenSans-Bold'), url(//themes.googleusercontent.com/static/fonts/opensans/v6/k3k702ZOKiLJc3WVjuplzHhCUOGz7vYGh680lGh-uXM.woff) format('woff');
+    font-family: 'Open Sans';
+    font-style: normal;
+    font-weight: 700;
+    src: local('Open Sans Bold'), local('OpenSans-Bold'), url(//themes.googleusercontent.com/static/fonts/opensans/v6/k3k702ZOKiLJc3WVjuplzHhCUOGz7vYGh680lGh-uXM.woff) format('woff');
 }
 @font-face {
-  font-family: 'Open Sans';
-  font-style: italic;
-  font-weight: 400;
-  src: local('Open Sans Italic'), local('OpenSans-Italic'), url(//themes.googleusercontent.com/static/fonts/opensans/v6/xjAJXh38I15wypJXxuGMBobN6UDyHWBl620a-IRfuBk.woff) format('woff');
+    font-family: 'Open Sans';
+    font-style: italic;
+    font-weight: 400;
+    src: local('Open Sans Italic'), local('OpenSans-Italic'), url(//themes.googleusercontent.com/static/fonts/opensans/v6/xjAJXh38I15wypJXxuGMBobN6UDyHWBl620a-IRfuBk.woff) format('woff');
 }
 
 // Base
@@ -364,4 +117,4 @@ h6 {
 
 a {
     .actionLink();
-}
\ No newline at end of file
+}
diff --git a/app/design/adminhtml/magento_backend/less/styles/debug.less b/app/design/adminhtml/magento_backend/less/styles/debug.less
index 276e70485ad7550ddd2213d364fdd5c937afaf6e..5ed22427aee0823613461a3c9218d56a00c1758e 100644
--- a/app/design/adminhtml/magento_backend/less/styles/debug.less
+++ b/app/design/adminhtml/magento_backend/less/styles/debug.less
@@ -21,28 +21,28 @@
 //  * @license    http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 //  */
 
-/*
-    This file was created to debug old classes in order to indicate where we must replase it with new ones
-    The types of messages are generated in file: \app\code\core\Mage\Core\Block\Messages.php like $html .= '<' . $this->_messagesSecondLevelTagName . ' class="' . $type . '-msg">';
--------------------------------------- */
-
-/*
-    All messages to identify and refactor:
-
-label.mage-error,
-.notice,
-.messages ul,
-.messages li,
-.messages ul li,
-.error-msg,
-.success-msg,
-.notice-msg,
-.warning-msg
-
-Done:
-.notification-global
-.notification-global-notice
--------------------------------------- */
+///*
+//    This file was created to debug old classes in order to indicate where we must replase it with new ones
+//    The types of messages are generated in file: \app\code\core\Mage\Core\Block\Messages.php like $html .= '<' . $this->_messagesSecondLevelTagName . ' class="' . $type . '-msg">';
+//-------------------------------------- */
+
+///*
+//    All messages to identify and refactor:
+//
+//label.mage-error,
+//.notice,
+//.messages ul,
+//.messages li,
+//.messages ul li,
+//.error-msg,
+//.success-msg,
+//.notice-msg,
+//.warning-msg
+//
+//Done:
+//.notification-global
+//.notification-global-notice
+//-------------------------------------- */
 .debug {
     border: 1px solid red !important;
 }
@@ -413,17 +413,6 @@ ul.messages li.success-msg li:before {
     display: none;
 }
 
-.eq-ie8 .accordion .config legend {
-    position: absolute;
-    left: -999em;
-    display: block;
-    width: 0;
-    height: 0;
-    padding: 0;
-    margin: 0;
-    overflow: hidden;
-}
-
 .accordion .config table {
     width: 100%;
 }
@@ -502,17 +491,17 @@ ul.messages li.success-msg li:before {
     margin-top:6px;
 }
 .accordion .config .value.with-tooltip .tooltip-content {
-    padding:15px;
-    right:0;
-    margin-left:0;
-    margin-right:-19px;
-    margin-bottom:10px;
-    left:auto;
-    top:auto;
-    bottom:100%;
-    width: 400px;
-    max-width: 400px;
-    line-height: 1.333;
+    padding: 18px;
+    margin: 0 -17px 10px 0;
+    right: 0;
+    bottom: 100%;
+    width: 239px;
+    max-width: 239px;
+    font-size: 13px;
+    line-height: 1.4;
+    background: #31302b;
+    background: rgba(49, 48, 43, .8);
+    border-radius: 5px;
 }
 .accordion .config .value.with-tooltip .tooltip-content:before {
     content: '';
@@ -525,7 +514,7 @@ ul.messages li.success-msg li:before {
     right: 20px;
     border-left: 5px solid transparent;
     border-right: 5px solid transparent;
-    border-top: 5px solid #000;
+    border-top: 5px solid #31302b;
     border-bottom:0;
     opacity: .8;
 }
diff --git a/app/design/adminhtml/magento_backend/less/styles/header.less b/app/design/adminhtml/magento_backend/less/styles/header.less
index 57b2ac82e0345bf2f888a1556c6e88a20a9b4e7e..b9352175bff1f1480e49c60857b81aba18ecbf22 100644
--- a/app/design/adminhtml/magento_backend/less/styles/header.less
+++ b/app/design/adminhtml/magento_backend/less/styles/header.less
@@ -1,5 +1,5 @@
-// /**
-//  * Magento
+/**
+ * Magento
  *
  * NOTICE OF LICENSE
  *
@@ -16,11 +16,12 @@
  * Do not edit or add to this file if you wish to upgrade Magento to newer
  * versions in the future. If you wish to customize Magento for your
  * needs please refer 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)
-//  */
+ *
+ * @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)
+ */
 
+@import "vars.less";
 /*
     Header
 -------------------------------------- */
@@ -38,10 +39,6 @@
     padding: 0 20px;
 }
 
-.eq-ie8 .header {
-    background: #f5f2ea;
-}
-
 .header-inner {
     min-width: 960px;
     max-width: 1300px;
@@ -57,55 +54,56 @@
     background: url(Magento_Backend::images/logo-magento-small.png) no-repeat;
     margin: 0;
 }
-/*
-.header .logo {
-    display: inline-block;
-    width: 100px;
-    height: 27px;
-    margin: 0;
-    text-indent: -999em;
-    position: relative;
-    z-index: 1;
-}
-
-.header .logo:before,
-.header .logo:after {
-    font-family: 'admin-icons';
-    font-size: 26px;
-    content: '\e00d';
-    position: absolute;
-    bottom: 0;
-    left: 0;
-    text-indent: 0;
-    line-height: 1;
-    font-weight: normal;
-}
-
-.header .logo:before {
-    content: '\e00d';
-    color: #f37b20;
-}
-
-.header .logo:after {
-    content: '\e00e';
-    color: #fab57f;
-}
-
-.header .logo span:before {
-    font-family: 'admin-icons';
-    content: '\e00f';
-    display: block;
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    left: 28px;
-    font-size: 65px;
-    margin-top: -17px;
-    text-indent: 0;
-    line-height: 1;
-    font-weight: normal;
-    color: #000;
-}*/
+// /*
+//.header .logo {
+//    display: inline-block;
+//    width: 100px;
+//    height: 27px;
+//    margin: 0;
+//    text-indent: -999em;
+//    position: relative;
+//    z-index: 1;
+//}
+//
+//.header .logo:before,
+//.header .logo:after {
+//    font-family: 'admin-icons';
+//    font-size: 26px;
+//    content: '\e00d';
+//    position: absolute;
+//    bottom: 0;
+//    left: 0;
+//    text-indent: 0;
+//    line-height: 1;
+//    font-weight: normal;
+//}
+//
+//.header .logo:before {
+//    content: '\e00d';
+//    color: #f37b20;
+//}
+//
+//.header .logo:after {
+//    content: '\e00e';
+//    color: #fab57f;
+//}
+//
+//.header .logo span:before {
+//    font-family: 'admin-icons';
+//    content: '\e00f';
+//    display: block;
+//    position: absolute;
+//    top: 0;
+//    bottom: 0;
+//    left: 28px;
+//    font-size: 65px;
+//    margin-top: -17px;
+//    text-indent: 0;
+//    line-height: 1;
+//    font-weight: normal;
+//    color: #000;
+//}
+// */
 
 .header-panel {
     float: right;
@@ -128,10 +126,6 @@
     box-shadow: 0 2px 7px 2px rgba(0, 0, 0, 0.2);
 }
 
-.eq-ie8 .header-panel .dropdown-menu {
-    border: 1px solid #c3bcaf;
-}
-
 .header-panel .dropdown-menu > li {
     position: relative;
     padding: 20px 30px 13px 18px;
@@ -299,10 +293,6 @@
     color: #b0a798;
 }
 
-.eq-ie8 .header-panel .notifications-icon:before {
-    bottom: -6px;
-}
-
 .header-panel .notifications .value {
     .style16();
     line-height: 11px;
@@ -577,7 +567,7 @@
     padding-top: 14px;
     z-index: 2;
 }
-.eq-ie8 .header-panel .notifications > .dropdown-menu > li:hover,
+
 .header-panel .notifications > .dropdown-menu > li:first-child:hover,
 .header-panel .notifications > .dropdown-menu > li.first:hover,
 .header-panel .notifications > .dropdown-menu > li:last-child:hover,
@@ -590,10 +580,6 @@
     display: none;
 }
 
-.eq-ie8 .header-panel .dropdown-menu > li:hover:after {
-    display: block;
-}
-
 .header-panel .notifications > .dropdown-menu > li:hover .action-close {
     display: block;
 }
@@ -659,9 +645,6 @@
     text-indent: 0;
 }
 
-.eq-ie8 .header-panel .notifications > .dropdown-menu .action-close {
-    filter: none;
-}
 
 .header .header-panel .notifications .dropdown-menu > li.last {
     padding: 0;
@@ -682,18 +665,10 @@
     margin: 0;
 }
 
-.eq-ie8 .header .header-panel .notifications .action-more {
-    filter: none;
-}
-
 .header .header-panel .notifications .action-more:hover {
     text-decoration: none;
 }
 
-.eq-ie8 .header .header-panel .notifications .action-more {
-    margin-bottom: -1px;
-}
-
 /*
     Help
 -------------------------------------- */
@@ -756,14 +731,10 @@
 }
 
 .autocomplete-results {
-    left: 0 !important; /* TODO: Because of script bug in IE9 */
+    left: 0 !important; // TODO: Because of script bug in IE9
     right: 0;
 }
 
-.eq-ie8 .autocomplete-results {
-    margin-top: -10px;
-}
-
 .autocomplete-results .title {
     display: block;
 }
@@ -835,10 +806,6 @@
     text-align: center;
 }
 
-.eq-ie8 .search button[type="submit"]:before {
-    line-height: 1.3;
-}
-
 /*
     Clearfix
 -------------------------------------- */
diff --git a/app/design/adminhtml/magento_backend/less/styles/pages.less b/app/design/adminhtml/magento_backend/less/styles/pages.less
index 55d29b75e6d47a993b9c8042a67781f167c4b620..06197eccfadf5f0ba4efe63a7522fea78bd74291 100644
--- a/app/design/adminhtml/magento_backend/less/styles/pages.less
+++ b/app/design/adminhtml/magento_backend/less/styles/pages.less
@@ -1,5 +1,5 @@
-// /**
-//  * Magento
+/**
+ * Magento
  *
  * NOTICE OF LICENSE
  *
@@ -16,10 +16,12 @@
  * Do not edit or add to this file if you wish to upgrade Magento to newer
  * versions in the future. If you wish to customize Magento for your
  * needs please refer 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)
-//  */
+ *
+ * @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)
+ */
+
+@import "vars.less";
 
 /*
     Product Creation
@@ -38,12 +40,6 @@
     color: #7a7976;
 }
 
-.eq-ie8 [class^=" catalog-product-"] .page-actions .action-back,
-.eq-ie8 [class^=" catalog-product-"] .page-actions .action-back:hover,
-.eq-ie8 [class^=" catalog-product-"] .page-actions .action-back:active,
-.eq-ie8 [class^=" newsletter-"] .page-actions .action-back,
-.eq-ie8 [class^=" newsletter-"] .page-actions .action-back:hover,
-.eq-ie8 [class^=" newsletter-"] .page-actions .action-back:active,
 .sales-order-create-index .page-actions-inner .cancel,
 .sales-order-create-index .page-actions-inner .cancel:hover,
 .sales-order-create-index .page-actions-inner .cancel:active {
@@ -103,9 +99,20 @@
     width: 100%;
 }
 
+#tab_content_downloadableInfo .data-table td {
+    vertical-align: top;
+    .row {
+        margin-bottom: 10px;
+    }
+}
+
 /*
     Customer
 ---------------------------------------*/
+.customer-index-edit .grid tr.headings th > span {
+    white-space: normal;
+}
+
 #customer_info_tabs_account_content #_accountsendemail {
     margin-top: 8px;
 }
@@ -464,6 +471,7 @@
 
 #export_filter_grid .grid select {
     margin-bottom: 0;
+    width: 86%;
 }
 
 #export_filter_grid .grid table td:first-child,
@@ -1619,6 +1627,17 @@
             }
         }
     }
+    .order-billing-method {
+        .payment-methods {
+            .fieldset {
+                padding: 0;
+                margin: 0;
+                .field {
+                    margin: 0 0 12px 0;
+                }
+            }
+        }
+    }
 }
 
 .tax.summary-total .summary-collapse {
@@ -1756,23 +1775,24 @@ tr.row-totals:nth-child(odd) + tr.summary-details ~ tr.summary-total:not(.show-d
 }
 
 .overlay {
-    background: rgba(0, 0, 0, .3);
+    background: rgba(255, 255, 255, .5);
     border-radius: 5px;
     position: absolute;
     top: 0;
     bottom: 0;
     left: 0;
     right: 0;
-}
 
-.overlay span {
-    color: #111;
-    font-weight: bold;
-    position: absolute;
-    top: 50%;
-    left: 50%;
-    margin: -25px 0 0 -100px;
-    width: 200px;
+    span {
+        color: #111;
+        font-weight: bold;
+        position: absolute;
+        top: 56px;
+        left: 0;
+        margin: 0 8px;
+        padding: 10px;
+        background: #ffffff;
+    }
 }
 
 /*
@@ -2017,11 +2037,6 @@ tr.row-totals:nth-child(odd) + tr.summary-details ~ tr.summary-total:not(.show-d
     word-wrap: break-word;
 }
 
-.eq-ie8 .sales-order-index .col-1-layout table.data {
-    table-layout: auto;
-    word-wrap: normal;
-}
-
 [class^=" sales-"] .col-from-store {
     width: 15%;
 }
@@ -2797,7 +2812,9 @@ table.items-to-invoice tbody tr:hover td {
 .tax-rate-popup .field:before,
 .tax-rate-popup .field:after,
 .clearfix:before,
-.clearfix:after {
+.clearfix:after,
+#tab_content_downloadableInfo .data-table td .row:before,
+#tab_content_downloadableInfo .data-table td .row:after {
     content: "";
     display: table;
 }
@@ -2806,6 +2823,9 @@ table.items-to-invoice tbody tr:hover td {
 .image-panel:after,
 .images:after,
 .tax-rate-popup .field:after,
-.clearfix:after {
+.clearfix:after,
+#tab_content_downloadableInfo .data-table td .row:after {
     clear: both;
 }
+
+@import "debug.less";
diff --git a/app/design/adminhtml/magento_backend/less/styles/styles-ie8.less b/app/design/adminhtml/magento_backend/less/styles/styles-ie8.less
new file mode 100644
index 0000000000000000000000000000000000000000..dd8d4c7f517ffb6d1646d30fe3e55f7d4ca1474c
--- /dev/null
+++ b/app/design/adminhtml/magento_backend/less/styles/styles-ie8.less
@@ -0,0 +1,372 @@
+/**
+ * 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)
+ */
+
+// Reset 'button view' for actions
+.eq-ie8 .customer-current-activity .action-refresh,
+.eq-ie8 .pager .action-next,
+.eq-ie8 .pager .action-previous,
+.eq-ie8 .pager .action-next:hover,
+.eq-ie8 .pager .action-previous:hover,
+.eq-ie8 .pager .action-next.disabled:focus,
+.eq-ie8 .pager .action-previous.disabled:focus,
+.eq-ie8 .pager .action-next.disabled:active,
+.eq-ie8 .pager .action-previous.disabled:active,
+.eq-ie8 .data-table .action-.delete,
+.eq-ie8 .data-table .action-.delete:hover,
+.eq-ie8 .data-table .action-.delete:active,
+.eq-ie8 .data-table .action-.delete.active,
+.eq-ie8 .data-table .action-delete,
+.eq-ie8 .data-table .action-delete:hover,
+.eq-ie8 .data-table .action-delete:active,
+.eq-ie8 .data-table .action-delete.active,
+.eq-ie8 .data-table .action-locked,
+.eq-ie8 .data-table .action-locked:hover,
+.eq-ie8 .data-table .action-locked:active,
+.eq-ie8 .data-table .action-locked.active,
+.eq-ie8 #product-variations-matrix .action-choose,
+.eq-ie8 #product-variations-matrix .action-choose:hover,
+.eq-ie8 #product-variations-matrix .action-choose:active,
+.eq-ie8 #product-variations-matrix .action-choose.active,
+.eq-ie8 .image-panel .action-close,
+.eq-ie8 .eq-ie8 .image-panel .action-close:hover,
+.eq-ie8 .image-panel .action-close:active,
+.eq-ie8 .image-panel .action-close.active,
+.eq-ie8 .image-panel-controls .action-remove,
+.eq-ie8 .image-panel-controls .action-remove:hover,
+.eq-ie8 .image-panel-controls .action-remove:active,
+.eq-ie8 .image-panel-controls .action-remove.active,
+.eq-ie8 .suggest-expandable .action-show-all,
+.eq-ie8 .suggest-expandable .action-show-all:hover,
+.eq-ie8 .suggest-expandable .action-show-all:active,
+.eq-ie8 .suggest-expandable .action-show-all.active,
+.eq-ie8 .vde-tools-header .action-close,
+.eq-ie8 .vde-tools-header .action-close:hover,
+.eq-ie8 .vde-tools-header .action-close:active,
+.eq-ie8 .vde-tools-header .action-close.active,
+.eq-ie8 .image .action-delete,
+.eq-ie8 .image .action-delete:hover,
+.eq-ie8 .image .action-delete:active,
+.eq-ie8 .image .action-delete.active,
+.eq-ie8 .fieldset-wrapper-title .actions .action-delete,
+.eq-ie8 .fieldset-wrapper-title .actions .action-delete:hover,
+.eq-ie8 .fieldset-wrapper-title .actions .action-delete:active,
+.eq-ie8 .fieldset-wrapper-title .actions .action-delete.active,
+.eq-ie8 .address-list-item-actions .action-delete,
+.eq-ie8 .address-list-item-actions .action-delete:hover,
+.eq-ie8 .address-list-item-actions .action-delete:active,
+.eq-ie8 .address-list-item-actions .action-delete.active,
+.eq-ie8 .notification .action-close,
+.eq-ie8 .notification .action-close:hover,
+.eq-ie8 .notification .action-close:active,
+.eq-ie8 .notification .action-close.active,
+.eq-ie8 .page-login .action-forgotpassword,
+.eq-ie8 .page-login .action-forgotpassword:hover,
+.eq-ie8 .page-login .action-forgotpassword:active,
+.eq-ie8 .page-login .action-forgotpassword.active,
+.eq-ie8 .page-login .action-back,
+.eq-ie8 .page-login .action-back:hover,
+.eq-ie8 .page-login .action-back:active,
+.eq-ie8 .page-login .action-back.active {
+    border: none;
+    border-radius: 0;
+    background: none;
+    margin: 0;
+    padding: 0;
+    box-shadow: none;
+    text-shadow: none;
+    filter: none;
+}
+
+// Variations Image Uploader
+
+.eq-ie8 .actions-image-uploader .action-upload {
+    filter: none;
+}
+
+// Forms
+
+.eq-ie8 select[disabled="disabled"][multiple="multiple"] option[selected="selected"] {
+    background-color: #ddd;
+}
+
+.eq-ie8 .fieldset {
+    border-width: 0 0 1px;
+}
+
+.eq-ie8 .fieldset .fieldset-wrapper .fieldset-wrapper-title,
+.eq-ie8 .fieldset-wrapper .fieldset-wrapper .fieldset-wrapper-title {
+    background: #f4f2ef;
+}
+
+.eq-ie8 .fieldset-alt,
+.eq-ie8 .fieldset-alt > .fieldset {
+    display: block;
+    width: 100%;
+}
+
+.eq-ie8 .fieldset-alt > .field {
+    display: inline-block;
+}
+
+.eq-ie8 .field.type-price .addon .addafter,
+.eq-ie8 .field-price .addon .addafter,
+.eq-ie8 .field-special_price .addon .addafter,
+.eq-ie8 .field-msrp .addon .addafter {
+    border-width: 1px 1px 1px 0;
+}
+
+.eq-ie8 .field-apply_to .multiselect {
+    height: 120px;
+}
+
+// Popups
+
+.eq-ie8 .popup-loading {
+    -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";
+}
+
+.eq-ie8 .loading-old,
+.eq-ie8 .loading-mask {
+    background: #fff;
+    -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";
+}
+
+// Global Navigation
+.eq-ie8 .navigation {
+    background: #726c62;
+}
+
+.eq-ie8 .navigation:before {
+    border-top: 1px solid #46433d;
+}
+
+.eq-ie8 .navigation .level-0.active > a {
+    background: #625d54;
+}
+
+.eq-ie8 .navigation .level-0.active > a,
+.eq-ie8 .navigation .level-0:hover > a,
+.eq-ie8 .navigation .level-0.hover > a {
+    border-top: 1px solid #46433d;
+    padding-top: 36px;
+}
+
+.eq-ie8 .navigation .level-0 > .submenu .column {
+    float: left;
+}
+
+.eq-ie8 .navigation .level-0.item-system > a,
+.eq-ie8 .navigation .level-0.item-system:hover > a,
+.eq-ie8 .navigation .level-0.item-system.hover > a,
+.eq-ie8 .navigation .level-0.item-stores > a,
+.eq-ie8 .navigation .level-0.item-stores:hover > a,
+.eq-ie8 .navigation .level-0.item-stores.hover > a {
+    border-top: 0;
+    padding-top: 0;
+}
+
+.eq-ie8 .navigation .level-0.item-system > a:before,
+.eq-ie8 .navigation .level-0.item-system > a:after,
+.eq-ie8 .navigation .level-0.item-stores > a:before,
+.eq-ie8 .navigation .level-0.item-stores > a:after {
+    display: none;
+}
+
+.eq-ie8 .page-login .field-username label,
+.eq-ie8 .page-login .field-password label,
+.eq-ie8 .page-login .field-confirmation label {
+    display: block;
+}
+
+.eq-ie8 .message-noscript,
+.eq-ie8 .message-demo-mode {
+    border-bottom: 1px solid #46433d;
+}
+
+// Switcher
+.eq-ie8 .store-switcher-alt .store-selected:after {
+    vertical-align: middle;
+}
+
+.eq-ie8 .store-switcher-website {
+    border-bottom: 0;
+}
+
+.eq-ie8 .store-switcher-store-view {
+    border-bottom: 0;
+    border-top: 1px solid #e5e5e5;
+}
+
+.eq-ie8 .switcher-label:after {
+    content: 'off';
+    overflow: hidden;
+    white-space: nowrap;
+    text-indent: 100%;
+}
+
+.eq-ie8 .switcher.checked .switcher-label:after {
+    background-position: -34px 0;
+    content: 'on';
+}
+
+.eq-ie8 .switcher.checked .switcher-label:before {
+    content: attr(data-text-on);
+}
+
+// Table Grid
+
+.eq-ie8 .grid table td.empty-text {
+    border-width: 0 1px 1px;
+}
+
+.eq-ie8 .grid table tr td.empty-text {
+    border-width: 0 1px 1px;
+}
+
+.eq-ie8 .grid .filter .date img {
+    filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0);
+}
+
+.eq-ie8 .massaction .entry-edit .field-row:first-child {
+    margin-right: 1px;
+}
+
+.eq-ie8 .massaction .entry-edit .field-row {
+    display: inline;
+}
+
+// Data table
+
+.eq-ie8 .data-table td,
+.eq-ie8 .data-table tbody tr td {
+    border-width: 0 0 1px;
+}
+
+.eq-ie8 .data-table td > .field {
+    margin-bottom: 0;
+}
+
+.eq-ie8 .data-table tfoot tr td {
+    border: none;
+}
+
+// Data table - alternative view
+
+.eq-ie8 .customer-information .data-table tbody tr td,
+.eq-ie8 .customer-information .data-table tbody tr th,
+.eq-ie8 .order-information .data-table tbody tr td,
+.eq-ie8 .order-information .data-table tbody tr th,
+.eq-ie8 .order-account-information .data-table tbody tr td,
+.eq-ie8 .order-account-information .data-table tbody tr th,
+.eq-ie8 [class^=" adminhtml-rma-"] .data-table tbody tr td,
+.eq-ie8 [class^=" adminhtml-rma-"] .data-table tbody tr th,
+.eq-ie8 [class^=" sales-transactions-"] .data-table tbody tr th,
+.eq-ie8 [class^=" sales-transactions-"] .data-table tbody tr td,
+.eq-ie8 [class^=" sales-"] .order-payment-method .data-table tbody tr th,
+.eq-ie8 [class^=" sales-"] .order-payment-method .data-table tbody tr td,
+.eq-ie8 [class^=" sales-billing-agreement-"] .log-details .data-table tbody tr th,
+.eq-ie8 [class^=" sales-billing-agreement-"] .log-details .data-table tbody tr td {
+    border-bottom: 1px solid #ededed;
+}
+
+// Widgets
+.eq-ie8 .widget-layout-updates .data-table {
+    table-layout: auto;
+}
+
+// Grid - Mass Action
+
+.eq-ie8 .massaction {
+    border-bottom: 2px solid #504d46;
+}
+
+// Header
+.eq-ie8 .header {
+    background: #f5f2ea;
+}
+
+.eq-ie8 .header-panel .dropdown-menu {
+    border: 1px solid #c3bcaf;
+}
+
+.eq-ie8 .header-panel .notifications-icon:before {
+    bottom: -6px;
+}
+
+.eq-ie8 .header-panel .notifications > .dropdown-menu > li:hover {
+    margin-top: 0;
+    padding-top: 13px;
+}
+
+.eq-ie8 .header-panel .dropdown-menu > li:hover:after {
+    display: block;
+}
+
+.eq-ie8 .header-panel .notifications > .dropdown-menu .action-close {
+    filter: none;
+}
+
+.eq-ie8 .header .header-panel .notifications .action-more {
+    filter: none;
+}
+
+.eq-ie8 .header .header-panel .notifications .action-more {
+    margin-bottom: -1px;
+}
+
+.eq-ie8 .autocomplete-results {
+    margin-top: -10px;
+}
+
+.eq-ie8 .search button[type="submit"]:before {
+    line-height: 1.3;
+}
+
+// Product Creation
+
+.eq-ie8 [class^=" catalog-product-"] .page-actions .action-back,
+.eq-ie8 [class^=" catalog-product-"] .page-actions .action-back:hover,
+.eq-ie8 [class^=" catalog-product-"] .page-actions .action-back:active,
+.eq-ie8 [class^=" newsletter-"] .page-actions .action-back,
+.eq-ie8 [class^=" newsletter-"] .page-actions .action-back:hover,
+.eq-ie8 [class^=" newsletter-"] .page-actions .action-back:active {
+    filter: none;
+    border: 0;
+}
+
+.eq-ie8 .sales-order-index .col-1-layout table.data {
+    table-layout: auto;
+    word-wrap: normal;
+}
+
+// Accordion
+.eq-ie8 .accordion .config legend {
+    position: absolute;
+    left: -999em;
+    display: block;
+    width: 0;
+    height: 0;
+    padding: 0;
+    margin: 0;
+    overflow: hidden;
+}
diff --git a/app/design/adminhtml/magento_backend/less/styles/vars.less b/app/design/adminhtml/magento_backend/less/styles/vars.less
new file mode 100644
index 0000000000000000000000000000000000000000..d1e4701b182816a5e85b02d33a491086a19a5eda
--- /dev/null
+++ b/app/design/adminhtml/magento_backend/less/styles/vars.less
@@ -0,0 +1,337 @@
+// /**
+//  * 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)
+//  */
+
+@import "../clearless/all.less";
+
+@baseDir: ~"..";
+
+// Primary colors
+@primary1: #676056;
+@primary2: #ed4f2e;
+@primary3: #026294;
+@primary4: #fff;
+@primary5: #007dbd;
+@primary6: #e22626;
+@primary7: #f2ebde;
+@primary8: #31302b;
+@primary9: #ef672f;
+
+// Buttons
+// Default Buttons
+@defaultButton1: #f2ebde;
+@defaultButton2: #ada89e;
+@defaultButton3: #676056;
+@defaultButton4: #cac3b4;
+@defaultButton5: #989287;
+
+// Primary Buttons
+@primaryButton1: #007dbd;
+@primaryButton2: #0574ad;
+@primaryButton3: #026294;
+@primaryButton4: #004c74;
+
+// Links
+@linkColor: @primary3;
+@linkColor2: @primary4;
+
+// Base font
+@baseFont: 'Open Sans', sans-serif;
+@baseFontSize: 14px;
+@baseFontWeight: 400;
+@baseFontWeightSemibold: 600;
+@baseFontWeightBold: 700;
+@baseLineHeight: 1.33;
+@baseColor: @primary1;
+
+// Headings
+// H1
+@h1color: @primary1;
+@h1font: 400 28px/1.2 @baseFont;
+
+// H2
+@h2color: @primary1;
+@h2font: 400 20px/1.2 @baseFont;
+
+// H3
+@h3color: @primary1;
+@h3font: 600 16px/1.2 @baseFont;
+
+// H4
+@h4color: @primary1;
+@h4font: 600 14px/1.2 @baseFont;
+
+// H5
+@h5color: @primary1;
+@h5font: 600 13px/1.2 @baseFont;
+
+// H6
+@h6color: @primary1;
+@h6font: 600 12px/1.2 @baseFont;
+
+
+.actionLink() {
+    display: inline;
+    color: @linkColor;
+    text-decoration: none;
+    &:visited,
+    &:active {
+        color: @linkColor;
+    }
+    &:focus,
+    &:hover {
+        color: @linkColor;
+        text-decoration: underline;
+    }
+}
+
+.actionLinkI() {
+    display: inline;
+    color: @linkColor2;
+    text-decoration: underline;
+    &:visited,
+    &:active {
+        color: @linkColor2;
+    }
+    &:focus,
+    &:hover {
+        color: @linkColor2;
+        text-decoration: underline;
+    }
+}
+
+.style1() { // absent in design
+}
+
+.style2() {
+    color: @primary1;
+    font-size: 13px;
+    font-weight: @baseFontWeightSemibold;
+}
+
+.style3() {
+    color: @primary5;
+    font-size: 14px;
+    font-weight: @baseFontWeight;
+
+    &:focus,
+    &:hover {
+        text-decoration: underline;
+    }
+}
+
+.style4() { // absent in design
+}
+
+.style5() { // absent in design
+}
+
+.style6() {
+    color: @primary5;
+    font-size: 13px;
+    font-weight: @baseFontWeight;
+
+    &:focus,
+    &:hover {
+        text-decoration: underline;
+    }
+}
+
+.style7() {
+    color: @primary1;
+    font-size: 16px;
+    font-weight: @baseFontWeight;
+}
+
+.style8() {
+    color: @primary6;
+    font-size: 13px;
+    font-weight: @baseFontWeight;
+}
+
+.style9() {
+    color: @primary1;
+    font-size: 14px;
+    font-weight: @baseFontWeight;
+}
+
+.style10() {
+    color: @primary1;
+    font-size: 20px;
+    font-weight: @baseFontWeight;
+}
+
+.style11() { // absent in design
+}
+
+.style12() { // absent in design
+}
+
+.style13() { // absent in design
+}
+
+.style14() {
+    color: @primary1;
+    font-size: 11px;
+    font-weight: @baseFontWeight;
+}
+
+.style15() {
+    color: @primary7;
+    font-size: 13px;
+    font-weight: @baseFontWeight;
+}
+
+.style15I() {
+    color: @primary1;
+    font-size: 13px;
+    font-weight: @baseFontWeight;
+}
+
+.style16() {
+    color: @primary4;
+    font-size: 12px;
+    font-weight: @baseFontWeightSemibold;
+}
+
+.style17() { // absent in design
+}
+
+.style18() {
+    color: @primary1;
+    font-size: 13px;
+    font-weight: @baseFontWeight;
+}
+
+.style19() {
+    color: @primary1;
+    font-size: 12px;
+    font-weight: @baseFontWeight;
+}
+
+.style20() { // absent in design
+    color: @primary2;
+    font-size: 12px;
+    font-weight: @baseFontWeightSemibold;
+}
+
+.style21() { // absent in design
+    color: @primary1;
+    font-size: 11px;
+    font-weight: @baseFontWeight;
+}
+
+.style22() {
+    color: @primary5;
+    font-size: 12px;
+    font-weight: @baseFontWeight;
+    &:focus,
+    &:hover {
+        text-decoration: underline;
+    }
+}
+
+.style23() {
+    color: @primary1;
+    font-size: 28px;
+    font-weight: @baseFontWeight;
+}
+
+.style24() { // absent in design
+    color: @primary1;
+    font-size: 12px;
+    font-weight: @baseFontWeight;
+}
+
+.style25() { // absent in design
+    color: @primary8;
+    font-size: 14px;
+    font-weight: @baseFontWeight;
+    &:focus,
+    &:hover {
+        text-decoration: underline;
+    }
+}
+
+.style26() { // absent in design
+    color: @primary4;
+    font-size: 30px;
+    font-weight: @baseFontWeightBold;
+}
+
+.style27() { // absent in design
+    color: @primary9;
+    font-size: 20px;
+    font-weight: @baseFontWeightBold;
+}
+
+.style28() {
+    color: @primary1;
+    font-size: 14px;
+    font-weight: @baseFontWeightBold;
+}
+
+.style29() {
+    color: @primary4;
+    font-size: 13px;
+    font-weight: @baseFontWeightBold;
+}
+
+.style30() {
+    color: @primary1;
+    font-size: 14px;
+    font-weight: @baseFontWeightSemibold;
+}
+
+.style31() {
+    color: @primary1;
+    font-size: 20px;
+    font-style: italic;
+    font-weight: @baseFontWeight;
+}
+
+.style32() {
+    color: @primary6;
+    font-size: 14px;
+    font-weight: @baseFontWeightBold;
+}
+
+.style33() {
+    color: @primary3;
+    font-size: 12px;
+    font-weight: @baseFontWeightSemibold;
+
+    &:focus,
+    &:hover {
+        text-decoration: underline;
+    }
+}
+
+.style34() { // no such html yet
+    color: @primary2;
+    font-size: 12px;
+    font-weight: @baseFontWeight;
+    &:focus,
+    &:hover {
+        text-decoration: underline;
+    }
+}
diff --git a/app/design/frontend/magento_plushe/Magento_Theme/layout/default_head_blocks.xml b/app/design/frontend/magento_plushe/Magento_Theme/layout/default_head_blocks.xml
index baaa059b8b8da53a3efa2bdb036c2e232ab2d681..87820ad284cbda2284d910fdbdbd3419753da917 100644
--- a/app/design/frontend/magento_plushe/Magento_Theme/layout/default_head_blocks.xml
+++ b/app/design/frontend/magento_plushe/Magento_Theme/layout/default_head_blocks.xml
@@ -32,7 +32,7 @@
         </block>
         <block class="Magento\Theme\Block\Html\Head\Script" name="js-matchmedia-js">
             <arguments>
-                <argument name="file" xsi:type="string">js/matchMedia.js</argument>
+                <argument name="file" xsi:type="string">matchMedia.js</argument>
             </arguments>
         </block>
         <block class="Magento\Theme\Block\Html\Head\Script" name="js-responsive-js">
@@ -42,7 +42,7 @@
         </block>
         <block class="Magento\Theme\Block\Html\Head\Script" name="js-head-js">
             <arguments>
-                <argument name="file" xsi:type="string">js/head.js</argument>
+                <argument name="file" xsi:type="string">headjs/head.min.js</argument>
             </arguments>
         </block>
         <block class="Magento\Theme\Block\Html\Head\Script" name="js-jquery-dropdowns-js">
@@ -67,7 +67,7 @@
         </block>
         <block class="Magento\Theme\Block\Html\Head\Script" name="js-selectivizr-js">
             <arguments>
-                <argument name="file" xsi:type="string">js/selectivizr.js</argument>
+                <argument name="file" xsi:type="string">selectivizr.js</argument>
                 <argument name="properties" xsi:type="array">
                     <item name="ie_condition" xsi:type="string">lt IE 9</item>
                 </argument>
diff --git a/app/design/frontend/magento_plushe/css/styles.css b/app/design/frontend/magento_plushe/css/styles.css
index 16a5de8bdb00535ec7c94c69abc888fdaa2719fc..6b5a8b9d13789502d35843114778818e6a02ce07 100644
--- a/app/design/frontend/magento_plushe/css/styles.css
+++ b/app/design/frontend/magento_plushe/css/styles.css
@@ -5278,6 +5278,19 @@ body {
   padding: 0;
   margin: 0 0 30px;
 }
+.block.progress.onepage dd.complete .cards.items dd {
+  margin-left: 0;
+}
+.block.progress.onepage dd.complete .cards.items dd .card.item {
+  font-size: 12px;
+  margin: 5px 0 10px;
+}
+.block.progress.onepage dd.complete .cards.items dd .card.item dt {
+  font-weight: bold;
+}
+.block.progress.onepage dd.complete .cards.items dd .card.item dd {
+  margin-bottom: 5px;
+}
 .block.progress.onepage address {
   font-style: normal;
 }
diff --git a/app/design/frontend/magento_plushe/js/extra-options.js b/app/design/frontend/magento_plushe/js/extra-options.js
index a7457b18dc75d67de33a81f95db1d0222f3719ab..5e32b5cc2e12b392d87abec6c1787ff3e682fba0 100644
--- a/app/design/frontend/magento_plushe/js/extra-options.js
+++ b/app/design/frontend/magento_plushe/js/extra-options.js
@@ -17,8 +17,6 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    gift options
- * @package     mage
  * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
  * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
  */
diff --git a/app/design/frontend/magento_plushe/js/head.js b/app/design/frontend/magento_plushe/js/head.js
deleted file mode 100644
index 67de77740949bcedf9cfcad1034ce8a90a2f5cd6..0000000000000000000000000000000000000000
--- a/app/design/frontend/magento_plushe/js/head.js
+++ /dev/null
@@ -1,356 +0,0 @@
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Academic Free License (AFL 3.0)
- * that is bundled with this package in the file LICENSE_AFL.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/afl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @copyright  Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license    http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
- */
-
-(function (a, w) {
-    function f(a) {
-        p[p.length] = a
-    }
-
-    function m(a) {
-        q.className = q.className.replace(RegExp("\\b" + a + "\\b"), "")
-    }
-
-    function k(a, d) {
-        for (var b = 0, c = a.length; b < c; b++)d.call(a, a[b], b)
-    }
-
-    function s() {
-        q.className = q.className.replace(/ (w-|eq-|gt-|gte-|lt-|lte-|portrait|no-portrait|landscape|no-landscape)\d+/g, "");
-        var b = a.innerWidth || q.clientWidth, d = a.outerWidth || a.screen.width;
-        h.screen.innerWidth = b;
-        h.screen.outerWidth = d;
-        f("w-" + b);
-        k(c.screens, function (a) {
-            b > a ? (c.screensCss.gt && f("gt-" + a), c.screensCss.gte && f("gte-" +
-                a)) : b < a ? (c.screensCss.lt && f("lt-" + a), c.screensCss.lte && f("lte-" + a)) : b === a && (c.screensCss.lte && f("lte-" + a), c.screensCss.eq && f("e-q" + a), c.screensCss.gte && f("gte-" + a))
-        });
-        var d = a.innerHeight || q.clientHeight, g = a.outerHeight || a.screen.height;
-        h.screen.innerHeight = d;
-        h.screen.outerHeight = g;
-        h.feature("portrait", d > b);
-        h.feature("landscape", d < b)
-    }
-
-    function r() {
-        a.clearTimeout(u);
-        u = a.setTimeout(s, 100)
-    }
-
-    var n = a.document, g = a.navigator, t = a.location, q = n.documentElement, p = [], c = {screens:[240, 320, 480, 640, 768, 800, 1024, 1280,
-        1440, 1680, 1920], screensCss:{gt:!0, gte:!1, lt:!0, lte:!1, eq:!1}, browsers:[
-        {ie:{min:6, max:10}}
-    ], browserCss:{gt:!0, gte:!1, lt:!0, lte:!1, eq:!0}, section:"-section", page:"-page", head:"head"};
-    if (a.head_conf)for (var b in a.head_conf)a.head_conf[b] !== w && (c[b] = a.head_conf[b]);
-    var h = a[c.head] = function () {
-        h.ready.apply(null, arguments)
-    };
-    h.feature = function (a, b, c) {
-        if (!a)return q.className += " " + p.join(" "), p = [], h;
-        "[object Function]" === Object.prototype.toString.call(b) && (b = b.call());
-        f((b ? "" : "no-") + a);
-        h[a] = !!b;
-        c || (m("no-" +
-            a), m(a), h.feature());
-        return h
-    };
-    h.feature("js", !0);
-    b = g.userAgent.toLowerCase();
-    g = /mobile|midp/.test(b);
-    h.feature("mobile", g, !0);
-    h.feature("desktop", !g, !0);
-    b = /(chrome|firefox)[ \/]([\w.]+)/.exec(b) || /(iphone|ipad|ipod)(?:.*version)?[ \/]([\w.]+)/.exec(b) || /(android)(?:.*version)?[ \/]([\w.]+)/.exec(b) || /(webkit|opera)(?:.*version)?[ \/]([\w.]+)/.exec(b) || /(msie) ([\w.]+)/.exec(b) || [];
-    g = b[1];
-    b = parseFloat(b[2]);
-    switch (g) {
-        case "msie":
-            g = "ie";
-            b = n.documentMode || b;
-            break;
-        case "firefox":
-            g = "ff";
-            break;
-        case "ipod":
-        case "ipad":
-        case "iphone":
-            g =
-                "ios";
-            break;
-        case "webkit":
-            g = "safari"
-    }
-    h.browser = {name:g, version:b};
-    h.browser[g] = !0;
-    for (var v = 0, x = c.browsers.length; v < x; v++)for (var i in c.browsers[v])if (g === i) {
-        f(i);
-        for (var A = c.browsers[v][i].max, l = c.browsers[v][i].min; l <= A; l++)b > l ? (c.browserCss.gt && f("gt-" + i + l), c.browserCss.gte && f("gte-" + i + l)) : b < l ? (c.browserCss.lt && f("lt-" + i + l), c.browserCss.lte && f("lte-" + i + l)) : b === l && (c.browserCss.lte && f("lte-" + i + l), c.browserCss.eq && f("eq-" + i + l), c.browserCss.gte && f("gte-" + i + l))
-    } else f("no-" + i);
-    "ie" === g && 9 > b && k("abbr article aside audio canvas details figcaption figure footer header hgroup mark meter nav output progress section summary time video".split(" "),
-        function (a) {
-            n.createElement(a)
-        });
-    k(t.pathname.split("/"), function (a, b) {
-        if (2 < this.length && this[b + 1] !== w)b && f(this.slice(1, b + 1).join("-").toLowerCase() + c.section); else {
-            var g = a || "index", h = g.indexOf(".");
-            0 < h && (g = g.substring(0, h));
-            q.id = g.toLowerCase() + c.page;
-            b || f("root" + c.section)
-        }
-    });
-    h.screen = {height:a.screen.height, width:a.screen.width};
-    s();
-    var u = 0;
-    a.addEventListener ? a.addEventListener("resize", r, !1) : a.attachEvent("onresize", r)
-})(window);
-(function (a, w) {
-    function f(a) {
-        var f = a.charAt(0).toUpperCase() + a.substr(1), a = (a + " " + r.join(f + " ") + f).split(" "), c;
-        a:{
-            for (c in a)if (k[a[c]] !== w) {
-                c = !0;
-                break a
-            }
-            c = !1
-        }
-        return!!c
-    }
-
-    var m = a.document.createElement("i"), k = m.style, s = " -o- -moz- -ms- -webkit- -khtml- ".split(" "), r = ["Webkit", "Moz", "O", "ms", "Khtml"], n = a[a.head_conf && a.head_conf.head || "head"], g = {gradient:function () {
-        k.cssText = ("background-image:" + s.join("gradient(linear,left top,right bottom,from(#9f9),to(#fff));background-image:") + s.join("linear-gradient(left top,#eee,#fff);background-image:")).slice(0,
-            -17);
-        return!!k.backgroundImage
-    }, rgba:function () {
-        k.cssText = "background-color:rgba(0,0,0,0.5)";
-        return!!k.backgroundColor
-    }, opacity:function () {
-        return"" === m.style.opacity
-    }, textshadow:function () {
-        return"" === k.textShadow
-    }, multiplebgs:function () {
-        k.cssText = "background:url(//:),url(//:),red url(//:)";
-        return/(url\s*\(.*?){3}/.test(k.background)
-    }, boxshadow:function () {
-        return f("boxShadow")
-    }, borderimage:function () {
-        return f("borderImage")
-    }, borderradius:function () {
-        return f("borderRadius")
-    }, cssreflections:function () {
-        return f("boxReflect")
-    },
-        csstransforms:function () {
-            return f("transform")
-        }, csstransitions:function () {
-            return f("transition")
-        }, touch:function () {
-            return"ontouchstart"in a
-        }, retina:function () {
-            return 1 < a.devicePixelRatio
-        }, fontface:function () {
-            var a = n.browser.version;
-            switch (n.browser.name) {
-                case "ie":
-                    return 9 <= a;
-                case "chrome":
-                    return 13 <= a;
-                case "ff":
-                    return 6 <= a;
-                case "ios":
-                    return 5 <= a;
-                case "android":
-                    return!1;
-                case "webkit":
-                    return 5.1 <= a;
-                case "opera":
-                    return 10 <= a;
-                default:
-                    return!1
-            }
-        }}, t;
-    for (t in g)g[t] && n.feature(t, g[t].call(), !0);
-    n.feature()
-})(window);
-(function (a, w) {
-    function f() {
-    }
-
-    function m(j, a) {
-        if (j) {
-            "object" === typeof j && (j = [].slice.call(j));
-            for (var b = 0, c = j.length; b < c; b++)a.call(j, j[b], b)
-        }
-    }
-
-    function k(a, b) {
-        var e = Object.prototype.toString.call(b).slice(8, -1);
-        return b !== w && null !== b && e === a
-    }
-
-    function s(a) {
-        return k("Function", a)
-    }
-
-    function r(a) {
-        a = a || f;
-        a._done || (a(), a._done = 1)
-    }
-
-    function n(a) {
-        var b = {};
-        if ("object" === typeof a)for (var e in a)a[e] && (b = {name:e, url:a[e]}); else b = a.split("/"), b = b[b.length - 1], e = b.indexOf("?"), b = {name:-1 !== e ? b.substring(0, e) : b, url:a};
-        return(a = i[b.name]) && a.url === b.url ? a : i[b.name] = b
-    }
-
-    function g(a) {
-        var a = a || i, b;
-        for (b in a)if (a.hasOwnProperty(b) && a[b].state !== y)return!1;
-        return!0
-    }
-
-    function t(a, b) {
-        b = b || f;
-        a.state === y ? b() : a.state === D ? d.ready(a.name, b) : a.state === C ? a.onpreload.push(function () {
-            t(a, b)
-        }) : (a.state = D, q(a, function () {
-            a.state = y;
-            b();
-            m(x[a.name], function (a) {
-                r(a)
-            });
-            u && g() && m(x.ALL, function (a) {
-                r(a)
-            })
-        }))
-    }
-
-    function q(j, c) {
-        var c = c || f, e;
-        /\.css[^\.]*$/.test(j.url) ? (e = b.createElement("link"), e.type = "text/" + (j.type || "css"), e.rel = "stylesheet",
-            e.href = j.url) : (e = b.createElement("script"), e.type = "text/" + (j.type || "javascript"), e.src = j.url);
-        e.onload = e.onreadystatechange = function (j) {
-            j = j || a.event;
-            if ("load" === j.type || /loaded|complete/.test(e.readyState) && (!b.documentMode || 9 > b.documentMode))e.onload = e.onreadystatechange = e.onerror = null, c()
-        };
-        e.onerror = function () {
-            e.onload = e.onreadystatechange = e.onerror = null;
-            c()
-        };
-        e.async = !1;
-        e.defer = !1;
-        var d = b.head || b.getElementsByTagName("head")[0];
-        d.insertBefore(e, d.lastChild)
-    }
-
-    function p() {
-        b.body ? u || (u = !0, m(h, function (a) {
-            r(a)
-        })) :
-            (a.clearTimeout(d.readyTimeout), d.readyTimeout = a.setTimeout(p, 50))
-    }
-
-    function c() {
-        b.addEventListener ? (b.removeEventListener("DOMContentLoaded", c, !1), p()) : "complete" === b.readyState && (b.detachEvent("onreadystatechange", c), p())
-    }
-
-    var b = a.document, h = [], v = [], x = {}, i = {}, A = "async"in b.createElement("script") || "MozAppearance"in b.documentElement.style || a.opera, l, u, B = a.head_conf && a.head_conf.head || "head", d = a[B] = a[B] || function () {
-        d.ready.apply(null, arguments)
-    }, C = 1, D = 3, y = 4;
-    d.load = A ? function () {
-        var a = arguments, b = a[a.length -
-            1], e = {};
-        s(b) || (b = null);
-        m(a, function (c, d) {
-            c !== b && (c = n(c), e[c.name] = c, t(c, b && d === a.length - 2 ? function () {
-                g(e) && r(b)
-            } : null))
-        });
-        return d
-    } : function () {
-        var a = arguments, b = [].slice.call(a, 1), c = b[0];
-        if (!l)return v.push(function () {
-            d.load.apply(null, a)
-        }), d;
-        c ? (m(b, function (a) {
-            if (!s(a)) {
-                var b = n(a);
-                b.state === w && (b.state = C, b.onpreload = [], q({url:b.url, type:"cache"}, function () {
-                    b.state = 2;
-                    m(b.onpreload, function (a) {
-                        a.call()
-                    })
-                }))
-            }
-        }), t(n(a[0]), s(c) ? c : function () {
-            d.load.apply(null, b)
-        })) : t(n(a[0]));
-        return d
-    };
-    d.js = d.load;
-    d.test =
-        function (a, b, c, g) {
-            a = "object" === typeof a ? a : {test:a, success:b ? k("Array", b) ? b : [b] : !1, failure:c ? k("Array", c) ? c : [c] : !1, callback:g || f};
-            (b = !!a.test) && a.success ? (a.success.push(a.callback), d.load.apply(null, a.success)) : !b && a.failure ? (a.failure.push(a.callback), d.load.apply(null, a.failure)) : g();
-            return d
-        };
-    d.ready = function (a, c) {
-        if (a === b)return u ? r(c) : h.push(c), d;
-        s(a) && (c = a, a = "ALL");
-        if ("string" !== typeof a || !s(c))return d;
-        var e = i[a];
-        if (e && e.state === y || "ALL" === a && g() && u)return r(c), d;
-        (e = x[a]) ? e.push(c) : x[a] = [c];
-        return d
-    };
-    d.ready(b, function () {
-        g() && m(x.ALL, function (a) {
-            r(a)
-        });
-        d.feature && d.feature("domloaded", !0)
-    });
-    if ("complete" === b.readyState)p(); else if (b.addEventListener)b.addEventListener("DOMContentLoaded", c, !1), a.addEventListener("load", p, !1); else {
-        b.attachEvent("onreadystatechange", c);
-        a.attachEvent("onload", p);
-        var z = !1;
-        try {
-            z = null == a.frameElement && b.documentElement
-        } catch (F) {
-        }
-        z && z.doScroll && function E() {
-            if (!u) {
-                try {
-                    z.doScroll("left")
-                } catch (b) {
-                    a.clearTimeout(d.readyTimeout);
-                    d.readyTimeout = a.setTimeout(E, 50);
-                    return
-                }
-                p()
-            }
-        }()
-    }
-    setTimeout(function () {
-        l = !0;
-        m(v, function (a) {
-            a()
-        })
-    }, 300)
-})(window);
diff --git a/app/design/frontend/magento_plushe/js/sticky.js b/app/design/frontend/magento_plushe/js/sticky.js
index 2ebd90c1f143d731ea6d406277ee00b07bb0692a..64000be11e584f87765e09849300b8041f778630 100644
--- a/app/design/frontend/magento_plushe/js/sticky.js
+++ b/app/design/frontend/magento_plushe/js/sticky.js
@@ -17,8 +17,6 @@
  * versions in the future. If you wish to customize Magento for your
  * needs please refer to http://www.magentocommerce.com for more information.
  *
- * @category    EE
- * @package     EE_refrence
  * @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)
  */
@@ -58,4 +56,4 @@
             }
         }
     });
-})(jQuery, window);
\ No newline at end of file
+})(jQuery, window);
diff --git a/app/design/frontend/magento_plushe/less/styles.less b/app/design/frontend/magento_plushe/less/styles.less
index 2a5ddb95c480b8934360b55ee68a736ae7280362..ce54fa847d4053d718b55d66a2d76a4f116152dc 100644
--- a/app/design/frontend/magento_plushe/less/styles.less
+++ b/app/design/frontend/magento_plushe/less/styles.less
@@ -854,6 +854,21 @@ body {
     dd.complete {
         padding: 0;
         margin: 0 0 30px;
+        .cards.items {
+            dd {
+                margin-left: 0;
+                .card.item {
+                    font-size: 12px;
+                    margin: 5px 0 10px;
+                    dt {
+                        font-weight: bold;
+                    }
+                    dd {
+                        margin-bottom: 5px;
+                    }
+                }
+            }
+        }
     }
     address {
         font-style: normal;
diff --git a/dev/tests/integration/framework/Magento/TestFramework/Helper/Memory.php b/dev/tests/integration/framework/Magento/TestFramework/Helper/Memory.php
index 95b314cf9219fd8c4c0cabd99aa18b70b23066b8..942e7431c1fd5e1bd2645a0d6640472677b660ea 100644
--- a/dev/tests/integration/framework/Magento/TestFramework/Helper/Memory.php
+++ b/dev/tests/integration/framework/Magento/TestFramework/Helper/Memory.php
@@ -85,7 +85,11 @@ class Memory
     protected function _getUnixProcessMemoryUsage($pid)
     {
         // RSS - resident set size, the non-swapped physical memory
-        $output = $this->_shell->execute('ps --pid %s --format rss --no-headers', array($pid));
+        $command = 'ps --pid %s --format rss --no-headers';
+        if ($this->isMacOS()) {
+            $command = 'ps -p %s -o rss=';
+        }
+        $output = $this->_shell->execute($command, array($pid));
         $result = $output . 'k'; // kilobytes
         return self::convertToBytes($result);
     }
@@ -165,4 +169,15 @@ class Memory
         }
         return preg_replace('/\D+/', '', $number);
     }
+
+    /**
+     * Whether the operating system belongs to the Mac family
+     *
+     * @link http://php.net/manual/en/function.php-uname.php
+     * @return boolean
+     */
+    public static function isMacOs()
+    {
+        return (strtoupper(PHP_OS) === 'DARWIN');
+    }
 }
diff --git a/dev/tests/integration/framework/bootstrap.php b/dev/tests/integration/framework/bootstrap.php
index 6b6976c618e72689325e49559139e377b6515e67..0663d27b189505dc8224c80d05e63d297938dd5d 100644
--- a/dev/tests/integration/framework/bootstrap.php
+++ b/dev/tests/integration/framework/bootstrap.php
@@ -71,7 +71,7 @@ $bootstrap->runBootstrap();
 
 \Magento\TestFramework\Helper\Bootstrap::setInstance(new \Magento\TestFramework\Helper\Bootstrap($bootstrap));
 
-Magento\TestFramework\Utility\Files::init(new Magento\TestFramework\Utility\Files($magentoBaseDir));
+Magento\TestFramework\Utility\Files::setInstance(new Magento\TestFramework\Utility\Files($magentoBaseDir));
 
 /* Unset declared global variables to release the PHPUnit from maintaining their values between tests */
 unset($bootstrap);
diff --git a/dev/tests/integration/testsuite/Magento/Backend/Utility/Controller.php b/dev/tests/integration/testsuite/Magento/Backend/Utility/Controller.php
index 9d912e5d93835908b87aa905fd326873627f3ce2..250e1309b59f420d7915ee91dc7fce784679d046 100644
--- a/dev/tests/integration/testsuite/Magento/Backend/Utility/Controller.php
+++ b/dev/tests/integration/testsuite/Magento/Backend/Utility/Controller.php
@@ -52,9 +52,20 @@ class Controller extends \Magento\TestFramework\TestCase\AbstractController
 
         $this->_auth = $this->_objectManager->get('Magento\Backend\Model\Auth');
         $this->_session = $this->_auth->getAuthStorage();
-        $this->_auth->login(
-            \Magento\TestFramework\Bootstrap::ADMIN_NAME,
-            \Magento\TestFramework\Bootstrap::ADMIN_PASSWORD
+        $credentials = $this->_getAdminCredentials();
+        $this->_auth->login($credentials['user'], $credentials['password']);
+    }
+
+    /**
+     * Get credentials to login admin user
+     *
+     * @return array
+     */
+    protected function _getAdminCredentials()
+    {
+        return array(
+            'user' => \Magento\TestFramework\Bootstrap::ADMIN_NAME,
+            'password' => \Magento\TestFramework\Bootstrap::ADMIN_PASSWORD,
         );
     }
 
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Helper/CategoryTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Helper/CategoryTest.php
index a6d49296ea43b61866e7cd4013e84a3e4c2c2e97..c95aabab12897a2f3c84508201b2fdadf432b532 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Helper/CategoryTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Helper/CategoryTest.php
@@ -59,7 +59,10 @@ class CategoryTest extends \PHPUnit_Framework_TestCase
         $categories = $this->_helper->getStoreCategories();
         $this->assertInstanceOf('Magento\Data\Tree\Node\Collection', $categories);
         $index = 0;
-        $expectedPaths = array(array(3, '1/2/3'), array(6, '1/2/6'), array(7, '1/2/7'));
+        $expectedPaths = array(
+            array(3, '1/2/3'), array(6, '1/2/6'), array(7, '1/2/7'),
+            array(9, '1/2/9'), array(10, '1/2/10'), array(11, '1/2/11'),
+        );
         foreach ($categories as $category) {
             $this->assertInstanceOf('Magento\Data\Tree\Node', $category);
             $this->assertEquals($expectedPaths[$index][0], $category->getId());
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/CategoryTreeTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/CategoryTreeTest.php
index 0c118a9614d2769a0b25d2d22ebc6b7e481400c5..85152f1979b36e4aa685191f455b476d15395158 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/CategoryTreeTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/CategoryTreeTest.php
@@ -47,6 +47,44 @@ class CategoryTreeTest extends \PHPUnit_Framework_TestCase
             ->create('Magento\Catalog\Model\Category');
     }
 
+    /**
+     * Load category
+     *
+     * @param $categoryId
+     * @return Category
+     */
+    protected function loadCategory($categoryId)
+    {
+        $this->_model->setData(array());
+        $this->_model->load($categoryId);
+        return $this->_model;
+    }
+
+    public function testMovePosition()
+    {
+        //move category 9 to new parent 6 with afterCategoryId = null
+        $category = $this->loadCategory(9);
+        $category->move(6, null);
+        $category = $this->loadCategory(9);
+        $this->assertEquals(1, $category->getPosition(), 'Position must be 1, if $afterCategoryId was null|false|0');
+        $category = $this->loadCategory(10);
+        $this->assertEquals(5, $category->getPosition(), 'Category 10 position must decrease after Category 9 moved');
+        $category = $this->loadCategory(11);
+        $this->assertEquals(6, $category->getPosition(), 'Category 11 position must decrease after Category 9 moved');
+        $category = $this->loadCategory(6);
+        $this->assertEquals(2, $category->getPosition(), 'Category 6 position must be the same');
+
+        //move category 11 to new parent 6 with afterCategoryId = 9
+        $category = $this->loadCategory(11);
+        $category->move(6, 9);
+        $category = $this->loadCategory(11);
+        $this->assertEquals(2, $category->getPosition(), 'Category 11 position must be after category 9');
+        $category = $this->loadCategory(10);
+        $this->assertEquals(5, $category->getPosition(), 'Category 10 position must be the same');
+        $category = $this->loadCategory(9);
+        $this->assertEquals(1, $category->getPosition(), 'Category 9 position must be 1');
+    }
+
     public function testMove()
     {
         $this->_model->load(7);
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductTest.php
index f3434c54f41906a0399e86eb50c9dfe8d9cdf5bc..30eb9cb1418db7593d0bc406103fbfefddf043be 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/ProductTest.php
@@ -153,6 +153,7 @@ class ProductTest extends \PHPUnit_Framework_TestCase
             $this->assertNotEquals($duplicate->getId(), $this->_model->getId());
             $this->assertNotEquals($duplicate->getSku(), $this->_model->getSku());
             $this->assertEquals(\Magento\Catalog\Model\Product\Status::STATUS_DISABLED, $duplicate->getStatus());
+            $this->assertEquals(\Magento\Core\Model\Store::DEFAULT_STORE_ID, $duplicate->getStoreId());
             $this->_undo($duplicate);
         } catch (\Exception $e) {
             $this->_undo($duplicate);
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/_files/categories.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/categories.php
index e3dc77a153add844e9c826f065bd79a94a7ac38c..a3cd9e68c132103453e8c61a8d1e986f0c2f6faa 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/_files/categories.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/_files/categories.php
@@ -35,7 +35,7 @@ $category = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
     ->create('Magento\Catalog\Model\Category');
 $category->setId(3)
     ->setName('Category 1')
-    ->setParentId(2) /**/
+    ->setParentId(2)
     ->setPath('1/2/3')
     ->setLevel(2)
     ->setAvailableSortBy('name')
@@ -48,7 +48,7 @@ $category = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
     ->create('Magento\Catalog\Model\Category');
 $category->setId(4)
     ->setName('Category 1.1')
-    ->setParentId(3) /**/
+    ->setParentId(3)
     ->setPath('1/2/3/4')
     ->setLevel(3)
     ->setAvailableSortBy('name')
@@ -62,13 +62,13 @@ $category = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
     ->create('Magento\Catalog\Model\Category');
 $category->setId(5)
     ->setName('Category 1.1.1')
-    ->setParentId(4) /**/
+    ->setParentId(4)
     ->setPath('1/2/3/4/5')
     ->setLevel(4)
     ->setAvailableSortBy('name')
     ->setDefaultSortBy('name')
     ->setIsActive(true)
-    ->setPosition(2)
+    ->setPosition(1)
     ->setCustomUseParentSettings(0)
     ->setCustomDesign('magento_blank')
     ->save();
@@ -77,7 +77,7 @@ $category = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
     ->create('Magento\Catalog\Model\Category');
 $category->setId(6)
     ->setName('Category 2')
-    ->setParentId(2) /**/
+    ->setParentId(2)
     ->setPath('1/2/6')
     ->setLevel(2)
     ->setAvailableSortBy('name')
@@ -90,7 +90,7 @@ $category = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
     ->create('Magento\Catalog\Model\Category');
 $category->setId(7)
     ->setName('Movable')
-    ->setParentId(2) /**/
+    ->setParentId(2)
     ->setPath('1/2/7')
     ->setLevel(2)
     ->setAvailableSortBy('name')
@@ -99,11 +99,50 @@ $category->setId(7)
     ->setPosition(3)
     ->save();
 
+$category = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+    ->create('Magento\Catalog\Model\Category');
+$category->setId(9)
+    ->setName('Movable Position 1')
+    ->setParentId(2)
+    ->setPath('1/2/9')
+    ->setLevel(2)
+    ->setAvailableSortBy('name')
+    ->setDefaultSortBy('name')
+    ->setIsActive(true)
+    ->setPosition(5)
+    ->save();
+
+$category = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+    ->create('Magento\Catalog\Model\Category');
+$category->setId(10)
+    ->setName('Movable Position 2')
+    ->setParentId(2)
+    ->setPath('1/2/10')
+    ->setLevel(2)
+    ->setAvailableSortBy('name')
+    ->setDefaultSortBy('name')
+    ->setIsActive(true)
+    ->setPosition(6)
+    ->save();
+
+$category = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+    ->create('Magento\Catalog\Model\Category');
+$category->setId(11)
+    ->setName('Movable Position 3')
+    ->setParentId(2)
+    ->setPath('1/2/11')
+    ->setLevel(2)
+    ->setAvailableSortBy('name')
+    ->setDefaultSortBy('name')
+    ->setIsActive(true)
+    ->setPosition(7)
+    ->save();
+
 $category = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
     ->create('Magento\Catalog\Model\Category');
 $category->setId(8)
     ->setName('Inactive')
-    ->setParentId(2) /**/
+    ->setParentId(2)
     ->setPath('1/2/8')
     ->setAvailableSortBy('name')
     ->setDefaultSortBy('name')
@@ -111,7 +150,6 @@ $category->setId(8)
     ->setPosition(4)
     ->save();
 
-
 /** @var $product \Magento\Catalog\Model\Product */
 $product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
     ->create('Magento\Catalog\Model\Product');
diff --git a/dev/tests/integration/testsuite/Magento/Checkout/Controller/OnepageTest.php b/dev/tests/integration/testsuite/Magento/Checkout/Controller/OnepageTest.php
index 78a80fa74e936fb1d2cf344a438f8e9f6094321b..ebe1a517a718a23d22142e2d4e5db74b9a7963b6 100644
--- a/dev/tests/integration/testsuite/Magento/Checkout/Controller/OnepageTest.php
+++ b/dev/tests/integration/testsuite/Magento/Checkout/Controller/OnepageTest.php
@@ -52,6 +52,7 @@ class OnepageTest extends \Magento\TestFramework\TestCase\AbstractController
         $this->assertContains('<li id="opc-payment"', $html);
         $this->assertSelectCount('[id="checkout-payment-method-load"]', 1, $html);
         $this->assertSelectCount('form[id="co-billing-form"][action=""]', 1, $html);
+        $this->assertSelectCount('form[id="co-payment-form"] input[name="form_key"]', 1, $html);
     }
 
     /**
@@ -92,6 +93,24 @@ class OnepageTest extends \Magento\TestFramework\TestCase\AbstractController
         $this->assertContains('Place Order', $this->getResponse()->getBody());
         $this->assertContains('checkout-review', $this->getResponse()->getBody());
     }
+
+    public function testSaveOrderActionWithoutFormKey()
+    {
+        $this->dispatch('checkout/onepage/saveOrder');
+        $this->assertRedirect($this->stringContains('checkout/onepage'));
+    }
+
+    public function testSaveOrderActionWithFormKey()
+    {
+        $formKey = $this->_objectManager->get('\Magento\Data\Form\FormKey');
+        $this->getRequest()->setParam('form_key', $formKey->getFormKey());
+        $this->dispatch('checkout/onepage/saveOrder');
+        $html = $this->getResponse()->getBody();
+        $this->assertEquals(
+            '{"success":false,"error":true,"error_messages":"Please specify a shipping method."}',
+            $html
+        );
+    }
 }
 
 
diff --git a/dev/tests/integration/testsuite/Magento/Customer/Service/CustomerTest.php b/dev/tests/integration/testsuite/Magento/Customer/Service/CustomerTest.php
index 29c5e2bfdba616a4421560d73fce96f5e620e838..db32c7fcd5daa6cff16921cdf1e728cc10d96422 100644
--- a/dev/tests/integration/testsuite/Magento/Customer/Service/CustomerTest.php
+++ b/dev/tests/integration/testsuite/Magento/Customer/Service/CustomerTest.php
@@ -65,7 +65,8 @@ class CustomerTest extends \PHPUnit_Framework_TestCase
             $this->_createdCustomer->getAddressesCollection()->delete();
             $this->_createdCustomer->delete();
         }
-        \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\Core\Model\StoreManagerInterface')
+        \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+            ->get('Magento\Core\Model\StoreManagerInterface')
             ->setCurrentStore($previousStoreId);
 
         $this->_model = null;
@@ -324,9 +325,9 @@ class CustomerTest extends \PHPUnit_Framework_TestCase
             ->load(1);
 
         $updatedCustomer = $this->_model->update($expected->getId(), $customerData);
+
         $this->assertInstanceOf('Magento\Customer\Model\Customer', $updatedCustomer);
         $this->assertFalse($updatedCustomer->isObjectNew());
-
         $actualData = $this->_customerFactory->create()
             ->load($expected->getId())->getData();
         $expectedData = array_merge($updatedCustomer->toArray(array_keys($actualData)), $customerData);
@@ -365,6 +366,24 @@ class CustomerTest extends \PHPUnit_Framework_TestCase
         );
     }
 
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     */
+    public function testUpdateFirstname()
+    {
+        $customer = $this->_customerFactory->create()->load(1);
+        // This call to getAttributes will cause our test to fail if the
+        // customer fixture was using attribute set 0 instead of 1
+        $customer->getAttributes();
+
+        $updatedCustomer = $this->_model->update(1, ['firstname' => 'new_name']);
+
+        $customer = $this->_customerFactory->create()->load(1);
+
+        $this->assertEquals('new_name', $customer->getFirstname());
+        $this->assertEquals('new_name', $updatedCustomer->getFirstname());
+    }
+
     /**
      * @param array $customerData
      * @param string $exceptionName
@@ -386,15 +405,24 @@ class CustomerTest extends \PHPUnit_Framework_TestCase
     public function updateExceptionsDataProvider()
     {
         return array(
-            'Invalid password' => array(array(
-                'password' => '111'
-            ), 'Magento\Eav\Model\Entity\Attribute\Exception'),
-            'Invalid name' => array(array(
-                'firstname' => null
-            ), 'Magento\Validator\ValidatorException'),
-            'Invalid email' => array(array(
-                'email' => '3434@23434'
-            ), 'Magento\Validator\ValidatorException')
+            'Invalid password' => array(
+                array(
+                    'password' => '111'
+                ),
+                'Magento\Eav\Model\Entity\Attribute\Exception'
+            ),
+            'Invalid name' => array(
+                array(
+                    'firstname' => null
+                ),
+                'Magento\Validator\ValidatorException'
+            ),
+            'Invalid email' => array(
+                array(
+                    'email' => '3434@23434'
+                ),
+                'Magento\Validator\ValidatorException'
+            )
         );
     }
 
@@ -416,9 +444,10 @@ class CustomerTest extends \PHPUnit_Framework_TestCase
         $oldPasswordHash = $this->_customerFactory->create()
             ->load(1)
             ->getPasswordHash();
-        $updatedCustomer = $this->_model->update(1, array(
-            'autogenerate_password' => true,
-        ));
+        $updatedCustomer = $this->_model->update(
+            1,
+            array('autogenerate_password' => true,)
+        );
         $this->assertNotEquals($oldPasswordHash, $updatedCustomer->getPasswordHash());
     }
 
@@ -435,8 +464,11 @@ class CustomerTest extends \PHPUnit_Framework_TestCase
             ->load(1);
         $this->assertCount(2, $customer->getAddresses(), 'Not all customer addresses were created.');
         $updatedCustomer = $this->_model->update(1, array(), $addressesData);
-        $this->assertCount(count($addressesData), $updatedCustomer->getAddresses(),
-            'Customer address was not deleted.');
+        $this->assertCount(
+            count($addressesData),
+            $updatedCustomer->getAddresses(),
+            'Customer address was not deleted.'
+        );
 
         /** @var \Magento\Customer\Model\Customer $actualCustomer */
         $actualCustomer = $this->_customerFactory->create()
@@ -515,15 +547,17 @@ class CustomerTest extends \PHPUnit_Framework_TestCase
             ->load(1);
         $customerData = array('firstname' => 'Updated name');
         $customer->addData($customerData);
-        $addressData = array(array(
-            'firstname' => 'John',
-            'lastname' => 'Smith',
-            'street' => 'Green str, 67',
-            'country_id' => 'AL',
-            'city' => 'CityM',
-            'postcode' => '75477',
-            'telephone' => '3468676',
-        ));
+        $addressData = array(
+            array(
+                'firstname' => 'John',
+                'lastname' => 'Smith',
+                'street' => 'Green str, 67',
+                'country_id' => 'AL',
+                'city' => 'CityM',
+                'postcode' => '75477',
+                'telephone' => '3468676',
+            )
+        );
 
         $callbackCount = 0;
         $callback = function ($actualCustomer, $actualData, $actualAddresses) use ($customer, $customerData,
@@ -533,8 +567,10 @@ class CustomerTest extends \PHPUnit_Framework_TestCase
             // Remove updated_at as in afterSave updated_at may be changed
             $expectedCustomerData = $customer->getData();
             unset($expectedCustomerData['updated_at']);
-            \PHPUnit_Framework_Assert::assertEquals($expectedCustomerData,
-                $actualCustomer->toArray(array_keys($expectedCustomerData)));
+            \PHPUnit_Framework_Assert::assertEquals(
+                $expectedCustomerData,
+                $actualCustomer->toArray(array_keys($expectedCustomerData))
+            );
             \PHPUnit_Framework_Assert::assertEquals($customerData, $actualData);
             \PHPUnit_Framework_Assert::assertEquals($addressData, $actualAddresses);
         };
diff --git a/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerAccountServiceTest.php b/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerAccountServiceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..1589d285eebc70a788aa94ff66a1aeeb65243448
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerAccountServiceTest.php
@@ -0,0 +1,434 @@
+<?php
+
+namespace Magento\Customer\Service\V1;
+use Magento\Customer\Service\V1;
+use Magento\Customer\Service\Entity\V1\Exception;
+
+/**
+ * Integration test for service layer \Magento\Customer\Service\CustomerV1
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ *
+ * @SuppressWarnings(PHPMD.TooManyMethods)
+ * @SuppressWarnings(PHPMD.ExcessivePublicCount)
+ */
+class CustomerAccountServiceTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var CustomerAccountServiceInterface */
+    private $_service;
+
+    /** @var CustomerServiceInterface needed to setup tests */
+    private $_customerService;
+
+    /** @var \Magento\ObjectManager */
+    private $_objectManager;
+
+    /** @var \Magento\Customer\Service\V1\Dto\Address[] */
+    private $_expectedAddresses;
+
+    /** @var \Magento\Customer\Service\V1\Dto\AddressBuilder */
+    private $_addressBuilder;
+
+    /** @var \Magento\Customer\Service\V1\Dto\CustomerBuilder */
+    private $_customerBuilder;
+
+    protected function setUp()
+    {
+        $this->_objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $this->_service = $this->_objectManager->create('Magento\Customer\Service\V1\CustomerAccountServiceInterface');
+        $this->_customerService = $this->_objectManager->create('Magento\Customer\Service\V1\CustomerServiceInterface');
+
+        $this->_addressBuilder = $this->_objectManager->create('Magento\Customer\Service\V1\Dto\AddressBuilder');
+        $this->_customerBuilder = $this->_objectManager->create('Magento\Customer\Service\V1\Dto\CustomerBuilder');
+
+        $this->_addressBuilder->setId(1)
+            ->setCountryId('US')
+            ->setCustomerId(1)
+            ->setDefaultBilling(true)
+            ->setDefaultShipping(true)
+            ->setPostcode('75477')
+            ->setRegion(new V1\Dto\Region([
+                'region_code' => 'AL',
+                'region' => 'Alabama',
+                'region_id' => 1
+            ]))
+            ->setStreet(['Green str, 67'])
+            ->setTelephone('3468676')
+            ->setCity('CityM')
+            ->setFirstname('John')
+            ->setLastname('Smith');
+        $address = $this->_addressBuilder->create();
+
+        /* XXX: would it be better to have a clear method for this? */
+        $this->_addressBuilder->setId(2)
+            ->setCountryId('US')
+            ->setCustomerId(1)
+            ->setDefaultBilling(false)
+            ->setDefaultShipping(false)
+            ->setPostcode('47676')
+            ->setRegion(new V1\Dto\Region([
+                'region_code' => 'AL',
+                'region' => 'Alabama',
+                'region_id' => 1
+            ]))
+            ->setStreet(['Black str, 48'])
+            ->setCity('CityX')
+            ->setTelephone('3234676')
+            ->setFirstname('John')
+            ->setLastname('Smith');
+        $address2 = $this->_addressBuilder->create();
+
+        $this->_expectedAddresses = [$address, $address2];
+    }
+
+
+    /**
+     * @magentoAppArea frontend
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     */
+    public function testLogin()
+    {
+        // Customer e-mail and password are pulled from the fixture customer.php
+        $customer = $this->_service->authenticate('customer@example.com', 'password', true);
+
+        $this->assertSame('customer@example.com', $customer->getEmail());
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     *
+     * @expectedException \Magento\Customer\Service\Entity\V1\Exception
+     * @expectedExceptionMessage Invalid login or password
+     */
+    public function testLoginWrongPassword()
+    {
+        // Customer e-mail and password are pulled from the fixture customer.php
+        $this->_service->authenticate('customer@example.com', 'wrongPassword', true);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     *
+     * @expectedException \Magento\Customer\Service\Entity\V1\Exception
+     * @expectedExceptionMessage Invalid login or password
+     */
+    public function testLoginWrongUsername()
+    {
+        // Customer e-mail and password are pulled from the fixture customer.php
+        $this->_service->authenticate('non_existing_user', 'password', true);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/inactive_customer.php
+     * @magentoAppArea frontend
+     */
+    public function testActivateAccount()
+    {
+        /** @var \Magento\Customer\Model\Customer $customerModel */
+        $customerModel = $this->_objectManager->create('Magento\Customer\Model\Customer');
+        $customerModel->load(1);
+        // Assert in just one test that the fixture is working
+        $this->assertNotNull($customerModel->getConfirmation(), 'New customer needs to be confirmed');
+
+        $this->_service->activateAccount($customerModel->getId(), $customerModel->getConfirmation());
+
+        $customerModel = $this->_objectManager->create('Magento\Customer\Model\Customer');
+        $customerModel->load(1);
+        $this->assertNull($customerModel->getConfirmation(), 'Customer should be considered confirmed now');
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/inactive_customer.php
+     *
+     * @expectedException \Magento\Core\Exception
+     * @expectedExceptionMessage Wrong confirmation key
+     */
+    public function testActivateAccountWrongKey()
+    {
+        /** @var \Magento\Customer\Model\Customer $customerModel */
+        $customerModel = $this->_objectManager->create('Magento\Customer\Model\Customer');
+        $customerModel->load(1);
+        $key = $customerModel->getConfirmation();
+
+        $this->_service->activateAccount($customerModel->getId(), $key . $key);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/inactive_customer.php
+     *
+     * @expectedException \Magento\Customer\Service\Entity\V1\Exception
+     * @expectedExceptionMessage No customer with customerId 12341 exists.
+     */
+    public function testActivateAccountWrongAccount()
+    {
+        /** @var \Magento\Customer\Model\Customer $customerModel */
+        $customerModel = $this->_objectManager->create('Magento\Customer\Model\Customer');
+        $customerModel->load(1);
+        $key = $customerModel->getConfirmation();
+
+        $this->_service->activateAccount('1234' . $customerModel->getId(), $key);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/inactive_customer.php
+     * @magentoAppArea frontend
+     *
+     * @expectedException  \Magento\Customer\Service\Entity\V1\Exception
+     * @expectedExceptionMessage Customer account is already active
+     */
+    public function testActivateAccountAlreadyActive()
+    {
+        /** @var \Magento\Customer\Model\Customer $customerModel */
+        $customerModel = $this->_objectManager->create('Magento\Customer\Model\Customer');
+        $customerModel->load(1);
+        $key = $customerModel->getConfirmation();
+        $this->_service->activateAccount($customerModel->getId(), $key);
+
+        $this->_service->activateAccount($customerModel->getId(), $key);
+    }
+
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     */
+    public function testValidateResetPasswordLinkToken()
+    {
+        $this->_customerBuilder->populateWithArray(array_merge($this->_customerService->getCustomer(1)->__toArray(), [
+            'rp_token' => 'token',
+            'rp_token_created_at' => date('Y-m-d')
+        ]));
+        $this->_customerService->saveCustomer($this->_customerBuilder->create());
+
+        $this->_service->validateResetPasswordLinkToken(1, 'token');
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     *
+     * @expectedException Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_RESET_TOKEN_EXPIRED
+     */
+    public function testValidateResetPasswordLinkTokenExpired()
+    {
+        $this->_service->validateResetPasswordLinkToken(1, 'some_token');
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     *
+     * @expectedException Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_INVALID_RESET_TOKEN
+     */
+    public function testValidateResetPasswordLinkTokenInvalid()
+    {
+        $this->_service->validateResetPasswordLinkToken(0, null);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     *
+     * @expectedException Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_INVALID_CUSTOMER_ID
+     * @expectedExceptionMessage No customer with customerId 4200 exists
+     */
+    public function testValidateResetPasswordLinkTokenWrongUser()
+    {
+        $resetToken = 'lsdj579slkj5987slkj595lkj';
+
+
+        $this->_service->validateResetPasswordLinkToken(4200, $resetToken);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     *
+     * @expectedException Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_INVALID_RESET_TOKEN
+     * @expectedExceptionMessage Invalid password reset token
+     */
+    public function testValidateResetPasswordLinkTokenNull()
+    {
+        $this->_service->validateResetPasswordLinkToken(null, null);
+    }
+
+    /**
+     * @magentoAppArea frontend
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     */
+    public function testSendPasswordResetLink()
+    {
+        $email = 'customer@example.com';
+
+        $this->_service->sendPasswordResetLink($email, 1);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     *
+     * @expectedException Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_EMAIL_NOT_FOUND
+     * @expectedExceptionMessage No customer found for the provided email and website ID
+     */
+    public function testSendPasswordResetLinkBadEmailOrWebsite()
+    {
+        $email = 'foo@example.com';
+
+        $this->_service->sendPasswordResetLink($email, 0);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     */
+    public function testResetPassword()
+    {
+        $resetToken = 'lsdj579slkj5987slkj595lkj';
+        $password = 'password_secret';
+
+        $this->_customerBuilder->populateWithArray(array_merge($this->_customerService->getCustomer(1)->__toArray(), [
+            'rp_token' => $resetToken,
+            'rp_token_created_at' => date('Y-m-d')
+        ]));
+        $this->_customerService->saveCustomer($this->_customerBuilder->create());
+
+        $this->_service->resetPassword(1, $password, $resetToken);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     *
+     * @expectedException Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_RESET_TOKEN_EXPIRED
+     * @expectedExceptionMessage Your password reset link has expired.
+     */
+    public function testResetPasswordTokenExpired()
+    {
+        $resetToken = 'lsdj579slkj5987slkj595lkj';
+        $password = 'password_secret';
+
+        $this->_customerBuilder->populateWithArray(array_merge($this->_customerService->getCustomer(1)->__toArray(), [
+            'rp_token' => $resetToken,
+            'rp_token_created_at' => '1970-01-01'
+        ]));
+        $this->_customerService->saveCustomer($this->_customerBuilder->create());
+
+        $this->_service->resetPassword(1, $password, $resetToken);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     *
+     * @expectedException Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_RESET_TOKEN_EXPIRED
+     * @expectedExceptionMessage Your password reset link has expired.
+     */
+    public function testResetPasswordTokenInvalid()
+    {
+        $resetToken = 'lsdj579slkj5987slkj595lkj';
+        $invalidToken = $resetToken . 'invalid';
+        $password = 'password_secret';
+
+        $this->_customerBuilder->populateWithArray(array_merge($this->_customerService->getCustomer(1)->__toArray(), [
+            'rp_token' => $resetToken,
+            'rp_token_created_at' => date('Y-m-d')
+        ]));
+        $this->_customerService->saveCustomer($this->_customerBuilder->create());
+
+        $this->_service->resetPassword(1, $password, $invalidToken);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     *
+     * @expectedException Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_INVALID_CUSTOMER_ID
+     * @expectedExceptionMessage No customer with customerId 4200 exists
+     */
+    public function testResetPasswordTokenWrongUser()
+    {
+        $resetToken = 'lsdj579slkj5987slkj595lkj';
+        $password = 'password_secret';
+
+        $this->_customerBuilder->populateWithArray(array_merge($this->_customerService->getCustomer(1)->__toArray(), [
+            'rp_token' => $resetToken,
+            'rp_token_created_at' => date('Y-m-d')
+        ]));
+        $this->_customerService->saveCustomer($this->_customerBuilder->create());
+
+        $this->_service->resetPassword(4200, $password, $resetToken);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     *
+     * @expectedException Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_INVALID_RESET_TOKEN
+     * @expectedExceptionMessage Invalid password reset token
+     */
+    public function testResetPasswordTokenInvalidUserId()
+    {
+        $resetToken = 'lsdj579slkj5987slkj595lkj';
+        $password = 'password_secret';
+
+        $this->_customerBuilder->populateWithArray(array_merge($this->_customerService->getCustomer(1)->__toArray(), [
+            'rp_token' => $resetToken,
+            'rp_token_created_at' => date('Y-m-d')
+        ]));
+        $this->_customerService->saveCustomer($this->_customerBuilder->create());
+
+        $this->_service->resetPassword(0, $password, $resetToken);
+    }
+
+    /**
+     * @magentoAppArea frontend
+     * @magentoAppIsolation enabled
+     * @magentoDataFixture Magento/Customer/_files/inactive_customer.php
+     */
+    public function testSendConfirmation()
+    {
+        $this->_service->sendConfirmation('customer@needAconfirmation.com');
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     *
+     * @expectedException Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_EMAIL_NOT_FOUND
+     */
+    public function testSendConfirmationNoEmail()
+    {
+        $this->_service->sendConfirmation('wrongemail@example.com');
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     *
+     * @expectedException Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_CONFIRMATION_NOT_NEEDED
+     */
+    public function testSendConfirmationNotNeeded()
+    {
+        $this->_service->sendConfirmation('customer@example.com');
+    }
+
+
+
+}
diff --git a/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerAddressServiceTest.php b/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerAddressServiceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..91fbe7dd24af90d1f0741d365336083627d94eb3
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerAddressServiceTest.php
@@ -0,0 +1,568 @@
+<?php
+
+namespace Magento\Customer\Service\V1;
+use Magento\Customer\Service\V1;
+use Magento\Customer\Service\Entity\V1\Exception;
+
+/**
+ * Integration test for service layer \Magento\Customer\Service\V1\CustomerAddressService
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ *
+ * @SuppressWarnings(PHPMD.TooManyMethods)
+ * @SuppressWarnings(PHPMD.ExcessivePublicCount)
+ */
+class CustomerAddressServiceTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var CustomerAddressServiceInterface */
+    private $_service;
+
+    /** @var \Magento\ObjectManager */
+    private $_objectManager;
+
+    /** @var \Magento\Customer\Service\V1\Dto\Address[] */
+    private $_expectedAddresses;
+
+    /** @var \Magento\Customer\Service\V1\Dto\AddressBuilder */
+    private $_addressBuilder;
+
+    /** @var \Magento\Customer\Service\V1\Dto\CustomerBuilder */
+    private $_customerBuilder;
+
+    protected function setUp()
+    {
+        $this->_objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $this->_service = $this->_objectManager->create('Magento\Customer\Service\V1\CustomerAddressServiceInterface');
+
+        $this->_addressBuilder = $this->_objectManager->create('Magento\Customer\Service\V1\Dto\AddressBuilder');
+        $this->_customerBuilder = $this->_objectManager->create('Magento\Customer\Service\V1\Dto\CustomerBuilder');
+
+        $this->_addressBuilder->setId(1)
+            ->setCountryId('US')
+            ->setCustomerId(1)
+            ->setDefaultBilling(true)
+            ->setDefaultShipping(true)
+            ->setPostcode('75477')
+            ->setRegion(new V1\Dto\Region([
+                'region_code' => 'AL',
+                'region' => 'Alabama',
+                'region_id' => 1
+            ]))
+            ->setStreet(['Green str, 67'])
+            ->setTelephone('3468676')
+            ->setCity('CityM')
+            ->setFirstname('John')
+            ->setLastname('Smith');
+        $address = $this->_addressBuilder->create();
+
+        /* XXX: would it be better to have a clear method for this? */
+        $this->_addressBuilder->setId(2)
+            ->setCountryId('US')
+            ->setCustomerId(1)
+            ->setDefaultBilling(false)
+            ->setDefaultShipping(false)
+            ->setPostcode('47676')
+            ->setRegion(new V1\Dto\Region([
+                'region_code' => 'AL',
+                'region' => 'Alabama',
+                'region_id' => 1
+            ]))
+            ->setStreet(['Black str, 48'])
+            ->setCity('CityX')
+            ->setTelephone('3234676')
+            ->setFirstname('John')
+            ->setLastname('Smith');
+        $address2 = $this->_addressBuilder->create();
+
+        $this->_expectedAddresses = [$address, $address2];
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     * @magentoDataFixture Magento/Customer/_files/customer_address.php
+     * @magentoDataFixture Magento/Customer/_files/customer_two_addresses.php
+     * @magentoAppIsolation enabled
+     */
+    public function testSaveAddressChanges()
+    {
+        $customerId = 1;
+        $address = $this->_service->getAddressById($customerId, 2);
+        $proposedAddressBuilder = $this->_addressBuilder->populate($address);
+        $proposedAddressBuilder->setTelephone('555' . $address->getTelephone());
+        $proposedAddress = $proposedAddressBuilder->create();
+
+        $this->_service->saveAddresses($customerId, [$proposedAddress]);
+
+        $addresses = $this->_service->getAddresses($customerId);
+        $this->assertEquals(2, count($addresses));
+        $this->assertNotEquals($this->_expectedAddresses[1], $addresses[1]);
+        $this->_assertAddressAndRegionArrayEquals($proposedAddress->__toArray(), $addresses[1]->__toArray());
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     * @magentoDataFixture Magento/Customer/_files/customer_address.php
+     * @magentoDataFixture Magento/Customer/_files/customer_two_addresses.php
+     * @magentoAppIsolation enabled
+     */
+    public function testSaveAddressesIdSetButNotAlreadyExisting()
+    {
+        $proposedAddressBuilder = $this->_createSecondAddressBuilder()
+            ->setFirstname('Jane')
+            ->setId(4200);
+        $proposedAddress = $proposedAddressBuilder->create();
+
+        $customerId = 1;
+        $this->_service->saveAddresses($customerId, [$proposedAddress]);
+        $addresses = $this->_service->getAddresses($customerId);
+        $this->assertEquals($this->_expectedAddresses[0], $addresses[0]);
+        $this->assertEquals($this->_expectedAddresses[1], $addresses[1]);
+
+        $expectedThirdAddressBuilder = $this->_addressBuilder->populate($proposedAddress);
+        // set id
+        $expectedThirdAddressBuilder->setId($addresses[2]->getId());
+        $expectedThirdAddress = $expectedThirdAddressBuilder->create();
+        $this->_assertAddressAndRegionArrayEquals($expectedThirdAddress->__toArray(), $addresses[2]->__toArray());
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     * @magentoDataFixture Magento/Customer/_files/customer_address.php
+     * @magentoDataFixture Magento/Customer/_files/customer_two_addresses.php
+     * @magentoAppIsolation enabled
+     */
+    public function testGetAddresses()
+    {
+        $customerId = 1;
+        $addresses = $this->_service->getAddresses($customerId);
+        $this->assertEquals(2, count($this->_expectedAddresses) );
+        $this->assertEquals(2, count($addresses) );
+        $this->_assertAddressAndRegionArrayEquals(
+            $this->_expectedAddresses[0]->__toArray(),
+            $addresses[0]->__toArray()
+        );
+        $this->_assertAddressAndRegionArrayEquals(
+            $this->_expectedAddresses[1]->__toArray(),
+            $addresses[1]->__toArray()
+        );
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     * @magentoDataFixture Magento/Customer/_files/customer_address.php
+     * @magentoDataFixture Magento/Customer/_files/customer_two_addresses.php
+     * @magentoAppIsolation enabled
+     */
+    public function testGetDefaultBillingAddress()
+    {
+        $customerId = 1;
+        $address = $this->_service->getDefaultBillingAddress($customerId);
+        $this->assertEquals($this->_expectedAddresses[0], $address);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     * @magentoDataFixture Magento/Customer/_files/customer_address.php
+     * @magentoDataFixture Magento/Customer/_files/customer_two_addresses.php
+     * @magentoAppIsolation enabled
+     */
+    public function testGetAddressById()
+    {
+        $customerId = 1;
+        $addressId = 2;
+        $addresses = $this->_service->getAddressById($customerId, $addressId);
+        $this->assertEquals($this->_expectedAddresses[1], $addresses);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     *
+     * @expectedException Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_ADDRESS_NOT_FOUND
+     */
+    public function testGetAddressByIdBadAddrId()
+    {
+        // Should throw the address not found excetion
+        $this->_service->getAddressById(1, 12345);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     * @magentoDataFixture Magento/Customer/_files/customer_address.php
+     * @magentoAppIsolation enabled
+     */
+    public function testSaveNewAddress()
+    {
+        $proposedAddressBuilder = $this->_createSecondAddressBuilder();
+        $proposedAddress = $proposedAddressBuilder->create();
+        $customerId = 1;
+
+        $this->_service->saveAddresses($customerId, [$proposedAddress]);
+        $addresses = $this->_service->getAddresses($customerId);
+        $this->assertEquals($this->_expectedAddresses[0], $addresses[0]);
+        $expectedNewAddressBuilder = $this->_addressBuilder->populate($this->_expectedAddresses[1]);
+        $expectedNewAddressBuilder
+            ->setId($addresses[1]->getId());
+        $expectedNewAddress = $expectedNewAddressBuilder->create();
+        $this->assertEquals($expectedNewAddress->__toArray(), $addresses[1]->__toArray());
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     * @magentoDataFixture Magento/Customer/_files/customer_address.php
+     * @magentoAppIsolation enabled
+     */
+    public function testSaveNewAddressWithAttributes()
+    {
+        $this->_addressBuilder->populateWithArray(array_merge($this->_expectedAddresses[1]->__toArray(), [
+            'firstname' => 'Jane',
+            'id' => 4200,
+            'weird' => 'something_strange_with_hair'
+        ]))->setId(null);
+        $proposedAddress = $this->_addressBuilder->create();
+
+        $customerId = 1;
+        $this->_service->saveAddresses($customerId, [$proposedAddress]);
+
+        $addresses = $this->_service->getAddresses($customerId);
+        $this->assertNotEquals($proposedAddress->getAttributes(), $addresses[1]->getAttributes());
+        $this->assertArrayHasKey('weird', $proposedAddress->getAttributes());
+        $this->assertArrayNotHasKey('weird', $addresses[1]->getAttributes());
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     * @magentoDataFixture Magento/Customer/_files/customer_address.php
+     * @magentoAppIsolation enabled
+     */
+    public function testSaveNewInvalidAddresses()
+    {
+        $firstAddressBuilder = $this->_addressBuilder->populateWithArray(
+            array_merge($this->_expectedAddresses[0]->__toArray(), [
+                'firstname' => null
+            ])
+        )->setId(null);
+        $firstAddress = $firstAddressBuilder->create();
+        $secondAddressBuilder = $this->_addressBuilder->populateWithArray(
+            array_merge($this->_expectedAddresses[0]->__toArray(), [
+                'lastname' => null
+            ])
+        )->setId(null);
+        $secondAddress = $secondAddressBuilder->create();
+        $customerId = 1;
+        try {
+            $this->_service->saveAddresses($customerId, [$firstAddress, $secondAddress]);
+        } catch (\Magento\Customer\Service\Entity\V1\AggregateException $ae) {
+            $failures = $ae->getExceptions();
+            $firstAddressError = $failures[0];
+            $this->assertInstanceOf('\Magento\Customer\Service\Entity\V1\Exception', $firstAddressError);
+            $this->assertInstanceOf('\Magento\Validator\ValidatorException', $firstAddressError->getPrevious());
+            $this->assertSame('Please enter the first name.', $firstAddressError->getPrevious()->getMessage());
+
+            $secondAddressError = $failures[1];
+            $this->assertInstanceOf('\Magento\Customer\Service\Entity\V1\Exception', $secondAddressError);
+            $this->assertInstanceOf('\Magento\Validator\ValidatorException', $secondAddressError->getPrevious());
+            $this->assertSame('Please enter the last name.', $secondAddressError->getPrevious()->getMessage());
+            return;
+        }
+        $this->fail('Expected AggregateException not caught.');
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     * @magentoAppIsolation enabled
+     */
+    public function testSaveNewAddressDefaults()
+    {
+        $addressShippingBuilder = $this->_createFirstAddressBuilder();
+        $addressShippingBuilder->setDefaultShipping(true)->setDefaultBilling(false);
+        $addressShipping = $addressShippingBuilder->create();
+
+        $addressBillingBuilder = $this->_createSecondAddressBuilder();
+        $addressBillingBuilder->setDefaultBilling(true)->setDefaultShipping(false);
+        $addressBilling = $addressBillingBuilder->create();
+        $customerId = 1;
+        $this->_service->saveAddresses($customerId, [$addressShipping, $addressBilling]);
+
+        $shipping = $this->_service->getDefaultShippingAddress($customerId);
+        /* XXX: cannot reuse addressShippingBuilder; actually all of this code
+           is re-using the same addressBuilder which is wrong */
+        $addressShipping = $this->_addressBuilder->populate($addressShipping)->setId($shipping->getId())->create();
+        $this->_assertAddressAndRegionArrayEquals($addressShipping->__toArray(), $shipping->__toArray());
+
+        $billing = $this->_service->getDefaultBillingAddress($customerId);
+        $addressBilling = $this->_addressBuilder->populate($addressBilling)->setId($billing->getId())->create();
+        $this->_assertAddressAndRegionArrayEquals($addressBilling->__toArray(), $billing->__toArray());
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     * @magentoDataFixture Magento/Customer/_files/customer_address.php
+     * @magentoAppIsolation enabled
+     */
+    public function testSaveSeveralNewAddressesSameDefaults()
+    {
+        $addressTwoBuilder = $this->_createSecondAddressBuilder();
+        $addressTwo = $addressTwoBuilder->create();
+        $addressThreeBuilder = $this->_addressBuilder->populate($addressTwo);
+        $addressThreeBuilder->setDefaultBilling(true);
+        $addressThree = $addressThreeBuilder->create();
+
+        $addressFourBuilder = $this->_addressBuilder->populate($addressTwo);
+        $addressFourBuilder->setDefaultBilling(false)->setDefaultShipping(true);
+        $addressFour = $addressFourBuilder->create();
+
+        $addressDefaultBuilder = $this->_addressBuilder->populate($addressTwo);
+        $addressDefaultBuilder->setDefaultBilling(true)->setDefaultShipping(true)
+            ->setFirstname('Dirty Garry');
+        $addressDefault = $addressDefaultBuilder->create();
+
+        $customerId = 1;
+        $this->_service->saveAddresses(
+            $customerId,
+            [$addressTwo, $addressThree, $addressFour, $addressDefault]
+        );
+
+        $addresses = $this->_service->getAddresses($customerId);
+        $this->assertEquals(5, count($addresses));
+
+        // retrieve defaults
+        $addresses = [
+            $this->_service->getDefaultBillingAddress($customerId),
+            $this->_service->getDefaultShippingAddress($customerId),
+        ];
+        // Same address is returned twice
+        $this->assertEquals($addresses[0], $addresses[1]);
+        $this->assertEquals($addressDefault->getFirstname(), $addresses[1]->getFirstname());
+
+        //clone object
+        $expectedDefaultBuilder = $this->_addressBuilder->populate($addressDefault);
+        // It is the same address retrieved as the one which get saved
+        $expectedDefaultBuilder->setId($addresses[1]->getId());
+        $expectedDefault = $expectedDefaultBuilder->create();
+        $this->_assertAddressAndRegionArrayEquals($expectedDefault->__toArray(), $addresses[1]->__toArray());
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     * @magentoDataFixture Magento/Customer/_files/customer_address.php
+     * @magentoAppIsolation enabled
+     */
+    public function testSaveSeveralNewAddressesDifferentDefaults()
+    {
+        $addressTwoBuilder = $this->_createSecondAddressBuilder();
+        $addressTwo = $addressTwoBuilder->create();
+
+        $addressThreeBuilder = $this->_addressBuilder->populate($addressTwo);
+        $addressThreeBuilder->setDefaultBilling(true);
+        $addressThree = $addressThreeBuilder->create();
+
+        $defaultShippingBuilder = $this->_addressBuilder->populate($addressTwo);
+        $defaultShippingBuilder->setFirstname('Shippy')
+            ->setLastname('McShippington')
+            ->setDefaultBilling(false)
+            ->setDefaultShipping(true);
+        $defaultShipping = $defaultShippingBuilder->create();
+
+        $defaultBillingBuilder = $this->_addressBuilder->populate($addressTwo);
+        $defaultBillingBuilder
+            ->setFirstname('Billy')
+            ->setLastname('McBillington')
+            ->setDefaultBilling(true)
+            ->setDefaultShipping(false);
+        $defaultBilling = $defaultBillingBuilder->create();
+
+        $customerId = 1;
+
+        $this->_service->saveAddresses($customerId, [$addressTwo, $addressThree, $defaultShipping, $defaultBilling]);
+        $addresses = $this->_service->getAddresses($customerId);
+
+        $this->assertEquals(5, count($addresses));
+
+        $addresses = [
+            $this->_service->getDefaultBillingAddress($customerId),
+            $this->_service->getDefaultShippingAddress($customerId),
+        ];
+        $this->assertNotEquals($addresses[0], $addresses[1]);
+        $this->assertTrue($addresses[0]->isDefaultBilling());
+        $this->assertTrue($addresses[1]->isDefaultShipping());
+
+        $expectedDfltShipBuilder = $this->_addressBuilder->populate($defaultShipping);
+        $expectedDfltShipBuilder->setId($addresses[1]->getId());
+        $expectedDfltShip = $expectedDfltShipBuilder->create();
+
+        $expectedDfltBillBuilder = $this->_addressBuilder->populate($defaultBilling);
+        $expectedDfltBillBuilder->setId($addresses[0]->getId());
+        $expectedDfltBill = $expectedDfltBillBuilder->create();
+
+        $this->_assertAddressAndRegionArrayEquals($expectedDfltShip->__toArray(), $addresses[1]->__toArray());
+        $this->_assertAddressAndRegionArrayEquals($expectedDfltBill->__toArray(), $addresses[0]->__toArray());
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     * @magentoDataFixture Magento/Customer/_files/customer_address.php
+     * @magentoDataFixture Magento/Customer/_files/customer_two_addresses.php
+     * @magentoAppIsolation enabled
+     */
+    public function testSaveAddressesNoAddresses()
+    {
+        $addressIds = $this->_service->saveAddresses(1, []);
+        $this->assertEmpty($addressIds);
+        $customerId = 1;
+        $addresses = $this->_service->getAddresses($customerId);
+        $this->assertEquals($this->_expectedAddresses, $addresses);
+    }
+
+    /**
+     * @expectedException Exception
+     * @expectedExceptionMessage No customer with customerId 4200 exists
+     */
+    public function testSaveAddressesCustomerIdNotExist()
+    {
+        $proposedAddress = $this->_createSecondAddressBuilder()->create();
+        $this->_service->saveAddresses(4200, [$proposedAddress]);
+    }
+
+    /**
+     * @expectedException Exception
+     * @expectedExceptionMessage No customer with customerId this_is_not_a_valid_id exists
+     */
+    public function testSaveAddressesCustomerIdInvalid()
+    {
+        $proposedAddress = $this->_createSecondAddressBuilder()->create();
+        $this->_service->saveAddresses('this_is_not_a_valid_id', [$proposedAddress]);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     * @magentoDataFixture Magento/Customer/_files/customer_address.php
+     */
+    public function testDeleteAddressFromCustomer()
+    {
+        $customerId = 1;
+        $addressId = 1;
+        // See that customer already has an address with expected addressId
+        $addressDto = $this->_service->getAddressById($customerId, $addressId);
+        $this->assertEquals($addressDto->getId(), $addressId);
+
+        // Delete the address from the customer
+        $this->_service->deleteAddressFromCustomer($customerId, $addressId);
+
+        // See that address is deleted
+        try {
+            $addressDto = $this->_service->getAddressById($customerId, $addressId);
+            $this->fail('Did not catch expected exception');
+        } catch (Exception $e) {
+            $this->assertEquals($e->getCode(), Exception::CODE_ADDRESS_NOT_FOUND);
+        }
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     *
+     * @expectedException Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_ADDRESS_NOT_FOUND
+     */
+    public function testDeleteAddressFromCustomerBadAddrId()
+    {
+        // Should throw the address not found exception
+        $this->_service->deleteAddressFromCustomer(1, 12345);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     *
+     * @expectedException Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_INVALID_ADDRESS_ID
+     */
+    public function testDeleteAddressFromCustomerAddrIdNotSet()
+    {
+        // Should throw the address not found exception
+        $this->_service->deleteAddressFromCustomer(1, 0);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     * @magentoDataFixture Magento/Customer/_files/customer_two_addresses.php
+     * @expectedException Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_CUSTOMER_ID_MISMATCH
+     */
+    public function testDeleteAddressFromCustomerBadCustMismatch()
+    {
+        // Should throw the address not found excetion
+        $this->_service->deleteAddressFromCustomer(2, 1);
+    }
+
+    /**
+     * Helper function that returns an Address DTO that matches the data from customer_address fixture
+     *
+     * @return \Magento\Customer\Service\V1\Dto\AddressBuilder
+     */
+    private function _createFirstAddressBuilder()
+    {
+        $addressBuilder = $this->_addressBuilder->populate($this->_expectedAddresses[0]);
+        $addressBuilder->setId(null);
+        return $addressBuilder;
+    }
+
+    /**
+     * Helper function that returns an Address DTO that matches the data from customer_two_address fixture
+     *
+     * @return \Magento\Customer\Service\V1\Dto\AddressBuilder
+     */
+    private function _createSecondAddressBuilder()
+    {
+        return $this->_addressBuilder->populate($this->_expectedAddresses[1])
+            ->setId(null);
+    }
+
+    /**
+     * Checks that the arrays are equal, but accounts for the 'region' being an object
+     *
+     * @param array $expectedArray
+     * @param array $actualArray
+     */
+    protected function _assertAddressAndRegionArrayEquals($expectedArray, $actualArray)
+    {
+        if (array_key_exists('region', $expectedArray)) {
+            /** @var \Magento\Customer\Service\V1\Dto\Region $expectedRegion */
+            $expectedRegion = $expectedArray['region'];
+            unset($expectedArray['region']);
+        }
+        if (array_key_exists('region', $actualArray)) {
+            /** @var \Magento\Customer\Service\V1\Dto\Region $actualRegion */
+            $actualRegion = $actualArray['region'];
+            unset($actualArray['region']);
+        }
+
+        $this->assertEquals($expectedArray, $actualArray);
+
+        // Either both set or both unset
+        $this->assertTrue(!(isset($expectedRegion) xor isset($actualRegion)));
+        if (isset($expectedRegion) && isset($actualRegion)) {
+            $this->assertInstanceOf('Magento\Customer\Service\V1\Dto\Region', $expectedRegion);
+            $this->assertInstanceOf('Magento\Customer\Service\V1\Dto\Region', $actualRegion);
+            $this->assertEquals($expectedRegion->__toArray(), $actualRegion->__toArray());
+        }
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerGroupServiceTest.php b/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerGroupServiceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..4e0a4412629f9ed69fa0cc0d166f93acffc32184
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerGroupServiceTest.php
@@ -0,0 +1,181 @@
+<?php
+/**
+ * Integration test for service layer \Magento\Customer\Service\Customer
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Customer\Service\V1;
+
+use Magento\Customer\Service\V1;
+
+class CustomerGroupServiceTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\ObjectManager
+     */
+    protected $_objectManager = null;
+
+    /**
+     * @var \Magento\Customer\Service\V1\CustomerGroupServiceInterface
+     */
+    protected $_groupService = null;
+
+    protected function setUp()
+    {
+
+        $this->_objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $this->_groupService = $this->_objectManager->get('Magento\Customer\Service\V1\CustomerGroupServiceInterface');
+    }
+
+    protected function tearDown()
+    {
+        $this->_objectManager = null;
+        $this->_groupService = null;
+    }
+
+    /**
+     * Cleaning up the extra groups that might have been created as part of the testing.
+     */
+    public static function tearDownAfterClass()
+    {
+        /** @var \Magento\Customer\Service\V1\CustomerGroupServiceInterface $customerGroupService */
+        $customerGroupService = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
+            'Magento\Customer\Service\V1\CustomerGroupServiceInterface'
+        );
+        foreach ($customerGroupService->getGroups() as $group) {
+            if ($group->getId() > 3) {
+                $customerGroupService->deleteGroup($group->getId());
+            }
+        }
+    }
+
+    /**
+     */
+    public function testGetGroups()
+    {
+        $groups = $this->_groupService->getGroups();
+        $this->assertEquals(4, count($groups));
+        $this->assertEquals(
+            [0, "NOT LOGGED IN", 3],
+            [$groups[0]->getId(), $groups[0]->getCode(), $groups[0]->getTaxClassId()]
+        );
+        $this->assertEquals(
+            [1, "General", 3],
+            [$groups[1]->getId(), $groups[1]->getCode(), $groups[1]->getTaxClassId()]
+        );
+        $this->assertEquals(
+            [2, "Wholesale", 3],
+            [$groups[2]->getId(), $groups[2]->getCode(), $groups[2]->getTaxClassId()]
+        );
+        $this->assertEquals(
+            [3, "Retailer", 3],
+            [$groups[3]->getId(), $groups[3]->getCode(), $groups[3]->getTaxClassId()]
+        );
+    }
+
+    /**
+     */
+    public function testGetGroupsFiltered()
+    {
+        $groups = $this->_groupService->getGroups(FALSE);
+        $this->assertEquals(3, count($groups));
+        $this->assertEquals(
+            [1, "General", 3],
+            [$groups[0]->getId(), $groups[0]->getCode(), $groups[0]->getTaxClassId()]
+        );
+        $this->assertEquals(
+            [2, "Wholesale", 3],
+            [$groups[1]->getId(), $groups[1]->getCode(), $groups[1]->getTaxClassId()]
+        );
+        $this->assertEquals(
+            [3, "Retailer", 3],
+            [$groups[2]->getId(), $groups[2]->getCode(), $groups[2]->getTaxClassId()]
+        );
+    }
+
+    /**
+     * @param array $group
+     * @dataProvider getGroups
+     */
+    public function testGetGroup($testGroup)
+    {
+        $group = $this->_groupService->getGroup($testGroup["id"]);
+        $this->assertEquals($testGroup["id"], $group->getId());
+        $this->assertEquals($testGroup["code"], $group->getCode());
+        $this->assertEquals($testGroup["taxClass"], $group->getTaxClassId());
+    }
+
+    public function testCreateGroup()
+    {
+        $group = new V1\Dto\CustomerGroup([
+          'id' => null,
+          'code' => "Test Group",
+          'tax_class_id' => 4
+        ]);
+        $groupId = $this->_groupService->saveGroup($group);
+        $this->assertNotNull($groupId);
+
+        $newGroup = $this->_groupService->getGroup($groupId);
+        $this->assertEquals($groupId, $newGroup->getId());
+        $this->assertEquals($group->getCode(), $newGroup->getCode());
+        $this->assertEquals($group->getTaxClassId(), $newGroup->getTaxClassId());
+    }
+
+    public function testUpdateGroup()
+    {
+        $group = new V1\Dto\CustomerGroup([
+          'id' => null,
+          'code' => "New Group",
+          'tax_class_id' => 4
+        ]);
+        $groupId = $this->_groupService->saveGroup($group);
+        $this->assertNotNull($groupId);
+
+        $newGroup = $this->_groupService->getGroup($groupId);
+        $this->assertEquals($groupId, $newGroup->getId());
+        $this->assertEquals($group->getCode(), $newGroup->getCode());
+        $this->assertEquals($group->getTaxClassId(), $newGroup->getTaxClassId());
+
+        $updates = new V1\Dto\CustomerGroup([
+          'id' => $groupId,
+          'code' => "Updated Group",
+          'tax_class_id' => 2
+        ]);
+        $newId = $this->_groupService->saveGroup($updates);
+        $this->assertEquals($newId, $groupId);
+        $updatedGroup = $this->_groupService->getGroup($groupId);
+        $this->assertEquals($updates->getCode(), $updatedGroup->getCode());
+        $this->assertEquals($updates->getTaxClassId(), $updatedGroup->getTaxClassId());
+    }
+
+    /**
+     * @return array
+     */
+    public function getGroups()
+    {
+        return [ [["id" => 0, "code" => "NOT LOGGED IN", "taxClass" => 3]],
+                 [["id" => 1, "code" => "General", "taxClass" => 3]],
+                 [["id" => 2, "code" => "Wholesale", "taxClass" => 3]],
+                 [["id" => 3, "code" => "Retailer", "taxClass" => 3]],
+                ];
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerMetadataServiceTest.php b/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerMetadataServiceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..a42fda2b25bf0dfafe4b4b1095205ec2e595b4be
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerMetadataServiceTest.php
@@ -0,0 +1,113 @@
+<?php
+/**
+ * Integration test for service layer \Magento\Customer\Service\Eav\AttributeMetadataV1
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Customer\Service\V1;
+
+class CustomerMetadataServiceTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var \Magento\Customer\Service\V1\CustomerServiceInterface */
+    private $_customerService;
+
+    /** @var \Magento\Customer\Service\V1\CustomerMetadataServiceInterface */
+    private $_service;
+
+    protected function setUp()
+    {
+        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $this->_customerService = $objectManager->create('Magento\Customer\Service\V1\CustomerServiceInterface');
+        $this->_service = $objectManager->create('Magento\Customer\Service\V1\CustomerMetadataServiceInterface');
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     */
+    public function testGetCustomerAttributeMetadata()
+    {
+        // Expect these attributes to exist but do not check the value
+        $expectAttrsWOutVals = array('updated_at', 'created_at', 'password_hash');
+
+        // Expect these attributes to exist and check the value - values come from _files/customer.php
+        $expectAttrsWithVals = array(
+            'entity_id'                 => '1',
+            'entity_type_id'            => '1',
+            'attribute_set_id'          => '1',
+            'website_id'                => '1',
+            'store_id'                  => '1',
+            'group_id'                  => '1',
+            'disable_auto_group_change' => '0',
+            'firstname'                 => 'Firstname',
+            'lastname'                  => 'Lastname',
+            'email'                     => 'customer@example.com',
+            'default_billing'           => '1',
+            'default_shipping'          => '1',
+        );
+
+        $customer = $this->_customerService->getCustomer(1);
+        $this->assertNotNull($customer);
+
+        $attributes = $customer->getAttributes();
+        $this->assertNotEmpty($attributes);
+
+        foreach ($attributes as $attributeCode => $attributeValue) {
+            $this->assertNotNull($attributeCode);
+            $this->assertNotNull($attributeValue);
+            $attributeMetadata = $this->_service->getCustomerAttributeMetadata($attributeCode);
+            $attrMetadataCode = $attributeMetadata->getAttributeCode();
+            $this->assertSame($attributeCode, $attrMetadataCode);
+            if (($key = array_search($attrMetadataCode, $expectAttrsWOutVals)) !== false) {
+                unset($expectAttrsWOutVals[$key]);
+            } else {
+                $this->assertArrayHasKey($attrMetadataCode, $expectAttrsWithVals);
+                $this->assertSame(
+                    $expectAttrsWithVals[$attrMetadataCode],
+                    $attributeValue,
+                    "Failed for $attrMetadataCode"
+                );
+                unset($expectAttrsWithVals[$attrMetadataCode]);
+            }
+        }
+        $this->assertEmpty($expectAttrsWOutVals);
+        $this->assertEmpty($expectAttrsWithVals);
+    }
+
+    public function testAttributeMetadataCached()
+    {
+        $firstCallMetadata = $this->_service->getAddressAttributeMetadata('firstname');
+        $secondCallMetadata = $this->_service->getAddressAttributeMetadata('firstname');
+
+        $this->assertSame($firstCallMetadata, $secondCallMetadata);
+
+    }
+
+    public function testGetAddressAttributeMetadata()
+    {
+        $vatValidMetadata = $this->_service->getAddressAttributeMetadata('vat_is_valid');
+
+        $this->assertNotNull($vatValidMetadata);
+        $this->assertEquals('vat_is_valid', $vatValidMetadata->getAttributeCode());
+        $this->assertEquals('text', $vatValidMetadata->getFrontendInput());
+        $this->assertEquals('VAT number validity', $vatValidMetadata->getStoreLabel());
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerServiceTest.php b/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerServiceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..5395bf9aacffc51fb4dd91a467a06769187be376
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Customer/Service/V1/CustomerServiceTest.php
@@ -0,0 +1,596 @@
+<?php
+
+namespace Magento\Customer\Service\V1;
+use Magento\Customer\Service\Entity\V1\Exception;
+use Magento\Customer\Service\V1;
+
+/**
+ * Integration test for service layer \Magento\Customer\Service\CustomerV1
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ *
+ * @SuppressWarnings(PHPMD.TooManyMethods)
+ * @SuppressWarnings(PHPMD.ExcessivePublicCount)
+ */
+class CustomerServiceTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var CustomerServiceInterface */
+    private $_service;
+
+    /** @var CustomerAccountServiceInterface Needed for password checking */
+    private $_accountService;
+
+    /** @var \Magento\ObjectManager */
+    private $_objectManager;
+
+    /** @var \Magento\Customer\Service\V1\Dto\Address[] */
+    private $_expectedAddresses;
+
+    /** @var \Magento\Customer\Service\V1\Dto\AddressBuilder */
+    private $_addressBuilder;
+
+    /** @var \Magento\Customer\Service\V1\Dto\CustomerBuilder */
+    private $_customerBuilder;
+
+    protected function setUp()
+    {
+        $this->_objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+        $this->_service = $this->_objectManager->create('Magento\Customer\Service\V1\CustomerServiceInterface');
+        $this->_accountService = $this->_objectManager
+            ->create('Magento\Customer\Service\V1\CustomerAccountServiceInterface');
+
+        $this->_addressBuilder = $this->_objectManager->create('Magento\Customer\Service\V1\Dto\AddressBuilder');
+        $this->_customerBuilder = $this->_objectManager->create('Magento\Customer\Service\V1\Dto\CustomerBuilder');
+
+        $this->_addressBuilder->setId(1)
+            ->setCountryId('US')
+            ->setCustomerId(1)
+            ->setDefaultBilling(true)
+            ->setDefaultShipping(true)
+            ->setPostcode('75477')
+            ->setRegion(new V1\Dto\Region([
+                'region_code' => 'AL',
+                'region' => 'Alabama',
+                'region_id' => 1
+            ]))
+            ->setStreet(['Green str, 67'])
+            ->setTelephone('3468676')
+            ->setCity('CityM')
+            ->setFirstname('John')
+            ->setLastname('Smith');
+        $address = $this->_addressBuilder->create();
+
+        /* XXX: would it be better to have a clear method for this? */
+        $this->_addressBuilder->setId(2)
+            ->setCountryId('US')
+            ->setCustomerId(1)
+            ->setDefaultBilling(false)
+            ->setDefaultShipping(false)
+            ->setPostcode('47676')
+            ->setRegion(new V1\Dto\Region([
+                'region_code' => 'AL',
+                'region' => 'Alabama',
+                'region_id' => 1
+            ]))
+            ->setStreet(['Black str, 48'])
+            ->setCity('CityX')
+            ->setTelephone('3234676')
+            ->setFirstname('John')
+            ->setLastname('Smith');
+        $address2 = $this->_addressBuilder->create();
+
+        $this->_expectedAddresses = [$address, $address2];
+    }
+
+    /**
+     * @param mixed $custId
+     * @dataProvider invalidCustomerIdsDataProvider
+     * @expectedException Exception
+     * @expectedExceptionMessage customerId
+     */
+    public function testInvalidCustomerIds($custId)
+    {
+        $this->_service->getCustomer($custId);
+    }
+
+    public function invalidCustomerIdsDataProvider()
+    {
+        return array(
+            array('ab'),
+            array(' '),
+            array(-1),
+            array(0),
+            array(' 1234'),
+            array('-1'),
+            array('0'),
+        );
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     */
+    public function testGetCustomerCached()
+    {
+        $firstCall = $this->_service->getCustomer(1);
+        $secondCall = $this->_service->getCustomer(1);
+
+        $this->assertSame($firstCall, $secondCall);
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     * @magentoAppIsolation enabled
+     */
+    public function testGetCustomer()
+    {
+        // _files/customer.php sets the customer id to 1
+        $customer = $this->_service->getCustomer(1);
+
+        // All these expected values come from _files/customer.php fixture
+        $this->assertEquals(1, $customer->getCustomerId());
+        $this->assertEquals('customer@example.com', $customer->getEmail());
+        $this->assertEquals('Firstname', $customer->getFirstname());
+        $this->assertEquals('Lastname', $customer->getLastname());
+    }
+
+    /**
+     * @expectedException Exception
+     * @expectedExceptionMessage No customer with customerId 1 exists.
+     */
+    public function testGetCustomerNotExist()
+    {
+        // No fixture, so customer with id 1 shouldn't exist, exception should be thrown
+        $this->_service->getCustomer(1);
+    }
+
+    /**
+     * @magentoAppArea frontend
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     */
+    public function testSaveCustomer()
+    {
+        $existingCustId = 1;
+
+        $email = 'savecustomer@example.com';
+        $firstName = 'Firstsave';
+        $lastname = 'Lastsave';
+
+        $customerBefore = $this->_service->getCustomer($existingCustId);
+
+        $customerData = array_merge($customerBefore->__toArray(), array(
+            'id' => 1,
+            'email' => $email,
+            'firstname' => $firstName,
+            'lastname' => $lastname,
+            'created_in' => 'Admin',
+            'password' => 'notsaved'
+        ));
+        $this->_customerBuilder->populateWithArray($customerData);
+        $modifiedCustomer = $this->_customerBuilder->create();
+
+        $returnedCustomerId = $this->_service->saveCustomer($modifiedCustomer, 'aPassword');
+        $this->assertEquals($existingCustId, $returnedCustomerId);
+        $customerAfter = $this->_service->getCustomer($existingCustId);
+        $this->assertEquals($email, $customerAfter->getEmail());
+        $this->assertEquals($firstName, $customerAfter->getFirstname());
+        $this->assertEquals($lastname, $customerAfter->getLastname());
+        $this->assertEquals('Admin', $customerAfter->getAttribute('created_in'));
+        $this->_accountService->authenticate(
+            $customerAfter->getEmail(),
+            'aPassword',
+            true
+        );
+        $attributesBefore = $customerBefore->getAttributes();
+        $attributesAfter = $customerAfter->getAttributes();
+        // ignore 'updated_at'
+        unset($attributesBefore['updated_at']);
+        unset($attributesAfter['updated_at']);
+        $inBeforeOnly = array_diff_assoc($attributesBefore, $attributesAfter);
+        $inAfterOnly = array_diff_assoc($attributesAfter, $attributesBefore);
+        $expectedInBefore = array(
+            'firstname',
+            'lastname',
+            'email',
+            'password_hash',
+        );
+        $this->assertEquals($expectedInBefore, array_keys($inBeforeOnly));
+        $this->assertContains('created_in', array_keys($inAfterOnly));
+        $this->assertContains('firstname', array_keys($inAfterOnly));
+        $this->assertContains('lastname', array_keys($inAfterOnly));
+        $this->assertContains('email', array_keys($inAfterOnly));
+        $this->assertContains('password_hash', array_keys($inAfterOnly));
+    }
+
+    /**
+     * @magentoAppArea frontend
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     */
+    public function testSaveCustomerWithoutChangingPassword()
+    {
+        $existingCustId = 1;
+
+        $email = 'savecustomer@example.com';
+        $firstName = 'Firstsave';
+        $lastName = 'Lastsave';
+
+        $customerBefore = $this->_service->getCustomer($existingCustId);
+        $customerData = array_merge($customerBefore->__toArray(),
+            [
+                'id' => 1,
+                'email' => $email,
+                'firstname' => $firstName,
+                'lastname' => $lastName,
+                'created_in' => 'Admin'
+            ]
+        );
+        $this->_customerBuilder->populateWithArray($customerData);
+        $modifiedCustomer = $this->_customerBuilder->create();
+
+        $returnedCustomerId = $this->_service->saveCustomer($modifiedCustomer);
+        $this->assertEquals($existingCustId, $returnedCustomerId);
+        $customerAfter = $this->_service->getCustomer($existingCustId);
+        $this->assertEquals($email, $customerAfter->getEmail());
+        $this->assertEquals($firstName, $customerAfter->getFirstname());
+        $this->assertEquals($lastName, $customerAfter->getLastname());
+        $this->assertEquals('Admin', $customerAfter->getAttribute('created_in'));
+        $this->_accountService->authenticate(
+            $customerAfter->getEmail(),
+            'password',
+            true
+        );
+        $attributesBefore = $customerBefore->getAttributes();
+        $attributesAfter = $customerAfter->getAttributes();
+        // ignore 'updated_at'
+        unset($attributesBefore['updated_at']);
+        unset($attributesAfter['updated_at']);
+        $inBeforeOnly = array_diff_assoc($attributesBefore, $attributesAfter);
+        $inAfterOnly = array_diff_assoc($attributesAfter, $attributesBefore);
+        $expectedInBefore = array(
+            'firstname',
+            'lastname',
+            'email',
+        );
+        sort($expectedInBefore);
+        $actualInBeforeOnly = array_keys($inBeforeOnly);
+        sort($actualInBeforeOnly);
+        $this->assertEquals($expectedInBefore, $actualInBeforeOnly);
+        $expectedInAfter = array(
+            'firstname',
+            'lastname',
+            'email',
+            'created_in',
+        );
+        sort($expectedInAfter);
+        $actualInAfterOnly = array_keys($inAfterOnly);
+        sort($actualInAfterOnly);
+        $this->assertEquals($expectedInAfter, $actualInAfterOnly);
+    }
+
+    /**
+     * @magentoAppArea frontend
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     */
+    public function testSaveCustomerPasswordCannotSetThroughAttributeSetting()
+    {
+        $existingCustId = 1;
+
+        $email = 'savecustomer@example.com';
+        $firstName = 'Firstsave';
+        $lastName = 'Lastsave';
+
+        $customerBefore = $this->_service->getCustomer($existingCustId);
+        $customerData = array_merge($customerBefore->__toArray(),
+            [
+                'id' => 1,
+                'email' => $email,
+                'firstname' => $firstName,
+                'lastname' => $lastName,
+                'created_in' => 'Admin',
+                'password' => 'aPassword'
+            ]
+        );
+        $this->_customerBuilder->populateWithArray($customerData);
+        $modifiedCustomer = $this->_customerBuilder->create();
+
+        $returnedCustomerId = $this->_service->saveCustomer($modifiedCustomer);
+        $this->assertEquals($existingCustId, $returnedCustomerId);
+        $customerAfter = $this->_service->getCustomer($existingCustId);
+        $this->assertEquals($email, $customerAfter->getEmail());
+        $this->assertEquals($firstName, $customerAfter->getFirstname());
+        $this->assertEquals($lastName, $customerAfter->getLastname());
+        $this->assertEquals('Admin', $customerAfter->getAttribute('created_in'));
+        $this->_accountService->authenticate(
+            $customerAfter->getEmail(),
+            'password',
+            true
+        );
+        $attributesBefore = $customerBefore->getAttributes();
+        $attributesAfter = $customerAfter->getAttributes();
+        // ignore 'updated_at'
+        unset($attributesBefore['updated_at']);
+        unset($attributesAfter['updated_at']);
+        $inBeforeOnly = array_diff_assoc($attributesBefore, $attributesAfter);
+        $inAfterOnly = array_diff_assoc($attributesAfter, $attributesBefore);
+        $expectedInBefore = array(
+            'firstname',
+            'lastname',
+            'email',
+        );
+        sort($expectedInBefore);
+        $actualInBeforeOnly = array_keys($inBeforeOnly);
+        sort($actualInBeforeOnly);
+        $this->assertEquals($expectedInBefore, $actualInBeforeOnly);
+        $expectedInAfter = array(
+            'firstname',
+            'lastname',
+            'email',
+            'created_in',
+        );
+        sort($expectedInAfter);
+        $actualInAfterOnly = array_keys($inAfterOnly);
+        sort($actualInAfterOnly);
+        $this->assertEquals($expectedInAfter, $actualInAfterOnly);
+    }
+
+    /**
+     * @magentoDbIsolation enabled
+     * @expectedException \Magento\Validator\ValidatorException
+     * @expectedExceptionMessage Please correct this email address
+     */
+    public function testSaveCustomerException()
+    {
+        $customerData = [
+            'id' => 1,
+            'password' => 'aPassword'
+        ];
+        $this->_customerBuilder->populateWithArray($customerData);
+        $customerEntity = $this->_customerBuilder->create();
+
+        try {
+            $this->_service->saveCustomer($customerEntity);
+        } catch (Exception $e) {
+            $this->assertEquals('There were one or more errors validating the customer object.', $e->getMessage());
+            $this->assertEquals(Exception::CODE_VALIDATION_FAILED, $e->getCode());
+            throw $e->getPrevious();
+        }
+    }
+
+    /**
+     * @magentoAppArea frontend
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     */
+    public function testSaveNonexistingCustomer()
+    {
+        $existingCustId = 1;
+        $existingCustomer = $this->_service->getCustomer($existingCustId);
+
+        $newCustId = 2;
+        $email = 'savecustomer@example.com';
+        $firstName = 'Firstsave';
+        $lastName = 'Lastsave';
+        $customerData = array_merge($existingCustomer->__toArray(),
+            [
+                'id' => $newCustId,
+                'email' => $email,
+                'firstname' => $firstName,
+                'lastname' => $lastName,
+                'created_in' => 'Admin'
+            ]
+        );
+        $this->_customerBuilder->populateWithArray($customerData);
+        $customerEntity = $this->_customerBuilder->create();
+
+        $customerId = $this->_service->saveCustomer($customerEntity, 'aPassword');
+        $this->assertEquals($newCustId, $customerId);
+        $customerAfter = $this->_service->getCustomer($customerId);
+        $this->assertEquals($email, $customerAfter->getEmail());
+        $this->assertEquals($firstName, $customerAfter->getFirstname());
+        $this->assertEquals($lastName, $customerAfter->getLastname());
+        $this->assertEquals('Admin', $customerAfter->getAttribute('created_in'));
+        $this->_accountService->authenticate(
+            $customerAfter->getEmail(),
+            'aPassword',
+            true
+        );
+        $attributesBefore = $existingCustomer->getAttributes();
+        $attributesAfter = $customerAfter->getAttributes();
+        // ignore 'updated_at'
+        unset($attributesBefore['updated_at']);
+        unset($attributesAfter['updated_at']);
+        unset($attributesAfter['reward_update_notification']);
+        unset($attributesAfter['reward_warning_notification']);
+        $inBeforeOnly = array_diff_assoc($attributesBefore, $attributesAfter);
+        $inAfterOnly = array_diff_assoc($attributesAfter, $attributesBefore);
+        $expectedInBefore = array(
+            'firstname',
+            'lastname',
+            'email',
+            'entity_id',
+            'password_hash',
+        );
+        sort($expectedInBefore);
+        $actualInBeforeOnly = array_keys($inBeforeOnly);
+        sort($actualInBeforeOnly);
+        $this->assertEquals($expectedInBefore, $actualInBeforeOnly);
+        $expectedInAfter = array(
+            'firstname',
+            'lastname',
+            'email',
+            'entity_id',
+            'created_in',
+            'password_hash',
+        );
+        sort($expectedInAfter);
+        $actualInAfterOnly = array_keys($inAfterOnly);
+        sort($actualInAfterOnly);
+        $this->assertEquals($expectedInAfter, $actualInAfterOnly);
+    }
+
+    /**
+     * @magentoDbIsolation enabled
+     */
+    public function testSaveCustomerInServiceVsInModel()
+    {
+        $email = 'email@example.com';
+        $email2 = 'email2@example.com';
+        $firstname = 'Tester';
+        $lastname = 'McTest';
+        $groupId = 1;
+        $password = 'aPassword';
+
+        /** @var \Magento\Customer\Model\Customer $customerModel */
+        $customerModel = $this->_objectManager->create('Magento\Customer\Model\CustomerFactory')
+            ->create();
+        $customerModel->setEmail($email)
+            ->setFirstname($firstname)
+            ->setLastname($lastname)
+            ->setGroupId($groupId)
+            ->setPassword($password);
+        $customerModel->save();
+        /** @var \Magento\Customer\Model\Customer $customerModel */
+        $savedModel = $this->_objectManager->create('Magento\Customer\Model\CustomerFactory')
+            ->create()
+            ->load($customerModel->getId());
+        $dataInModel = $savedModel->getData();
+
+        $this->_customerBuilder->setEmail($email2)
+            ->setFirstname($firstname)
+            ->setLastname($lastname)
+            ->setGroupId($groupId);
+        $newCustomerEntity = $this->_customerBuilder->create();
+        $customerId = $this->_service->saveCustomer($newCustomerEntity, $password);
+        $this->assertNotNull($customerId);
+        $savedCustomer = $this->_service->getCustomer($customerId);
+        $dataInService = $savedCustomer->getAttributes();
+        foreach ($dataInModel as $key => $value) {
+            if (!in_array(
+                $key,
+                array('created_at', 'updated_at', 'email', 'is_active', 'entity_id', 'password_hash',
+                     'attribute_set_id')
+            )) {
+                if (is_null($value)) {
+                    $this->assertArrayNotHasKey($key, $dataInService);
+                } else {
+                    $this->assertEquals($value, $dataInService[$key], 'Failed asserting value for '. $key);
+                }
+            }
+        }
+        $this->assertArrayNotHasKey('is_active', $dataInService);
+        $this->assertNotNull($dataInService['created_at']);
+        $this->assertNotNull($dataInService['updated_at']);
+        $this->assertNotNull($dataInService['entity_id']);
+        $this->assertNotNull($dataInService['password_hash']);
+        $this->assertEquals($email2, $dataInService['email']);
+    }
+
+    /**
+     * @magentoDbIsolation enabled
+     */
+    public function testSaveNewCustomer()
+    {
+        $email = 'email@example.com';
+        $storeId = 1;
+        $firstname = 'Tester';
+        $lastname = 'McTest';
+        $groupId = 1;
+
+        $this->_customerBuilder->setStoreId($storeId)
+            ->setEmail($email)
+            ->setFirstname($firstname)
+            ->setLastname($lastname)
+            ->setGroupId($groupId);
+        $newCustomerEntity = $this->_customerBuilder->create();
+        $customerId = $this->_service->saveCustomer($newCustomerEntity, 'aPassword');
+        $this->assertNotNull($customerId);
+        $savedCustomer = $this->_service->getCustomer($customerId);
+        $this->assertEquals($email, $savedCustomer->getEmail());
+        $this->assertEquals($storeId, $savedCustomer->getStoreId());
+        $this->assertEquals($firstname, $savedCustomer->getFirstname());
+        $this->assertEquals($lastname, $savedCustomer->getLastname());
+        $this->assertEquals($groupId, $savedCustomer->getGroupId());
+        $this->assertTrue(!$savedCustomer->getSuffix());
+    }
+
+    /**
+     * @magentoAppArea frontend
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     */
+    public function testSaveNewCustomerFromClone()
+    {
+        $email = 'savecustomer@example.com';
+        $firstName = 'Firstsave';
+        $lastname = 'Lastsave';
+
+        $existingCustId = 1;
+        $existingCustomer = $this->_service->getCustomer($existingCustId);
+        $customerData = array_merge($existingCustomer->__toArray(),
+            [
+                'email' => $email,
+                'firstname' => $firstName,
+                'lastname' => $lastname,
+                'created_in' => 'Admin'
+            ]
+        );
+        $this->_customerBuilder->populateWithArray($customerData);
+        $customerEntity = $this->_customerBuilder->create();
+
+        $customerId = $this->_service->saveCustomer($customerEntity, 'aPassword');
+        $this->assertNotEmpty($customerId);
+        $customer = $this->_service->getCustomer($customerId);
+        $this->assertEquals($email, $customer->getEmail());
+        $this->assertEquals($firstName, $customer->getFirstname());
+        $this->assertEquals($lastname, $customer->getLastname());
+        $this->assertEquals('Admin', $customer->getAttribute('created_in'));
+        $this->_accountService->authenticate(
+            $customer->getEmail(),
+            'aPassword',
+            true
+        );
+    }
+
+    /**
+     * @magentoDataFixture Magento/Customer/_files/customer.php
+     */
+    public function testSaveCustomerRpToken()
+    {
+        $this->_customerBuilder->populateWithArray(array_merge($this->_service->getCustomer(1)->__toArray(), [
+            'rp_token' => 'token',
+            'rp_token_created_at' => '2013-11-05'
+        ]));
+        $customer = $this->_customerBuilder->create();
+        $this->_service->saveCustomer($customer);
+
+        // Empty current reset password token i.e. invalidate it
+        $this->_customerBuilder->populateWithArray(array_merge($this->_service->getCustomer(1)->__toArray(), [
+            'rp_token' => null,
+            'rp_token_created_at' => null
+        ]));
+        $this->_customerBuilder->setConfirmation(null);
+        $customer = $this->_customerBuilder->create();
+
+        $this->_service->saveCustomer($customer, 'password');
+
+        $customer = $this->_service->getCustomer(1);
+        $this->assertEquals('Firstname', $customer->getFirstname());
+        $this->assertNull($customer->getAttribute('rp_token'));
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/Customer/_files/customer.php b/dev/tests/integration/testsuite/Magento/Customer/_files/customer.php
index f640fe7342733a8ee264195aa8b77cfeeb168e25..3f29b8530339b22410dfc7cde2fa339a84d2ca57 100644
--- a/dev/tests/integration/testsuite/Magento/Customer/_files/customer.php
+++ b/dev/tests/integration/testsuite/Magento/Customer/_files/customer.php
@@ -28,9 +28,9 @@ $customer = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
     ->create('Magento\Customer\Model\Customer');
 $customer
     ->setWebsiteId(1)
-    ->setEntityId(1)
+    ->setId(1)
     ->setEntityTypeId(1)
-    ->setAttributeSetId(0)
+    ->setAttributeSetId(1)
     ->setEmail('customer@example.com')
     ->setPassword('password')
     ->setGroupId(1)
diff --git a/dev/tests/integration/testsuite/Magento/Customer/_files/customer_address.php b/dev/tests/integration/testsuite/Magento/Customer/_files/customer_address.php
index 451fa32fb5708a02cddd55b8f60c3e2f5c269dab..5b8aac69eed224d42fd5a53c3fe877546cb2a040 100644
--- a/dev/tests/integration/testsuite/Magento/Customer/_files/customer_address.php
+++ b/dev/tests/integration/testsuite/Magento/Customer/_files/customer_address.php
@@ -31,13 +31,15 @@ $customerAddress->isObjectNew(true);
 $customerAddress->setCustomerId(1)
     ->setData(array(
         'entity_id' => 1,
+        'attribute_set_id' => 2,
         'telephone' => 3468676,
         'postcode' => 75477,
-        'country_id' => 'AL',
+        'country_id' => 'US',
         'city' => 'CityM',
         'street' => 'Green str, 67',
         'lastname' => 'Smith',
         'firstname' => 'John',
-        'parent_id' => 1
+        'parent_id' => 1,
+        'region_id' => 1
     ));
 $customerAddress->save();
diff --git a/dev/tests/integration/testsuite/Magento/Customer/_files/customer_two_addresses.php b/dev/tests/integration/testsuite/Magento/Customer/_files/customer_two_addresses.php
index de427f9497dc51f08b1311a3b77e6e9ee4a772c3..5ac194c7aec2905a2817f7c8ca62ce046ec3384b 100644
--- a/dev/tests/integration/testsuite/Magento/Customer/_files/customer_two_addresses.php
+++ b/dev/tests/integration/testsuite/Magento/Customer/_files/customer_two_addresses.php
@@ -33,13 +33,15 @@ $customerAddress->isObjectNew(true);
 $customerAddress->setCustomerId(1)
     ->setData(array(
         'entity_id' => 2,
+        'attribute_set_id' => 2,
         'telephone' => 3234676,
         'postcode' => 47676,
-        'country_id' => 'AL',
+        'country_id' => 'US',
         'city' => 'CityX',
         'street' => 'Black str, 48',
         'lastname' => 'Smith',
         'firstname' => 'John',
-        'parent_id' => 1
+        'parent_id' => 1,
+        'region_id' => 1
     ));
 $customerAddress->save();
diff --git a/dev/tests/integration/testsuite/Magento/Customer/_files/inactive_customer.php b/dev/tests/integration/testsuite/Magento/Customer/_files/inactive_customer.php
new file mode 100644
index 0000000000000000000000000000000000000000..ebddc5f3b74907a51cc05fa8d30193d1762cfc3d
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/Customer/_files/inactive_customer.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.
+ *
+ * @category    Magento
+ * @package     Magento_Customer
+ * @subpackage  integration_tests
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+$customer = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+    ->create('Magento\Customer\Model\Customer');
+$customer
+    ->setWebsiteId(1)
+    ->setId(1)
+    ->setConfirmation($customer->getRandomConfirmationKey())
+    ->setEntityTypeId(1)
+    ->setAttributeSetId(0)
+    ->setEmail('customer@needAconfirmation.com')
+    ->setPassword('password')
+    ->setGroupId(1)
+    ->setStoreId(1)
+    ->setFirstname('Firstname')
+    ->setLastname('Lastname')
+    ->setDefaultBilling(1)
+    ->setDefaultShipping(1);
+$customer->isObjectNew(true);
+$customer->save();
diff --git a/dev/tests/integration/testsuite/Magento/GoogleShopping/Model/ObserverTest.php b/dev/tests/integration/testsuite/Magento/GoogleShopping/Model/ObserverTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..e2b940346ae30f63b015e8f6651d0dd206593af8
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/GoogleShopping/Model/ObserverTest.php
@@ -0,0 +1,51 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\GoogleShopping\Model;
+
+class ObserverTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @magentoDataFixture Magento/GoogleShopping/Model/_files/flag_expired.php
+     */
+    public function testCheckSynchronizationOperationsWithExpiredFlag()
+    {
+        $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+
+        /** @var \Magento\AdminNotification\Model\Inbox $inbox */
+        $inbox = $objectManager->create('Magento\AdminNotification\Model\Inbox');
+        $notice = $inbox->loadLatestNotice();
+        $this->assertNotContains('Google Shopping', (string)$notice->getTitle());
+
+        /** @var \Magento\GoogleShopping\Model\Observer $observer */
+        $observer = $objectManager->get('Magento\GoogleShopping\Model\Observer');
+        $dummyEventData = $this->getMock('\Magento\Event\Observer', array(), array(), '', false);
+        $result = $observer->checkSynchronizationOperations($dummyEventData);
+
+        $this->assertSame($observer, $result);
+
+        $notice = $inbox->loadLatestNotice();
+        $this->assertContains('Google Shopping', (string)$notice->getTitle());
+    }
+}
diff --git a/dev/tests/integration/testsuite/Magento/GoogleShopping/Model/_files/flag_expired.php b/dev/tests/integration/testsuite/Magento/GoogleShopping/Model/_files/flag_expired.php
new file mode 100644
index 0000000000000000000000000000000000000000..971394ce5241b3fec21b750fa2b9aa83560da063
--- /dev/null
+++ b/dev/tests/integration/testsuite/Magento/GoogleShopping/Model/_files/flag_expired.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)
+ */
+
+/**
+ * Expired flag for the google shopping synchronization
+ */
+$objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
+
+ /** @var $flag \Magento\GoogleShopping\Model\Flag */
+$flag = $objectManager->create('Magento\GoogleShopping\Model\Flag');
+$flag->lock();
+
+/** @var $flagResource \Magento\Core\Model\Resource\Flag */
+$flagResource = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+    ->create('Magento\Core\Model\Resource\Flag');
+$flag->setLastUpdate(date('Y-m-d H:i:s', time() - \Magento\GoogleShopping\Model\Flag::FLAG_TTL - 1));
+$flagResource->save($flag);
diff --git a/dev/tests/integration/testsuite/Magento/User/Model/UserTest.php b/dev/tests/integration/testsuite/Magento/User/Model/UserTest.php
index 4a5b37614b1428fd71bbaecb0d81d7b7bb78bf8a..2b36d5f27cf157c9ae8b545834af90b10bf9afd7 100644
--- a/dev/tests/integration/testsuite/Magento/User/Model/UserTest.php
+++ b/dev/tests/integration/testsuite/Magento/User/Model/UserTest.php
@@ -70,6 +70,19 @@ class UserTest extends \PHPUnit_Framework_TestCase
         $crud->testCrud();
     }
 
+    /**
+     * @magentoDataFixture Magento/User/_files/dummy_user.php
+     */
+    public function testCreatedOnUpdate()
+    {
+        $this->_model->loadByUsername('user_created_date');
+        $this->assertEquals('2010-01-06 00:00:00', $this->_model->getCreated());
+        //reload to update lognum record
+        $this->_model->getResource()->recordLogin($this->_model);
+        $this->_model->reload();
+        $this->assertEquals('2010-01-06 00:00:00', $this->_model->getCreated());
+    }
+
     /**
      * Ensure that an exception is not thrown, if the user does not exist
      */
diff --git a/dev/tests/integration/testsuite/Magento/User/_files/dummy_user.php b/dev/tests/integration/testsuite/Magento/User/_files/dummy_user.php
index 37a4a1f9140213c7f20ae71d7ea864eeafb8fc1e..5be6390a35eba12bb520e70acdc427f0787dfe2a 100644
--- a/dev/tests/integration/testsuite/Magento/User/_files/dummy_user.php
+++ b/dev/tests/integration/testsuite/Magento/User/_files/dummy_user.php
@@ -38,3 +38,20 @@ $user->setFirstname('Dummy')
     ->setUsername('dummy_username')
     ->setPassword('dummy_password1')
     ->save();
+
+
+\Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get('Magento\Core\Model\App')
+    ->loadArea(\Magento\Backend\App\Area\FrontNameResolver::AREA_CODE);
+$user = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+    ->create('Magento\User\Model\User');
+$user->setFirstname('CreateDate')
+    ->setLastname('User 2')
+    ->setEmail('dummy2@dummy.com')
+    ->setUsername('user_created_date')
+    ->setPassword('dummy_password2')
+    ->save();
+$user = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()
+    ->create('Magento\User\Model\User');
+$user->loadByUsername('user_created_date');
+$user->setCreated('2010-01-06 00:00:00');
+$user->save();
\ No newline at end of file
diff --git a/dev/tests/js/jsTestDriverOrder.php b/dev/tests/js/jsTestDriverOrder.php
index e55724a1c6f3ee2dbad2375be5190877862ce65a..7fe3e7f813902dfa98532a645f5c611c8c6b1be9 100644
--- a/dev/tests/js/jsTestDriverOrder.php
+++ b/dev/tests/js/jsTestDriverOrder.php
@@ -32,7 +32,7 @@ return array(
     '/pub/lib/jquery/jquery.js',
     '/pub/lib/jquery/jquery-ui.js',
     '/pub/lib/jquery/jquery.cookie.js',
-    '/pub/lib/head.load.min.js',
+    '/pub/lib/headjs/head.load.min.js',
     '/pub/lib/mage/mage.js',
     '/pub/lib/mage/decorate.js',
     '/pub/lib/jquery/jquery.validate.js',
diff --git a/dev/tests/static/framework/Magento/TestFramework/Utility/Files.php b/dev/tests/static/framework/Magento/TestFramework/Utility/Files.php
index 49d9b988868eb162186aa603123fe9e1a8da4aec..ec14f402d8db33904934beda634e93fb09b2ad12 100644
--- a/dev/tests/static/framework/Magento/TestFramework/Utility/Files.php
+++ b/dev/tests/static/framework/Magento/TestFramework/Utility/Files.php
@@ -47,17 +47,25 @@ class Files
     protected $_path = '';
 
     /**
-     * Setter/Getter for an instance of self
+     * Setter for an instance of self
+     *
+     * Also can unset the current instance, if no arguments are specified
+     *
+     * @param Files|null $instance
+     */
+    public static function setInstance(Files $instance = null)
+    {
+        self::$_instance = $instance;
+    }
+
+    /**
+     * Getter for an instance of self
      *
-     * @param \Magento\TestFramework\Utility\Files $instance
      * @return \Magento\TestFramework\Utility\Files
      * @throws \Exception when there is no instance set
      */
-    public static function init(\Magento\TestFramework\Utility\Files $instance = null)
+    public static function init()
     {
-        if ($instance) {
-            self::$_instance = $instance;
-        }
         if (!self::$_instance) {
             throw new \Exception('Instance is not set yet.');
         }
@@ -633,8 +641,9 @@ class Files
             /**
              * Use realpath() instead of file_exists() to avoid incorrect work on Windows because of case insensitivity
              * of file names
+             * Note that realpath() automatically changes directory separator to the OS-native
              */
-            if (realpath($fullPath) == $fullPath) {
+            if (realpath($fullPath) == str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $fullPath)) {
                 $fileContent = file_get_contents($fullPath);
                 if (strpos($fileContent, 'namespace ' . $namespace) !== false &&
                     (strpos($fileContent, 'class ' . $className) !== false ||
@@ -715,4 +724,39 @@ class Files
 
         return self::$_cache[$key];
     }
+
+    /**
+     * Read all text files by specified glob pattern and combine them into an array of valid files/directories
+     *
+     * The Magento root path is prepended to all (non-empty) entries
+     *
+     * @param string $globPattern
+     * @return array
+     * @throws \Exception if any of the patterns don't return any result
+     */
+    public static function readLists($globPattern)
+    {
+        $patterns = array();
+        foreach (glob($globPattern) as $list) {
+            $patterns = array_merge($patterns, file($list, FILE_IGNORE_NEW_LINES));
+        }
+
+        // Expand glob patterns
+        $result = array();
+        foreach ($patterns as $pattern) {
+            if (0 === strpos($pattern, '#')) {
+                continue;
+            }
+            /**
+             * Note that glob() for directories will be returned as is,
+             * but passing directory is supported by the tools (phpcpd, phpmd, phpcs)
+             */
+            $files = glob(self::init()->getPathToSource() . '/' . $pattern, GLOB_BRACE);
+            if (empty($files)) {
+                throw new \Exception("The glob() pattern '{$pattern}' didn't return any result.");
+            }
+            $result = array_merge($result, $files);
+        }
+        return $result;
+    }
 }
diff --git a/dev/tests/static/framework/bootstrap.php b/dev/tests/static/framework/bootstrap.php
index 336db8defe5e60219ef18ede6ee281b93c8f220e..17c46092271893331a1bc1634d0c2a75908f1365 100644
--- a/dev/tests/static/framework/bootstrap.php
+++ b/dev/tests/static/framework/bootstrap.php
@@ -32,7 +32,7 @@ require BP . '/app/autoload.php';
     dirname(__DIR__) . '/testsuite',
     BP . '/lib',
 ));
-\Magento\TestFramework\Utility\Files::init(new \Magento\TestFramework\Utility\Files(BP));
+\Magento\TestFramework\Utility\Files::setInstance(new \Magento\TestFramework\Utility\Files(BP));
 
 function tool_autoloader($className)
 {
diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/FilesTest.php b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/FilesTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..a55af184b5cefb0b02e331e85fb95c3c3cc89cc2
--- /dev/null
+++ b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/FilesTest.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\TestFramework\Utility;
+
+class FilesTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var string
+     */
+    private static $baseDir;
+
+    public static function setUpBeforeClass()
+    {
+        self::$baseDir = __DIR__ . '/_files/foo';
+        Files::setInstance(new Files(self::$baseDir));
+    }
+
+    public static function tearDownAfterClass()
+    {
+        Files::setInstance();
+    }
+
+    public function testReadLists()
+    {
+        $result = Files::init()->readLists(__DIR__ . '/_files/*good.txt');
+
+        // the braces
+        $this->assertContains(self::$baseDir . '/one.txt', $result);
+        $this->assertContains(self::$baseDir . '/two.txt', $result);
+
+        // directory is returned as-is, without expanding contents recursively
+        $this->assertContains(self::$baseDir . '/bar', $result);
+
+        // the * wildcard
+        $this->assertContains(self::$baseDir . '/baz/one.txt', $result);
+        $this->assertContains(self::$baseDir . '/baz/two.txt', $result);
+    }
+
+    public function testReadListsWrongPattern()
+    {
+        $this->assertSame(array(), Files::init()->readLists(__DIR__ . '/_files/no_good.txt'));
+    }
+
+    /**
+     * @expectedException \Exception
+     * @expectedExceptionMessage The glob() pattern 'bar/unknown' didn't return any result.
+     */
+    public function testReadListsCorruptedDir()
+    {
+        Files::init()->readLists(__DIR__ . '/_files/list_corrupted_dir.txt');
+    }
+
+    /**
+     * @expectedException \Exception
+     * @expectedExceptionMessage The glob() pattern 'unknown.txt' didn't return any result.
+     */
+    public function testReadListsCorruptedFile()
+    {
+        Files::init()->readLists(__DIR__ . '/_files/list_corrupted_file.txt');
+    }
+}
diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/bar/one.txt b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/bar/one.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/bar/recursive/one.txt b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/bar/recursive/one.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/bar/recursive/two.txt b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/bar/recursive/two.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/bar/two.txt b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/bar/two.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/baz/one.txt b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/baz/one.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/baz/two.txt b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/baz/two.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/one.txt b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/one.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/two.txt b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/foo/two.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/list_corrupted_dir.txt b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/list_corrupted_dir.txt
new file mode 100644
index 0000000000000000000000000000000000000000..547500b58830b01accba1ca756bacf0ec6acecd9
--- /dev/null
+++ b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/list_corrupted_dir.txt
@@ -0,0 +1,2 @@
+one.txt
+bar/unknown
diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/list_corrupted_file.txt b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/list_corrupted_file.txt
new file mode 100644
index 0000000000000000000000000000000000000000..290ae97cdbc16c8de15adb307cb18933a01644df
--- /dev/null
+++ b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/list_corrupted_file.txt
@@ -0,0 +1,3 @@
+one.txt
+two.txt
+unknown.txt
diff --git a/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/list_good.txt b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/list_good.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f7681982e34d1b23cf9d7758176d22d3676c4d40
--- /dev/null
+++ b/dev/tests/static/framework/tests/unit/testsuite/Magento/TestFramework/Utility/_files/list_good.txt
@@ -0,0 +1,4 @@
+# comments are ignored
+{one,two}.txt
+bar
+baz/*.txt
diff --git a/dev/tests/static/testsuite/Magento/Test/Js/LiveCodeTest.php b/dev/tests/static/testsuite/Magento/Test/Js/LiveCodeTest.php
index af0e3a74d3d4397a3df75faac31417d54cafc550..030df32fe46f03499fe879e9bb8950fc54a53ec6 100644
--- a/dev/tests/static/testsuite/Magento/Test/Js/LiveCodeTest.php
+++ b/dev/tests/static/testsuite/Magento/Test/Js/LiveCodeTest.php
@@ -24,11 +24,17 @@
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
+namespace Magento\Test\Js;
+
 /**
- * JSHint static code analysis tests for javascript files
+ * Duplicating the same namespace in the "use" below is a workaround to comply with
+ * \Magento\Test\Integrity\ClassesTest::testClassReferences()
  */
-namespace Magento\Test\Js;
+use Magento\TestFramework\Utility\Files, Magento\TestFramework\Utility\AggregateInvoker;
 
+/**
+ * JSHint static code analysis tests for javascript files
+ */
 class LiveCodeTest extends \PHPUnit_Framework_TestCase
 {
     /**
@@ -72,14 +78,14 @@ class LiveCodeTest extends \PHPUnit_Framework_TestCase
      */
     public static function setUpBeforeClass()
     {
-        $reportDir = \Magento\TestFramework\Utility\Files::init()->getPathToSource() . '/dev/tests/static/report';
+        $reportDir = Files::init()->getPathToSource() . '/dev/tests/static/report';
         if (!is_dir($reportDir)) {
             mkdir($reportDir, 0777);
         }
         self::$_reportFile = $reportDir . '/js_report.txt';
         @unlink(self::$_reportFile);
-        $whiteList = self::_readLists(__DIR__ . '/_files/whitelist/*.txt');
-        $blackList = self::_readLists(__DIR__ . '/_files/blacklist/*.txt');
+        $whiteList = Files::readLists(__DIR__ . '/_files/whitelist/*.txt');
+        $blackList = Files::readLists(__DIR__ . '/_files/blacklist/*.txt');
         foreach ($blackList as $listFiles) {
             self::$_blackListJsFiles = array_merge(self::$_blackListJsFiles, self::_scanJsFile($listFiles));
         }
@@ -95,7 +101,7 @@ class LiveCodeTest extends \PHPUnit_Framework_TestCase
 
     public function testCodeJsHint()
     {
-        $invoker = new \Magento\TestFramework\Utility\AggregateInvoker($this);
+        $invoker = new AggregateInvoker($this);
         $invoker(
             /**
              * @param string $filename
@@ -128,25 +134,4 @@ class LiveCodeTest extends \PHPUnit_Framework_TestCase
         };
         return array_map($map, self::$_whiteListJsFiles);
     }
-
-    /**
-     * Read all text files by specified glob pattern and combine them into an array of valid files/directories
-     *
-     * The Magento root path is prepended to all (non-empty) entries
-     *
-     * @param string $globPattern
-     * @return array
-     */
-    protected static function _readLists($globPattern)
-    {
-        $result = array();
-        foreach (glob($globPattern) as $list) {
-            $result = array_merge($result, file($list));
-        }
-        $map = function ($value) {
-            return trim($value) ?
-                \Magento\TestFramework\Utility\Files::init()->getPathToSource() . '/' . trim($value) : '';
-        };
-        return array_filter(array_map($map, $result), 'file_exists');
-    }
 }
diff --git a/dev/tests/static/testsuite/Magento/Test/Js/_files/blacklist/core.txt b/dev/tests/static/testsuite/Magento/Test/Js/_files/blacklist/core.txt
index 9ac33494f34e4ec91b5d08ef639eb8df3e012ee6..0b919ec4ec732569496d5bcf66342b1a951b29de 100644
--- a/dev/tests/static/testsuite/Magento/Test/Js/_files/blacklist/core.txt
+++ b/dev/tests/static/testsuite/Magento/Test/Js/_files/blacklist/core.txt
@@ -1,20 +1,20 @@
-pub/lib/head.load.min.js
-pub/lib/mage/adminhtml
-pub/lib/mage/backend/editablemultiselect.js
-pub/lib/mage/captcha.js
-pub/lib/mage/directpost.js
-pub/lib/mage/jquery-no-conflict.js
-app/code/Magento/Theme/view/frontend/menu.js
-app/code/Magento/Checkout/view/frontend/multishipping/payment.js
-app/code/Magento/Checkout/view/frontend/onepage/accordion.js
-app/code/Magento/Checkout/view/frontend/opcheckout.js
+app/code/Magento/Backend/view/adminhtml/variables.js
 app/code/Magento/Captcha/view/frontend/onepage.js
 app/code/Magento/Catalog/view/adminhtml/catalog/category/edit.js
-app/code/Magento/Catalog/view/adminhtml/catalog/product/composite/configure.js
 app/code/Magento/Catalog/view/adminhtml/catalog/product.js
-app/code/Magento/Adminhtml/view/adminhtml/rules.js
+app/code/Magento/Catalog/view/adminhtml/catalog/product/composite/configure.js
+app/code/Magento/Checkout/view/frontend/js/accordion.js
+app/code/Magento/Checkout/view/frontend/js/opcheckout.js
+app/code/Magento/Checkout/view/frontend/js/payment.js
+app/code/Magento/Rule/view/adminhtml/rules.js
 app/code/Magento/Sales/view/adminhtml/order/create/giftmessage.js
 app/code/Magento/Sales/view/adminhtml/order/create/scripts.js
 app/code/Magento/Sales/view/adminhtml/order/giftoptions_tooltip.js
 app/code/Magento/Sales/view/adminhtml/order/shipment/packaging.js
-app/code/Magento/Adminhtml/view/adminhtml/variables.js
+app/code/Magento/Theme/view/frontend/menu.js
+pub/lib/mage/adminhtml
+pub/lib/mage/backend/editablemultiselect.js
+pub/lib/mage/captcha.js
+pub/lib/mage/directpost.js
+pub/lib/mage/flex.js
+pub/lib/mage/jquery-no-conflict.js
diff --git a/dev/tests/static/testsuite/Magento/Test/Js/_files/whitelist/core.txt b/dev/tests/static/testsuite/Magento/Test/Js/_files/whitelist/core.txt
index 54c56692c82c8416a15da9b65f59f79b1ffcd994..c7a5d925e00bf631001e419c07b3bd8600bd49ee 100644
--- a/dev/tests/static/testsuite/Magento/Test/Js/_files/whitelist/core.txt
+++ b/dev/tests/static/testsuite/Magento/Test/Js/_files/whitelist/core.txt
@@ -1,21 +1,20 @@
-pub/lib/mage
-app/code/Magento/Install
+app/code/Magento/Authorizenet
+app/code/Magento/Bundle
+app/code/Magento/Captcha
 app/code/Magento/Catalog
-app/code/Magento/Newsletter
-app/code/Magento/Theme
-app/code/Magento/PageCache
 app/code/Magento/CatalogSearch
 app/code/Magento/Checkout
-app/code/Magento/Captcha
 app/code/Magento/Customer
 app/code/Magento/Downloadable
-app/code/Magento/Persistent
-app/code/Magento/Wishlist
-app/code/Magento/Bundle
-app/code/Magento/Adminhtml
+app/code/Magento/GiftMessage
+app/code/Magento/Install
+app/code/Magento/Newsletter
+app/code/Magento/PageCache
+app/code/Magento/Paygate
 app/code/Magento/Payment
 app/code/Magento/Paypal
-app/code/Magento/GiftMessage
+app/code/Magento/Persistent
 app/code/Magento/Sales
-app/code/Magento/Authorizenet
-app/code/Magento/Paygate
+app/code/Magento/Theme
+app/code/Magento/Wishlist
+pub/lib/mage
diff --git a/dev/tests/static/testsuite/Magento/Test/Php/LiveCodeTest.php b/dev/tests/static/testsuite/Magento/Test/Php/LiveCodeTest.php
index 95c82d9f89c1aac2ab036b63d9abf63f8314ff2e..e72132c4f240e86cba057cc80b6f4995c96d4f5c 100644
--- a/dev/tests/static/testsuite/Magento/Test/Php/LiveCodeTest.php
+++ b/dev/tests/static/testsuite/Magento/Test/Php/LiveCodeTest.php
@@ -24,11 +24,12 @@
  * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  */
 
+namespace Magento\Test\Php;
+use Magento\TestFramework\Utility;
+
 /**
  * Set of tests for static code analysis, e.g. code style, code complexity, copy paste detecting, etc.
  */
-namespace Magento\Test\Php;
-
 class LiveCodeTest extends \PHPUnit_Framework_TestCase
 {
     /**
@@ -48,7 +49,7 @@ class LiveCodeTest extends \PHPUnit_Framework_TestCase
 
     public static function setUpBeforeClass()
     {
-        self::$_reportDir = \Magento\TestFramework\Utility\Files::init()->getPathToSource()
+        self::$_reportDir = Utility\Files::init()->getPathToSource()
             . '/dev/tests/static/report';
         if (!is_dir(self::$_reportDir)) {
             mkdir(self::$_reportDir, 0777);
@@ -61,8 +62,8 @@ class LiveCodeTest extends \PHPUnit_Framework_TestCase
         if ($type != '' && !preg_match('/\/$/', $type)) {
             $type = $type . '/';
         }
-        self::$_whiteList = self::_readLists(__DIR__ . '/_files/' . $type . 'whitelist/*.txt');
-        self::$_blackList = self::_readLists(__DIR__ . '/_files/' . $type . 'blacklist/*.txt');
+        self::$_whiteList = Utility\Files::readLists(__DIR__ . '/_files/' . $type . 'whitelist/*.txt');
+        self::$_blackList = Utility\Files::readLists(__DIR__ . '/_files/' . $type . 'blacklist/*.txt');
     }
 
     /**
@@ -158,39 +159,4 @@ class LiveCodeTest extends \PHPUnit_Framework_TestCase
             "PHP Copy/Paste Detector has found error(s): See detailed report in $reportFile"
         );
     }
-
-    /**
-     * Read all text files by specified glob pattern and combine them into an array of valid files/directories
-     *
-     * The Magento root path is prepended to all (non-empty) entries
-     *
-     * @param string $globPattern
-     * @return array
-     * @throws \Exception if any of the patterns don't return any result
-     */
-    protected static function _readLists($globPattern)
-    {
-        $patterns = array();
-        foreach (glob($globPattern) as $list) {
-            $patterns = array_merge($patterns, file($list, FILE_IGNORE_NEW_LINES));
-        }
-
-        // Expand glob patterns
-        $result = array();
-        foreach ($patterns as $pattern) {
-            if (0 === strpos($pattern, '#')) {
-                continue;
-            }
-            /**
-             * Note that glob() for directories will be returned as is,
-             * but passing directory is supported by the tools (phpcpd, phpmd, phpcs)
-             */
-            $files = glob(\Magento\TestFramework\Utility\Files::init()->getPathToSource() . '/' . $pattern, GLOB_BRACE);
-            if (empty($files)) {
-                throw new \Exception("The glob() pattern '{$pattern}' didn't return any result.");
-            }
-            $result = array_merge($result, $files);
-        }
-        return $result;
-    }
 }
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 630aa0f424b20bb2c9b36adeddf457b066d9e79f..c0726a3247d5fc48f27d086667365198300136d0 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
@@ -50,6 +50,7 @@ Magento/Cron/Model/Config/Backend/Product
 Magento/Customer/Block/Account/Dashboard
 Magento/Customer/Block/Adminhtml/Edit/Tab
 Magento/Customer/Model/Config/Backend/Show
+Magento/Customer/Model/Metadata
 Magento/DesignEditor/Block/Adminhtml/Editor/Tools/Code
 Magento/DesignEditor/Block/Adminhtml/Theme/Selector/Tab
 Magento/DesignEditor/Model/Url
diff --git a/dev/tests/unit/testsuite/Magento/Authorizenet/Model/Directpost/ObserverTest.php b/dev/tests/unit/testsuite/Magento/Authorizenet/Model/Directpost/ObserverTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..75c3ec36c007c0176b545eaf9ddf765f20cac404
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Authorizenet/Model/Directpost/ObserverTest.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\Authorizenet\Model\Directpost;
+
+class ObserverTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var Observer
+     */
+    protected $model;
+
+    /**
+     * @var \Magento\Core\Model\Registry|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $coreRegistry;
+
+    /**
+     * @var \Magento\Core\Helper\Data|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $coreData;
+
+    protected function setUp()
+    {
+        $helper = new \Magento\TestFramework\Helper\ObjectManager($this);
+        $store = $this->getMock('Magento\Core\Model\Store', [], [], '', false);
+        $this->coreRegistry = $this->getMock('Magento\Core\Model\Registry', []);
+        $storeManager = $this->getMockForAbstractClass('Magento\Core\Model\StoreManagerInterface');
+        $storeManager->expects($this->any())->method('getStore')->will($this->returnValue($store));
+        $payment = $this->getMock('Magento\Authorizenet\Model\Directpost', null, [], '', false);
+        $this->coreData = $this->getMock('Magento\Core\Helper\Data', [], [], '', false);
+        $this->model = $helper->getObject('Magento\Authorizenet\Model\Directpost\Observer', [
+            'coreRegistry' => $this->coreRegistry,
+            'storeManager' => $storeManager,
+            'payment' => $payment,
+            'coreData' => $this->coreData
+        ]);
+    }
+
+    public function testAddAdditionalFieldsToResponseFrontend()
+    {
+        $directpostRequest = $this->getMock('Magento\Authorizenet\Model\Directpost\Request', []);
+        $order = $this->getMock('Magento\Sales\Model\Order', [], [], '', false);
+
+        $methodInstance = $this->getMock('Magento\Authorizenet\Model\Directpost', [], [], '', false);
+        $methodInstance->expects($this->once())
+            ->method('generateRequestFromOrder')
+            ->with($this->identicalTo($order))
+            ->will($this->returnValue($directpostRequest));
+
+        $payment = $this->getMock('Magento\Sales\Model\Order\Payment', [
+            'getMethodInstance',
+            '__wakeup'
+        ], [], '', false);
+        $payment->expects($this->once())->method('getMethodInstance')->will($this->returnValue($methodInstance));
+        $payment->setMethod('authorizenet_directpost');
+
+        $order->expects($this->once())->method('getId')->will($this->returnValue(1));
+        $order->expects($this->atLeastOnce())->method('getPayment')->will($this->returnValue($payment));
+
+
+        $this->coreRegistry->expects($this->once())
+            ->method('registry')
+            ->with('directpost_order')
+            ->will($this->returnValue($order));
+
+        $request = new \Magento\Object();
+        $response = $this->getMock('Magento\App\Response\Http', [], [], '', false);
+        $controller = $this->getMock('Magento\Checkout\Controller\Action', [
+            'getRequest',
+            'getResponse'
+        ], [], '', false);
+        $controller->expects($this->once())->method('getRequest')->will($this->returnValue($request));
+        $controller->expects($this->once())->method('getResponse')->will($this->returnValue($response));
+        $observer = new \Magento\Event\Observer(['event' => new \Magento\Object(['controller_action' => $controller])]);
+
+        $this->coreData->expects($this->once())
+            ->method('jsonEncode')
+            ->with(self::logicalNot(self::isEmpty()))
+            ->will($this->returnValue('encoded response'));
+        $response->expects($this->once())
+            ->method('clearHeader')
+            ->with('Location');
+        $response->expects($this->once())
+            ->method('setBody')
+            ->with('encoded response');
+        $this->model->addAdditionalFieldsToResponseFrontend($observer);
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Backend/Block/Widget/Grid/Column/Renderer/CurrencyTest.php b/dev/tests/unit/testsuite/Magento/Backend/Block/Widget/Grid/Column/Renderer/CurrencyTest.php
index f200d7e4f51bf1b0c65edddac499c1628b1537ea..1a5d32cdc07a9b86d9335812cb49261be4bf6a1c 100644
--- a/dev/tests/unit/testsuite/Magento/Backend/Block/Widget/Grid/Column/Renderer/CurrencyTest.php
+++ b/dev/tests/unit/testsuite/Magento/Backend/Block/Widget/Grid/Column/Renderer/CurrencyTest.php
@@ -59,6 +59,11 @@ class CurrencyTest extends \PHPUnit_Framework_TestCase
      */
     protected $_requestMock;
 
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $_currencyMock;
+
     /**
      * @var \Magento\Object
      */
@@ -80,6 +85,21 @@ class CurrencyTest extends \PHPUnit_Framework_TestCase
             ->method('getIndex')
             ->will($this->returnValue('columnIndex'));
 
+        $this->_currencyMock = $this->getMock('Magento\Directory\Model\Currency', array(), array(), '', false);
+        $this->_currencyMock->expects($this->any())
+            ->method('load')
+            ->will($this->returnSelf());
+        $currencyFactoryMock = $this->getMock(
+            'Magento\Directory\Model\CurrencyFactory',
+            array('create'),
+            array(),
+            '',
+            false
+        );
+        $currencyFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_currencyMock));
+
         $this->_row = new \Magento\Object(array('columnIndex' => '10'));
 
         $helper = new \Magento\TestFramework\Helper\ObjectManager($this);
@@ -87,7 +107,8 @@ class CurrencyTest extends \PHPUnit_Framework_TestCase
             'storeManager' => $this->_storeManagerMock,
             'locale' => $this->_localeMock,
             'currencyLocator' => $this->_curLocatorMock,
-            'request' => $this->_requestMock
+            'request' => $this->_requestMock,
+            'currencyFactory' => $currencyFactoryMock
             )
         );
 
@@ -111,17 +132,9 @@ class CurrencyTest extends \PHPUnit_Framework_TestCase
      */
     public function testRenderWithDefaultCurrency()
     {
-        $currencyMock = $this->getMock('Magento\Directory\Model\Currency', array(), array(), '', false);
-        $currencyMock->expects($this->once())->method('getRate')->with('defaultCurrency')
+        $this->_currencyMock->expects($this->once())->method('getRate')->with('defaultCurrency')
             ->will($this->returnValue(1.5));
 
-        $storeMock = $this->getMock('Magento\Core\Model\Store', array(), array(), '', false);
-        $storeMock->expects($this->once())->method('getBaseCurrency')->will($this->returnValue($currencyMock));
-
-        $this->_storeManagerMock->expects($this->once())
-            ->method('getStore')
-            ->will($this->returnValue($storeMock));
-
         $this->_curLocatorMock->expects($this->any())
             ->method('getDefaultCurrency')
             ->with($this->_requestMock)
diff --git a/dev/tests/unit/testsuite/Magento/Customer/Model/ConverterTest.php b/dev/tests/unit/testsuite/Magento/Customer/Model/ConverterTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..542059b9ce3f31ca851d6b3431ff36098e9aeeb6
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Customer/Model/ConverterTest.php
@@ -0,0 +1,154 @@
+<?php
+/**
+ * Unit test for converter \Magento\Customer\Model\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\Customer\Model;
+
+class ConverterTest extends \PHPUnit_Framework_TestCase
+{
+    public function testCreateCustomerFromModel()
+    {
+        $customerModelMock =
+            $this->getMockBuilder('Magento\Customer\Model\Customer')
+                ->disableOriginalConstructor()
+                ->setMethods(
+                    array(
+                        'getId',
+                        'getFirstname',
+                        'getLastname',
+                        'getEmail',
+                        'getAttributes',
+                        'getData',
+                        '__wakeup',
+                    )
+                )
+                ->getMock();
+
+        $attributeModelMock =
+            $this->getMockBuilder('\Magento\Customer\Model\Attribute')
+                ->disableOriginalConstructor()
+                ->getMock();
+
+        $attributeModelMock
+            ->expects($this->at(0))
+            ->method('getAttributeCode')
+            ->will($this->returnValue('attribute_code'));
+
+        $attributeModelMock
+            ->expects($this->at(1))
+            ->method('getAttributeCode')
+            ->will($this->returnValue('attribute_code2'));
+
+        $attributeModelMock
+            ->expects($this->at(2))
+            ->method('getAttributeCode')
+            ->will($this->returnValue('attribute_code3'));
+
+        $this->_mockReturnValue(
+            $customerModelMock,
+            array(
+                'getId' => 1,
+                'getFirstname' => 'Tess',
+                'getLastname' => 'Tester',
+                'getEmail' => 'ttester@example.com',
+                'getAttributes' => [$attributeModelMock, $attributeModelMock, $attributeModelMock],
+            )
+        );
+
+        $map = [
+            ['attribute_code', null, 'attributeValue'],
+            ['attribute_code2', null, 'attributeValue2'],
+            ['attribute_code3', null, null],
+        ];
+        $customerModelMock
+            ->expects($this->any())
+            ->method('getData')
+            ->will($this->returnValueMap($map));
+
+        $customerBuilder = new \Magento\Customer\Service\V1\Dto\CustomerBuilder();
+        $customerFactory = $this->getMockBuilder('Magento\Customer\Model\CustomerFactory')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $converter = new Converter($customerBuilder, $customerFactory);
+        $customerDto = $converter->createCustomerFromModel($customerModelMock);
+
+        $customerBuilder = new \Magento\Customer\Service\V1\Dto\CustomerBuilder();
+        $customerData = [
+            'firstname' => 'Tess',
+            'email' => 'ttester@example.com',
+            'lastname' => 'Tester',
+            'id' => 1,
+            'attribute_code' => 'attributeValue',
+            'attribute_code2' => 'attributeValue2'
+        ];
+        // There will be no attribute_code3: it has a value of null, so the converter will drop it
+        $customerBuilder->populateWithArray($customerData);
+        $expectedCustomerDto = $customerBuilder->create();
+
+        $this->assertEquals($expectedCustomerDto, $customerDto);
+    }
+
+    /**
+     * @dataProvider createCustomerFromModelBadParamDataProvider
+     * @expectedException \InvalidArgumentException
+     * @expectedExceptionMessage customer model is invalid
+     */
+    public function testCreateCustomerFromModelBadParam($param)
+    {
+        $customerBuilder = $this->getMockBuilder('Magento\Customer\Service\V1\Dto\CustomerBuilder')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $customerFactory = $this->getMockBuilder('Magento\Customer\Model\CustomerFactory')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $converter = new Converter($customerBuilder, $customerFactory);
+        $converter->createCustomerFromModel($param);
+    }
+
+    public function createCustomerFromModelBadParamDataProvider()
+    {
+        return [
+            [null],
+            ['a string'],
+            [5],
+            [new \Magento\Object()],
+        ];
+    }
+
+    /**
+     * @param \PHPUnit_Framework_MockObject_MockObject $mock
+     * @param array $valueMap
+     */
+    private function _mockReturnValue($mock, $valueMap)
+    {
+        foreach ($valueMap as $method => $value) {
+            $mock->expects($this->any())
+                ->method($method)
+                ->will($this->returnValue($value));
+        }
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Customer/Service/CustomerTest.php b/dev/tests/unit/testsuite/Magento/Customer/Service/CustomerTest.php
index 6410d0b3e205e7ca752bab2ff981373330088849..065658c71339e57b0147327c95ec52d870549e80 100644
--- a/dev/tests/unit/testsuite/Magento/Customer/Service/CustomerTest.php
+++ b/dev/tests/unit/testsuite/Magento/Customer/Service/CustomerTest.php
@@ -79,6 +79,7 @@ class CustomerTest extends \PHPUnit_Framework_TestCase
             )
             ->disableOriginalConstructor()
             ->getMock();
+
         $this->_customerFactory->expects($this->any())
             ->method('create')
             ->will($this->returnValue($this->_customer));
diff --git a/dev/tests/unit/testsuite/Magento/Customer/Service/V1/CustomerAccountServiceTest.php b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/CustomerAccountServiceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..87f0cd6fefca1af04b779d768a2d1154591e59d6
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/CustomerAccountServiceTest.php
@@ -0,0 +1,1030 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Customer\Service\V1;
+
+/**
+ * \Magento\Customer\Service\V1\CustomerAccountService
+ *
+ * @SuppressWarnings(PHPMD.TooManyMethods)
+ * @SuppressWarnings(PHPMD.ExcessivePublicCount)
+ * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
+class CustomerAccountServiceTest extends \PHPUnit_Framework_TestCase
+{
+
+    const STREET = 'Parmer';
+    const CITY = 'Albuquerque';
+    const POSTCODE = '90014';
+    const TELEPHONE = '7143556767';
+    const REGION = 'Alabama';
+    const REGION_ID = 1;
+    const COUNTRY_ID = 'US';
+
+    /** Sample values for testing */
+    const ID = 1;
+    const FIRSTNAME = 'Jane';
+    const LASTNAME = 'Doe';
+    const NAME = 'J';
+    const EMAIL = 'janedoe@example.com';
+    const EMAIL_CONFIRMATION_KEY = 'blj487lkjs4confirmation_key';
+    const PASSWORD = 'password';
+    const ATTRIBUTE_CODE = 'random_attr_code';
+    const ATTRIBUTE_VALUE = 'random_attr_value';
+    const WEBSITE_ID = 1;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Model\CustomerFactory
+     */
+    private $_customerFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Model\AddressFactory
+     */
+    private $_addressFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Model\Customer
+     */
+    private $_customerModelMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Model\Attribute
+     */
+    private $_attributeModelMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Service\V1\CustomerMetadataServiceInterface
+     */
+    private $_eavMetadataServiceMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Event\ManagerInterface
+     */
+    private $_eventManagerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Core\Model\StoreManagerInterface
+     */
+    private $_storeManagerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Math\Random
+     */
+    private $_mathRandomMock;
+
+    /**
+     * @var \Magento\Customer\Model\Converter
+     */
+    private $_converter;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Core\Model\Store
+     */
+    private $_storeMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Service\V1\Dto\AddressBuilder
+     */
+    private $_addressBuilder;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Service\V1\Dto\CustomerBuilder
+     */
+    private $_customerBuilder;
+
+    private $_validator;
+
+    private $_customerServiceMock;
+
+    private $_customerAddressServiceMock;
+
+    public function setUp()
+    {
+        $this->_customerFactoryMock = $this->getMockBuilder('Magento\Customer\Model\CustomerFactory')
+            ->disableOriginalConstructor()
+            ->setMethods(array('create'))
+            ->getMock();
+
+        $this->_customerModelMock = $this->getMockBuilder('Magento\Customer\Model\Customer')
+            ->disableOriginalConstructor()
+            ->setMethods(
+                array(
+                    'getId',
+                    'getFirstname',
+                    'getLastname',
+                    'getName',
+                    'getEmail',
+                    'getAttributes',
+                    'getConfirmation',
+                    'setConfirmation',
+                    'save',
+                    'load',
+                    '__wakeup',
+                    'authenticate',
+                    'getData',
+                    'getDefaultBilling',
+                    'getDefaultShipping',
+                    'getDefaultShippingAddress',
+                    'getDefaultBillingAddress',
+                    'getStoreId',
+                    'getAddressById',
+                    'getAddresses',
+                    'getAddressItemById',
+                    'getParentId',
+                    'isConfirmationRequired',
+                    'addAddress',
+                    'loadByEmail',
+                    'sendNewAccountEmail',
+                    'setFirstname',
+                    'setLastname',
+                    'setEmail',
+                    'setPassword',
+                    'setData',
+                    'setWebsiteId',
+                    'getAttributeSetId',
+                    'setAttributeSetId',
+                    'validate',
+                    'getRpToken',
+                    'setRpToken',
+                    'setRpTokenCreatedAt',
+                    'isResetPasswordLinkTokenExpired',
+                    'changeResetPasswordLinkToken',
+                    'sendPasswordResetConfirmationEmail',
+                )
+            )
+            ->getMock();
+
+        $this->_addressFactoryMock = $this->getMockBuilder('Magento\Customer\Model\AddressFactory')
+            ->disableOriginalConstructor()
+            ->setMethods(array('create'))
+            ->getMock();
+
+        $this->_eavMetadataServiceMock =
+            $this->getMockBuilder('Magento\Customer\Service\Eav\AttributeMetadataServiceV1Interface')
+                ->disableOriginalConstructor()
+                ->getMock();
+
+        $this->_eventManagerMock =
+            $this->getMockBuilder('\Magento\Event\ManagerInterface')
+                ->disableOriginalConstructor()
+                ->getMock();
+
+        $this->_attributeModelMock =
+            $this->getMockBuilder('\Magento\Customer\Model\Attribute')
+                ->disableOriginalConstructor()
+                ->getMock();
+
+        $this->_attributeModelMock
+            ->expects($this->any())
+            ->method('getAttributeCode')
+            ->will($this->returnValue(self::ATTRIBUTE_CODE));
+
+        $this->_customerModelMock
+            ->expects($this->any())
+            ->method('getData')
+            ->with($this->equalTo(self::ATTRIBUTE_CODE))
+            ->will($this->returnValue(self::ATTRIBUTE_VALUE));
+
+        $this->_customerModelMock
+            ->expects($this->any())
+            ->method('validate')
+            ->will($this->returnValue(TRUE));
+
+        $this->_setupStoreMock();
+
+        $this->_mathRandomMock = $this->getMockBuilder('\Magento\Math\Random')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->_validator = $this->getMockBuilder('\Magento\Customer\Model\Metadata\Validator')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->_addressBuilder = new Dto\AddressBuilder(
+            new Dto\RegionBuilder());
+
+        $this->_customerBuilder = new Dto\CustomerBuilder();
+
+        $customerBuilder = new Dto\CustomerBuilder();
+
+        $this->_converter = new \Magento\Customer\Model\Converter($customerBuilder, $this->_customerFactoryMock);
+
+        $this->_customerServiceMock = $this->getMockBuilder('\Magento\Customer\Service\V1\CustomerService')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->_customerAddressServiceMock =
+            $this->getMockBuilder('\Magento\Customer\Service\V1\CustomerAddressService')
+            ->disableOriginalConstructor()
+            ->getMock();
+    }
+
+
+    public function testActivateAccount()
+    {
+        $this->_customerModelMock->expects($this->any())
+            ->method('load')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $this->_mockReturnValue(
+            $this->_customerModelMock,
+            array(
+                'getId' => self::ID,
+                'getConfirmation' => self::EMAIL_CONFIRMATION_KEY,
+                'getAttributes' => array(),
+            )
+        );
+
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        // Assertions
+        $this->_customerModelMock->expects($this->once())
+            ->method('save');
+        $this->_customerModelMock->expects($this->once())
+            ->method('setConfirmation')
+            ->with($this->isNull());
+
+        $customerService = $this->_createService();
+
+        $customer = $customerService->activateAccount(self::ID, self::EMAIL_CONFIRMATION_KEY);
+
+        $this->assertEquals(self::ID, $customer->getCustomerId());
+    }
+
+    /**
+     * @expectedException  \Magento\Customer\Service\Entity\V1\Exception
+     */
+    public function testActivateAccountAlreadyActive()
+    {
+        $this->_customerModelMock->expects($this->any())
+            ->method('load')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $this->_mockReturnValue(
+            $this->_customerModelMock,
+            array(
+                'getId' => self::ID,
+                'getConfirmation' => null,
+                'getAttributes' => array()
+            )
+        );
+
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        // Assertions
+        $this->_customerModelMock->expects($this->never())
+            ->method('save');
+        $this->_customerModelMock->expects($this->never())
+            ->method('setConfirmation');
+
+        $customerService = $this->_createService();
+
+        $customerService->activateAccount(self::ID, self::EMAIL_CONFIRMATION_KEY);
+    }
+
+    /**
+     * @expectedException \Magento\Customer\Service\Entity\V1\Exception
+     * @expectedExceptionMessage No customer with customerId 1 exists.
+     */
+    public function testActivateAccountDoesntExist()
+    {
+        $this->_customerModelMock->expects($this->any())
+            ->method('load')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $this->_mockReturnValue(
+            $this->_customerModelMock,
+            array(
+                'getId' => 0,
+            )
+        );
+
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        // Assertions
+        $this->_customerModelMock->expects($this->never())
+            ->method('save');
+        $this->_customerModelMock->expects($this->never())
+            ->method('setConfirmation');
+
+        $customerService = $this->_createService();
+
+        $customerService->activateAccount(self::ID, self::EMAIL_CONFIRMATION_KEY);
+    }
+
+    /**
+     * @expectedException \Magento\Customer\Service\Entity\V1\Exception
+     * @expectedExceptionMessage DB was down
+     */
+    public function testActivateAccountLoadError()
+    {
+        $this->_customerModelMock->expects($this->any())
+            ->method('load')
+            ->will($this->throwException(new \Exception('DB was down')));
+
+        $this->_mockReturnValue(
+            $this->_customerModelMock,
+            array(
+                'getId' => 0,
+            )
+        );
+
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        // Assertions
+        $this->_customerModelMock->expects($this->never())
+            ->method('save');
+        $this->_customerModelMock->expects($this->never())
+            ->method('setConfirmation');
+
+        $customerService = $this->_createService();
+
+        $customerService->activateAccount(self::ID, self::EMAIL_CONFIRMATION_KEY);
+    }
+
+    /**
+     * @expectedException \Magento\Core\Exception
+     * @expectedExceptionMessage Wrong confirmation key
+     */
+    public function testActivateAccountBadKey()
+    {
+        $this->_customerModelMock->expects($this->any())
+            ->method('load')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $this->_mockReturnValue(
+            $this->_customerModelMock,
+            array(
+                'getId' => self::ID,
+                'getConfirmation' => self::EMAIL_CONFIRMATION_KEY . 'BAD',
+            )
+        );
+
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        // Assertions
+        $this->_customerModelMock->expects($this->never())
+            ->method('save');
+        $this->_customerModelMock->expects($this->never())
+            ->method('setConfirmation');
+
+        $customerService = $this->_createService();
+
+        $customerService->activateAccount(self::ID, self::EMAIL_CONFIRMATION_KEY);
+    }
+
+    /**
+     * @expectedException \Magento\Core\Exception
+     * @expectedExceptionMessage Failed to confirm customer account
+     */
+    public function testActivateAccountSaveFailed()
+    {
+        $this->_customerModelMock->expects($this->any())
+            ->method('load')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $this->_mockReturnValue(
+            $this->_customerModelMock,
+            array(
+                'getId' => self::ID,
+                'getConfirmation' => self::EMAIL_CONFIRMATION_KEY,
+            )
+        );
+
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        // Assertions/Mocking
+        $this->_customerModelMock->expects($this->once())
+            ->method('save')
+            ->will($this->throwException(new \Exception('DB is down')));
+        $this->_customerModelMock->expects($this->once())
+            ->method('setConfirmation');
+
+        $customerService = $this->_createService();
+
+        $customerService->activateAccount(self::ID, self::EMAIL_CONFIRMATION_KEY);
+    }
+
+    public function testLoginAccount()
+    {
+        $this->_mockReturnValue(
+            $this->_customerModelMock,
+            array(
+                'getId' => self::ID,
+                'authenticate' => true,
+                'load' => $this->_customerModelMock,
+                'getAttributes' => array()
+            )
+        );
+
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $customerService = $this->_createService();
+
+        $customer = $customerService->authenticate(self::EMAIL, self::PASSWORD, self::WEBSITE_ID);
+
+        $this->assertEquals(self::ID, $customer->getCustomerId());
+    }
+
+    /**
+     * @expectedException \Magento\Customer\Service\Entity\V1\Exception
+     * @expectedExceptionMessage exception message
+     */
+    public function testLoginAccountWithException()
+    {
+        $this->_mockReturnValue(
+            $this->_customerModelMock,
+            array(
+                'getId' => self::ID,
+                'load' => $this->_customerModelMock,
+            )
+        );
+
+        $this->_customerModelMock->expects($this->any())
+            ->method('authenticate')
+            ->will($this->throwException(new \Magento\Core\Exception('exception message') ));
+
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $customerService = $this->_createService();
+
+        $customerService->authenticate(self::EMAIL, self::PASSWORD, self::WEBSITE_ID);
+    }
+
+    public function testValidateResetPasswordLinkToken()
+    {
+        $resetToken = 'lsdj579slkj5987slkj595lkj';
+
+        $this->_mockReturnValue(
+            $this->_customerModelMock,
+            array(
+                'getId' => self::ID,
+                'load' => $this->_customerModelMock,
+                'getRpToken' => $resetToken,
+                'isResetPasswordLinkTokenExpired' => false,
+            )
+        );
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $customerService = $this->_createService();
+
+        $customerService->validateResetPasswordLinkToken(self::ID, $resetToken);
+    }
+
+    /**
+     * @expectedException \Magento\Customer\Service\Entity\V1\Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_RESET_TOKEN_EXPIRED
+     * @expectedExceptionMessage Your password reset link has expired.
+     */
+    public function testValidateResetPasswordLinkTokenExpired()
+    {
+        $resetToken = 'lsdj579slkj5987slkj595lkj';
+
+        $this->_mockReturnValue(
+            $this->_customerModelMock,
+            array(
+                'getId' => self::ID,
+                'load' => $this->_customerModelMock,
+                'getRpToken' => $resetToken,
+                'isResetPasswordLinkTokenExpired' => true,
+            )
+        );
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $customerService = $this->_createService();
+
+        $customerService->validateResetPasswordLinkToken(self::ID, $resetToken);
+    }
+
+    /**
+     * @expectedException \Magento\Customer\Service\Entity\V1\Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_RESET_TOKEN_EXPIRED
+     * @expectedExceptionMessage Your password reset link has expired.
+     */
+    public function testValidateResetPasswordLinkTokenInvalid()
+    {
+        $resetToken = 'lsdj579slkj5987slkj595lkj';
+        $invalidToken = $resetToken . 'extra_stuff';
+
+        $this->_mockReturnValue(
+            $this->_customerModelMock,
+            array(
+                'getId' => self::ID,
+                'load' => $this->_customerModelMock,
+                'getRpToken' => $resetToken,
+                'isResetPasswordLinkTokenExpired' => false,
+            )
+        );
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $customerService = $this->_createService();
+
+        $customerService->validateResetPasswordLinkToken(self::ID, $invalidToken);
+    }
+
+    /**
+     * @expectedException \Magento\Customer\Service\Entity\V1\Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_INVALID_CUSTOMER_ID
+     * @expectedExceptionMessage No customer with customerId 1 exists
+     */
+    public function testValidateResetPasswordLinkTokenWrongUser()
+    {
+        $resetToken = 'lsdj579slkj5987slkj595lkj';
+
+        $this->_mockReturnValue(
+            $this->_customerModelMock,
+            array(
+                'getId' => 0,
+                'load' => $this->_customerModelMock,
+                'getRpToken' => $resetToken,
+                'isResetPasswordLinkTokenExpired' => false,
+            )
+        );
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $customerService = $this->_createService();
+
+        $customerService->validateResetPasswordLinkToken(1, $resetToken);
+    }
+
+    /**
+     * @expectedException \Magento\Customer\Service\Entity\V1\Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_INVALID_RESET_TOKEN
+     * @expectedExceptionMessage Invalid password reset token
+     */
+    public function testValidateResetPasswordLinkTokenNull()
+    {
+        $resetToken = 'lsdj579slkj5987slkj595lkj';
+
+        $this->_mockReturnValue(
+            $this->_customerModelMock,
+            array(
+                'getId' => 0,
+                'load' => $this->_customerModelMock,
+                'getRpToken' => $resetToken,
+                'isResetPasswordLinkTokenExpired' => false,
+            )
+        );
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $customerService = $this->_createService();
+
+        $customerService->validateResetPasswordLinkToken(null, null);
+    }
+
+    public function testSendPasswordResetLink()
+    {
+        $email = 'foo@example.com';
+        $this->_mockReturnValue(
+            $this->_customerModelMock,
+            array(
+                'getId' => self::ID,
+                'setWebsiteId' => $this->_customerModelMock,
+                'loadByEmail' => $this->_customerModelMock,
+            )
+        );
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $this->_customerModelMock->expects($this->once())
+            ->method('sendPasswordResetConfirmationEmail');
+
+        $customerService = $this->_createService();
+
+        $customerService->sendPasswordResetLink($email, self::WEBSITE_ID);
+    }
+
+    /**
+     * @expectedException \Magento\Customer\Service\Entity\V1\Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_EMAIL_NOT_FOUND
+     * @expectedExceptionMessage No customer found for the provided email and website ID
+     */
+    public function testSendPasswordResetLinkBadEmailOrWebsite()
+    {
+        $email = 'foo@example.com';
+        $this->_mockReturnValue(
+            $this->_customerModelMock,
+            array(
+                'getId' => 0,
+                'setWebsiteId' => $this->_customerModelMock,
+                'loadByEmail' => $this->_customerModelMock,
+            )
+        );
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $this->_customerModelMock->expects($this->never())
+            ->method('sendPasswordResetConfirmationEmail');
+
+        $customerService = $this->_createService();
+
+        $customerService->sendPasswordResetLink($email, 0);
+    }
+
+    /**
+     * @expectedException \Magento\Customer\Service\Entity\V1\Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_UNKNOWN
+     * @expectedExceptionMessage Invalid transactional email code: 0
+     */
+    public function testSendPasswordResetLinkSendException()
+    {
+        $email = 'foo@example.com';
+        $this->_mockReturnValue(
+            $this->_customerModelMock,
+            array(
+                'getId' => self::ID,
+                'setWebsiteId' => $this->_customerModelMock,
+                'loadByEmail' => $this->_customerModelMock,
+            )
+        );
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $this->_customerModelMock->expects($this->once())
+            ->method('sendPasswordResetConfirmationEmail')
+            ->will($this->throwException(new \Magento\Core\Exception(__('Invalid transactional email code: %1', 0))));
+
+        $customerService = $this->_createService();
+
+        $customerService->sendPasswordResetLink($email, self::WEBSITE_ID);
+    }
+
+    public function testResetPassword()
+    {
+        $resetToken = 'lsdj579slkj5987slkj595lkj';
+        $password = 'password_secret';
+
+        $this->_mockReturnValue(
+            $this->_customerModelMock,
+            array(
+                'getId' => self::ID,
+                'load' => $this->_customerModelMock,
+                'getRpToken' => $resetToken,
+                'isResetPasswordLinkTokenExpired' => false,
+            )
+        );
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $this->_customerModelMock->expects($this->once())
+            ->method('setRpToken')
+            ->with(null)
+            ->will($this->returnSelf());
+        $this->_customerModelMock->expects($this->once())
+            ->method('setRpTokenCreatedAt')
+            ->with(null)
+            ->will($this->returnSelf());
+        $this->_customerModelMock->expects($this->once())
+            ->method('setPassword')
+            ->with($password)
+            ->will($this->returnSelf());
+
+        $customerService = $this->_createService();
+
+        $customerService->resetPassword(self::ID, $password, $resetToken);
+    }
+
+    public function testResetPasswordShortPassword()
+    {
+        $resetToken = 'lsdj579slkj5987slkj595lkj';
+        $password = '';
+
+        $this->_mockReturnValue(
+            $this->_customerModelMock,
+            array(
+                'getId' => self::ID,
+                'load' => $this->_customerModelMock,
+                'getRpToken' => $resetToken,
+                'isResetPasswordLinkTokenExpired' => false,
+            )
+        );
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $this->_customerModelMock->expects($this->once())
+            ->method('setRpToken')
+            ->with(null)
+            ->will($this->returnSelf());
+        $this->_customerModelMock->expects($this->once())
+            ->method('setRpTokenCreatedAt')
+            ->with(null)
+            ->will($this->returnSelf());
+        $this->_customerModelMock->expects($this->once())
+            ->method('setPassword')
+            ->with($password)
+            ->will($this->returnSelf());
+
+        $customerService = $this->_createService();
+
+        $customerService->resetPassword(self::ID, $password, $resetToken);
+    }
+
+    /**
+     * @expectedException \Magento\Customer\Service\Entity\V1\Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_RESET_TOKEN_EXPIRED
+     * @expectedExceptionMessage Your password reset link has expired.
+     */
+    public function testResetPasswordTokenExpired()
+    {
+        $resetToken = 'lsdj579slkj5987slkj595lkj';
+        $password = 'password_secret';
+
+        $this->_mockReturnValue(
+            $this->_customerModelMock,
+            array(
+                'getId' => self::ID,
+                'load' => $this->_customerModelMock,
+                'getRpToken' => $resetToken,
+                'isResetPasswordLinkTokenExpired' => true,
+            )
+        );
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $this->_customerModelMock->expects($this->never())
+            ->method('setRpToken');
+        $this->_customerModelMock->expects($this->never())
+            ->method('setRpTokenCreatedAt');
+        $this->_customerModelMock->expects($this->never())
+            ->method('setPassword');
+
+        $customerService = $this->_createService();
+
+        $customerService->resetPassword(self::ID, $password, $resetToken);
+    }
+
+    /**
+     * @expectedException \Magento\Customer\Service\Entity\V1\Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_RESET_TOKEN_EXPIRED
+     * @expectedExceptionMessage Your password reset link has expired.
+     */
+    public function testResetPasswordTokenInvalid()
+    {
+        $resetToken = 'lsdj579slkj5987slkj595lkj';
+        $invalidToken = $resetToken . 'invalid';
+        $password = 'password_secret';
+
+        $this->_mockReturnValue(
+            $this->_customerModelMock,
+            array(
+                'getId' => self::ID,
+                'load' => $this->_customerModelMock,
+                'getRpToken' => $resetToken,
+                'isResetPasswordLinkTokenExpired' => false,
+            )
+        );
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $this->_customerModelMock->expects($this->never())
+            ->method('setRpToken');
+        $this->_customerModelMock->expects($this->never())
+            ->method('setRpTokenCreatedAt');
+        $this->_customerModelMock->expects($this->never())
+            ->method('setPassword');
+
+        $customerService = $this->_createService();
+
+        $customerService->resetPassword(self::ID, $password, $invalidToken);
+    }
+
+    /**
+     * @expectedException \Magento\Customer\Service\Entity\V1\Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_INVALID_CUSTOMER_ID
+     * @expectedExceptionMessage No customer with customerId 4200 exists
+     */
+    public function testResetPasswordTokenWrongUser()
+    {
+        $resetToken = 'lsdj579slkj5987slkj595lkj';
+        $password = 'password_secret';
+
+        $this->_mockReturnValue(
+            $this->_customerModelMock,
+            array(
+                'getId' => 0,
+                'load' => $this->_customerModelMock,
+                'getRpToken' => $resetToken,
+                'isResetPasswordLinkTokenExpired' => false,
+            )
+        );
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $this->_customerModelMock->expects($this->never())
+            ->method('setRpToken');
+        $this->_customerModelMock->expects($this->never())
+            ->method('setRpTokenCreatedAt');
+        $this->_customerModelMock->expects($this->never())
+            ->method('setPassword');
+
+        $customerService = $this->_createService();
+
+        $customerService->resetPassword(4200, $password, $resetToken);
+    }
+
+    /**
+     * @expectedException \Magento\Customer\Service\Entity\V1\Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_INVALID_RESET_TOKEN
+     * @expectedExceptionMessage Invalid password reset token
+     */
+    public function testResetPasswordTokenInvalidUserId()
+    {
+        $resetToken = 'lsdj579slkj5987slkj595lkj';
+        $password = 'password_secret';
+
+        $this->_mockReturnValue(
+            $this->_customerModelMock,
+            array(
+                'getId' => 0,
+                'load' => $this->_customerModelMock,
+                'getRpToken' => $resetToken,
+                'isResetPasswordLinkTokenExpired' => false,
+            )
+        );
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $this->_customerModelMock->expects($this->never())
+            ->method('setRpToken');
+        $this->_customerModelMock->expects($this->never())
+            ->method('setRpTokenCreatedAt');
+        $this->_customerModelMock->expects($this->never())
+            ->method('setPassword');
+
+        $customerService = $this->_createService();
+
+        $customerService->resetPassword(0, $password, $resetToken);
+    }
+
+
+    public function testSendConfirmation()
+    {
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+        $this->_customerModelMock->expects($this->any())
+            ->method('getId')
+            ->will($this->returnValue(55));
+        $this->_customerModelMock->expects($this->once())
+            ->method('setWebsiteId')
+            ->will($this->returnValue($this->_customerModelMock));
+        $this->_customerModelMock->expects($this->any())
+            ->method('isConfirmationRequired')
+            ->will($this->returnValue(true));
+        $this->_customerModelMock->expects($this->any())
+            ->method('getConfirmation')
+            ->will($this->returnValue('123abc'));
+
+        $customerService = $this->_createService();
+        $customerService->sendConfirmation('email');
+    }
+
+    /**
+     * @expectedException \Magento\Customer\Service\Entity\V1\Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_EMAIL_NOT_FOUND
+     */
+    public function testSendConfirmationNoEmail()
+    {
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+        $this->_customerModelMock->expects($this->once())
+            ->method('getId')
+            ->will($this->returnValue(0));
+        $this->_customerModelMock->expects($this->once())
+            ->method('setWebsiteId')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $customerService = $this->_createService();
+        $customerService->sendConfirmation('email');
+    }
+
+    /**
+     * @expectedException \Magento\Customer\Service\Entity\V1\Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_CONFIRMATION_NOT_NEEDED
+     */
+    public function testSendConfirmationNotNeeded()
+    {
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+        $this->_customerModelMock->expects($this->once())
+            ->method('getId')
+            ->will($this->returnValue(55));
+        $this->_customerModelMock->expects($this->once())
+            ->method('setWebsiteId')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $customerService = $this->_createService();
+        $customerService->sendConfirmation('email');
+    }
+
+
+    private function _setupStoreMock()
+    {
+        $this->_storeManagerMock =
+            $this->getMockBuilder('\Magento\Core\Model\StoreManagerInterface')
+                ->disableOriginalConstructor()
+                ->getMock();
+
+        $this->_storeMock = $this->getMockBuilder('\Magento\Core\Model\Store')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->_storeManagerMock
+            ->expects($this->any())
+            ->method('getStore')
+            ->will($this->returnValue($this->_storeMock));
+    }
+
+
+    /**
+     * @param \PHPUnit_Framework_MockObject_MockObject $mock
+     * @param array $valueMap
+     */
+    private function _mockReturnValue($mock, $valueMap)
+    {
+        foreach ($valueMap as $method => $value) {
+            $mock->expects($this->any())
+                ->method($method)
+                ->will($this->returnValue($value));
+        }
+    }
+
+    /**
+     * @return CustomerAccountService
+     */
+    private function _createService()
+    {
+        $customerService = new CustomerAccountService(
+            $this->_customerFactoryMock,
+            $this->_eventManagerMock,
+            $this->_storeManagerMock,
+            $this->_mathRandomMock,
+            $this->_converter,
+            $this->_validator,
+            new Dto\Response\CreateCustomerAccountResponseBuilder(),
+            $this->_customerServiceMock,
+            $this->_customerAddressServiceMock
+        );
+        return $customerService;
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Customer/Service/V1/CustomerAddressServiceTest.php b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/CustomerAddressServiceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..4f49ff8ff4a63a36a3955e9004117324ad66e296
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/CustomerAddressServiceTest.php
@@ -0,0 +1,880 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Customer\Service\V1;
+
+/**
+ * \Magento\Customer\Service\V1\CustomerAddressService
+ *
+ * @SuppressWarnings(PHPMD.TooManyMethods)
+ * @SuppressWarnings(PHPMD.ExcessivePublicCount)
+ * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
+class CustomerAddressServiceTest extends \PHPUnit_Framework_TestCase
+{
+
+    const STREET = 'Parmer';
+    const CITY = 'Albuquerque';
+    const POSTCODE = '90014';
+    const TELEPHONE = '7143556767';
+    const REGION = 'Alabama';
+    const REGION_ID = 1;
+    const COUNTRY_ID = 'US';
+
+    /** Sample values for testing */
+    const ID = 1;
+    const FIRSTNAME = 'Jane';
+    const LASTNAME = 'Doe';
+    const NAME = 'J';
+    const EMAIL = 'janedoe@example.com';
+    const EMAIL_CONFIRMATION_KEY = 'blj487lkjs4confirmation_key';
+    const PASSWORD = 'password';
+    const ATTRIBUTE_CODE = 'random_attr_code';
+    const ATTRIBUTE_VALUE = 'random_attr_value';
+    const WEBSITE_ID = 1;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Model\CustomerFactory
+     */
+    private $_customerFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Model\AddressFactory
+     */
+    private $_addressFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Model\Customer
+     */
+    private $_customerModelMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Model\Attribute
+     */
+    private $_attributeModelMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Service\V1\CustomerMetadataServiceInterface
+     */
+    private $_eavMetadataServiceMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Event\ManagerInterface
+     */
+    private $_eventManagerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Core\Model\StoreManagerInterface
+     */
+    private $_storeManagerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Math\Random
+     */
+    private $_mathRandomMock;
+
+    /**
+     * @var \Magento\Customer\Model\Converter
+     */
+    private $_converter;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Core\Model\Store
+     */
+    private $_storeMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Service\V1\Dto\AddressBuilder
+     */
+    private $_addressBuilder;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Service\V1\Dto\CustomerBuilder
+     */
+    private $_customerBuilder;
+
+    private $_validator;
+
+    public function setUp()
+    {
+        $this->_customerFactoryMock = $this->getMockBuilder('Magento\Customer\Model\CustomerFactory')
+            ->disableOriginalConstructor()
+            ->setMethods(array('create'))
+            ->getMock();
+
+        $this->_customerModelMock = $this->getMockBuilder('Magento\Customer\Model\Customer')
+            ->disableOriginalConstructor()
+            ->setMethods(
+                array(
+                    'getId',
+                    'getFirstname',
+                    'getLastname',
+                    'getName',
+                    'getEmail',
+                    'getAttributes',
+                    'getConfirmation',
+                    'setConfirmation',
+                    'save',
+                    'load',
+                    '__wakeup',
+                    'authenticate',
+                    'getData',
+                    'getDefaultBilling',
+                    'getDefaultShipping',
+                    'getDefaultShippingAddress',
+                    'getDefaultBillingAddress',
+                    'getStoreId',
+                    'getAddressById',
+                    'getAddresses',
+                    'getAddressItemById',
+                    'getParentId',
+                    'isConfirmationRequired',
+                    'addAddress',
+                    'loadByEmail',
+                    'sendNewAccountEmail',
+                    'setFirstname',
+                    'setLastname',
+                    'setEmail',
+                    'setPassword',
+                    'setData',
+                    'setWebsiteId',
+                    'getAttributeSetId',
+                    'setAttributeSetId',
+                    'validate',
+                    'getRpToken',
+                    'setRpToken',
+                    'setRpTokenCreatedAt',
+                    'isResetPasswordLinkTokenExpired',
+                    'changeResetPasswordLinkToken',
+                    'sendPasswordResetConfirmationEmail',
+                )
+            )
+            ->getMock();
+
+        $this->_addressFactoryMock = $this->getMockBuilder('Magento\Customer\Model\AddressFactory')
+            ->disableOriginalConstructor()
+            ->setMethods(array('create'))
+            ->getMock();
+
+        $this->_eavMetadataServiceMock =
+            $this->getMockBuilder('Magento\Customer\Service\Eav\AttributeMetadataServiceV1Interface')
+                ->disableOriginalConstructor()
+                ->getMock();
+
+        $this->_eventManagerMock =
+            $this->getMockBuilder('\Magento\Event\ManagerInterface')
+                ->disableOriginalConstructor()
+                ->getMock();
+
+        $this->_attributeModelMock =
+            $this->getMockBuilder('\Magento\Customer\Model\Attribute')
+                ->disableOriginalConstructor()
+                ->getMock();
+
+        $this->_attributeModelMock
+            ->expects($this->any())
+            ->method('getAttributeCode')
+            ->will($this->returnValue(self::ATTRIBUTE_CODE));
+
+        $this->_customerModelMock
+            ->expects($this->any())
+            ->method('getData')
+            ->with($this->equalTo(self::ATTRIBUTE_CODE))
+            ->will($this->returnValue(self::ATTRIBUTE_VALUE));
+
+        $this->_customerModelMock
+            ->expects($this->any())
+            ->method('validate')
+            ->will($this->returnValue(TRUE));
+
+        $this->_setupStoreMock();
+
+        $this->_mathRandomMock = $this->getMockBuilder('\Magento\Math\Random')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->_validator = $this->getMockBuilder('\Magento\Customer\Model\Metadata\Validator')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->_addressBuilder = new Dto\AddressBuilder(
+            new Dto\RegionBuilder());
+
+        $this->_customerBuilder = new Dto\CustomerBuilder();
+
+        $customerBuilder = new Dto\CustomerBuilder();
+
+        $this->_converter = new \Magento\Customer\Model\Converter($customerBuilder, $this->_customerFactoryMock);
+    }
+
+    public function testGetAddressesDefaultBilling()
+    {
+        $addressMock = $this->_createAddress(1, 'John');
+        $this->_customerModelMock->expects($this->any())
+            ->method('load')
+            ->will($this->returnValue($this->_customerModelMock));
+        $this->_customerModelMock->expects($this->any())
+            ->method('getId')
+            ->will($this->returnValue(1));
+        $this->_customerModelMock->expects($this->any())
+            ->method('getDefaultBillingAddress')
+            ->will($this->returnValue($addressMock));
+        $this->_customerModelMock->expects($this->any())
+            ->method('getDefaultBilling')
+            ->will($this->returnValue(1));
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $customerService = $this->_createService();
+
+        $customerId = 1;
+        $address = $customerService->getDefaultBillingAddress($customerId);
+
+        $expected = [
+            'id' => 1,
+            'default_billing' => true,
+            'default_shipping' => false,
+            'customer_id' => self::ID,
+            'region' => new Dto\Region([
+                    'region_id' => self::REGION_ID,
+                    'region_code' => '',
+                    'region' => self::REGION
+                ]),
+            'country_id' => self::COUNTRY_ID,
+            'street' => [self::STREET],
+            'telephone' => self::TELEPHONE,
+            'postcode' => self::POSTCODE,
+            'city' => self::CITY,
+            'firstname' => 'John',
+            'lastname' => 'Doe',
+        ];
+
+        $this->assertEquals($expected, $address->__toArray());
+    }
+
+    public function testGetAddressesDefaultShipping()
+    {
+        $addressMock = $this->_createAddress(1, 'John');
+        $this->_customerModelMock->expects($this->any())
+            ->method('load')
+            ->will($this->returnValue($this->_customerModelMock));
+        $this->_customerModelMock->expects($this->any())
+            ->method('getId')
+            ->will($this->returnValue(1));
+        $this->_customerModelMock->expects($this->any())
+            ->method('getDefaultShippingAddress')
+            ->will($this->returnValue($addressMock));
+        $this->_customerModelMock->expects($this->any())
+            ->method('getDefaultShipping')
+            ->will($this->returnValue(1));
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $customerService = $this->_createService();
+
+        $customerId = 1;
+        $address = $customerService->getDefaultShippingAddress($customerId);
+
+        $expected = [
+            'id' => 1,
+            'default_shipping' => true,
+            'default_billing' => false,
+            'customer_id' => self::ID,
+            'region' => new Dto\Region([
+                    'region_id' => self::REGION_ID,
+                    'region_code' => '',
+                    'region' => self::REGION
+                ]),
+            'country_id' => self::COUNTRY_ID,
+            'street' => [self::STREET],
+            'telephone' => self::TELEPHONE,
+            'postcode' => self::POSTCODE,
+            'city' => self::CITY,
+            'firstname' => 'John',
+            'lastname' => 'Doe',
+        ];
+
+        $this->assertEquals($expected, $address->__toArray());
+    }
+
+    public function testGetAddressesById()
+    {
+        $addressMock = $this->_createAddress(1, 'John');
+        $this->_customerModelMock->expects($this->any())
+            ->method('load')
+            ->will($this->returnValue($this->_customerModelMock));
+        $this->_customerModelMock->expects($this->any())
+            ->method('getId')
+            ->will($this->returnValue(1));
+        $this->_customerModelMock->expects($this->any())
+            ->method('getAddressById')
+            ->will($this->returnValue($addressMock));
+        $this->_customerModelMock->expects($this->any())
+            ->method('getDefaultShipping')
+            ->will($this->returnValue(1));
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $customerService = $this->_createService();
+
+        $customerId = 1;
+        $addressId = 1;
+        $address = $customerService->getAddressById($customerId, $addressId);
+
+        $expected = [
+            'id' => 1,
+            'default_shipping' => true,
+            'default_billing' => false,
+            'customer_id' => self::ID,
+            'region' => new Dto\Region([
+                    'region_id' => self::REGION_ID,
+                    'region_code' => '',
+                    'region' => self::REGION
+                ]),
+            'country_id' => self::COUNTRY_ID,
+            'street' => [self::STREET],
+            'telephone' => self::TELEPHONE,
+            'postcode' => self::POSTCODE,
+            'city' => self::CITY,
+            'firstname' => 'John',
+            'lastname' => 'Doe',
+        ];
+
+        $this->assertEquals($expected, $address->__toArray());
+    }
+
+    public function testGetAddresses()
+    {
+        $addressMock = $this->_createAddress(1, 'John');
+        $addressMock2 = $this->_createAddress(2, 'Genry');
+        $this->_customerModelMock->expects($this->any())
+            ->method('load')
+            ->will($this->returnValue($this->_customerModelMock));
+        $this->_customerModelMock->expects($this->any())
+            ->method('getId')
+            ->will($this->returnValue(1));
+        $this->_customerModelMock->expects($this->any())
+            ->method('getAddresses')
+            ->will($this->returnValue([$addressMock, $addressMock2]));
+        $this->_customerModelMock->expects($this->any())
+            ->method('getDefaultShipping')
+            ->will($this->returnValue(1));
+        $this->_customerModelMock->expects($this->any())
+            ->method('getDefaultBilling')
+            ->will($this->returnValue(2));
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $customerService = $this->_createService();
+
+        $addresses = $customerService->getAddresses(1);
+
+        $expected = [
+            [
+                'id' => 1,
+                'default_shipping' => true,
+                'default_billing' => false,
+                'customer_id' => self::ID,
+                'region' => new Dto\Region([
+                        'region_id' => self::REGION_ID,
+                        'region_code' => '',
+                        'region' => self::REGION
+                    ]),
+                'country_id' => self::COUNTRY_ID,
+                'street' => [self::STREET],
+                'telephone' => self::TELEPHONE,
+                'postcode' => self::POSTCODE,
+                'city' => self::CITY,
+                'firstname' => 'John',
+                'lastname' => 'Doe',
+            ], [
+                'id' => 2,
+                'default_billing' => true,
+                'default_shipping' => false,
+                'customer_id' => self::ID,
+                'region' => new Dto\Region([
+                        'region_id' => self::REGION_ID,
+                        'region_code' => '',
+                        'region' => self::REGION
+                    ]),
+                'country_id' => self::COUNTRY_ID,
+                'street' => [self::STREET],
+                'telephone' => self::TELEPHONE,
+                'postcode' => self::POSTCODE,
+                'city' => self::CITY,
+                'firstname' => 'Genry',
+                'lastname' => 'Doe',
+            ]
+        ];
+
+        $this->assertEquals($expected[0], $addresses[0]->__toArray());
+        $this->assertEquals($expected[1], $addresses[1]->__toArray());
+    }
+
+    public function testSaveAddresses()
+    {
+        // Setup Customer mock
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+        $this->_customerModelMock->expects($this->any())
+            ->method('load')
+            ->will($this->returnSelf());
+        $this->_customerModelMock->expects($this->any())
+            ->method('getId')
+            ->will($this->returnValue(1));
+        $this->_customerModelMock->expects($this->any())
+            ->method('getAddresses')
+            ->will($this->returnValue([]));
+
+        // Setup address mock
+        $mockAddress = $this->_createAddress(1, 'John');
+        $mockAddress->expects($this->once())
+            ->method('save');
+        $mockAddress->expects($this->any())
+            ->method('setData');
+        $this->_addressFactoryMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($mockAddress));
+        $customerService = $this->_createService();
+
+        $this->_addressBuilder->setFirstname('John')
+            ->setLastname(self::LASTNAME)
+            ->setRegion(new Dto\Region([
+                'region_id' => self::REGION_ID,
+                'region_code' => '',
+                'region' => self::REGION
+            ]))
+            ->setStreet([self::STREET])
+            ->setTelephone(self::TELEPHONE)
+            ->setCity(self::CITY)
+            ->setCountryId(self::COUNTRY_ID)
+            ->setPostcode(self::POSTCODE);
+        $ids = $customerService->saveAddresses(1, [$this->_addressBuilder->create()]);
+        $this->assertEquals([1], $ids);
+    }
+
+    public function testSaveAddressesChanges()
+    {
+        // Setup address mock
+        $mockAddress = $this->_createAddress(1, 'John');
+
+        // Setup Customer mock
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+        $this->_customerModelMock->expects($this->any())
+            ->method('load')
+            ->will($this->returnSelf());
+        $this->_customerModelMock->expects($this->any())
+            ->method('getId')
+            ->will($this->returnValue(1));
+        $this->_customerModelMock->expects($this->any())
+            ->method('getAddressItemById')
+            ->with(1)
+            ->will($this->returnValue($mockAddress));
+
+        // Assert
+        $mockAddress->expects($this->once())
+            ->method('save');
+        $mockAddress->expects($this->any())
+            ->method('setData');
+
+        $customerService = $this->_createService();
+        $this->_addressBuilder->setId(1)
+            ->setFirstname('Jane')
+            ->setLastname(self::LASTNAME)
+            ->setRegion(new Dto\Region([
+                'region_id' => self::REGION_ID,
+                'region_code' => '',
+                'region' => self::REGION
+            ]))
+            ->setStreet([self::STREET])
+            ->setTelephone(self::TELEPHONE)
+            ->setCity(self::CITY)
+            ->setCountryId(self::COUNTRY_ID)
+            ->setPostcode(self::POSTCODE);
+        $ids = $customerService->saveAddresses(1, [$this->_addressBuilder->create()]);
+        $this->assertEquals([1], $ids);
+    }
+
+    public function testSaveAddressesNoAddresses()
+    {
+        // Setup Customer mock
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+        $this->_customerModelMock->expects($this->any())
+            ->method('load')
+            ->will($this->returnSelf());
+        $this->_customerModelMock->expects($this->any())
+            ->method('getId')
+            ->will($this->returnValue(1));
+        $customerService = $this->_createService();
+
+        $ids = $customerService->saveAddresses(1, []);
+        $this->assertEmpty($ids);
+    }
+
+    public function testSaveAddressesIdSetButNotAlreadyExisting()
+    {
+        // Setup Customer mock
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+        $this->_customerModelMock->expects($this->any())
+            ->method('load')
+            ->will($this->returnSelf());
+        $this->_customerModelMock->expects($this->any())
+            ->method('getId')
+            ->will($this->returnValue(1));
+        $this->_customerModelMock->expects($this->any())
+            ->method('getAddresses')
+            ->will($this->returnValue([]));
+        $this->_customerModelMock->expects($this->any())
+            ->method('getAddressItemById')
+            ->with(1)
+            ->will($this->returnValue(null));
+
+        // Setup address mock
+        $mockAddress = $this->_createAddress(1, 'John');
+        $mockAddress->expects($this->once())
+            ->method('save');
+        $mockAddress->expects($this->any())
+            ->method('setData');
+        $this->_addressFactoryMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($mockAddress));
+        $customerService = $this->_createService();
+
+        $this->_addressBuilder->setId(1)
+            ->setFirstname('John')
+            ->setLastname(self::LASTNAME)
+            ->setRegion(new Dto\Region([
+                'region_id' => self::REGION_ID,
+                'region_code' => '',
+                'region' => self::REGION
+            ]))
+            ->setStreet([self::STREET])
+            ->setTelephone(self::TELEPHONE)
+            ->setCity(self::CITY)
+            ->setCountryId(self::COUNTRY_ID)
+            ->setPostcode(self::POSTCODE);
+        $ids = $customerService->saveAddresses(1, [$this->_addressBuilder->create()]);
+        $this->assertEquals([1], $ids);
+    }
+
+    /**
+     * @expectedException \Magento\Customer\Service\Entity\V1\Exception
+     * @expectedExceptionMessage No customer with customerId 4200 exists
+     */
+    public function testSaveAddressesCustomerIdNotExist()
+    {
+        // Setup Customer mock
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+        $this->_customerModelMock->expects($this->any())
+            ->method('load')
+            ->will($this->returnSelf());
+        $this->_customerModelMock->expects($this->any())
+            ->method('getId')
+            ->will($this->returnValue(0));
+        $this->_customerModelMock->expects($this->any())
+            ->method('getAddresses')
+            ->will($this->returnValue([]));
+        $this->_customerModelMock->expects($this->any())
+            ->method('getAddressItemById')
+            ->with(1)
+            ->will($this->returnValue(null));
+        $customerService = $this->_createService();
+        $this->_addressBuilder->setFirstname('John')
+            ->setLastname(self::LASTNAME)
+            ->setRegion(new Dto\Region([
+                'region_id' => self::REGION_ID,
+                'region_code' => '',
+                'region' => self::REGION
+            ]))
+            ->setStreet([self::STREET])
+            ->setTelephone(self::TELEPHONE)
+            ->setCity(self::CITY)
+            ->setCountryId(self::COUNTRY_ID)
+            ->setPostcode(self::POSTCODE);
+
+        $failures = $customerService->saveAddresses(4200, [$this->_addressBuilder->create()]);
+        $this->assertEmpty($failures);
+    }
+
+    public function testDeleteAddressFromCustomer()
+    {
+        // Setup address mock
+        $mockAddress = $this->_createAddress(1, 'John');
+        $mockAddress->expects($this->any())
+            ->method('getCustomerId')
+            ->will($this->returnValue(self::ID));
+        $this->_addressFactoryMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($mockAddress));
+
+        // verify delete is called on the mock address model
+        $mockAddress->expects($this->once())
+            ->method('delete');
+
+        $customerService = $this->_createService();
+        $customerService->deleteAddressFromCustomer(1, 1);
+    }
+
+    /**
+     * @expectedException \Magento\Customer\Service\Entity\V1\Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_CUSTOMER_ID_MISMATCH
+     */
+    public function testDeleteAddressFromCustomerMismatch()
+    {
+        // Setup address mock
+        $mockAddress = $this->_createAddress(1, 'John', 55);
+        $this->_addressFactoryMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($mockAddress));
+
+        // verify delete is called on the mock address model
+        $mockAddress->expects($this->never())
+            ->method('delete');
+
+        $customerService = $this->_createService();
+        $customerService->deleteAddressFromCustomer(1, 1);
+    }
+
+    /**
+     * @expectedException \Magento\Customer\Service\Entity\V1\Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_ADDRESS_NOT_FOUND
+     */
+    public function testDeleteAddressFromCustomerBadAddrId()
+    {
+        // Setup address mock
+        $mockAddress = $this->_createAddress(0, '');
+        $mockAddress->expects($this->any())
+            ->method('getCustomerId')
+            ->will($this->returnValue(self::ID));
+        $this->_addressFactoryMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($mockAddress));
+
+        // verify delete is called on the mock address model
+        $mockAddress->expects($this->never())
+            ->method('delete');
+
+        $customerService = $this->_createService();
+        $customerService->deleteAddressFromCustomer(1, 2);
+    }
+
+    /**
+     * @expectedException \Magento\Customer\Service\Entity\V1\Exception
+     * @expectedExceptionCode \Magento\Customer\Service\Entity\V1\Exception::CODE_INVALID_ADDRESS_ID
+     */
+    public function testDeleteAddressFromCustomerInvalidAddrId()
+    {
+        $customerService = $this->_createService();
+        $customerService->deleteAddressFromCustomer(1, 0);
+    }
+
+
+    public function testSaveAddressesWithValidatorException()
+    {
+        // Setup Customer mock
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+        $this->_customerModelMock->expects($this->any())
+            ->method('load')
+            ->will($this->returnSelf());
+        $this->_customerModelMock->expects($this->any())
+            ->method('getId')
+            ->will($this->returnValue(1));
+        $this->_customerModelMock->expects($this->any())
+            ->method('getAddresses')
+            ->will($this->returnValue([]));
+
+        // Setup address mock
+        $mockAddress = $this->getMockBuilder('Magento\Customer\Model\Address')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $mockAddress->expects($this->any())
+            ->method('validate')
+            ->will($this->returnValue(['some error']));
+        $this->_addressFactoryMock->expects($this->once())
+            ->method('create')
+            ->will($this->returnValue($mockAddress));
+        $customerService = $this->_createService();
+
+        $this->_addressBuilder->setFirstname('John')
+            ->setLastname(self::LASTNAME)
+            ->setRegion(new Dto\Region([
+                'region_id' => self::REGION_ID,
+                'region_code' => '',
+                'region' => self::REGION
+            ]))
+            ->setStreet([self::STREET])
+            ->setTelephone(self::TELEPHONE)
+            ->setCity(self::CITY)
+            ->setCountryId(self::COUNTRY_ID)
+            ->setPostcode(self::POSTCODE);
+        try {
+            $customerService->saveAddresses(1, [$this->_addressBuilder->create()]);
+        } catch (\Magento\Customer\Service\Entity\V1\AggregateException $ae) {
+            $addressException = $ae->getExceptions()[0];
+            $this->assertInstanceOf('\Magento\Customer\Service\Entity\V1\Exception', $addressException);
+            $this->assertInstanceOf('\Magento\Validator\ValidatorException', $addressException->getPrevious());
+            $this->assertSame('some error', $addressException->getPrevious()->getMessage());
+            return;
+        }
+        $this->fail("Expected AggregateException not caught.");
+    }
+
+
+    private function _setupStoreMock()
+    {
+        $this->_storeManagerMock =
+            $this->getMockBuilder('\Magento\Core\Model\StoreManagerInterface')
+                ->disableOriginalConstructor()
+                ->getMock();
+
+        $this->_storeMock = $this->getMockBuilder('\Magento\Core\Model\Store')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->_storeManagerMock
+            ->expects($this->any())
+            ->method('getStore')
+            ->will($this->returnValue($this->_storeMock));
+    }
+
+    /**
+     * @return CustomerAddressService
+     */
+    private function _createService()
+    {
+        $customerService = new CustomerAddressService(
+            $this->_addressFactoryMock,
+            $this->_converter,
+            new Dto\RegionBuilder(),
+            $this->_addressBuilder
+        );
+        return $customerService;
+    }
+
+
+    /**
+     * Helper that returns a mock \Magento\Customer\Model\Address object.
+     *
+     * @param $addrId
+     * @param $firstName
+     * @param $customerId
+     * @return \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Model\Address
+     */
+    private function _createAddress($addrId, $firstName, $customerId = self::ID)
+    {
+        $attributes = [
+            $this->_createAttribute('firstname'),
+            $this->_createAttribute('lastname'),
+            $this->_createAttribute('street'),
+            $this->_createAttribute('city'),
+            $this->_createAttribute('postcode'),
+            $this->_createAttribute('telephone'),
+            $this->_createAttribute('region_id'),
+            $this->_createAttribute('region'),
+            $this->_createAttribute('country_id'),
+        ];
+
+        $addressMock = $this->getMockBuilder('Magento\Customer\Model\Address')
+            ->disableOriginalConstructor()
+            ->setMethods(
+                [
+                    'getId', 'hasDataChanges', 'getRegion', 'getRegionId',
+                    'addData', 'setData', 'setCustomerId', 'setPostIndex',
+                    'setFirstname', 'load', 'save', '__sleep', '__wakeup',
+                    'getDefaultAttributeCodes', 'getAttributes', 'getData',
+                    'getCustomerId', 'getParentId', 'delete', 'validate'
+                ]
+            )
+            ->getMock();
+        $addressMock->expects($this->any())
+            ->method('getId')
+            ->will($this->returnValue($addrId));
+        $addressMock->expects($this->any())
+            ->method('getRegion')
+            ->will($this->returnValue(self::REGION));
+        $addressMock->expects($this->any())
+            ->method('getRegionId')
+            ->will($this->returnValue(self::REGION_ID));
+        $addressMock->expects($this->any())
+            ->method('getCustomerId')
+            ->will($this->returnValue($customerId));
+        $addressMock->expects($this->any())
+            ->method('validate')
+            ->will($this->returnValue(true));
+
+        $map = [
+            ['firstname', null, $firstName],
+            ['lastname', null, self::LASTNAME],
+            ['street', null, self::STREET],
+            ['city', null, self::CITY],
+            ['postcode', null, self::POSTCODE],
+            ['telephone', null, self::TELEPHONE],
+            ['region', null, self::REGION],
+            ['country_id', null, self::COUNTRY_ID],
+        ];
+
+        $addressMock->expects($this->any())
+            ->method('getData')
+            ->will($this->returnValueMap($map));
+
+        $addressMock->expects($this->any())
+            ->method('load')
+            ->will($this->returnSelf());
+        $addressMock->expects($this->any())
+            ->method('getDefaultAttributeCodes')
+            ->will($this->returnValue(['entity_id', 'attribute_set_id']));
+        $addressMock->expects($this->any())
+            ->method('getAttributes')
+            ->will($this->returnValue($attributes));
+        return $addressMock;
+    }
+
+    private function _createAttribute($attributeCode)
+    {
+        $attribute = $this->getMockBuilder('\Magento\Customer\Model\Attribute')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $attribute->expects($this->any())
+            ->method('getAttributeCode')
+            ->will($this->returnValue($attributeCode));
+        return $attribute;
+    }
+
+}
diff --git a/dev/tests/unit/testsuite/Magento/Customer/Service/V1/CustomerMetadataServiceTest.php b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/CustomerMetadataServiceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..ebbb52560e3a11f28cc2de57253dfe94802b7cd3
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/CustomerMetadataServiceTest.php
@@ -0,0 +1,234 @@
+<?php
+/**
+ * \Magento\Customer\Service\Eav\CustomerMetadataService
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Customer\Service\V1;
+
+use Magento\Customer\Service\V1\CustomerMetadataService;
+use Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata;
+use Magento\Customer\Service\V1\Dto\Eav\Option;
+
+class CustomerMetadataServiceTest extends \PHPUnit_Framework_TestCase
+{
+    /** Sample values for testing */
+    const ATTRIBUTE_CODE = 1;
+    const FRONTEND_INPUT = 'frontend input';
+    const INPUT_FILTER = 'input filter';
+    const STORE_LABEL = 'store label';
+    const VALIDATE_RULES = 'validate rules';
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Eav\Model\Config
+     */
+    private $_eavConfigMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Eav\Model\Entity\Attribute\AbstractAttribute
+     */
+    private $_attributeEntityMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Eav\Model\Entity\Attribute\Source\AbstractSource
+     */
+    private $_sourceMock;
+
+    public function setUp()
+    {
+        $this->_eavConfigMock = $this->getMockBuilder('\Magento\Eav\Model\Config')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->_attributeEntityMock =
+            $this->getMockBuilder('\Magento\Eav\Model\Entity\Attribute\AbstractAttribute')
+                ->setMethods(
+                    array(
+                        'getAttributeCode',
+                        'getFrontendInput',
+                        'getInputFilter',
+                        'getStoreLabel',
+                        'getValidateRules',
+                        'getSource',
+                        '__wakeup',
+                    )
+                )
+                ->disableOriginalConstructor()
+                ->getMock();
+
+        $this->_sourceMock =
+            $this->getMockBuilder('\Magento\Eav\Model\Entity\Attribute\Source\AbstractSource')
+                ->disableOriginalConstructor()
+                ->getMock();
+
+        $this->_mockReturnValue(
+            $this->_attributeEntityMock,
+            array(
+                'getAttributeCode' => self::ATTRIBUTE_CODE,
+                'getFrontendInput' => self::FRONTEND_INPUT,
+                'getInputFilter' => self::INPUT_FILTER,
+                'getStoreLabel' => self::STORE_LABEL,
+                'getValidateRules' => self::VALIDATE_RULES,
+            )
+        );
+    }
+
+    public function testGetAttributeMetadata()
+    {
+        $this->_eavConfigMock->expects($this->any())
+            ->method('getAttribute')
+            ->will($this->returnValue($this->_attributeEntityMock));
+
+        $this->_attributeEntityMock->expects($this->any())
+            ->method('getSource')
+            ->will($this->returnValue($this->_sourceMock));
+
+        $allOptions = array(
+            array(
+                'label' => 'label1',
+                'value' => 'value1',
+            ),
+            array(
+                'label' => 'label2',
+                'value' => 'value2',
+            ),
+        );
+        $this->_sourceMock->expects($this->any())
+            ->method('getAllOptions')
+            ->will($this->returnValue($allOptions));
+
+        $attributeColMock = $this->getMockBuilder('\\Magento\\Customer\\Model\\Resource\\Form\\Attribute\\Collection')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $storeManagerMock = $this->getMockBuilder('\\Magento\\Core\\Model\\StoreManager')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $optionBuilder = new \Magento\Customer\Service\V1\Dto\Eav\OptionBuilder();
+
+        $attributeMetadataBuilder = new \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadataBuilder();
+
+        $service = new CustomerMetadataService($this->_eavConfigMock, $attributeColMock, $storeManagerMock,
+            $optionBuilder, $attributeMetadataBuilder);
+
+        $attributeMetadata = $service->getAttributeMetadata('entityCode', 'attributeId');
+        $this->assertEquals(self::ATTRIBUTE_CODE, $attributeMetadata->getAttributeCode());
+        $this->assertEquals(self::FRONTEND_INPUT, $attributeMetadata->getFrontendInput());
+        $this->assertEquals(self::INPUT_FILTER, $attributeMetadata->getInputFilter());
+        $this->assertEquals(self::STORE_LABEL, $attributeMetadata->getStoreLabel());
+        $this->assertEquals(self::VALIDATE_RULES, $attributeMetadata->getValidationRules());
+
+        $options = $attributeMetadata->getOptions();
+        $this->assertNotEquals(array(), $options);
+        $this->assertEquals('label1', $options['label1']->getLabel());
+        $this->assertEquals('value1', $options['label1']->getValue());
+        $this->assertEquals('label2', $options['label2']->getLabel());
+        $this->assertEquals('value2', $options['label2']->getValue());
+    }
+
+    public function testGetAttributeMetadataWithoutOptions()
+    {
+        $this->_eavConfigMock->expects($this->any())
+            ->method('getAttribute')
+            ->will($this->returnValue($this->_attributeEntityMock));
+
+        $this->_attributeEntityMock->expects($this->any())
+            ->method('getSource')
+            ->will($this->returnValue($this->_sourceMock));
+
+        $this->_sourceMock->expects($this->any())
+            ->method('getAllOptions')
+            ->will($this->returnValue(array()));
+
+        $attributeColMock = $this->getMockBuilder('\\Magento\\Customer\\Model\\Resource\\Form\\Attribute\\Collection')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $storeManagerMock = $this->getMockBuilder('\\Magento\\Core\\Model\\StoreManager')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $attributeMetadataBuilder = new \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadataBuilder();
+
+        $optionBuilder = new \Magento\Customer\Service\V1\Dto\Eav\OptionBuilder();
+
+        $service = new CustomerMetadataService($this->_eavConfigMock, $attributeColMock, $storeManagerMock,
+            $optionBuilder, $attributeMetadataBuilder);
+
+        $attributeMetadata = $service->getAttributeMetadata('entityCode', 'attributeId');
+        $this->assertEquals(self::ATTRIBUTE_CODE, $attributeMetadata->getAttributeCode());
+        $this->assertEquals(self::FRONTEND_INPUT, $attributeMetadata->getFrontendInput());
+        $this->assertEquals(self::INPUT_FILTER, $attributeMetadata->getInputFilter());
+        $this->assertEquals(self::STORE_LABEL, $attributeMetadata->getStoreLabel());
+        $this->assertEquals(self::VALIDATE_RULES, $attributeMetadata->getValidationRules());
+
+        $options = $attributeMetadata->getOptions();
+        $this->assertEquals(0, count($options));
+    }
+
+    public function testGetAttributeMetadataWithoutSource()
+    {
+        $this->_eavConfigMock->expects($this->any())
+            ->method('getAttribute')
+            ->will($this->returnValue($this->_attributeEntityMock));
+
+        $this->_attributeEntityMock->expects($this->any())
+            ->method('getSource')
+            ->will($this->throwException(new \Exception('exception message')));
+
+        $attributeColMock = $this->getMockBuilder('\\Magento\\Customer\\Model\\Resource\\Form\\Attribute\\Collection')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $storeManagerMock = $this->getMockBuilder('\\Magento\\Core\\Model\\StoreManager')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $optionBuilder = new \Magento\Customer\Service\V1\Dto\Eav\OptionBuilder();
+
+        $attributeMetadataBuilder = new \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadataBuilder();
+
+        $service = new CustomerMetadataService($this->_eavConfigMock, $attributeColMock, $storeManagerMock,
+            $optionBuilder, $attributeMetadataBuilder);
+
+        $attributeMetadata = $service->getAttributeMetadata('entityCode', 'attributeId');
+        $this->assertEquals(self::ATTRIBUTE_CODE, $attributeMetadata->getAttributeCode());
+        $this->assertEquals(self::FRONTEND_INPUT, $attributeMetadata->getFrontendInput());
+        $this->assertEquals(self::INPUT_FILTER, $attributeMetadata->getInputFilter());
+        $this->assertEquals(self::STORE_LABEL, $attributeMetadata->getStoreLabel());
+        $this->assertEquals(self::VALIDATE_RULES, $attributeMetadata->getValidationRules());
+
+        $options = $attributeMetadata->getOptions();
+        $this->assertEquals(0, count($options));
+    }
+
+    /**
+     * @param \PHPUnit_Framework_MockObject_MockObject $mock
+     * @param array $valueMap
+     */
+    private function _mockReturnValue($mock, $valueMap)
+    {
+        foreach ($valueMap as $method => $value) {
+            $mock->expects($this->any())
+                ->method($method)
+                ->will($this->returnValue($value));
+        }
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Customer/Service/V1/CustomerServiceTest.php b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/CustomerServiceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..6a8d7cb856fa5dc103d959f78ec8817f82c6ef39
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/CustomerServiceTest.php
@@ -0,0 +1,471 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Customer\Service\V1;
+
+/**
+ * \Magento\Customer\Service\V1\CustomerService
+ *
+ * @SuppressWarnings(PHPMD.TooManyMethods)
+ * @SuppressWarnings(PHPMD.ExcessivePublicCount)
+ * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
+class CustomerServiceTest extends \PHPUnit_Framework_TestCase
+{
+    const STREET = 'Parmer';
+    const CITY = 'Albuquerque';
+    const POSTCODE = '90014';
+    const TELEPHONE = '7143556767';
+    const REGION = 'Alabama';
+    const REGION_ID = 1;
+    const COUNTRY_ID = 'US';
+
+    /** Sample values for testing */
+    const ID = 1;
+    const FIRSTNAME = 'Jane';
+    const LASTNAME = 'Doe';
+    const NAME = 'J';
+    const EMAIL = 'janedoe@example.com';
+    const EMAIL_CONFIRMATION_KEY = 'blj487lkjs4confirmation_key';
+    const PASSWORD = 'password';
+    const ATTRIBUTE_CODE = 'random_attr_code';
+    const ATTRIBUTE_VALUE = 'random_attr_value';
+    const WEBSITE_ID = 1;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Model\CustomerFactory
+     */
+    private $_customerFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Model\AddressFactory
+     */
+    private $_addressFactoryMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Model\Customer
+     */
+    private $_customerModelMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Model\Attribute
+     */
+    private $_attributeModelMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Service\V1\CustomerMetadataServiceInterface
+     */
+    private $_eavMetadataServiceMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Event\ManagerInterface
+     */
+    private $_eventManagerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Core\Model\StoreManagerInterface
+     */
+    private $_storeManagerMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Math\Random
+     */
+    private $_mathRandomMock;
+
+    /**
+     * @var \Magento\Customer\Model\Converter
+     */
+    private $_converter;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Core\Model\Store
+     */
+    private $_storeMock;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Service\V1\Dto\AddressBuilder
+     */
+    private $_addressBuilder;
+
+    /**
+     * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Customer\Service\V1\Dto\CustomerBuilder
+     */
+    private $_customerBuilder;
+
+    private $_validator;
+
+    public function setUp()
+    {
+        $this->_customerFactoryMock = $this->getMockBuilder('Magento\Customer\Model\CustomerFactory')
+            ->disableOriginalConstructor()
+            ->setMethods(array('create'))
+            ->getMock();
+
+        $this->_customerModelMock = $this->getMockBuilder('Magento\Customer\Model\Customer')
+            ->disableOriginalConstructor()
+            ->setMethods(
+                array(
+                    'getId',
+                    'getFirstname',
+                    'getLastname',
+                    'getName',
+                    'getEmail',
+                    'getAttributes',
+                    'getConfirmation',
+                    'setConfirmation',
+                    'save',
+                    'load',
+                    '__wakeup',
+                    'authenticate',
+                    'getData',
+                    'getDefaultBilling',
+                    'getDefaultShipping',
+                    'getDefaultShippingAddress',
+                    'getDefaultBillingAddress',
+                    'getStoreId',
+                    'getAddressById',
+                    'getAddresses',
+                    'getAddressItemById',
+                    'getParentId',
+                    'isConfirmationRequired',
+                    'addAddress',
+                    'loadByEmail',
+                    'sendNewAccountEmail',
+                    'setFirstname',
+                    'setLastname',
+                    'setEmail',
+                    'setPassword',
+                    'setData',
+                    'setWebsiteId',
+                    'getAttributeSetId',
+                    'setAttributeSetId',
+                    'validate',
+                    'getRpToken',
+                    'setRpToken',
+                    'setRpTokenCreatedAt',
+                    'isResetPasswordLinkTokenExpired',
+                    'changeResetPasswordLinkToken',
+                    'sendPasswordResetConfirmationEmail',
+                )
+            )
+            ->getMock();
+
+        $this->_addressFactoryMock = $this->getMockBuilder('Magento\Customer\Model\AddressFactory')
+            ->disableOriginalConstructor()
+            ->setMethods(array('create'))
+            ->getMock();
+
+        $this->_eavMetadataServiceMock =
+            $this->getMockBuilder('Magento\Customer\Service\Eav\AttributeMetadataServiceV1Interface')
+                ->disableOriginalConstructor()
+                ->getMock();
+
+        $this->_eventManagerMock =
+            $this->getMockBuilder('\Magento\Event\ManagerInterface')
+                ->disableOriginalConstructor()
+                ->getMock();
+
+        $this->_attributeModelMock =
+            $this->getMockBuilder('\Magento\Customer\Model\Attribute')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->_attributeModelMock
+            ->expects($this->any())
+            ->method('getAttributeCode')
+            ->will($this->returnValue(self::ATTRIBUTE_CODE));
+
+        $this->_customerModelMock
+            ->expects($this->any())
+            ->method('getData')
+            ->with($this->equalTo(self::ATTRIBUTE_CODE))
+            ->will($this->returnValue(self::ATTRIBUTE_VALUE));
+
+        $this->_customerModelMock
+            ->expects($this->any())
+            ->method('validate')
+            ->will($this->returnValue(TRUE));
+
+        $this->_setupStoreMock();
+
+        $this->_mathRandomMock = $this->getMockBuilder('\Magento\Math\Random')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->_validator = $this->getMockBuilder('\Magento\Customer\Model\Metadata\Validator')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->_addressBuilder = new Dto\AddressBuilder(
+            new Dto\RegionBuilder());
+
+        $this->_customerBuilder = new Dto\CustomerBuilder();
+
+        $customerBuilder = new Dto\CustomerBuilder();
+
+        $this->_converter = new \Magento\Customer\Model\Converter($customerBuilder, $this->_customerFactoryMock);
+    }
+
+    public function testGetCustomer()
+    {
+        $this->_customerModelMock->expects($this->any())
+            ->method('load')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $this->_mockReturnValue(
+            $this->_customerModelMock,
+            array(
+                 'getId' => self::ID,
+                 'getFirstname' => self::FIRSTNAME,
+                 'getLastname' => self::LASTNAME,
+                 'getName' => self::NAME,
+                 'getEmail' => self::EMAIL,
+                 'getAttributes' => array($this->_attributeModelMock),
+            )
+        );
+
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $customerService = $this->_createService();
+
+        $actualCustomer = $customerService->getCustomer(self::ID);
+        $this->assertEquals(self::ID, $actualCustomer->getCustomerId(), 'customer id does not match');
+        $this->assertEquals(self::FIRSTNAME, $actualCustomer->getFirstName());
+        $this->assertEquals(self::LASTNAME, $actualCustomer->getLastName());
+        $this->assertEquals(self::EMAIL, $actualCustomer->getEmail());
+        $this->assertEquals(4, count($actualCustomer->getAttributes()));
+        $attribute = $actualCustomer->getAttribute(self::ATTRIBUTE_CODE);
+        $this->assertEquals(self::ATTRIBUTE_VALUE, $attribute);
+    }
+
+    public function testGetCustomerCached()
+    {
+        $this->_customerModelMock->expects($this->any())
+            ->method('load')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $this->_mockReturnValue(
+            $this->_customerModelMock,
+            array(
+                'getId' => self::ID,
+                'getFirstname' => self::FIRSTNAME,
+                'getLastname' => self::LASTNAME,
+                'getName' => self::NAME,
+                'getEmail' => self::EMAIL,
+                'getAttributes' => array($this->_attributeModelMock),
+            )
+        );
+
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+        $service = $this->_createService();
+
+        $firstCall = $service->getCustomer(self::ID);
+        $secondCall = $service->getCustomer(1);
+
+        $this->assertSame($firstCall, $secondCall);
+    }
+
+    public function testSaveCustomer()
+    {
+        $customerData = [
+            'customer_id' => self::ID,
+            'email' => self::EMAIL,
+            'firstname' => self::FIRSTNAME,
+            'lastname' => self::LASTNAME,
+            'create_in' => 'Admin',
+            'password' => 'password'
+        ];
+        $this->_customerBuilder->populateWithArray($customerData);
+        $customerEntity = $this->_customerBuilder->create();
+
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $this->_mockReturnValue(
+            $this->_customerModelMock,
+            array(
+                'getId' => self::ID,
+                'load' => $this->_customerModelMock,
+            )
+        );
+
+        // verify
+        $this->_customerModelMock->expects($this->atLeastOnce())
+            ->method('setData');
+
+        $customerService = $this->_createService();
+
+        $this->assertEquals(self::ID, $customerService->saveCustomer($customerEntity));
+    }
+
+    public function testSaveNonexistingCustomer()
+    {
+        $customerData = [
+            'customer_id' => self::ID,
+            'email' => self::EMAIL,
+            'firstname' => self::FIRSTNAME,
+            'lastname' => self::LASTNAME,
+            'create_in' => 'Admin',
+            'password' => 'password'
+        ];
+        $this->_customerBuilder->populateWithArray($customerData);
+        $customerEntity = $this->_customerBuilder->create();
+
+        $this->_customerFactoryMock->expects($this->atLeastOnce())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $this->_mockReturnValue(
+            $this->_customerModelMock,
+            array(
+                'getId' => '2',
+            )
+        );
+
+        // verify
+        $this->_customerModelMock->expects($this->atLeastOnce())
+            ->method('setData');
+
+        $customerService = $this->_createService();
+
+        $this->assertEquals(2, $customerService->saveCustomer($customerEntity));
+    }
+
+    public function testSaveNewCustomer()
+    {
+        $customerData = [
+            'email' => self::EMAIL,
+            'firstname' => self::FIRSTNAME,
+            'lastname' => self::LASTNAME,
+            'create_in' => 'Admin',
+            'password' => 'password'
+        ];
+        $this->_customerBuilder->populateWithArray($customerData);
+        $customerEntity = $this->_customerBuilder->create();
+
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $this->_mockReturnValue(
+            $this->_customerModelMock,
+            array(
+                'getId' => self::ID,
+            )
+        );
+
+        // verify
+        $this->_customerModelMock->expects($this->atLeastOnce())
+            ->method('setData');
+
+        $customerService = $this->_createService();
+
+        $this->assertEquals(self::ID, $customerService->saveCustomer($customerEntity));
+    }
+
+    /**
+     * @expectedException \Magento\Customer\Service\Entity\V1\Exception
+     * @expectedExceptionMessage exception message
+     */
+    public function testSaveCustomerWithException()
+    {
+        $customerData = [
+            'email' => self::EMAIL,
+            'firstname' => self::FIRSTNAME,
+            'lastname' => self::LASTNAME,
+            'create_in' => 'Admin',
+            'password' => 'password'
+        ];
+        $this->_customerBuilder->populateWithArray($customerData);
+        $customerEntity = $this->_customerBuilder->create();
+
+        $this->_customerFactoryMock->expects($this->any())
+            ->method('create')
+            ->will($this->returnValue($this->_customerModelMock));
+
+        $this->_mockReturnValue(
+            $this->_customerModelMock,
+            array(
+                'getId' => self::ID,
+            )
+        );
+
+        $this->_customerModelMock->expects($this->once())
+            ->method('save')
+            ->will($this->throwException(new \Exception('exception message')));
+
+        // verify
+        $customerService = $this->_createService();
+
+        $customerService->saveCustomer($customerEntity);
+    }
+
+    /**
+     * @param \PHPUnit_Framework_MockObject_MockObject $mock
+     * @param array $valueMap
+     */
+    private function _mockReturnValue($mock, $valueMap)
+    {
+        foreach ($valueMap as $method => $value) {
+            $mock->expects($this->any())
+                ->method($method)
+                ->will($this->returnValue($value));
+        }
+    }
+
+    /**
+     * @return CustomerService
+     */
+    private function _createService()
+    {
+        $customerService = new CustomerService(
+            $this->_converter
+        );
+        return $customerService;
+    }
+
+    private function _setupStoreMock()
+    {
+        $this->_storeManagerMock =
+            $this->getMockBuilder('\Magento\Core\Model\StoreManagerInterface')
+                ->disableOriginalConstructor()
+                ->getMock();
+
+        $this->_storeMock = $this->getMockBuilder('\Magento\Core\Model\Store')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->_storeManagerMock
+            ->expects($this->any())
+            ->method('getStore')
+            ->will($this->returnValue($this->_storeMock));
+    }
+
+}
diff --git a/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/AddressTest.php b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/AddressTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..1f58ade0380aa89fcdf35509af1787b7daec28ef
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/AddressTest.php
@@ -0,0 +1,218 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Customer\Service\V1\Dto;
+
+use Magento\Customer\Service\V1\Dto\Address;
+use Magento\Customer\Service\V1\Dto\AddressBuilder;
+
+class AddressTest extends \PHPUnit_Framework_TestCase
+{
+    /** Sample values for testing */
+    const ID = 14;
+    const IS_SHIPPING = true;
+    const IS_BILLING = false;
+    const COMPANY = 'Company Name';
+    const FAX = '(555) 555-5555';
+    const MIDDLENAME = 'Mid';
+    const PREFIX = 'Mr.';
+    const SUFFIX = 'Esq.';
+    const VAT_ID = 'S45';
+    const FIRSTNAME = 'Jane';
+    const LASTNAME = 'Doe';
+    const STREET_LINE_0 = '7700 W Parmer Ln';
+    const CITY = 'Austin';
+    const COUNTRY_CODE = 'US';
+    const POSTCODE = '78620';
+    const TELEPHONE = '5125125125';
+    const REGION = 'Texas';
+
+    protected $_expectedValues = [
+        'id' => 14,
+        'default_shipping' => true,
+        'default_billing' => false,
+        'company' => 'Company Name',
+        'fax' => '(555) 555-5555',
+        'middlename' => 'Mid',
+        'prefix' => 'Mr.',
+        'suffix' => 'Esq.',
+        'vat_id' => 'S45',
+        'firstname' => 'Jane',
+        'lastname' => 'Doe',
+        'street' => ['7700 W Parmer Ln'],
+        'city' => 'Austin',
+        'country_id' => 'US',
+        'postcode' => '78620',
+        'telephone' => '5125125125',
+        'region_id' => 0,
+        'region' => 'Texas',
+    ];
+
+    /**
+     * @var \Magento\Customer\Service\V1\Dto\AddressBuilder
+     */
+    protected $_addressBuilder;
+
+    protected function setUp()
+    {
+        $this->_addressBuilder = new \Magento\Customer\Service\V1\Dto\AddressBuilder(
+            new \Magento\Customer\Service\V1\Dto\RegionBuilder()
+        );
+    }
+
+    public function testMinimalAddress()
+    {
+        $this->_fillMinimumRequiredFields($this->_addressBuilder);
+        $this->_assertMinimumRequiredFields($this->_addressBuilder->create());
+    }
+
+    public function testCopyAndModify()
+    {
+        /** @var \Magento\Customer\Service\V1\Dto\Address $origAddress */
+        $origAddress = $this->getMockBuilder('\Magento\Customer\Service\V1\Dto\Address')
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->_mockReturnValue($origAddress, array(
+            'getFirstname' => $this->_expectedValues['firstname'],
+            'getLastname' => $this->_expectedValues['lastname'],
+            'getStreet' => $this->_expectedValues['street'],
+            'getCity' => $this->_expectedValues['city'],
+            'getCountryId' => $this->_expectedValues['country_id'],
+            'getRegion' => new \Magento\Customer\Service\V1\Dto\Region(['region' => 'Texas', 'region_code' => '']),
+            'getPostcode' => $this->_expectedValues['postcode'],
+            'getTelephone' => $this->_expectedValues['telephone'],
+        ));
+
+        $this->_assertMinimumRequiredFields($origAddress);
+    }
+
+    public function testFullAddress()
+    {
+        $this->_fillAllFields($this->_addressBuilder);
+        $address = $this->_addressBuilder->create();
+
+        $this->_assertMinimumRequiredFields($address);
+        $this->assertEquals($this->_expectedValues['id'], $address->getId());
+        $this->assertEquals($this->_expectedValues['default_shipping'], $address->isDefaultShipping());
+        $this->assertEquals($this->_expectedValues['default_billing'], $address->isDefaultBilling());
+        $this->assertEquals($this->_expectedValues['company'], $address->getCompany());
+        $this->assertEquals($this->_expectedValues['fax'], $address->getFax());
+        $this->assertEquals($this->_expectedValues['middlename'], $address->getMiddlename());
+        $this->assertEquals($this->_expectedValues['prefix'], $address->getPrefix());
+        $this->assertEquals($this->_expectedValues['suffix'], $address->getSuffix());
+        $this->assertEquals($this->_expectedValues['vat_id'], $address->getVatId());
+    }
+
+    public function testSetStreet()
+    {
+        $this->_fillMinimumRequiredFields($this->_addressBuilder);
+        $tmpAddress = $this->_addressBuilder->create();
+        $street = $tmpAddress->getStreet();
+        $street[] = 'Line_1';
+        $this->_addressBuilder->populate($tmpAddress);
+        $this->_addressBuilder->setStreet($street);
+
+        $address = $this->_addressBuilder->create();
+        $this->_assertMinimumRequiredFields($address);
+        $this->assertEquals('Line_1', $address->getStreet()[1]);
+    }
+
+    public function testGetAttributes()
+    {
+        $this->_fillAllFields($this->_addressBuilder);
+        $expected = $this->_expectedValues;
+        unset($expected['id']);
+        unset($expected['default_billing']);
+        unset($expected['default_shipping']);
+        $this->assertEquals($expected, $this->_addressBuilder->create()->getAttributes());
+    }
+
+    /**
+     * @param \PHPUnit_Framework_MockObject_MockObject $mock
+     * @param array $valueMap
+     */
+    private function _mockReturnValue($mock, $valueMap)
+    {
+        foreach ($valueMap as $method => $value) {
+            $mock->expects($this->any())
+                ->method($method)
+                ->will($this->returnValue($value));
+        }
+    }
+
+    /**
+     * @param AddressBuilder $address
+     */
+    private function _fillMinimumRequiredFields($addressBuilder)
+    {
+        $addressBuilder->setFirstname($this->_expectedValues['firstname']);
+        $addressBuilder->setLastname($this->_expectedValues['lastname']);
+        $addressBuilder->setStreet($this->_expectedValues['street']);
+        $addressBuilder->setCity($this->_expectedValues['city']);
+        $addressBuilder->setCountryId($this->_expectedValues['country_id']);
+        $addressBuilder->setRegion(
+            new \Magento\Customer\Service\V1\Dto\Region(['region' => $this->_expectedValues['region'],
+                'region_code' => ''])
+        );
+        $addressBuilder->setPostcode($this->_expectedValues['postcode']);
+        $addressBuilder->setTelephone($this->_expectedValues['telephone']);
+    }
+
+    /**
+     * @param Address $address
+     */
+    private function _fillAllFields($addressBuilder)
+    {
+        $this->_fillMinimumRequiredFields($addressBuilder);
+
+        $addressBuilder->setId($this->_expectedValues['id']);
+        $addressBuilder->setSuffix($this->_expectedValues['suffix']);
+        $addressBuilder->setMiddlename($this->_expectedValues['middlename']);
+        $addressBuilder->setPrefix($this->_expectedValues['prefix']);
+        $addressBuilder->setVatId($this->_expectedValues['vat_id']);
+        $addressBuilder->setDefaultShipping($this->_expectedValues['default_shipping']);
+        $addressBuilder->setDefaultBilling($this->_expectedValues['default_billing']);
+        $addressBuilder->setCompany($this->_expectedValues['company']);
+        $addressBuilder->setFax($this->_expectedValues['fax']);
+    }
+
+    /**
+     * @param Address $address
+     */
+    private function _assertMinimumRequiredFields($address)
+    {
+        $this->assertEquals($this->_expectedValues['firstname'], $address->getFirstname());
+        $this->assertEquals($this->_expectedValues['lastname'], $address->getLastname());
+        $this->assertEquals($this->_expectedValues['street'][0], $address->getStreet()[0]);
+        $this->assertEquals($this->_expectedValues['city'], $address->getCity());
+        $this->assertEquals($this->_expectedValues['country_id'], $address->getCountryId());
+        $this->assertEquals(
+            new \Magento\Customer\Service\V1\Dto\Region(['region' => $this->_expectedValues['region'],
+                'region_code' => '']),
+            $address->getRegion()
+        );
+        $this->assertEquals($this->_expectedValues['postcode'], $address->getPostcode());
+        $this->assertEquals($this->_expectedValues['telephone'], $address->getTelephone());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/CustomerTest.php b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/CustomerTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..138774bf6fcab0c245ef156a348029a524741d60
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/CustomerTest.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\Customer\Service\V1\Dto;
+
+/**
+ * Customer
+ *
+ * @package Magento\Customer\Service\Entity\V1
+ */
+class CustomerTest extends \PHPUnit_Framework_TestCase
+{
+    const CONFIRMATION = 'a4fg7h893e39d';
+    const CREATED_AT = '2013-11-05';
+    const STORE_NAME = 'Store Name';
+    const DOB = '1970-01-01';
+    const GENDER = 'Male';
+    const GROUP_ID = 1;
+    const MIDDLENAME = 'A';
+    const PREFIX = 'Mr.';
+    const STORE_ID = 1;
+    const SUFFIX = 'Esq.';
+    const TAXVAT = '12';
+    const WEBSITE_ID = 1;
+
+    /** Sample values for testing */
+    const ID = 1;
+    const FIRSTNAME = 'Jane';
+    const LASTNAME = 'Doe';
+    const NAME = 'J';
+    const EMAIL = 'janedoe@example.com';
+    const ATTRIBUTE_CODE = 'attribute_code';
+    const ATTRIBUTE_VALUE = 'attribute_value';
+
+    public function testSetters()
+    {
+        $customerData = $this->_createCustomerData();
+        $customerBuilder = new \Magento\Customer\Service\V1\Dto\CustomerBuilder();
+        $customerBuilder->populateWithArray($customerData);
+
+        /** @var Customer $customer */
+        $customer = $customerBuilder->create();
+
+        $this->assertEquals(self::ID, $customer->getCustomerId());
+        $this->assertEquals(self::FIRSTNAME, $customer->getFirstname());
+        $this->assertEquals(self::LASTNAME, $customer->getLastname());
+        $this->assertEquals(self::EMAIL, $customer->getEmail());
+        $this->assertEquals(self::CONFIRMATION, $customer->getConfirmation());
+        $this->assertEquals(self::CREATED_AT, $customer->getCreatedAt());
+        $this->assertEquals(self::STORE_NAME, $customer->getCreatedIn());
+        $this->assertEquals(self::DOB, $customer->getDob());
+        $this->assertEquals(self::GENDER, $customer->getGender());
+        $this->assertEquals(self::GROUP_ID, $customer->getGroupId());
+        $this->assertEquals(self::MIDDLENAME, $customer->getMiddlename());
+        $this->assertEquals(self::PREFIX, $customer->getPrefix());
+        $this->assertEquals(self::STORE_ID, $customer->getStoreId());
+        $this->assertEquals(self::SUFFIX, $customer->getSuffix());
+        $this->assertEquals(self::TAXVAT, $customer->getTaxvat());
+        $this->assertEquals(self::WEBSITE_ID, $customer->getWebsiteId());
+        $attribute = $customer->getAttribute(self::ATTRIBUTE_CODE);
+        $this->assertEquals(self::ATTRIBUTE_VALUE, $attribute);
+    }
+
+    public function testGetAttributeNotExist()
+    {
+        $customerData = $this->_createCustomerData();
+        $customerBuilder = new \Magento\Customer\Service\V1\Dto\CustomerBuilder();
+        $customerBuilder->populateWithArray($customerData);
+        /** @var Customer $customer */
+        $customer = $customerBuilder->create();
+
+        $this->assertNull($customer->getAttribute('A non existing attribute code'));
+    }
+
+    public function testGetAttributes()
+    {
+        $customerData = $this->_createCustomerData();
+        /** @var CustomerBuilder $customerBuilder */
+        $customerBuilder = new \Magento\Customer\Service\V1\Dto\CustomerBuilder();
+        $customerBuilder->populateWithArray($customerData);
+        /** @var Customer $customer */
+        $customer = $customerBuilder->create();
+
+        $actualAttributes = $customer->getAttributes();
+        $this->assertEquals(
+            [
+                'confirmation' => self::CONFIRMATION,
+                'created_at' => self::CREATED_AT,
+                'created_in' => self::STORE_NAME,
+                'dob' => self::DOB,
+                'email' => self::EMAIL,
+                'firstname' => self::FIRSTNAME,
+                'gender' => self::GENDER,
+                'group_id' => self::GROUP_ID,
+                'lastname' => self::LASTNAME,
+                'middlename' => self::MIDDLENAME,
+                'prefix' => self::PREFIX,
+                'store_id' => self::STORE_ID,
+                'suffix' => self::SUFFIX,
+                'taxvat' => self::TAXVAT,
+                'website_id' => self::WEBSITE_ID,
+                self::ATTRIBUTE_CODE => self::ATTRIBUTE_VALUE,
+            ],
+            $actualAttributes
+        );
+    }
+
+    /**
+     * Create customer using setters.
+     *
+     * @return CustomerBuilder
+     */
+    private function _createCustomerData()
+    {
+        return [
+            self::ATTRIBUTE_CODE => self::ATTRIBUTE_VALUE,
+            'id' => self::ID,
+            'firstname' => self::FIRSTNAME,
+            'lastname' => self::LASTNAME,
+            'email' => self::EMAIL,
+            'confirmation' => self::CONFIRMATION,
+            'created_at' => self::CREATED_AT,
+            'created_in' => self::STORE_NAME,
+            'dob' => self::DOB,
+            'gender' => self::GENDER,
+            'group_id' => self::GROUP_ID,
+            'middlename' => self::MIDDLENAME,
+            'prefix' => self::PREFIX,
+            'store_id' => self::STORE_ID,
+            'suffix' => self::SUFFIX,
+            'taxvat' => self::TAXVAT,
+            'website_id' => self::WEBSITE_ID
+        ];
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/Eav/AttributeMetadataTest.php b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/Eav/AttributeMetadataTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..4ae711b6411471726ace54858a548664a8e389a7
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/Eav/AttributeMetadataTest.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\Customer\Service\V1\Dto\Eav;
+
+class AttributeMetadataTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * Constants for testing
+     */
+    const ATTRIBUTE_CODE = 'ATTRIBUTE_CODE';
+    const FRONT_END_INPUT = 'FRONT_END_INPUT';
+    const INPUT_FILTER = 'INPUT_FILTER';
+    const STORE_LABEL = 'STORE_LABEL';
+    const VALIDATION_RULES = 'VALIDATION_RULES';
+
+    public function testConstructorAndGetters()
+    {
+        $options = array('OPTION_ONE', 'OPTION_TWO');
+
+        $attributeMetadata = new \Magento\Customer\Service\V1\Dto\Eav\AttributeMetadata([
+            'attribute_code' => self::ATTRIBUTE_CODE,
+            'front_end_input' => self::FRONT_END_INPUT,
+            'input_filter' => self::INPUT_FILTER,
+            'store_label' => self::STORE_LABEL,
+            'validation_rules' => self::VALIDATION_RULES,
+            'options' => $options
+        ]);
+
+        $this->assertSame(self::ATTRIBUTE_CODE, $attributeMetadata->getAttributeCode());
+        $this->assertSame(self::FRONT_END_INPUT, $attributeMetadata->getFrontendInput());
+        $this->assertSame(self::INPUT_FILTER, $attributeMetadata->getInputFilter());
+        $this->assertSame(self::STORE_LABEL, $attributeMetadata->getStoreLabel());
+        $this->assertSame(self::VALIDATION_RULES, $attributeMetadata->getValidationRules());
+        $this->assertSame($options, $attributeMetadata->getOptions());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/Eav/AttributeTest.php b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/Eav/AttributeTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..808a9b563e16dac0a4a670b3f55cccbcf58b1bd9
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/Eav/AttributeTest.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Customer\Service\V1\Dto\Eav;
+
+class AttributeTest extends \PHPUnit_Framework_TestCase
+{
+    const ATTRIBUTE_CODE = 'ATTRIBUTE_CODE';
+
+    const VALUE = 'VALUE';
+
+    public function testConstructorAndGetters()
+    {
+        $attribute = new \Magento\Customer\Service\V1\Dto\Eav\Attribute([
+            'attribute_code' => self::ATTRIBUTE_CODE,
+            'value' => self::VALUE
+        ]);
+
+        $this->assertSame(self::ATTRIBUTE_CODE, $attribute->getAttributeCode());
+        $this->assertSame(self::VALUE, $attribute->getValue());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/Eav/OptionTest.php b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/Eav/OptionTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..4b63e285dd70ddddf70de5471cbc02143a87bb29
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/Eav/OptionTest.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Customer\Service\V1\Dto\Eav;
+
+class OptionTest extends \PHPUnit_Framework_TestCase
+{
+    const LABEL = 'LABEL';
+
+    const VALUE = 'VALUE';
+
+    public function testConstructorAndGetters()
+    {
+        $option = new \Magento\Customer\Service\V1\Dto\Eav\Option([
+            'label' => self::LABEL,
+            'value' => self::VALUE
+        ]);
+
+        $this->assertSame(self::LABEL, $option->getLabel());
+        $this->assertSame(self::VALUE, $option->getValue());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/RegionTest.php b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/RegionTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..bb323654fdd3c059e4adc0395db656a55fec42dd
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Customer/Service/V1/Dto/RegionTest.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Test \Magento\Customer\Service\Entity\V1\Region
+ *
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Customer\Service\V1\Dto;
+
+use Magento\Customer\Service\V1\Dto\Region;
+
+class RegionTest extends \PHPUnit_Framework_TestCase
+{
+    public function testRegion()
+    {
+        $region = new Region([
+            'region' => 'Alabama',
+            'region_code' => 'AL',
+            'region_id' => 1
+        ]);
+
+        $this->assertEquals(1, $region->getRegionId());
+        $this->assertEquals('AL', $region->getRegionCode());
+        $this->assertEquals('Alabama', $region->getRegion());
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Directory/Model/Currency/DefaultLocatorTest.php b/dev/tests/unit/testsuite/Magento/Directory/Model/Currency/DefaultLocatorTest.php
index 1f032999678e9a2726ce7322a8125d344ab4e3b1..e647fae51ccb933c6f956905203b91b1fe2891ee 100644
--- a/dev/tests/unit/testsuite/Magento/Directory/Model/Currency/DefaultLocatorTest.php
+++ b/dev/tests/unit/testsuite/Magento/Directory/Model/Currency/DefaultLocatorTest.php
@@ -55,9 +55,8 @@ class DefaultLocatorTest extends \PHPUnit_Framework_TestCase
 
     public function testGetDefaultCurrencyReturnDefaultStoreDefaultCurrencyIfNoStoreIsSpecified()
     {
-        $storeMock = $this->getMock('Magento\Core\Model\Store', array(), array(), '', false);
-        $storeMock->expects($this->once())->method('getBaseCurrencyCode')->will($this->returnValue('storeCurrency'));
-        $this->_appMock->expects($this->once())->method('getStore')->will($this->returnValue($storeMock));
+        $this->_appMock->expects($this->once())->method('getBaseCurrencyCode')
+            ->will($this->returnValue('storeCurrency'));
         $this->assertEquals('storeCurrency', $this->_model->getDefaultCurrency($this->_requestMock));
     }
 
diff --git a/dev/tests/unit/testsuite/Magento/Image/Adapter/Gd2Test.php b/dev/tests/unit/testsuite/Magento/Image/Adapter/Gd2Test.php
new file mode 100644
index 0000000000000000000000000000000000000000..51f061dd3ff1b12a48ee915ee87ec2f1ecec9ea8
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Image/Adapter/Gd2Test.php
@@ -0,0 +1,172 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Image\Adapter;
+
+use \Magento\TestFramework\Helper\ObjectManager;
+
+/**
+ * Mocking crucial for this adapter global functions
+ */
+
+/**
+ * @param $paramName
+ * @throws \InvalidArgumentException
+ * @return string
+ */
+function ini_get($paramName)
+{
+    if ('memory_limit' == $paramName) {
+        return Gd2Test::$memoryLimit;
+    }
+
+    throw new \InvalidArgumentException('Unexpected parameter ' . $paramName);
+}
+
+/**
+ * @param $file
+ * @return mixed
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+ */
+function getimagesize($file)
+{
+    return Gd2Test::$imageData;
+}
+
+/**
+ * @param $real
+ * @return int
+ *
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+ */
+function memory_get_usage($real)
+{
+    return 1000000;
+}
+
+/**
+ * @param $callable
+ * @param $param
+ * @return bool
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+ */
+function call_user_func($callable, $param)
+{
+    return false;
+}
+
+/**
+ * \Magento\Image\Adapter\Gd2 class test
+ */
+class Gd2Test extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * Value to mock ini_get('memory_limit')
+     *
+     * @var string
+     */
+    public static $memoryLimit;
+
+    /**
+     * @var array simulation of getimagesize()
+     */
+    public static $imageData = array();
+
+    /**
+     * Adapter for testing
+     * @var \Magento\Image\Adapter\Gd2
+     */
+    protected $adapter;
+
+    /**
+     * @var \Magento\TestFramework\Helper\ObjectManager
+     */
+    protected $objectManager;
+
+    /**
+     * Setup testing object
+     */
+    public function setUp()
+    {
+        $this->objectManager = new ObjectManager($this);
+        $this->adapter = $this->objectManager->getObject('\Magento\Image\Adapter\Gd2');
+    }
+
+    /**
+     * Test parent class
+     */
+    public function testParentClass()
+    {
+        $this->assertInstanceOf('\Magento\Image\Adapter\AbstractAdapter', $this->adapter);
+    }
+
+    /**
+     * Test open() method
+     *
+     * @param $fileData array
+     * @param $exception string|bool|null
+     * @param $limit string
+     * @dataProvider filesProvider
+     */
+    public function testOpen($fileData, $exception, $limit)
+    {
+        self::$memoryLimit = $limit;
+        self::$imageData = $fileData;
+
+        if (!empty($exception)) {
+            $this->setExpectedException($exception);
+        }
+
+        $this->adapter->open('file');
+    }
+
+    public function filesProvider()
+    {
+        $smallFile = array(
+            0 => 480,
+            1 => 320,
+            2 => 2,
+            3 => 'width="480" height="320"',
+            'bits' => 8,
+            'channels' => 3,
+            'mime' => 'image/jpeg',
+        );
+
+        $bigFile = array(
+            0 => 3579,
+            1 => 2398,
+            2 => 2,
+            3 => 'width="3579" height="2398"',
+            'bits' => 8,
+            'channels' => 3,
+            'mime' => 'image/jpeg',
+        );
+
+        return array(
+            'positive_M' => array($smallFile, false, '2M'),
+            'positive_KB' => array($smallFile, false, '2048KB'),
+            'negative_bytes' => array($bigFile, 'OverflowException', '2048000')
+        );
+    }
+}
diff --git a/dev/tests/unit/testsuite/Magento/Paypal/Block/Express/ReviewTest.php b/dev/tests/unit/testsuite/Magento/Paypal/Block/Express/ReviewTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..8297f11cba7c4d89de2470fdbaf41cc269ea53ae
--- /dev/null
+++ b/dev/tests/unit/testsuite/Magento/Paypal/Block/Express/ReviewTest.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+
+namespace Magento\Paypal\Block\Express;
+
+class ReviewTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\App\Request\Http|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $request;
+
+    /**
+     * @var \Magento\View\Url|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $viewUrl;
+
+    /**
+     * @var Review
+     */
+    protected $model;
+
+    protected function setUp()
+    {
+        $helper = new \Magento\TestFramework\Helper\ObjectManager($this);
+        $this->request = $this->getMock('Magento\App\Request\Http', [], [], '', false);
+        $this->viewUrl = $this->getMock('Magento\View\Url', [], [], '', false);
+        $this->model = $helper->getObject(
+            'Magento\Paypal\Block\Express\Review',
+            ['request' => $this->request, 'viewUrl' => $this->viewUrl]
+        );
+    }
+
+    /**
+     * @param bool $isSecure
+     * @dataProvider getViewFileUrlDataProvider
+     */
+    public function testGetViewFileUrl($isSecure)
+    {
+        $this->request->expects($this->once())->method('isSecure')->will($this->returnValue($isSecure));
+        $this->viewUrl->expects($this->once())
+            ->method('getViewFileUrl')
+            ->with('some file', $this->callback(function ($value) use ($isSecure) {
+                return isset($value['_secure']) && $value['_secure'] === $isSecure;
+            }))
+            ->will($this->returnValue('result url'));
+        $this->assertEquals('result url', $this->model->getViewFileUrl('some file'));
+    }
+
+    public function getViewFileUrlDataProvider()
+    {
+        return [[true], [false]];
+    }
+}
diff --git a/lib/3Dsecure/CentinelClient.php b/lib/3Dsecure/CentinelClient.php
index d37c0d70d427f14b920b7f1bd679a9aeb76ce861..c2f19380cbe2e4c34e2fe89ec120d068e97b351a 100644
--- a/lib/3Dsecure/CentinelClient.php
+++ b/lib/3Dsecure/CentinelClient.php
@@ -92,7 +92,7 @@
 				curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
 				curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,  2);
 				curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
-				curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
+				curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
 				curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
 
 				// Execute the request.
diff --git a/lib/Magento/App/Response/Http/FileFactory.php b/lib/Magento/App/Response/Http/FileFactory.php
index d7f720a7c24306755cb39525d3436cd721589ece..f48a1538713ccaeb9de06e4c8aaa50c76ec64fac 100644
--- a/lib/Magento/App/Response/Http/FileFactory.php
+++ b/lib/Magento/App/Response/Http/FileFactory.php
@@ -55,6 +55,7 @@ class FileFactory
      * @param string $fileName
      * @param string|array $content set to null to avoid starting output, $contentLength should be set explicitly in
      *                              that case
+     * @param string $baseDir
      * @param string $contentType
      * @param int $contentLength explicit content length, if strlen($content) isn't applicable
      * @throws \Exception
@@ -65,9 +66,14 @@ class FileFactory
      * @SuppressWarnings(PHPMD.NPathComplexity)
      * @SuppressWarnings(PHPMD.ExitExpression)
      */
-    public function create($fileName, $content, $contentType = 'application/octet-stream', $contentLength = null)
-    {
-        $dir = $this->_filesystem->getDirectoryWrite(\Magento\Filesystem::VAR_DIR);
+    public function create(
+        $fileName,
+        $content,
+        $baseDir = \Magento\Filesystem::ROOT,
+        $contentType = 'application/octet-stream',
+        $contentLength = null
+    ) {
+        $dir = $this->_filesystem->getDirectoryWrite($baseDir);
         $isFile = false;
         $file = null;
         if (is_array($content)) {
diff --git a/lib/Magento/Convert/Object.php b/lib/Magento/Convert/Object.php
index 5133fb7790668713fc117a11a90dd707ee4cbe30..488407282a75503ec5fbef13a0b8d91a672387e3 100644
--- a/lib/Magento/Convert/Object.php
+++ b/lib/Magento/Convert/Object.php
@@ -97,4 +97,74 @@ class Object
         return $result;
     }
 
+    /**
+     * Converts the list of objects into an array of the form: [ [ 'label' => <id>, 'value' => <value> ], ... ].
+     *
+     *
+     * The <id> and <value> values are taken from the objects in the list using the $idField and $valueField
+     * parameters, which can be either the name of the field to use, or a closure.
+     *
+     * @param array $items
+     * @param string|callable $idField
+     * @param string|callable $valueField
+     *
+     * @return array
+     */
+    public function toOptionArray(array $items, $idField, $valueField)
+    {
+        $options = [];
+        foreach ($items as $item) {
+            $options[] = ['value' => $this->_invokeGetter($item, $idField),
+                          'label' => $this->_invokeGetter($item, $valueField)];
+        }
+        return $options;
+    }
+
+    /**
+     * Converts the list of objects into an array of the form: [ <id> => <value>, ... ].
+     *
+     *
+     * The <id> and <value> values are taken from the objects in the list using the $idField and $valueField parameters,
+     * which can be either the name of the field to use, or a closure.
+     *
+     * @param array $items
+     * @param string|callable $idField
+     * @param string|callable $valueField
+     *
+     * @return array
+     */
+    public function toOptionHash(array $items, $idField, $valueField)
+    {
+        $options = [];
+        foreach ($items as $item) {
+            $options[$this->_invokeGetter($item, $idField)] = $this->_invokeGetter($item, $valueField);
+        }
+        return $options;
+    }
+
+    /**
+     * Returns the value of the property represented by $field on the $item object.
+     *
+     *
+     * When $field is a closure, the $item parameter is passed to the $field method, otherwise the $field is assumed
+     * to be a property name, and the associated get method is invoked on the $item instead.
+     *
+     * @param mixed $item
+     * @param string|callable $field
+     *
+     * @return mixed
+     */
+    protected function _invokeGetter($item, $field)
+    {
+        if (is_callable($field)) {
+            // if $field is a closure, use that on the item
+            return $field($item);
+        } else {
+            // otherwise, turn it into a call to the item's getter method
+            $methodName = 'get' . str_replace(' ', '', ucwords(str_replace('_', ' ', $field)));
+            return $item->$methodName();
+        }
+    }
+
+
 }
diff --git a/lib/Magento/HTTP/Adapter/Curl.php b/lib/Magento/HTTP/Adapter/Curl.php
index 01b622342b554e3cd0612db6b87bf075e2e93b88..d59754edd440831200334ce5abfc9f81dcc9ee44 100644
--- a/lib/Magento/HTTP/Adapter/Curl.php
+++ b/lib/Magento/HTTP/Adapter/Curl.php
@@ -85,10 +85,10 @@ class Curl implements \Zend_Http_Client_Adapter_Interface
             curl_setopt($this->_getResource(), $option, $value);
         }
 
-        $verifyPeer = isset($this->_config['verifypeer']) ? $this->_config['verifypeer'] : 0;
+        $verifyPeer = isset($this->_config['verifypeer']) ? $this->_config['verifypeer'] : true;
         curl_setopt($this->_getResource(), CURLOPT_SSL_VERIFYPEER, $verifyPeer);
 
-        $verifyHost = isset($this->_config['verifyhost']) ? $this->_config['verifyhost'] : 0;
+        $verifyHost = isset($this->_config['verifyhost']) ? $this->_config['verifyhost'] : 2;
         curl_setopt($this->_getResource(), CURLOPT_SSL_VERIFYHOST, $verifyHost);
 
         foreach ($this->_config as $param => $curlOption) {
diff --git a/lib/Magento/Image/Adapter/Gd2.php b/lib/Magento/Image/Adapter/Gd2.php
index a02472f3dc6f1f2de50f58ce7b7a26bff017ab4e..91d72e8b0c7b1d36843da28c4dd38e960d0122ad 100644
--- a/lib/Magento/Image/Adapter/Gd2.php
+++ b/lib/Magento/Image/Adapter/Gd2.php
@@ -60,15 +60,77 @@ class Gd2 extends \Magento\Image\Adapter\AbstractAdapter
      * Open image for processing
      *
      * @param string $filename
+     * @throws \OverflowException
      */
     public function open($filename)
     {
         $this->_fileName = $filename;
         $this->getMimeType();
         $this->_getFileAttributes();
+        if ($this->_isMemoryLimitReached()) {
+            throw new \OverflowException('Memory limit has been reached.');
+        }
         $this->_imageHandler = call_user_func($this->_getCallback('create'), $this->_fileName);
     }
 
+    /**
+     * Checks whether memory limit is reached.
+     *
+     * @return bool
+     */
+    protected function _isMemoryLimitReached()
+    {
+        $limit = $this->_convertToByte(ini_get('memory_limit'));
+        $requiredMemory = $this->_getImageNeedMemorySize($this->_fileName);
+        return (memory_get_usage(true) + $requiredMemory) > $limit;
+    }
+
+    /**
+     * Get image needed memory size
+     *
+     * @param string $file
+     * @return float|int
+     */
+    protected function _getImageNeedMemorySize($file)
+    {
+        $imageInfo = getimagesize($file);
+        if (!isset($imageInfo[0]) || !isset($imageInfo[1])) {
+            return 0;
+        }
+        if (!isset($imageInfo['channels'])) {
+            // if there is no info about this parameter lets set it for maximum
+            $imageInfo['channels'] = 4;
+        }
+        if (!isset($imageInfo['bits'])) {
+            // if there is no info about this parameter lets set it for maximum
+            $imageInfo['bits'] = 8;
+        }
+
+        return round(
+            ($imageInfo[0] * $imageInfo[1] * $imageInfo['bits'] * $imageInfo['channels'] / 8 + Pow(2, 16)) * 1.65
+        );
+    }
+
+    /**
+     * Converts memory value (e.g. 64M, 129KB) to bytes.
+     * Case insensitive value might be used.
+     *
+     * @param string $memoryValue
+     * @return int
+     */
+    protected function _convertToByte($memoryValue)
+    {
+        if (stripos($memoryValue, 'G') !== false) {
+            return (int)$memoryValue * pow(1024, 3);
+        } elseif (stripos($memoryValue, 'M') !== false) {
+            return (int)$memoryValue * 1024 * 1024;
+        } elseif (stripos($memoryValue, 'KB') !== false) {
+            return (int)$memoryValue * 1024;
+        }
+
+        return (int)$memoryValue;
+    }
+
     /**
      * Save image to specific path.
      * If some folders of path does not exist they will be created
@@ -96,9 +158,12 @@ class Gd2 extends \Magento\Image\Adapter\AbstractAdapter
                 imagecopy(
                     $newImage,
                     $this->_imageHandler,
-                    0, 0,
-                    0, 0,
-                    $this->_imageSrcWidth, $this->_imageSrcHeight
+                    0,
+                    0,
+                    0,
+                    0,
+                    $this->_imageSrcWidth,
+                    $this->_imageSrcHeight
                 );
                 $this->_imageHandler = $newImage;
             }
diff --git a/lib/Magento/Oauth/Helper/Request.php b/lib/Magento/Oauth/Helper/Request.php
index 46414b13e98a7d9a797da88ae5f7eb8411c1cfed..86bb41f6749a7713a4ccd27c11c03f9ee80816bd 100644
--- a/lib/Magento/Oauth/Helper/Request.php
+++ b/lib/Magento/Oauth/Helper/Request.php
@@ -280,4 +280,4 @@ class Request
         $response->setHttpResponseCode($responseCode);
         return array('oauth_problem' => $errorMsg);
     }
-}
\ No newline at end of file
+}
diff --git a/lib/Magento/Object/Copy.php b/lib/Magento/Object/Copy.php
index cdda521e19354ae4964190bcf53aaff02f4dd439..bd37410260e6b8740116dfc44fbe73c281916fb9 100644
--- a/lib/Magento/Object/Copy.php
+++ b/lib/Magento/Object/Copy.php
@@ -104,6 +104,42 @@ class Copy
         return $target;
     }
 
+    /**
+     * Get data from object|array to object|array containing fields
+     * from fieldset matching an aspect.
+     *
+     * @param string $fieldset
+     * @param string $aspect a field name
+     * @param array|\Magento\Object $source
+     * @param string $root
+     * @return array $data
+     */
+    public function getDataFromFieldset($fieldset, $aspect, $source, $root='global')
+    {
+        if (!(is_array($source) || $source instanceof \Magento\Object)) {
+            return null;
+        }
+        $fields = $this->_fieldsetConfig->getFieldset($fieldset, $root);
+        if (is_null($fields)) {
+            return null;
+        }
+
+        $data = array();
+        foreach ($fields as $code => $node) {
+            if (empty($node[$aspect])) {
+                continue;
+            }
+
+            $value = $this->_getFieldsetFieldValue($source, $code);
+
+            $targetCode = (string)$node[$aspect];
+            $targetCode = $targetCode == '*' ? $code : $targetCode;
+            $data[$targetCode] = $value;
+        }
+
+        return $data;
+    }
+
     /**
      * Check if source and target are valid input for converting using fieldset
      *
diff --git a/lib/Magento/Service/Entity/AbstractDto.php b/lib/Magento/Service/Entity/AbstractDto.php
new file mode 100644
index 0000000000000000000000000000000000000000..27e19a2fba85a44bfb5a92f2dcaffce146d23d32
--- /dev/null
+++ b/lib/Magento/Service/Entity/AbstractDto.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Magento
+ *
+ * NOTICE OF LICENSE
+ *
+ * This source file is subject to the Open Software License (OSL 3.0)
+ * that is bundled with this package in the file LICENSE.txt.
+ * It is also available through the world-wide-web at this URL:
+ * http://opensource.org/licenses/osl-3.0.php
+ * If you did not receive a copy of the license and are unable to
+ * obtain it through the world-wide-web, please send an email
+ * to license@magentocommerce.com so we can send you a copy immediately.
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
+ * versions in the future. If you wish to customize Magento for your
+ * needs please refer to http://www.magentocommerce.com for more information.
+ *
+ * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
+ * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+ */
+namespace Magento\Service\Entity;
+
+abstract class AbstractDto
+{
+    /**
+     * @var array
+     */
+    protected $_data;
+
+    /**
+     * Initialize internal storage
+     *
+     * @param array $data
+     */
+    public function __construct(array $data)
+    {
+        $this->_data = $data;
+    }
+
+    /**
+     * Retrieves a value from the data array if set, or null otherwise.
+     *
+     * @param string $key
+     * @return mixed|null
+     */
+    protected function _get($key)
+    {
+        return isset($this->_data[$key]) ? $this->_data[$key]: null;
+    }
+
+    /**
+     * Return DTO data in array format.
+     *
+     * @return \ArrayAccess
+     */
+    public function __toArray()
+    {
+        return $this->_data;
+    }
+}
diff --git a/lib/Magento/Service/Entity/AbstractDtoBuilder.php b/lib/Magento/Service/Entity/AbstractDtoBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..4116091276708a999da66616817c8075ca178300
--- /dev/null
+++ b/lib/Magento/Service/Entity/AbstractDtoBuilder.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\Service\Entity;
+
+abstract class AbstractDtoBuilder
+{
+    /**
+     * @var array
+     */
+    protected $_data;
+
+    /**
+     * Initialize internal storage
+     */
+    public function __construct()
+    {
+        $this->_data = array();
+    }
+
+    /**
+     * Populates the fields with an existing entity.
+     *
+     * @param \Magento\Service\Entity\AbstractDto $prototype the prototype to base on
+     * @return $this
+     */
+    public function populate(\Magento\Service\Entity\AbstractDto $prototype)
+    {
+        $this->_data = array();
+        foreach (get_class_methods(get_class($prototype)) as $method) {
+            if (substr($method, 0, 3) === 'get') {
+                $originalDataName = lcfirst(substr($method, 3));
+                $dataName = strtolower(preg_replace('/([a-z])([A-Z])/', '$1_$2', $originalDataName));
+
+                if ($dataName === 'attribute' || $dataName === 'attributes') {
+                    continue;
+                } else {
+                    $value = $prototype->$method();
+                    if ($value !== null) {
+                        $this->_data[$dataName] = $prototype->$method();
+                    }
+                }
+            } elseif (substr($method, 0, 2) == 'is') {
+                $originalDataName = lcfirst(substr($method, 2));
+                $dataName = strtolower(preg_replace('/([a-z])([A-Z])/', '$1_$2', $originalDataName));
+
+                $this->_data[$dataName] = $prototype->$method();
+            }
+        }
+
+        return $this;
+    }
+
+    /**
+     * Populates the fields with data from the array.
+     *
+     * @param array $data
+     */
+    public function populateWithArray(array $data)
+    {
+        $this->_data = $data;
+
+        return $this;
+    }
+
+    /**
+     * Builds the entity.
+     *
+     * @return AbstractDto
+     */
+    public function create()
+    {
+        $dtoType = substr(get_class($this), 0, -7);
+        $retObj = new $dtoType($this->_data);
+        $this->_data = array();
+        return $retObj;
+    }
+
+    /**
+     * @param string $key
+     * @param mixed $value
+     *
+     * @return AbstractDto
+     */
+    protected function _set($key, $value)
+    {
+        $this->_data[$key] = $value;
+        return $this;
+    }
+
+}
diff --git a/lib/Magento/View/Element/AbstractBlock.php b/lib/Magento/View/Element/AbstractBlock.php
index ded193b6b700a939b145401a981ea2420790ea5c..e9c7d5c78081c3c48ed6c10d95722af8edc9a3ec 100644
--- a/lib/Magento/View/Element/AbstractBlock.php
+++ b/lib/Magento/View/Element/AbstractBlock.php
@@ -687,6 +687,7 @@ abstract class AbstractBlock extends \Magento\Object implements BlockInterface
     public function getViewFileUrl($file = null, array $params = array())
     {
         try {
+            $params = array_merge(['_secure' => $this->getRequest()->isSecure()], $params);
             return $this->_viewUrl->getViewFileUrl($file, $params);
         } catch (\Magento\Exception $e) {
 
diff --git a/lib/Magento/View/Element/Text/ListText.php b/lib/Magento/View/Element/Text/ListText.php
index ec156b6e88e40e441dfd3c32d0dc6fdeb08874a2..7b768abd51210669d125e4b2bd56989a9c530d30 100644
--- a/lib/Magento/View/Element/Text/ListText.php
+++ b/lib/Magento/View/Element/Text/ListText.php
@@ -42,7 +42,7 @@ class ListText extends \Magento\View\Element\Text
 
         $layout = $this->getLayout();
         foreach ($this->getChildNames() as $child) {
-            $this->addText($layout->renderElement($child));
+            $this->addText($layout->renderElement($child, false));
         }
 
         return parent::_toHtml();
diff --git a/pub/lib/dnd.js b/pub/lib/dnd.js
new file mode 100644
index 0000000000000000000000000000000000000000..1e1c5386cb0c8cc8d8c3bccf43d3caad95dc0401
--- /dev/null
+++ b/pub/lib/dnd.js
@@ -0,0 +1,664 @@
+// webkitdragdrop.js v1.0, Mon May 15 2010
+//
+// Copyright (c) 2010 Tommaso Buvoli (http://www.tommasobuvoli.com)
+// No Extra Libraries are required, simply download this file, add it to your pages!
+//
+// To See this library in action, grab an ipad and head over to http://www.gotproject.com
+// webkitdragdrop is freely distributable under the terms of an MIT-style license.
+
+
+//Description
+// Because this library was designed to run without requiring any other libraries, several basic helper functions were implemented
+// 6 helper functions in this webkit_tools class have been taked directly from Prototype 1.6.1 (http://prototypejs.org/) (c) 2005-2009 Sam Stephenson
+
+var webkit_tools =
+{
+    //$ function - simply a more robust getElementById
+
+    $:function(e)
+    {
+        if(typeof(e) == 'string')
+        {
+            return document.getElementById(e);
+        }
+        return e;
+    },
+
+    //extend function - copies the values of b into a (Shallow copy)
+
+    extend:function(a,b)
+    {
+        for (var key in b)
+        {
+            a[key] = b[key];
+        }
+        return a;
+    },
+
+    //empty function - used as defaut for events
+
+    empty:function()
+    {
+
+    },
+
+    //remove null values from an array
+
+    compact:function(a)
+    {
+        var b = []
+        var l = a.length;
+        for(var i = 0; i < l; i ++)
+        {
+            if(a[i] !== null)
+            {
+                b.push(a[i]);
+            }
+        }
+        return b;
+    },
+
+    //DESCRIPTION
+    //    This function was taken from the internet (http://robertnyman.com/2006/04/24/get-the-rendered-style-of-an-element/) and returns
+    //    the computed style of an element independently from the browser
+    //INPUT
+    //    oELM (DOM ELEMENT) element whose style should be extracted
+    //    strCssRule element
+
+    getCalculatedStyle:function(oElm, strCssRule)
+    {
+        var strValue = "";
+        if(document.defaultView && document.defaultView.getComputedStyle){
+            strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule);
+        }
+        else if(oElm.currentStyle){
+            strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){
+                return p1.toUpperCase();
+            });
+            strValue = oElm.currentStyle[strCssRule];
+        }
+        return strValue;
+    },
+
+    //bindAsEventListener function - used to bind events
+
+    bindAsEventListener:function(f,object)
+    {
+        var __method = f;
+        return function(event) {
+            __method.call(object, event || window.event);
+        };
+    },
+
+    //cumulative offset - courtesy of Prototype (http://www.prototypejs.org)
+
+    cumulativeOffset:function(element)
+    {
+        var valueT = 0, valueL = 0;
+        do {
+          valueT += element.offsetTop  || 0;
+          valueL += element.offsetLeft || 0;
+          if (element.offsetParent == document.body)
+            if (element.style.position == 'absolute') break;
+
+          element = element.offsetParent;
+        } while (element);
+
+        return {left : valueL, top : valueT};
+      },
+
+      //getDimensions - courtesy of Prototype (http://www.prototypejs.org)
+
+    getDimensions: function(element)
+    {
+        var display = element.style.display;
+        if (display != 'none' && display != null) // Safari bug
+          return {width: element.offsetWidth, height: element.offsetHeight};
+
+        var els = element.style;
+        var originalVisibility = els.visibility;
+        var originalPosition = els.position;
+        var originalDisplay = els.display;
+        els.visibility = 'hidden';
+        if (originalPosition != 'fixed') // Switching fixed to absolute causes issues in Safari
+          els.position = 'absolute';
+        els.display = 'block';
+        var originalWidth = element.clientWidth;
+        var originalHeight = element.clientHeight;
+        els.display = originalDisplay;
+        els.position = originalPosition;
+        els.visibility = originalVisibility;
+        return {width: originalWidth, height: originalHeight};
+    },
+
+    //hasClassName - courtesy of Prototype (http://www.prototypejs.org)
+
+    hasClassName: function(element, className)
+    {
+        var elementClassName = element.className;
+        return (elementClassName.length > 0 && (elementClassName == className ||
+        new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
+      },
+
+    //addClassName - courtesy of Prototype (http://www.prototypejs.org)
+
+    addClassName: function(element, className)
+    {
+        if (!this.hasClassName(element, className))
+            element.className += (element.className ? ' ' : '') + className;
+        return element;
+    },
+
+    //removeClassName - courtesy of Prototype (http://www.prototypejs.org)
+
+    removeClassName: function(element, className)
+    {
+        element.className = this.strip(element.className.replace(new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' '));
+        return element;
+    },
+
+    //strip - courtesy of Prototype (http://www.prototypejs.org)
+
+    strip:function(s)
+    {
+        return s.replace(/^\s+/, '').replace(/\s+$/, '');
+    }
+
+}
+
+//Description
+// Droppable fire events when a draggable is dropped on them
+
+var webkit_droppables = function()
+{
+    this.initialize = function()
+    {
+        this.droppables = [];
+        this.droppableRegions = [];
+    }
+
+    this.add = function(root, instance_props)
+    {
+        root = webkit_tools.$(root);
+        var default_props = {accept : [], hoverClass : null, onDrop : webkit_tools.empty, onOver : webkit_tools.empty, onOut : webkit_tools.empty};
+        default_props = webkit_tools.extend(default_props, instance_props || {});
+        this.droppables.push({r : root, p : default_props});
+    }
+
+    this.remove = function(root)
+    {
+        root = webkit_tools.$(root);
+        var d = this.droppables;
+        var i = d.length;
+        while(i--)
+        {
+            if(d[i].r == root)
+            {
+                d[i] = null;
+                this.droppables = webkit_tools.compact(d);
+                return true;
+            }
+        }
+        return false;
+    }
+
+    //calculate position and size of all droppables
+
+    this.prepare = function()
+    {
+        var d = this.droppables;
+        var i = d.length;
+        var dR = [];
+        var r = null;
+
+        while(i--)
+        {
+            r = d[i].r;
+            if(r.style.display != 'none')
+            {
+                dR.push({i : i, size : webkit_tools.getDimensions(r), offset : webkit_tools.cumulativeOffset(r)})
+            }
+        }
+
+        this.droppableRegions = dR;
+    }
+
+    this.finalize = function(x,y,r,e)
+    {
+        var indices = this.isOver(x,y);
+        var index = this.maxZIndex(indices);
+        var over = this.process(index,r);
+        if(over)
+        {
+            this.drop(index, r,e);
+        }
+        this.process(-1,r);
+        return over;
+    }
+
+    this.check = function(x,y,r,e)
+    {
+        var indices = this.isOver(x,y);
+        var index = this.maxZIndex(indices);
+        return this.process(index,r, e);
+    }
+
+    this.isOver = function(x, y)
+    {
+        var dR = this.droppableRegions;
+        var i = dR.length;
+        var active = [];
+        var r = 0;
+        var maxX = 0;
+        var minX = 0;
+        var maxY = 0;
+        var minY = 0;
+
+        while(i--)
+        {
+            r = dR[i];
+
+            minY = r.offset.top;
+            maxY = minY + r.size.height;
+
+            if((y > minY) && (y < maxY))
+            {
+                minX = r.offset.left;
+                maxX = minX + r.size.width;
+
+                if((x > minX) && (x < maxX))
+                {
+                    active.push(r.i);
+                }
+            }
+        }
+
+        return active;
+    }
+
+    this.maxZIndex = function(indices)
+    {
+        var d = this.droppables;
+        var l = indices.length;
+        var index = -1;
+
+        var maxZ = -100000000;
+        var curZ = 0;
+
+        while(l--)
+        {
+            curZ = parseInt(d[indices[l]].r.style.zIndex || 0);
+            if(curZ > maxZ)
+            {
+                maxZ = curZ;
+                index = indices[l];
+            }
+        }
+
+        return index;
+    }
+
+    this.process = function(index, draggableRoot, e)
+    {
+        //only perform update if a change has occurred
+        if(this.lastIndex != index)
+        {
+            //remove previous
+            if(this.lastIndex != null)
+            {
+                var d = this.droppables[this.lastIndex]
+                var p = d.p;
+                var r = d.r;
+
+                if(p.hoverClass)
+                {
+                    webkit_tools.removeClassName(r,p.hoverClass);
+                }
+                p.onOut(draggableRoot, e);
+                this.lastIndex = null;
+                this.lastOutput = false;
+            }
+
+            //add new
+            if(index != -1)
+            {
+                var d = this.droppables[index]
+                var p = d.p;
+                var r = d.r;
+
+                if(this.hasClassNames(draggableRoot, p.accept))
+                {
+                    if(p.hoverClass)
+                    {
+                        webkit_tools.addClassName(r,p.hoverClass);
+                    }
+                    p.onOver(draggableRoot, e);
+                    this.lastIndex = index;
+                    this.lastOutput = true;
+                }
+            }
+        }
+        return this.lastOutput;
+    }
+
+    this.drop = function(index, r, e)
+    {
+        if(index != -1)
+        {
+            this.droppables[index].p.onDrop(r,e);
+        }
+    }
+
+    this.hasClassNames = function(r, names)
+    {
+        var l = names.length;
+        if(l == 0){return true}
+        while(l--)
+        {
+            if(webkit_tools.hasClassName(r,names[l]))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    this.initialize();
+}
+
+webkit_drop = new webkit_droppables();
+
+//Description
+//webkit draggable - allows users to drag elements with their hands
+
+var webkit_draggable = function(r, ip)
+{
+    this.ready = false;
+    this.timeout = undefined;
+    this.initialize = function(root, instance_props)
+    {
+        this.root = webkit_tools.$(root);
+        var default_props = {scroll : false, revert : false, handle : this.root, zIndex : 1000, onStart : webkit_tools.empty, onEnd : webkit_tools.empty};
+
+        this.p = webkit_tools.extend(default_props, instance_props || {});
+        default_props.handle = webkit_tools.$(default_props.handle);
+        this.prepare();
+        this.bindEvents();
+    }
+
+    this.prepare = function()
+    {
+        var rs = this.root.style;
+
+        //set position
+        if(webkit_tools.getCalculatedStyle(this.root,'position') != 'absolute')
+        {
+            rs.position = 'relative';
+        }
+
+        //set top, right, bottom, left
+        rs.top = rs.top || '0px';
+        rs.left = rs.left || '0px';
+        rs.right = "";
+        rs.bottom = "";
+
+        //set zindex;
+        rs.zIndex = rs.zIndex || '0';
+    }
+
+    this.bindEvents = function()
+    {
+        var handle = this.p.handle;
+
+        this.ts = webkit_tools.bindAsEventListener(this.touchStart, this);
+        this.tm = webkit_tools.bindAsEventListener(this.touchMove, this);
+        this.te = webkit_tools.bindAsEventListener(this.touchEnd, this);
+
+        handle.addEventListener("touchstart", this.ts, false);
+        handle.addEventListener("touchmove", this.tm, false);
+        handle.addEventListener("touchend", this.te, false);
+    }
+
+    this.destroy = function()
+    {
+        var handle = this.p.handle;
+
+        handle.removeEventListener("touchstart", this.ts);
+        handle.removeEventListener("touchmove", this.tm);
+        handle.removeEventListener("touchend", this.te);
+    }
+
+    this.set = function(key, value)
+    {
+        this.p[key] = value;
+    }
+
+    this.touchStart = function(event)
+    {
+        this.timeout = setTimeout(function () {
+            //prepare needed variables
+            var p = this.p;
+            var r = this.root;
+            var rs = r.style;
+            var t = event.targetTouches[0];
+
+            //get position of touch
+            touchX = t.pageX;
+            touchY = t.pageY;
+
+            //set base values for position of root
+            rs.top = this.root.style.top || '0px';
+            rs.left = this.root.style.left || '0px';
+            rs.bottom = null;
+            rs.right = null;
+
+            var rootP = webkit_tools.cumulativeOffset(r);
+            var cp = this.getPosition();
+
+            //save event properties
+            p.rx = cp.x;
+            p.ry = cp.y;
+            p.tx = touchX;
+            p.ty = touchY;
+            p.z = parseInt(this.root.style.zIndex);
+
+            //boost zIndex
+            rs.zIndex = p.zIndex;
+            webkit_drop.prepare();
+            p.onStart(r, event);
+            
+            this.ready = true;
+            
+        }.bind(this), 500);
+    }
+
+    this.touchMove = function(event)
+    {
+        if ( this.ready ) {
+            event.preventDefault();
+            event.stopPropagation();
+
+            //prepare needed variables
+            var p = this.p;
+            var r = this.root;
+            var rs = r.style;
+            var t = event.targetTouches[0];
+            if(t == null){return}
+
+            var curX = t.pageX;
+            var curY = t.pageY;
+
+            var delX = curX - p.tx;
+            var delY = curY - p.ty;
+
+            rs.webkitTransform = 'translate3d(' + (p.rx + delX) + 'px,' + (p.ry + delY) + 'px, 1px)';
+
+            //scroll window
+            if(p.scroll)
+            {
+                s = this.getScroll(curX, curY);
+                if((s[0] != 0) || (s[1] != 0))
+                {
+                    window.scrollTo(window.scrollX + s[0], window.scrollY + s[1]);
+                }
+            }
+
+            //check droppables
+            webkit_drop.check(curX, curY, r, event);
+
+            //save position for touchEnd
+            this.lastCurX = curX;
+            this.lastCurY = curY;
+        }
+    }
+
+    this.touchEnd = function(event)
+    {
+        clearTimeout(this.timeout);
+        if ( this.ready ) {
+            event.preventSwipe = true;
+            var r = this.root;
+            var p = this.p;
+            var dropped = webkit_drop.finalize(this.lastCurX, this.lastCurY, r, event);
+
+            if(((p.revert) && (!dropped)) || (p.revert === 'always'))
+            {
+                //revert root
+                var rs = r.style;
+                rs.webkitTransform = 'translate3d(' + p.rx + 'px,' + p.ry + 'px, 1px)';
+                //rs.top = (p.ry + 'px');
+                //rs.left = (p.rx + 'px');
+            }
+
+            r.style.zIndex = this.p.z;
+            this.p.onEnd(r, event);
+            this.ready = false;
+        }
+    }
+
+    this.getPosition = function()
+    {
+        var rs = this.root.style;
+        return {x : parseInt(rs.left || 0), y : parseInt(rs.top  || 0)}
+    }
+
+    this.getScroll = function(pX, pY)
+    {
+        //read window variables
+        var sX = window.scrollX;
+        var sY = window.scrollY;
+
+        var wX = window.innerWidth;
+        var wY = window.innerHeight;
+
+        //set contants
+        var scroll_amount = 10; //how many pixels to scroll
+        var scroll_sensitivity = 100; //how many pixels from border to start scrolling from.
+
+        var delX = 0;
+        var delY = 0;
+
+        //process vertical y scroll
+        if(pY - sY < scroll_sensitivity)
+        {
+            delY = -scroll_amount;
+        }
+        else
+        if((sY + wY) - pY < scroll_sensitivity)
+        {
+            delY = scroll_amount;
+        }
+
+        //process horizontal x scroll
+        if(pX - sX < scroll_sensitivity)
+        {
+            delX = -scroll_amount;
+        }
+        else
+        if((sX + wX) - pX < scroll_sensitivity)
+        {
+            delX = scroll_amount;
+        }
+
+        return [delX, delY]
+    }
+
+    //contructor
+    this.initialize(r, ip);
+}
+
+//Description
+//webkit_click class. manages click events for draggables
+
+var webkit_click = function(r, ip)
+{
+    this.initialize = function(root, instance_props)
+    {
+        var default_props = {onClick : webkit_tools.empty};
+
+        this.root = webkit_tools.$(root);
+        this.p = webkit_tools.extend(default_props, instance_props || {});
+        this.bindEvents();
+    }
+
+    this.bindEvents = function()
+    {
+        var root = this.root;
+
+        //bind events to local scope
+        this.ts = webkit_tools.bindAsEventListener(this.touchStart,this);
+        this.tm = webkit_tools.bindAsEventListener(this.touchMove,this);
+        this.te = webkit_tools.bindAsEventListener(this.touchEnd,this);
+
+        //add Listeners
+        root.addEventListener("touchstart", this.ts, false);
+        root.addEventListener("touchmove", this.tm, false);
+        root.addEventListener("touchend", this.te, false);
+
+        this.bound = true;
+    }
+
+    this.touchStart = function()
+    {
+        this.moved = false;
+        if(this.bound == false)
+        {
+            this.root.addEventListener("touchmove", this.tm, false);
+            this.bound = true;
+        }
+    }
+
+    this.touchMove = function()
+    {
+        this.moved = true;
+        this.root.removeEventListener("touchmove", this.tm);
+        this.bound = false;
+    }
+
+    this.touchEnd = function()
+    {e.preventSwipe = true;
+        if(this.moved == false)
+        {
+            this.p.onClick();
+        }
+    }
+
+    this.setEvent = function(f)
+    {
+        if(typeof(f) == 'function')
+        {
+            this.p.onClick = f;
+        }
+    }
+
+    this.unbind = function()
+    {
+        var root = this.root;
+        root.removeEventListener("touchstart", this.ts);
+        root.removeEventListener("touchmove", this.tm);
+        root.removeEventListener("touchend", this.te);
+    }
+
+    //call constructor
+    this.initialize(r, ip);
+}
\ No newline at end of file
diff --git a/pub/lib/head.load.min.js b/pub/lib/headjs/head.load.min.js
similarity index 92%
rename from pub/lib/head.load.min.js
rename to pub/lib/headjs/head.load.min.js
index 05e489381844ab02656ac16fb5d48398cf226217..e384332d8f3db84068b405fb2dde545b43e54e1a 100644
--- a/pub/lib/head.load.min.js
+++ b/pub/lib/headjs/head.load.min.js
@@ -1 +1,9 @@
-(function(e,t){"use strict";function y(e){if(e._done)return;e(),e._done=1}function b(e){var t=e.split("/"),n=t[t.length-1],r=n.indexOf("?");return r!=-1?n.substring(0,r):n}function w(e){var t;if(typeof e=="object")for(var n in e)e[n]&&(t={name:n,url:e[n]});else t={name:b(e),url:e};var r=l[t.name];return r&&r.url===t.url?r:(l[t.name]=t,t)}function E(e,t){if(!e)return;typeof e=="object"&&(e=[].slice.call(e));for(var n=0;n<e.length;n++)t.call(e,e[n],n)}function S(e){return Object.prototype.toString.call(e)=="[object Function]"}function x(e){e=e||l;var t;for(var n in e){if(e.hasOwnProperty(n)&&e[n].state!=g)return!1;t=!0}return t}function T(e){e.state=d,E(e.onpreload,function(e){e.call()})}function N(e,n){e.state===t&&(e.state=v,e.onpreload=[],k({src:e.url,type:"cache"},function(){T(e)}))}function C(e,t){if(e.state==g)return t&&t();if(e.state==m)return p.ready(e.name,t);if(e.state==v)return e.onpreload.push(function(){C(e,t)});e.state=m,k(e.url,function(){e.state=g,t&&t(),E(f[e.name],function(e){y(e)}),x()&&o&&E(f.ALL,function(e){y(e)})})}function k(e,t){var r=n.createElement("script");r.type="text/"+(e.type||"javascript"),r.src=e.src||e,r.async=!1,r.onreadystatechange=r.onload=function(){var e=r.readyState;!t.done&&(!e||/loaded|complete/.test(e))&&(t.done=!0,t())},(n.body||i).appendChild(r)}function L(){o||(o=!0,E(u,function(e){y(e)}))}var n=e.document,r=e.navigator,i=n.documentElement,s,o,u=[],a=[],f={},l={},c=n.createElement("script").async===!0||"MozAppearance"in n.documentElement.style||e.opera,h=e.head_conf&&e.head_conf.head||"head",p=e[h]=e[h]||function(){p.ready.apply(null,arguments)},d=1,v=2,m=3,g=4;c?p.js=function(){var e=arguments,t=e[e.length-1],n={};return S(t)||(t=null),E(e,function(r,i){r!=t&&(r=w(r),n[r.name]=r,C(r,t&&i==e.length-2?function(){x(n)&&y(t)}:null))}),p}:p.js=function(){var e=arguments,t=[].slice.call(e,1),n=t[0];return s?(n?(E(t,function(e){S(e)||N(w(e))}),C(w(e[0]),S(n)?n:function(){p.js.apply(null,t)})):C(w(e[0])),p):(a.push(function(){p.js.apply(null,e)}),p)},p.ready=function(e,t){if(e==n)return o?y(t):u.push(t),p;S(e)&&(t=e,e="ALL");if(typeof e!="string"||!S(t))return p;var r=l[e];if(r&&r.state==g||e=="ALL"&&x()&&o)return y(t),p;var i=f[e];return i?i.push(t):i=f[e]=[t],p},p.ready(n,function(){x()&&E(f.ALL,function(e){y(e)}),p.feature&&p.feature("domloaded",!0)});if(e.addEventListener)n.addEventListener("DOMContentLoaded",L,!1),e.addEventListener("load",L,!1);else if(e.attachEvent){n.attachEvent("onreadystatechange",function(){n.readyState==="complete"&&L()});var A=1;try{A=e.frameElement}catch(O){}!A&&i.doScroll&&function(){try{i.doScroll("left"),L()}catch(e){setTimeout(arguments.callee,1);return}}(),e.attachEvent("onload",L)}!n.readyState&&n.addEventListener&&(n.readyState="loading",n.addEventListener("DOMContentLoaded",handler=function(){n.removeEventListener("DOMContentLoaded",handler,!1),n.readyState="complete"},!1)),setTimeout(function(){s=!0,E(a,function(e){e()})},300)})(window);
\ No newline at end of file
+/*!
+ * HeadJS     The only script in your <HEAD>
+ * Author     Tero Piirainen  (tipiirai)
+ * Maintainer Robert Hoffmann (itechnology)
+ * License    MIT / http://bit.ly/mit-license
+ *
+ * http://headjs.com
+ */
+(function(e,t){"use strict";function y(e){if(e._done)return;e(),e._done=1}function b(e){var t=e.split("/"),n=t[t.length-1],r=n.indexOf("?");return r!=-1?n.substring(0,r):n}function w(e){var t;if(typeof e=="object")for(var n in e)e[n]&&(t={name:n,url:e[n]});else t={name:b(e),url:e};var r=l[t.name];return r&&r.url===t.url?r:(l[t.name]=t,t)}function E(e,t){if(!e)return;typeof e=="object"&&(e=[].slice.call(e));for(var n=0;n<e.length;n++)t.call(e,e[n],n)}function S(e){return Object.prototype.toString.call(e)=="[object Function]"}function x(e){e=e||l;var t;for(var n in e){if(e.hasOwnProperty(n)&&e[n].state!=g)return!1;t=!0}return t}function T(e){e.state=d,E(e.onpreload,function(e){e.call()})}function N(e,n){e.state===t&&(e.state=v,e.onpreload=[],k({src:e.url,type:"cache"},function(){T(e)}))}function C(e,t){if(e.state==g)return t&&t();if(e.state==m)return p.ready(e.name,t);if(e.state==v)return e.onpreload.push(function(){C(e,t)});e.state=m,k(e.url,function(){e.state=g,t&&t(),E(f[e.name],function(e){y(e)}),x()&&o&&E(f.ALL,function(e){y(e)})})}function k(e,t){var r=n.createElement("script");r.type="text/"+(e.type||"javascript"),r.src=e.src||e,r.async=!1,r.onreadystatechange=r.onload=function(){var e=r.readyState;!t.done&&(!e||/loaded|complete/.test(e))&&(t.done=!0,t())},(n.body||i).appendChild(r)}function L(){o||(o=!0,E(u,function(e){y(e)}))}var n=e.document,r=e.navigator,i=n.documentElement,s,o,u=[],a=[],f={},l={},c=n.createElement("script").async===!0||"MozAppearance"in n.documentElement.style||e.opera,h=e.head_conf&&e.head_conf.head||"head",p=e[h]=e[h]||function(){p.ready.apply(null,arguments)},d=1,v=2,m=3,g=4;c?p.js=function(){var e=arguments,t=e[e.length-1],n={};return S(t)||(t=null),E(e,function(r,i){r!=t&&(r=w(r),n[r.name]=r,C(r,t&&i==e.length-2?function(){x(n)&&y(t)}:null))}),p}:p.js=function(){var e=arguments,t=[].slice.call(e,1),n=t[0];return s?(n?(E(t,function(e){S(e)||N(w(e))}),C(w(e[0]),S(n)?n:function(){p.js.apply(null,t)})):C(w(e[0])),p):(a.push(function(){p.js.apply(null,e)}),p)},p.ready=function(e,t){if(e==n)return o?y(t):u.push(t),p;S(e)&&(t=e,e="ALL");if(typeof e!="string"||!S(t))return p;var r=l[e];if(r&&r.state==g||e=="ALL"&&x()&&o)return y(t),p;var i=f[e];return i?i.push(t):i=f[e]=[t],p},p.ready(n,function(){x()&&E(f.ALL,function(e){y(e)}),p.feature&&p.feature("domloaded",!0)});if(e.addEventListener)n.addEventListener("DOMContentLoaded",L,!1),e.addEventListener("load",L,!1);else if(e.attachEvent){n.attachEvent("onreadystatechange",function(){n.readyState==="complete"&&L()});var A=1;try{A=e.frameElement}catch(O){}!A&&i.doScroll&&function(){try{i.doScroll("left"),L()}catch(e){setTimeout(arguments.callee,1);return}}(),e.attachEvent("onload",L)}!n.readyState&&n.addEventListener&&(n.readyState="loading",n.addEventListener("DOMContentLoaded",handler=function(){n.removeEventListener("DOMContentLoaded",handler,!1),n.readyState="complete"},!1)),setTimeout(function(){s=!0,E(a,function(e){e()})},300)})(window);
diff --git a/app/design/adminhtml/magento_backend/js/head.js b/pub/lib/headjs/head.min.js
similarity index 93%
rename from app/design/adminhtml/magento_backend/js/head.js
rename to pub/lib/headjs/head.min.js
index 67de77740949bcedf9cfcad1034ce8a90a2f5cd6..cb58a5cfb384faf5880c1f53ddb20b6fa37f6938 100644
--- a/app/design/adminhtml/magento_backend/js/head.js
+++ b/pub/lib/headjs/head.min.js
@@ -1,26 +1,11 @@
-/**
- * Magento
+/*!
+ * HeadJS     The only script in your <HEAD>
+ * Author     Tero Piirainen  (tipiirai)
+ * Maintainer Robert Hoffmann (itechnology)
+ * License    MIT / http://bit.ly/mit-license
  *
- * 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)
+ * http://headjs.com
  */
-
 (function (a, w) {
     function f(a) {
         p[p.length] = a
diff --git a/app/design/adminhtml/magento_backend/js/jquery.details.js b/pub/lib/jquery/jquery.details.js
similarity index 77%
rename from app/design/adminhtml/magento_backend/js/jquery.details.js
rename to pub/lib/jquery/jquery.details.js
index 1e2ddd923b73a857b3cb3f32fa83951ec79fffdc..30ce703386614f6d1494317cf0a5b5a1bf283fcc 100644
--- a/app/design/adminhtml/magento_backend/js/jquery.details.js
+++ b/pub/lib/jquery/jquery.details.js
@@ -1,51 +1,4 @@
-/**
- * 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)
- */
-
 /*! http://mths.be/details v0.0.6 by @mathias | includes http://mths.be/noselect v1.0.3 */
-Modernizr.addTest('details', function() {
-    var doc = document,
-        el = doc.createElement('details'),
-        fake,
-        root,
-        diff;
-    if (!('open' in el)) { // return early if possible; thanks @aFarkas!
-        return false;
-    }
-    root = doc.body || (function() {
-        var de = doc.documentElement;
-        fake = true;
-        return de.insertBefore(doc.createElement('body'), de.firstElementChild || de.firstChild);
-    }());
-    el.innerHTML = '<summary>a</summary>b';
-    el.style.display = 'block';
-    root.appendChild(el);
-    diff = el.offsetHeight;
-    el.open = true;
-    diff = diff != el.offsetHeight;
-    root.removeChild(el);
-    fake && root.parentNode.removeChild(root);
-    return diff;
-});
 ;(function(document, $) {
     var proto = $.fn,
         details,
@@ -167,4 +120,4 @@ Modernizr.addTest('details', function() {
 
     }
 
-}(document, jQuery));
\ No newline at end of file
+}(document, jQuery));
diff --git a/app/design/adminhtml/magento_backend/js/jquery.details.min.js b/pub/lib/jquery/jquery.details.min.js
similarity index 67%
rename from app/design/adminhtml/magento_backend/js/jquery.details.min.js
rename to pub/lib/jquery/jquery.details.min.js
index 2cb5037be2471aea12406ce00d119c4ea7bd840c..04317a021fbba47e8cdb0d0f555da84a50ac587e 100644
--- a/app/design/adminhtml/magento_backend/js/jquery.details.min.js
+++ b/pub/lib/jquery/jquery.details.min.js
@@ -1,25 +1,2 @@
-/**
- * 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)
- */
-
 /*! http://mths.be/details v0.0.6 by @mathias | includes http://mths.be/noselect v1.0.3 */
-;(function(a,$){var e=$.fn,d,c=Object.prototype.toString.call(window.opera)=='[object Opera]',f=(function(k){var i=k.createElement('details'),h,g,j;if(!('open' in i)){return false}g=k.body||(function(){var l=k.documentElement;h=true;return l.insertBefore(k.createElement('body'),l.firstElementChild||l.firstChild)}());i.innerHTML='<summary>a</summary>b';i.style.display='block';g.appendChild(i);j=i.offsetHeight;i.open=true;j=j!=i.offsetHeight;g.removeChild(i);if(h){g.parentNode.removeChild(g)}return j}(a)),b=function(h,k,j,g){var i=typeof h.attr('open')=='string',l=i&&g||!i&&!g;if(l){h.removeClass('open').prop('open',false).triggerHandler('close.details');k.attr('aria-expanded',false);j.hide()}else{h.addClass('open').prop('open',true).triggerHandler('open.details');k.attr('aria-expanded',true);j.show()}};e.noSelect=function(){var g='none';return this.bind('selectstart dragstart mousedown',function(){return false}).css({MozUserSelect:g,msUserSelect:g,webkitUserSelect:g,userSelect:g})};if(f){d=e.details=function(){return this.each(function(){var h=$(this),g=$('summary',h).first();g.attr({role:'button','aria-expanded':h.prop('open')}).on('click',function(){var i=h.prop('open');g.attr('aria-expanded',!i);h.triggerHandler((i?'close':'open')+'.details')})})};d.support=f}else{d=e.details=function(){return this.each(function(){var g=$(this),i=$('summary',g).first(),h=g.children(':not(summary)'),j=g.contents(':not(summary)');if(!i.length){i=$('<summary>').text('Details').prependTo(g)}if(h.length!=j.length){j.filter(function(){return this.nodeType==3&&/[^ \t\n\f\r]/.test(this.data)}).wrap('<span>');h=g.children(':not(summary)')}b(g,i,h);i.attr('role','button').noSelect().prop('tabIndex',0).on('click',function(){i.focus();b(g,i,h,true)}).keyup(function(k){if(32==k.keyCode||(13==k.keyCode&&!c)){k.preventDefault();i.click()}})})};d.support=f}}(document,jQuery));
\ No newline at end of file
+;(function(a,$){var e=$.fn,d,c=Object.prototype.toString.call(window.opera)=='[object Opera]',f=(function(k){var i=k.createElement('details'),h,g,j;if(!('open' in i)){return false}g=k.body||(function(){var l=k.documentElement;h=true;return l.insertBefore(k.createElement('body'),l.firstElementChild||l.firstChild)}());i.innerHTML='<summary>a</summary>b';i.style.display='block';g.appendChild(i);j=i.offsetHeight;i.open=true;j=j!=i.offsetHeight;g.removeChild(i);if(h){g.parentNode.removeChild(g)}return j}(a)),b=function(h,k,j,g){var i=typeof h.attr('open')=='string',l=i&&g||!i&&!g;if(l){h.removeClass('open').prop('open',false).triggerHandler('close.details');k.attr('aria-expanded',false);j.hide()}else{h.addClass('open').prop('open',true).triggerHandler('open.details');k.attr('aria-expanded',true);j.show()}};e.noSelect=function(){var g='none';return this.bind('selectstart dragstart mousedown',function(){return false}).css({MozUserSelect:g,msUserSelect:g,webkitUserSelect:g,userSelect:g})};if(f){d=e.details=function(){return this.each(function(){var h=$(this),g=$('summary',h).first();g.attr({role:'button','aria-expanded':h.prop('open')}).on('click',function(){var i=h.prop('open');g.attr('aria-expanded',!i);h.triggerHandler((i?'close':'open')+'.details')})})};d.support=f}else{d=e.details=function(){return this.each(function(){var g=$(this),i=$('summary',g).first(),h=g.children(':not(summary)'),j=g.contents(':not(summary)');if(!i.length){i=$('<summary>').text('Details').prependTo(g)}if(h.length!=j.length){j.filter(function(){return this.nodeType==3&&/[^ \t\n\f\r]/.test(this.data)}).wrap('<span>');h=g.children(':not(summary)')}b(g,i,h);i.attr('role','button').noSelect().prop('tabIndex',0).on('click',function(){i.focus();b(g,i,h,true)}).keyup(function(k){if(32==k.keyCode||(13==k.keyCode&&!c)){k.preventDefault();i.click()}})})};d.support=f}}(document,jQuery));
diff --git a/app/design/adminhtml/magento_backend/js/jquery.mousewheel.js b/pub/lib/jquery/jquery.mousewheel.js
similarity index 72%
rename from app/design/adminhtml/magento_backend/js/jquery.mousewheel.js
rename to pub/lib/jquery/jquery.mousewheel.js
index 5c3bfb61a70b16dee4c5ddfd96b5e880f8f10360..38b60951b201bedf3e1005ed49cbd1c0834d5815 100644
--- a/app/design/adminhtml/magento_backend/js/jquery.mousewheel.js
+++ b/pub/lib/jquery/jquery.mousewheel.js
@@ -1,26 +1,3 @@
-/**
- * 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)
- */
-
 /*! Copyright (c) 2011 Brandon Aaron (http://brandonaaron.net)
  * Licensed under the MIT License (LICENSE.txt).
  *
diff --git a/pub/lib/lib/dropdown.js b/pub/lib/lib/dropdown.js
deleted file mode 100644
index 13fff757a3f61ef961f4d14d50059c344a8bfc63..0000000000000000000000000000000000000000
--- a/pub/lib/lib/dropdown.js
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Academic Free License (AFL 3.0)
- * that is bundled with this package in the file LICENSE_AFL.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/afl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category    Mage
- * @package     js
- * @copyright   Copyright (c) 2014 X.commerce, Inc. (http://www.magentocommerce.com)
- * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
- */
-dropdown = function() {
-    var ele = document.getElementById("nav").getElementsByTagName("LI");
-    for (var i=0; i<ele.length; i++) {
-        ele[i].onmouseover=function() {
-            this.className+=" over";
-        }
-        ele[i].onmouseout=function() {
-            this.className=this.className.replace(new RegExp(" over\\b"), "");
-        }
-    }
-}
-if (window.attachEvent) window.attachEvent("onload", dropdown);
diff --git a/pub/lib/lib/flex.js b/pub/lib/mage/flex.js
similarity index 100%
rename from pub/lib/lib/flex.js
rename to pub/lib/mage/flex.js
diff --git a/app/design/frontend/magento_plushe/js/matchMedia.js b/pub/lib/matchMedia.js
similarity index 81%
rename from app/design/frontend/magento_plushe/js/matchMedia.js
rename to pub/lib/matchMedia.js
index 764dabd6c9a22ca6de2849180e9989498a2d413e..e91c2b97803c4387695437c00d81b82a821d0b4e 100644
--- a/app/design/frontend/magento_plushe/js/matchMedia.js
+++ b/pub/lib/matchMedia.js
@@ -1,25 +1,3 @@
-/**
- * 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)
- */
 /*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */
 
 window.matchMedia = window.matchMedia || (function( doc, undefined ) {
diff --git a/pub/lib/modernizr/modernizr.2.0.6.js b/pub/lib/modernizr/modernizr.2.0.6.js
new file mode 100644
index 0000000000000000000000000000000000000000..db230439e74ee5105a504c8b87c2d0bfd796b0be
--- /dev/null
+++ b/pub/lib/modernizr/modernizr.2.0.6.js
@@ -0,0 +1,4 @@
+/* Modernizr 2.0.6 (Custom Build) | MIT & BSD
+ * Build: http://www.modernizr.com/download/#-csstransforms-csstransforms3d-cssclasses-prefixed-teststyles-testprop-testallprops-prefixes-domprefixes
+ */
+;window.Modernizr=function(a,b,c){function C(a,b){var c=a.charAt(0).toUpperCase()+a.substr(1),d=(a+" "+o.join(c+" ")+c).split(" ");return B(d,b)}function B(a,b){for(var d in a)if(k[a[d]]!==c)return b=="pfx"?a[d]:!0;return!1}function A(a,b){return!!~(""+a).indexOf(b)}function z(a,b){return typeof a===b}function y(a,b){return x(n.join(a+";")+(b||""))}function x(a){k.cssText=a}var d="2.0.6",e={},f=!0,g=b.documentElement,h=b.head||b.getElementsByTagName("head")[0],i="modernizr",j=b.createElement(i),k=j.style,l,m=Object.prototype.toString,n=" -webkit- -moz- -o- -ms- -khtml- ".split(" "),o="Webkit Moz O ms Khtml".split(" "),p={},q={},r={},s=[],t=function(a,c,d,e){var f,h,j,k=b.createElement("div");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:i+(d+1),k.appendChild(j);f=["&shy;","<style>",a,"</style>"].join(""),k.id=i,k.innerHTML+=f,g.appendChild(k),h=c(k,a),k.parentNode.removeChild(k);return!!h},u,v={}.hasOwnProperty,w;!z(v,c)&&!z(v.call,c)?w=function(a,b){return v.call(a,b)}:w=function(a,b){return b in a&&z(a.constructor.prototype[b],c)};var D=function(a,c){var d=a.join(""),f=c.length;t(d,function(a,c){var d=b.styleSheets[b.styleSheets.length-1],g=d.cssRules&&d.cssRules[0]?d.cssRules[0].cssText:d.cssText||"",h=a.childNodes,i={};while(f--)i[h[f].id]=h[f];e.csstransforms3d=i.csstransforms3d.offsetLeft===9},f,c)}([,["@media (",n.join("transform-3d),("),i,")","{#csstransforms3d{left:9px;position:absolute}}"].join("")],[,"csstransforms3d"]);p.csstransforms=function(){return!!B(["transformProperty","WebkitTransform","MozTransform","OTransform","msTransform"])},p.csstransforms3d=function(){var a=!!B(["perspectiveProperty","WebkitPerspective","MozPerspective","OPerspective","msPerspective"]);a&&"webkitPerspective"in g.style&&(a=e.csstransforms3d);return a};for(var E in p)w(p,E)&&(u=E.toLowerCase(),e[u]=p[E](),s.push((e[u]?"":"no-")+u));x(""),j=l=null,e._version=d,e._prefixes=n,e._domPrefixes=o,e.testProp=function(a){return B([a])},e.testAllProps=C,e.testStyles=t,e.prefixed=function(a){return C(a,"pfx")},g.className=g.className.replace(/\bno-js\b/,"")+(f?" js "+s.join(" "):"");return e}(this,this.document);
\ No newline at end of file
diff --git a/pub/lib/modernizr/modernizr.details.js b/pub/lib/modernizr/modernizr.details.js
new file mode 100644
index 0000000000000000000000000000000000000000..48f1c9cfe0b26de26cc947780c046ff319a37b6d
--- /dev/null
+++ b/pub/lib/modernizr/modernizr.details.js
@@ -0,0 +1,25 @@
+// By @mathias, based on http://mths.be/axh
+Modernizr.addTest('details', function() {
+    var doc = document,
+        el = doc.createElement('details'),
+        fake,
+        root,
+        diff;
+    if (!('open' in el)) { // return early if possible; thanks @aFarkas!
+        return false;
+    }
+    root = doc.body || (function() {
+        var de = doc.documentElement;
+        fake = true;
+        return de.insertBefore(doc.createElement('body'), de.firstElementChild || de.firstChild);
+    }());
+    el.innerHTML = '<summary>a</summary>b';
+    el.style.display = 'block';
+    root.appendChild(el);
+    diff = el.offsetHeight;
+    el.open = true;
+    diff = diff != el.offsetHeight;
+    root.removeChild(el);
+    fake && root.parentNode.removeChild(root);
+    return diff;
+});
diff --git a/pub/lib/lib/modernizr.js b/pub/lib/modernizr/modernizr.js
similarity index 100%
rename from pub/lib/lib/modernizr.js
rename to pub/lib/modernizr/modernizr.js
diff --git a/pub/lib/prototype/validation.js b/pub/lib/prototype/validation.js
index 5ad144557f07ded184528d85af40bee502a86a8c..798194949ad5a55b62ba77435c130f755363792d 100644
--- a/pub/lib/prototype/validation.js
+++ b/pub/lib/prototype/validation.js
@@ -856,7 +856,7 @@ Validation.addAllThese([
          $(prefix + '_cc_issue').advaiceContainer
            = $(prefix + '_start_month').advaiceContainer
            = $(prefix + '_start_year').advaiceContainer
-           = $(prefix + '_cc_type_ss_div').down('ul li.adv-container');
+           = $(prefix + '_cc_type_ss_div').down('.adv-container');
 
          var ccIssue   =  $(prefix + '_cc_issue').value;
          var ccSMonth  =  $(prefix + '_start_month').value;
diff --git a/app/design/frontend/magento_plushe/js/selectivizr.js b/pub/lib/selectivizr.js
similarity index 95%
rename from app/design/frontend/magento_plushe/js/selectivizr.js
rename to pub/lib/selectivizr.js
index db735c5080d8c0f33ef3ae89c4fddde3720e6268..f7bd64295b5b82b889c3729adc3159437f46d19e 100644
--- a/app/design/frontend/magento_plushe/js/selectivizr.js
+++ b/pub/lib/selectivizr.js
@@ -1,25 +1,3 @@
-/**
- * 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)
- */
 /*
 selectivizr v1.0.2 - (c) Keith Clark, freely distributable under the terms 
 of the MIT license.
@@ -564,4 +542,4 @@ References:
 			addEvent(win,"load", init);
 		}
 	};
-})(this);
\ No newline at end of file
+})(this);