diff --git a/app/code/Magento/CatalogUrlRewrite/Observer/CategoryUrlPathAutogeneratorObserver.php b/app/code/Magento/CatalogUrlRewrite/Observer/CategoryUrlPathAutogeneratorObserver.php
index 21b085c4c419f0d03bcb72389627ec665582f298..cb30f7abc71792b72d0b78e24b4ba89e25303d67 100644
--- a/app/code/Magento/CatalogUrlRewrite/Observer/CategoryUrlPathAutogeneratorObserver.php
+++ b/app/code/Magento/CatalogUrlRewrite/Observer/CategoryUrlPathAutogeneratorObserver.php
@@ -42,13 +42,18 @@ class CategoryUrlPathAutogeneratorObserver implements ObserverInterface
     /**
      * @param \Magento\Framework\Event\Observer $observer
      * @return void
+     * @throws \Magento\Framework\Exception\LocalizedException
      */
     public function execute(\Magento\Framework\Event\Observer $observer)
     {
         /** @var Category $category */
         $category = $observer->getEvent()->getCategory();
         if ($category->getUrlKey() !== false) {
-            $category->setUrlKey($this->categoryUrlPathGenerator->getUrlKey($category))
+            $resultUrlKey = $this->categoryUrlPathGenerator->getUrlKey($category);
+            if (empty($resultUrlKey)) {
+                throw new \Magento\Framework\Exception\LocalizedException(__('Invalid URL key'));
+            }
+            $category->setUrlKey($resultUrlKey)
                 ->setUrlPath($this->categoryUrlPathGenerator->getUrlPath($category));
             if (!$category->isObjectNew()) {
                 $category->getResource()->saveAttribute($category, 'url_path');
diff --git a/app/code/Magento/Cms/Controller/Adminhtml/Page/Save.php b/app/code/Magento/Cms/Controller/Adminhtml/Page/Save.php
index f2d10d59e02c499fca965ce2a38a03804adc3654..45a74260e927001bcf39148dc2f5d9a9574d0189 100644
--- a/app/code/Magento/Cms/Controller/Adminhtml/Page/Save.php
+++ b/app/code/Magento/Cms/Controller/Adminhtml/Page/Save.php
@@ -30,18 +30,38 @@ class Save extends \Magento\Backend\App\Action
      */
     protected $dataPersistor;
 
+    /**
+     * @var \Magento\Cms\Model\PageFactory
+     */
+    private $pageFactory;
+
+    /**
+     * @var \Magento\Cms\Api\PageRepositoryInterface
+     */
+    private $pageRepository;
+
     /**
      * @param Action\Context $context
      * @param PostDataProcessor $dataProcessor
      * @param DataPersistorInterface $dataPersistor
+     * @param \Magento\Cms\Model\PageFactory $pageFactory
+     * @param \Magento\Cms\Api\PageRepositoryInterface $pageRepository
+     *
      */
     public function __construct(
         Action\Context $context,
         PostDataProcessor $dataProcessor,
-        DataPersistorInterface $dataPersistor
+        DataPersistorInterface $dataPersistor,
+        \Magento\Cms\Model\PageFactory $pageFactory = null,
+        \Magento\Cms\Api\PageRepositoryInterface $pageRepository = null
     ) {
         $this->dataProcessor = $dataProcessor;
         $this->dataPersistor = $dataPersistor;
+        $this->pageFactory = $pageFactory
+            ?: \Magento\Framework\App\ObjectManager::getInstance()->get(\Magento\Cms\Model\PageFactory::class);
+        $this->pageRepository = $pageRepository
+            ?: \Magento\Framework\App\ObjectManager::getInstance()
+                ->get(\Magento\Cms\Api\PageRepositoryInterface::class);
         parent::__construct($context);
     }
 
@@ -66,7 +86,7 @@ class Save extends \Magento\Backend\App\Action
             }
 
             /** @var \Magento\Cms\Model\Page $model */
-            $model = $this->_objectManager->create(\Magento\Cms\Model\Page::class);
+            $model = $this->pageFactory->create();
 
             $id = $this->getRequest()->getParam('page_id');
             if ($id) {
@@ -85,7 +105,7 @@ class Save extends \Magento\Backend\App\Action
             }
 
             try {
-                $model->save();
+                $this->pageRepository->save($model);
                 $this->messageManager->addSuccess(__('You saved the page.'));
                 $this->dataPersistor->clear('cms_page');
                 if ($this->getRequest()->getParam('back')) {
diff --git a/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Page/SaveTest.php b/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Page/SaveTest.php
index 7495a2ad1bad924c241e9fae564785574f13a3a1..12057d2681c20cf8cbc5822d6180b9df96b095ee 100644
--- a/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Page/SaveTest.php
+++ b/app/code/Magento/Cms/Test/Unit/Controller/Adminhtml/Page/SaveTest.php
@@ -13,73 +13,61 @@ class SaveTest extends \PHPUnit_Framework_TestCase
     /**
      * @var \Magento\Framework\App\RequestInterface|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $requestMock;
+    private $requestMock;
 
     /**
      * @var \Magento\Cms\Controller\Adminhtml\Page\PostDataProcessor|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $dataProcessorMock;
+    private $dataProcessorMock;
 
     /**
      * @var \Magento\Framework\App\Request\DataPersistorInterface|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $dataPersistorMock;
+    private $dataPersistorMock;
 
     /**
      * @var \Magento\Backend\Model\View\Result\RedirectFactory|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $resultRedirectFactory;
+    private $resultRedirectFactory;
 
     /**
      * @var \Magento\Backend\Model\View\Result\Redirect|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $resultRedirect;
+    private $resultRedirect;
 
     /**
-     * @var \Magento\Backend\App\Action\Context|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $contextMock;
-
-    /**
-     * @var \Magento\Framework\ObjectManager\ObjectManager|\PHPUnit_Framework_MockObject_MockObject
-     */
-    protected $objectManagerMock;
-
-    /**
-     * @var \Magento\Cms\Model\Page|\PHPUnit_Framework_MockObject_MockObject $pageMock
+     * @var \Magento\Framework\Message\ManagerInterface|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $pageMock;
+    private $messageManagerMock;
 
     /**
-     * @var \Magento\Framework\Message\ManagerInterface|\PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Framework\Event\ManagerInterface|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $messageManagerMock;
+    private $eventManagerMock;
 
     /**
-     * @var \Magento\Framework\Event\ManagerInterface|\PHPUnit_Framework_MockObject_MockObject
+     * @var \Magento\Cms\Model\PageFactory|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $eventManagerMock;
+    private $pageFactory;
 
     /**
-     * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
+     * @var \Magento\Cms\Api\PageRepositoryInterface|\PHPUnit_Framework_MockObject_MockObject
      */
-    protected $objectManager;
+    private $pageRepository;
 
     /**
      * @var \Magento\Cms\Controller\Adminhtml\Page\Save
      */
-    protected $saveController;
+    private $saveController;
 
     /**
      * @var int
      */
-    protected $pageId = 1;
+    private $pageId = 1;
 
     protected function setUp()
     {
-        $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
-
-        $this->contextMock = $this->getMock(\Magento\Backend\App\Action\Context::class, [], [], '', false);
+        $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
 
         $this->resultRedirectFactory = $this->getMockBuilder(\Magento\Backend\Model\View\Result\RedirectFactory::class)
             ->disableOriginalConstructor()
@@ -91,69 +79,37 @@ class SaveTest extends \PHPUnit_Framework_TestCase
         $this->resultRedirectFactory->expects($this->atLeastOnce())
             ->method('create')
             ->willReturn($this->resultRedirect);
-
-        $this->dataProcessorMock = $this->getMock(
-            \Magento\Cms\Controller\Adminhtml\Page\PostDataProcessor::class,
-            ['filter'],
-            [],
-            '',
-            false
-        );
-
+        $this->dataProcessorMock = $this->getMockBuilder(
+            \Magento\Cms\Controller\Adminhtml\Page\PostDataProcessor::class
+        )->setMethods(['filter'])->disableOriginalConstructor()->getMock();
         $this->dataPersistorMock = $this->getMockBuilder(\Magento\Framework\App\Request\DataPersistorInterface::class)
             ->getMock();
-
-        $this->requestMock = $this->getMockForAbstractClass(
-            \Magento\Framework\App\RequestInterface::class,
-            [],
-            '',
-            false,
-            true,
-            true,
-            ['getParam', 'getPostValue']
-        );
-
-        $this->pageMock = $this->getMockBuilder(
-            \Magento\Cms\Model\Page::class
-        )->disableOriginalConstructor()->getMock();
-
-        $this->messageManagerMock = $this->getMock(
-            \Magento\Framework\Message\ManagerInterface::class,
-            [],
-            [],
-            '',
-            false
-        );
-
-        $this->eventManagerMock = $this->getMockForAbstractClass(
-            \Magento\Framework\Event\ManagerInterface::class,
-            [],
-            '',
-            false,
-            true,
-            true,
-            ['dispatch']
-        );
-
-        $this->objectManagerMock = $this->getMockBuilder(\Magento\Framework\ObjectManager\ObjectManager::class)
+        $this->requestMock = $this->getMockBuilder(\Magento\Framework\App\RequestInterface::class)
+            ->setMethods(['getParam', 'getPostValue'])
+            ->getMockForAbstractClass();
+        $this->messageManagerMock = $this->getMockBuilder(\Magento\Framework\Message\ManagerInterface::class)
+            ->getMockForAbstractClass();
+        $this->eventManagerMock = $this->getMockBuilder(\Magento\Framework\Event\ManagerInterface::class)
+            ->setMethods(['dispatch'])
+            ->getMockForAbstractClass();
+        $this->pageFactory = $this->getMockBuilder(\Magento\Cms\Model\PageFactory::class)
             ->disableOriginalConstructor()
-            ->setMethods(['get', 'create'])
+            ->setMethods(['create'])
             ->getMock();
-
-        $this->contextMock->expects($this->any())->method('getRequest')->willReturn($this->requestMock);
-        $this->contextMock->expects($this->any())->method('getObjectManager')->willReturn($this->objectManagerMock);
-        $this->contextMock->expects($this->any())->method('getMessageManager')->willReturn($this->messageManagerMock);
-        $this->contextMock->expects($this->any())->method('getEventManager')->willReturn($this->eventManagerMock);
-        $this->contextMock->expects($this->any())
-            ->method('getResultRedirectFactory')
-            ->willReturn($this->resultRedirectFactory);
-
-        $this->saveController = $this->objectManager->getObject(
+        $this->pageRepository = $this->getMockBuilder(\Magento\Cms\Api\PageRepositoryInterface::class)
+            ->disableOriginalConstructor()
+            ->getMockForAbstractClass();
+        $this->saveController = $objectManager->getObject(
             \Magento\Cms\Controller\Adminhtml\Page\Save::class,
             [
-                'context' => $this->contextMock,
+                'request' => $this->requestMock,
+                'messageManager' => $this->messageManagerMock,
+                'eventManager' => $this->eventManagerMock,
+                'resultRedirectFactory' => $this->resultRedirectFactory,
                 'dataProcessor' => $this->dataProcessorMock,
                 'dataPersistor' => $this->dataPersistorMock,
+                'pageFactory' => $this->pageFactory,
+                'pageRepository' => $this->pageRepository
             ]
         );
     }
@@ -190,20 +146,21 @@ class SaveTest extends \PHPUnit_Framework_TestCase
                     ['back', null, false],
                 ]
             );
-
-        $this->objectManagerMock->expects($this->atLeastOnce())
+        $page = $this->getMockBuilder(\Magento\Cms\Model\Page::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->pageFactory->expects($this->atLeastOnce())
             ->method('create')
-            ->with($this->equalTo(\Magento\Cms\Model\Page::class))
-            ->willReturn($this->pageMock);
+            ->willReturn($page);
 
-        $this->pageMock->expects($this->any())
+        $page->expects($this->any())
             ->method('load')
             ->willReturnSelf();
-        $this->pageMock->expects($this->any())
+        $page->expects($this->any())
             ->method('getId')
             ->willReturn(true);
-        $this->pageMock->expects($this->once())->method('setData');
-        $this->pageMock->expects($this->once())->method('save');
+        $page->expects($this->once())->method('setData');
+        $this->pageRepository->expects($this->once())->method('save')->with($page);
 
         $this->dataPersistorMock->expects($this->any())
             ->method('clear')
@@ -240,20 +197,21 @@ class SaveTest extends \PHPUnit_Framework_TestCase
         $this->dataProcessorMock->expects($this->any())
             ->method('filter')
             ->willReturnArgument(0);
-
-        $this->objectManagerMock->expects($this->atLeastOnce())
+        $page = $this->getMockBuilder(\Magento\Cms\Model\Page::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->pageFactory->expects($this->atLeastOnce())
             ->method('create')
-            ->with($this->equalTo(\Magento\Cms\Model\Page::class))
-            ->willReturn($this->pageMock);
+            ->willReturn($page);
 
-        $this->pageMock->expects($this->any())
+        $page->expects($this->any())
             ->method('load')
             ->willReturnSelf();
-        $this->pageMock->expects($this->any())
+        $page->expects($this->any())
             ->method('getId')
             ->willReturn(true);
-        $this->pageMock->expects($this->once())->method('setData');
-        $this->pageMock->expects($this->once())->method('save');
+        $page->expects($this->once())->method('setData');
+        $this->pageRepository->expects($this->once())->method('save')->with($page);
 
         $this->messageManagerMock->expects($this->once())
             ->method('addSuccess')
@@ -286,20 +244,22 @@ class SaveTest extends \PHPUnit_Framework_TestCase
         $this->dataProcessorMock->expects($this->any())
             ->method('filter')
             ->willReturnArgument(0);
-
-        $this->objectManagerMock->expects($this->atLeastOnce())
+        $page = $this->getMockBuilder(\Magento\Cms\Model\Page::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->pageFactory->expects($this->atLeastOnce())
             ->method('create')
-            ->with($this->equalTo(\Magento\Cms\Model\Page::class))
-            ->willReturn($this->pageMock);
+            ->willReturn($page);
 
-        $this->pageMock->expects($this->any())
+        $page->expects($this->any())
             ->method('load')
             ->willReturnSelf();
-        $this->pageMock->expects($this->any())
+        $page->expects($this->any())
             ->method('getId')
             ->willReturn(true);
-        $this->pageMock->expects($this->once())->method('setData');
-        $this->pageMock->expects($this->once())->method('save')->willThrowException(new \Exception('Error message.'));
+        $page->expects($this->once())->method('setData');
+        $this->pageRepository->expects($this->once())->method('save')->with($page)
+            ->willThrowException(new \Exception('Error message.'));
 
         $this->messageManagerMock->expects($this->never())
             ->method('addSuccess');
diff --git a/app/code/Magento/CmsUrlRewrite/Test/Unit/Model/CmsPageUrlRewriteGeneratorTest.php b/app/code/Magento/CmsUrlRewrite/Test/Unit/Model/CmsPageUrlRewriteGeneratorTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..96a964c3d2d33aa7b0e49baec1db61666718a6a9
--- /dev/null
+++ b/app/code/Magento/CmsUrlRewrite/Test/Unit/Model/CmsPageUrlRewriteGeneratorTest.php
@@ -0,0 +1,133 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\CmsUrlRewrite\Test\Unit\Model;
+
+
+class CmsPageUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
+     */
+    private $objectManager;
+
+    /**
+     * @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $storeManager;
+
+    /**
+     * @var \Magento\UrlRewrite\Service\V1\Data\UrlRewriteFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $urlRewriteFactory;
+
+    /**
+     * @var \Magento\CmsUrlRewrite\Model\CmsPageUrlPathGenerator|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $urlPathGenerator;
+
+    /**
+     * @var \Magento\CmsUrlRewrite\Model\CmsPageUrlRewriteGenerator
+     */
+    private $urlRewriteGenerator;
+
+    /**
+     * @return void
+     */
+    protected function setUp()
+    {
+        $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+        $this->storeManager = $this->getMockBuilder(\Magento\Store\Model\StoreManagerInterface::class)
+            ->getMockForAbstractClass();
+        $this->urlRewriteFactory = $this->getMockBuilder(\Magento\UrlRewrite\Service\V1\Data\UrlRewriteFactory::class)
+            ->setMethods(['create'])
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->urlPathGenerator = $this->getMockBuilder(\Magento\CmsUrlRewrite\Model\CmsPageUrlPathGenerator::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->urlRewriteGenerator = $this->objectManager->getObject(
+            \Magento\CmsUrlRewrite\Model\CmsPageUrlRewriteGenerator::class,
+            [
+                'storeManager' => $this->storeManager,
+                'urlRewriteFactory' => $this->urlRewriteFactory,
+                'cmsPageUrlPathGenerator' => $this->urlPathGenerator
+            ]
+        );
+    }
+
+    public function testGenerateForAllStores()
+    {
+        $initializesStores = [0];
+        $cmsPageId = 1;
+        $cmsPage = $this->getMockBuilder(\Magento\Cms\Model\Page::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $cmsPage->expects($this->any())->method('getStores')->willReturn($initializesStores);
+        $store = $this->getMockBuilder(\Magento\Store\Api\Data\StoreInterface::class)
+            ->setMethods(['getStoreId'])
+            ->getMockForAbstractClass();
+        $this->storeManager->expects($this->any())->method('getStores')->willReturn([$store]);
+        $store->expects($this->any())->method('getStoreId')->willReturn($initializesStores[0]);
+        $urlRewrite = $this->getMockBuilder(\Magento\UrlRewrite\Service\V1\Data\UrlRewrite::class)
+            ->getMockForAbstractClass();
+        $this->urlRewriteFactory->expects($this->any())->method('create')->willReturn($urlRewrite);
+        $cmsPage->expects($this->any())->method('getId')->willReturn($cmsPageId);
+        $cmsPage->expects($this->any())->method('getIdentifier')->willReturn('request_path');
+        $this->urlPathGenerator->expects($this->any())->method('getCanonicalUrlPath')->with($cmsPage)
+            ->willReturn('cms/page/view/page_id/' . $cmsPageId);
+
+        $urls = $this->urlRewriteGenerator->generate($cmsPage);
+        $this->assertEquals($initializesStores[0], $urls[0]->getStoreId());
+        $this->assertFalse(isset($urls[1]));
+    }
+
+    public function testGenerateForSpecificStores()
+    {
+        $initializesStores = [1, 2];
+        $cmsPageId = 1;
+        $cmsPage = $this->getMockBuilder(\Magento\Cms\Model\Page::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $cmsPage->expects($this->any())->method('getStores')->willReturn($initializesStores);
+        $firstStore = $this->getMockBuilder(\Magento\Store\Api\Data\StoreInterface::class)
+            ->setMethods(['getStoreId'])
+            ->getMockForAbstractClass();
+        $secondStore = $this->getMockBuilder(\Magento\Store\Api\Data\StoreInterface::class)
+            ->setMethods(['getStoreId'])
+            ->getMockForAbstractClass();
+        $this->storeManager->expects($this->any())->method('getStores')->willReturn(
+            [
+                1 => $firstStore,
+                2 => $secondStore
+            ]
+        );
+        $firstStore->expects($this->any())->method('getStoreId')->willReturn($initializesStores[0]);
+        $secondStore->expects($this->any())->method('getStoreId')->willReturn($initializesStores[1]);
+
+        $urlRewriteFirst = $this->getMockBuilder(\Magento\UrlRewrite\Service\V1\Data\UrlRewrite::class)
+            ->getMockForAbstractClass();
+        $urlRewriteSecond = $this->getMockBuilder(\Magento\UrlRewrite\Service\V1\Data\UrlRewrite::class)
+            ->getMockForAbstractClass();
+        $this->urlRewriteFactory->expects($this->at(0))->method('create')->willReturn($urlRewriteFirst);
+        $this->urlRewriteFactory->expects($this->at(1))->method('create')->willReturn($urlRewriteSecond);
+
+        $cmsPage->expects($this->any())->method('getId')->willReturn($cmsPageId);
+        $cmsPage->expects($this->any())->method('getIdentifier')->willReturn('request_path');
+        $this->urlPathGenerator->expects($this->any())->method('getCanonicalUrlPath')->with($cmsPage)
+            ->willReturn('cms/page/view/page_id/' . $cmsPageId);
+        $urls = $this->urlRewriteGenerator->generate($cmsPage);
+        $this->assertEquals(
+            [
+                $initializesStores[0],
+                $initializesStores[1]
+            ],
+            [
+                $urls[0]->getStoreId(),
+                $urls[1]->getStoreId(),
+            ]
+        );
+    }
+}
diff --git a/app/code/Magento/Cron/Test/Unit/Observer/ProcessCronQueueObserverTest.php b/app/code/Magento/Cron/Test/Unit/Observer/ProcessCronQueueObserverTest.php
index d079c962cad3716d557feb593a10d246433bdd66..602c5db5c226e78ad2320e5ff6e2f0525ed32864 100644
--- a/app/code/Magento/Cron/Test/Unit/Observer/ProcessCronQueueObserverTest.php
+++ b/app/code/Magento/Cron/Test/Unit/Observer/ProcessCronQueueObserverTest.php
@@ -600,74 +600,74 @@ class ProcessCronQueueObserverTest extends \PHPUnit_Framework_TestCase
     public function testDispatchGenerate()
     {
         $jobConfig = [
-            'test_group' => [
-                'default' => [
-                    'test_job1' => [
-                        'instance' => 'CronJob',
-                        'method' => 'execute',
-                    ],
+            'default' => [
+                'test_job1' => [
+                    'instance' => 'CronJob',
+                    'method' => 'execute',
                 ],
             ],
         ];
 
-        $this->_config->expects($this->at(0))->method('getJobs')->will($this->returnValue($jobConfig));
         $jobs = [
-            'test_group' => [
-                'default' => [
-                    'job1' => ['config_path' => 'test/path'],
-                    'job2' => ['schedule' => ''],
-                    'job3' => ['schedule' => '* * * * *'],
-                ],
+            'default' => [
+                'job1' => ['config_path' => 'test/path'],
+                'job2' => ['schedule' => ''],
+                'job3' => ['schedule' => '* * * * *'],
             ],
         ];
-        $this->_config->expects($this->at(1))->method('getJobs')->will($this->returnValue($jobs));
-        $this->_request->expects($this->any())->method('getParam')->will($this->returnValue('test_group'));
+        $this->_config->expects($this->at(0))->method('getJobs')->willReturn($jobConfig);
+        $this->_config->expects($this->at(1))->method('getJobs')->willReturn($jobs);
+        $this->_request->expects($this->any())->method('getParam')->willReturn('default');
         $this->_cache->expects(
             $this->at(0)
         )->method(
             'load'
         )->with(
-            $this->equalTo(ProcessCronQueueObserver::CACHE_KEY_LAST_SCHEDULE_GENERATE_AT . 'test_group')
-        )->will(
-            $this->returnValue(time() - 10000000)
-        );
+            $this->equalTo(ProcessCronQueueObserver::CACHE_KEY_LAST_SCHEDULE_GENERATE_AT . 'default')
+        )->willReturn(time() - 10000000);
         $this->_cache->expects(
             $this->at(2)
         )->method(
             'load'
         )->with(
-            $this->equalTo(ProcessCronQueueObserver::CACHE_KEY_LAST_HISTORY_CLEANUP_AT . 'test_group')
-        )->will(
-            $this->returnValue(time() + 10000000)
-        );
+            $this->equalTo(ProcessCronQueueObserver::CACHE_KEY_LAST_HISTORY_CLEANUP_AT . 'default')
+        )->willReturn(time() + 10000000);
 
-        $this->_scopeConfig->expects($this->at(0))->method('getValue')->will($this->returnValue(0));
+        $this->_scopeConfig->expects($this->any())->method('getValue')->willReturnMap(
+            [
+                [
+                    'system/cron/default/schedule_generate_every',
+                    \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
+                    null,
+                    0
+                ],
+                [
+                    'system/cron/default/schedule_ahead_for',
+                    \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
+                    null,
+                    2
+                ]
+            ]
+        );
 
-        $scheduleMethods = ['getJobCode', 'getScheduledAt', 'trySchedule', 'unsScheduleId', 'save', '__wakeup'];
         $schedule = $this->getMockBuilder(
             \Magento\Cron\Model\Schedule::class
         )->setMethods(
-            $scheduleMethods
+            ['getJobCode', 'save', 'getScheduledAt', 'unsScheduleId', 'trySchedule', 'getCollection']
         )->disableOriginalConstructor()->getMock();
-        $schedule->expects($this->any())->method('getJobCode')->will($this->returnValue('job_code1'));
-        $schedule->expects($this->once())->method('getScheduledAt')->will($this->returnValue('* * * * *'));
-        $schedule->expects($this->any())->method('unsScheduleId')->will($this->returnSelf());
-        $schedule->expects($this->any())->method('trySchedule')->will($this->returnSelf());
+        $schedule->expects($this->any())->method('getJobCode')->willReturn('job_code1');
+        $schedule->expects($this->once())->method('getScheduledAt')->willReturn('* * * * *');
+        $schedule->expects($this->any())->method('unsScheduleId')->willReturnSelf();
+        $schedule->expects($this->any())->method('trySchedule')->willReturnSelf();
+        $schedule->expects($this->any())->method('getCollection')->willReturn($this->_collection);
+        $schedule->expects($this->exactly(1))->method('save')->willReturnSelf();
 
         $this->_collection->addItem(new \Magento\Framework\DataObject());
         $this->_collection->addItem($schedule);
 
         $this->_cache->expects($this->any())->method('save');
 
-        $scheduleMock = $this->getMockBuilder(
-            \Magento\Cron\Model\Schedule::class
-        )->disableOriginalConstructor()->setMethods(
-            ['getCollection', '__wakeup']
-        )->getMock();
-        $scheduleMock->expects($this->any())->method('getCollection')->will($this->returnValue($this->_collection));
-        $this->_scheduleFactory->expects($this->any())->method('create')->will($this->returnValue($scheduleMock));
-
-        $this->_scheduleFactory->expects($this->any())->method('create')->will($this->returnValue($schedule));
+        $this->_scheduleFactory->expects($this->any())->method('create')->willReturn($schedule);
 
         $this->_observer->execute($this->observer);
     }
diff --git a/app/code/Magento/Customer/Model/Account/Redirect.php b/app/code/Magento/Customer/Model/Account/Redirect.php
index ac03bd02553c762535ba575a7ca1ad398afb606a..5a1470959b60d37758bc698cdc2abaeadd3aea25 100644
--- a/app/code/Magento/Customer/Model/Account/Redirect.php
+++ b/app/code/Magento/Customer/Model/Account/Redirect.php
@@ -9,6 +9,7 @@ use Magento\Customer\Model\Session;
 use Magento\Customer\Model\Url as CustomerUrl;
 use Magento\Framework\App\RequestInterface;
 use Magento\Framework\Controller\ResultFactory;
+use Magento\Framework\Url\HostChecker;
 use Magento\Framework\UrlInterface;
 use Magento\Store\Model\ScopeInterface;
 use Magento\Store\Model\StoreManagerInterface;
@@ -53,6 +54,7 @@ class Redirect
     protected $customerUrl;
 
     /**
+     * @deprecated
      * @var UrlInterface
      */
     protected $url;
@@ -67,6 +69,11 @@ class Redirect
      */
     protected $cookieManager;
 
+    /**
+     * @var HostChecker
+     */
+    private $hostChecker;
+
     /**
      * @param RequestInterface $request
      * @param Session $customerSession
@@ -76,6 +83,7 @@ class Redirect
      * @param DecoderInterface $urlDecoder
      * @param CustomerUrl $customerUrl
      * @param ResultFactory $resultFactory
+     * @param HostChecker|null $hostChecker
      */
     public function __construct(
         RequestInterface $request,
@@ -85,7 +93,8 @@ class Redirect
         UrlInterface $url,
         DecoderInterface $urlDecoder,
         CustomerUrl $customerUrl,
-        ResultFactory $resultFactory
+        ResultFactory $resultFactory,
+        HostChecker $hostChecker = null
     ) {
         $this->request = $request;
         $this->session = $customerSession;
@@ -95,6 +104,7 @@ class Redirect
         $this->urlDecoder = $urlDecoder;
         $this->customerUrl = $customerUrl;
         $this->resultFactory = $resultFactory;
+        $this->hostChecker = $hostChecker ?: ObjectManager::getInstance()->get(HostChecker::class);
     }
 
     /**
@@ -196,7 +206,7 @@ class Redirect
             $referer = $this->request->getParam(CustomerUrl::REFERER_QUERY_PARAM_NAME);
             if ($referer) {
                 $referer = $this->urlDecoder->decode($referer);
-                if ($this->url->isOwnOriginUrl()) {
+                if ($this->hostChecker->isOwnOrigin($referer)) {
                     $this->applyRedirect($referer);
                 }
             }
diff --git a/app/code/Magento/Customer/Model/Url.php b/app/code/Magento/Customer/Model/Url.php
index fa2ff49aafd3abfab8d69c21589b0c6366150424..470093717549a871fb3deb6d74690dcfc45f4f2b 100644
--- a/app/code/Magento/Customer/Model/Url.php
+++ b/app/code/Magento/Customer/Model/Url.php
@@ -56,25 +56,43 @@ class Url
      */
     protected $urlEncoder;
 
+    /**
+     * @var \Magento\Framework\Url\DecoderInterface
+     */
+    private $urlDecoder;
+
+    /**
+     * @var \Magento\Framework\Url\HostChecker
+     */
+    private $hostChecker;
+
     /**
      * @param Session $customerSession
      * @param ScopeConfigInterface $scopeConfig
      * @param RequestInterface $request
      * @param UrlInterface $urlBuilder
      * @param EncoderInterface $urlEncoder
+     * @param \Magento\Framework\Url\DecoderInterface|null $urlDecoder
+     * @param \Magento\Framework\Url\HostChecker|null $hostChecker
      */
     public function __construct(
         Session $customerSession,
         ScopeConfigInterface $scopeConfig,
         RequestInterface $request,
         UrlInterface $urlBuilder,
-        EncoderInterface $urlEncoder
+        EncoderInterface $urlEncoder,
+        \Magento\Framework\Url\DecoderInterface $urlDecoder = null,
+        \Magento\Framework\Url\HostChecker $hostChecker = null
     ) {
         $this->request = $request;
         $this->urlBuilder = $urlBuilder;
         $this->scopeConfig = $scopeConfig;
         $this->customerSession = $customerSession;
         $this->urlEncoder = $urlEncoder;
+        $this->urlDecoder = $urlDecoder ?: \Magento\Framework\App\ObjectManager::getInstance()
+            ->get(\Magento\Framework\Url\DecoderInterface::class);
+        $this->hostChecker = $hostChecker ?: \Magento\Framework\App\ObjectManager::getInstance()
+            ->get(\Magento\Framework\Url\HostChecker::class);
     }
 
     /**
@@ -95,7 +113,7 @@ class Url
     public function getLoginUrlParams()
     {
         $params = [];
-        $referer = $this->request->getParam(self::REFERER_QUERY_PARAM_NAME);
+        $referer = $this->getRequestReferrer();
         if (!$referer
             && !$this->scopeConfig->isSetFlag(
                 self::XML_PATH_CUSTOMER_STARTUP_REDIRECT_TO_DASHBOARD,
@@ -122,9 +140,10 @@ class Url
     public function getLoginPostUrl()
     {
         $params = [];
-        if ($this->request->getParam(self::REFERER_QUERY_PARAM_NAME)) {
+        $referer = $this->getRequestReferrer();
+        if ($referer) {
             $params = [
-                self::REFERER_QUERY_PARAM_NAME => $this->request->getParam(self::REFERER_QUERY_PARAM_NAME),
+                self::REFERER_QUERY_PARAM_NAME => $referer,
             ];
         }
         return $this->urlBuilder->getUrl('customer/account/loginPost', $params);
@@ -220,4 +239,16 @@ class Url
     {
         return $this->urlBuilder->getUrl('customer/account/confirmation', ['email' => $email]);
     }
+
+    /**
+     * @return mixed|null
+     */
+    private function getRequestReferrer()
+    {
+        $referer = $this->request->getParam(self::REFERER_QUERY_PARAM_NAME);
+        if ($referer && $this->hostChecker->isOwnOrigin($this->urlDecoder->decode($referer))) {
+            return $referer;
+        }
+        return null;
+    }
 }
diff --git a/app/code/Magento/Customer/Test/Unit/Model/Account/RedirectTest.php b/app/code/Magento/Customer/Test/Unit/Model/Account/RedirectTest.php
index 5d512bcc6bda1a4fc0f154447a9ec91d74b74228..47b7ea669de30ead287169d1170acbb2c18ae301 100644
--- a/app/code/Magento/Customer/Test/Unit/Model/Account/RedirectTest.php
+++ b/app/code/Magento/Customer/Test/Unit/Model/Account/RedirectTest.php
@@ -13,6 +13,7 @@ namespace Magento\Customer\Test\Unit\Model\Account;
 use Magento\Customer\Model\Account\Redirect;
 use Magento\Customer\Model\Url as CustomerUrl;
 use Magento\Framework\Controller\ResultFactory;
+use Magento\Framework\Url\HostChecker;
 use Magento\Store\Model\ScopeInterface;
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
 
@@ -81,6 +82,11 @@ class RedirectTest extends \PHPUnit_Framework_TestCase
      */
     protected $resultFactory;
 
+    /**
+     * @var HostChecker | \PHPUnit_Framework_MockObject_MockObject
+     */
+    private $hostChecker;
+
     protected function setUp()
     {
         $this->request = $this->getMockForAbstractClass(\Magento\Framework\App\RequestInterface::class);
@@ -134,6 +140,10 @@ class RedirectTest extends \PHPUnit_Framework_TestCase
             ->disableOriginalConstructor()
             ->getMock();
 
+        $this->hostChecker = $this->getMockBuilder(HostChecker::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
         $objectManager = new ObjectManager($this);
         $this->model = $objectManager->getObject(
             \Magento\Customer\Model\Account\Redirect::class,
@@ -145,7 +155,8 @@ class RedirectTest extends \PHPUnit_Framework_TestCase
                 'url'                   => $this->url,
                 'urlDecoder'            => $this->urlDecoder,
                 'customerUrl'           => $this->customerUrl,
-                'resultFactory'         => $this->resultFactory
+                'resultFactory'         => $this->resultFactory,
+                'hostChecker' => $this->hostChecker
             ]
         );
     }
@@ -254,6 +265,7 @@ class RedirectTest extends \PHPUnit_Framework_TestCase
 
         $this->resultRedirect->expects($this->once())
             ->method('setUrl')
+            ->with($beforeAuthUrl)
             ->willReturnSelf();
 
         $this->resultFactory->expects($this->once())
@@ -286,6 +298,7 @@ class RedirectTest extends \PHPUnit_Framework_TestCase
         return [
             // Loggend In, Redirect by Referer
             [1, 2, 'referer', 'base', '', '', 'account', '', '', '', true, false],
+            [1, 2, 'http://referer.com/', 'http://base.com/', '', '', 'account', '', '', 'dashboard', true, false],
             // Loggend In, Redirect by AfterAuthUrl
             [1, 2, 'referer', 'base', '', 'defined', 'account', '', '', '', true, true],
             // Not logged In, Redirect by LoginUrl
diff --git a/dev/tests/functional/tests/app/Magento/Backend/Test/Repository/ConfigData.xml b/dev/tests/functional/tests/app/Magento/Backend/Test/Repository/ConfigData.xml
index a341341cf7c1dfd873ed552c202a2ece65c4ef6c..fcf6e2ac0c4d0ece60aa742dfcb438456a0d9bd5 100644
--- a/dev/tests/functional/tests/app/Magento/Backend/Test/Repository/ConfigData.xml
+++ b/dev/tests/functional/tests/app/Magento/Backend/Test/Repository/ConfigData.xml
@@ -212,5 +212,21 @@
                 <item name="inherit" xsi:type="string">1</item>
             </field>
         </dataset>
+        <dataset name="enable_single_store_mode">
+            <field name="general/single_store_mode/enabled" xsi:type="array">
+                <item name="scope" xsi:type="string">default</item>
+                <item name="scope_id" xsi:type="number">0</item>
+                <item name="label" xsi:type="string">Yes</item>
+                <item name="value" xsi:type="number">1</item>
+            </field>
+        </dataset>
+        <dataset name="enable_single_store_mode_rollback">
+            <field name="general/single_store_mode/enabled" xsi:type="array">
+                <item name="scope" xsi:type="string">default</item>
+                <item name="scope_id" xsi:type="number">0</item>
+                <item name="label" xsi:type="string">No</item>
+                <item name="value" xsi:type="number">0</item>
+            </field>
+        </dataset>
     </repository>
 </config>
diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsPageFormSingleStoreMode.php b/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsPageFormSingleStoreMode.php
new file mode 100644
index 0000000000000000000000000000000000000000..4f96b2e3944751082b3371393d976e469bc7b81a
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Cms/Test/Constraint/AssertCmsPageFormSingleStoreMode.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+namespace Magento\Cms\Test\Constraint;
+
+use Magento\Cms\Test\Fixture\CmsPage;
+use Magento\Cms\Test\Page\Adminhtml\CmsPageIndex;
+use Magento\Cms\Test\Page\Adminhtml\CmsPageNew;
+
+/**
+ * Assert that displayed CMS page data on edit page equals passed from fixture.
+ */
+class AssertCmsPageFormSingleStoreMode extends AssertCmsPageForm
+{
+    /**
+     * Assert that displayed CMS page data on edit page equals passed from fixture with enabled single store mode.
+     *
+     * @param CmsPage $cms
+     * @param CmsPageIndex $cmsIndex
+     * @param CmsPageNew $cmsPageNew
+     * @return void
+     */
+    public function processAssert(
+        CmsPage $cms,
+        CmsPageIndex $cmsIndex,
+        CmsPageNew $cmsPageNew
+    ) {
+        $cmsIndex->open();
+        $filter = ['title' => $cms->getTitle()];
+        $cmsIndex->getCmsPageGridBlock()->searchAndOpen($filter);
+
+        $cmsFormData = $cmsPageNew->getPageForm()->getData($cms);
+        $cmsFixtureData = $cms->getData();
+        $errors = $this->verifyData($cmsFixtureData, $cmsFormData);
+        \PHPUnit_Framework_Assert::assertEmpty($errors, $errors);
+    }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.php b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.php
index 250c55ff00d444635f08c2ea4a5f31d8b225fe10..4f02e7c4caf245528fab63d09d959ff3b8981779 100644
--- a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.php
+++ b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.php
@@ -6,6 +6,7 @@
 
 namespace Magento\Cms\Test\TestCase;
 
+use Magento\Config\Test\Fixture\ConfigData;
 use Magento\Cms\Test\Fixture\CmsPage as CmsPageFixture;
 use Magento\Cms\Test\Page\Adminhtml\CmsPageIndex;
 use Magento\Cms\Test\Page\Adminhtml\CmsPageNew;
@@ -53,6 +54,13 @@ class CreateCmsPageEntityTest extends Injectable
      */
     protected $fixtureFactory;
 
+    /**
+     * Configuration data.
+     *
+     * @var string
+     */
+    private $configData;
+
     /**
      * Inject pages.
      *
@@ -73,10 +81,18 @@ class CreateCmsPageEntityTest extends Injectable
      *
      * @param array $data
      * @param string $fixtureType
+     * @param string $configData
      * @return array
      */
-    public function test(array $data, $fixtureType)
+    public function test(array $data, $fixtureType, $configData = '')
     {
+        $this->configData = $configData;
+
+        // Preconditions
+        $this->objectManager->create(
+            \Magento\Config\Test\TestStep\SetupConfigurationStep::class,
+            ['configData' => $configData]
+        )->run();
         // Steps
         $cms = $this->fixtureFactory->createByCode($fixtureType, ['data' => $data]);
         $this->cmsIndex->open();
@@ -86,4 +102,19 @@ class CreateCmsPageEntityTest extends Injectable
 
         return ['cms' => $cms];
     }
+
+    /**
+     * Disable single store mode on config level.
+     *
+     * @return void
+     */
+    public function tearDown()
+    {
+        if ($this->configData) {
+            $this->objectManager->create(
+                \Magento\Config\Test\TestStep\SetupConfigurationStep::class,
+                ['configData' => 'enable_single_store_mode', 'rollback' => true]
+            )->run();
+        }
+    }
 }
diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.xml b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.xml
index f8b6c8c3d9e06da90b122ba39d0c3f01eebc1978..fc024be14c699d1abb07629e701255ca0c6118f0 100644
--- a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.xml
@@ -67,5 +67,17 @@
             <constraint name="Magento\Cms\Test\Constraint\AssertCmsPagePreview" />
             <constraint name="Magento\Cms\Test\Constraint\AssertCmsPageOnFrontend" />
         </variation>
+        <variation name="CreateCmsPageEntityTestVariation6" summary="Create CMS page with single store mode" ticketId="MAGETWO-59654">
+            <data name="tag" xsi:type="string">test_type:acceptance_test, test_type:extended_acceptance_test</data>
+            <data name="configData" xsi:type="string">enable_single_store_mode</data>
+            <data name="fixtureType" xsi:type="string">cmsPage</data>
+            <data name="data/is_active" xsi:type="string">Yes</data>
+            <data name="data/title" xsi:type="string">NewCmsPage%isolation%</data>
+            <data name="data/identifier" xsi:type="string">identifier-%isolation%</data>
+            <data name="data/content/content" xsi:type="string">cms_page_text_content%isolation%</data>
+            <constraint name="Magento\Cms\Test\Constraint\AssertCmsPageSuccessSaveMessage" />
+            <constraint name="Magento\Cms\Test\Constraint\AssertCmsPageFormSingleStoreMode" />
+            <constraint name="Magento\Cms\Test\Constraint\AssertCmsPageOnFrontend" />
+        </variation>
     </testCase>
 </config>
diff --git a/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Category/ProductTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Category/ProductTest.php
index 568450995f87ae0d0d11edd9dee5b03890e42129..042334a7619d85f31ed00623aff712086873c37a 100644
--- a/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Category/ProductTest.php
+++ b/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/Category/ProductTest.php
@@ -41,6 +41,7 @@ class ProductTest extends \PHPUnit_Framework_TestCase
     }
 
     /**
+     * @magentoAppArea adminhtml
      * @magentoDataFixture Magento/Catalog/_files/indexer_catalog_category.php
      * @magentoDbIsolation enabled
      */
@@ -214,7 +215,7 @@ class ProductTest extends \PHPUnit_Framework_TestCase
             \Magento\Catalog\Model\Category::class
         );
 
-        $result = $category->getCollection()->getItems();
+        $result = $category->getCollection()->addAttributeToSelect('name')->getItems();
         $result = array_slice($result, 2);
 
         return array_slice($result, 0, $count);
diff --git a/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Model/CategoryUrlRewriteGeneratorTest.php b/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Model/CategoryUrlRewriteGeneratorTest.php
index 991d598401236c81a6be641b384e5a6587d55914..93fe95f83cbc98676bd14be0320b8517258ee7f3 100644
--- a/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Model/CategoryUrlRewriteGeneratorTest.php
+++ b/dev/tests/integration/testsuite/Magento/CatalogUrlRewrite/Model/CategoryUrlRewriteGeneratorTest.php
@@ -25,13 +25,6 @@ class CategoryUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase
         $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
     }
 
-    public function tearDown()
-    {
-        $category = $this->objectManager->create(\Magento\Catalog\Model\Category::class);
-        $category->load(3);
-        $category->delete();
-    }
-
     /**
      * @magentoDataFixture Magento/CatalogUrlRewrite/_files/categories.php
      * @magentoDbIsolation enabled
@@ -96,6 +89,37 @@ class CategoryUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase
         $this->assertResults($categoryExpectedResult, $actualResults);
     }
 
+    /**
+     * @magentoDataFixture Magento/CatalogUrlRewrite/_files/categories.php
+     * @magentoDbIsolation enabled
+     * @magentoAppIsolation enabled
+     * @param string $urlKey
+     * @dataProvider incorrectUrlRewritesDataProvider
+     */
+    public function testGenerateUrlRewritesWithIncorrectUrlKey($urlKey)
+    {
+        $this->setExpectedException(
+            \Magento\Framework\Exception\LocalizedException::class,
+            'Invalid URL key'
+        );
+        /** @var \Magento\Catalog\Api\CategoryRepositoryInterface $repository */
+        $repository = $this->objectManager->get(\Magento\Catalog\Api\CategoryRepositoryInterface::class);
+        $category = $repository->get(3);
+        $category->setUrlKey($urlKey);
+        $repository->save($category);
+    }
+
+    /**
+     * @return array
+     */
+    public function incorrectUrlRewritesDataProvider()
+    {
+        return [
+            ['#'],
+            ['//']
+        ];
+    }
+
     /**
      * @param array $filter
      * @return array
diff --git a/lib/internal/Magento/Framework/Test/Unit/UrlTest.php b/lib/internal/Magento/Framework/Test/Unit/UrlTest.php
index 36fce179395b5463fc3cf522defc5075038fc5c1..939e9a39bea584adc34037fcb9a899c4d3fe3e68 100644
--- a/lib/internal/Magento/Framework/Test/Unit/UrlTest.php
+++ b/lib/internal/Magento/Framework/Test/Unit/UrlTest.php
@@ -7,6 +7,7 @@
 // @codingStandardsIgnoreFile
 
 namespace Magento\Framework\Test\Unit;
+use Magento\Framework\Url\HostChecker;
 
 /**
  * Test class for Magento\Framework\Url
@@ -59,6 +60,11 @@ class UrlTest extends \PHPUnit_Framework_TestCase
      */
     protected $urlModifier;
 
+    /**
+     * @var HostChecker|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $hostChecker;
+
     protected function setUp()
     {
         $this->routeParamsResolverMock = $this->getMock(
@@ -549,18 +555,17 @@ class UrlTest extends \PHPUnit_Framework_TestCase
 
     /**
      * @param bool $result
-     * @param string $baseUrl
      * @param string $referrer
      * @dataProvider isOwnOriginUrlDataProvider
      */
-    public function testIsOwnOriginUrl($result, $baseUrl, $referrer)
+    public function testIsOwnOriginUrl($result, $referrer)
     {
         $requestMock = $this->getRequestMock();
-        $model = $this->getUrlModel(['scopeResolver' => $this->scopeResolverMock, 'request' => $requestMock]);
+        $this->hostChecker = $this->getMockBuilder(HostChecker::class)
+            ->disableOriginalConstructor()->getMock();
+        $this->hostChecker->expects($this->once())->method('isOwnOrigin')->with($referrer)->willReturn($result);
+        $model = $this->getUrlModel(['hostChecker' => $this->hostChecker, 'request' => $requestMock]);
 
-        $this->scopeMock->expects($this->any())->method('getBaseUrl')->will($this->returnValue($baseUrl));
-        $this->scopeResolverMock->expects($this->any())->method('getScopes')
-            ->will($this->returnValue([$this->scopeMock]));
         $requestMock->expects($this->once())->method('getServer')->with('HTTP_REFERER')
             ->will($this->returnValue($referrer));
 
@@ -570,8 +575,8 @@ class UrlTest extends \PHPUnit_Framework_TestCase
     public function isOwnOriginUrlDataProvider()
     {
         return [
-            'is origin url' => [true, 'http://localhost/', 'http://localhost/'],
-            'is not origin url' => [false, 'http://localhost/', 'http://example.com/'],
+            'is origin url' => [true, 'http://localhost/'],
+            'is not origin url' => [false, 'http://example.com/'],
         ];
     }
 
diff --git a/lib/internal/Magento/Framework/Url.php b/lib/internal/Magento/Framework/Url.php
index 7361fdb336dd8ecd9ce58507dda027f1731f1d58..30af3528b2baba392095ecb86f9e65eb78bfd8a1 100644
--- a/lib/internal/Magento/Framework/Url.php
+++ b/lib/internal/Magento/Framework/Url.php
@@ -8,6 +8,8 @@
 
 namespace Magento\Framework;
 
+use Magento\Framework\Url\HostChecker;
+
 /**
  * URL
  *
@@ -178,6 +180,11 @@ class Url extends \Magento\Framework\DataObject implements \Magento\Framework\Ur
      */
     private $escaper;
 
+    /**
+     * @var HostChecker
+     */
+    private $hostChecker;
+
     /**
      * @param \Magento\Framework\App\Route\ConfigInterface $routeConfig
      * @param \Magento\Framework\App\RequestInterface $request
@@ -191,6 +198,7 @@ class Url extends \Magento\Framework\DataObject implements \Magento\Framework\Ur
      * @param \Magento\Framework\Url\RouteParamsPreprocessorInterface $routeParamsPreprocessor
      * @param string $scopeType
      * @param array $data
+     * @param HostChecker|null $hostChecker
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
@@ -205,7 +213,8 @@ class Url extends \Magento\Framework\DataObject implements \Magento\Framework\Ur
         \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
         \Magento\Framework\Url\RouteParamsPreprocessorInterface $routeParamsPreprocessor,
         $scopeType,
-        array $data = []
+        array $data = [],
+        HostChecker $hostChecker = null
     ) {
         $this->_request = $request;
         $this->_routeConfig = $routeConfig;
@@ -218,6 +227,8 @@ class Url extends \Magento\Framework\DataObject implements \Magento\Framework\Ur
         $this->_scopeConfig = $scopeConfig;
         $this->routeParamsPreprocessor = $routeParamsPreprocessor;
         $this->_scopeType = $scopeType;
+        $this->hostChecker = $hostChecker ?: \Magento\Framework\App\ObjectManager::getInstance()
+            ->get(HostChecker::class);
         parent::__construct($data);
     }
 
@@ -1086,17 +1097,7 @@ class Url extends \Magento\Framework\DataObject implements \Magento\Framework\Ur
      */
     public function isOwnOriginUrl()
     {
-        $scopeDomains = [];
-        $referer = parse_url($this->_request->getServer('HTTP_REFERER'), PHP_URL_HOST);
-        foreach ($this->_scopeResolver->getScopes() as $scope) {
-            $scopeDomains[] = parse_url($scope->getBaseUrl(), PHP_URL_HOST);
-            $scopeDomains[] = parse_url($scope->getBaseUrl(UrlInterface::URL_TYPE_LINK, true), PHP_URL_HOST);
-        }
-        $scopeDomains = array_unique($scopeDomains);
-        if (empty($referer) || in_array($referer, $scopeDomains)) {
-            return true;
-        }
-        return false;
+        return $this->hostChecker->isOwnOrigin($this->_request->getServer('HTTP_REFERER'));
     }
 
     /**
@@ -1163,7 +1164,7 @@ class Url extends \Magento\Framework\DataObject implements \Magento\Framework\Ur
     private function getUrlModifier()
     {
         if ($this->urlModifier === null) {
-            $this->urlModifier = \Magento\Framework\App\ObjectManager::getInstance()->get(
+            $this->urlModifier = \Magento\Framework\App\ObjectManager::getInstance()->get(
                 \Magento\Framework\Url\ModifierInterface::class
             );
         }
diff --git a/lib/internal/Magento/Framework/Url/HostChecker.php b/lib/internal/Magento/Framework/Url/HostChecker.php
new file mode 100644
index 0000000000000000000000000000000000000000..32546595a040dee59dfd9de3dae2577c35bbf444
--- /dev/null
+++ b/lib/internal/Magento/Framework/Url/HostChecker.php
@@ -0,0 +1,48 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\Url;
+
+use Magento\Framework\UrlInterface;
+
+/**
+ * Class provides functionality for checks of a host name
+ */
+class HostChecker
+{
+    /**
+     * @var \Magento\Framework\Url\ScopeResolverInterface
+     */
+    private $scopeResolver;
+
+    /**
+     * @param ScopeResolverInterface $scopeResolver
+     */
+    public function __construct(ScopeResolverInterface $scopeResolver)
+    {
+        $this->scopeResolver = $scopeResolver;
+    }
+
+    /**
+     * Check if provided URL is one of the domain URLs assigned to scopes
+     *
+     * @param string $url
+     * @return bool
+     */
+    public function isOwnOrigin($url)
+    {
+        $scopeHostNames = [];
+        $hostName = parse_url($url, PHP_URL_HOST);
+        if (empty($hostName)) {
+            return true;
+        }
+        foreach ($this->scopeResolver->getScopes() as $scope) {
+            $scopeHostNames[] = parse_url($scope->getBaseUrl(), PHP_URL_HOST);
+            $scopeHostNames[] = parse_url($scope->getBaseUrl(UrlInterface::URL_TYPE_LINK, true), PHP_URL_HOST);
+        }
+        $scopeHostNames = array_unique($scopeHostNames);
+        return in_array($hostName, $scopeHostNames);
+    }
+}
diff --git a/lib/internal/Magento/Framework/Url/Test/Unit/HostCheckerTest.php b/lib/internal/Magento/Framework/Url/Test/Unit/HostCheckerTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..a6be097ac38ea19c2d1bdc2f8bac4cc12306f7b6
--- /dev/null
+++ b/lib/internal/Magento/Framework/Url/Test/Unit/HostCheckerTest.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Copyright © 2016 Magento. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\Framework\Url\Test\Unit;
+
+use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
+
+class HostCheckerTest extends \PHPUnit_Framework_TestCase
+{
+    /** @var \Magento\Framework\Url\HostChecker */
+    private $object;
+
+    /** @var \Magento\Framework\Url\ScopeResolverInterface|\PHPUnit_Framework_MockObject_MockObject */
+    private $scopeResolver;
+
+    /**
+     * @inheritdoc
+     */
+    protected function setUp()
+    {
+        $this->scopeResolver = $this->getMockBuilder(
+            \Magento\Framework\Url\ScopeResolverInterface::class
+        )->getMock();
+
+        $objectManager = new ObjectManager($this);
+        $this->object = $objectManager->getObject(
+            \Magento\Framework\Url\HostChecker::class,
+            [
+                'scopeResolver' => $this->scopeResolver
+            ]
+        );
+    }
+
+    /**
+     * @dataProvider isOwnOriginDataProvider
+     * @param string $url
+     * @param boolean $result
+     */
+    public function testIsOwnOrigin($url, $result)
+    {
+        $scopes[0] = $this->getMockBuilder(\Magento\Framework\Url\ScopeInterface::class)->getMock();
+        $scopes[0]->expects($this->any())->method('getBaseUrl')->willReturn('http://www.example.com');
+        $scopes[1] = $this->getMockBuilder(\Magento\Framework\Url\ScopeInterface::class)->getMock();
+        $scopes[1]->expects($this->any())->method('getBaseUrl')->willReturn('https://www.example2.com');
+
+        $this->scopeResolver->expects($this->atLeastOnce())->method('getScopes')->willReturn($scopes);
+
+        $this->assertEquals($result, $this->object->isOwnOrigin($url));
+    }
+
+    /**
+     * @return array
+     */
+    public function isOwnOriginDataProvider()
+    {
+        return [
+            ['http://www.example.com/some/page/', true],
+            ['http://www.test.com/other/page/', false],
+        ];
+    }
+}