diff --git a/app/code/Magento/Bundle/Setup/InstallSchema.php b/app/code/Magento/Bundle/Setup/InstallSchema.php
index 6f98cd386327a182243b4348fa6dc0d02f56cd4e..5c7d5a47da616e801a3dc0e2fc05ab3d0eb69c04 100644
--- a/app/code/Magento/Bundle/Setup/InstallSchema.php
+++ b/app/code/Magento/Bundle/Setup/InstallSchema.php
@@ -24,7 +24,9 @@ class InstallSchema implements InstallSchemaInterface
         $installer = $setup;
 
         $installer->startSetup();
-
+        $customerGroupTable = $setup->getConnection()->describeTable($setup->getTable('customer_group'));
+        $customerGroupIdType = $customerGroupTable['customer_group_id']['DATA_TYPE'] == 'int'
+            ? \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER : $customerGroupTable['customer_group_id']['DATA_TYPE'];
         /**
          * Create table 'catalog_product_bundle_option'
          */
@@ -340,7 +342,7 @@ class InstallSchema implements InstallSchemaInterface
             )
             ->addColumn(
                 'customer_group_id',
-                \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
+                $customerGroupIdType,
                 null,
                 ['unsigned' => true, 'nullable' => false, 'primary' => true],
                 'Customer Group Id'
diff --git a/app/code/Magento/Bundle/Setup/UpgradeSchema.php b/app/code/Magento/Bundle/Setup/UpgradeSchema.php
old mode 100644
new mode 100755
index e48ad97922dc99540f8e4d9b0fb8450d2d023365..ced66a03a3a865cc14e1050d2df94df5c1762ad0
--- a/app/code/Magento/Bundle/Setup/UpgradeSchema.php
+++ b/app/code/Magento/Bundle/Setup/UpgradeSchema.php
@@ -44,6 +44,24 @@ class UpgradeSchema implements UpgradeSchemaInterface
             }
         }
 
+        if (version_compare($context->getVersion(), '2.0.3', '<')) {
+            $tables = [
+                'catalog_product_index_price_bundle_idx',
+                'catalog_product_index_price_bundle_opt_idx',
+                'catalog_product_index_price_bundle_opt_tmp',
+                'catalog_product_index_price_bundle_sel_idx',
+                'catalog_product_index_price_bundle_sel_tmp',
+                'catalog_product_index_price_bundle_tmp',
+            ];
+            foreach ($tables as $table) {
+                $setup->getConnection()->modifyColumn(
+                    $setup->getTable($table),
+                    'customer_group_id',
+                    ['type' => 'integer', 'nullable' => false]
+                );
+            }
+        }
+
         $setup->endSetup();
     }
 }
diff --git a/app/code/Magento/Bundle/etc/module.xml b/app/code/Magento/Bundle/etc/module.xml
index 982a33d00bc6b9dd94f57a5b3b2e4dbd41d719b9..34a88d4447cc3648a94f52c473831959111f5aed 100644
--- a/app/code/Magento/Bundle/etc/module.xml
+++ b/app/code/Magento/Bundle/etc/module.xml
@@ -6,7 +6,7 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
-    <module name="Magento_Bundle" setup_version="2.0.2">
+    <module name="Magento_Bundle" setup_version="2.0.3">
         <sequence>
             <module name="Magento_Catalog"/>
         </sequence>
diff --git a/app/code/Magento/Catalog/Setup/InstallSchema.php b/app/code/Magento/Catalog/Setup/InstallSchema.php
index 2ccd8af79a5da7eb51f43aeabfa19a9de14c81c1..171e96efe9b0a1e714e1331fc2ed95a175cd58fb 100644
--- a/app/code/Magento/Catalog/Setup/InstallSchema.php
+++ b/app/code/Magento/Catalog/Setup/InstallSchema.php
@@ -1853,6 +1853,9 @@ class InstallSchema implements InstallSchemaInterface
         $installer->getConnection()
             ->createTable($table);
 
+        $customerGroupTable = $setup->getConnection()->describeTable($setup->getTable('customer_group'));
+        $customerGroupIdType = $customerGroupTable['customer_group_id']['DATA_TYPE'] == 'int'
+            ? \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER : $customerGroupTable['customer_group_id']['DATA_TYPE'];
         /**
          * Create table 'catalog_product_entity_tier_price'
          */
@@ -1883,7 +1886,7 @@ class InstallSchema implements InstallSchemaInterface
             )
             ->addColumn(
                 'customer_group_id',
-                \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
+                $customerGroupIdType,
                 null,
                 ['unsigned' => true, 'nullable' => false, 'default' => '0'],
                 'Customer Group ID'
@@ -2937,7 +2940,7 @@ class InstallSchema implements InstallSchemaInterface
             )
             ->addColumn(
                 'customer_group_id',
-                \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
+                $customerGroupIdType,
                 null,
                 ['unsigned' => true, 'nullable' => false, 'primary' => true],
                 'Customer Group ID'
@@ -3056,7 +3059,7 @@ class InstallSchema implements InstallSchemaInterface
             )
             ->addColumn(
                 'customer_group_id',
-                \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
+                $customerGroupIdType,
                 null,
                 ['unsigned' => true, 'nullable' => false, 'primary' => true],
                 'Customer Group ID'
diff --git a/app/code/Magento/Catalog/Setup/UpgradeSchema.php b/app/code/Magento/Catalog/Setup/UpgradeSchema.php
old mode 100644
new mode 100755
index 9683632f121b6af18a3397e53bac2943521683c9..cbcce1d427bb6c91fa000bff0b4a069ab02d034f
--- a/app/code/Magento/Catalog/Setup/UpgradeSchema.php
+++ b/app/code/Magento/Catalog/Setup/UpgradeSchema.php
@@ -36,6 +36,31 @@ class UpgradeSchema implements UpgradeSchemaInterface
         if (version_compare($context->getVersion(), '2.1.0', '<')) {
             $this->addPercentageValueColumn($setup);
         }
+
+        if (version_compare($context->getVersion(), '2.1.1', '<')) {
+            $tables = [
+                'catalog_product_index_price_cfg_opt_agr_idx',
+                'catalog_product_index_price_cfg_opt_agr_tmp',
+                'catalog_product_index_price_cfg_opt_idx',
+                'catalog_product_index_price_cfg_opt_tmp',
+                'catalog_product_index_price_final_idx',
+                'catalog_product_index_price_final_tmp',
+                'catalog_product_index_price_idx',
+                'catalog_product_index_price_opt_agr_idx',
+                'catalog_product_index_price_opt_agr_tmp',
+                'catalog_product_index_price_opt_idx',
+                'catalog_product_index_price_opt_tmp',
+                'catalog_product_index_price_tmp',
+            ];
+            foreach ($tables as $table) {
+                $setup->getConnection()->modifyColumn(
+                    $setup->getTable($table),
+                    'customer_group_id',
+                    ['type' => 'integer', 'nullable' => false]
+                );
+            }
+        }
+
         $setup->endSetup();
     }
 
diff --git a/app/code/Magento/Catalog/etc/module.xml b/app/code/Magento/Catalog/etc/module.xml
index 1250b55b968480bf9c1d9f9952da6d864048d98f..c629bf6a180ccc0ec42e51a67352f6eaa673dd86 100644
--- a/app/code/Magento/Catalog/etc/module.xml
+++ b/app/code/Magento/Catalog/etc/module.xml
@@ -6,7 +6,7 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
-    <module name="Magento_Catalog" setup_version="2.1.0">
+    <module name="Magento_Catalog" setup_version="2.1.1">
         <sequence>
             <module name="Magento_Eav"/>
             <module name="Magento_Cms"/>
