diff --git a/app/code/Magento/CatalogUrlRewrite/Model/Category/Plugin/Category/Remove.php b/app/code/Magento/CatalogUrlRewrite/Model/Category/Plugin/Category/Remove.php
index e44aa9e0fab09d557544f413994b907dd0184f9a..2617f3290ee0ec801fb1be73e274cc94f13af8b9 100644
--- a/app/code/Magento/CatalogUrlRewrite/Model/Category/Plugin/Category/Remove.php
+++ b/app/code/Magento/CatalogUrlRewrite/Model/Category/Plugin/Category/Remove.php
@@ -5,52 +5,55 @@
  */
 namespace Magento\CatalogUrlRewrite\Model\Category\Plugin\Category;
 
-use Magento\Catalog\Api\Data\CategoryInterface;
-use Magento\CatalogUrlRewrite\Model\Category\ChildrenCategoriesProvider;
-use Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator;
-use Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator;
-use Magento\UrlRewrite\Model\UrlPersistInterface;
 use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
 
 class Remove
 {
-    /** @var UrlPersistInterface */
+    /** @var \Magento\UrlRewrite\Model\UrlPersistInterface */
     protected $urlPersist;
 
-    /** @var ProductUrlRewriteGenerator */
+    /** @var \Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator */
     protected $productUrlRewriteGenerator;
 
-    /** @var ChildrenCategoriesProvider */
+    /** @var \Magento\CatalogUrlRewrite\Model\Category\ChildrenCategoriesProvider */
     protected $childrenCategoriesProvider;
 
+    /** @var \Magento\Framework\Serialize\Serializer\Json */
+    private $serializer;
+
     /**
-     * @param UrlPersistInterface $urlPersist
-     * @param ProductUrlRewriteGenerator $productUrlRewriteGenerator
-     * @param ChildrenCategoriesProvider $childrenCategoriesProvider
+     * @param \Magento\UrlRewrite\Model\UrlPersistInterface $urlPersist
+     * @param \Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator $productUrlRewriteGenerator
+     * @param \Magento\CatalogUrlRewrite\Model\Category\ChildrenCategoriesProvider $childrenCategoriesProvider
+     * @param \Magento\Framework\Serialize\Serializer\Json|null $serializer
      */
     public function __construct(
-        UrlPersistInterface $urlPersist,
-        ProductUrlRewriteGenerator $productUrlRewriteGenerator,
-        ChildrenCategoriesProvider $childrenCategoriesProvider
+        \Magento\UrlRewrite\Model\UrlPersistInterface $urlPersist,
+        \Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator $productUrlRewriteGenerator,
+        \Magento\CatalogUrlRewrite\Model\Category\ChildrenCategoriesProvider $childrenCategoriesProvider,
+        \Magento\Framework\Serialize\Serializer\Json $serializer = null
     ) {
         $this->urlPersist = $urlPersist;
         $this->productUrlRewriteGenerator = $productUrlRewriteGenerator;
         $this->childrenCategoriesProvider = $childrenCategoriesProvider;
+        $this->serializer = $serializer ?: \Magento\Framework\App\ObjectManager::getInstance()->get(
+            \Magento\Framework\Serialize\Serializer\Json::class
+        );
     }
 
     /**
      * Remove product urls from storage
      *
      * @param \Magento\Catalog\Model\ResourceModel\Category $subject
-     * @param callable $proceed
-     * @param CategoryInterface $category
+     * @param \Closure $proceed
+     * @param \Magento\Catalog\Api\Data\CategoryInterface $category
      * @return mixed
      * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
     public function aroundDelete(
         \Magento\Catalog\Model\ResourceModel\Category $subject,
         \Closure $proceed,
-        CategoryInterface $category
+        \Magento\Catalog\Api\Data\CategoryInterface $category
     ) {
         $categoryIds = $this->childrenCategoriesProvider->getChildrenIds($category, true);
         $categoryIds[] = $category->getId();
@@ -72,13 +75,13 @@ class Remove
         $this->urlPersist->deleteByData(
             [
                 UrlRewrite::ENTITY_ID => $categoryId,
-                UrlRewrite::ENTITY_TYPE => CategoryUrlRewriteGenerator::ENTITY_TYPE,
+                UrlRewrite::ENTITY_TYPE => \Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator::ENTITY_TYPE,
             ]
         );
         $this->urlPersist->deleteByData(
             [
-                UrlRewrite::METADATA => serialize(['category_id' => $categoryId]),
-                UrlRewrite::ENTITY_TYPE => ProductUrlRewriteGenerator::ENTITY_TYPE,
+                UrlRewrite::METADATA => $this->serializer->serialize(['category_id' => $categoryId]),
+                UrlRewrite::ENTITY_TYPE => \Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator::ENTITY_TYPE,
             ]
         );
     }
diff --git a/app/code/Magento/CatalogUrlRewrite/Observer/UrlRewriteHandler.php b/app/code/Magento/CatalogUrlRewrite/Observer/UrlRewriteHandler.php
index 73b7c2b8167bb3bab80e6979c3687f89f8c58fa6..9d53150675518ced86b210d17367fdc3fec714a1 100644
--- a/app/code/Magento/CatalogUrlRewrite/Observer/UrlRewriteHandler.php
+++ b/app/code/Magento/CatalogUrlRewrite/Observer/UrlRewriteHandler.php
@@ -5,28 +5,18 @@
  */
 namespace Magento\CatalogUrlRewrite\Observer;
 
-use Magento\Catalog\Model\Category;
-use Magento\CatalogUrlRewrite\Model\CategoryBasedProductRewriteGenerator;
-use Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator;
-use Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator;
-use Magento\Framework\App\ObjectManager;
-use Magento\Framework\Event\Observer as EventObserver;
-use Magento\UrlRewrite\Model\UrlPersistInterface;
-use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
-use Magento\UrlRewrite\Model\MergeDataProviderFactory;
-
 class UrlRewriteHandler
 {
     /** @var \Magento\CatalogUrlRewrite\Model\Category\ChildrenCategoriesProvider */
     protected $childrenCategoriesProvider;
 
-    /** @var CategoryUrlRewriteGenerator */
+    /** @var \Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator */
     protected $categoryUrlRewriteGenerator;
 
-    /** @var ProductUrlRewriteGenerator */
+    /** @var \Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator */
     protected $productUrlRewriteGenerator;
 
-    /** @var UrlPersistInterface */
+    /** @var \Magento\UrlRewrite\Model\UrlPersistInterface */
     protected $urlPersist;
 
     /** @var array */
@@ -35,48 +25,59 @@ class UrlRewriteHandler
     /** @var \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory */
     protected $productCollectionFactory;
 
-    /**
-     * @var CategoryBasedProductRewriteGenerator
-     */
+    /** @var \Magento\CatalogUrlRewrite\Model\CategoryBasedProductRewriteGenerator */
     private $categoryBasedProductRewriteGenerator;
 
     /** @var \Magento\UrlRewrite\Model\MergeDataProvider */
     private $mergeDataProviderPrototype;
 
+    /** @var \Magento\Framework\Serialize\Serializer\Json */
+    private $serializer;
+
     /**
      * @param \Magento\CatalogUrlRewrite\Model\Category\ChildrenCategoriesProvider $childrenCategoriesProvider
-     * @param CategoryUrlRewriteGenerator $categoryUrlRewriteGenerator
-     * @param ProductUrlRewriteGenerator $productUrlRewriteGenerator
-     * @param UrlPersistInterface $urlPersist
+     * @param \Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator $categoryUrlRewriteGenerator
+     * @param \Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator $productUrlRewriteGenerator
+     * @param \Magento\UrlRewrite\Model\UrlPersistInterface $urlPersist
      * @param \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory
      * @param \Magento\UrlRewrite\Model\MergeDataProviderFactory|null $mergeDataProviderFactory
+     * @param \Magento\Framework\Serialize\Serializer\Json|null $serializer
      */
     public function __construct(
         \Magento\CatalogUrlRewrite\Model\Category\ChildrenCategoriesProvider $childrenCategoriesProvider,
-        CategoryUrlRewriteGenerator $categoryUrlRewriteGenerator,
-        ProductUrlRewriteGenerator $productUrlRewriteGenerator,
-        UrlPersistInterface $urlPersist,
+        \Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator $categoryUrlRewriteGenerator,
+        \Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator $productUrlRewriteGenerator,
+        \Magento\UrlRewrite\Model\UrlPersistInterface $urlPersist,
         \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory,
-        MergeDataProviderFactory $mergeDataProviderFactory = null
+        \Magento\UrlRewrite\Model\MergeDataProviderFactory $mergeDataProviderFactory = null,
+        \Magento\Framework\Serialize\Serializer\Json $serializer = null
     ) {
         $this->childrenCategoriesProvider = $childrenCategoriesProvider;
         $this->categoryUrlRewriteGenerator = $categoryUrlRewriteGenerator;
         $this->productUrlRewriteGenerator = $productUrlRewriteGenerator;
         $this->urlPersist = $urlPersist;
         $this->productCollectionFactory = $productCollectionFactory;
+
         if (!isset($mergeDataProviderFactory)) {
-            $mergeDataProviderFactory = ObjectManager::getInstance()->get(MergeDataProviderFactory::class);
+            $mergeDataProviderFactory =  \Magento\Framework\App\ObjectManager::getInstance()->get(
+                \Magento\UrlRewrite\Model\MergeDataProviderFactory::class
+            );
         }
+
         $this->mergeDataProviderPrototype = $mergeDataProviderFactory->create();
+
+        $this->serializer = $serializer ?: \Magento\Framework\App\ObjectManager::getInstance()->get(
+            \Magento\Framework\Serialize\Serializer\Json::class
+        );
     }
 
     /**
      * Generate url rewrites for products assigned to category
      *
-     * @param Category $category
+     * @param \Magento\Catalog\Model\Category $category
      * @return array
      */
-    public function generateProductUrlRewrites(Category $category)
+    public function generateProductUrlRewrites(\Magento\Catalog\Model\Category $category)
     {
         $mergeDataProvider = clone $this->mergeDataProviderPrototype;
         $this->isSkippedProduct = [];
@@ -123,14 +124,14 @@ class UrlRewriteHandler
     }
 
     /**
-     * @param Category $category
+     * @param \Magento\Catalog\Model\Category $category
      * @param int $storeId
      * @param bool $saveRewriteHistory
      * @param int|null $rootCategoryId
-     * @return UrlRewrite[]
+     * @return array
      */
     public function getCategoryProductsUrlRewrites(
-        Category $category,
+        \Magento\Catalog\Model\Category $category,
         $storeId,
         $saveRewriteHistory,
         $rootCategoryId = null
@@ -161,37 +162,41 @@ class UrlRewriteHandler
      * Retrieve generator, which use single category for different products
      *
      * @deprecated
-     * @return CategoryBasedProductRewriteGenerator|mixed
+     * @return \Magento\CatalogUrlRewrite\Model\CategoryBasedProductRewriteGenerator|mixed
      */
     private function getCategoryBasedProductRewriteGenerator()
     {
         if (!$this->categoryBasedProductRewriteGenerator) {
-            $this->categoryBasedProductRewriteGenerator = ObjectManager::getInstance()
-                ->get(CategoryBasedProductRewriteGenerator::class);
+            $this->categoryBasedProductRewriteGenerator = \Magento\Framework\App\ObjectManager::getInstance()
+                ->get(\Magento\CatalogUrlRewrite\Model\CategoryBasedProductRewriteGenerator::class);
         }
 
         return $this->categoryBasedProductRewriteGenerator;
     }
 
     /**
-     * @param Category $category
+     * @param \Magento\Catalog\Model\Category $category
      * @return void
      */
-    public function deleteCategoryRewritesForChildren(Category $category)
+    public function deleteCategoryRewritesForChildren(\Magento\Catalog\Model\Category $category)
     {
         $categoryIds = $this->childrenCategoriesProvider->getChildrenIds($category, true);
         $categoryIds[] = $category->getId();
         foreach ($categoryIds as $categoryId) {
             $this->urlPersist->deleteByData(
                 [
-                    UrlRewrite::ENTITY_ID => $categoryId,
-                    UrlRewrite::ENTITY_TYPE => CategoryUrlRewriteGenerator::ENTITY_TYPE,
+                    \Magento\UrlRewrite\Service\V1\Data\UrlRewrite::ENTITY_ID =>
+                        $categoryId,
+                    \Magento\UrlRewrite\Service\V1\Data\UrlRewrite::ENTITY_TYPE =>
+                        \Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator::ENTITY_TYPE,
                 ]
             );
             $this->urlPersist->deleteByData(
                 [
-                    UrlRewrite::METADATA => serialize(['category_id' => $categoryId]),
-                    UrlRewrite::ENTITY_TYPE => ProductUrlRewriteGenerator::ENTITY_TYPE,
+                    \Magento\UrlRewrite\Service\V1\Data\UrlRewrite::METADATA =>
+                        $this->serializer->serialize(['category_id' => $categoryId]),
+                    \Magento\UrlRewrite\Service\V1\Data\UrlRewrite::ENTITY_TYPE =>
+                        \Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator::ENTITY_TYPE,
                 ]
             );
         }
diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/ChildrenUrlRewriteGeneratorTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/ChildrenUrlRewriteGeneratorTest.php
index f41d35f7688f3b4e2b88d1dfaa61ef1218d6a842..6ff97830c8e8fb95f740143b08ad521dd14322f4 100644
--- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/ChildrenUrlRewriteGeneratorTest.php
+++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/ChildrenUrlRewriteGeneratorTest.php
@@ -6,6 +6,7 @@
 namespace Magento\CatalogUrlRewrite\Test\Unit\Model\Category;
 
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
+use Magento\Framework\Serialize\Serializer\Json;
 
 class ChildrenUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase
 {
@@ -27,8 +28,14 @@ class ChildrenUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase
     /** @var \PHPUnit_Framework_MockObject_MockObject */
     private $mergeDataProvider;
 
+    /** @var \PHPUnit_Framework_MockObject_MockObject */
+    private $serializerMock;
+
     protected function setUp()
     {
+        $this->serializerMock = $this->getMockBuilder(Json::class)
+            ->disableOriginalConstructor()
+            ->getMock();
         $this->childrenCategoriesProvider = $this->getMockBuilder(
             \Magento\CatalogUrlRewrite\Model\Category\ChildrenCategoriesProvider::class
         )->disableOriginalConstructor()->getMock();
@@ -84,13 +91,13 @@ class ChildrenUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase
             ->will($this->returnValue($saveRewritesHistory));
         $this->categoryUrlRewriteGeneratorFactory->expects($this->once())->method('create')
             ->will($this->returnValue($this->categoryUrlRewriteGenerator));
-        $url1 = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite();
+        $url1 = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite([], $this->serializerMock);
         $url1->setRequestPath('category-1')
             ->setStoreId(1);
-        $url2 = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite();
+        $url2 = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite([], $this->serializerMock);
         $url2->setRequestPath('category-2')
             ->setStoreId(2);
-        $url3 = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite();
+        $url3 = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite([], $this->serializerMock);
         $url3->setRequestPath('category-1')
             ->setStoreId(1);
         $this->categoryUrlRewriteGenerator->expects($this->once())->method('generate')
diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/Plugin/Category/RemoveTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/Plugin/Category/RemoveTest.php
index 75b0509e0245db845bf3c82f6e6502affbcdb898..a2cd880e85acca6c60df9078b54df53f28d5c3ca 100644
--- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/Plugin/Category/RemoveTest.php
+++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Category/Plugin/Category/RemoveTest.php
@@ -39,6 +39,9 @@ class RemoveTest extends \PHPUnit_Framework_TestCase
      */
     private $objectMock;
 
+    /** @var \Magento\Framework\Serialize\Serializer\Json|\PHPUnit_Framework_MockObject_MockObject */
+    private $serializerMock;
+
     protected function setUp()
     {
         $this->objectManager = new ObjectManager($this);
@@ -52,6 +55,7 @@ class RemoveTest extends \PHPUnit_Framework_TestCase
         $this->objectMock = $this->getMockBuilder(Category::class)
             ->disableOriginalConstructor()
             ->getMock();
+        $this->serializerMock = $this->getMock(\Magento\Framework\Serialize\Serializer\Json::class, [], [], '', false);
     }
 
     public function testAroundDelete()
@@ -64,7 +68,8 @@ class RemoveTest extends \PHPUnit_Framework_TestCase
             CategoryRemovePlugin::class,
             [
                 'urlPersist' => $this->urlPersistMock,
-                'childrenCategoriesProvider' => $this->childrenCategoriesProviderMock
+                'childrenCategoriesProvider' => $this->childrenCategoriesProviderMock,
+                'serializer' => $this->serializerMock
             ]
         );
         $this->childrenCategoriesProviderMock->expects($this->once())
@@ -76,6 +81,9 @@ class RemoveTest extends \PHPUnit_Framework_TestCase
             ->willReturn(1);
         $this->urlPersistMock->expects($this->exactly(2))
             ->method('deleteByData');
+        $this->serializerMock->expects($this->once())
+            ->method('serialize')
+            ->with(['category_id' => 1]);
         $this->assertSame(
             $this->subjectMock,
             $plugin->aroundDelete($this->subjectMock, $proceed, $this->objectMock)
diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlRewriteGeneratorTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlRewriteGeneratorTest.php
index c3a2ebb47b156fe09ffdd12856f85473c1c733f7..cfc6243525f42240136394befa6b3c5dfe4ea49f 100644
--- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlRewriteGeneratorTest.php
+++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlRewriteGeneratorTest.php
@@ -8,9 +8,13 @@
 
 namespace Magento\CatalogUrlRewrite\Test\Unit\Model;
 
-use Magento\Catalog\Model\Category;
 use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
 
+/**
+ * Class CategoryUrlRewriteGeneratorTest
+ *
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
+ */
 class CategoryUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase
 {
     /** @var \PHPUnit_Framework_MockObject_MockObject */
@@ -37,11 +41,30 @@ class CategoryUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase
     /** @var \PHPUnit_Framework_MockObject_MockObject */
     private $mergeDataProvider;
 
+    /** @var \Magento\Framework\Serialize\Serializer\Json|\PHPUnit_Framework_MockObject_MockObject */
+    protected $serializer;
+
     /**
      * Test method
      */
     protected function setUp()
     {
+        $this->serializer = $this->getMock(\Magento\Framework\Serialize\Serializer\Json::class, [], [], '', false);
+        $this->serializer->expects($this->any())
+            ->method('serialize')
+            ->willReturnCallback(
+                function ($value) {
+                    return json_encode($value);
+                }
+            );
+        $this->serializer->expects($this->any())
+            ->method('unserialize')
+            ->willReturnCallback(
+                function ($value) {
+                    return json_decode($value, true);
+                }
+            );
+        
         $this->currentUrlRewritesRegenerator = $this->getMockBuilder(
             \Magento\CatalogUrlRewrite\Model\Category\CurrentUrlRewritesRegenerator::class
         )->disableOriginalConstructor()->getMock();
@@ -88,21 +111,21 @@ class CategoryUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase
         $this->category->expects($this->any())->method('getStoreIds')->will($this->returnValue([1]));
         $this->storeViewService->expects($this->once())->method('doesEntityHaveOverriddenUrlKeyForStore')
             ->will($this->returnValue(false));
-        $canonical = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite();
+        $canonical = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite([], $this->serializer);
         $canonical->setRequestPath('category-1')
             ->setStoreId(1);
         $this->canonicalUrlRewriteGenerator->expects($this->any())->method('generate')
             ->will($this->returnValue(['category-1' => $canonical]));
-        $children1 = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite();
+        $children1 = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite([], $this->serializer);
         $children1->setRequestPath('category-2')
             ->setStoreId(2);
-        $children2 = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite();
+        $children2 = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite([], $this->serializer);
         $children2->setRequestPath('category-22')
             ->setStoreId(2);
         $this->childrenUrlRewriteGenerator->expects($this->any())->method('generate')
             ->with(1, $this->category, $categoryId)
             ->will($this->returnValue(['category-2' => $children1, 'category-1' => $children2]));
-        $current = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite();
+        $current = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite([], $this->serializer);
         $current->setRequestPath('category-3')
             ->setStoreId(3);
         $this->currentUrlRewritesRegenerator->expects($this->any())->method('generate')
@@ -135,7 +158,7 @@ class CategoryUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase
     {
         $this->category->expects($this->any())->method('getStoreId')->will($this->returnValue(1));
         $this->category->expects($this->never())->method('getStoreIds');
-        $canonical = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite();
+        $canonical = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite([], $this->serializer);
         $canonical->setRequestPath('category-1')
             ->setStoreId(1);
         $this->canonicalUrlRewriteGenerator->expects($this->any())->method('generate')
diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Map/UrlRewriteFinderTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Map/UrlRewriteFinderTest.php
index b0c4500dab3e02f4d35aed41eb57b54a3e54cfd4..ca5581f366352a6021d01338e756451db1a34d50 100644
--- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Map/UrlRewriteFinderTest.php
+++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/Map/UrlRewriteFinderTest.php
@@ -13,9 +13,12 @@ use Magento\UrlRewrite\Service\V1\Data\UrlRewriteFactory;
 use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
 use Magento\CatalogUrlRewrite\Model\Map\DataCategoryUrlRewriteDatabaseMap;
 use Magento\CatalogUrlRewrite\Model\Map\DataProductUrlRewriteDatabaseMap;
+use Magento\Framework\Serialize\Serializer\Json;
 
 /**
  * Class UrlRewriteFinderTest
+ *
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  */
 class UrlRewriteFinderTest extends \PHPUnit_Framework_TestCase
 {
@@ -34,12 +37,16 @@ class UrlRewriteFinderTest extends \PHPUnit_Framework_TestCase
     /** @var UrlRewriteFinder|\PHPUnit_Framework_MockObject_MockObject */
     private $model;
 
+    /** @var \PHPUnit_Framework_MockObject_MockObject */
+    private $serializerMock;
+
     protected function setUp()
     {
+        $this->serializerMock = $this->getMock(Json::class, [], [], '', false);
         $this->databaseMapPoolMock = $this->getMock(DatabaseMapPool::class, [], [], '', false);
         $this->urlFinderMock = $this->getMock(UrlFinderInterface::class);
         $this->urlRewriteFactoryMock = $this->getMock(UrlRewriteFactory::class, ['create'], [], '', false);
-        $this->urlRewritePrototypeMock = new UrlRewrite();
+        $this->urlRewritePrototypeMock = new UrlRewrite([], $this->serializerMock);
 
         $this->urlRewriteFactoryMock->expects($this->any())
             ->method('create')
diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/ProductScopeRewriteGeneratorTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/ProductScopeRewriteGeneratorTest.php
index 15d93a5026f32a825007a865627231861681b591..7bc0c96cd6e5cbdc159ac4d1ef59edb01bd5ca00 100644
--- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/ProductScopeRewriteGeneratorTest.php
+++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/ProductScopeRewriteGeneratorTest.php
@@ -44,8 +44,27 @@ class ProductScopeRewriteGeneratorTest extends \PHPUnit_Framework_TestCase
     /** @var \PHPUnit_Framework_MockObject_MockObject */
     private $mergeDataProvider;
 
+    /** @var \Magento\Framework\Serialize\Serializer\Json|\PHPUnit_Framework_MockObject_MockObject */
+    private $serializer;
+
     public function setUp()
     {
+        $this->serializer = $this->getMock(\Magento\Framework\Serialize\Serializer\Json::class, [], [], '', false);
+        $this->serializer->expects($this->any())
+            ->method('serialize')
+            ->willReturnCallback(
+                function ($value) {
+                    return json_encode($value);
+                }
+            );
+        $this->serializer->expects($this->any())
+            ->method('unserialize')
+            ->willReturnCallback(
+                function ($value) {
+                    return json_decode($value, true);
+                }
+            );
+
         $this->currentUrlRewritesRegenerator = $this->getMockBuilder(
             \Magento\CatalogUrlRewrite\Model\Product\CurrentUrlRewritesRegenerator::class
         )->disableOriginalConstructor()->getMock();
@@ -103,22 +122,22 @@ class ProductScopeRewriteGeneratorTest extends \PHPUnit_Framework_TestCase
             ->method('getParentId')
             ->willReturn(1);
         $this->initObjectRegistryFactory([]);
-        $canonical = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite();
+        $canonical = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite([], $this->serializer);
         $canonical->setRequestPath('category-1')
             ->setStoreId(1);
         $this->canonicalUrlRewriteGenerator->expects($this->any())->method('generate')
             ->will($this->returnValue([$canonical]));
-        $categories = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite();
+        $categories = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite([], $this->serializer);
         $categories->setRequestPath('category-2')
             ->setStoreId(2);
         $this->categoriesUrlRewriteGenerator->expects($this->any())->method('generate')
             ->will($this->returnValue([$categories]));
-        $current = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite();
+        $current = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite([], $this->serializer);
         $current->setRequestPath('category-3')
             ->setStoreId(3);
         $this->currentUrlRewritesRegenerator->expects($this->any())->method('generate')
             ->will($this->returnValue([$current]));
-        $anchorCategories = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite();
+        $anchorCategories = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite([], $this->serializer);
         $anchorCategories->setRequestPath('category-4')
             ->setStoreId(4);
         $this->anchorUrlRewriteGenerator->expects($this->any())->method('generate')
@@ -150,7 +169,7 @@ class ProductScopeRewriteGeneratorTest extends \PHPUnit_Framework_TestCase
         $store->expects($this->any())->method('getRootCategoryId')->will($this->returnValue($storeRootCategoryId));
         $this->storeManager->expects($this->any())->method('getStore')->will($this->returnValue($store));
         $this->initObjectRegistryFactory([$category]);
-        $canonical = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite();
+        $canonical = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite([], $this->serializer);
         $canonical->setRequestPath('category-1')
             ->setStoreId(1);
         $this->canonicalUrlRewriteGenerator->expects($this->any())->method('generate')
diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Observer/UrlRewriteHandlerTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Observer/UrlRewriteHandlerTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..3c91e485e77e13480c83b81510dfdcdf74611fa2
--- /dev/null
+++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Observer/UrlRewriteHandlerTest.php
@@ -0,0 +1,123 @@
+<?php
+/**
+ * Copyright © 2013-2017 Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\CatalogUrlRewrite\Test\Unit\Observer;
+
+use Magento\CatalogUrlRewrite\Observer\UrlRewriteHandler;
+use Magento\CatalogUrlRewrite\Model\Category\ChildrenCategoriesProvider;
+use Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator;
+use Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator;
+use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
+use Magento\UrlRewrite\Model\UrlPersistInterface;
+use Magento\Framework\Serialize\Serializer\Json;
+use Magento\UrlRewrite\Model\MergeDataProviderFactory;
+use Magento\UrlRewrite\Model\MergeDataProvider;
+
+class UrlRewriteHandlerTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var UrlRewriteHandler
+     */
+    protected $urlRewriteHandler;
+
+    /**
+     * @var ChildrenCategoriesProvider|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $childrenCategoriesProviderMock;
+
+    /**
+     * @var CategoryUrlRewriteGenerator|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $categoryUrlRewriteGeneratorMock;
+
+    /**
+     * @var ProductUrlRewriteGenerator|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $productUrlRewriteGeneratorMock;
+
+    /**
+     * @var UrlPersistInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $urlPersistMock;
+
+    /**
+     * @var CollectionFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $collectionFactoryMock;
+
+    /**
+     * @var MergeDataProviderFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $mergeDataProviderFactoryMock;
+
+    /**
+     * @var Json|\PHPUnit_Framework_MockObject_MockObject
+     */
+    private $serializerMock;
+
+    /**
+     * {@inheritDoc}
+     */
+    protected function setUp()
+    {
+        $this->childrenCategoriesProviderMock = $this->getMockBuilder(ChildrenCategoriesProvider::class)
+            ->getMock();
+        $this->categoryUrlRewriteGeneratorMock = $this->getMockBuilder(CategoryUrlRewriteGenerator::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->productUrlRewriteGeneratorMock = $this->getMockBuilder(ProductUrlRewriteGenerator::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->urlPersistMock = $this->getMockBuilder(UrlPersistInterface::class)
+            ->getMock();
+        $this->collectionFactoryMock = $this->getMockBuilder(CollectionFactory::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->mergeDataProviderFactoryMock = $this->getMockBuilder(MergeDataProviderFactory::class)
+            ->setMethods(['create'])
+            ->disableOriginalConstructor()
+            ->getMock();
+        $mergeDataProviderMock = $this->getMockBuilder(MergeDataProvider::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $this->mergeDataProviderFactoryMock->expects($this->any())
+            ->method('create')
+            ->willReturn($mergeDataProviderMock);
+
+        $this->serializerMock = $this->getMockBuilder(Json::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->urlRewriteHandler = new UrlRewriteHandler(
+            $this->childrenCategoriesProviderMock,
+            $this->categoryUrlRewriteGeneratorMock,
+            $this->productUrlRewriteGeneratorMock,
+            $this->urlPersistMock,
+            $this->collectionFactoryMock,
+            $this->mergeDataProviderFactoryMock,
+            $this->serializerMock
+        );
+    }
+
+    public function testDeleteCategoryRewritesForChildren()
+    {
+        $category = $this->getMockBuilder(\Magento\Catalog\Model\Category::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+        $category->expects($this->once())
+            ->method('getId')
+            ->willReturn(2);
+
+        $this->childrenCategoriesProviderMock->expects($this->once())
+            ->method('getChildrenIds')
+            ->with($category, true)
+            ->willReturn([3, 4]);
+
+        $this->serializerMock->expects($this->exactly(3))
+            ->method('serialize');
+
+        $this->urlRewriteHandler->deleteCategoryRewritesForChildren($category);
+    }
+}
diff --git a/app/code/Magento/SampleData/etc/module.xml b/app/code/Magento/SampleData/etc/module.xml
index 24be4417e689facd4548df8c6e6e6804bc8f7700..e511dfd4bbb765c5e0031bea552dbdc354bb8dc3 100644
--- a/app/code/Magento/SampleData/etc/module.xml
+++ b/app/code/Magento/SampleData/etc/module.xml
@@ -7,5 +7,8 @@
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
     <module name="Magento_SampleData" setup_version="2.0.0">
+        <sequence>
+            <module name="Magento_UrlRewrite"/>
+        </sequence>
     </module>
 </config>
diff --git a/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Save.php b/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Save.php
index 5b2698749019e6c983804ac12d14513e5cfc03d0..8181f3c6d80a97859e2a952920029bd7885a9525 100644
--- a/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Save.php
+++ b/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Save.php
@@ -6,8 +6,6 @@
  */
 namespace Magento\UrlRewrite\Controller\Adminhtml\Url\Rewrite;
 
-use Magento\Catalog\Model\Category;
-use Magento\Catalog\Model\Product;
 use Magento\Framework\Exception\LocalizedException;
 use Magento\UrlRewrite\Model\UrlFinderInterface;
 use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
@@ -63,7 +61,7 @@ class Save extends \Magento\UrlRewrite\Controller\Adminhtml\Url\Rewrite
                 $model->setEntityType($productId ? self::ENTITY_TYPE_PRODUCT : self::ENTITY_TYPE_CATEGORY)
                     ->setEntityId($productId ?: $categoryId);
                 if ($productId && $categoryId) {
-                    $model->setMetadata(serialize(['category_id' => $categoryId]));
+                    $model->setMetadata(['category_id' => $categoryId]);
                 }
             }
             $model->setTargetPath($this->getTargetPath($model));
diff --git a/app/code/Magento/UrlRewrite/Model/UrlRewrite.php b/app/code/Magento/UrlRewrite/Model/UrlRewrite.php
index b8f97ace72936221e2626d3107d89246158f1cb2..e2eaae257b2912c6cfa0178739c70a949d0c06e2 100644
--- a/app/code/Magento/UrlRewrite/Model/UrlRewrite.php
+++ b/app/code/Magento/UrlRewrite/Model/UrlRewrite.php
@@ -5,6 +5,9 @@
  */
 namespace Magento\UrlRewrite\Model;
 
+use Magento\Framework\App\ObjectManager;
+use Magento\Framework\Serialize\Serializer\Json;
+
 /**
  * @method int getEntityId()
  * @method string getEntityType()
@@ -14,7 +17,6 @@ namespace Magento\UrlRewrite\Model;
  * @method string getTargetPath()
  * @method UrlRewrite setEntityId(int $value)
  * @method UrlRewrite setEntityType(string $value)
- * @method UrlRewrite setMetadata($value)
  * @method UrlRewrite setRequestPath($value)
  * @method UrlRewrite setTargetPath($value)
  * @method UrlRewrite setRedirectType($value)
@@ -23,6 +25,32 @@ namespace Magento\UrlRewrite\Model;
  */
 class UrlRewrite extends \Magento\Framework\Model\AbstractModel
 {
+    /**
+     * @var Json
+     */
+    private $serializer;
+
+    /**
+     * UrlRewrite constructor.
+     * @param \Magento\Framework\Model\Context $context
+     * @param \Magento\Framework\Registry $registry
+     * @param \Magento\Framework\Model\ResourceModel\AbstractResource|null $resource
+     * @param \Magento\Framework\Data\Collection\AbstractDb|null $resourceCollection
+     * @param array $data
+     * @param Json $serializer
+     */
+    public function __construct(
+        \Magento\Framework\Model\Context $context,
+        \Magento\Framework\Registry $registry,
+        \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
+        \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
+        array $data = [],
+        Json $serializer = null
+    ) {
+        $this->serializer = $serializer ?: ObjectManager::getInstance()->get(Json::class);
+        parent::__construct($context, $registry, $resource, $resourceCollection, $data);
+    }
+
     /**
      * Initialize corresponding resource model
      *
@@ -41,6 +69,21 @@ class UrlRewrite extends \Magento\Framework\Model\AbstractModel
     public function getMetadata()
     {
         $metadata = $this->getData(\Magento\UrlRewrite\Service\V1\Data\UrlRewrite::METADATA);
-        return !empty($metadata) ? unserialize($metadata) : [];
+        return !empty($metadata) ? $this->serializer->unserialize($metadata) : [];
+    }
+
+    /**
+     * Overwrite Metadata in the object.
+     *
+     * @param array|string $metadata
+     *
+     * @return $this
+     */
+    public function setMetadata($metadata)
+    {
+        if (is_array($metadata)) {
+            $metadata = $this->serializer->serialize($metadata);
+        }
+        return $this->setData(\Magento\UrlRewrite\Service\V1\Data\UrlRewrite::METADATA, $metadata);
     }
 }
diff --git a/app/code/Magento/UrlRewrite/Service/V1/Data/UrlRewrite.php b/app/code/Magento/UrlRewrite/Service/V1/Data/UrlRewrite.php
index 11315279ff219b1a461bfe6aa447a2092cbb3f84..8ed0479a07637fac5cc6f95dfd510c6240e0ad96 100644
--- a/app/code/Magento/UrlRewrite/Service/V1/Data/UrlRewrite.php
+++ b/app/code/Magento/UrlRewrite/Service/V1/Data/UrlRewrite.php
@@ -6,6 +6,8 @@
 namespace Magento\UrlRewrite\Service\V1\Data;
 
 use Magento\Framework\Api\AbstractSimpleObject;
+use Magento\Framework\App\ObjectManager;
+use Magento\Framework\Serialize\Serializer\Json;
 
 /**
  * Data abstract class for url storage
@@ -37,6 +39,25 @@ class UrlRewrite extends AbstractSimpleObject
         self::DESCRIPTION => null,
     ];
 
+    /**
+     * @var Json
+     */
+    private $serializer;
+
+    /**
+     * UrlRewrite constructor.
+     *
+     * @param array $data
+     * @param Json $serializer
+     */
+    public function __construct(
+        $data = [],
+        Json $serializer = null
+    ) {
+        $this->serializer = $serializer ?: ObjectManager::getInstance()->get(Json::class);
+        parent::__construct($data);
+    }
+
     /**
      * Get data by key
      *
@@ -216,7 +237,7 @@ class UrlRewrite extends AbstractSimpleObject
     public function getMetadata()
     {
         $metadata = $this->_get(self::METADATA);
-        return !empty($metadata) ? unserialize($metadata) : [];
+        return !empty($metadata) ? $this->serializer->unserialize($metadata) : [];
     }
 
     /**
@@ -227,7 +248,7 @@ class UrlRewrite extends AbstractSimpleObject
     public function setMetadata($metadata)
     {
         if (is_array($metadata)) {
-            $metadata = serialize($metadata);
+            $metadata = $this->serializer->serialize($metadata);
         }
         return $this->setData(UrlRewrite::METADATA, $metadata);
     }
diff --git a/app/code/Magento/UrlRewrite/Setup/UpgradeData.php b/app/code/Magento/UrlRewrite/Setup/UpgradeData.php
new file mode 100644
index 0000000000000000000000000000000000000000..ad71639398e1b71a83dcb8c869739f2a40079945
--- /dev/null
+++ b/app/code/Magento/UrlRewrite/Setup/UpgradeData.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Copyright © 2013-2017 Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\UrlRewrite\Setup;
+
+use Magento\Framework\DB\FieldDataConverterFactory;
+use Magento\Framework\DB\DataConverter\SerializedToJson;
+use Magento\Framework\Setup\ModuleContextInterface;
+use Magento\Framework\Setup\ModuleDataSetupInterface;
+use Magento\Framework\Setup\UpgradeDataInterface;
+
+class UpgradeData implements UpgradeDataInterface
+{
+    /**
+     * @var FieldDataConverterFactory
+     */
+    private $fieldDataConverterFactory;
+
+    /**
+     * Constructor
+     *
+     * @param FieldDataConverterFactory $fieldDataConverterFactory
+     */
+    public function __construct(
+        FieldDataConverterFactory $fieldDataConverterFactory
+    ) {
+        $this->fieldDataConverterFactory = $fieldDataConverterFactory;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
+    {
+        $setup->startSetup();
+
+        if (version_compare($context->getVersion(), '2.0.1', '<')) {
+            $this->convertSerializedDataToJson($setup);
+        }
+
+        $setup->endSetup();
+    }
+
+    /**
+     * Convert metadata from serialized to JSON format:
+     *
+     * @param ModuleDataSetupInterface $setup
+     *
+     * @return void
+     */
+    public function convertSerializedDataToJson($setup)
+    {
+        $fieldDataConverter = $this->fieldDataConverterFactory->create(SerializedToJson::class);
+        $fieldDataConverter->convert(
+            $setup->getConnection(),
+            $setup->getTable('url_rewrite'),
+            'url_rewrite_id',
+            'metadata'
+        );
+    }
+}
diff --git a/app/code/Magento/UrlRewrite/Test/Unit/Block/Plugin/Store/Switcher/SetRedirectUrlTest.php b/app/code/Magento/UrlRewrite/Test/Unit/Block/Plugin/Store/Switcher/SetRedirectUrlTest.php
index 9cf18a76cd045c8abd75d9f81c533d045df5f8ff..5118d12fad6c6e6b069a5a080c412ec1fd026e88 100644
--- a/app/code/Magento/UrlRewrite/Test/Unit/Block/Plugin/Store/Switcher/SetRedirectUrlTest.php
+++ b/app/code/Magento/UrlRewrite/Test/Unit/Block/Plugin/Store/Switcher/SetRedirectUrlTest.php
@@ -81,7 +81,7 @@ class SetRedirectUrlTest extends \PHPUnit_Framework_TestCase
 
     public function testGetTargetStorePostData()
     {
-        $urlRewrite = $this->getMock(\Magento\UrlRewrite\Service\V1\Data\UrlRewrite::class);
+        $urlRewrite = $this->getMock(\Magento\UrlRewrite\Service\V1\Data\UrlRewrite::class, [], [], '', false);
         $urlRewrite->expects($this->once())->method('getRequestPath')->willReturn('path');
 
         $this->request->expects($this->once())->method('getPathInfo')->willReturn('path');
diff --git a/app/code/Magento/UrlRewrite/Test/Unit/Model/UrlRewriteTest.php b/app/code/Magento/UrlRewrite/Test/Unit/Model/UrlRewriteTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..db536c5aa38b3622db9c5cc2d9a4d07348e7fae6
--- /dev/null
+++ b/app/code/Magento/UrlRewrite/Test/Unit/Model/UrlRewriteTest.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * Copyright © 2013-2017 Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\UrlRewrite\Test\Unit\Model;
+
+class UrlRewriteTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\UrlRewrite\Model\UrlRewrite
+     */
+    protected $model;
+
+    protected function setUp()
+    {
+        $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+
+        $context = $this->getMock(\Magento\Framework\Model\Context::class, [], [], '', false);
+        $registry = $this->getMock(\Magento\Framework\Registry::class, [], [], '', false);
+        $resource = $this->getMock(
+            \Magento\Framework\Model\ResourceModel\AbstractResource::class,
+            ['getIdFieldName', '_construct', 'getConnection'],
+            [],
+            '',
+            false
+        );
+        $resourceCollection = $this->getMock(\Magento\Framework\Data\Collection\AbstractDb::class, [], [], '', false);
+        $serializer = $this->getMock(\Magento\Framework\Serialize\Serializer\Json::class, [], [], '', false);
+        $serializer->expects($this->any())
+            ->method('serialize')
+            ->willReturnCallback(
+                function ($value) {
+                    return json_encode($value);
+                }
+            );
+        $serializer->expects($this->any())
+            ->method('unserialize')
+            ->willReturnCallback(
+                function ($value) {
+                    return json_decode($value, true);
+                }
+            );
+
+        $this->model = $objectManager->getObject(
+            \Magento\UrlRewrite\Model\UrlRewrite::class,
+            [
+                'context' => $context,
+                'registry' => $registry,
+                'resource' => $resource,
+                'resourceCollection' => $resourceCollection,
+                'data' => [],
+                'serializer' => $serializer,
+            ]
+        );
+    }
+
+    public function testSetAndGetMetadata()
+    {
+        $testData = [1, 2, 3];
+
+        $this->model->setMetadata($testData);
+
+        $this->assertEquals($testData, $this->model->getMetadata());
+    }
+}
diff --git a/app/code/Magento/UrlRewrite/Test/Unit/Service/V1/Data/UrlRewriteTest.php b/app/code/Magento/UrlRewrite/Test/Unit/Service/V1/Data/UrlRewriteTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..bce4505b2eda2ecbc09c5e7b33173c2153703bb2
--- /dev/null
+++ b/app/code/Magento/UrlRewrite/Test/Unit/Service/V1/Data/UrlRewriteTest.php
@@ -0,0 +1,52 @@
+<?php
+/**
+ * Copyright © 2013-2017 Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\UrlRewrite\Test\Unit\Service\V1\Data;
+
+class UrlRewriteTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\UrlRewrite\Model\UrlRewrite
+     */
+    protected $model;
+
+    protected function setUp()
+    {
+        $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
+
+        $serializer = $this->getMock(\Magento\Framework\Serialize\Serializer\Json::class, [], [], '', false);
+        $serializer->expects($this->any())
+            ->method('serialize')
+            ->willReturnCallback(
+                function ($value) {
+                    return json_encode($value);
+                }
+            );
+        $serializer->expects($this->any())
+            ->method('unserialize')
+            ->willReturnCallback(
+                function ($value) {
+                    return json_decode($value, true);
+                }
+            );
+
+        $this->model = $objectManager->getObject(
+            \Magento\UrlRewrite\Service\V1\Data\UrlRewrite::class,
+            [
+                'data' => [],
+                'serializer' => $serializer,
+            ]
+        );
+    }
+
+    public function testSetAndGetMetadata()
+    {
+        $testData = [1, 2, 3];
+
+        $this->model->setMetadata($testData);
+
+        $this->assertEquals($testData, $this->model->getMetadata());
+    }
+}
diff --git a/app/code/Magento/UrlRewrite/etc/module.xml b/app/code/Magento/UrlRewrite/etc/module.xml
index 284c67950ac539e6d4f030c32611981278f51c14..499a5166a860691e10fb7214b5a8983dd0d0ea3a 100644
--- a/app/code/Magento/UrlRewrite/etc/module.xml
+++ b/app/code/Magento/UrlRewrite/etc/module.xml
@@ -6,6 +6,6 @@
  */
 -->
 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
-    <module name="Magento_UrlRewrite" setup_version="2.0.0">
+    <module name="Magento_UrlRewrite" setup_version="2.0.1">
     </module>
 </config>