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..e0c49a15b273599bb4aca41726a314133d015032 100644
--- a/app/code/Magento/CatalogUrlRewrite/Model/Category/Plugin/Category/Remove.php
+++ b/app/code/Magento/CatalogUrlRewrite/Model/Category/Plugin/Category/Remove.php
@@ -11,6 +11,8 @@ use Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator;
 use Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator;
 use Magento\UrlRewrite\Model\UrlPersistInterface;
 use Magento\UrlRewrite\Service\V1\Data\UrlRewrite;
+use Magento\Framework\App\ObjectManager;
+use Magento\Framework\Serialize\SerializerInterface;
 
 class Remove
 {
@@ -23,26 +25,32 @@ class Remove
     /** @var ChildrenCategoriesProvider */
     protected $childrenCategoriesProvider;
 
+    /** @var SerializerInterface */
+    private $serializer;
+
     /**
      * @param UrlPersistInterface $urlPersist
      * @param ProductUrlRewriteGenerator $productUrlRewriteGenerator
      * @param ChildrenCategoriesProvider $childrenCategoriesProvider
+     * @param SerializerInterface|null $serializer
      */
     public function __construct(
         UrlPersistInterface $urlPersist,
         ProductUrlRewriteGenerator $productUrlRewriteGenerator,
-        ChildrenCategoriesProvider $childrenCategoriesProvider
+        ChildrenCategoriesProvider $childrenCategoriesProvider,
+        SerializerInterface $serializer = null
     ) {
         $this->urlPersist = $urlPersist;
         $this->productUrlRewriteGenerator = $productUrlRewriteGenerator;
         $this->childrenCategoriesProvider = $childrenCategoriesProvider;
+        $this->serializer = $serializer ?: ObjectManager::getInstance()->get(SerializerInterface::class);
     }
 
     /**
      * Remove product urls from storage
      *
      * @param \Magento\Catalog\Model\ResourceModel\Category $subject
-     * @param callable $proceed
+     * @param \Closure $proceed
      * @param CategoryInterface $category
      * @return mixed
      * @SuppressWarnings(PHPMD.UnusedFormalParameter)
@@ -77,7 +85,7 @@ class Remove
         );
         $this->urlPersist->deleteByData(
             [
-                UrlRewrite::METADATA => serialize(['category_id' => $categoryId]),
+                UrlRewrite::METADATA => $this->serializer->serialize(['category_id' => $categoryId]),
                 UrlRewrite::ENTITY_TYPE => ProductUrlRewriteGenerator::ENTITY_TYPE,
             ]
         );
diff --git a/app/code/Magento/CatalogUrlRewrite/Observer/UrlRewriteHandler.php b/app/code/Magento/CatalogUrlRewrite/Observer/UrlRewriteHandler.php
index ff3ca37f2e23ee7b7b3ab74f7e1f3b8a13e734eb..16bf67b08afffd505ba9d86b62beb5fedc2231f6 100644
--- a/app/code/Magento/CatalogUrlRewrite/Observer/UrlRewriteHandler.php
+++ b/app/code/Magento/CatalogUrlRewrite/Observer/UrlRewriteHandler.php
@@ -13,6 +13,7 @@ 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\Framework\Serialize\SerializerInterface;
 
 class UrlRewriteHandler
 {
@@ -34,30 +35,34 @@ class UrlRewriteHandler
     /** @var \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory */
     protected $productCollectionFactory;
 
-    /**
-     * @var CategoryBasedProductRewriteGenerator
-     */
+    /** @var CategoryBasedProductRewriteGenerator */
     private $categoryBasedProductRewriteGenerator;
 
+    /** @var SerializerInterface */
+    private $serializer;
+
     /**
      * @param \Magento\CatalogUrlRewrite\Model\Category\ChildrenCategoriesProvider $childrenCategoriesProvider
      * @param CategoryUrlRewriteGenerator $categoryUrlRewriteGenerator
      * @param ProductUrlRewriteGenerator $productUrlRewriteGenerator
      * @param UrlPersistInterface $urlPersist
      * @param \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory
+     * @param SerializerInterface|null $serializer
      */
     public function __construct(
         \Magento\CatalogUrlRewrite\Model\Category\ChildrenCategoriesProvider $childrenCategoriesProvider,
         CategoryUrlRewriteGenerator $categoryUrlRewriteGenerator,
         ProductUrlRewriteGenerator $productUrlRewriteGenerator,
         UrlPersistInterface $urlPersist,
-        \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory
+        \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory,
+        SerializerInterface $serializer = null
     ) {
         $this->childrenCategoriesProvider = $childrenCategoriesProvider;
         $this->categoryUrlRewriteGenerator = $categoryUrlRewriteGenerator;
         $this->productUrlRewriteGenerator = $productUrlRewriteGenerator;
         $this->urlPersist = $urlPersist;
         $this->productCollectionFactory = $productCollectionFactory;
+        $this->serializer = $serializer ?: ObjectManager::getInstance()->get(SerializerInterface::class);
     }
 
     /**
@@ -164,7 +169,7 @@ class UrlRewriteHandler
             );
             $this->urlPersist->deleteByData(
                 [
-                    UrlRewrite::METADATA => serialize(['category_id' => $categoryId]),
+                    UrlRewrite::METADATA => $this->serializer->serialize(['category_id' => $categoryId]),
                     UrlRewrite::ENTITY_TYPE => ProductUrlRewriteGenerator::ENTITY_TYPE,
                 ]
             );
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..863c15e41fcb228ca4c54e0760f19949530ed2c1 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\SerializerInterface|\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\SerializerInterface::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 c2905eb9b425f243126547bda3791bf570ee6977..10005c44bc57c18d892d0cb2576661d740cf3911 100644
--- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlRewriteGeneratorTest.php
+++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/CategoryUrlRewriteGeneratorTest.php
@@ -34,18 +34,37 @@ class CategoryUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase
     /** @var \Magento\Catalog\Api\CategoryRepositoryInterface|\PHPUnit_Framework_MockObject_MockObject */
     protected $categoryRepository;
 
+    /** @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject */
+    protected $serializer;
+
     /**
      * Test method
      */
     protected function setUp()
     {
-        $this->currentUrlRewritesRegenerator = $this->getMockBuilder(
+        $this->serializer = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::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();
-        $this->canonicalUrlRewriteGenerator = $this->getMockBuilder(
+        $this->canonicalUrlRewriteGenerator = $this->getMockBuilder(
             \Magento\CatalogUrlRewrite\Model\Category\CanonicalUrlRewriteGenerator::class
         )->disableOriginalConstructor()->getMock();
-        $this->childrenUrlRewriteGenerator = $this->getMockBuilder(
+        $this->childrenUrlRewriteGenerator = $this->getMockBuilder(
             \Magento\CatalogUrlRewrite\Model\Category\ChildrenUrlRewriteGenerator::class
         )->disableOriginalConstructor()->getMock();
         $this->storeViewService = $this->getMockBuilder(\Magento\CatalogUrlRewrite\Service\V1\StoreViewService::class)
@@ -53,7 +72,7 @@ class CategoryUrlRewriteGeneratorTest extends \PHPUnit_Framework_TestCase
         $this->category = $this->getMock(\Magento\Catalog\Model\Category::class, [], [], '', false);
         $this->categoryRepository = $this->getMock(\Magento\Catalog\Api\CategoryRepositoryInterface::class);
 
-        $this->categoryUrlRewriteGenerator = (new ObjectManager($this))->getObject(
+        $this->categoryUrlRewriteGenerator = (new ObjectManager($this))->getObject(
             \Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator::class,
             [
                 'canonicalUrlRewriteGenerator' => $this->canonicalUrlRewriteGenerator,
@@ -74,22 +93,22 @@ 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->setTargetPath('category-1')
             ->setStoreId(1);
         $this->canonicalUrlRewriteGenerator->expects($this->any())->method('generate')
             ->will($this->returnValue([$canonical]));
-        $children = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite();
+        $children = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite([], $this->serializer);
         $children->setTargetPath('category-2')
             ->setStoreId(2);
         $this->childrenUrlRewriteGenerator->expects($this->any())->method('generate')
             ->will($this->returnValue([$children]));
-        $current = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite();
+        $current = new \Magento\UrlRewrite\Service\V1\Data\UrlRewrite([], $this->serializer);
         $current->setTargetPath('category-3')
             ->setStoreId(3);
         $this->currentUrlRewritesRegenerator->expects($this->any())->method('generate')
             ->will($this->returnValue([$current]));
-        $categoryForSpecificStore = $this->getMock(
+        $categoryForSpecificStore = $this->getMock(
             \Magento\Catalog\Model\Category::class,
             ['getUrlKey', 'getUrlPath'],
             [],
@@ -111,7 +130,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->setTargetPath('category-1')
             ->setStoreId(1);
         $this->canonicalUrlRewriteGenerator->expects($this->any())->method('generate')
diff --git a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/ProductScopeRewriteGeneratorTest.php b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/ProductScopeRewriteGeneratorTest.php
index 0e6c501c4981b6dc6e7660ee02824c7c091d4294..40f364ef6ba6e1eada07ce8d46330cc74c04aa40 100644
--- a/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/ProductScopeRewriteGeneratorTest.php
+++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Model/ProductScopeRewriteGeneratorTest.php
@@ -41,8 +41,27 @@ class ProductScopeRewriteGeneratorTest extends \PHPUnit_Framework_TestCase
     /** @var  ProductScopeRewriteGenerator */
     private $productScopeGenerator;
 
+    /** @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject */
+    private $serializer;
+
     public function setUp()
     {
+        $this->serializer = $this->getMock(\Magento\Framework\Serialize\SerializerInterface::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();
@@ -90,22 +109,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->setTargetPath('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->setTargetPath('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->setTargetPath('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->setTargetPath('category-4')
             ->setStoreId(4);
         $this->anchorUrlRewriteGenerator->expects($this->any())->method('generate')
@@ -137,7 +156,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->setTargetPath('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..0a7dece2a86f0701c6c046e20876ad6907851124
--- /dev/null
+++ b/app/code/Magento/CatalogUrlRewrite/Test/Unit/Observer/UrlRewriteHandlerTest.php
@@ -0,0 +1,104 @@
+<?php
+/**
+ * Copyright © 2017 Magento. 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\SerializerInterface;
+
+class UrlRewriteHandlerTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \Magento\CatalogUrlRewrite\Observer\UrlRewriteHandler
+     */
+    protected $urlRewriteHandler;
+
+    /**
+     * @var \Magento\CatalogUrlRewrite\Model\Category\ChildrenCategoriesProvider|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $childrenCategoriesProviderMock;
+
+    /**
+     * @var \Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $categoryUrlRewriteGeneratorMock;
+
+    /**
+     * @var \Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $productUrlRewriteGeneratorMock;
+
+    /**
+     * @var \Magento\UrlRewrite\Model\UrlPersistInterface|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $urlPersistMock;
+
+    /**
+     * @var \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory|\PHPUnit_Framework_MockObject_MockObject
+     */
+    protected $collectionFactoryMock;
+
+    /**
+     * @var \Magento\Framework\Serialize\SerializerInterface|\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->serializerMock = $this->getMockBuilder(SerializerInterface::class)
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->urlRewriteHandler = new UrlRewriteHandler(
+            $this->childrenCategoriesProviderMock,
+            $this->categoryUrlRewriteGeneratorMock,
+            $this->productUrlRewriteGeneratorMock,
+            $this->urlPersistMock,
+            $this->collectionFactoryMock,
+            $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..3dbf8ff69bcf67a6c49c1ed9a65a6a2079d771c8 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\SerializerInterface;
+
 /**
  * @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 SerializerInterface
+     */
+    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 SerializerInterface $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 = [],
+        SerializerInterface $serializer = null
+    ) {
+        $this->serializer = $serializer ?: ObjectManager::getInstance()->get(SerializerInterface::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..cb7ae6ec328d9f740aaf406431b10bc81599be71 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\SerializerInterface;
 
 /**
  * Data abstract class for url storage
@@ -37,6 +39,25 @@ class UrlRewrite extends AbstractSimpleObject
         self::DESCRIPTION => null,
     ];
 
+    /**
+     * @var SerializerInterface
+     */
+    private $serializer;
+
+    /**
+     * UrlRewrite constructor.
+     *
+     * @param array $data
+     * @param SerializerInterface $serializer
+     */
+    public function __construct(
+        $data = [],
+        SerializerInterface $serializer = null
+    ) {
+        $this->serializer = $serializer ?: ObjectManager::getInstance()->get(SerializerInterface::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..c1853f07b7d24c5f82a569b9957414008c0d7a84
--- /dev/null
+++ b/app/code/Magento/UrlRewrite/Setup/UpgradeData.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Copyright © 2017 Magento. 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..a50d90c0475397df3e201ceb381d0e917e9d0dad
--- /dev/null
+++ b/app/code/Magento/UrlRewrite/Test/Unit/Model/UrlRewriteTest.php
@@ -0,0 +1,66 @@
+<?php
+/**
+ * Copyright © 2017 Magento. 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\SerializerInterface::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..883368600fbd0d9ccbee40320037797aece3f079
--- /dev/null
+++ b/app/code/Magento/UrlRewrite/Test/Unit/Service/V1/Data/UrlRewriteTest.php
@@ -0,0 +1,52 @@
+<?php
+/**
+ * Copyright © 2017 Magento. 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\SerializerInterface::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>