diff --git a/app/code/Magento/CatalogRule/Setup/InstallSchema.php b/app/code/Magento/CatalogRule/Setup/InstallSchema.php
index 70c5724d446de5e3cd151e69b9ffc5534fec1cbe..cb36f6efbdcde67cff29f360d2aef0d65a954e6a 100644
--- a/app/code/Magento/CatalogRule/Setup/InstallSchema.php
+++ b/app/code/Magento/CatalogRule/Setup/InstallSchema.php
@@ -25,6 +25,9 @@ class InstallSchema implements InstallSchemaInterface
 
         $installer->startSetup();
 
+        $customerGroupTable = $setup->getConnection()->describeTable($setup->getTable('customer_group'));
+        $customerGroupIdType = $customerGroupTable['customer_group_id']['DATA_TYPE'] == 'int'
+            ? \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER : $customerGroupTable['customer_group_id']['DATA_TYPE'];
         /**
          * Create table 'catalogrule'
          */
@@ -372,7 +375,7 @@ class InstallSchema implements InstallSchemaInterface
             )
             ->addColumn(
                 'customer_group_id',
-                \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
+                $customerGroupIdType,
                 null,
                 ['unsigned' => true, 'nullable' => false, 'primary' => true, 'default' => '0'],
                 'Customer Group Id'
@@ -477,7 +480,7 @@ class InstallSchema implements InstallSchemaInterface
             )
             ->addColumn(
                 'customer_group_id',
-                \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
+                $customerGroupIdType,
                 null,
                 ['unsigned' => true, 'nullable' => false, 'primary' => true],
                 'Customer Group Id'
diff --git a/app/code/Magento/CatalogRule/Setup/UpgradeSchema.php b/app/code/Magento/CatalogRule/Setup/UpgradeSchema.php
index 1d576e74c4c80caabcac9a53f7d3701ba5d66ded..6bfb927c9c8f5ce33d53e68853554d131e5f188f 100644
--- a/app/code/Magento/CatalogRule/Setup/UpgradeSchema.php
+++ b/app/code/Magento/CatalogRule/Setup/UpgradeSchema.php
@@ -26,6 +26,20 @@ class UpgradeSchema implements UpgradeSchemaInterface
             $this->removeSubProductDiscounts($setup);
         }
 
+        if (version_compare($context->getVersion(), '2.0.2', '<')) {
+            $tables = [
+                'catalogrule_product',
+                'catalogrule_product_price',
+            ];
+            foreach ($tables as $table) {
+                $setup->getConnection()->modifyColumn(
+                    $setup->getTable($table),
+                    'customer_group_id',
+                    ['type' => 'integer']
+                );
+            }
+        }
+
         $setup->endSetup();
     }
 
diff --git a/app/code/Magento/CatalogRule/etc/module.xml b/app/code/Magento/CatalogRule/etc/module.xml
index ea6a730279ed54ba2caf76f1cab17d8fc21f9585..d7db233e1eb06ee815e1c7e71a325b0c0d0f8f92 100644
--- a/app/code/Magento/CatalogRule/etc/module.xml
+++ b/app/code/Magento/CatalogRule/etc/module.xml
@@ -6,7 +6,7 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
-    <module name="Magento_CatalogRule" setup_version="2.0.1">
+    <module name="Magento_CatalogRule" setup_version="2.0.2">
         <sequence>
             <module name="Magento_Rule"/>
             <module name="Magento_Catalog"/>
diff --git a/app/code/Magento/Customer/Block/Account/AuthorizationLink.php b/app/code/Magento/Customer/Block/Account/AuthorizationLink.php
index f2e2f1d0bd77f24408dc3f9f7492efce5775fe18..9cb3f8fdd94d613747595b3f03e3a492e6c0d342 100644
--- a/app/code/Magento/Customer/Block/Account/AuthorizationLink.php
+++ b/app/code/Magento/Customer/Block/Account/AuthorizationLink.php
@@ -6,13 +6,14 @@
 namespace Magento\Customer\Block\Account;
 
 use Magento\Customer\Model\Context;
+use Magento\Customer\Block\Account\SortLinkInterface;
 
 /**
  * Customer authorization link
  *
  * @SuppressWarnings(PHPMD.DepthOfInheritance)
  */
-class AuthorizationLink extends \Magento\Framework\View\Element\Html\Link
+class AuthorizationLink extends \Magento\Framework\View\Element\Html\Link implements SortLinkInterface
 {
     /**
      * Customer session
@@ -88,4 +89,12 @@ class AuthorizationLink extends \Magento\Framework\View\Element\Html\Link
     {
         return $this->httpContext->getValue(Context::CONTEXT_AUTH);
     }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getSortOrder()
+    {
+        return $this->getData(self::SORT_ORDER);
+    }
 }
diff --git a/app/code/Magento/Customer/Block/Account/Delimiter.php b/app/code/Magento/Customer/Block/Account/Delimiter.php
new file mode 100644
index 0000000000000000000000000000000000000000..31ded827184eb810cbffba562d2e1b388e573c5f
--- /dev/null
+++ b/app/code/Magento/Customer/Block/Account/Delimiter.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Customer\Block\Account;
+
+/**
+ * Class for delimiter.
+ */
+class Delimiter extends \Magento\Framework\View\Element\Template implements SortLinkInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getSortOrder()
+    {
+        return $this->getData(self::SORT_ORDER);
+    }
+}
diff --git a/app/code/Magento/Customer/Block/Account/Link.php b/app/code/Magento/Customer/Block/Account/Link.php
index 59961971a0ca8c697980f621e7b3777bd7569823..d37a9a548d44ffd5ef97ea0da05ee17a7149b38b 100644
--- a/app/code/Magento/Customer/Block/Account/Link.php
+++ b/app/code/Magento/Customer/Block/Account/Link.php
@@ -5,12 +5,14 @@
  */
 namespace Magento\Customer\Block\Account;
 
+use Magento\Customer\Block\Account\SortLinkInterface;
+
 /**
  * Class Link
  *
  * @SuppressWarnings(PHPMD.DepthOfInheritance)
  */
-class Link extends \Magento\Framework\View\Element\Html\Link
+class Link extends \Magento\Framework\View\Element\Html\Link implements SortLinkInterface
 {
     /**
      * @var \Magento\Customer\Model\Url
@@ -38,4 +40,12 @@ class Link extends \Magento\Framework\View\Element\Html\Link
     {
         return $this->_customerUrl->getAccountUrl();
     }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getSortOrder()
+    {
+        return $this->getData(self::SORT_ORDER);
+    }
 }
diff --git a/app/code/Magento/Customer/Block/Account/Navigation.php b/app/code/Magento/Customer/Block/Account/Navigation.php
new file mode 100644
index 0000000000000000000000000000000000000000..d8644f5565f3b6a8a4318c914719bc6c9fec3867
--- /dev/null
+++ b/app/code/Magento/Customer/Block/Account/Navigation.php
@@ -0,0 +1,47 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Customer\Block\Account;
+
+use \Magento\Framework\View\Element\Html\Links;
+use \Magento\Customer\Block\Account\SortLinkInterface;
+
+/**
+ * Class for sorting links in navigation panels.
+ */
+class Navigation extends Links
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getLinks()
+    {
+        $links = $this->_layout->getChildBlocks($this->getNameInLayout());
+        $sortableLink = [];
+        foreach ($links as $key => $link) {
+            if ($link instanceof SortLinkInterface) {
+                $sortableLink[] = $link;
+                unset($links[$key]);
+            }
+        }
+
+        usort($sortableLink, [$this, "compare"]);
+        return array_merge($sortableLink, $links);
+    }
+
+    /**
+     * Compare sortOrder in links.
+     *
+     * @param SortLinkInterface $firstLink
+     * @param SortLinkInterface $secondLink
+     * @return int
+     * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
+     */
+    private function compare(SortLinkInterface $firstLink, SortLinkInterface $secondLink)
+    {
+        return ($firstLink->getSortOrder() < $secondLink->getSortOrder());
+    }
+}
diff --git a/app/code/Magento/Customer/Block/Account/SortLink.php b/app/code/Magento/Customer/Block/Account/SortLink.php
new file mode 100644
index 0000000000000000000000000000000000000000..2c60e804b7b216ebd26f8baefb8a3addd3fd9176
--- /dev/null
+++ b/app/code/Magento/Customer/Block/Account/SortLink.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Customer\Block\Account;
+
+/**
+ * Class for sortable links.
+ */
+class SortLink extends \Magento\Framework\View\Element\Html\Link\Current implements SortLinkInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function getSortOrder()
+    {
+        return $this->getData(self::SORT_ORDER);
+    }
+}
diff --git a/app/code/Magento/Customer/Block/Account/SortLinkInterface.php b/app/code/Magento/Customer/Block/Account/SortLinkInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..815f4e5adf2fdc29993ea0bf9743c5049eb84967
--- /dev/null
+++ b/app/code/Magento/Customer/Block/Account/SortLinkInterface.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Customer\Block\Account;
+
+/**
+ * Interface for sortable links.
+ * @api
+ */
+interface SortLinkInterface
+{
+    /**#@+
+     * Constant for confirmation status
+     */
+    const SORT_ORDER = 'sortOrder';
+    /**#@-*/
+
+    /**
+     * Get sort order for block.
+     *
+     * @return int
+     */
+    public function getSortOrder();
+}
diff --git a/app/code/Magento/Customer/Model/ResourceModel/Group.php b/app/code/Magento/Customer/Model/ResourceModel/Group.php
index 7496940fe335067df022976b201e0d4ab85d9211..5fb02997cd73117eda354f2e1bf2617d41b10d77 100644
--- a/app/code/Magento/Customer/Model/ResourceModel/Group.php
+++ b/app/code/Magento/Customer/Model/ResourceModel/Group.php
@@ -129,4 +129,65 @@ class Group extends \Magento\Framework\Model\ResourceModel\Db\VersionControl\Abs
         $group->setCode(substr($group->getCode(), 0, $group::GROUP_CODE_MAX_LENGTH));
         return parent::_beforeSave($group);
     }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function _afterSave(\Magento\Framework\Model\AbstractModel $object)
+    {
+        if ($object->getId() == \Magento\Customer\Model\Group::CUST_GROUP_ALL) {
+            $this->skipReservedId($object);
+        }
+
+        return $this;
+    }
+
+    /**
+     * Here we do not allow to save systems reserved ID.
+     *
+     * @param \Magento\Framework\Model\AbstractModel $object
+     * @throws \Magento\Framework\Exception\LocalizedException
+     * @return void
+     */
+    private function skipReservedId(\Magento\Framework\Model\AbstractModel $object)
+    {
+        $tableFieldsWithoutIdField = $this->getTableFieldsWithoutIdField();
+        $select = $this->getConnection()->select();
+        $select->from(
+            [$this->getMainTable()],
+            $tableFieldsWithoutIdField
+        )
+            ->where('customer_group_id = ?', \Magento\Customer\Model\Group::CUST_GROUP_ALL);
+
+        $query = $this->getConnection()->insertFromSelect(
+            $select,
+            $this->getMainTable(),
+            $tableFieldsWithoutIdField
+        );
+        $this->getConnection()->query($query);
+        $lastInsertId = $this->getConnection()->lastInsertId();
+
+        $query = $this->getConnection()->deleteFromSelect(
+            $select,
+            $this->getMainTable()
+        );
+        $this->getConnection()->query($query);
+
+        $object->setId($lastInsertId);
+    }
+
+    /**
+     * Get main table fields except of ID field.
+     *
+     * @return array
+     */
+    private function getTableFieldsWithoutIdField()
+    {
+        $fields = $this->getConnection()->describeTable($this->getMainTable());
+        if (isset($fields['customer_group_id'])) {
+            unset($fields['customer_group_id']);
+        }
+
+        return array_keys($fields);
+    }
 }
diff --git a/app/code/Magento/Customer/Setup/UpgradeSchema.php b/app/code/Magento/Customer/Setup/UpgradeSchema.php
old mode 100644
new mode 100755
index 18fc9b9f8d597bc3789d0053192497292be807b9..33ec2352e865d0b6fd5cbbde5d9646b5dd92975d
--- a/app/code/Magento/Customer/Setup/UpgradeSchema.php
+++ b/app/code/Magento/Customer/Setup/UpgradeSchema.php
@@ -108,6 +108,96 @@ class UpgradeSchema implements UpgradeSchemaInterface
             );
         }
 
+        if (version_compare($context->getVersion(), '2.0.10', '<')) {
+            $foreignKeys = $this->getForeignKeys($setup);
+            $this->dropForeignKeys($setup, $foreignKeys);
+            $this->alterTables($setup, $foreignKeys);
+            $this->createForeignKeys($setup, $foreignKeys);
+        }
+
         $setup->endSetup();
     }
+
+    /**
+     * @param SchemaSetupInterface $setup
+     * @param array $keys
+     * @return void
+     */
+    private function alterTables(SchemaSetupInterface $setup, array $keys)
+    {
+        $setup->getConnection()->modifyColumn(
+            $setup->getTable('customer_group'),
+            'customer_group_id',
+            [
+                'type' => 'integer',
+                'unsigned' => true,
+                'identity' => true,
+                'nullable' => false
+            ]
+        );
+        foreach ($keys as $key) {
+            $setup->getConnection()->modifyColumn(
+                $key['TABLE_NAME'],
+                $key['COLUMN_NAME'],
+                [
+                    'type' => 'integer',
+                    'unsigned' => true,
+                    'nullable' => false
+                ]
+            );
+        }
+    }
+
+    /**
+     * @param SchemaSetupInterface $setup
+     * @param array $keys
+     * @return void
+     */
+    private function dropForeignKeys(SchemaSetupInterface $setup, array $keys)
+    {
+        foreach ($keys as $key) {
+            $setup->getConnection()->dropForeignKey($key['TABLE_NAME'], $key['FK_NAME']);
+        }
+    }
+
+    /**
+     * @param SchemaSetupInterface $setup
+     * @param array $keys
+     * @return void
+     */
+    private function createForeignKeys(SchemaSetupInterface $setup, array $keys)
+    {
+        foreach ($keys as $key) {
+            $setup->getConnection()->addForeignKey(
+                $key['FK_NAME'],
+                $key['TABLE_NAME'],
+                $key['COLUMN_NAME'],
+                $key['REF_TABLE_NAME'],
+                $key['REF_COLUMN_NAME'],
+                $key['ON_DELETE']
+            );
+        }
+    }
+
+    /**
+     * @param SchemaSetupInterface $setup
+     * @return array
+     */
+    private function getForeignKeys(SchemaSetupInterface $setup)
+    {
+        $foreignKeys = [];
+        $keysTree = $setup->getConnection()->getForeignKeysTree();
+        foreach ($keysTree as $indexes) {
+            foreach ($indexes as $index) {
+                if (
+                    $index['REF_TABLE_NAME'] == $setup->getTable('customer_group')
+                    && $index['REF_COLUMN_NAME'] == 'customer_group_id'
+                ) {
+                    $foreignKeys[] = $index;
+                }
+
+            }
+        }
+        return $foreignKeys;
+    }
 }
diff --git a/app/code/Magento/Customer/Test/Unit/Model/ResourceModel/GroupTest.php b/app/code/Magento/Customer/Test/Unit/Model/ResourceModel/GroupTest.php
index 6520556842a79d5ad4fb44f05c7706e6dfacba69..8305114ad70cd1edfb15f6615b39f12ee41d8ec3 100644
--- a/app/code/Magento/Customer/Test/Unit/Model/ResourceModel/GroupTest.php
+++ b/app/code/Magento/Customer/Test/Unit/Model/ResourceModel/GroupTest.php
@@ -9,6 +9,7 @@
 namespace Magento\Customer\Test\Unit\Model\ResourceModel;
 
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
+use Magento\Framework\Model\ResourceModel\Db\VersionControl\Snapshot;
 
 /**
  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
@@ -36,6 +37,16 @@ class GroupTest extends \PHPUnit_Framework_TestCase
     /** @var \PHPUnit_Framework_MockObject_MockObject */
     protected $relationProcessorMock;
 
+    /**
+     * @var Snapshot|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $snapshotMock;
+
+    /**
+     * Setting up dependencies.
+     *
+     * @return void
+     */
     protected function setUp()
     {
         $this->resource = $this->getMock(\Magento\Framework\App\ResourceConnection::class, [], [], '', false);
@@ -67,10 +78,18 @@ class GroupTest extends \PHPUnit_Framework_TestCase
             false
         );
 
+        $this->snapshotMock = $this->getMock(
+            \Magento\Framework\Model\ResourceModel\Db\VersionControl\Snapshot::class,
+            [],
+            [],
+            '',
+            false
+        );
+
         $transactionManagerMock = $this->getMock(
             \Magento\Framework\Model\ResourceModel\Db\TransactionManagerInterface::class
         );
-        $transactionManagerMock->expects($this->once())
+        $transactionManagerMock->expects($this->any())
             ->method('start')
             ->willReturn($this->getMock(\Magento\Framework\DB\Adapter\AdapterInterface::class));
         $contextMock->expects($this->once())
@@ -86,10 +105,62 @@ class GroupTest extends \PHPUnit_Framework_TestCase
                 'context' => $contextMock,
                 'groupManagement' => $this->groupManagement,
                 'customersFactory' => $this->customersFactory,
+                'entitySnapshot' => $this->snapshotMock
             ]
         );
     }
 
+    /**
+     * Test for save() method when we try to save entity with system's reserved ID.
+     * 
+     * @return void
+     */
+    public function testSaveWithReservedId()
+    {
+        $expectedId = 55;
+        $this->snapshotMock->expects($this->once())->method('isModified')->willReturn(true);
+        $this->snapshotMock->expects($this->once())->method('registerSnapshot')->willReturnSelf();
+
+        $this->groupModel->expects($this->any())->method('getId')
+            ->willReturn(\Magento\Customer\Model\Group::CUST_GROUP_ALL);
+        $this->groupModel->expects($this->any())->method('getData')
+            ->willReturn([]);
+        $this->groupModel->expects($this->any())->method('isSaveAllowed')
+            ->willReturn(true);
+        $this->groupModel->expects($this->any())->method('getStoredData')
+            ->willReturn([]);
+        $this->groupModel->expects($this->once())->method('setId')
+            ->with($expectedId);
+
+        $dbAdapter = $this->getMockBuilder(\Magento\Framework\DB\Adapter\AdapterInterface::class)
+            ->disableOriginalConstructor()
+            ->setMethods(
+                [
+                    'lastInsertId',
+                    'describeTable',
+                    'update',
+                    'select'
+                ]
+            )
+            ->getMockForAbstractClass();
+        $dbAdapter->expects($this->any())->method('describeTable')->willReturn([]);
+        $dbAdapter->expects($this->any())->method('update')->willReturnSelf();
+        $dbAdapter->expects($this->once())->method('lastInsertId')->willReturn($expectedId);
+        $selectMock = $this->getMockBuilder(\Magento\Framework\DB\Select::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $dbAdapter->expects($this->any())->method('select')->willReturn($selectMock);
+        $selectMock->expects($this->any())->method('from')->willReturnSelf();
+        $this->resource->expects($this->any())->method('getConnection')->willReturn($dbAdapter);
+
+        $this->groupResourceModel->save($this->groupModel);
+    }
+
+    /**
+     * Test for delete() method when we try to save entity with system's reserved ID.
+     *
+     * @return void
+     */
     public function testDelete()
     {
         $dbAdapter = $this->getMock(\Magento\Framework\DB\Adapter\AdapterInterface::class);
diff --git a/app/code/Magento/Customer/etc/di.xml b/app/code/Magento/Customer/etc/di.xml
index b45d00ad0cdddcc1c46645569b92c7848feb8cff..9113895f2e58a2ead7088b54e32e693bf0c1e975 100644
--- a/app/code/Magento/Customer/etc/di.xml
+++ b/app/code/Magento/Customer/etc/di.xml
@@ -55,6 +55,8 @@
                 type="Magento\Customer\Model\Customer\Source\Group" />
     <preference for="Magento\Customer\Model\Customer\Attribute\Source\GroupSourceLoggedInOnlyInterface"
                 type="Magento\Customer\Model\Customer\Attribute\Source\Group"/>
+    <preference for="Magento\Customer\Block\Account\SortLinkInterface"
+                type="Magento\Customer\Block\Account\SortLink"/>
     <type name="Magento\Customer\Model\Session">
         <arguments>
             <argument name="configShare" xsi:type="object">Magento\Customer\Model\Config\Share\Proxy</argument>
diff --git a/app/code/Magento/Customer/etc/module.xml b/app/code/Magento/Customer/etc/module.xml
index fd8307fc36657d8aacc419b2ad48006969cf68f0..f505adb98a0fab653636175a8e10c755521bd706 100644
--- a/app/code/Magento/Customer/etc/module.xml
+++ b/app/code/Magento/Customer/etc/module.xml
@@ -6,7 +6,7 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
-    <module name="Magento_Customer" setup_version="2.0.9">
+    <module name="Magento_Customer" setup_version="2.0.10">
         <sequence>
             <module name="Magento_Eav"/>
             <module name="Magento_Directory"/>
diff --git a/app/code/Magento/Customer/view/frontend/layout/customer_account.xml b/app/code/Magento/Customer/view/frontend/layout/customer_account.xml
index a96dfcd86e542d3ce3bce5fd9fcc39d434c28bcd..0f95cde6798fef89eb7e12673778b84c505029d3 100644
--- a/app/code/Magento/Customer/view/frontend/layout/customer_account.xml
+++ b/app/code/Magento/Customer/view/frontend/layout/customer_account.xml
@@ -9,24 +9,45 @@
     <body>
         <attribute name="class" value="account"/>
         <referenceContainer name="sidebar.main">
-            <block class="Magento\Framework\View\Element\Html\Links" name="customer_account_navigation" before="-" template="Magento_Customer::account/navigation.phtml">
-                <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-account-link">
+            <block class="Magento\Framework\View\Element\Template" template="Magento_Theme::html/collapsible.phtml" before="-">
+                <arguments>
+                    <argument name="block_css" xsi:type="string">account-nav</argument>
+                </arguments>
+                <block class="Magento\Customer\Block\Account\Navigation" name="customer_account_navigation" before="-">
                     <arguments>
-                        <argument name="label" xsi:type="string" translate="true">Account Dashboard</argument>
-                        <argument name="path" xsi:type="string">customer/account</argument>
-                    </arguments>
-                </block>
-                <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-account-edit-link">
-                    <arguments>
-                        <argument name="label" xsi:type="string" translate="true">Account Information</argument>
-                        <argument name="path" xsi:type="string">customer/account/edit</argument>
-                    </arguments>
-                </block>
-                <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-address-link">
-                    <arguments>
-                        <argument name="label" xsi:type="string" translate="true">Address Book</argument>
-                        <argument name="path" xsi:type="string">customer/address</argument>
+                        <argument name="css_class" xsi:type="string">nav items</argument>
                     </arguments>
+                    <block class="Magento\Customer\Block\Account\SortLinkInterface" name="customer-account-navigation-account-link">
+                        <arguments>
+                            <argument name="label" xsi:type="string" translate="true">Account Dashboard</argument>
+                            <argument name="path" xsi:type="string">customer/account</argument>
+                            <argument name="sortOrder" xsi:type="number">250</argument>
+                        </arguments>
+                    </block>
+                    <block class="Magento\Customer\Block\Account\Delimiter" name="customer-account-navigation-delimiter-1" template="Magento_Customer::account/navigation-delimiter.phtml">
+                        <arguments>
+                            <argument name="sortOrder" xsi:type="number">200</argument>
+                        </arguments>
+                    </block>
+                    <block class="Magento\Customer\Block\Account\SortLinkInterface" name="customer-account-navigation-address-link">
+                        <arguments>
+                            <argument name="label" xsi:type="string" translate="true">Address Book</argument>
+                            <argument name="path" xsi:type="string">customer/address</argument>
+                            <argument name="sortOrder" xsi:type="number">190</argument>
+                        </arguments>
+                    </block>
+                    <block class="Magento\Customer\Block\Account\SortLinkInterface" name="customer-account-navigation-account-edit-link">
+                        <arguments>
+                            <argument name="label" xsi:type="string" translate="true">Account Information</argument>
+                            <argument name="path" xsi:type="string">customer/account/edit</argument>
+                            <argument name="sortOrder" xsi:type="number">180</argument>
+                        </arguments>
+                    </block>
+                    <block class="Magento\Customer\Block\Account\Delimiter" name="customer-account-navigation-delimiter-2" template="Magento_Customer::account/navigation-delimiter.phtml">
+                        <arguments>
+                            <argument name="sortOrder" xsi:type="number">130</argument>
+                        </arguments>
+                    </block>
                 </block>
             </block>
         </referenceContainer>
diff --git a/app/code/Magento/Customer/view/frontend/layout/default.xml b/app/code/Magento/Customer/view/frontend/layout/default.xml
index 50580f73a9d3100dc4e17191f9d30804091e12b2..278c16b324da42c07b47c91d73d215e301af842f 100644
--- a/app/code/Magento/Customer/view/frontend/layout/default.xml
+++ b/app/code/Magento/Customer/view/frontend/layout/default.xml
@@ -11,6 +11,7 @@
             <block class="Magento\Customer\Block\Account\Link" name="my-account-link">
                 <arguments>
                     <argument name="label" xsi:type="string" translate="true">My Account</argument>
+                    <argument name="sortOrder" xsi:type="number">110</argument>
                 </arguments>
             </block>
             <block class="Magento\Customer\Block\Account\RegisterLink" name="register-link">
diff --git a/app/code/Magento/Customer/view/frontend/templates/account/navigation-delimiter.phtml b/app/code/Magento/Customer/view/frontend/templates/account/navigation-delimiter.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..bbc80e6686c4f4345286a185c6156a744b6a52f5
--- /dev/null
+++ b/app/code/Magento/Customer/view/frontend/templates/account/navigation-delimiter.phtml
@@ -0,0 +1,9 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+?>
+<li class="nav item">
+    <span class="delimiter"></span>
+</li>
diff --git a/app/code/Magento/Downloadable/Setup/UpgradeSchema.php b/app/code/Magento/Downloadable/Setup/UpgradeSchema.php
new file mode 100755
index 0000000000000000000000000000000000000000..76ed3f2aae275196993757de9a5a91240773a902
--- /dev/null
+++ b/app/code/Magento/Downloadable/Setup/UpgradeSchema.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Downloadable\Setup;
+
+use Magento\Framework\Setup\UpgradeSchemaInterface;
+use Magento\Framework\Setup\ModuleContextInterface;
+use Magento\Framework\Setup\SchemaSetupInterface;
+
+/**
+ * @codeCoverageIgnore
+ */
+class UpgradeSchema implements UpgradeSchemaInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context)
+    {
+        $setup->startSetup();
+
+        if (version_compare($context->getVersion(), '2.0.2', '<')) {
+            $tables = [
+                'catalog_product_index_price_downlod_idx',
+                'catalog_product_index_price_downlod_tmp',
+            ];
+            foreach ($tables as $table) {
+                $setup->getConnection()->modifyColumn(
+                    $setup->getTable($table),
+                    'customer_group_id',
+                    ['type' => 'integer', 'nullable' => false]
+                );
+            }
+        }
+
+        $setup->endSetup();
+    }
+}
diff --git a/app/code/Magento/Downloadable/etc/module.xml b/app/code/Magento/Downloadable/etc/module.xml
index a2fa1d9d569ddd6d4f7a42c9bf47bb449c3ac637..c6fd9c6a982e433d555b18ff5c35965550943e7e 100644
--- a/app/code/Magento/Downloadable/etc/module.xml
+++ b/app/code/Magento/Downloadable/etc/module.xml
@@ -6,7 +6,7 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
-    <module name="Magento_Downloadable" setup_version="2.0.1">
+    <module name="Magento_Downloadable" setup_version="2.0.2">
         <sequence>
             <module name="Magento_Catalog"/>
         </sequence>
diff --git a/app/code/Magento/Downloadable/view/frontend/layout/customer_account.xml b/app/code/Magento/Downloadable/view/frontend/layout/customer_account.xml
index 8d4f13f2bfb160c490ab88f100586d745877d17b..96bcb556edf0dd652b149244ee288f50abff618e 100644
--- a/app/code/Magento/Downloadable/view/frontend/layout/customer_account.xml
+++ b/app/code/Magento/Downloadable/view/frontend/layout/customer_account.xml
@@ -8,10 +8,11 @@
 <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
     <body>
         <referenceBlock name="customer_account_navigation">
-            <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-downloadable-products-link">
+            <block class="Magento\Customer\Block\Account\SortLinkInterface" name="customer-account-navigation-downloadable-products-link">
                 <arguments>
                     <argument name="path" xsi:type="string">downloadable/customer/products</argument>
                     <argument name="label" xsi:type="string">My Downloadable Products</argument>
+                    <argument name="sortOrder" xsi:type="number">220</argument>
                 </arguments>
             </block>
         </referenceBlock>
diff --git a/app/code/Magento/Newsletter/view/frontend/layout/customer_account.xml b/app/code/Magento/Newsletter/view/frontend/layout/customer_account.xml
index 2daee81846c0bfb211aeb453e5727d4a130cb77c..f1b8340b1b88d1d5b519da4305f44992015948b8 100644
--- a/app/code/Magento/Newsletter/view/frontend/layout/customer_account.xml
+++ b/app/code/Magento/Newsletter/view/frontend/layout/customer_account.xml
@@ -8,10 +8,11 @@
 <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
     <body>
         <referenceBlock name="customer_account_navigation">
-            <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-newsletter-subscriptions-link">
+            <block class="Magento\Customer\Block\Account\SortLinkInterface" name="customer-account-navigation-newsletter-subscriptions-link">
                 <arguments>
                     <argument name="path" xsi:type="string">newsletter/manage</argument>
                     <argument name="label" xsi:type="string" translate="true">Newsletter Subscriptions</argument>
+                    <argument name="sortOrder" xsi:type="number">40</argument>
                 </arguments>
             </block>
         </referenceBlock>
diff --git a/app/code/Magento/Paypal/view/frontend/layout/customer_account.xml b/app/code/Magento/Paypal/view/frontend/layout/customer_account.xml
index 5a355a2c399673ec54e1da9fed67f281c32fa1ab..27fa1511d09be68d350ad74a92146c928cff631c 100644
--- a/app/code/Magento/Paypal/view/frontend/layout/customer_account.xml
+++ b/app/code/Magento/Paypal/view/frontend/layout/customer_account.xml
@@ -11,10 +11,11 @@
     </head>
     <body>
         <referenceBlock name="customer_account_navigation">
-            <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-billing-agreements-link">
+            <block class="Magento\Customer\Block\Account\SortLinkInterface" name="customer-account-navigation-billing-agreements-link">
                 <arguments>
                     <argument name="path" xsi:type="string">paypal/billing_agreement</argument>
                     <argument name="label" xsi:type="string" translate="true">Billing Agreements</argument>
+                    <argument name="sortOrder" xsi:type="number">140</argument>
                 </arguments>
             </block>
         </referenceBlock>
diff --git a/app/code/Magento/Persistent/etc/persistent.xml b/app/code/Magento/Persistent/etc/persistent.xml
index fb67e9d976af40adb4b95a5ba145a7d175995e5d..b4b87cb8e765df3e0dab3dad4a1f5b08fd414209 100644
--- a/app/code/Magento/Persistent/etc/persistent.xml
+++ b/app/code/Magento/Persistent/etc/persistent.xml
@@ -18,7 +18,7 @@
                 <name_in_layout>top.links</name_in_layout>
                 <class>Magento\Persistent\Model\Observer</class>
                 <method>emulateTopLinks</method>
-                <block_type>Magento\Theme\Block\Template\Links</block_type>
+                <block_type>Magento\Customer\Block\Account\Navigation</block_type>
             </reference>
         </blocks>
     </instances>
diff --git a/app/code/Magento/Review/view/frontend/layout/customer_account.xml b/app/code/Magento/Review/view/frontend/layout/customer_account.xml
index 9de10e43fa4d148dce5c4b316e93538a830e6d2b..5506a904ce0f76bce2a8552d517a0f31646644fb 100644
--- a/app/code/Magento/Review/view/frontend/layout/customer_account.xml
+++ b/app/code/Magento/Review/view/frontend/layout/customer_account.xml
@@ -8,10 +8,11 @@
 <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
     <body>
         <referenceBlock name="customer_account_navigation">
-            <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-product-reviews-link">
+            <block class="Magento\Customer\Block\Account\SortLinkInterface" name="customer-account-navigation-product-reviews-link">
                 <arguments>
                     <argument name="path" xsi:type="string">review/customer</argument>
                     <argument name="label" xsi:type="string">My Product Reviews</argument>
+                    <argument name="sortOrder" xsi:type="number">50</argument>
                 </arguments>
             </block>
         </referenceBlock>
diff --git a/app/code/Magento/Sales/Model/Order/Payment.php b/app/code/Magento/Sales/Model/Order/Payment.php
index 5deb24a068de1d0ff8a48bb4cc7f6f916c1c6dde..a0f56d6ea9a73ea02d4c852ef6ac4831be29b574 100644
--- a/app/code/Magento/Sales/Model/Order/Payment.php
+++ b/app/code/Magento/Sales/Model/Order/Payment.php
@@ -632,42 +632,48 @@ class Payment extends Info implements OrderPaymentInterface
             $this->transactionManager->generateTransactionId($this, Transaction::TYPE_REFUND)
         );
 
-        // call refund from gateway if required
         $isOnline = false;
         $gateway = $this->getMethodInstance();
         $invoice = null;
-        if ($gateway->canRefund() && $creditmemo->getDoTransaction()) {
+        if ($gateway->canRefund()) {
             $this->setCreditmemo($creditmemo);
-            $invoice = $creditmemo->getInvoice();
-            if ($invoice) {
-                $isOnline = true;
-                $captureTxn = $this->transactionRepository->getByTransactionId(
-                    $invoice->getTransactionId(),
-                    $this->getId(),
-                    $this->getOrder()->getId()
-                );
-                if ($captureTxn) {
-                    $this->setTransactionIdsForRefund($captureTxn);
-                }
-                $this->setShouldCloseParentTransaction(true);
-                // TODO: implement multiple refunds per capture
-                try {
-                    $gateway->setStore(
-                        $this->getOrder()->getStoreId()
+            if ($creditmemo->getDoTransaction()) {
+                $invoice = $creditmemo->getInvoice();
+                if ($invoice) {
+                    $isOnline = true;
+                    $captureTxn = $this->transactionRepository->getByTransactionId(
+                        $invoice->getTransactionId(),
+                        $this->getId(),
+                        $this->getOrder()->getId()
                     );
-                    $this->setRefundTransactionId($invoice->getTransactionId());
-                    $gateway->refund($this, $baseAmountToRefund);
-
-                    $creditmemo->setTransactionId($this->getLastTransId());
-                } catch (\Magento\Framework\Exception\LocalizedException $e) {
-                    if (!$captureTxn) {
-                        throw new \Magento\Framework\Exception\LocalizedException(
-                            __('If the invoice was created offline, try creating an offline credit memo.'),
-                            $e
+                    if ($captureTxn) {
+                        $this->setTransactionIdsForRefund($captureTxn);
+                    }
+                    $this->setShouldCloseParentTransaction(true);
+                    // TODO: implement multiple refunds per capture
+                    try {
+                        $gateway->setStore(
+                            $this->getOrder()->getStoreId()
                         );
+                        $this->setRefundTransactionId($invoice->getTransactionId());
+                        $gateway->refund($this, $baseAmountToRefund);
+
+                        $creditmemo->setTransactionId($this->getLastTransId());
+                    } catch (\Magento\Framework\Exception\LocalizedException $e) {
+                        if (!$captureTxn) {
+                            throw new \Magento\Framework\Exception\LocalizedException(
+                                __('If the invoice was created offline, try creating an offline credit memo.'),
+                                $e
+                            );
+                        }
+                        throw $e;
                     }
-                    throw $e;
                 }
+            } else if ($gateway->isOffline()) {
+                $gateway->setStore(
+                    $this->getOrder()->getStoreId()
+                );
+                $gateway->refund($this, $baseAmountToRefund);
             }
         }
 
diff --git a/app/code/Magento/Sales/Setup/UpgradeSchema.php b/app/code/Magento/Sales/Setup/UpgradeSchema.php
index b977cb28596eae3ff2e9c5ea0836ba716c54831e..d35825242fb291a41961eb882ad93f7d24c58ee9 100644
--- a/app/code/Magento/Sales/Setup/UpgradeSchema.php
+++ b/app/code/Magento/Sales/Setup/UpgradeSchema.php
@@ -69,6 +69,20 @@ class UpgradeSchema implements UpgradeSchemaInterface
             $this->addColumnBaseGrandTotal($installer);
             $this->addIndexBaseGrandTotal($installer);
         }
+        if (version_compare($context->getVersion(), '2.0.4', '<')) {
+            $tables = [
+                'sales_invoice_grid',
+                'sales_order',
+                'sales_shipment_grid',
+            ];
+            foreach ($tables as $table) {
+                $setup->getConnection()->modifyColumn(
+                    $setup->getTable($table),
+                    'customer_group_id',
+                    ['type' => 'integer']
+                );
+            }
+        }
     }
 
     /**
diff --git a/app/code/Magento/Sales/etc/module.xml b/app/code/Magento/Sales/etc/module.xml
index 88d6e25d31fb6c4ed9777595296e969028b154f2..980395e965e0899695206b7094b72f7f5b396ece 100644
--- a/app/code/Magento/Sales/etc/module.xml
+++ b/app/code/Magento/Sales/etc/module.xml
@@ -6,7 +6,7 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
-    <module name="Magento_Sales" setup_version="2.0.3">
+    <module name="Magento_Sales" setup_version="2.0.4">
         <sequence>
             <module name="Magento_Rule"/>
             <module name="Magento_Catalog"/>
diff --git a/app/code/Magento/Sales/view/frontend/layout/customer_account.xml b/app/code/Magento/Sales/view/frontend/layout/customer_account.xml
index a3933b8b221109b895f79646f6e0a9d36dc90905..239a38c09f5058c4f30fa86eb9bd0858517ad8b9 100644
--- a/app/code/Magento/Sales/view/frontend/layout/customer_account.xml
+++ b/app/code/Magento/Sales/view/frontend/layout/customer_account.xml
@@ -8,10 +8,11 @@
 <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
     <body>
         <referenceBlock name="customer_account_navigation">
-            <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-orders-link">
+            <block class="Magento\Customer\Block\Account\SortLinkInterface" name="customer-account-navigation-orders-link">
                 <arguments>
                     <argument name="path" xsi:type="string">sales/order/history</argument>
                     <argument name="label" xsi:type="string" translate="true">My Orders</argument>
+                    <argument name="sortOrder" xsi:type="number">230</argument>
                 </arguments>
             </block>
         </referenceBlock>
diff --git a/app/code/Magento/SalesRule/Setup/InstallSchema.php b/app/code/Magento/SalesRule/Setup/InstallSchema.php
index 577d243cd6e1c0848f78328d26dfbf979216791c..9adf43fc19cce981bb9915bfe614a242cbce013d 100644
--- a/app/code/Magento/SalesRule/Setup/InstallSchema.php
+++ b/app/code/Magento/SalesRule/Setup/InstallSchema.php
@@ -23,7 +23,9 @@ class InstallSchema implements InstallSchemaInterface
     {
         $installer = $setup;
         $installer->startSetup();
-
+        $customerGroupTable = $setup->getConnection()->describeTable($setup->getTable('customer_group'));
+        $customerGroupIdType = $customerGroupTable['customer_group_id']['DATA_TYPE'] == 'int'
+            ? \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER : $customerGroupTable['customer_group_id']['DATA_TYPE'];
         /**
          * Create table 'salesrule'
          */
@@ -441,7 +443,7 @@ class InstallSchema implements InstallSchemaInterface
             'Website Id'
         )->addColumn(
             'customer_group_id',
-            \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
+            $customerGroupIdType,
             null,
             ['unsigned' => true, 'nullable' => false, 'primary' => true],
             'Customer Group Id'
@@ -757,7 +759,7 @@ class InstallSchema implements InstallSchemaInterface
             'Rule Id'
         )->addColumn(
             'customer_group_id',
-            \Magento\Framework\DB\Ddl\Table::TYPE_SMALLINT,
+            $customerGroupIdType,
             null,
             ['unsigned' => true, 'nullable' => false, 'primary' => true],
             'Customer Group Id'
diff --git a/app/code/Magento/Theme/view/frontend/layout/default.xml b/app/code/Magento/Theme/view/frontend/layout/default.xml
index a2e89afcce1ee0461921678bb1c5888c7dd3151f..0f020db7501ae725b25f0bd8bfda51ae5c74be1c 100644
--- a/app/code/Magento/Theme/view/frontend/layout/default.xml
+++ b/app/code/Magento/Theme/view/frontend/layout/default.xml
@@ -40,7 +40,7 @@
                         </arguments>
                     </block>
                     <block class="Magento\Store\Block\Switcher" name="store_language" as="store_language" template="switch/languages.phtml"/>
-                    <block class="Magento\Framework\View\Element\Html\Links" name="top.links">
+                    <block class="Magento\Customer\Block\Account\Navigation" name="top.links">
                         <arguments>
                             <argument name="css_class" xsi:type="string">header links</argument>
                         </arguments>
diff --git a/app/code/Magento/Vault/view/frontend/layout/customer_account.xml b/app/code/Magento/Vault/view/frontend/layout/customer_account.xml
index 2042721d9d387ed0354f8163738a83e1f94d1710..01edaa1f093478d0eb0eb03f42bf98815851e16b 100644
--- a/app/code/Magento/Vault/view/frontend/layout/customer_account.xml
+++ b/app/code/Magento/Vault/view/frontend/layout/customer_account.xml
@@ -8,10 +8,11 @@
 <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
     <body>
         <referenceBlock name="customer_account_navigation">
-            <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-my-credit-cards-link">
+            <block class="Magento\Customer\Block\Account\SortLinkInterface" name="customer-account-navigation-my-credit-cards-link">
                 <arguments>
                     <argument name="path" xsi:type="string">vault/cards/listaction</argument>
                     <argument name="label" xsi:type="string" translate="true">Stored Payment Methods</argument>
+                    <argument name="sortOrder" xsi:type="number">160</argument>
                 </arguments>
             </block>
         </referenceBlock>
diff --git a/app/code/Magento/Wishlist/Block/Link.php b/app/code/Magento/Wishlist/Block/Link.php
index fea2ad5941c5893ceaff7dac1e69bf9c9d133db2..51e59998339d8b809182851b940f4e156c61c0e9 100644
--- a/app/code/Magento/Wishlist/Block/Link.php
+++ b/app/code/Magento/Wishlist/Block/Link.php
@@ -9,12 +9,14 @@
  */
 namespace Magento\Wishlist\Block;
 
+use Magento\Customer\Block\Account\SortLinkInterface;
+
 /**
  * Class Link
  *
  * @SuppressWarnings(PHPMD.DepthOfInheritance)
  */
-class Link extends \Magento\Framework\View\Element\Html\Link
+class Link extends \Magento\Framework\View\Element\Html\Link implements SortLinkInterface
 {
     /**
      * Template name
@@ -68,4 +70,12 @@ class Link extends \Magento\Framework\View\Element\Html\Link
     {
         return __('My Wish List');
     }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getSortOrder()
+    {
+        return $this->getData(self::SORT_ORDER);
+    }
 }
diff --git a/app/code/Magento/Wishlist/view/frontend/layout/customer_account.xml b/app/code/Magento/Wishlist/view/frontend/layout/customer_account.xml
index c1dc653efbe7e2f8877a926073f55744a744a624..9083fcdc8d13280dbb16fb917bc24a2bc577ad2d 100644
--- a/app/code/Magento/Wishlist/view/frontend/layout/customer_account.xml
+++ b/app/code/Magento/Wishlist/view/frontend/layout/customer_account.xml
@@ -8,10 +8,11 @@
 <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
     <body>
         <referenceBlock name="customer_account_navigation">
-            <block class="Magento\Framework\View\Element\Html\Link\Current" ifconfig="wishlist/general/active" name="customer-account-navigation-wish-list-link">
+            <block class="Magento\Customer\Block\Account\SortLinkInterface" ifconfig="wishlist/general/active" name="customer-account-navigation-wish-list-link">
                 <arguments>
                     <argument name="path" xsi:type="string">wishlist</argument>
                     <argument name="label" xsi:type="string">My Wish List</argument>
+                    <argument name="sortOrder" xsi:type="number">210</argument>
                 </arguments>
             </block>
         </referenceBlock>
diff --git a/app/code/Magento/Wishlist/view/frontend/layout/default.xml b/app/code/Magento/Wishlist/view/frontend/layout/default.xml
index a0fc577547c5ac8ea91bc0b9699edcc6a2d499b3..dffa4ec79d64d3183e732aa043ccefc39fa1062f 100644
--- a/app/code/Magento/Wishlist/view/frontend/layout/default.xml
+++ b/app/code/Magento/Wishlist/view/frontend/layout/default.xml
@@ -11,7 +11,11 @@
             <block class="Magento\Framework\View\Element\Js\Components" name="wishlist_page_head_components" template="Magento_Wishlist::js/components.phtml"/>
         </referenceBlock>
         <referenceBlock name="top.links">
-            <block class="Magento\Wishlist\Block\Link" name="wish-list-link" after="my-account-link"/>
+            <block class="Magento\Wishlist\Block\Link" name="wish-list-link" after="my-account-link">
+                <arguments>
+                    <argument name="sortOrder" xsi:type="number">60</argument>
+                </arguments>
+            </block>
         </referenceBlock>
         <referenceContainer name="sidebar.additional">
             <block class="Magento\Wishlist\Block\Customer\Sidebar" name="wishlist_sidebar" as="wishlist" template="Magento_Wishlist::sidebar.phtml"/>
diff --git a/app/design/frontend/Magento/blank/Magento_Customer/web/css/source/_module.less b/app/design/frontend/Magento/blank/Magento_Customer/web/css/source/_module.less
index 369e100506c4d76dd10347a6ee5ee772d605091f..2d54baf8f8e9f74bd3d764133bcc5a58e30ea2e0 100644
--- a/app/design/frontend/Magento/blank/Magento_Customer/web/css/source/_module.less
+++ b/app/design/frontend/Magento/blank/Magento_Customer/web/css/source/_module.less
@@ -15,6 +15,8 @@
 @account-nav-current-color: false;
 @account-nav-current-font-weight: @font-weight__semibold;
 
+@account-nav-delimiter__border-color: @color-gray82;
+
 @account-nav-item-hover: @color-gray91;
 
 @_password-default: @color-gray-light01;
@@ -219,6 +221,12 @@
                     .lib-css(border-color, @account-nav-current-border-color);
                 }
             }
+
+            .delimiter {
+                border-top: 1px solid @account-nav-delimiter__border-color;
+                display: block;
+                margin: @indent__s 1.8rem;
+            }
         }
     }
 
diff --git a/app/design/frontend/Magento/luma/Magento_Customer/layout/customer_account.xml b/app/design/frontend/Magento/luma/Magento_Customer/layout/customer_account.xml
index 5d02aec14bedc148d2cade4f47b87e496da23b9f..be8aa1200f21b0a861c088666f62828e052a1f7c 100644
--- a/app/design/frontend/Magento/luma/Magento_Customer/layout/customer_account.xml
+++ b/app/design/frontend/Magento/luma/Magento_Customer/layout/customer_account.xml
@@ -13,26 +13,41 @@
                     <argument name="block_title" translate="true" xsi:type="string">Account Dashboard</argument>
                     <argument name="block_css" xsi:type="string">block-collapsible-nav</argument>
                 </arguments>
-                <block class="Magento\Framework\View\Element\Html\Links" name="customer_account_navigation" before="-">
+                <block class="Magento\Customer\Block\Account\Navigation" name="customer_account_navigation" before="-">
                     <arguments>
                         <argument name="css_class" xsi:type="string">nav items</argument>
                     </arguments>
-                    <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-account-link">
+                    <block class="Magento\Customer\Block\Account\SortLinkInterface" name="customer-account-navigation-account-link">
                         <arguments>
                             <argument name="label" xsi:type="string" translate="true">Account Dashboard</argument>
                             <argument name="path" xsi:type="string">customer/account</argument>
+                            <argument name="sortOrder" xsi:type="number">250</argument>
                         </arguments>
                     </block>
-                    <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-account-edit-link">
+                    <block class="Magento\Customer\Block\Account\Delimiter" name="customer-account-navigation-delimiter-1"
+                           template="Magento_Customer::account/navigation-delimiter.phtml">
                         <arguments>
-                            <argument name="label" xsi:type="string" translate="true">Account Information</argument>
-                            <argument name="path" xsi:type="string">customer/account/edit</argument>
+                            <argument name="sortOrder" xsi:type="number">200</argument>
                         </arguments>
                     </block>
-                    <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-address-link">
+                    <block class="Magento\Customer\Block\Account\SortLinkInterface" name="customer-account-navigation-address-link">
                         <arguments>
                             <argument name="label" xsi:type="string" translate="true">Address Book</argument>
                             <argument name="path" xsi:type="string">customer/address</argument>
+                            <argument name="sortOrder" xsi:type="number">190</argument>
+                        </arguments>
+                    </block>
+                    <block class="Magento\Customer\Block\Account\SortLinkInterface" name="customer-account-navigation-account-edit-link">
+                        <arguments>
+                            <argument name="label" xsi:type="string" translate="true">Account Information</argument>
+                            <argument name="path" xsi:type="string">customer/account/edit</argument>
+                            <argument name="sortOrder" xsi:type="number">180</argument>
+                        </arguments>
+                    </block>
+                    <block class="Magento\Customer\Block\Account\Delimiter" name="customer-account-navigation-delimiter-2"
+                           template="Magento_Customer::account/navigation-delimiter.phtml">
+                        <arguments>
+                            <argument name="sortOrder" xsi:type="number">130</argument>
                         </arguments>
                     </block>
                 </block>
diff --git a/app/design/frontend/Magento/luma/Magento_Customer/layout/default.xml b/app/design/frontend/Magento/luma/Magento_Customer/layout/default.xml
index bd1fd91d6d338bd743ae49db05440c38f22e94a9..2592f9def7fa42f0d8e69cf0458d568651843f26 100644
--- a/app/design/frontend/Magento/luma/Magento_Customer/layout/default.xml
+++ b/app/design/frontend/Magento/luma/Magento_Customer/layout/default.xml
@@ -9,7 +9,11 @@
     <body>
         <referenceBlock name="header.links">
             <block class="Magento\Customer\Block\Account\Customer" name="customer" template="account/customer.phtml" before="-"/>
-            <block class="Magento\Customer\Block\Account\AuthorizationLink" name="authorization-link-login" template="account/link/authorization.phtml"/>
+            <block class="Magento\Customer\Block\Account\AuthorizationLink" name="authorization-link-login" template="account/link/authorization.phtml">
+                <arguments>
+                    <argument name="sortOrder" xsi:type="number">10</argument>
+                </arguments>
+            </block>
         </referenceBlock>
         <block class="Magento\Theme\Block\Html\Header" name="header" as="header">
             <arguments>
diff --git a/app/design/frontend/Magento/luma/Magento_Theme/web/css/source/module/_collapsible_navigation.less b/app/design/frontend/Magento/luma/Magento_Theme/web/css/source/module/_collapsible_navigation.less
index 95c7ec15ebb33a90e81b03ab553c636f39033fb1..33c0dacb8d99d8e3bb031114a43fd10dc3e767b1 100644
--- a/app/design/frontend/Magento/luma/Magento_Theme/web/css/source/module/_collapsible_navigation.less
+++ b/app/design/frontend/Magento/luma/Magento_Theme/web/css/source/module/_collapsible_navigation.less
@@ -13,6 +13,7 @@
 @collapsible-nav-current-border-color: @color-orange-red1;
 @collapsible-nav-current-color: @color-black;
 @collapsible-nav-current-font-weight: @font-weight__semibold;
+@collapsible-nav-delimiter__border-color: @color-gray82;
 @collapsible-nav-item-hover: @color-gray91;
 
 //
@@ -64,6 +65,12 @@
                     .lib-css(border-color, @collapsible-nav-current-border-color);
                 }
             }
+
+            .delimiter {
+                border-top: 1px solid @collapsible-nav-delimiter__border-color;
+                display: block;
+                margin: @indent__s 1.8rem;
+            }
         }
     }
 }